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 :

données non traités, matrice


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut données non traités, matrice
    Bonjour,
    J'ai un petit probleme avec un bout de code car il me traite seulement 39401 données sur 40000 ... peut-etre a cause de l'allocation mémoire mais la je seche.

    J'ai une matrice de unsigned char * car ce sont des données hexa que je manipule.
    En premier lieu je lis dans 2 fichiers 2*40000 valeurs correspondant a des coordonnées que je vais réutiliser pour la matrice. Ces données se trouvent dans tabX, tabY (de ce coté pas de problemes).
    Ensuite je lis dans un 3eme fichier une valeur que je devrais placer au coordonnées correspondantes dans la matrice. (C'est la que ça coince)

    ecartX, ecartY correspondent respectivement à la différence entre la plus grande coordonnées et la plus petite de X et de Y.

    Pour raccourcir, ci dessous il ya l'allocation de la matrice, et ensuite la boucle qui bug.

    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
     
    matrice=(unsigned char ** *)malloc(ecartX * sizeof(unsigned char * *));
    	if (matrice == NULL)
    	{
    		printf("\nEchec lors de l'allocation memoire!!!\n");
    		exit(2);
    	}
     
    	for (i=0;i<ecartX;i++)
    	{
    		matrice[i] = (unsigned char * *)malloc(ecartY * sizeof(unsigned char *));
    		if (matrice[i] == NULL)
    		{
    			for (j=0;j<i;j++)
    			{
    				free(matrice[j]);
    				printf("\n Echec lors de l'allocation memoire!!!\n");
    				exit(2);
    			}
    		}
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    tmpVal=(unsigned char *)malloc(NB_OCTETS_LUS * sizeof(unsigned char));
    	for(i=0;i<nbElement && !feof(fichVal);i++)
    	{
    		fread(tmpVal,NB_OCTETS_LUS,1,fichVal);
    		printf("i :%x\n",i);
    		matrice[*(tabX+i)][*(tabY+i)]=tmpVal;
    	}
    J'espère que mes explications ont été assez claires, pour que vous puissiez m'aider.
    Linux because rebooting is just for adding medias

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par psylox
    J'ai une matrice de unsigned char * car ce sont des données hexa que je manipule.
    Je ne comprends pas pourquoi tu utilises des unsigned char* et pas des unsigned char...

    Pour raccourcir, ci dessous il ya l'allocation de la matrice,
    Pas de cast après le retour de malloc et tu peux utiliser ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    matrice = malloc(ecartX * sizeof(*matrice));
    ...
    matrice[i] = malloc(ecartY * sizeof(*matrice[i]));
    - Préférer simplement exit(EXIT_FAILURE) à ton exit(2)...


    et ensuite la boucle qui bug.
    - Pas de test sur la valeur de tmpVal après le malloc.
    - Pas de test après le retour de fread
    - feof ne fait pas ce que tu penses, on utilise le retour de fread pour savoir s'il y a un problème.
    - Que vaut NB_OCTETS_LUS ?
    - Es-tu sûr de la taille des fichiers ?
    - Es-tu sûr du contenu des fichiers, tes tableaux tabX et tabY sont-ils vraiment bien initialisés ?

    Jc

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut
    Citation Envoyé par fearyourself
    Je ne comprends pas pourquoi tu utilises des unsigned char* et pas des unsigned char...
    Car ce n'est pas juste un caractère que je ve mais 2 donc ça forme une chaine.

    Citation Envoyé par fearyourself
    Pas de cast après le retour de malloc et tu peux utiliser ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    matrice = malloc(ecartX * sizeof(*matrice));
    ...
    matrice[i] = malloc(ecartY * sizeof(*matrice[i]));
    Ah, désolé je pensais qu'il était nécessaire vu que c'est un void * qui est renvoyé. merci
    Citation Envoyé par fearyourself
    - Préférer simplement exit(EXIT_FAILURE) à ton exit(2)...
    Merci connaissais pas (en meme temps, il nous apprenne rien a l'école )

    Citation Envoyé par fearyourself
    - Pas de test sur la valeur de tmpVal après le malloc.
    - Pas de test après le retour de fread
    - feof ne fait pas ce que tu penses, on utilise le retour de fread pour savoir s'il y a un problème.
    - Que vaut NB_OCTETS_LUS ?
    - Es-tu sûr de la taille des fichiers ?
    - Es-tu sûr du contenu des fichiers, tes tableaux tabX et tabY sont-ils vraiment bien initialisés ?

    Jc
    Je suis sur de tout ce qu'il y a dans les fichiers, sur le nombre d'éléments etc.. pour les tableaux, ils sont bien rempli (au moins j'ai réussi à faire ça
    NB_OCTETS_LUS = 2
    ok je vais rajouter tous les tests dont tu parles.



    Par contre pour mon probleme principal j'ai cerné un peu plus d'ou ça venait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    matrice[*(tabX+i)][*(tabY+i)]=tmpVal;
    C'est le *(tabX+i), qui pose probleme, donc au moment du bug il vaut 78 qui est la valeur max qu'il puisse prendre.

    Lorsque je fais le 1er malloc sur matrice avec ecartX, celui ci vaut 78 aussi.
    Je me suis dis que ça venait de la donc j'ai essayé de mettre ecartX+1 lors du malloc, mais sans succès ...

    Peut-etre cela est-il plus claire pour toi en tout cas moi je nage

    Merci
    Linux because rebooting is just for adding medias

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    tmpVal=(unsigned char *)malloc(NB_OCTETS_LUS * sizeof(unsigned char));
    	for(i=0;i<nbElement && !feof(fichVal);i++)
    	{
    		fread(tmpVal,NB_OCTETS_LUS,1,fichVal);
    		printf("i :%x\n",i);
    		matrice[*(tabX+i)][*(tabY+i)]=tmpVal;
    	}
    Ne peut marcher : tu mets dans matrice[...][...] toujours la même valeur, à savoir l'adresse tmpval. (Le tableau d'adresse tmpval contient la dernière valeur lue par fread )
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut
    Citation Envoyé par diogene
    Ne peut marcher : tu mets dans matrice[...][...] toujours la même valeur, à savoir l'adresse tmpval. (Le tableau d'adresse tmpval contient la dernière valeur lue par fread )
    Si j'ai bien compris je mets l'adresse de tmpVal et pas ce qu'il contient à savoir 2octets ?

    Que devrais-je mettre matrice[][]=*tmpVal ?? parce que ça me fais un warning
    Linux because rebooting is just for adding medias

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Que devrais-je mettre matrice[][]=*tmpVal ?? parce que ça me fais un warning
    non parce que *tmpval est unsigned char et que ta matrice est conçue pour contenir des unsigned char *
    Si on suit ta logique depuis le début, tu dois allouer par malloc un tableau de NB_OCTETS_LUS unsigned char, copier explicitement le contenu de tmpVal dans ce tableau et mettre son adresse dans matrice[...][...]
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut
    Ok

    Mais je peux toujours pas accéder à l'élément de la matrice lorsque *(tabX+i) vaut 78.
    Quoique j'y mettes dedans, ça ne change pas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    matrice=malloc(ecartX * sizeof(unsigned char * *));
    Lorsque je fais ça ecartX vaut 78, donc j'ai essayé avec ecartX+1 mais ça ne marche pas non plus, je ne peux toujours pas accéder à l'élément [78][YY] ...

    Merci kan meme
    Linux because rebooting is just for adding medias

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    matrice=(unsigned char ** *)malloc(ecartX * sizeof(unsigned char * *));
    ....
    	for (i=0;i<ecartX;i++)
    	{
    		matrice[i] = (unsigned char * *)malloc(ecartY * sizeof(unsigned char *));
    tu n'as pas oublié de changer aussi la borne du for en ecartx+1 ?
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut
    Oui, après avoir passé toute l'apremidi hier a regarder mon code dans tous les sens m'en suis rendu compte a 17:00 (fin de la journée).

    Merci beaucoup maintenant je vais me pencher sur ce que tu me disais comme quoi je n'écrivais pas ce qu'il fallai.


    Citation Envoyé par diogene
    non parce que *tmpval est unsigned char et que ta matrice est conçue pour contenir des unsigned char *
    En faites tmpval est lui aussi un unsigned char *
    Qu'est-ce que tu en penses? (peut-etre que je me trompe de solution)
    Si je mets juste unsigned char tmpVal , il veut pas pasque c pa un bon argument pour fread et fwrite..

    Pour info :
    Je dois manipuler des données en 16bits donc 2octets, et donc plus que juste un caractère.(d'ou mon choix pour tmpVal)
    Dans chaque case de la matrice je dois mettre une de ces données.

    Merci
    Linux because rebooting is just for adding medias

  10. #10
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    peut être peut tu faire qq chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef unsigned char Data[NB_OCTETS_LUS] ;
    ....
    Data ** matrice= malloc( (ecartX+1) * sizeof(*matrice));
    ....
    matrice[i] = malloc(ecartY * sizeof(**matrice)); // ecartY+1 ????
    ....
    Data tmpVal;
    fread(&tmpVal,sizeof(Data),1,fichVal);
    memcpy(matrice[*(tabX+i)][*(tabY+i)],tmpVal, sizeof(Data));
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  11. #11
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut
    Ok ça marche

    T'es trop fort

    Merci
    Linux because rebooting is just for adding medias

  12. #12
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut
    Citation Envoyé par diogene
    peut être peut tu faire qq chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef unsigned char Data[NB_OCTETS_LUS] ;
    ....
    Data ** matrice= malloc( (ecartX+1) * sizeof(*matrice));
    ....
    matrice[i] = malloc(ecartY * sizeof(**matrice)); // ecartY+1 ????
    ....
    Data tmpVal;
    fread(&tmpVal,sizeof(Data),1,fichVal);
    memcpy(matrice[*(tabX+i)][*(tabY+i)],tmpVal, sizeof(Data));

    je vais peut-etre dire une connerie mais bon je préfère etre sur ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    matrice[i] = malloc(ecartY * sizeof(**matrice));
    ne serai-ce pas plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    matrice[i] = malloc(ecartY * sizeof(matrice));
    ??
    Linux because rebooting is just for adding medias

  13. #13
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Non, mais si tu préfères, tu peux mettre sizeof(Data)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 376
    Points : 41 544
    Points
    41 544
    Par défaut
    Encore que je le déconseille, car c'est moins souple que sizeof(**matrice).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut
    ok merci
    Linux because rebooting is just for adding medias

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

Discussions similaires

  1. Format de base de données non reconnu
    Par Consultant dans le forum Access
    Réponses: 4
    Dernier message: 05/10/2005, 11h32
  2. Comment sélectionner les données non dupliquées
    Par Dnx dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/10/2005, 11h43
  3. Réponses: 4
    Dernier message: 01/07/2005, 16h20
  4. [CR] Impression de données non issues d'une base de données
    Par jeroe dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 04/04/2005, 09h09
  5. Réponses: 4
    Dernier message: 15/06/2004, 17h36

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