Funzioni esterne alla main

di il
8 risposte

Funzioni esterne alla main

Salve a tutti.
Il problema che riscontro riguarda la scrittura di un programma in cui 1 funzione sia contenuta in un file diverso dalla main e collegata a quest'ultima da un file.h che andrebbe incluso come le librerie nella main.

Sono più giorni che ci sto sbattendo la testa, ne ho provate di tutti i colori gusti e tipi, il prof non è in grado di spiegare la sintassi...
quando fa i programmi non succede mai che glie ne parta uno colle lezioni che finiscono con lui che muto osserva il pc modificando qua e la senza spiegare cosa sta facendo...

di oltre 120 persone dell'intero corso non c'è un cristo che sia riuscito a cavare un ragno dal buco.

Qualcuno sarebbe tanto gentile da spiegare come impostare le cose?

Allego anche il codice dei vari file che ho scritto cosicché qualche anima pia possa indicarmi l'errore.

questa è la main
#include <stdio.h>
#include "5.1.scheletro.h"
int main ()
    {
    setvbuf(stdout, NULL, _IONBF,0);
    float a;
    int b, c, d, i, u;
    printf ("Calcolo del numero della sequenza di fibonacci minore o uguale ad un numero dato\n\n");
    printf ("digita un numero\n\n");
    u=1;
    while (u!=0)
        {
        scanf  ("%f", &a);
        if ( a < 0 )
            {
            printf ("il numero inserito e' negativo");
            break;
            }/*calcola fibonacci*/
        if ( a == 0 || a == 1)
            {
            printf ("%d", b);
            }
        while ("fib")
            {
            if (d>a)
                {
                break;
                }
            }
    printf ("\nil numero della sequenza di fibonacci\n");
    printf ("\nimmediatamente inferiore a %f e'%d\n", a, b);
    printf ("\n0 per uscire\n\n");
    scanf  ("%d", &u);
        }
return 0;
}
questo è il file.h
#define max 32767
#include <stdio.h>
int fib.c(int)
e questo è il file della funzione
#include<stdio.h>
#include "5.1.scheletro.h"
/*trova n di fibonacci*/
#define max 1000
int b, c, d, i;
    b = 0 ;
    c = 1 ;
for ( i = 0 ; i <= max ; i ++ )
    {
    d = b + c ;
    b = c ;
    c = d ;
    return d;
    return c;
    return b;
}

8 Risposte

  • Re: Funzioni esterne alla main

    Supponiamo che tu abbia la funzione
    int f(int x)
    nel file func.c e la vuoi richiamare dal file main.c
    nel file main.c dovrai dichiarare che la funzione f() è esterna, per cui
    extern int f(int);
    //...
    int y;
    y = f(10);
    // ...
    
    Naturalmente se usi più di una funzione esterna potrebbe essere scomodo elencare nel file main.c tutte le extern; ecco che ciascuna "libreria" (nel nostro caso func.c) solitamente predispone un file .h che bisogna includere nel file .c in cui c'è la chiamata.
    
    #include "func.h"
    //extern int f(int);
    //...
    int y;
    y = f(10);
    // ...
    
    Nel file func.h in questo caso ci sarà solo la extern per f().
    Questo è il primo punto.

    Il secondo punto è che se hai più di un sorgente .c (in questo caso main.c e func.c) devi avere chiara la sequenza di compilazione (quindi generazione dei .obj o .o) e successivo link (in cui si mettono insieme i files obj per creare l'eseguibile).
    Questo non dovrebbe essere un problema se usi un IDE che ti gestisce pienamente il tuo progetto; potrebbe essere più difficile se lavorate invece direttamente con un Makefile.
  • Re: Funzioni esterne alla main

    Scusa, ho visto dopo il codice che avevi aggiunto.
    Allora, innanzitutto dal file .h evita di includere altri file .h; si può fare, è ammesso, ma spesso ti può generare problemi da perderci la testa!!!

    Il file .h deve essere così
    #define max 32767
    ////#include <stdio.h>
    extern int fib.c(int);      // <- serve il ; alla fine, è un prototipo
    Il file .c deve contenere interamente la funzione
    
    #include<stdio.h>
    ///#include "5.1.scheletro.h"  // <- qui non c'è bisogno
    /*trova n di fibonacci*/
    #define max 1000
    int fib.c(int)                 // <- ho aggiunto questo
    int b, c, d, i;
        b = 0 ;
        c = 1 ;
    for ( i = 0 ; i <= max ; i ++ )
        {
        d = b + c ;
        b = c ;
        c = d ;
        return d;
        return c;
        return b;
    }
    Infine, per dichiari max=32767 da una parte e poi max=1000 da un'altra, eventualmente utilizza due costanti con nomi diversi!
  • Re: Funzioni esterne alla main

    .h
    
    #define max 32767
    
    #include <stdio.h>
    
    \\int fib.c(int) non si possono dichiarare funzioni con il punto!
    
    int fib_c( int );
    
    
    .c e qualcosa
    
    //#include<stdio.h> è gia dichiarta in scheletro
    #include "5.1.scheletro.h"
    #define max 1000
    /*trova n di fibonacci*/
    int fib_c (int v)
    {
        //il parametro dove viene usato??? non si capisce niente????
        int b, c, d, i;
        b = 0 ;
        c = 1 ;
        for ( i = 0 ; i <= max ; i ++ ) //il ciclo termina dopo un loop perchè ritorni subito d dal loop
        {
            d = b + c ;
            b = c ;
            c = d ;
            return d;
            return c;//non verro mai eseguito
            return b;//non verrò mai eseguito
        }
    }
    
    ti mancano troppe basi,acquista un buon libro e studialo riga dopo riga
  • Re: Funzioni esterne alla main

    Ho apportato un po' di modifiche, ora il programma diciamo che una parte del lavoro lo farebbe...
    si inchioda quando deve usare fib ecco i sorgenti...

    questa è la main ()
    
    #include <stdio.h>
    #include "5.1.scheletro.h"
    int main ()
    {
        setvbuf(stdout, NULL, _IONBF,0);
        float a;
        int b;
        printf ("Calcolo del numero della sequenza di fibonacci minore o uguale ad un numero dato\n\n");
        printf ("digita un numero\n\n");
        b = 0 ;
        /*controlla che "a" è positivo in caso contrario chiede nuovamente "a"*/
        scanf ("%f", &a);
        while ( b == 0 )
        {
            int fib (int a);
        }
        printf ("\nil numero della sequenza di fibonacci\n");
        printf ("\nimmediatamente inferiore a %f e'%d\n", a, b);
        return 0;
    }
    
    questo è il file.h
    int fib(int a);
    questa è la funzione fib() /*calcola la sequenza di fibonacci*/
    int b, c, d, i, u;
    int fib ( int a )
    {
        b = 0;
        c = 1;
        d = b + c;
        if ( a == 0 )
        {
            return b;
        }
        if ( a == 1 )
        {
            return b;
        }
        while ( a > d )
        {
            for ( i = 0 ; b <= a ; i ++ )
            {
                d = b + c ;
                b = c ;
                c = d ;
                if ( d > a )
                {
                    return b;
                    break;
                }
            }
        }
        return 0;
    }
    
    Settando nella main, b con un qualsiasi valore diverso dal valore impostato come condizione nel while, salta l'uso di fib e restituisce come risultato...
    Vorrei capire tanto dove sia l'errore in fib...

    Quanto alle basi, devo farmele così perché non ho il tempo materiale di fare in altro modo...
  • Re: Funzioni esterne alla main

    Indipendentemente dal tempo a disposizione per l'apprendimento, non è possibile affrontare determinati argomenti senza averne le basi adeguate: in questo caso come puoi preoccuparti di definire una funzione esterna se già non sai come scriverne e richiamarne una?
    Questo è un prototipo (che non serve a richiamare la funzione, ma semplicemente a descriverne valore di ritorno e argomenti):
    
            int fib (int a);
    
    E questa è una chiamata a funzione:
    
    int res;
    //...
    res = fib( 10 );
    
    Attenzione poi ai tipi: la tua funzione lavora con int (interi senza virgola) che sono una buona scelta per la serie di Fibonacci; invece all'utente richiedi un float (valore a virgola mobile)...
  • Re: Funzioni esterne alla main

    Il valore in virgola mobile richiesto nella main è un dato richiesto espressamente dalla traccia dell'esercizio.
    Quanto agli altri dati e fatti esposti, notando un atteggiamento teso più a sminuire l'interlocutore che a fornire delle informazioni utili, con rammarico porgo i saluti e cambio forum sperando, con maggior fortuna, di poter trovare ambiente più ospitale.
  • Re: Funzioni esterne alla main

    Fossi in te farei tesoro dei consigli piuttosto che fare il polemico ...

    In ogni caso, penso che anche in altri forum (seri) ti consiglieranno di studiare di più, che non è poi un'offesa ...
  • Re: Funzioni esterne alla main

    Io ho speso almeno 20 minuti del mio tempo per illustrare come risolvere la situazione (e non ne ho ricevuto neanche un grazie ); alla fine, quando ho capito che la mia spiegazione non avresti potuto capirla, ho solo suggerito che sarebbe meglio ripartire dalle basi prima di affrontare certi argomenti. Spero di non aver offeso nessuno.
Devi accedere o registrarti per scrivere nel forum
8 risposte