Non ho capito quando effettuare il passaggio per riferimento?

di il
27 risposte

Non ho capito quando effettuare il passaggio per riferimento?

Salve a tutti. Ieri sono stato bocciato all'esame anche per una cosa che sapevo di non aver capito, ma non sapevo come colmare. Ci provo qui. Si tratta del passaggio per riferimento(quello con la & per intenderci). Ho capito come si usa, come si richiama nel main ed è anche più facile di quello per puntatore. Ma non ho capito una cosa fondamentale ( e forse niente ): )quando si usa?? Ieri ad esempio dovevo implementare una funzione che cercasse i numeri in una stringa e allora ho fatto void(char s[], int n[]) poi ho dichiarato int riemp del vettore nella funzione. Ma nel giudizio il prof ha scritto che la funzione deve restituire la dimensione del vettore e quindi oltre quello che ho dichiarato io in void ha dichiarato pure int &riemp . Questo credo sia stato determinante per la bocciatura. Quando si fa questa cosa? E perchè pure & in questo caso e non solo int riemp ad esempio? Qual è la differenza? Che con la & faccio l'allocazione in modo che duri sempre? Sono davvero in crisi, sono arrivato al terzo anno, ho dato esami ben più complicati ma non riesco a superare fondamenti di informatica che la maggior parte prende facilmente. Grazie in anticipo.

27 Risposte

  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    Mi dispiace per la bocciatura
    Mi sembra però che tu abbia tanti dubbi, magari comincia con il postare il testo del problema e la funzione che hai scritto e vediamo su quella di fugare uno per uno ogni dubbio.
  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    https://www.docenti.unina.it/downloadPub.do?tipoFile=md&id=522674
    Il problema è il secondo punto dove dovevo cercare i numeri nella stringa in ingresso. Quello sulle triplette l'ho improvvisato, vabbè puntavo al 18 ) Di dubbi ne ho, ma non riesco a colmarli...forse il problema di fondo è che non capisco come questa materia vada studiata. E la traccia, oggettivamente (e stranamente) non era difficile. È questo che mi preoccupa di più.
  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    Postaci la prima funzione, ovvero l'inserimento dei dati (input)
  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    Bool input (char s[]){
    bool ok;
    for(int i=0; i<strlen(s);i++)
    if(!((s>'0'&&s<'9')||s='*'))
    return false;
    if (!ok)
    Cout<<"caratteri non ammessi"<<endl;
    return false;
    Return true;
    }
  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    Prima di tutto utilizza i tag code per postare il codice.
    Poi, al riguardo della funzione, leggi bene la traccia... non devi richiedere l'input all'utente?
  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    Scusa sono nuovo non so ancora come fare. Provvedo. Sì peró quello lo devo fare dopo nel main dove devo chiedere in input la stringa e richiamare la prima funzione per validarla.
  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    [quote="kevin94"]
    bool input (char s[]){
    bool ok;
    for(int i=0; i<strlen(s);i++)
    if(!((s[i]>'0'&&s[i]<'9')||s[i]='*'))
    return false;
    if (!ok)
    Cout<<"caratteri non ammessi"<<endl;
    return false;
    Return true;
    }
  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    Ciao Kevin, scusa ma sto diventando vecchio! Per velocizzare la cosa, magari perchè non posti il codice della funzione che ti fa sorgere più dubbi, nel modo in cui l'hai implementata? Spiegando quello che deve fare, cosa ti è stato detto che era sbagliato ecc...
  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    Salve, sono nuovo e non vorrei scavalcare candaluar che già sta aiutando Kevin.
    io ho studiato un pò di c++ alle superiori e un pò di c all'università. Per ora sto cercando di approfondire il c per mio conto, quindi se scrivo bagianate perdonatemi.
    il passaggio di valori è stato pure un mio problema ai tempi, forse ora l'ho capito meglio.

    Innanzitutto kevin, è bene che tu capisca che "concettualmente" ci sono 2 tipi di passaggio dei parametri:


    Passaggio Per valore : da una copia della variabile, il valore passato non subisce variaioni nella funzione chiamante.
    Passaggio per indirizzo: passa la posizione in memoria della variabile, cosi facendo le varie modifiche si riperquotono pure dentro la funzione chiamante.

    Nel c il passaggio per indirizzo avviene tramite puntatori, in c++ hanno aggiunto una semplificazione, il passaggio per riferimento che stai usando.

    Fatta questa premessa, è facile rispondere alla tua domanda. Usa il passaggio per riferimento (versione c++ del passaggio tramite puntatori) solo se vuoi che i valori vengano modificati , altrimenti passali per valore.

    Poi, questo codice è pieno di errori
    bool input (char s[]){
        bool ok;
        
        for(int i=0; i<strlen(s);i++)
            if(!((s[i]>'0'&&s[i]<'9')||s[i]='*'))
                return false;
                
        if (!ok) (ok non è inizializzata)
            Cout<<"caratteri non ammessi"<<endl; (la c minuscola)
    
    return false;
    Return true; (R minuscola, ed 2 return di fila non hanno senso)
    }
    
    
    il c++ è CASE SENSITIVE, quindi attento a minuscole e maiscole, inoltre attento a quando apri e chiudi le parentesi graffe, e consiglio usa l'identazione,cioè spazi dal lato del rigo per identificare meglio i vari blocchi, come ho fatto io.
    inoltre ricorda che se non usi le parentisi graffe, solo l'istruzzione successiva è legata ai vari costrutti,
     
        if (!ok) (ok non è inizializzata)
            Cout<<"caratteri non ammessi"<<endl; (la c minuscola)
    
    return false;
    
    il return in questo caso non si lega al if.

    Per lo meno questo è quello che ho notato fino ad ora.
  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    Ah...quindi voglio vedere se ho capito una cosa: nel secondo punto (lasciando un attimo a parte le baggianate che ho scritto nell'input) dovevo passare per riferimento int riemp perchè quando vado a cercare i numeri nella stringa iniziale la dimensione, togliendo gli asterischi, diminuisce e quindi subisce una modifica, giusto?
  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    Grazie ad entrambi, comunque. Io ora non ho una copia di quello che ho scritto al compito, quindi non so cosa esattamente ho scritto l'altro ieri.
  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    kevin94 ha scritto:


    Grazie ad entrambi, comunque. Io ora non ho una copia di quello che ho scritto al compito, quindi non so cosa esattamente ho scritto l'altro ieri. Questo codice che ho scritto, nel quale alla prova pure ho sbagliato qualcosa, è improvvisato e scritto da iPhone :s. Il problema è che ho molte lacune e non so come colmAre, come ho detto. E non ho nemmeno molto tempo perchè ormai sto al terzo anno :/
  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    kevin94 ha scritto:


    Il problema è che ho molte lacune e non so come colmAre, come ho detto. E non ho nemmeno molto tempo perchè ormai sto al terzo anno :/
    Indipendentemente da dove sei e quanti anni hai, non serve a niente continuare a dire che hai tante lacune, è tutto tempo sprecato, affronta i dubbi uno alla volta. Ti consiglio vivamente di prendere tutto il tuo tempo necessario per rifare per conto tuo l'esame e sulle cose che ti sono poco chiare puoi chiedere qua.
  • Re: Non ho capito quando effettuare il passaggio per riferimento?

    kevin94 ha scritto:


    Ah...quindi voglio vedere se ho capito una cosa: nel secondo punto (lasciando un attimo a parte le baggianate che ho scritto nell'input) dovevo passare per riferimento int riemp perchè quando vado a cercare i numeri nella stringa iniziale la dimensione, togliendo gli asterischi, diminuisce e quindi subisce una modifica, giusto?
    mmm non credo che il prof voglia questo, ma più che altro,
    se le varie variabili devono essere usate in più funzioni,
    te le crei vuote nel main(), e le riempi/modifichi nelle varie funzioni.
    Per fare cio le variabili devono essere passate per riferimento.
    Potresti usare una variabile per la stringa, una per il vettore con soli numeri, una per la dimensione del vettore ecc..
    l'importante e che i valori te li possa portare dietro nelle varie funzioni.
    Se crei la stringa in input(), senza passarla per riferimento, non puoi usarla in - cercaNumeri().

    EDIT: concordo con candaluar, se hai lacune, difficilmente verranno colmate in questo thread. Riprendi dall'inizio tutti i concetti che non ti sono chiari e cerca di risolvere il compito una funzione alla volta.
Devi accedere o registrarti per scrivere nel forum
27 risposte