Aider moi : Probléme d'allocation dynamique [Résolu]

Signaler
Messages postés
15
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
20 février 2007
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
Bonjour tout le monde
J'ai un prbleme qui me bloque ca fait un bout de temps. En fait, je veux declarer un tableau de chaine de caractéres et le remplire. Pour ce la j'utilise une boucle. Cepenadant toutes les cases du tableau ne contiennent que la derniere chaine entrées. Voila mon code.

  char     **colname = NULL; // Nom de chaque vraibles (xi ou Lamda_i)
 colname = (char *) malloc (NUMCOLS * sizeof(char));

k=0;
 for(j=0;j<D->Nbr_colones; j++)
 { 
  for(i=0;i<D->Card_Article; i++)
  {   
      sprintf(c1,"%d",i);
      sprintf(c2,"%d",j);
      strcpy(C,"Lamda");
      strcat(C,c1);strcat(C,c2);
      colname[k] = (char*)malloc(strlen(C)+1);
     colname[k] =  C;
  
   k++;
  }
 }

11 réponses

Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
10
 char     **colname = NULL; // Nom de chaque vraibles (xi ou Lamda_i)
 colname = (char *) malloc (NUMCOLS * sizeof(char *));

k=0;
 for(j=0;j<D->Nbr_colones; j++)
 { 
  for(i=0;i<D->Card_Article; i++)
  {   
      sprintf(c1,"%d",i);
      sprintf(c2,"%d",j);
      strcpy(C,"Lamda");
      strcat(C,c1);strcat(C,c2);
      colname[k] = (char*)malloc(strlen(C)+1);
     <strike>colname[k] =  C;</strike>strcpy(colname[k], C); //colname[k] est de type char*
  
   k++;
  }
 }

A premiere vue, je ne vois que ca.
Vive le C
Savon
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
...
strcat(C,c1);strcat(C,c2);
colname[k] = (char*)malloc(strlen(C)+1);
strcpy(colname[k], C);
...

C++ (@++)<!--
Messages postés
15
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
20 février 2007

Oui, j ai essayer sauf que ca me donne un bogue en arriavant a strcpy(colname[k], C);
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
10
Tu as bien changé le char* en haut?

Sinon, en moins "barbare":
char     **colname = NULL; // Nom de chaque vraibles (xi ou Lamda_i)
colname = (char *) malloc (NUMCOLS * sizeof(char*));

k=0;
 for(j=0;j<D->Nbr_colones; j++)
 { 
  for(i=0;i<D->Card_Article; i++)
  {  
       sprintf(C, "Lambda%d%d", i, j); //Ca c'est parcque je suis faineant, mais tu devrais eviter sprintf, c'est vraiment la grosse artillerie pour pas grand chose!!!
       colname[k] = (char*)malloc(strlen(C)+1);
       colname[k] =  C;
       k++;
  }
 }

Une petite question quand meme: Tu peux nous donner les valeurs de NUMCOLS, D->Nbr_colones, D->Card_Article?Vive le C
Savon
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Tu refais la même erreur:


colname[k] = (char*)malloc(strlen(C)+1);
colname[k] =  C;
strcpy(colname[k], C);

Moi, je serais interessé de savoir
quel est le bug en question (messages d'érreur, réaction du programme
etc.) et ce que vaut C (c'est quoi, un tableau?)

C++ (@++)<!--
Messages postés
15
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
20 février 2007

En fait,  j'ai oublier de changer le char* en haut. Mais un fois je l 'avais changer, ca marche à merveill. Merci les amis, merci beaucoup. 
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
10
désolé SAKingdom, j'ai betement copie coller ce qu'il avait écrit lors de mon second post :(
Honte à moi ;)

Le bug venait bien du char*.
sizeof(char)=1 tandis que sizeof(char*)=4.
Donc pas la meme quantité de mémoire allouée evidemment et au bout d'un moment, on déborde.
Vive le C
Savon
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Aille. J'avais pas vue ce petit détail :(

C++ (@++)<!--
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
#include <windows.h>
#include <stdio.h>

#define NUM        10
    
int main ()

    char **tabOfStr = NULL;
    char Buff[255];
    int i;

    tabOfStr = (char**)malloc(NUM * sizeof(char*));
   
    for (i=0; i<NUM; i++)
    {
          memset(Buff, 0, 255);
          fflush(stdin);
          printf("Entrer une chaine : ");
          scanf("%s", Buff);
          
          tabOfStr[i] = (char*)malloc(strlen(Buff) * sizeof(char));
          strcpy(tabOfStr[i], Buff);
   }
  
   for (i=0; i<NUM; i++)
          printf("Chaine %i : %s\n.", i, tabOfStr[i]);
     
    system("pause");     
   return 0;
}

ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Ah en faite j'avais même pas vu les malloc dans la boucle
Désolé :s

ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
En plus, tu devrais remplacer scanf par gets.
Et il est inutile de faire un memset  0 sur Buff car je crois que gets rajoute automatiquement le 0 ;)

C++ (@++)<!--