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 :

Tableaux 2D type char : quelques problèmes


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut Tableaux 2D type char : quelques problèmes
    Bonjour,

    Suite à cette discussion, http://www.developpez.net/forums/d85...-regdeletekey/ , je dois allouer dynamiquement un tableau de type char à deux dimensions pour y stocker X chaînes de caractères.

    J'ai donc créé une fonction pour le faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    char **AllocateMemoryForBuffer(int lignes, int colonnes)
    {
      char **TabRes2d;
      int i;
     
      TabRes2d = malloc((lignes+1)*(sizeof(char)));
      for (i = 0; i < colonnes+1; i++)
        TabRes2d[i] = malloc((colonnes+1)*(sizeof(char)));
     
      printf("\nlignes = %d\n", lignes+1);
      printf("colonnes = %d\n\n", colonnes+1);
     
      return (TabRes2d);
    }
    Les 'lignes+1' et 'colonnes+1' répondent au besoin de mon programme : je dois augmenter de 1 'lignes' et de 1 'colonnes'.

    Déjà, j'aimerais savoir si mon allocation de tableau est correcte ou pas.

    Le problème survient lors du remplissage du tableau : j'arrive à remplir les 5, 6 premières lignes, puis ça plante sur la septième. L'errorlevel de mon programme est -1073741819.

    Le tableau 2D type char est défini dans une structure. J'alloue la mémoire comme ceci :

    ptr_registre->TabOfSubkeysToDelete = AllocateMemoryForBuffer(ptr_registre->NbrSuKeys, ptr_registre->MaxSubKeySize);
    La structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct      s_registre
    {
        ..............
        char **TabOfSubkeysToDelete;
    };
     
    struct      s_registre t_registre;
    struct      s_registre *ptr_registre;
    ptr_registre = &t_registre;
    J'envoie un pointeur vers cette structure à la fonction chargée de remplir ce tableau et voici le code de remplissage ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        while (a < strlen(path_key))
          {
            ptr_registre->TabOfSubkeysToDelete[count][a] = path_key[a];
            a++;
          }
        ptr_registre->TabOfSubkeysToDelete[count][a] = '\0';
    Et count est incrémenté de 1 à chaque fois, dès qu'on lit une autre clé.

    Le remplissage du tableau commence bien mais plante à ptr_registre->TabOfSubkeysToDelete[6]. Si je n'incrémente pas count, c'est la première ligne qui est remplie à chaque fois, et là le programme plante lors du douzième remplissage, même erreur.

    Ca fait bien 3h que je suis sur le problème, j'ai beau repartir à 0 niveau code, je retombe sur le même erreur : j'en déduis que je me suis bien planté quelque part.

    Merci par avance de votre aide pour m'aider à trouver.


  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Plutôt ça, en fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    char **AllocateMemoryForBuffer(int lignes, int colonnes)
    {
      char **TabRes2d;
      int i;
     
      TabRes2d = malloc((lignes+1)*(sizeof(char*)));
      for (i = 0; i < colonnes+1; i++)
        TabRes2d[i] = malloc((colonnes+1)*(sizeof(char)));
     
      printf("\nlignes = %d\n", lignes+1);
      printf("colonnes = %d\n\n", colonnes+1);
     
      return (TabRes2d);
    }
    Sinon, tu n'alloue pas un vecteur de char*, mais un vecteur de char... Qui est quatre fois plus petit en taille sur ta machine.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Re Mak Lak,

    Effectivement ça marche mieux.

    Maintenant ça bloque lors du remplissage de la dernière ligne du tableau. Même code d'erreur.

    Mais déjà ça ne bloque plus pendant, c'est déjà ça.

    Si tu as une idée sur le pourquoi du plantage lors du remplissage de la dernière ligne, je suis preneur.

    J'y suis presque

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Je viens de voir une erreur dans la fonction d'allocation, par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      for (i = 0; i < colonnes+1; i++)
    est invalide, il faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      for (i = 0; i < lignes+1; i++)
    à la place.

    Citation Envoyé par Merillym Voir le message
    Si tu as une idée sur le pourquoi du plantage lors du remplissage de la dernière ligne, je suis preneur.
    Si le problème persiste, c'est sûrement un problème d'indices base zéro / base 1, c'est le cas le plus fréquent quand ça plante sur le dernier élément. Essaie de tracer les valeurs prises par ta variable count, et compares les à la valeur initiale passée pour lignes à ta fonction d'allocation.

    Au fait, tu peux remplacer ton code de copie de chaîne suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        while (a < strlen(path_key))
          {
            ptr_registre->TabOfSubkeysToDelete[count][a] = path_key[a];
            a++;
          }
        ptr_registre->TabOfSubkeysToDelete[count][a] = '\0';
    par celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        strcpy(ptr_registre->TabOfSubkeysToDelete[count],path_key);
    Ce sera toujours ça de pris.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Re,

    Bon mystérieusement, plus de plantage du programme mais la dernière ligne du tableau n'est jamais remplie ( quand je la lis, il m'affiche n'importe quoi ), faut que je trouve pourquoi.

    Si le problème persiste, c'est sûrement un problème d'indices base zéro / base 1, c'est le cas le plus fréquent quand ça plante sur le dernier élément. Essaie de tracer les valeurs prises par ta variable count, et compares les à la valeur initiale passée pour lignes à ta fonction d'allocation.
    J'y ai pensé, je vais revérifier, ça me semblait bon, mais bon en même temps, ça fait tellement de fois que je repars de 0 que ça ne m'étonnerait pas que je fasse systématiquement les mêmes erreurs

    Merci d'avoir repéré les deux erreurs dans mon allocation, j'aurai pas trouvé avant des heures je pense. Je vais relire un peu de théorie sur ce genre d'allocation.

    Ce sera toujours ça de pris.
    Vu et modifié

    Je te tiens au courant quand j'ai trouvé ce dernier bug.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 140
    Points : 49
    Points
    49
    Par défaut
    Au fait, tu peux remplacer ton code de copie de chaîne suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        while (a < strlen(path_key))
          {
            ptr_registre->TabOfSubkeysToDelete[count][a] = path_key[a];
            a++;
          }
        ptr_registre->TabOfSubkeysToDelete[count][a] = '\0';
    par celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        strcpy(ptr_registre->TabOfSubkeysToDelete[count],path_key);
    Ce sera toujours ça de pris.
    Je viens de le faire et... ma dernière ligne se remplie bien...

    Le problème venait donc de ma boucle de copie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (a < strlen(path_key))
          {
            ptr_registre->TabOfSubkeysToDelete[count][a] = path_key[a];
            a++;
          }
        ptr_registre->TabOfSubkeysToDelete[count][a] = '\0';
    Je suis curieux de voir où est l'erreur, je vais chercher, théoriquement, il n'y a pas de raison que ce genre de boucle ne marche pas. Je vais vérifier les indices de la boucle.

    edit: Trouvé => il fallait réinitialiser a à 0 chaque fois... car c'est une fonction récursive. Et je viens de voir que j'avais juste déclaré a, mais pas initialisé à 0... donc a pouvait valoir n'importe quoi...

    Problème résolu.

    Un grand merci à toi Mak Lak !!!


  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Merillym Voir le message
    Problème résolu.

    Un grand merci à toi Mak Lak !!!
    De rien. Bonne continuation !

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

Discussions similaires

  1. [Migration BDE en ADO][SQLServer] Problème avec les types char
    Par pitango dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/03/2007, 17h17
  2. Quelques problèmes avec charAt
    Par Tazzz dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/11/2005, 14h05
  3. concaténer un type char à une chaine
    Par Fabs dans le forum C
    Réponses: 8
    Dernier message: 11/11/2005, 15h21
  4. Array subscript has type 'char'
    Par obelix dans le forum C
    Réponses: 11
    Dernier message: 31/10/2005, 18h21
  5. Quelques problèmes avec SQL SERVEUR (LIKE et caractères)
    Par poussinphp dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 21/09/2005, 09h43

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