tableau de chaine de caractère : enregistrement - C - Programmation
Marsh Posté le 11-03-2012 à 14:24:19
Tableau à deux dimensions / pointeurs sur pointeurs
char liste_mot[16][256]; te donnera un tableau de 16 chaines de caractères pouvant toutes contenir 256 lettres max, mais je te recommande plutôt les double pointeurs avec malloc (bien que ça dépend de ce que tu veux faire)
Marsh Posté le 11-03-2012 à 15:21:01
je ne connais pas suffisamment le C pour comprendre ça :s
je sais ( a peu près ) ce qu'est les pointeurs, mais pointeurs sur pointeurs je comprends pas trop :s
en gros je peux marquer :
Code :
|
en déclarant juste un truc du genre :
Code :
|
Marsh Posté le 11-03-2012 à 16:09:01
Citation : je ne connais pas suffisamment le C pour comprendre ça :s |
Ben c'est le moment de t'y mettre, parce que la programmation vaudou, on n'en est pas fana sur ce forum.
Citation : mot[1][]="bonjour"; |
C'est pas possible en C!
Il va te falloir utiliser une fonction comme strcpy.
A+,
Marsh Posté le 11-03-2012 à 16:30:02
je suis qu'en première année d'IUT informatique.. je peux pas aller plus vite que le programme...
enfin bon merci j'ai réussi à faire ce que je voulais
edit : j'ai un nouveau problème qui concerne toujours ce fameux tableau : je voudrais le faire passer en paramètre d'une fonction... mais je ne sais pas comment on passe les tableaux à deux dimensions...
Marsh Posté le 11-03-2012 à 19:00:16
Tu dois préciser la taille de la hauteur :
void unefonction( int [14] [] untableau){}
Marsh Posté le 12-03-2012 à 08:31:27
Benh_31 a écrit : je suis qu'en première année d'IUT informatique.. je peux pas aller plus vite que le programme... |
Un tableau à deux dimensions, c'est ça:
char **tableau_2_dim_dynamique; // qu'il faut allouer avec plusieurs malloc
ou ça
char tableau_2_dim_fige[10][20]; // 10 chaines de 19 caractères+1 zéro terminateur
pour envoyer ce tableau, le plus simple est d'envoyer le pointeur directement
Code :
|
Marsh Posté le 12-03-2012 à 11:20:42
Code :
|
tu n'aurais pas oublié le nombre d'élément edwoud ?
moi j'ai fais comme toi mais mon compilateur me trouve un warning et quand j’exécute, ça plante
warning : passing arg 1 of 'ma_fonction' from incompatible pointer type
Marsh Posté le 12-03-2012 à 11:27:06
Benh_31 a écrit :
|
oui, tout à fait
Code :
|
Tu pourrais aussi laisser la dernière chaine vide (ou pointeur NULL dans le cas dynamique)
Et boucler tant que le pointeur n'est pas NULL ou que la chaine n'est pas vide. Ainsi, pas besoin de donner le nombre d'éléments.
Marsh Posté le 12-03-2012 à 11:46:13
oui mais je vais me contenter de faire passer le nombre d’éléments en paramètre ^^, c'est plus le passage du tableaux qui me pose problème
j'ai déclaré mon tableaux comme ça :
Code :
|
et j'ai déclaré ma fonction comme ça :
Code :
|
et quand j'appelle ma fonction je mets simplement :
Code :
|
mais ça marche pas mon warning persiste
Marsh Posté le 12-03-2012 à 13:36:37
Benh_31 a écrit : oui mais je vais me contenter de faire passer le nombre d’éléments en paramètre ^^, c'est plus le passage du tableaux qui me pose problème
|
Tu as écrit pour l'appel
Code :
|
ou bien
Code :
|
? (le "int" est de trop)
Tu devrais même écrire: code_retour=bigword(montab,i); si ta fonction retourne vraiment quelque chose
Marsh Posté le 12-03-2012 à 15:52:46
oula désolé j'ai un peu mélangé mon code et ce que je voulais marquer : montab = ptrouve
et oui pardon a l'appel je mets pas le int
Marsh Posté le 12-03-2012 à 16:53:02
ben ça :
warning : passing arg 1 of 'ma_fonction' from incompatible pointer type
Marsh Posté le 12-03-2012 à 18:42:17
Ah ouais, j'pensais que ça marcherait (comme j't'avais dit, je ne fais jamais de tableaux claqués en dur, c'est pas beau)
Tu veux pas le faire avec des allocations dynamiques?
Marsh Posté le 12-03-2012 à 20:22:48
edwoud a écrit : Ah ouais, j'pensais que ça marcherait (comme j't'avais dit, je ne fais jamais de tableaux claqués en dur, c'est pas beau) |
ben moi je suis ouvert à toutes propositions ^^ du moment que ça me fasse pas tout modifier mon code et que ça ne soit pas trop compliqué parce que je l'ai pas encore vu
Marsh Posté le 12-03-2012 à 20:59:08
Tu connais déjà les pointeurs ?
Marsh Posté le 12-03-2012 à 21:01:56
moui plus ou moins, je sais que c'est l'adresse mémoire de la variable
Marsh Posté le 13-03-2012 à 00:57:55
Nan, un pointeur c'est une variable qui contient une adresse, et c'est aussi utilisé comme tableau, du coups un pointeur sur pointeur c'est un tableau à deux dimensions, zieute des cours sur internet tu devrais y trouver ton bonheur
Marsh Posté le 13-03-2012 à 12:01:36
Terminapor a écrit : Nan, un pointeur c'est une variable qui contient une adresse, et c'est aussi utilisé comme tableau, du coups un pointeur sur pointeur c'est un tableau à deux dimensions, zieute des cours sur internet tu devrais y trouver ton bonheur |
Non!
Un pointeur ce n'est pas un tableau!
Un tableau en C, c'est une variable associée à zone mémoire allouée, et des mécanismes d'accès qui utilisent éventuellement la même syntaxe que celle des pointeurs (ie si tab est un tableau, tab + i pointe sur la zone mémoire associée a la i-eme case de tab, tab[i]).
Un pointeur en C, c'est une variable qui contient une adresse. A priori, on ne sait rien du tout sur l'allocation mémoire de ce sur quoi pointe un pointeur [ie la zone mémoire qui a pour adresse la valeur du pointeur]. Peut être que ça pointe sur quelque chose d'alloué (une variable, qui peut être un tableau), peut être qu'on a alloué dynamiquement avec un malloc, ou peut être que ça pointe sur un truc pas alloué (en attente d'un malloc) ou plus alloué (après un free).
A+,
Marsh Posté le 14-03-2012 à 00:33:38
Oui mais je dis que c'est un tableau dans le sens où on peut manipuler comme un tableau, et que je pense que ça sera plus facile à manipuler qu'un vrai tableau en 2D
Marsh Posté le 14-03-2012 à 02:18:38
Vu que c'est quelqu'un qui connait pas bien le C, il vaut mieux éviter de lui rendre les choses confuses avec des assertions pas tout à fait justes.
A+,
Marsh Posté le 14-03-2012 à 14:34:26
mais mon tableau à deux dimensions, lors de ma déclaration de fonction, il faut pas que je le le pense en tant que simple char * et non plus char ** ?
Marsh Posté le 14-03-2012 à 14:43:09
Non, non, c'est correct.
Mais il faut juste que tu te rappelles que c'est pas ton tableau que tu passes, mais son adresse, et que c'est pour ça que tu utilises les pointeurs.
A+,
Marsh Posté le 14-03-2012 à 15:15:59
mais comment je fais pour "restituer" sa valeur de tableau à mon pointeur ?
Marsh Posté le 14-03-2012 à 15:20:55
Tu ne restitues pas, mais tu peux accéder au contenu de ton tableau, ce qui est en général la seule chose utile pour une fonction ou tu le passes par adresse.
Fais voir un peu ton code (l'ensemble et pas juste un bout insuffisant pour déterminer le pb, comme ce qui précède) si tu as toujours des pbs avec ton passage par adresse, qu'on diagnostique exactement ce qui se passe.
A+,
Marsh Posté le 14-03-2012 à 17:48:00
Alors voila mon code, soyez indulgent il doit surement être sale mais j'ai fais du mieux que j'ai pu,
j'ai essayer de faire un espèce de pendu, où chaque mot trouvé, est un indice pour découvrir un nouveau mot par association des autre,
c'est à dire, avec les mot ballon, stade, zidane, on doit trouvé football par exemple.
mon .h qui contient la déclaration de mes fonctions :
Code :
|
l'appel de ma fonction "bigword" se trouve dans la sous fonction "challenge", le main n'est pas vraiment important c'est juste un menu, je vous le mets quand même :
Code :
|
puis mes fonction : seule challenge et bigword sont importantes :
Code :
|
Marsh Posté le 14-03-2012 à 18:28:43
Ton message est juste un warning:
Tu déclares
int bigword(char ** ptrouve,int pi);
Mais à l'appel bigword(trouve,i); le compilo voit que le premier paramètre comme char *ptrouve[30] et il signale qu'il voit une différence avec le type déclaré (pas grave ici, car compatible)
Il suffit juste de caster à l'appel:
bigword((char **)trouve,i);
et le problème sera réglé
A+,
Marsh Posté le 14-03-2012 à 18:33:32
gilou a écrit : Ton message est juste un warning: |
trop fort merci beaucoup, mon warning est réglé, mais ça bug toujours.
une fois que j'ai réussi a récupéré mon pointer, comment je fais pour afficher les chaines de caractères pour chaque ran de i ?
j'ai fais ça :
Code :
|
mais ça marche pa, ni ça :
Code :
|
Marsh Posté le 14-03-2012 à 21:34:25
Citation : i=0; i<=pi |
C'est toujours douteux, ça en C
Ce serait pas par hasard
i=0; i < pi
?
Et ceci est la bonne méthode en effet:
printf("\n%s",ptrouve[i])
Il marche pas ton code?
J'avais fait un essai avec island et ça avait l'air fonctionnel.
A+,
Marsh Posté le 15-03-2012 à 00:11:35
gilou a écrit :
C'est toujours douteux, ça en C |
non ça ne marche pas
Marsh Posté le 15-03-2012 à 02:23:23
Ah oui, désolé, j'avais pas les yeux en face des trous.
J'étais resté sur le cas habituel d'une déclaration comme:
Code :
|
auquel cas le code donné marche.
Mais si tu as un tableau de taille constante, alors ça ne marche pas ainsi.
C'est en fait nettement plus simple:
Tu peux faire:
1) une déclaration
int bigword(char ptrouve[5][30], int pi);
2) un appel
bigword(trouve,i);
3) un corps de fonction ou tu utilises ptrouve comme le tableau qu'il est
le tableau, est passé par adresse et non pas par copie, comme le petit programme exemple suivant te montre:
Code :
|
Notes qu'on peut avoir le paramètre intérieur non précisé, et donné par une variable:
Code :
|
C'est plus souple et souvent plus simple.
Une pratique encore plus standard serait d'agir ainsi:
Code :
|
C'est a dire de redéfinir ton tableau double comme un tableau simple pour un nouveau type de donnée que tu définir avec un typedef.
L'avantage est que le sens du premier paramètre, mot p[] est alors clair: p est un tableau de mot.
Bref, si tu as pas un vrai tableau 2D de données homogènes (comme le serait une image avec ses pixels), il y a aucune raison de rester en 2D.
A+,
Marsh Posté le 15-03-2012 à 11:20:02
ben oui justement, au début j'avais définit une structure, mais ça marché pas ( premier post ^^ ) :
Code :
|
mais mon problème et je suis sur qu'il vient de la c'est cette instruction :
Code :
|
Marsh Posté le 15-03-2012 à 12:35:23
ReplyMarsh Posté le 15-03-2012 à 13:22:21
Mais tu as pas besoin de structs ici:
C'est complètement inutile (et ça va surement foutre le boxon, puisqu'un pointeur risque d'être interprété comme un pointeur sur un tableau de struct et non pas sur le tableau interne à la struct)
Il suffisait de faire
typedef char mot[26];
typedef mot tab[10];
A+,
Marsh Posté le 15-03-2012 à 13:28:07
Bon sinon, pour ton pendu, ceci est nettement plus lisible
Code :
|
qu'un truc comme ceci (équivalent, mais clair comme du jus de moule par une nuit sans lune)
Code :
|
C'est une question de style, mais la lisibilité, c'est important.
A+,
Marsh Posté le 15-03-2012 à 17:14:51
gilou a écrit : Bon sinon, pour ton pendu, ceci est nettement plus lisible
|
je sais ^^ c'est un copain qui a voulu faire les dessins ^^ ça lui faisait plaisir ^^
Marsh Posté le 15-03-2012 à 17:17:58
Terminapor a écrit : &ptrouve[i], non ? |
yep déjà ça ne bug plus, ça marche même
ça me rajoute un warning mais bon au moins ça marche
Marsh Posté le 11-03-2012 à 01:05:45
Bonjour,
j'ai un petit problème en C : je voudrais faire un tableau de chaine de caractères : pas un simple tableau de char qui contiendrait pour chaque rang, 1 seul caractère, mais qui contiendrait pour chaque rang une chaine particulière entière de caractère.
j'ai voulu définir une structure qui contiendrait un type définit lui même par une chaine de char, pour pouvoir faire ce tableau mais ça ne marche pas
le voici :
si quelqu'un aurait une solution ça serait cool
merci d'avance.