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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    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.

  2. #2
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    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 éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    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

  4. #4
    Expert confirmé
    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
    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 )

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    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

  6. #6
    Expert confirmé
    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
    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[...][...]

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    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

+ 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