Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2016
    Messaggi
    4

    [C++] Warning: control reaches end of non-void function [-Wreturn-type]

    Salve ragazzi,
    non riesco a capire l'avviso riportato nel titolo, mi date una mano?
    Il programma compila e funziona correttamente e il mio compilatore non mi restituisce nessun errore o avviso.
    Ma quando lo passo al valutatore automatico dell'università, lo rifiuta e mi dà quell'avviso.
    Si riferisce a questa porzione di codice:
    codice:
    bool coppieAlterne (int array1[], int array2[], const int dim)
    {
     for(int z=0; z<dim; z++)
        {
         if((array1[z] == array2[z+1]) && (array1[z+1] == array2[z]))
            return true;
         else
            return false;
        }
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,305
    Ci sono due evidenti problemi in quella funzione:

    1) Che senso ha fare un ciclo for se già alla prima iterazione si uscirà dalla funzione (con un return)?
    2) Se la condizione di permanenza nel for è falsa fin da subito, nel for non ci entra nemmeno... quindi cosa ritorna la funzione? Risposta: nulla. (quest'ultimo è il motivo del warning)


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2016
    Messaggi
    4
    Dovrei farlo con un while? Così?
    codice:
    bool coppieAlterne (int array1[], int array2[], const int dim, int &z)
    {
     while((array1[z] == array2[z+1]) && (array1[z+1] == array2[z]))
        {
            return true;
        }
            return false;
    }
    Se può servire l'intero codice:
    codice:
    #include <iostream>
    using namespace std;
    
    
    const int dim = 100;
    int* array1 = new int [dim];
    int* array2 = new int [dim];
    int n = 0;
    int m = 0;
    int z = 0;
    
    
    void leggiArray1 (int array1[], const int dim, int &n)
    {
     for(int i=0; i<dim; i++)
        {
         cin >> array1[i];
         if(array1[i] == 0)
            {
              n++;
             break;
            }
         else
            n++;
        }
    }
    
    
    void leggiArray2 (int array2[], const int dim, int &m)
    {
     for(int j=0; j<dim; j++)
        {
         cin >> array2[j];
         if(array2[j] == 0)
            {
              m++;
             break;
            }
         else
            m++;
        }
    }
    
    
    bool coppieAlterne (int array1[], int array2[], const int dim, int &z)
    {
     while((array1[z] == array2[z+1]) && (array1[z+1] == array2[z]))
        {
            return true;
        }
            return false;
    }
    
    
    
    
    int main()
    {
     leggiArray1(array1, dim, n);
     leggiArray2(array2, dim, m);
     
     if(n!=m)
        {
         cout<<" le due sequenze hanno dimensioni diverse e percio'"
              <<" non possono essere a coppie alterne ";
         return 0;
        }
     else
        {
         if(((n-1)%2)!=0 && ((m-1)%2)!=0)
            {
             cout<<" la dimensione delle sequenze DEVE essere pari ";
             return 0;
            }
        }
     if(coppieAlterne(array1,array2,dim,z)==true)
        cout<<" le due sequenze sono a coppie alterne ";
     else
        cout<<" le due sequenze NON sono a coppie alterne ";
    
    
     delete [] array1;
     delete [] array2;
    
    
     return 0;
    }

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,305
    Che c'entra il tipo di ciclo? Modificare un for con un while non cambia la logica dell'algoritmo che è sbagliata e presenta gli stessi identici problemi:

    1) Se la condizione del while è falsa in partenza, la funzione non ritorna nulla (perchè nel while non ci entra proprio) mentre dovrebbe SEMPRE ritornare un valore booleano (dovrebbe sempre eseguire una return)

    2) L'istruzione return fa terminare tutta la funzione... quindi, ripeto: che senso ha usare un ciclo se alla prima iterazione tutto finisce (e, di conseguenza, tutte le altre iterazioni non verranno mai eseguite)?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.