Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Creer un fichier dans une boucle


Sujet :

C

  1. #1
    Candidat au Club
    Creer un fichier dans une boucle
    Bonjour, je souhaiterais creer different fichier a chaque tour de boucle, pour cela j'utilise donc la fonction sprintf. Cependant une erreur se produit lorsque mes fichiers se creer j'ai l'impression qu'ils sont bug. De plus l'executable ne creer pas les memes fichiers quand je suis sur linux ou sur MacOs. Sur Linux on me signale apres execution le message munmap_chunk(): invalid pointer . Abandon (core dumped). Ici je souheterais resoudre une equa diff avec different pas, pour chaque pas (noté h dans mon code) je souhaiterais un fichier different. Or je ce comprend pas pourquoi par exemple à partir de N=100, le temps (ma premiere colonne) s'affiche en 2 fois à chaque tour... (cf piece jointe)

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    int main(void){
     
            //Condition Initial
        double t0=0.0 , tmax=25;
        char nom1[20];
        char nom2[20];
        int ValeurdeN[4]={50,100,200,400};  //on fait varier le pas.
        // Ecriture de l'erreur
        FILE*eulerErr=fopen("euler_err.txt","w+");
        FILE*exact=fopen("val_exacte.txt","w+");
     
        if (eulerErr==NULL||exact==NULL){
                   puts("ERREUR a l'ouverture. Fin du programme");
                   return 0;
               }
        for (int i=0; i<4; i++){
            er1=0;
            h=tmax/ValeurdeN[i];
     
                sprintf(nom1,"val_euler_N=%d.txt",ValeurdeN[i]);
                sprintf(nom2,"val_rk2_N=%d.txt",ValeurdeN[i]);
                FILE*euler=fopen(nom1,"w+");
                FILE*rk=fopen(nom2,"w+");
                if (rk==NULL||euler==NULL ){
                    puts("ERREUR a l'ouverture. Fin du programme");
                    return 0;
                }
                // Valeur inital
                t=t0; v1=v0; vth=vtheo(t,30); v2=v0;
     
                for(int p=0; p<=ValeurdeN[i]; p++){
                    // Ecriture des fichiers
                    fprintf(exact,"%lf\t%lf\n",t,vth);
                    fprintf(euler,"%lf\t%lf\n",t,v1);
                    fprintf(rk,"%lf\t%lf\n",t,v2);
                    //Euleur
                    v1=....
                    // Runge-Kutta ordre 2 Euler modifie
                    vt=...
                    v2=....
     
                    //Commun à toute les methodes
                    t=t+h;
                    vth=....
                    if (er1<fabs(v1-vth)) er1=fabs(v1-vth);
                }
                fprintf(eulerErr,"%f\t%f\n",h,er1);
                fclose(exact);fclose(euler);fclose(rk);
     
        }
    }


    Si quelqu'un pourrez m'éclairer je lui serait tres reconnaissant

  2. #2
    Membre chevronné
    Bonjour.

    J'ai survolé ton code, de ce que je vois er1 et h sont définis mais pas déclarés, mais surtout l'instruction fclose(exact) est dans la 1ère boucle alors que la création FILE*exact=fopen("val_exacte.txt","w+"); est en dehors, donc à la deuxième itération fclose() va agir sur un fichier déjà fermé.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un chat / clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  3. #3
    Candidat au Club
    oui j'ai enleve la delcaration de mes variables quand j'ai poste par megarde mais ils sont bien declaré pas de probleme. Et Merci je corrige ca et plus de problème sur mes fichiers N=50 merci !!