Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43

    [C++] puntatori ed array

    Ciao a tutti, in questi giorni sto studiano la programmazione in c++ e oggi, affrontando l'argomento puntatori, mi sono imbattuto in un esercizio che non riesco a risolvere.

    In pratica devo inserire all'interno di un array dei valori, poi chiamo una funzione che riceve due parametri: double* p, int n, dove p e' il puntatore alla testa dell'array e n e' la lunghezza dell'array.
    Questa funzione deve trovare il valore minimo dell'array e ritornare alla funzione main, l'indirizzo del valore minore. Ho cosi' svolto l'esercizio:

    codice:
    #include <iostream>
    using namespace std;
    
    double* min (double* a, int n);
    
    int main ()
    {
    	int n;
    	double* p;
    	cout << "Inserire la dimensione dell'array" << endl;
    	cin >> n;
    	double a[n];
    	p = a;
    	cout << "Inserire " << n << " valori nell'array" << endl;
    	for (int i=0; i<n; ++i)
    	{
    		cin >> a[i];
    	}
    	cout << endl;
            p = min (&p, a);
    	cout << "L'indirizzo dell'elemento minore e': " << p << endl;
    	return 0;
    }
    
    double* min (double* p, int n)
    {
    	double min = a[0];
    	double* add_min = a;
    	for (int i=1; i<n; ++i)
    	{
    		if(a[i]<=min)
    		{
    			min=a[i];
    			add_min=&a[i];
    		}
    	}
    	return add_min;
    }
    quando provo a compilare il codice, mi viene generato quest'errore:

    codice:
    array_punt.cc: In function ‘int main()’:
    array_punt.cc:20:13: error: no matching function for call to ‘min(double**, int&)’
    array_punt.cc:20:13: note: candidates are:
    array_punt.cc:4:9: note: double* min(double*, int)
    array_punt.cc:4:9: note:   no known conversion for argument 1 from ‘double**’ to ‘double*’
    /usr/include/c++/4.6/bits/stl_algobase.h:233:5: note: template<class _Tp, class _Compare> const _Tp& std::min(const _Tp&, const _Tp&, _Compare)
    /usr/include/c++/4.6/bits/stl_algobase.h:187:5: note: template<class _Tp> const _Tp& std::min(const _Tp&, const _Tp&)
    potete aiutarmi?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43
    Dopo sveriati tentativi, ho capito il problema:

    codice:
    p = min (&p, a);
    questa istruzione e' sbagliata, quella corretta e':

    codice:
    p = min (p, a);
    pero' non capisco il perche', qualcuno me lo sa spiegare ?

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157

    Re: [C++] puntatori ed array

    Senza saper né leggere né scrivere vedo questo:
    Originariamente inviato da cryspolo

    codice:
    array_punt.cc: In function ‘int main()’:
    array_punt.cc:20:13: error: no matching function for call to ‘min(double**, int& ) ’
    e nel tuo main quest definizione
    codice:
    double* min (double* p, int n)
    e la funzione richiamata con
    codice:
     p = min (&p, a);
    se non sbaglio tu stai passando alla funzione l'indirizzo del puntatore e un array di double, quindi non stai chiamando bene la funzione.

    Non so se c'è altro, questo è un inizio

    non hai altri warning?
    RTFM Read That F*** Manual!!!

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43
    Scusa, errore mio, ho sbagliato a scrivere

    codice:
    p = min (p, n);
    questa e' l'istruzine corretta.

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Ci sono parecchi errori:
    codice:
    double a[n];
    Dovresti usare l'allocazione dinamica invece!
    codice:
    double *a = new double[n];
    // ...
    delete[] a;

    codice:
    p = min (&p, a)
    questa chiamata, come già evidenziato, che dovrebbe essere:
    codice:
    p = min(a, n);
    in quanto è a a contenere i tuoi valori


    codice:
    double* min (double* p, int n)
    {
    	double min = a[0];
    	double* add_min = a;
    	for (int i=1; i<n; ++i)
    	{
    		if(a[i]<=min)
    		{
    			min=a[i];
    			add_min=&a[i];
    		}
    	}
    	return add_min;
    }
    a non è presente all'interno della funzione!
    Inoltre, per risparmiare operazione potresti sostituire il <= con < ed &a[i] con (a+i)...

    Questa è una versione funzionante:
    codice:
    double* min (double* p, int n)
    {
    	double *min = p;
    	for (int i=1; i<n; ++i)
    		if(p[i] < (*min))
    			min = (p+i);
    	return min;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43
    Hai ragione, siccome ho fatto un paio di modifiche, mi sono scordato di cambiare alcuni nomi.
    visto il seguente prototito della funzione:

    codice:
    double* min (double* p, int n);
    mi puoi spiegare perche' se da dentro il main scrivo:

    codice:
    double* p;
    double a[n];
    p = a;
    p = min(&p, n);
    mi viene generato un errore, mentre se scrivo:

    codice:
    double* p;
    double a[n];
    p = a;
    p = min(p, n);
    riesco a compilare il codie senza nessun tipo di segnalazione?

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    te l'ho detto poco fa:
    codice:
    &p
    di per se restituisce il puntatore della variabile p. Visto che già p è un puntatore, hai puntatore di puntatore, tipo che non soddisfa quello del prototipo, ergo l'errore

    codice:
    double a[n];
    a lo puoi vedere come un puntatore (punta alla prima locazione dell'array, cioè ad array[0]).
    ecco perché
    codice:
    p = a;
    è valida (assegni ad un puntatore il valore di un puntatore)
    RTFM Read That F*** Manual!!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43
    Ok, capito, grazie

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Originariamente inviato da Scara95
    codice:
    double a[n];
    Dovresti usare l'allocazione dinamica invece!
    codice:
    double *a = new double[n];
    // ...
    delete[] a;
    Ripeto che
    codice:
    double a[n];
    è assai sconsigliabile e non è supportato da tutti i compilatori e non è parte dello standard C++, ma è una feature di C99.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43
    non riesco proprio a capirli questi puntatori, potreste consigliarmi qualche buona guida on line che li spieghi bene per favore, ho consultato due manuali e diversi siti, ma non riesco a farmeli entrare in testa

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.