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

Résolu
kij_82 Messages postés 4089 Date d'inscription   Statut Contributeur Dernière intervention   -  
kij_82 Messages postés 4089 Date d'inscription   Statut Contributeur Dernière intervention   -
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.

++
A voir également:

3 réponses

m0n0-le-14r3 Messages postés 174 Date d'inscription   Statut Membre Dernière intervention   17
 
pourquoi ne fais tu pas :
struct tab{
cahr *ligne
};
struct ligne{
char *champ
};

ou un truc ds le genre??
0
kij_82 Messages postés 4089 Date d'inscription   Statut Contributeur Dernière intervention   857
 
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

++
0
SKZ > kij_82 Messages postés 4089 Date d'inscription   Statut Contributeur Dernière intervention  
 
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.
0
Luffy =) Messages postés 365 Date d'inscription   Statut Membre Dernière intervention   110
 
Quand on passera en UNICODE

et pourquoi veux-tu passer en UNICODE ? et pourquoi un char fera 2 octets ???et pourquoi le soleil brille ?
0
kij_82 Messages postés 4089 Date d'inscription   Statut Contributeur Dernière intervention   857
 
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 !

:)
0