Aider moi : Probléme d'allocation dynamique

Résolu
Vie2006 Messages postés 15 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 20 février 2007 - 10 déc. 2006 à 18:57
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 10 déc. 2006 à 22:23
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

julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
10 déc. 2006 à 19:09
 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
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
10 déc. 2006 à 19:08
...
strcat(C,c1);strcat(C,c2);
colname[k] = (char*)malloc(strlen(C)+1);
strcpy(colname[k], C);
...

C++ (@++)<!--
0
Vie2006 Messages postés 15 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 20 février 2007
10 déc. 2006 à 19:12
Oui, j ai essayer sauf que ca me donne un bogue en arriavant a strcpy(colname[k], C);
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
10 déc. 2006 à 19:19
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
10 déc. 2006 à 19:27
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++ (@++)<!--
0
Vie2006 Messages postés 15 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 20 février 2007
10 déc. 2006 à 19:28
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. 
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
10 déc. 2006 à 19:36
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
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
10 déc. 2006 à 19:49
Aille. J'avais pas vue ce petit détail :(

C++ (@++)<!--
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
10 déc. 2006 à 20:31
#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"
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
10 déc. 2006 à 21:10
Ah en faite j'avais même pas vu les malloc dans la boucle
Désolé :s

ULARGE_INTEGERJokyQi=QI("Joky"
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
10 déc. 2006 à 22:23
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++ (@++)<!--
0
Rejoignez-nous