Errori programma C

di il
10 risposte

Errori programma C

Ciao ragazzi, non capisco cosa mi chiedano di fare gli errori che ho trovato compilando questo programma di analisi numerica e dove io stia sbagliando. Premetto che conosco il C da un mesetto e col computer ho pochissima dimestichezza, quindi anche dopo 1 ora non ci ho cavato le gambe da sti errori.

#include <iostream>
#include <stdio.h>
#include <math.h>

double funz (double x) {

#define NINT (20) 
#define TOL (1.e-4)

int main (void) {
    
        
    FILE *file_out;
    int n,k;
    double a,b,h,xk,ak,bk,fxk,fak,fbk;
    
    file_out=fopen("graph.dat","w");
    n=NINT;
    b=1.; 
    a=0.; 
    ak=a; 
    bk=b; 
    xk=0.5*(ak+bk);
    h=0.5*(b-a);
    fxk=funz(xk); 
    fak=funz(ak);  
    fbk=funz(bk);
    
     fprintf(file_out,"%d %f %f %f %f %f %f %f \n", 0,h,ak,bk,xk,fak,fbk,fxk);
    for (k=1;k<=n;k++) {
        if (fxk*fak > 0){  
            ak = xk; fak = fxk;
        
        }
        else { 
            bk = xk;
            fbk = fxk; 
            
        }
        xk=0.5*(ak+bk); 
        fxk=funz(xk); 
        h=0.5*h; 
        fprintf(file_out,"%d %f %f %f %f %f %f %f \n", k,h,ak,bk,xk,fak,fbk,fxk);  if (h < TOL) {
            fprintf(file_out,"\nstima dell’errore: %e TOL: %e\n", h,TOL);
            k++;
            break;
            
        } 
        
    }
    
    printf("iterazioni: %2d z0: %12.8f stima dell’errore= %e \n", k-1,xk,h);

    
    return 0;
}

        double y;
        y = exp(x)+x-2.;
        return y;
      }
      
      
ho più o meno copiato l esercizio del file del prof visto che lui non spiega nulla e si inalbera se fai domande. Il FILE *file_out cos è? A che scopo l ha messo? Non l ha mai usato prima. Anche file_out=fopen("graph.dat","w"); non so cosa significhi.

Comunque gli errori sono questi:

~/Desktop$ gcc -c an1.c -Wall -ansi -pedantic
an1.c: In function ‘funz’:
an1.c:9:1: warning: ISO C forbids nested functions [-Wpedantic]
 int main (void) {
 ^~~
an1.c:9:5: warning: ‘main’ is normally a non-static function [-Wmain]
 int main (void) {
     ^~~~
At top level:
an1.c:9:5: warning: ‘main’ defined but not used [-Wunused-function]
Ringrazio in anticipo chi avrà voglia di darmi una mano

10 Risposte

  • Re: Errori programma C

    Hai scritto all'inizio

    double funz (double x) {

    e alla fine

    double y;
    y = exp(x)+x-2.;
    return y;
    }

    Non ti sembra che la funzione sia stata spezzata?
  • Re: Errori programma C

    Il prof l aveva scritta sia all inizio (come sta sopra ma senza aprire la graffa) e poi alla fine aveva scritto il blocco

    double funz(double x) {
    double y
    ; y = exp(x)+x-2.;
    return y; }

    però mi dava errori strani riguardo alle parentesi graffe, che son spariti facendo come ho fatto
    
    :~/Desktop$ gcc -c an1.c -Wall -ansi -pedantic
    an1.c: In function ‘funz’:
    an1.c:9:17: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
     int main (void) {
                     ^
    an1.c:57:32: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
             double funz (double x) {
                                    ^
    an1.c:61:7: error: expected ‘{’ at end of input
           }
           ^
    an1.c:61:7: warning: control reaches end of non-void function [-Wreturn-type]
           }
           ^
    
  • Re: Errori programma C

    Hai fatto confusione.

    Quello che si scrive sopra è il prototipo e si scrive così
    
    double funz(double x);
    
    Alla fine si scrive l' implementazione ovvero
    
    double funz(double x) { 
       double y;
       y = exp(x)+x-2.0; 
       return y;
    }
    
  • Re: Errori programma C

    Wow grazie mille, ho capito l errore, ho perso un ora per un punto e virgola, tutti quegli errori me li dava perchè non avevo messo il ; dopo double funz (double x) , ora gira perfettamente
  • Re: Errori programma C

    Ragazzi scusate son di nuovo in crisi con un programma che ho provato a fare da solo questa volta
    
    #include <stdio.h>
    #include <math.h>
    
    double funz (double x);
    double deriv (double x);
    
    #define NINT (10)
    #define TOL (1.4e-4)
    
    int main (void) {
        
        FILE *file_out;
        
        int n,k;
        double xk,xk1,fxk,dxk;
        file_out=fopen ("graph1.dat","w");
        n=NINT;
        xk=0.1;
        fxk=funz(xk);
        
        for (k=1 ; k<=n ; k++);
        dxk=deriv(xk);
        xk1=xk-fxk/dxk;
        fprintf (file_out, "%d %f %f %f %f %f \n" , k,xk1,xk,fxk,dxk,fabs(xk1-xk));
        
        if (fabs(xk1-xk) < TOL) { 
            fprintf(file_out,"\n stima dell’errore: %e TOL: %e\n", fabs(xk1-xk),TOL); k++;
            break;   //qua c e un errore, bisogna togliere il break?//
            
        }
        
        xk=xk1;
        fxk=funz(xk);
    }
    
    printf("iterazioni: %2d xk: %f fun: %f \n",k-1. ,xk,fxk)    //qua c e un errore//
    
        
        return 0
    }
    
    double funz (double x) {
        double y;
        y=  exp(x)+x-2. ;       //qua c e un errore//
        return y ;
    }
    
    double deriv (double x) {
        double y;
        y=exp(x)+1. ;
        return y;
    }
        

    ho evidenziato le 3 righe dove mi ha dato errori
    
    
    /Desktop$ gcc -c an2.c -Wall -ansi -pedantic
    an2.c: In function ‘main’:
    an2.c:28:9: error: break statement not within loop or switch
             break;
             ^~~~~
    an2.c: At top level:
    an2.c:36:8: error: expected declaration specifiers or ‘...’ before string constant
     printf("iterazioni: %2d xk: %f fun: %f \n",k-1. ,xk,fxk)
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    an2.c:36:44: error: unknown type name ‘k’
     printf("iterazioni: %2d xk: %f fun: %f \n",k-1. ,xk,fxk)
                                                ^
    an2.c:36:50: error: unknown type name ‘xk’
     printf("iterazioni: %2d xk: %f fun: %f \n",k-1. ,xk,fxk)
                                                      ^~
    an2.c:36:53: error: unknown type name ‘fxk’
     printf("iterazioni: %2d xk: %f fun: %f \n",k-1. ,xk,fxk)
                                                         ^~~
    an2.c: In function ‘funz’:
    an2.c:44:17: error: stray ‘\342’ in program
         y=  exp(x)+x???2. ;
                     ^
    an2.c:44:18: error: stray ‘\210’ in program
         y=  exp(x)+x???2. ;
                      ^
    an2.c:44:19: error: stray ‘\222’ in program
         y=  exp(x)+x???2. ;
                       ^
    an2.c:44:20: error: expected ‘;’ before numeric constant
         y=  exp(x)+x-2. ;
                        ^~
    an2.c: In function ‘main’:
    an2.c:34:1: warning: control reaches end of non-void function [-Wreturn-type]
     }
    
  • Re: Errori programma C

    Non mischiare le discussioni. Se è un'altra cosa, apri un'altra discussione con titolo opportuno.
  • Re: Errori programma C

    Si è un altro esercizio simile all altro sempre di analisi numerica in cui ho riscontrato altri errori e non so come metterci le mani. Non volevo aprire troppe discussioni ravvicinate allora l ho ripostato quà. Se tolgo il break ho notato che mi da solo 2 errori, ma in quelle 2 righe che mi da come errore non so cosa abbia fatto di male, mi segna sbagliata l'espressione quando è aleatoria , non ha senso. Anche nella stampa mi dice che non ho dichiarato le costanti (k,xk,fxk) quando le ho dichiarate sopra in int/double.
  • Re: Errori programma C

    E invece devi aprire un thread per problema!

    Comunque il break va in un ciclo non ovunque. Che volevi fare con quel break?

    E comunque dimentichi i ; dive devono esserci e li metti dove non vanno.. controlla con attenzione
  • Re: Errori programma C

    Avevo messo anche una graffa in più, ora mi è rimasto l ultimo errore che mi dice che nella riga dove c è

    printf("iterazioni: %2d xk: %f fun: %f \n",k-1. ,xk,fxk)

    non posso usare %2d perchè k-1 è una funzione double, invece se a un int sottrai un intero rimane un interoù
    
    an2.c: In function ‘main’:
    an2.c:33:23: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=]
     printf("iterazioni: %2d xk: %f fun: %f \n",k-1. ,xk,fxk);
                         ~~^                    ~~~~
                         %2f
    
    vabbè che se metto %2f come mi dice lui il programma viaggia
  • Re: Errori programma C

    Il tipo di dato è double e quindi va %2f. Che abbia un valore intero è un'altra cosa. Non confondere il tipo di dato e il valore del dato
Devi accedere o registrarti per scrivere nel forum
10 risposte