[C] char ***, char **, char * ?
Résolu
kij_82
Messages postés
4260
Statut
Contributeur
-
kij_82 Messages postés 4260 Statut Contributeur -
kij_82 Messages postés 4260 Statut Contributeur -
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:
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 :
Et faire l'allocation de tous ce petit monde au fur et à mesure ?
Bref, ma question est multiple quoi !
merci à tous.
++
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:
- Char(10) excel francais
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Liste déroulante excel - Guide
- Clé d'activation windows 10 - Guide
- Winrar 64 bits windows 10 français gratuit - Télécharger - Compression & Décompression
- Dernière version ccleaner gratuit français - Télécharger - Nettoyage
3 réponses
pourquoi ne fais tu pas :
struct tab{
cahr *ligne
};
struct ligne{
char *champ
};
ou un truc ds le genre??
struct tab{
cahr *ligne
};
struct ligne{
char *champ
};
ou un truc ds le genre??
Quand on passera en UNICODE
et pourquoi veux-tu passer en UNICODE ? et pourquoi un char fera 2 octets ???et pourquoi le soleil brille ?
et pourquoi veux-tu passer en UNICODE ? et pourquoi un char fera 2 octets ???et pourquoi le soleil brille ?
J'ai trouvé un truc de toute facon :
Enfin... ca y est ca marche !
:)
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 !
:)
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
++
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.