Probleme d'acces fichier avec pointeur

explosiondream Messages postés 49 Date d'inscription   Statut Membre Dernière intervention   -  
chico200987 Messages postés 791 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour a tous !

Voila, je dois créer un programme qui me fait des calculs sur une certaine période de temps et me stocke les résultats sur un même fichier.
Le problème que j'ai , c'est que j'utilise de nombreuse boucles et qu'au bout d'un certain moment (ce qui correspond à 637 lignes du fichier texte utilisé) j'ai un problème d'accès au document !
Est ce que quelqu'un aurait une idée de comment réparer ça ?

Merci d'avance =D
A voir également:

3 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,

Probablement qu'il y a une erreur dans le code...
Si tu pouvais donc le poster, ça serait plus simple.
Merci d'utiliser la balise "code" située à droite du bouton "souligné" et sélectionne "C" pour nous faciliter la lecture.

Cdlt,
1
explosiondream Messages postés 49 Date d'inscription   Statut Membre Dernière intervention  
 
okay je te le poste, mais sache qu'il est ultra long ...
0
explosiondream Messages postés 49 Date d'inscription   Statut Membre Dernière intervention  
 
je n'ai mis que la partie interessante !
0
explosiondream Messages postés 49 Date d'inscription   Statut Membre Dernière intervention  
 
void calcul_semaine(int M, float lon, float lat)
{
    printf("A present, nous allons vous demander de donner les coordonnees du lieu ou votre simulation doit etre faite.\n Pour cela, voici un petit rappel:\n\t La LATITUDE, notee lat, donne un renseignement sur la position Nord/Sud par rapport a l'equateur. Elle est positive vers le Nord,et negative vers le Sud.\n\t La LONGITUDE, notee lon, est un renseignement sur la position Est/Ouest par rapport au meridien de Greenwich. Elle est positive vers l'Ouest et negative vers l'Est.\n\n");
    printf("Veuillez nous donner la LATITUDE (en degre):\t");
    Color(12,0);scanf("%f", &lat);Color(15,0);
    printf("\n");
    printf("Veuillez nous donner la LONGITUDE (en degre):\t");
    Color(12,0);scanf("%f", &lon);Color(15,0);
    printf("\n");
   // printf("Nous avons choisi un pas de 30 minutes, soit 0.5h pour faire cette simulation\n");
    int v; //declaration du jour pour l'affichage dans le fichier texte
    for (v=1;v<=7;v=v+1)
    {
        float H,h,m;
        for(H=0;H<=23;H=H+1)
        {
            for (m=0;m<=59;m=m+15)
            {
                h=H+(m/60);
                float J;
                float TU; // Temps Universel
                double Pi=3.141592653576; // Valeur de PI ......
                double dec; // definition declinaison
                double cor; //facteur de correction
                double tsv; // definition temps solaire vrai
                double ah; // definition angle solaire
                double HS; // Definition angle de hauteur solaire
                double Gc; // Definition de l'irradiation solaire globale
                TU=h-(lon/15);
                float J2;
                if(J>=1 && J<=81)
                    {
                        J2 = 365-J;
                    }
                else J2=J;
                cor=1+0.034*cos((2*Pi/365.25)*(J2-3)); //facteur de correction [Sans unite]
                dec= asin(0.3978*sin(((2*Pi)/365.25)*(J2-81-2*sin(((2*Pi)/365.25)*(J2-2)))));// declinaison [En Radian]
                dec=-dec;
                if(dec/(2*Pi) < 1) dec = dec;
                else dec = dec - 2*Pi*floor(dec/(2*Pi));
                tsv = TU + lon*(Pi/180)*(12/Pi)+(1/60)*(57.3)*(9.9*sin(1.972*(2*Pi/360)*J2+200)-7.7*sin((2*Pi/365.25)*J2-2)); // temps solaire Vrai
                if((tsv/24) < 1 ) {  tsv = tsv;}
                else  tsv=(tsv - 24*floor(tsv/24)) ;
                ah=tsv*(Pi/12)+Pi;// Angle de Hauteur solaire en RADIAN et modulo 2Pi;
                if(ah/(2*Pi) < 1) {ah = ah;}
                else ah=(ah - 2*Pi*floor(ah/(2*Pi)) );
                HS=(Pi/2)-acos(sin(lat*(Pi/180))*sin(dec)+cos(lat*(Pi/180))*cos(dec)*cos(ah)); // Hauteur Solaire
                double TL=4.35;
                double X = sin(HS); double Y=(36+TL)/33;
                Gc = cor*(1300-TL)*pow(X,Y);
                if (Gc > 0.01)
                {
                    Gc = Gc;
                }
                else
                {
                    Gc = 0;
                }
                FILE*document;
                document = fopen("C:/Users/marie/Desktop/semaine.txt","a");
                if (document != NULL)
                {
                    fprintf(document,"%d \t",v);
                    fprintf(document,"%.0lf:%.0lf \t",H,m);
                    fprintf(document,"%.3lf\n",Gc);
                }
                else
                {
                    printf("Desole, il y a eu une erreur d'acces au document");
                    exit(-1);
                }
            }
        }
    }

    printf("Mission Accomplie, les donnees sont sur le fichier SEMAINE !!!");
}
0
explosiondream Messages postés 49 Date d'inscription   Statut Membre Dernière intervention  
 
Donc sur ce programme, en fait, le "fprintf" s'exécute bien au début, mais au bout des 637 lignes, j'ai le message d'erreur "Desole, il y a eu une erreur d'acces au fichier" Je ne comprend pas comment c'est possible ... Une idée ?
0
chico200987 Messages postés 791 Date d'inscription   Statut Membre Dernière intervention   143
 
Salut,

Tu ne fais jamais de fclose de ton fichier avant de fopen à nouveau ?
0
explosiondream Messages postés 49 Date d'inscription   Statut Membre Dernière intervention  
 
A quel moment ? Enfin, dans ces lignes-la ? ou dans mes autres fonctions void ?
0
chico200987 Messages postés 791 Date d'inscription   Statut Membre Dernière intervention   143
 

FILE*document;
document = fopen("C:/Users/marie/Desktop/semaine.txt","a");
if (document != NULL)
{
fprintf(document,"%d \t",v);
fprintf(document,"%.0lf:%.0lf \t",H,m);
fprintf(document,"%.3lf\n",Gc);
}
else
{
printf("Desole, il y a eu une erreur d'acces au document");
exit(-1);
}
//ici par exemple
fclose (document );
0
explosiondream Messages postés 49 Date d'inscription   Statut Membre Dernière intervention  
 
je vais essayer !
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
J'ai pas tout lu, mais j'ai déjà plein de remarques.

scanf("%f", &lat);
Tu souhaites modifier la variable qui est en paramètre. Le problème est que vu que le paramètre n'est qu'une copie, tu ne bénéficieras pas de la nouvelle valeur dans la fonction appelante. Il faut passer par un pointeur :
void calcul_semaine(double *lat) {
     scanf("%lf", lat);
}

J'ai mis des double, car c'est mieux que les float. Sauf cas particulier, tu peux oublier les float.
Même remarque pour les autres variables.

double Pi=3.141592653576;
Pourquoi redéfinir Pi alors que la constante existe déjà dans le header math.h ?

cor=1+0.034*cos((2*Pi/365.25...
Pourquoi multiplier par 2PI/365.25 ??? Le facteur est 2PI/360.

tsv = TU + lon*(Pi/180)*(12/Pi)+(1/60)*...
Attention 1/60 fait 0 (division de deux entiers). Utilise plutôt (double)1/60 ou 1.0/60

f((tsv/24) < 1 ) { tsv = tsv;}
tsv=tsv ??? Que souhaites-tu faire ? Cette instruction ne fait rien du tout fonctionnellement. Même remarque pour d'autres variables.

FILE*document;
document = fopen("C:/Users/marie/Desktop/semaine.txt","a");

Tu mets ce code dans une boucle for. Autrement dit, à chaque itération, tu rouvres le document et donc relis depuis le début. Est-ce normal ? Si oui un rewind suffirait. document=fopen(...) n'est à appeler qu'une seule foisd. Et il ne faut pas oublier fclose(...) pour fermer le fichier.

Ton code est vraiment "touffu". Il ne faut pas hésiter à utiliser des fonctions pour simplifier la lecture du code. Ce n'est pas un luxe.

Note : merci d'avoir utilisé la balise "code", mais si tu pouvais en plus sélectionner "C" dans la liste déroulante, ça serait top :-).

Cdlt,
0
explosiondream Messages postés 49 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai pris tes remarques en compte ... Mais juste une chose, les formules ne sont pas de moi, je ne vais pas les modifier ! Si j'ai mis Pi, c'est parce que sur l'ordinateur de l'école ou je suis, la bibliothèque math.h n'est pas installée, ni fonctionnelle, ni quoi que ce soit. Pour les calculs, le truc, c'est que les résultats sont bons ! La je t'ai mis le calcul_semaine, car c'est a partir de lui que commence mes problemes, mais j'ai aussi un calcul instantanné, sur un jour, mois et année.. L'instantannée et le jour fonctionne bien, le probleme est que au bout d'un moment le fichier devient introuvable, et c'est ca que je ne comprend pas
0
explosiondream Messages postés 49 Date d'inscription   Statut Membre Dernière intervention  
 
f((tsv/24) < 1 ) { tsv = tsv;} 
En fait il y a un else, apres, donc ce n'est pas si inutile ^^
0
explosiondream Messages postés 49 Date d'inscription   Statut Membre Dernière intervention  
 
et si tu trouves ça touffu, imagines toi que, en tout, j'ai 1800 lignes de code ...
0
chico200987 Messages postés 791 Date d'inscription   Statut Membre Dernière intervention   143
 
Concernant la remarque du if,

au lieu de
if((tsv/24) < 1 ) {  tsv = tsv;}
                else  tsv=(tsv - 24*floor(tsv/24)) ;


tu devrais faire :

if((tsv/24) >= 1 ) tsv=(tsv - 24*floor(tsv/24));
0
explosiondream Messages postés 49 Date d'inscription   Statut Membre Dernière intervention  
 
oui, enfin, ca, je ne pense pas sincerement que ce soit l'objet de mon erreur, ni de ma demande
0