Vettore come parametro di funzione

di il
17 risposte

Vettore come parametro di funzione

Ciao a tutti,
sono nuovo del forum e anche della programmazione in C++, sto studiando come autodidatta da un libro di testo di un Istituto tecnico informatico... sono arrivato ai passaggi di vettori come parametri di funzioni e ho un problema con un piccolo programma fatto come esercizio.

il problema è molto semplice... sembra che il compilatore vada a leggere in una cella di memoria sbagliata perché mi da un risultato assurdo (2043730176)

#include <iostream>

using namespace std;

int differenza (int Vettore[], int N)
{
    int Min, Max, i = 0;
    float differenza;
    //int vettore[N];

    
    Min = Vettore[0]; // calcola il valore minimo
    for (i=0; i<N; i++) {
        if (Vettore[i] < Min) {
            Min = Vettore[i];
        }
    }
    Max = Vettore[0]; //calcola il valore massimo
    for (i=0; i<N; i++) {
        if (Vettore[i] > Max) {
            Max = Vettore[i];
        }    }
    
    differenza = Max - Min;
    return differenza;
}

int main ()
{
    int N = 0, i = 0;
    int vettore[N];
    int dif = 0;
    
        
    cout<<"inserire il numero di elementi\n";
    cin>>N;
    cout<<"inserire gli elementi\n";
    for (i=0; i<N; i++) {
        cin>>vettore[i];
    }
    
    for (i=0; i<N; i++) {
        cout<<vettore[i]<<"\t";
    }
    /*cout<<endl; SE IO LASCIO QUESTO A CAPO COME COMMENTO IL PROGRAMMA FUNZIONA SE INVECE LO IMPOSTO COME COMANDO NON FUNZIONA PIU E' MI PASSA UN RISULTATO ASSURDO.*/
    
    dif = differenza(vettore, N);
    
    cout<<"la differenza tra il massimo e il minimo è:\n"<<dif;
}



lo scopo di questo codice è quello di calcolare la differenza tra il massimo valore del vettore e il minimo valore del vettore.
ricordo che se io non inserisco il "cout<<endl;" come comando, ma come commento, il programma funziona nel modo corretto

qualcuno sa dirmi perché non riesco a passare il vettore nel modo corretto?
io non ho trovato discussioni simili nel forum ma se ce ne fosse una vi prego di indirizzarmici...

17 Risposte

  • Re: Vettore come parametro di funzione

    Mostra anche il main che hai utilizzato.
  • Re: Vettore come parametro di funzione

    La main è gia mostrata solo piu in basso nel codice....

    comunque la riposto.
    
    int main ()
    {
        int N = 0, i = 0;
        int vettore[N];
        int dif = 0;
        
            
        cout<<"inserire il numero di elementi\n";
        cin>>N;
        cout<<"inserire gli elementi\n";
        for (i=0; i<N; i++) {
            cin>>vettore[i];
        }
        
        for (i=0; i<N; i++) {
            cout<<vettore[i]<<"\t";
        }
        cout<<endl;
        
        dif = differenza(vettore, N);
        
        cout<<"la differenza tra il massimo e il minimo è:\n"<<dif;
    }
    
    secondo voi può essere un errore del compilatore?
  • Re: Vettore come parametro di funzione

    Forse è perchè usi lo stesso nome per la variabile che per la funzione, prova a cambiarlo.
    dato che quando inizi i confronti presumi che il minimo o il massimo si trovino alla posizione 0 ti conviene iniziare il for con i=1
  • Re: Vettore come parametro di funzione

    Lascia stare quello che ti hanno consigliato che è estremamente errato.
    
    int N = 0, i = 0;
    int vettore[N];
    
    Tu non allochi un bel niente con quella riga,N deve essere > 0.
    
        cout<<"inserire il numero di elementi\n";
        cin>>N;
    
    Qui devi stare attento perchè se modifichi N che sia maggiore di vettore[N] avrai un buffer overflow, non puoi nemmeno ridimensionare il vettore perchè è statico.
  • Re: Vettore come parametro di funzione

    Ti suggerisco di lavorare così, dando una dimensione massima al tuo vettore
    
    #define MAXSIZE   100
    int main ()
    {
        int N = 0, i = 0;
        int vettore[MAXSIZE];
        int dif = 0;
          
        cout<<"inserire il numero di elementi\n";
        cin>>N;
    
        if((N<=0)||(N>MAXSIZE))
        {
            cout<<"dimensione non valida\n";
            return 1;
        }
    
  • Re: Vettore come parametro di funzione

    Ammetto che non ho capito gran parte di quello che hai detto vbextreme perché non so cosa sia un buffer overflow...

    comunque ho notato che se io inserisco il codice nella seguente maniera il programma funziona correttamente:
    #include <iostream>
    
    using namespace std;
    
    int differenza (int Vettore[], int N)
    {
        int Min, Max, i = 0;
        float differenza;
        //int vettore[N];
    
        
        Min = Vettore[0]; // calcola il valore minimo
        for (i=0; i<N; i++) {
            if (Vettore[i] < Min) {
                Min = Vettore[i];
            }
        }
        Max = Vettore[0]; //calcola il valore massimo
        for (i=0; i<N; i++) {
            if (Vettore[i] > Max) {
                Max = Vettore[i];
            }    }
        
        differenza = Max - Min;
        return differenza;
    }
    
    int main ()
    {
        int N = 0, i = 0;
        int vettore[N];
        int dif = 0;
        
            
        cout<<"inserire il numero di elementi\n";
        cin>>N;
        cout<<"inserire gli elementi\n";
        for (i=0; i<N; i++) {
            cin>>vettore[i];
        }
        
        for (i=0; i<N; i++) {
            cout<<vettore[i]<<"\t";
        }
        
        
        dif = differenza(vettore, N);
        
        cout<<endl<<"la differenza tra il massimo e il minimo è:\n"<<dif;
    }
    
    l'unica differenza con il codice precedente è nella parte finale:
    
             cout<<endl;
    
             dif = differenza(vettore,N);
    
             cout<<"la differenza tra il minimo e il massimo è:\n"<<dif;
    
    questo è il codice che non funziona.
    
             dif = differenza(vettore,N);
     
             cout<<endl<<"la differenza tra il massimo e il minimo è:\n"<<dif;
    
    mentre questo funziona...
    ora io ho risolto il problema andando per tentativi..

    vorrei, però, capire perché si comporta così in modo
    da non ripetere lo stesso errore in futuro magari in un programma più complesso...

    vi ringrazio tutti comunque per le vostre risposte sono state utili anche in altri esercizi che stavo svolgendo.
  • Re: Vettore come parametro di funzione

    Andando avanti con gli esperimenti inserendo varie possibilità mi sono reso conto anche che se do a N un valore superiore al 10 il problema si ripete quindi non ho risolto un bel niente a quanto pare...
  • Re: Vettore come parametro di funzione

    Vbextreme ti sta dicendo che se fai
        
        int N = 0, i = 0;
        int vettore[N];
    
    allochi un vettore di dimensione 0.

    Io ti ho suggerito di dare una dimensione massima al vettore, per es. 100.

    Il buffer overflow è, in parole povere, l'accesso ad un buffer oltre ai suoi limiti: non è detto che questo provochi un crash, potrebbe anche apparentemente funzionare come nel tuo caso...
  • Re: Vettore come parametro di funzione

    Non avevo visto il main e infatti l'errore era nel main. Come ti hanno fatto notare questo

    int N = 0, i = 0;
    int vettore[N];

    non è corretto.

    Non importa se ti "sembra" funzionare, è un errore grave e il tuo programma potrà subire dei crash in seguito.
  • Re: Vettore come parametro di funzione

    Grazie per l'aiuto, seguendo il vostro consiglio ho modificato il codice del main nel seguente:
    
             int main ()
    {
        int N = 0, i = 0;
        int vettore[100];
        int dif = 0;
        
            
        cout<<"inserire il numero di elementi\n";
        cin>>N;
        if (N>=100) {
            cout<<"Errore: gli elementi non possono essere maggiori di 99";
        }
        else if (N<100){
            
            cout<<"inserire gli elementi\n";
            for (i=0; i<N; i++) {
                cin>>vettore[i];
            }
        
            for (i=0; i<N; i++) {
                cout<<vettore[i]<<"\t";
            }
        
        
            dif = differenza(vettore, N);
        
            cout<<endl<<"la differenza tra il massimo e il minimo è:\n"<<dif;
        }
    }
    
    ora il programma funziona in modo corretto almeno dai miei test...

    grazie ancora.
  • Re: Vettore come parametro di funzione

    Scusa la mia estrema pignoleria ma:
    a) puoi accettare anche N=100, quello che non puoi accettare è un numero di elementi maggiore di 100
    b) dovresti controllare che N non sia minore o uguale a 0.
  • Re: Vettore come parametro di funzione

    candaluar ha scritto:


    scusa la mia estrema pignoleria ma:
    a) puoi accettare anche N=100, quello che non puoi accettare è un numero di elementi maggiore di 100
    b) dovresti controllare che N non sia minore o uguale a 0.
    quindi intendi modificare il codice come segue?
    
            int main ()
    {
        int N = 0, i = 0;
        int vettore[100];
        int dif = 0;
        
            
        cout<<"inserire il numero di elementi\n";
        cin>>N;
        if (N>100 || N <=0) {
            cout<<"Errore: gli elementi non possono essere maggiori di 100 o minori di 0";
        }
        else if (N<=100){
            
            cout<<"inserire gli elementi\n";
            for (i=0; i<N; i++) {
                cin>>vettore[i];
            }
        
            for (i=0; i<N; i++) {
                cout<<vettore[i]<<"\t";
            }
        
        
            dif = differenza(vettore, N);
        
            cout<<endl<<"la differenza tra il massimo e il minimo è:\n"<<dif;
        }
    }
    
    comunque per la pignoleria mi fa solo piacere piu errori mi indicate meno ne farò in futuro
  • Re: Vettore come parametro di funzione

    Sì, ora è più preciso; aggiungo anche queste due cose che non ti avevo detto prima
    - l'if (N<=100) non serve, se provi a fare un flowchart te ne accorgi subito
    - potresti dare un nome alla costante 100, così come ti avevo suggerito fin dall'inizio, con una #define
  • Re: Vettore come parametro di funzione

    else if (N<=100){
    questo è inutile basta un semplice else.
    ulteriore accorgimento nella funzione differenza puoi fare tutto in un ciclo:
    
    ...
        Min = Max = Vettore[0];
        for ( i = 1 ; i < N ; i++ ) //parto da 1 perchè ovviamente min e max == vettore[0]
        {
            if (Vettore[i] < Min)
                Min = Vettore[i];
            if (Vettore[i] > Max) 
                 Max = Vettore[i];
        }
    ...
    
Devi accedere o registrarti per scrivere nel forum
17 risposte