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 :

utilisation de fopen qui plante, ou?? pourquoi???


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut utilisation de fopen qui plante, ou?? pourquoi???
    Bonjour,

    Dans mon projet j'ouvre une image et la parcours en sous bloc, au total il y en a 256.

    Pour chaque sous bloc je souhaite construire un histogramme des gradients en faisant une sortie fichier (Excel) afin de pouvoir visualiser les courbes et y appliquer des traitements typique à Excel.

    Malheureusement mon fopen plante, j'ai testé 2 solutions:
    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
    			for(j=0; j<block; j++) // Parse blocks
    			{
    			  for(i=0; i<block; i++)
    			  {
                                 ...
    				FILE *pp;
    				char *nomgrad = "histgrad.dat";
    				pp = fopen(nomgrad, "a+t");
    //				remove("histgrad.dat");
    				for(k=0;k<512;k++)
    					fprintf(pp, "%d\t", histogram_grad[k]);
    				fprintf(pp, "\r");
    				fclose(pp);
     
    }
    }
    et
    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
     
    remove("histgrad.dat");
    FILE *pp;
    char *nomgrad = "histgrad.dat";
    pp = fopen(nomgrad, "a+t");
    			for(j=0; j<block; j++) // Parse blocks
    			{
    			  for(i=0; i<block; i++)
    			  {
                                 ...
    				for(k=0;k<512;k++)
    					fprintf(pp, "%d\t", histogram_grad[k]);
    				fprintf(pp, "\r");
     
                                }
                              }
    fclose(pp);
    Mais ni l'une ni l'autre des solutions ne fonctionnent, j'ai une erreur Access violation NTDLL.DLL

    quelqu'un sait pourquoi??

  2. #2
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Une petite question: le plantage est -il sur fopen ou sur fprintf?
    Tu ne testes pas le code retour de fopen(), si il te renvoie NULL, fprintf() va se planter en access violation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ((pp = fopen(nomgrad, "a+t"))==NULL){
       fprintf(stderr, "erreur fopen\n");
       /* le traitement d'erreur approprié à ton problème*/
    }
    Une autre question: je ne connais pas le flag t pour fopen(). Que signifie-t'il?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    Le prog plante sur le fopen, et c'est vrai je ne le test pas.

    Mais mon objectif est de récupèrer TOUT les points donc ça marche entièrement ou ça marche pas, alors si il arrive pas a faire son fopen je considère que ça marche pas.

    pour le t, ça signifie text mode: http://www.cplusplus.com/ref/cstdio/fopen.html
    je t'avoue que je l'ai utilisé parce que dans l'exemple c'est ce qu'ils ont fait...

  4. #4
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Essaie quand même de tester le code retour, c'est plus propre et ça aide à debugger
    Si tu as une erreur, tu sors proprement.
    Merci pour l'info sur le t.

  5. #5
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par gronaze
    Bonjour,

    Dans mon projet j'ouvre une image et la parcours en sous bloc, au total il y en a 256.

    Pour chaque sous bloc je souhaite construire un histogramme des gradients en faisant une sortie fichier (Excel) afin de pouvoir visualiser les courbes et y appliquer des traitements typique à Excel.

    Malheureusement mon fopen plante, j'ai testé 2 solutions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    			for(j=0; j<block; j++) // Parse blocks
    			{
    			  for(i=0; i<block; i++)
    			  {
                                 ...
    				FILE *pp;
    				char *nomgrad = "histgrad.dat";
    				pp = fopen(nomgrad, "a+t");
    t est inconnu au bataillon pour le mode d'ouverture de fichier (en C standard en tout cas), c'est "a+", append en mise à jour. C'est à dire en gros que tu te places à la fin du fichier et tu peux effectuer dessus des opérations d'écriture.

    Il faut tester si l'ouverture a bien réussi et si possible avoir initialisé pp avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FILE *pp = NULL;
    char *nomgrad = "histgrad.dat";
    pp = fopen(nomgrad, "a+");
    if(!pp) {
       fprintf(stderr,"Erreur ouverture fichier %s\n", nomgrad);
       exit(EXIT_FAILURE);
    }
    Si tu n'arrives pas à ouvrir le fichier, c'est qu'il y a de fortes chances que le chemin ou le nom de celui-ci ne soit pas bon. Ceci est valable pour tes 2 solutions. Sinon, le fclose est bien là, donc à priori, le souci "d'access violation", autrement dis, j'accède à de la mémoire où j'ai pas le droit, cela peut venir d'histogram_grad (comment est-il déclaré/défini) ou d'ailleurs.


    Citation Envoyé par gronaze
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //				remove("histgrad.dat");
    Tudieu !! heureusement que c'est commenté, tu peux virer la ligne.

    Sinon, même topo pour ta seconde solution.

    A+

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    Euuh... j'ai essayé les modifications que tu m'a donné Foobar1329, mais de la mçeme manière le programme plante....grrr

    je me dit que le problème doit peut être venir d'autre chose, donc je regarde si il y a pas un truc anormal.

    Pour la déclaration du tableau histogram_grad elle est faite avant la double boucle et au début de la boucle sur j toutes les valeurs de histogram_grad sont initialisées à zéro.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    au fait
    Tudieu !! heureusement que c'est commenté, tu peux virer la ligne.
    pourquoi tu dis ça?? je l'utilise dans pas mal d'endroit sans soucis, est ce mal?

  8. #8
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    1/ J'insiste... Que te renvoie fopen()?

    2/ En plus, si tu programmes en C, ce n,'est pas propre de redéclarer pp et nomgrad à chaque tour de boucle. Sors les déclarations des boucles.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    a la première passe le fopen me renvoit quelque chose qui a l'air d'être une structure de fichier, et à la seconde passe j'ai mon erreur NTDLL access Violation qui sort (dans le cadre du débuggage pas à pas)

    et pour les déclarations de pp et nomgrad je suis en c++ donc a priori c'est sans importance, et même plutôt mieux au niveau de la gestion de la memoire si je ne m'abuse?!

    je vois pas trop d'où ça pourrait venir....

  10. #10
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par gronaze
    Euuh... j'ai essayé les modifications que tu m'a donné Foobar1329, mais de la mçeme manière le programme plante....grrr

    je me dit que le problème doit peut être venir d'autre chose, donc je regarde si il y a pas un truc anormal.

    Pour la déclaration du tableau histogram_grad elle est faite avant la double boucle et au début de la boucle sur j toutes les valeurs de histogram_grad sont initialisées à zéro.
    Justement, comment est déclaré et défini histogram_grad ? Il ne doit pas y avoir plus de 512 éléments, de type int à ce que l'on peut deviner. J'escompte bien que histogram_grad soit déclaré, défini, et même initialisé comme suit :

    int histogram_grad[512] = { 0 };

    A+

  11. #11
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par gronaze
    au fait


    pourquoi tu dis ça?? je l'utilise dans pas mal d'endroit sans soucis, est ce mal?
    Ah ben dans ta première solution, là où il est situé, oui, ç'est mal. remove() ne doit être appliqué que sur un flux fermé (sinon, c'est dépendant de l'implémentation, mais je ne vois pas ce que cela apporte...). Or, tu faisais ton remove() après le fopen() !! Celui -ci aurait dû être avant le fopen() et même avant la double boucle.

    A+

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    bon je vous met mon 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    		short histogram_grad[512]; // Spatial gradient intensity
    		short histo[256]; // Spatial gradient intensity
     
    remove("histgrad.dat");
    remove("histo.dat");
     
         ...
     
    			for(j=0; j<block; j++) // Parse blocks
    			{
    			  for(i=0; i<block; i++)
    			  {
     
    				...
     
    				// Histogram initialization 
    				for(k=0; k<256; k++)
    					histo[k] = 0;
     
    				// Histogram_grad initialization 
    				for(k=0; k<512; k++)
    					histogram_grad[k] = 0;
     
     
    				ptr_in = in + j*h4*width+i*w4;
    				ptr_out = out + j*h4*width+i*w4;
     
    				for(k=0; k<h4; k++) // Parse pixels within a block
    				{
    					for(short l=0; l<w4; l++)
    					{
    						if((i*w4+l < width) && (j*h4+k < height))
    						  {						
    								short pp1r = *(ptr_in+1); // Pixel + 1 row
    								  short pp1l = *(ptr_in+width); // Pixel + 1 line
    								  short gradient_x = (short) fabs(pp1r - *(ptr_in));
    								  short gradient_y = (short) fabs(pp1l - *(ptr_in));
    								  short gradient = gradient_x + gradient_y;
     
    								  histogram_grad[gradient]++;
     
    								  *ptr_out++ = gradient;
    								  sum_gradient += gradient;
    								  histo[*(ptr_in)]++;
    								  *(pict2++) = *(ptr_in++);
    								  end = false;
    						  }
    							else
    							{
    								end = true;
    								break;
    							}
     
    					}
     
    					if(!end)
    					{
    						ptr_in += offset;
    						ptr_out += offset;
    					}
    				} // End block parsing
     
     
    //Debug only
    for(k=0;k<512;k++)
    	printf("%3d  ",  histogram_grad[k]);
     
    				FILE *pp = NULL;
    				char *nomgrad = "histgrad.dat";
    				pp = fopen(nomgrad, "a+");
    				if(!pp) {
    					   fprintf(stderr,"Erreur ouverture fichier %s\n", nomgrad);
    					   exit(EXIT_FAILURE);
    				}
    				for(k=0;k<512;k++)
    					fprintf(pp, "%d\t", histogram_grad[k]);
    				fprintf(pp, "\r");
    				fclose(pp);
     
                                     ....
     
    			} 
    		}// End Picture parsing

  13. #13
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Je persiste à penser que c'est ta redéfintion de variable qui pose un problème.
    J'ai testé ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
     
    int main(void){
     
    FILE *pp = NULL;
    char *nomgrad = "histgrad.dat";
    pp = fopen(nomgrad, "a+");
     
    FILE *pp = NULL;
    char *nomgrad = "histgrad.dat";
    pp = fopen(nomgrad, "a+");
    return 0;
    }
    J'ai obtenu l'erreur de compilation (sous VC) suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    C:\C\essai10\essai10.cpp(9) : error C2374: 'pp' : redefinition; multiple initialization
    C:\C\essai10\essai10.cpp(10) : error C2374: 'nomgrad' : redefinition; multiple initialization

  14. #14
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Alors que je n'ai pas d'erreur en compilant avec une boucle et .... miracle un crash au 2ème fopen()...

  15. #15
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par gronaze
    a la première passe le fopen me renvoit quelque chose qui a l'air d'être une structure de fichier, et à la seconde passe j'ai mon erreur NTDLL access Violation qui sort (dans le cadre du débuggage pas à pas)
    Et donc, l'access violation est-elle bien sur le fopen() ? Tu dois bien le savoir si tu va en pas à pas.

    Citation Envoyé par gronaze
    et pour les déclarations de pp et nomgrad je suis en c++ donc a priori c'est sans importance, et même plutôt mieux au niveau de la gestion de la memoire si je ne m'abuse?!
    Hopala, rien à voir avec le C++ ici. Déclarer et définir une variable locale (automatique ou dynamique) à chaque tour de boucle comme c'est le cas ici n'est pas bon ni en C ni en C++ où la "pile" va beaucoup travailler pour les variables auto de même que des allocations/libérations de mémoire à chaque tour pour des variables de type pointeur vont bouffer du temps inutilement.

    A+

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    j'ai regardé de manière plus approfondie, et mon fichier existe bien après le premier fclose(pp), j'ai toute une ligne de valeur dans "histgrad.dat" (c'est bien ce que je souhaitais)

    Et au passage suivant devant le fopen j'ai pp qui vaut mon adresse NULL car le programme plante avec NTDLL pourtant aucune de mes valeurs de histogram_grad est indéfinie ou autre choses, elles sont toutes correctes.

    ??

  17. #17
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Lis les 3 posts précédents

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    Mon erreur se trouve bien sur le fopen, et même dans le fopen, je peux vous donner la ligne en assembleur, moi j'y connait pas grand chose...

    j'ignorais pour la pile et les temps de chargement

  19. #19
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Essaie de tester en sortant les déclarations de pp et surtout de nomgrad de ta boucle, au moins ça éliminera un problème possible

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    pardon Joellel je n'avais pas vu que tu avais répondu.
    Je corrige ça et je test.

    bon an faite je vais partir déjeuner avant je vous tiens au courant après le déjeuner mais merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. formatage qui plante pourquoi?
    Par gaston11 dans le forum Débuter
    Réponses: 3
    Dernier message: 06/01/2013, 22h27
  2. Pourquoi mon blog utilise index.php qui ralentit tout ?
    Par -aAdrien dans le forum Général Conception Web
    Réponses: 14
    Dernier message: 20/12/2011, 07h58
  3. Programme qui plante, pourquoi ?
    Par ganjarasta dans le forum Réseau
    Réponses: 5
    Dernier message: 24/11/2011, 23h07
  4. Test d'une demo javafx qui plante, Pourquoi ?
    Par patmaba dans le forum JavaFX
    Réponses: 5
    Dernier message: 16/12/2008, 18h55
  5. [debutant] - Simple script qui plante IE.. comprend pas pourquoi..
    Par ShinJava dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/08/2006, 23h06

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