IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Problème écriture dans un fichier


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Par défaut Problème écriture dans un fichier
    Bonjour, j'ai un souci avec l'écriture dans un fichier de mes résultats.
    C'est un projet qui utilise la fonction tridag pour la résolution d'une matrice tridiagonal.
    Voici le code:

    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
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    #include "tridag.h"
     
     
    main()
    {                                   
          double k,a,b,L,T0,Te,t,teta0;                 
          double A[100],B[100],C[100],D[100],u[100];     
          unsigned long N;
          int i,j;
          FILE *fp;                                                      
          fp=fopen("RESULTAT", "w");    
     
          printf("Entrez les valeurs de k,a,b,L,T0,Te et N\n");          
          scanf("%lf%lf%lf%lf%lf%lf%d",&k,&a,&b,&L,&T0,&Te,&N);
     
          t=(10*(2*a+2*b)*L*L)/(k*a*b);                            
          teta0=(T0-Te)/Te;
     
     
     
          for (i=1;i<N;i++){                                 
                    B[i]=2+(1./N)*(1./N)*t;
                            }
                              B[N]=1+(1./N)*(1./N)*t;   
     
     
          for (i=2;i<=N;i++){                                 
                    A[i]=-1;
                            }
          for (i=1;i<=(N-1);i++){                                 
                    C[i]=-1;
                            }
          D[1]=teta0;
          for (i=2;i<=N;i++){                                 
                    D[i]=0;
                            }
     
         tridag(A,B,C,D,u,N); 
     
     
         for (i=1;i<=N;i++){                                   
                            u[i]=Te*u[i]+Te;
                            //printf("T[%d]=%lf\n",i,u[i]);
                            fprintf(fp,"%d      %lf\n",i,u[i]);           
                                }
                            //getch();
                            fclose(fp);                                
              }
    Voici également la fonction tridag:

    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
    void tridag(double a[], double b[], double c[], double r[], double u[],
    	unsigned long n)
    {
    	unsigned long j;
    	double bet,*gam;
     
    	gam=(double*)malloc(n*sizeof(double));
    	if (b[1] == 0.0) printf("Error 1 in tridag");
    	u[1]=r[1]/(bet=b[1]);
    	for (j=2;j<=n;j++) {
    		gam[j]=c[j-1]/bet;
    		bet=b[j]-a[j]*gam[j];
    		if (bet == 0.0)	printf("Error 2 in tridag");
    		u[j]=(r[j]-a[j]*u[j-1])/bet;
    	}
    	for (j=(n-1);j>=1;j--)
    		u[j] -= gam[j+1]*u[j+1];
     
    }
    Pour les valeurs a entrer, dans l'ordre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    164
    4
    50
    40
    46
    20                
    50
    Je ne comprend pas, peut-ètre que j'utilise mal les fopen, fprintf...
    Enfin le fait est que l'affichage a l'écran s'effectue, j'ai les bons résultats, mais a l'écriture, la console s'arrète.
    Merci bcp d'avance.

    Pour info je tourne sous xp, j'utilise dev cpp, et c'est un projet de physique, je ne suis pas informatitien donc désolé d'avance si l'erreur est bête.

  2. #2
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Quelques remarques :

    Dans le main :
    - int main() et non pas main()
    - pas de test sur l'ouverture du fichier
    - scanf a éviter ----> préférer plutot fgets + la ou les fonctions de conversion qui vont bien
    - tu demandes a l'utilisateur de rentrer N, qui est la borne de tes boucles, si l'utilisateur rentre 101 par exemple, t'es fichu car tes tableaux sont déclarés comme ça : B[100] . . .

    Dans la fonciton :

    - pas de test sur malloc
    - pas besoin de caster le retour d'un malloc

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                            fprintf(fp,"%d      %f\n",i,u[i]);
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                            fprintf(fp,"%d      %g\n",i,u[i]);

  4. #4
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Par défaut re
    [-mod- Merci de relire les regles du forums. La langue d'expression est le français et non le borborygme. Merci de te relire et de te corriger]


    Tout d'abord merci pour ces premières réponces,
    J'ai éssayé de changer %lf en pourcent g ou f, mais ça n'as rien changer, la console plante toujours.
    Et pour ce que tu me suggère Gyzmo, comme par exemple fgets, je ne sais pas m'en servir.
    Apriori je pense que c'est à cause du sous programme que sa ne fonctionne pas, en effet si je place le fprintf avant la fonction tridag sa marche( pour écrire B[] par exemple), dès que je place sa après, rien, même un texte ne sera pa écrit.

  5. #5
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Pour fgets : http://man.developpez.com/man3/fgets.3.php
    Tu trouveras ton bonheur

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Par défaut
    C'est bon j'ai trouvé, c'est la mémoire alloué par le malloc qui n'était pas suffisante, et sans trop savoir pourquoi j'ai rajouté un facteur dix et ça a fontionner.
    Code:


    gam=(double*)malloc(n*sizeof(double)*10);

    Merci d'avoir cherché!
    ++

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Mau,
    Citation Envoyé par bob_warrior89
    C'est bon j'ai trouvé, c'est la mémoire alloué par le malloc qui n'était pas suffisante, et sans trop savoir pourquoi j'ai rajouté un facteur dix et ça a fontionner.
    Code:


    gam=(double*)malloc(n*sizeof(double)*10);

    Merci d'avoir cherché!
    ++
    à propos du malloc, où est le free ?

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par bob_warrior89
    C'est bon j'ai trouvé, c'est la mémoire alloué par le malloc qui n'était pas suffisante, et sans trop savoir pourquoi j'ai rajouté un facteur dix et ça a fontionner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	gam=(double*)malloc(n*sizeof(double)*10);
    Programmation au hasard = comportement indéfini. Tu n'as rien résolu du tout.

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    En plus de tout ce qu'on a dit au dessus, je signale que en C les tableaux commencent à 0...

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	for (j=2;j<=n;j++) {
    		gam[j]=c[j-1]/bet;
    		bet=b[j]-a[j]*gam[j];
    		if (bet == 0.0)	printf("Error 2 in tridag");
    		u[j]=(r[j]-a[j]*u[j-1])/bet;
    	}
    	for (j=(n-1);j>=1;j--)
    Est FAUX et entraîne un dépassement de mémoire (il n'y a pas de gam[n], ni vraisemblement des autres tableaux... ). Et en plus ne prend pas en compte le premier point...

    tableau[1] réfère au deuxième élément...

  10. #10
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Par défaut
    Désolé, mais je ne sais pas se qu'est un free.
    Ensuite, pour tout se qui est du malloc ou du reste, en fait mon prof m'a juste donné la fonction et il m'a dit de l'utiliser sans expliquer son fonctionnement.
    Donc je ne savais pas trop si je devait la modifier ou pas.
    Mais du coup, est-ce que les résultat que j'obtient sont éronés?

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par bob_warrior89
    Désolé, mais je ne sais pas se qu'est un free.
    Ensuite, pour tout se qui est du malloc ou du reste, en fait mon prof m'a juste donné la fonction et il m'a dit de l'utiliser sans expliquer son fonctionnement.
    Donc je ne savais pas trop si je devait la modifier ou pas.
    Mais du coup, est-ce que les résultat que j'obtient sont éronés?
    J'ai quelques doutes sur les qualités pédagogiques de l'enseignement que tu reçois...

    En principe, tu ne dois pas écrire une ligne de code que tu ne maitrises pas parfaitement. Pour la maitriser, il n'y a pas de secrets :
    • Explications du prof
    • Cours, livre de référence
    • Exercices personnels sur le sujet (et uniquement celui-ci, en utilisant éventuellement d'autres connaissances maitrisées).

    C'est mon point de vue de formateur en informatique...

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par bob_warrior89
    ...Mais du coup, est-ce que les résultat que j'obtient sont éronés?
    OUI à cause de toutes les remarques ci-dessus...

    Et re-OUI encore une fois à cause des indices des tableaux..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème écriture dans un fichier txt
    Par reperret dans le forum VB.NET
    Réponses: 7
    Dernier message: 26/03/2013, 10h26
  2. problèmes écriture dans un fichier
    Par DJEcalcul dans le forum Fortran
    Réponses: 3
    Dernier message: 26/10/2009, 12h06
  3. Problème écriture dans un fichier temporaire
    Par scary dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 02/07/2009, 02h05
  4. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 13h15
  5. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 02h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo