Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    16

    [C] #define e dichiarazione di funzionii

    Ciao
    Sto tentando di scrivere un amorevole programmino dove una funzione, ricevendo come parametri un array e la sua dimensione, restituisca la media degli interi presenti nel vettore non considerando gli eventuali duplicati.

    Questo è quello che ho scritto:
    codice:
    #include<stdio.h> 
    #define N 5
    
    double average(int arr[N], int N);
    
    int main ()
    {
        int arr[N]={3, 3, 2, 7, 2};
        int a, b;
    
        a=average(b);
    
        printf("La media e' %lf", a);
    
        return 0;
    
    }
    
        double average(int arr[N], int N)
        {
            int i, j;
            int flag;
    
            flag=0;
            for(i=0; i<N; i++) {
                for(j=i+1; j<N; j++) {
                    if(arr[i]==arr[j])
                        arr[i]==0;
                    else
                        flag=1;
                }
            }
    
            for(i=0; i<N; i++) {
                a+=arr[i];
            }
    
            return a/N;
        }
    Quando vado a compilare, compare il seguente (e maledetto) messaggio d'errore:

    expected ';', ',' or ')' before numeric constant

    riferito sia alla riga di dichiarazione, sia a quella di invocazione della funzione.


    Sono consapevole che il ragionamento con cui ho scritto il programma potrebbe essere sbagliato, intendo proprio a livello di ideazione dell'algoritmo. Però, ammesso sia possibile e se mi risponderete, avrei una richiesta da farvi:
    potreste per favore indicarmi come risolvere il problema della #define, senza correggermi il resto degli errori logici del programmino?

    Giusto perché vorrei ragionarci prima io.. in caso, se non saprò dove sbattere la mia già indebolita testolina, mi arrenderò alla vostra saggezza chiedendovi una mano anche per il resto!

    Grazie mille in anticipo.

  2. #2
    La #define fa una sostituzione "stupida" di testo, ovvero, prima di passare il sorgente al compilatore vero e proprio, sostituisce tutti gli N con il valore 5. Dovrebbe essere sufficiente questo per farti capire dove sta l'errore.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    16
    Non riesco ad arrivarci..
    nel senso che ho capito cosa fa la define in fase di precompilazione (giusto?), ma non capisco che gli frega se c'è un intero, in questo caso 5, al posto di una variabile.

    Cosa cambia alla funzione se le viene passata come parametro una variabile a cui corrisponde un intero, o direttamente l'intero stesso?

    Come faccio a gestire la necessità di avere una define, con il problema che poi mi crea usandola come parametro di una funzione??




    Abbiate pietà, venerdì ho l'esame di informatica e non so manco 'ste cose..
    già pregusto la gioiosa abilità con cui gestirò liste dinamiche, processi e file...



    Non è colpa mia, è che il Polimi nuoce alla salute.

  4. #4
    Andiamo per gradi: se in questa riga:
    codice:
        double average(int arr[N], int N)
    sostituisci tutti gli N con 5 cosa viene fuori? È ancora una dichiarazione di funzione valida?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    16
    Originariamente inviato da MItaly
    Andiamo per gradi: se in questa riga:
    codice:
        double average(int arr[N], int N)
    sostituisci tutti gli N con 5 cosa viene fuori? È ancora una dichiarazione di funzione valida?
    succede che in effetti non ha alcun senso..


    però mi resta sempre questo problema:
    Come faccio a gestire la necessità di avere una define, con il problema che poi mi crea usandola come parametro di una funzione??

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    16
    edit: mi sa che la struttura del programma è stracolma di errori.... da cui deriva anche il problema con la define. Credo di aver fatto parecchia confusione nel scriverlo..

    Domani lo modifico, vedo se riesco a cavarne un ragno dal buco e, se non sono riuscita nell'intento, vi chiederò ancora una mano

    Intanto Matteo ti ringrazio per i suggerimenti

    Ora dormo, poiché il gulliver (Burgess docet) fa uno strano cik-ciak e non mi sembra il caso violentarlo.

  7. #7
    Originariamente inviato da Hiroe
    Come faccio a gestire la necessità di avere una define, con il problema che poi mi crea usandola come parametro di una funzione??
    Hai sostanzialmente due possibilità:
    - la più banale (e meno flessibile) è non passare il parametro della lunghezza: se decidi che la lunghezza del vettore su cui opera la funzione è N, non serve passarlo, visto che è #definito globalmente; per cui:
    codice:
        double average(int arr[N])
    e dentro usi N tranquillamente.
    - la più corretta - e tutto sommato più semplice - è cambiare il nome al secondo parametro, in modo che non venga sostituito dalla define:
    codice:
        double average(int arr[], int n)
    (e ovviamente nella average cambi tutti gli N in n), e nel main la richiami come a=average(b, N).

    Nota che in ogni caso non è necessario specificare le dimensioni dell'array passato come parametro - per quanto riguarda gli array monodimensionali, questi sono comunque passati come un puntatore, ignorando le dimensioni che specifichi.
    Intanto Matteo ti ringrazio per i suggerimenti
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    16
    codice:
    #include<stdio.h>
    #define N 5
    
    double average(int arr[], int n);
    
    int main ()
    {
        int arr[N]={3, 3, 2, 7, 2};
        int a;
    
        a=average(arr[N], N);
    
        printf("\nLa media e' %lf\n", a);
    
        return 0;
    
    }
    
        double average(int arr[], int n)
        {
            int i, j;
            int flag;
            int sum;
            double avg;
    
            flag=0;
            for(i=0; i<n; i++) {
                for(j=i+1; j<n; j++) {
                    if(arr[i]==arr[j])
                        arr[j]=0;
                    else
                        flag=0;
                }
            }
    
            for(i=0; i<n; i++) {
                sum+=arr[i];
            }
    
            return avg=sum/n;
        }
    Questo è quello che ho partorito..ma la media restituita è 0.000000

    Ho sbagliato ancora qualcosa nella dichiarazione e/o nella chiamata alla funzione?
    Oppure è sbagliato l'algoritmo che dovrebbe fare la media?

    Un'altra domanda: cosa cambia tra questo pezzo di codice
    codice:
    int main ()
    {
        int arr[N]={3, 3, 2, 7, 2};
        int a;
    
        a=average(arr[N], N);
    
        printf("\nLa media e' %lf\n", a);
    
        return 0;
    
    }
    e quest'altro?
    codice:
    int main ()
    {
        int arr[N]={3, 3, 2, 7, 2};
    
        printf("\nLa media e' %lf\n", average(arr[N], N));
    
        return 0;
    
    }
    Il secondo è lecito?



    P.S:
    Nota che in ogni caso non è necessario specificare le dimensioni dell'array passato come parametro - per quanto riguarda gli array monodimensionali, questi sono comunque passati come un puntatore, ignorando le dimensioni che specifichi.
    Intendi nel momento in cui dichiaro e definisco la funzione? Quindi è da fare solo quando la invoco?

  9. #9
    Originariamente inviato da Hiroe
    Questo è quello che ho partorito..ma la media restituita è 0.000000

    Ho sbagliato ancora qualcosa nella dichiarazione e/o nella chiamata alla funzione?
    Oppure è sbagliato l'algoritmo che dovrebbe fare la media?
    L'algoritmo è giusto, è come lo chiami che è sbagliato (e non ti aiuta il fatto che il C è piuttosto lassista nei cast impliciti).
    Una volta che hai dichiarato l'array (int arr[N]={...}), ti riferisci ad esso semplicemente con arr, mentre arr[j] si riferisce al suo elemento di indice j. Per questo motivo, quando scrivi:
    codice:
        a=average(arr[N], N);
    tu non stai passando l'array arr, ma stai passando l'elemento di arr di posto N! Infatti, se abiliti i warning del compilatore, ti dirà qualcosa del tipo:
    codice:
    test.c: In function ‘main’:
    test.c:11:5: warning: passing argument 1 of ‘average’ makes pointer from integer without a cast [enabled by default]
    test.c:4:8: note: expected ‘int *’ but argument is of type ‘int’
    ovvero, si aspettava un puntatore ad intero (=gli array vengono passati come puntatori) ma tu gli hai dato un int (arr[N], essendo un elemento di un array di interi, è un intero).
    La soluzione è cambiare quella chiamata in:
    codice:
        a=average(arr, N);
    Sempre abilitando i warning, ottieni:
    codice:
    test.c:13:5: warning: format ‘%lf’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat]
    che dipende dal fatto che a è un int, ma la printf lì si aspetta un double (dato che hai specificato %lf); cambia quindi la dichiarazione di a in double.
    Un'altra domanda: cosa cambia tra questo pezzo di codice
    e quest'altro?
    Il secondo è lecito?
    In un caso usi una variabile di appoggio, nell'altro no; entrambi sono leciti (a patto di sistemare il tipo di a, come detto sopra), il secondo è più conciso. In ogni caso, un compilatore moderno genererà lo stesso codice macchina in entrambi i casi.
    Intendi nel momento in cui dichiaro e definisco la funzione? Quindi è da fare solo quando la invoco?
    Lo specifichi solo nell'eventuale parametro della funzione che tu riservi per quello scopo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    16
    Grazie delle spiegazioni! E infatti quegli warnings c'erano.

    Però non capisco quando dici
    La soluzione è cambiare quella chiamata in:
    codice:
    a=average(arr[N], N);
    perché non vedo differenze.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.