[ANSI C] errore: too few arguments to function function2

di il
33 risposte

[ANSI C] errore: too few arguments to function function2

Salve!

Come descritto in altri post, mi sto affacciando ora nel mondo del c. Ho creato un piccolo programmino che ha 2 funzioni:

la prima carica un vettore in memoria,
la seconda funzione stampa a video il tutto.

Come sempre, tanto per sperimentare ho tentato l'utilizzo di librerie, tuttavia sto incontrado alcune difficoltà con la realizzazione della seconda funzione (la stampa a video). Il gcc riporta i seguenti errori:

main.c: In function ‘main’:
main.c:42:14: error: too few arguments to function ‘function2’
      vettore=function2();
              ^~~~~~~~~
In file included from main.c:3:0:
mylib.h:10:13: note: declared here
 extern void function2(struct insieme x);
             ^~~~~~~~~
mylib.c:34:16: error: conflicting types for ‘function2’
 struct insieme function2()
                ^~~~~~~~~
In file included from mylib.c:4:0:
mylib.h:10:13: note: previous declaration of ‘function2’ was here
 extern void function2(struct insieme x);

lascio i file source di seguito!

==========================================================
main.c

#include <stdio.h>
#include <stdlib.h>
#include "mylib.h"
#include <unistd.h>
#include <time.h>

int main ()

{ /*start main*/
 
/*dichiarazione variabili */
 int i;
 int d=5; /*questa variabile è utilizzata in fase di dubug per verificare che i numeri in "returtn(vettore);" siano inviati correttamente*/
 char c;
 struct insieme vettore;

/* fine dichiarazione variabili */
/* creazione del menu' */
printf("\nSeleziona una delle seguenti funzioni:\n1)Restituzione di un insieme di numeri reali inseriti da tastiera\n2)Stampa a video un insieme di numeri reali\n3)Determina ricorsivamente se un numero appartiene all'insieme\n4)Determina ricorsivamente se il primo insieme e' contenuto nel secondo\n5)Esegue l'unione di due insiemi\nInserisci il numero della funzione desiderata:");     
 
c = getchar (); /*prendiamo in input la selezione */

switch(c) 
 { /*apertura switch */
  
  case '1':                        
	
    /* collegamento alla funzione esterna type: 1 */
        vettore=function1();
	
    /*visualizzare numero elementi caricati per verificare il return */
    printf("il vettore è stato caricato correttamente, numero di elementi: %d\n", vettore.d);
  
  break;

  case '2':

    /*collegamento alla funzione esterna type: 2 */
    vettore=function1(); /*caricamento array e collegamento alla funzione 1 */
    
    /*stampa a video */
     vettore=function2();
     break;
    
    



} /*chiusura switch */

} /* chiusura main */
=====================================================================

mylib.h

#ifndef MYLIB_H /* se la lib non e' definita, la definiamo noi con il comando seguente */
#define MYLIB_H /* definizione di mylib (h) */
/*==========================================================================*/
	struct insieme {
    double *vettore;
	int d;
    };

extern struct insieme function1(); /* passaggio parametri per indirizzo */ 
extern void function2(struct insieme x);
	
#endif
===============================================================================

mylib.c

/* inclusione delle librerie */
#include <stdio.h>
#include <stdlib.h>
#include "mylib.h"


/*===============================================================================================*/
/*Funzione libreria 1 */
struct insieme function1()
{
	/* dichiarazione variabili locali */
	int i;
    struct insieme x;
	
	   printf("Quanti numeri vuoi inserire?: ");         /*Prendi in input la dimensione del vettore*/
       scanf("%d",&x.d);                                   /*Input var d */
       x.vettore = (double*)malloc(sizeof(double) * x.d);   /*allocazione spazio di memoria. In particolare ora abbiamo un vettore di d elementi*/
       printf("la dimensione del vettore e' attualmente --> %d\n", x.d); /*printf di controllo in fase debug */
    	
    	/*ciclo per prendere in input tutti i valori richiesti */
		for(i=0;
	    i<x.d;
	    i++)
	{
         printf("Dammi un valore da salvare:\n");
         scanf("%lf",&x.vettore[i]);               /*inizializzazione del vettore con elementi in input*/
	}
	return(x);/*return della struttura alla funzione main!*/
}

/* Fine prima funzione */
/*===============================================================================================*/
/* funzione libreria 2 */
struct insieme function2()

{
/* dichiarazione variabili locali */
	int i;
    struct insieme k;

    printf("\ni valori salvati nel vettore sono:\n\n");
    
    for (i=0; 
         i<k.d;
         i++)                     
 
    printf("  %f\n",k.vettore[i]);
    
return(k);



}

33 Risposte

  • Re: [ANSI C] errore: too few arguments to function function2

    Se in mylib.h definisci
    extern void function2(struct insieme x);
    allora anche nel resto del codice la function2 deve avere un parametro (struct insieme x)
  • Re: [ANSI C] errore: too few arguments to function function2

    Andrea Quaglia ha scritto:


    Se in mylib.h definisci
    extern void function2(struct insieme x);
    allora anche nel resto del codice la function2 deve avere un parametro (struct insieme x)
    Grazie mille, ho risolto! praticamente nel file mylib.c avevo sbagliato la dichiarazione della libreria, di conseguenza ho fixxato sostituendo:
    
    struct insieme function2()
    
    con:
    
    extern void function2(struct insieme x)
    
    e all'interno del main, ho passato la struttura correttamente , così la funzione è cambiata, da:
    
     case '2':
    
        /*collegamento alla funzione esterna type: 2 */
        vettore=function1(); /*caricamento array e collegamento alla funzione 1 */
        
        /*stampa a video */
         vettore=function2();
         break;
    
    a
    
     case '2':
    
        /*collegamento alla funzione esterna type: 2 */
        vettore=function1(); /*caricamento array e collegamento alla funzione 1 */
        
        /*stampa a video */
         function2(vettore);
         break;
    
    La funzione finale contenuta in mylib.c verrà quindi così:
    
    /* funzione libreria 2 */
        extern void function2(struct insieme x)
    
        {
        /* dichiarazione variabili locali */
    	int i;
    
        printf("\ni valori salvati nel vettore sono:\n\n");
        
        for (i=0; 
             i<x.d;
             i++)                     
     
        printf("  %f\n",x.vettore[i]);
    
    Lascio qua il tutto, magari può servire!
  • Re: [ANSI C] errore: too few arguments to function function2

    Mi dispiace tornare a scrivere... sto trovando un errore (nuovamente) con la funzione 3 del programma ... questa funzione prende in input numero e un insieme e dovrebbe controllare se esiste il numero all'interno dell'array.

    Putroppo ancora una volta il gcc fa comparire l'errore "too many arguments to function". Lascio qua sotto il gcc e i vari file, se qualcuno mi può aiutare, ne sarei veramente grato !

    GCC ERROR
    
    main.c: In function ‘main’:
    main.c:54:5: error: too many arguments to function ‘function3’
         function3(vettore, num_real);
         ^~~~~~~~~
    In file included from main.c:3:0:
    mylib.h:12:13: note: declared here
     extern void function3(struct insieme x);
    
    Source main.c ( da notare solo il case 3)
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "mylib.h"
    
    int main ()
    
    { /*start main*/
     
    /*dichiarazione variabili */
     int i;
     double num_real;
     int d=5; /*questa variabile è utilizzata in fase di dubug per verificare che i numeri in "returtn(vettore);" siano inviati correttamente*/
     char c;
     struct insieme vettore;
    
    /* fine dichiarazione variabili */
    /* creazione del menu' */
    printf("\nSeleziona una delle seguenti funzioni:\n1)Restituzione di un insieme di numeri reali inseriti da tastiera\n2)Stampa a video un insieme di numeri reali\n3)Determina ricorsivamente se un numero appartiene all'insieme\n4)Determina ricorsivamente se il primo insieme e' contenuto nel secondo\n5)Esegue l'unione di due insiemi\nInserisci il numero della funzione desiderata:");     
     
    c = getchar (); /*prendiamo in input la selezione */
    
    switch(c) 
     { /*apertura switch */
      
      case '1':                        
    	
        /* collegamento alla funzione esterna type: 1 */
            vettore=function1();
    	
        /*visualizzare numero elementi caricati per verificare il return */
        printf("il vettore è stato caricato correttamente, numero di elementi: %d\n", vettore.d);
      
      break;
    
      case '2':
    
        /*collegamento alla funzione esterna type: 2 */
        vettore=function1(); /*caricamento array e collegamento alla funzione 1 */
        
        /*stampa a video */
         function2(vettore);
         break;
        
      case'3':
        
        /*input numero reale*/
        printf("Inserisci un numero reale: ");    
        scanf("%lf", num_real);
    
        /*caricamento array tramite la funzione 1 */
        vettore=function1();
    
        /*caricamento del numero reale */
         vettore=function3(vettore, num_real);
    
        /*facciamo un if in base al risultato di trovato */
    
        if(vettore.trovato=false)
            printf("il numero è presente nell'insieme");
        else
            printf("Il numero non è presente nell'insieme");
        break;
    
      case'4':
    
    
    } /*chiusura switch */
    
    } /* chiusura main */
    
    Source mylib.h
    
    #ifndef MYLIB_H /* se la lib non e' definita, la definiamo noi con il comando seguente */
    #define MYLIB_H /* definizione di mylib (h) */
    /*==========================================================================*/
    	struct insieme {
        double *vettore;
    	int d;
        double numero_reale;
        bool trovato = false;
        };
    
    extern struct insieme function1(); /* passaggio parametri per indirizzo */ 
    extern void function2(struct insieme x);
    extern void function3(struct insieme x);
    #endif
    
    Source mylib.c (funzione 3)
    
    /* funzione libreria 3: stabilire se un numero reale appartiene all'insieme  */
        extern void function3(struct insieme x)
      {
             for (i=0; 
             i<x.d;
             x.trovato= false;
             i++)                     
     
                if num_real=x.vettore[i];
                x.trovato=true;
            do 
            return(x);
     }
    
  • Re: [ANSI C] errore: too few arguments to function function2

    Ciao Zenek,

    il compilatore ti sta dicendo "Ehi, stai passando troppi argomenti alla tua funzione3, nella dichiarazione da te scritta se ne aspetta meno".
    Infatti nella tua dichiarazione, se intendo bene la sintassi (che non mi pare completamente corretta), vedo che chiedi un unico parametro d'ingresso
    void function3(struct insieme x);
    la quale definirei sintatticamente in modo piu' corretto con
    void function3(struct insieme_x);
    oppure, ancora meglio,
    void function3(struct insiemeX);
    Ammetto che non ho letto tutto il tuo codice, quindi non so come tu definisca la struttura, ma scrivere "struct insieme x" non va bene. Comunque sia esso e' un solo parametro. Nel main alla linea 54 tu chiami la function3 con due parametri
    function3(vettore, num_real);
    cosa che fa altamente incazzare il compilatore.
  • Re: [ANSI C] errore: too few arguments to function function2

    BomberUS ha scritto:


    Ciao Zenek,

    il compilatore ti sta dicendo "Ehi, stai passando troppi argomenti alla tua funzione3, nella dichiarazione da te scritta se ne aspetta meno".
    Infatti nella tua dichiarazione, se intendo bene la sintassi (che non mi pare completamente corretta), vedo che chiedi un unico parametro d'ingresso
    void function3(struct insieme x);
    la quale definirei sintatticamente in modo piu' corretto con
    void function3(struct insieme_x);
    oppure, ancora meglio,
    void function3(struct insiemeX);
    Ammetto che non ho letto tutto il tuo codice, quindi non so come tu definisca la struttura, ma scrivere "struct insieme x" non va bene. Comunque sia esso e' un solo parametro. Nel main alla linea 54 tu chiami la function3 con due parametri
    function3(vettore, num_real);
    cosa che fa altamente incazzare il compilatore.
    Hey bomber! Ti ringrazio per la risposta.

    Per quanto riguarda la dichiarazione della struttura, l'ho eseguita nel file header (mylib.h)
    
    	struct insieme {
    		double *vettore;
    		int d;
    		double numero_reale;
    		bool trovato = false;
        };
    
    Per quanto riguarda la dichiarazione dell funzione, l'ho dichiarata come segue nel file mylib.h
    
    extern void function3(struct insieme x);
    
    E qui invece nel file mylib.c
    
    extern void function3(struct insieme x)
    
    Nel main al momento della chiamata a funzione, vorrei passare il parametro "vettore" che carico con la funzione numero 1, e un numero reale, che ricavo con una scanf al momento dell'esecuzione del case 3. In questo modo, la funzione numero 3, avrà in ingresso sia un numero reale sia il vettore da controllare.

    Forse potrei risolvere il tutto inserendo il parametro "num_real" all'interno della struttura ?
  • Re: [ANSI C] errore: too few arguments to function function2

    Ho trovato molti errori, molto probabilemnte ero stanco. Vi tengo aggiornati!
  • Re: [ANSI C] errore: too few arguments to function function2

    Allora, sono riuscito ad eliminare completamente tutti gli errori dal terminale !

    Tuttavia ho un problema. In fase di riscontro ( cioè, quando effettivamente la funzione va a verificare se il numero è presente nell'insieme, anche se questo non è effettivamente presente, il programma mi dice che lo è). Molto probabilmente è un errore stupido, ma non riesco letteralmente a capire come...

    Vi lascio le source, se qualcuhe buon anima ha voglia di darmi una mano!


    main.c
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "mylib.h"
    
    int main ()
    
    { /*start main*/
     
    /*dichiarazione variabili */
     int i;
     double num_real;
     int d=5; /*questa variabile è utilizzata in fase di dubug per verificare che i numeri in "returtn(vettore);" siano inviati correttamente*/
     char c;
     struct insieme vettore;
    
    /* fine dichiarazione variabili */
    /* creazione del menu' */
    printf("\nSeleziona una delle seguenti funzioni:\n1)Restituzione di un insieme di numeri reali inseriti da tastiera\n2)Stampa a video un insieme di numeri reali\n3)Determina ricorsivamente se un numero appartiene all'insieme\n4)Determina ricorsivamente se il primo insieme e' contenuto nel secondo\n5)Esegue l'unione di due insiemi\nInserisci il numero della funzione desiderata:");     
     
    c = getchar (); /*prendiamo in input la selezione */
    
    switch(c) 
     { /*apertura switch */
      
      case '1':                        
    	
        /* collegamento alla funzione esterna type: 1 */
            vettore=function1();
    	
        /*visualizzare numero elementi caricati per verificare il return */
        printf("il vettore è stato caricato correttamente, numero di elementi: %d\n", vettore.d);
      
      break;
    
      case '2':
    
        /*collegamento alla funzione esterna type: 2 */
        vettore=function1(); /*caricamento array e collegamento alla funzione 1 */
        
        /*stampa a video */
         function2(vettore);
         break;
        
      case'3':
        
        /*input numero reale*/
        printf("Inserisci un numero reale: ");    
        scanf("%lf", &vettore.numero_reale);
    
        /*caricamento array tramite la funzione 1 */
        vettore=function1();
    
        /*caricamento del numero reale */
         vettore=function3(vettore);
    
        /*facciamo un if in base al risultato di trovato */
    
        if(vettore.trovato=0)
            printf("il numero è presente nell'insieme\n");
        else
            printf("Il numero non è presente nell'insieme\n");
        break;
    
      case'4':
      break;
    
    
    } /*chiusura switch */
    
    } /* chiusura main */
    
    mylib.h
    
    #ifndef MYLIB_H /* se la lib non e' definita, la definiamo noi con il comando seguente */
    #define MYLIB_H /* definizione di mylib (h) */
    /*==========================================================================*/
    	struct insieme {
        double *vettore;
    	int d;
        double numero_reale;
        int trovato;
        };
    
    extern struct insieme function1(); /* passaggio parametri per indirizzo */ 
    extern void function2(struct insieme x);
    extern struct insieme function3();
    #endif
    
    mylib.c
    
    /* inclusione delle librerie */
    #include <stdio.h>
    #include <stdlib.h>
    #include "mylib.h"
    
    
    /*===============================================================================================*/
    /*Funzione libreria: carica un vettore 1 */
    struct insieme function1()
    { /*apertura prima funzione*/
    
    	/* dichiarazione variabili locali */
    	int i;
        struct insieme x;
    	
    	   printf("Quanti numeri vuoi inserire?: ");         /*Prendi in input la dimensione del vettore*/
           scanf("%d",&x.d);                                   /*Input variabile d */
           x.vettore = (double*)malloc(sizeof(double) * x.d);   /*allocazione spazio di memoria. In particolare ora abbiamo un vettore di d elementi*/
           printf("la dimensione del vettore e' attualmente --> %d\n", x.d); /*printf di controllo in fase debug */
        	
        	/*ciclo per prendere in input tutti i valori richiesti */
    		for(i=0;
    	    i<x.d;
    	    i++)
    	{
             printf("Dammi un valore da salvare:\n");
             scanf("%lf",&x.vettore[i]);               /*inizializzazione del vettore con elementi in input*/
    	}
    	return(x);/*return della struttura alla funzione main!*/
    } /*chiusura prima funzione */
    
    /* Fine prima funzione */
    /*===============================================================================================*/
    /* funzione libreria 2: stampa un vettore contenuto nella struttura  */
        extern void function2(struct insieme x)
    { /* apertura funzione 2 */
        
          /* dichiarazione variabili locali */
        int i;
        
             for (i=0; 
             i<x.d;
             i++)                     
     
        printf("  %f\n",x.vettore[i]);
    
    } /* chiusura funzione 2 */
    
    /* Fine seconda funzione */
    /*===============================================================================================*/
    /* funzione libreria 3: stabilire se un numero reale appartiene all'insieme  */
        extern struct insieme function3()
        {
        /* dichiarazione variabili locali */
            struct insieme x;        
            x.trovato = 0;
            int i;
            
             for (i=0,i<x.d;(x.trovato= 0); i++)                     
            
              /* for start */
                if (x.numero_reale == x.vettore[i]);
                    x.trovato= 1;
                
              /* for end */
            return(x);
        }
    
    

    Cosa ho cambiato rispetto alla versione precendete:
    
    -cambiato la dichiarazione del valore boolean, ora mi appoggio ad un valore int all'interno della struttura "insieme"
    -tolto la libreria a cui faceva riferimento il valore boolean e tutte le istruzioni per utilizzarlo
    -la function 3, ora non è più void, ma ritorna una struttura
    -cambiata la dichiarazione della funzione 3 all'interno del file mylib.c (da void a struct)
    -cambiati MOLTI valori e variabili, che utilizzavano la struttura ma erano dichiarate in maniera erronea 
    -cambiata la dichiarazione di alcune if/for, erano totalmente errate
    -aggiunti commenti per cercare di rendere più chiaro il codice 
    -utilizzo di variabili locali (così da rendere più chiaro il codice)
    -fixxata la funzione 3, ora ritorna correttamente un unico valore (il passaggio parametri è ora corretto)
    -Altri aggiustamenti minori 
    
    Spero mi possiate aiutare, nel mentre continuo a lavorare!
  • Re: [ANSI C] errore: too few arguments to function function2

    La function3() presenta parecchi problemi.

    Mi sembra strano che il compilatore non ti dia problemi perché la function3 non ha argomenti ma la chiami passando un argomento.
    E usi al suo interno una variabile locale x in cui fai ricerche. Ma quella variabile non è mai stata inizializzata (cosa volevi fare con quella variabile?)
    E poi dopo la if c'è un ; di troppo.
  • Re: [ANSI C] errore: too few arguments to function function2

    oregon ha scritto:


    La function3() presenta parecchi problemi.

    Mi sembra strano che il compilatore non ti dia problemi perché la function3 non ha argomenti ma la chiami passando un argomento.
    E usi al suo interno una variabile locale x in cui fai ricerche. Ma quella variabile non è mai stata inizializzata (cosa volevi fare con quella variabile?)
    E poi dopo la if c'è un ; di troppo.
    Ciao Oregon!

    function3 la chiamo passando il parametro "vettore" che è di tipo struttura e fa riferimento alla struttura insieme dichiarata nel mylib.h

    main.c
    
    .
    .
    .
    .
    struct insieme vettore;
    .
    .
    .
    .
    
    /*input numero reale*/
        printf("Inserisci un numero reale: ");    
        scanf("%lf", &vettore.numero_reale);
    
        /*caricamento array tramite la funzione 1 */
        vettore=function1();
    
        /*caricamento del numero reale */
         vettore=function3(vettore);
    
        /*facciamo un if in base al risultato di trovato */
    
    la variabile "x", è come ho dichiarato la struttura insieme all'interno del file mylib.c Questa fa riferimento sempre all'insieme: utilizzando x.nomevar posso collegarmi a una variabile contenuta dalla struttura dichiarata all'interno del file mylib.h:

    dichiarazione struttura insieme nel file h:
    
    struct insieme {
        double *vettore;
    	int d;
        double numero_reale;
        int trovato;
        };
    
    collegamento alla struttura tramite la dichiarazione:
    
    struct insieme x;
    
    In questo modo la struttura di tipo " insieme" si chiama x.

    Infine, dov'è il ; di troppo? non riesco a vederlo.


    Preciso che non è presunzione eh ... quel che ho scritto sopra è quel che sono riuscito a capire "studiando", ma magari è totalmente erroneo!
  • Re: [ANSI C] errore: too few arguments to function function2

    Ti ripeto.

    Hai scritto
    
        extern struct insieme function3()
        {
        /* dichiarazione variabili locali */
            struct insieme x; 
    ...
    
    e la funzione non accetta parametri, oltre al fatto di utilizzare x come variabile locale (ovviamente è errato).

    Per il ; di troppo, quando dicevo "dopo la if", intendevo proprio dopo la if !

    if (x.numero_reale == x.vettore);
  • Re: [ANSI C] errore: too few arguments to function function2

    oregon ha scritto:


    Ti ripeto.

    Hai scritto
    
        extern struct insieme function3()
        {
        /* dichiarazione variabili locali */
            struct insieme x; 
    ...
    
    e la funzione non accetta parametri, oltre al fatto di utilizzare x come variabile locale (ovviamente è errato).

    Per il ; di troppo, quando dicevo "dopo la if", intendevo proprio dopo la if !

    if (x.numero_reale == x.vettore);


    Ti ringrazio! Non avevo proprio visto ; dopo la if!

    Per quanto riguarda il passagio parametri allora dovrei dare "vettore" alla funzione? Cioè:

    
     extern struct insieme function3(vettore)
    
    Per consentire alla funzione di lavorare sulla struttura vettore?
  • Re: [ANSI C] errore: too few arguments to function function2

    È lo stesso errore fatto con function2
  • Re: [ANSI C] errore: too few arguments to function function2

    oregon ha scritto:


    È lo stesso errore fatto con function2
    Non riesco a seguirti ... cosa intendi ?
  • Re: [ANSI C] errore: too few arguments to function function2

    Quale problema avevi con function2 e come l'hai risolto?
Devi accedere o registrarti per scrivere nel forum
33 risposte