Rechercher : dans
Par :

[C] char ***, char **, char * ?

Dernière réponse le 11 mai 2005 à 20:55:26 kij_82, le 11 mai 2005 à 14:36:38 
 Signaler ce message aux modérateurs

Bonjours,

je vous demande de l'aide pour la chose suivante :
je voudrais créer un tableau à deux dimension qui recueillera uniquement des char *.
Ce tableau doit être créé dinamiquement dans un double boucle.
Pour cela, j'ai pensé à faire un truc de ce style :
Code:

typedef  TYPE (char *t[2]); 


int fonction ( ) { 
 TYPE *tab; 

 ... ici doit se faire le remplissage du tableau avec des chaines... 
} 
 



Qqun peut-t-il me dire si la syntaxe du typedef est bonne ou non, si l'idée est là ou sinon ce qu'il est préférable de faire pour cela.

Autre précision : en fait la taille de t[] n'est pas forcément 2, justement, ca aussi il faut allouer dynamiquement la taille.
En fait c'est pour récupérer des lignes de champ suite à une requete SELECT sur une DB

Je me demande aussi s'il ne faut pas utiliser ceci :
char ***tab;
char **ligne;
char *champ;



Et faire l'allocation de tous ce petit monde au fur et à mesure ?
Bref, ma question est multiple quoi !

merci à tous.

++ ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Meilleures réponses pour « [C] char ***, char **, char * ? » dans :
Les variables en C++ VoirLes variables en C++ 1. Les différents types de variables 1.1 bool 1.2 char 1.3 unsigned short int 1.4 short int 1.5 unsigned long int 1.6 long int 1.7 int (16 bits) 1.8 int (32 bits) 1.9 unsigned int (16 bits) 1.10 unsigned int (32...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
Langage C++ - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C++ sont typées, c'est-à-dire que les données contenues dans...

1

m0n0-le-14r3, le 11 mai 2005 à 14:45:22

Pourquoi ne fais tu pas :
struct tab{
cahr *ligne
};
struct ligne{
char *champ
};

ou un truc ds le genre?? -- je vis dans un rêve dont je ne me reveille jamais...--
<---- j adore ma voisine ;) ---->

Répondre à m0n0-le-14r3

2

kij_82, le 11 mai 2005 à 14:48:37

Car ce ne sera pas simple pour lire par la suite :
imagine que tu effectue un select sur une base, que tu souhaite récupérer un champ de ce select pour effectuer une autre requete sur la base dans la même foulée, et bien avec un tableau double entrée, une simple double boucle de parcours du tableau de retour de la premiere requete et c'est bon, alors qu'avec une structure...

mais en fait c bon j'ai ma solution :

*arr = malloc(nb_lines * sizeof *arr); 
   if(!*arr) { /* erreur d'allocation */ } 
   for(l=0; l<nb_lines; l++) 
   { 
      arr[l] = malloc(nb_colonnes); /* sizeof char vaut 1 par definition */ 
      if(!arr[l]) { /* erreur d'allocation */ } 
   } 



merci quand même

++ ~ iclic @ gauch,iclic,  iclic @ droate, iclic, iclic
             et ya pas de bôg môsieu !    ~

Répondre à kij_82

3

SKZ, le 11 mai 2005 à 20:44:51

Et t'es sûr que ça marche ???

*arr = malloc(nb_lines * sizeof *arr); 

Cette ligne est fausse. il faut " arr = malloc(..."
De plus, sizeof(*arr) n'a aucun sens ! (Puisque arr est un pointeur non alloué, sinon c'est la ligne qui n'en a aucun... :-/ )

   if(!*arr) { /* erreur d'allocation */ } 

Encore une fois, faut supprimer l'*

   for(l=0; l<nb_lines; l++) 
   { 
      arr[l] = malloc(nb_colonnes); /* sizeof char vaut 1 par definition */ 

WARNING : Quand on passera en UNICODE, sizeof(char) vaudra 2.

Répondre à SKZ

4

Luffy =), le 11 mai 2005 à 20:48:02

Quand on passera en UNICODE

et pourquoi veux-tu passer en UNICODE ? et pourquoi un char fera 2 octets ???et pourquoi le soleil brille ? Le Parisien, il vaut mieux l'avoir en journal !!! :-P

Répondre à Luffy =)

5

 kij_82, le 11 mai 2005 à 20:55:26

J'ai trouvé un truc de toute facon :

static char ***
    PerlPower(char * arg[], int taille, int *nbligne, int *nbchamp)
    {
	
      dSP;  

	  int count = 0, i = 0, j=0;
	  char ***tableau = NULL;

	  SV *tmp;
	  SV *champ;

	  AV *tab;
	  AV *ligne;



      ENTER;  
      SAVETMPS;  
      PUSHMARK(SP);  

	  while( i < taille )
		XPUSHs(sv_2mortal(newSVpv(arg[i++],0))); // depose la base dans la pile     

      PUTBACK;              
      count = perl_call_pv("lance", G_ARRAY);  
      SPAGAIN;              
                                      
if(count != 0) {
printf("Nombre de retour = %d\n",count);

tab = (AV *) SvRV(POPs);  
		

*nbligne = av_len(tab)+1;

tableau = malloc((*nbligne) * sizeof( **tableau) );

i=0;
while( i < (*nbligne) )
	{
	tmp = *av_fetch(tab, i, 0);
	if( SvTYPE(SvRV(tmp)) == SVt_NV ){
		printf("Entier de taille %d\n",SvLEN(tmp));
	}
	else {
	ligne = (AV *) SvRV(tmp);
	(*nbchamp) = av_len(ligne)+1;
	tableau[i] = malloc((*nbchamp) * sizeof( *tableau ));

	for( j=0; j<(*nbchamp); j++ ) {		
        champ = *av_fetch(ligne, j, 0);
        tableau[i][j] = malloc( sizeof( SvLEN(champ) ) );
	strcpy(tableau[i][j], (char *)SvRV(champ)); 
	}

	}
			
	i++;
	}

      PUTBACK;	
      FREETMPS;   
      LEAVE;	

return tableau;

}


Enfin... ca y est ca marche !

:) ~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82