Problema piccolo esercizio sui puntatori.

di il
11 risposte

Problema piccolo esercizio sui puntatori.

Buongiorno a tutti, da poco ho iniziato a studiare i puntatori e ho provato a fare questo piccolo programma:
"Scrivere una funzione con un argomento di tipo puntatore a double e un altro int. Il primo argomento deve corrispondere ad un array il secondo al numero di elementi dell'array. La funzione deve essere di tipo puntatore a double per restituire l'indirizzo di memoria minore."

Io ho provato a farlo, ma non compila:

double* funzione (double* A, int N){
 double* minore = A[0];
for(int i=0;i<N;i++){
if(A[i]<minore)
    minore=&A[i];
 }
return minore;
}

Purtroppo con i puntatori malgrado penso di aver capito la teoria che ci sta dietro non riesco a fare mezzo esercizio

Grazie a tutti, e buona giornata.

11 Risposte

  • Re: Problema piccolo esercizio sui puntatori.

    &A[i]
    è l'indirizzo di memoria in cui si trova il valore dell'elemento i dell'array A.
    Forse a te serve semplicemente il valore iesimo in A ovvero:
    A[i]
  • Re: Problema piccolo esercizio sui puntatori.

    Trova l'elemento minore tramite gli indici. E poi restituisci l'indirizzo dell'elemento trovato.
  • Re: Problema piccolo esercizio sui puntatori.

    Unqualunque ha scritto:


    &A[i]
    è l'indirizzo di memoria in cui si trova il valore dell'elemento i dell'array A.
    Forse a te serve semplicemente il valore iesimo in A ovvero:
    A[i]
    Mi sa che vuole proprio l'indirizzo di memoria del minore
  • Re: Problema piccolo esercizio sui puntatori.

    oregon ha scritto:


    Trova l'elemento minore tramite gli indici. E poi restituisci l'indirizzo dell'elemento trovato.
    ciao Oregon, intendi così?
    
    double* funzione (double* A, int N){
    int i;
     double minore=A [0];
    for( i=0;i<N;i++){
    if(A[i]<minore)
        minore=A[i];
     }
    return &minore;
    }
    
    perchè avevo già provato e non compilava, mentre se al posto di minore utilizzo A [ i ] funziona, solo che non avrebbe senso.
  • Re: Problema piccolo esercizio sui puntatori.

    La variabile 'minore' ha tempo di vita locale, ovvero è creata dentro la funzione e non è più mantenuta fuori di essa. Quell'indirizzo di memoria dunque può continuare ad esistere solo se non viene sovrascritto, il che è piuttosto casuale. Invece l'indirizzo di un valore appartenete ad A esiste prima della funzione ed esisterà anche dopo, all'interno dell'ambito in cui è A stato creato.

    Io consiglio di salvare l'indice dell'elemento minore e dunque ritornare l'indirizzo associato
    return &A[i_saved];
  • Re: Problema piccolo esercizio sui puntatori.

    No, come dice Unqualunque, intendo questo
    
    double* funzione(double* A, int N)
    {
    	int i, imin = 0;
    	double min = A[0];
    
    	for (i = 0; i<N; i++) {
    		if (A[i] < min)
    		{
    			min = A[i];
    			imin = i;
    		}
    	}
    
    	return &A[imin];
    }
    
  • Re: Problema piccolo esercizio sui puntatori.

    Capito, siete stati entrambi chiarissimi, scusate se insisto con le domande ma sul libro non ho trovato risposta, per quale motivo l'indirizzo dell'indice non cambia mentre quello del valore si, malgrado siano entrambi dichiarati dentro la funzione?
  • Re: Problema piccolo esercizio sui puntatori.

    L'indirizzo dell'indice non ti serve a nulla. Ti serve l'indirizzo dell'elemento che contiene il valore perché è ciò che richiede l'esercizio e quello che restituisce la funzione. L'indirizzo dell'indice è un puntatore ad int, non un puntatore a double.
  • Re: Problema piccolo esercizio sui puntatori.

    oregon ha scritto:


    L'indirizzo dell'indice non ti serve a nulla. Ti serve l'indirizzo dell'elemento che contiene il valore perché è ciò che richiede l'esercizio e quello che restituisce la funzione. L'indirizzo dell'indice è un puntatore ad int, non un puntatore a double.
    Hai ragione, mi sono espresso male, analizzando il tuo codice tu hai assegnato alla variabile "imin" l'indice dell'elemento minore presente nell'array e poi hai ritornato l'indirizzo di memoria del vettore con il nuovo indice, non capisco per quale motivo questo assegnamento è fondamentale. Scusami se ti sto tormentando e ti autorizzo a mandarmi a quel paese se lo ritieni opportuno, e che non riesco a comprendere questi maledetti puntatori. Per far compilare un programma su di essi devo andare a tentativi e questa cosa non mi fa impazzire, per come sono fatto io se non capisco a pieno un argomento non vado avanti. Perdonami per l'insistenza!
  • Re: Problema piccolo esercizio sui puntatori.

    I puntatori sono un argomento un po' "rognoso" e praticamente l'unico argomento del C un po' difficile da digerire per chi inizia (oltre alla ricorsione).

    Quando trovi il minimo nella variabile min non ti basta per restituire l'indirizzo dell'elemento che lo contiene. Ti serve il suo indice. Ecco perché conservo anche l'indice, in modo che possa essere restituito l'indirizzo dell'elemento corretto.

    Se hai

    A[1] A[2] A[3]

    e sai che il minimo è A[2] ti serve il 2 per poter restituire l'indirizzo dell'elemento corretto, quindi &A[2]
  • Re: Problema piccolo esercizio sui puntatori.

    oregon ha scritto:


    I puntatori sono un argomento un po' "rognoso" e praticamente l'unico argomento del C un po' difficile da digerire per chi inizia (oltre alla ricorsione).

    Quando trovi il minimo nella variabile min non ti basta per restituire l'indirizzo dell'elemento che lo contiene. Ti serve il suo indice. Ecco perché conservo anche l'indice, in modo che possa essere restituito l'indirizzo dell'elemento corretto.

    Se hai

    A[1] A[2] A[3]

    e sai che il minimo è A[2] ti serve il 2 per poter restituire l'indirizzo dell'elemento corretto, quindi &A[2]
    Capito Oregon, adesso è più chiaro, ho già capito che perderò un bel po' di tempo su questo argomento. Grazie mille per la tua disponibilità
Devi accedere o registrarti per scrivere nel forum
11 risposte