Probleme d'acces fichier avec pointeur

Fermé
explosiondream Messages postés 49 Date d'inscription dimanche 12 janvier 2014 Statut Membre Dernière intervention 13 janvier 2014 - 12 janv. 2014 à 13:16
chico200987 Messages postés 791 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 30 juillet 2018 - 12 janv. 2014 à 17:40
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
12 janv. 2014 à 15:41
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 dimanche 12 janvier 2014 Statut Membre Dernière intervention 13 janvier 2014
12 janv. 2014 à 15:54
okay je te le poste, mais sache qu'il est ultra long ...
0
explosiondream Messages postés 49 Date d'inscription dimanche 12 janvier 2014 Statut Membre Dernière intervention 13 janvier 2014
12 janv. 2014 à 15:57
je n'ai mis que la partie interessante !
0
explosiondream Messages postés 49 Date d'inscription dimanche 12 janvier 2014 Statut Membre Dernière intervention 13 janvier 2014
Modifié par explosiondream le 12/01/2014 à 16:00
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 dimanche 12 janvier 2014 Statut Membre Dernière intervention 13 janvier 2014
12 janv. 2014 à 15:59
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 mardi 6 avril 2004 Statut Membre Dernière intervention 30 juillet 2018 143
12 janv. 2014 à 16:05
Salut,

Tu ne fais jamais de fclose de ton fichier avant de fopen à nouveau ?
0
explosiondream Messages postés 49 Date d'inscription dimanche 12 janvier 2014 Statut Membre Dernière intervention 13 janvier 2014
12 janv. 2014 à 16:07
A quel moment ? Enfin, dans ces lignes-la ? ou dans mes autres fonctions void ?
0
chico200987 Messages postés 791 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 30 juillet 2018 143
Modifié par chico200987 le 12/01/2014 à 16:09

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 dimanche 12 janvier 2014 Statut Membre Dernière intervention 13 janvier 2014
12 janv. 2014 à 16:18
je vais essayer !
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
12 janv. 2014 à 16:13
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 dimanche 12 janvier 2014 Statut Membre Dernière intervention 13 janvier 2014
12 janv. 2014 à 16:21
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 dimanche 12 janvier 2014 Statut Membre Dernière intervention 13 janvier 2014
12 janv. 2014 à 16:34
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 dimanche 12 janvier 2014 Statut Membre Dernière intervention 13 janvier 2014
12 janv. 2014 à 16:36
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 mardi 6 avril 2004 Statut Membre Dernière intervention 30 juillet 2018 143
12 janv. 2014 à 16:39
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 dimanche 12 janvier 2014 Statut Membre Dernière intervention 13 janvier 2014
12 janv. 2014 à 16:44
oui, enfin, ca, je ne pense pas sincerement que ce soit l'objet de mon erreur, ni de ma demande
0