Problema piccolo esercizio sui puntatori.

di Anonimizzato28634 il
11 risposte
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

  • &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]
  • Trova l'elemento minore tramite gli indici. E poi restituisci l'indirizzo dell'elemento trovato.
  • 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
  • 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.
  • 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];
  • 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];
    }
    
  • 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?
  • 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.
  • 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!
  • 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]
  • 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