les pointeurs , les tableaux ??? je mis perd

les pointeurs , les tableaux ??? je mis perd - C - Programmation

Marsh Posté le 01-07-2005 à 23:32:00    

Voila je suis entraine de programmer pour m'exercer une petite calculatrice.
Le rôle du programme n'a que peut d'importance dans le probleme que je rencontre
 
voici mon code (il est incomplet car je n'avance plus depuis ce probleme)

Code :
  1. #include <stdlib.h>
  2. #include <gtk/gtk.h>
  3. #include <math.h>
  4. #include "./algorithme.h"
  5. int * takotak_algo_new( char *entry ){
  6. int pos;
  7. int result;
  8. char algo[150];
  9. int nb[150];
  10. char operation[150];
  11. /*----------------------------------------------------------------------------------------------------------------*/
  12. // ETAPE 1: Séparer les opération et les nombres
  13. // Copier l'entrée dans un tableau
  14. strcat(algo, entry);
  15. // Séparer les élément
  16. for(pos = 0; pos <150; pos++){
  17. if(strcmp(algo[pos], "+" )==0 || strcmp(algo[pos], "-" )==0 || strcmp(algo[pos], "/" )==0 || strcmp(algo[pos], "*" )==0){
  18. printf("1 opération\n" );
  19. }
  20. else if(strcmp(&algo[pos], "" )==0){
  21. }
  22. else{
  23. printf("%s est un chiffre\n", algo[pos]);
  24. }
  25. }
  26. /*----------------------------------------------------------------------------------------------------------------*/
  27.        
  28. return (int *)result;
  29. }


 
j'ai donc un probleme de pointeur. pdt la compilation j'ai c avertisssement
algorithme.c: Dans la fonction « takotak_algo_new »:
algorithme.c:33: attention : passage de l'argument n°1 de « strcmp » transforme un entier en pointeur sans transtypage
algorithme.c:33: attention : passage de l'argument n°1 de « strcmp » transforme un entier en pointeur sans transtypage
algorithme.c:33: attention : passage de l'argument n°1 de « strcmp » transforme un entier en pointeur sans transtypage
algorithme.c:33: attention : passage de l'argument n°1 de « strcmp » transforme un entier en pointeur sans transtypage
 
le probleme eqt que je ne n'ai jamais vraiment bien maitriser les pointeur sur quand il s'agit de tableau ou je m'enbrouille tres rapide
 
le programme évidament produit un segment fault
 
je souhaiterais donc il explication la plus détail possible de l'utilisation des pointeurs en C ( si vous plait pas de liens vers des didactitiel ms une explication de vous )
 
Merci de votre aide

Reply

Marsh Posté le 01-07-2005 à 23:32:00   

Reply

Marsh Posté le 01-07-2005 à 23:36:00    

strcmp(&algo[pos], "" )
 
 
hein ?
 
 
algo[pos] est de type char, donc utilise == pour comparer 2 char
-> strcmp(algo[pos], "+" ) -> algo[pos] == '+'

Reply

Marsh Posté le 01-07-2005 à 23:55:40    

je voudrais bien mais a ce moment la il affiche cecic lors de la compile
 
algorithme.c: Dans la fonction « takotak_algo_new »:
algorithme.c:33: attention : comparaison entre un pointeur et un entier
algorithme.c:33: attention : comparaison entre un pointeur et un entier
algorithme.c:33: attention : comparaison entre un pointeur et un entier
algorithme.c:33: attention : comparaison entre un pointeur et un entier
algorithme.c:36: attention : comparaison entre un pointeur et un entier
 
et encoreune erreur de segmentation
 
enfin le '&' devant la variable j'avais oublié de l'anlever mais si j'ai bien compris quand on met & devant un pointeur cela signifie que l'on faut l'adresse ou il pointe et pas la valeur de cette adresse. Ca permet de copier le contenu d'un pointeur dans un autre comme ceci
 
char *pt1;
pt1 = "salut";
char *pt2
pt2 = &pt1;

Reply

Marsh Posté le 01-07-2005 à 23:59:05    

Citation :

je voudrais bien mais a ce moment la il affiche cecic lors de la compile
 
algorithme.c: Dans la fonction « takotak_algo_new »:
algorithme.c:33: attention : comparaison entre un pointeur et un entier
algorithme.c:33: attention : comparaison entre un pointeur et un entier
algorithme.c:33: attention : comparaison entre un pointeur et un entier
algorithme.c:33: attention : comparaison entre un pointeur et un entier
algorithme.c:36: attention : comparaison entre un pointeur et un entier
 
et encoreune erreur de segmentation  


 
Par curiosité, comment tu l'as écris ? Surement pas comme Taz.  [:itm]  
 

Citation :

Code :
  1. char *pt1;
  2. pt1 = "salut";
  3. char *pt2
  4. pt2 = &pt1;



 
 [:hide]  
 
"char *pt1" donne :
pt1 => char *
pt1[indice] => char
&pt1 => char **


Message édité par Elmoricq le 02-07-2005 à 00:00:12
Reply

Marsh Posté le 01-07-2005 à 23:59:54    

euh j'ai rien compris pourrais tu etre plus claire

Reply

Marsh Posté le 02-07-2005 à 00:02:14    

comme ca :
 

Code :
  1. int * takotak_algo_new( char *entry ){
  2. int pos;
  3. int result;
  4. char algo[150];
  5. int nb[150];
  6. char operation[150];
  7. /*----------------------------------------------------------------------------------------------------------------*/
  8. // ETAPE 1: Séparer les opération et les nombres
  9. // Copier l'entrée dans un tableau
  10. strcat(algo, entry);
  11. // Séparer les élément
  12. for(pos = 0; pos <150; pos++){
  13. if(algo[pos]=="+" || algo[pos]=="-" || algo[pos]=="/" || algo[pos]=="*" ){
  14. printf("1 opération\n" );
  15. }
  16. else if(algo[pos]=="" ){
  17. }
  18. else{
  19. printf("%s est un chiffre\n", algo[pos]);
  20. }
  21. }
  22. /*----------------------------------------------------------------------------------------------------------------*/
  23.        
  24. return (int *)result;
  25. }


 
et j'ai aussi essayé comme ca
 

Code :
  1. int * takotak_algo_new( char *entry ){
  2. int pos;
  3. int result;
  4. char algo[150];
  5. int nb[150];
  6. char operation[150];
  7. /*----------------------------------------------------------------------------------------------------------------*/
  8. // ETAPE 1: Séparer les opération et les nombres
  9. // Copier l'entrée dans un tableau
  10. strcat(algo, entry);
  11. // Séparer les élément
  12. for(pos = 0; pos <150; pos++){
  13. if(&algo[pos]=="+" || &algo[pos]=="-" || &algo[pos]=="/" || &algo[pos]=="*" ){
  14. printf("1 opération\n" );
  15. }
  16. else if(&algo[pos]=="" ){
  17. }
  18. else{
  19. printf("%s est un chiffre\n", algo[pos]);
  20. }
  21. }
  22. /*----------------------------------------------------------------------------------------------------------------*/
  23.        
  24. return (int *)result;
  25. }


Message édité par super-tupapau le 02-07-2005 à 00:02:55
Reply

Marsh Posté le 02-07-2005 à 00:02:52    

super-tupapau a écrit :

euh j'ai rien compris pourrais tu etre plus claire


 
C'est du déréférencement.
 
"char" = 1 byte.
 
"char *" = variable contenant l'adresse d'une zone mémoire, constituée d'un ou plusieurs char
 
"char **" = variable contenant l'adresse d'une zone mémoire, constituée d'un ou plusieurs "char *"
 
Et &pt1 correspond à un "char **" (adresse d'un "char *" ).

Reply

Marsh Posté le 02-07-2005 à 00:05:15    

super-tupapau a écrit :

comme ca :
 

Code :
  1. blahcode



 
 
C'est bien ce que je dis : pas comme Taz.  :o  
 
Il a mis des apostrophes dans ses tests type : algo[pos] == '+'
 
 
Il y a une bonne raison :  
 

  • Texte entre guillemets (car. " ) => chaîne de caractères constante
  • Caractère entre apostrophes (car. ') => un caractère

Reply

Marsh Posté le 02-07-2005 à 00:05:29    

a ok j'ai un peu de mal ms cela ne résoud rien les & devant les pointeurs meme erreur de compil et un segment fault

Reply

Marsh Posté le 02-07-2005 à 00:06:39    

j'ai deja essayé avec les apostrophe
 

Code :
  1. int * takotak_algo_new( char *entry ){
  2. int pos;
  3. int result;
  4. char algo[150];
  5. int nb[150];
  6. char operation[150];
  7. /*----------------------------------------------------------------------------------------------------------------*/
  8. // ETAPE 1: Séparer les opération et les nombres
  9. // Copier l'entrée dans un tableau
  10. strcat(algo, entry);
  11. // Séparer les élément
  12. for(pos = 0; pos <150; pos++){
  13. if(&algo[pos]=='+' || &algo[pos]=='-' || &algo[pos]=='/' || &algo[pos]=='*'){
  14. printf("1 opération\n" );
  15. }
  16. else if(&algo[pos]==''){
  17. }
  18. else{
  19. printf("%s est un chiffre\n", algo[pos]);
  20. }
  21. }
  22. /*----------------------------------------------------------------------------------------------------------------*/
  23.        
  24. return (int *)result;
  25. }


 
tjr la meme chose

Reply

Marsh Posté le 02-07-2005 à 00:06:39   

Reply

Marsh Posté le 02-07-2005 à 00:07:33    

super-tupapau a écrit :

et j'ai aussi essayé comme ca
 

Code :
  1. if(&algo[pos]=="+" || &algo[pos]=="-" || &algo[pos]=="/" || &algo[pos]=="*" )



 
Ouh la. Arrête d'essayer les combinaisons au hasard jusqu'à ce que ça "fonctionne".
Stoppe un coup, trouve un bon tutorial ou un bon bouquin de C (je te conseille "Le langage C" de Kernighan & Ritchie), et étudie un peu le tout avant de te lancer à corps perdu comme tu le fais.
 
 
EDIT :
 

Citation :

j'ai deja essayé avec les apostrophe


 
Apprends à lire aussi, ça pourra t'aider.


Message édité par Elmoricq le 02-07-2005 à 00:08:07
Reply

Marsh Posté le 02-07-2005 à 00:10:56    

1. Ca fait longtemps que j'ai ce livre  :non:  
2. J'ai dabord apris le C++ et j'ai jamais eu c probleme je pense etre dans un mauvais
3. Pourquoi dois-je apprendre a lire pour info un post et arrivé pdt que j'écrivais le précédent

Reply

Marsh Posté le 02-07-2005 à 00:12:40    

super-tupapau a écrit :

1. Ca fait longtemps que j'ai ce livre  :non:


 
Un livre n'est pas un cale-porte.  :o  
C'est le meilleur livre possible pour le C, tout y est parfaitement décris et détaillé, alors je pense que tu ne l'as pas lu.
Repars vers du plus simple, avec les exercices proposés dans le livre.
 
 

super-tupapau a écrit :

3. Pourquoi dois-je apprendre a lire pour info un post et arrivé pdt que j'écrivais le précédent


 
Parce que Taz a donné l'info dès le début, et dans son test algo[pos]=='+', il n'a jamais mis de "&".


Message édité par Elmoricq le 02-07-2005 à 00:14:46
Reply

Marsh Posté le 02-07-2005 à 00:16:53    

je sais qui n'a pas mit de & c'est juste que en fait le code que je vous ai donner est emputé d'une partie qui est pour l'instant inutile
ce pourquoi une petite erreur c'était mise à la ligne 27 "&alog[pos]" ensuite comme le dit mon titre je suis embrouillé dans ce qui est les pointeurs et je ne suis pas venu pour me fair chier dessus.
 
alors si tu pouvais evité les truc du genre  

Citation :

Un livre n'est pas un cale-porte.  :o  


parce que ce livre il est sur mes genoux depuis une semaine et c pas la premiere fois que je l'ouvre
 
excuse pour le livre en fait moi j'ai le C++ de jesse liberty en papier et l'autre je l'ai sur un site
perso je prefere lire sur le papier c plus claire et j'ai pas tellemnt envie d'acheter un autre livre qui parle du C vu que j'ai deja le C++


Message édité par super-tupapau le 02-07-2005 à 00:19:01
Reply

Marsh Posté le 02-07-2005 à 00:23:12    

Je ne suis pas en train de te chier dessus. Mais une question a été posée, une réponse a été donnée, mais soit tu as ignoré la réponse, soit tu as recopié de travers avec plein de combinaisons différentes.
 
C'est un peu frustrant pour ceux qui te répondent.

Reply

Marsh Posté le 02-07-2005 à 00:23:46    

enfin c normal que ca soit le meilleur livre car il n'y pas mieux placer que les créateur du C pour parler du C  ;)

Reply

Marsh Posté le 02-07-2005 à 00:25:10    

bon excuse pour mettre emporter
alors pourrais tu me remmontrer ta solution s'il te plait  :)

Reply

Marsh Posté le 02-07-2005 à 00:28:10    

pour la fustration je connais, j'aide les débutant sous linux, il y a rien de plus énervant
que de répéter trente fois la meme chose et que l'autre laisse finalement tomber et va voir ailleurs  :fou:


Message édité par super-tupapau le 02-07-2005 à 00:28:28
Reply

Marsh Posté le 02-07-2005 à 00:28:36    

j'en ai marre des débutants ! c'est pourtant pas compliqué. le C est statiquement typé, y a pas à réfléchir,  il suffit de vérifier les types d'une expression, et on a déjà fait une bonne partie du travail.
 
Comment peux tu écrire ça &algo[pos]=='+' ....

Reply

Marsh Posté le 02-07-2005 à 00:32:31    

je sais bien que c algo[pos]=='+' ms toi non plus tu sais pas lire
 

Citation :

e sais qui n'a pas mit de & c'est juste que en fait le code que je vous ai donner est emputé d'une partie qui est pour l'instant inutile
ce pourquoi une petite erreur c'était mise à la ligne 27 "&alog[pos]"


 
enfin ca fait trois ans que je programme ( et 2 ans en C) et je me considere plus (peut-etre ai-je tort) comme un débutant

Reply

Marsh Posté le 02-07-2005 à 00:34:37    

ben à tort. T'es pas capable d'écrire une expression valide au niveaux de types. Et ton parcours de chaine est naz ... Et vive les dépassement s de capacités. Vive les switch. Vive const.
 
 
Sinon, on est tous perplexes devant le return de ta fonction.

Reply

Marsh Posté le 02-07-2005 à 00:35:59    

super-tupapau a écrit :

enfin ca fait trois ans que je programme ( et 2 ans en C)  et je me considere plus (peut-etre ai-je tort) comme un débutant


 
Uh huh... du C sans pointeur pendant 2 ans ? [:atari]
 
 

Citation :

Sinon, on est tous perplexes devant le return de ta fonction.


 
J'avais même pas fait gaffe.  :ouch:


Message édité par Elmoricq le 02-07-2005 à 00:36:45
Reply

Marsh Posté le 02-07-2005 à 00:38:22    

non quand meme pas  :D  c impossible de programmer en C sans pointeur (tu peux rien faire sans ca) mais j'ai évité le plus souvent possible les pointeurs avec des tableaux ( et crois moi c pas facile )
En général je trouver la solution s'en vraiment la comprendre. Mnt je veux le comprend comme ca je serais plus bloquer.

Reply

Marsh Posté le 02-07-2005 à 00:39:57    

ben fie-toi aux types pour commencer.
parcours les chaines jusqu'à l' '\0'


Message édité par Taz le 02-07-2005 à 00:40:19
Reply

Marsh Posté le 02-07-2005 à 00:41:56    

pour le retour de la fonction je fait comme ca
 

Code :
  1. int * takotak_algo_new( char *entry ){
  2. int pos;
  3. int *result;
  4. char algo[150];
  5. int nb[150];
  6. char operation[150];
  7. /*----------------------------------------------------------------------------------------------------------------*/
  8. // ETAPE 1: Séparer les opération et les nombres
  9. // Copier l'entrée dans un tableau
  10. strcat(algo, entry);
  11. // Séparer les élément
  12. for(pos = 0; pos <150; pos++){
  13. if(&algo[pos]=='+' || &algo[pos]=='-' || &algo[pos]=='/' || &algo[pos]=='*'){
  14. printf("1 opération\n" );
  15. }
  16. else if(&algo[pos]==''){
  17. }
  18. else{
  19. printf("%s est un chiffre\n", algo[pos]);
  20. }
  21. }
  22. /*----------------------------------------------------------------------------------------------------------------*/
  23.        
  24. return result;
  25. }

Reply

Marsh Posté le 02-07-2005 à 00:42:58    

result n'est pas initialisé. ton code est toujours archi faux.

Reply

Marsh Posté le 02-07-2005 à 00:45:39    

je l'ai deja dit ce code est enputé
result sera inisialisé

Reply

Marsh Posté le 02-07-2005 à 00:52:21    

ben ça doit pas être triste le reste.

Reply

Marsh Posté le 02-07-2005 à 00:53:35    

merci beaucoup c tres sympa j'ai compris je vais voir ailleurs

Reply

Marsh Posté le 02-07-2005 à 00:56:41    

ben si c'est pour pas prendre en compte ce qu'on t'as dit ...
 
t'as toujours pas réglé tes comparaisons entre caractères ni ceci
 
#  // Copier l'entrée dans un tableau
#     strcat(algo, entry);
#      
#     // Séparer les élément
#     for(pos = 0; pos <150; pos++){
# .... algo[pos]

Reply

Marsh Posté le 02-07-2005 à 00:58:17    

super-tupapau a écrit :

merci beaucoup c tres sympa j'ai compris je vais voir ailleurs


 
Si tu veux, mais je ne pense pas que ce soit différent ailleurs. [:elmoricq]  
 
Ta fonction est censée faire quoi au fait ? Parce que j'ai essayé de la coder pour que tu aies un exemple, quand je me suis aperçu que ça partait en tout sens.  :sweat:

Reply

Marsh Posté le 02-07-2005 à 01:10:31    

je pense que je mit prend mal en fait je l'ai dit au début c'est une calculette tous simple.
ce que je voulais faire c'est avec cette fonction récuper la chaine taper par l'utilisateur (elle est avant vérifier pour voir si il n'y a pas de faute de syntaxe) par exemple: 2+3/6 puis stocker dans deux tableaux de 150 characteres (150 étant le nombre maximum que l'utilisateur pouvait taper) les operateurs (+-/*) dans l'un et les nombres dans un autre. en gardant les position deux ceci par rapport a la chaine taper.
avec l'exemple ca donnerai dans le tableau de operateur 0, +, 0, /, 0, ... et le tableau des nombres 2, 0, 3, 0, 6,... si un nombre été superieur a dix ca macherai comme ceci (c pas tre propement ms bon) par exemple pour la chaine 23/7  
tableau 1: 0, 0, /, 0, ....
tableau 2: 23,23,0,7, ... (deux nombre ne pouvant se suivre il seront considérer comme meme nombre dans le calcul)
enfin avec deux variable que j'appelerai registres (en reference a l'asm) je recopier un premier nombre dans le premier et le second dans le second et je prendrai l'operateur qui se trouve au milieu pour effectuer le calcul enfin je recommence jusque ce que la chaine ne soit plus qu'un nombre
 
je compte implémenter plus tard la priorité des operations

Reply

Marsh Posté le 02-07-2005 à 01:18:38    

enfin vous pouver me dire que l'age n'a rien avoir mais j'ai regarder vos status et vous etes tous les deux des informaticiens qui on 20 ans ou 30 ans tandis moi j'en ai que 15 et j'ai tous appris tous seule avec des bouquin et en lisant du code source alors je pense que c'est deja pas si mal.

Reply

Marsh Posté le 02-07-2005 à 01:45:47    

Je pense que tu démarres sur du trop compliqué pour commencer.
 
Tu devrais revoir tes objectifs, en procédant de la façon suivante :

  • Demander un premier nombre  
  • Demander un opérateur parmi les suivants : + - * /
  • Demander un second nombre
  • Ecrire le résultat.


Tu verras déjà qu'avec ça, tu auras un certain nombre de contrôle et de choses à faire qui te feront progresser.
Parce que là tu te lances dans quelque chose dont tu ne te sortiras pas, tel que tu es parti.

Reply

Marsh Posté le 02-07-2005 à 08:57:09    

Page 78 du K&R, il y a une calculette polonaise inverse comme exemple.

Reply

Marsh Posté le 02-07-2005 à 10:40:48    

Je vais l'acheter ce livre. sinon j'ai relu le chapitre pointeur dans mon livre de C++ est voila ce que j'ai retenu
 
1. un pointeur c une variable qui contient l'adresse d'un autre variable
2. on peut accèder à la valeur du pointeur (l'adresse qui contient et pas la valeur de cette adresse) en mettant & devant lui
3. on peut accèder à l'adresse du pointeur en ne mettant rien devant ( c comme ca que l'on doit le transmettre au fonction)
4. enfin le plus important on peut accèder à la valeur ou il pointe en mettent * devant lui.
 
voila j'espere que j'ai compris mais j'ai lu ca dans un livre de C++ alors depuis la norme C99 comme c'est plus compatible peut-etre que c faux.

Reply

Marsh Posté le 02-07-2005 à 10:54:21    

bon j'ai fait un programme d'essai pour voir si je controle bien les pointeurs:
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char ** argv){
  4. int line;
  5. int *pLine;
  6. // Attribuer la variable à l'adresse
  7. line = 10;
  8. pLine = &line;
  9. // Imprimer la valeur
  10. printf("\nline : %i\n", line);
  11. printf("*pLine : %i\n", *pLine);
  12. // Imprimer les deux adresse
  13. printf("\n&line : %x\n", &line);
  14. printf("pLine : %x\n", pLine);
  15. // Imprimer l'adresse contenu pas pLine
  16. printf("&pLine : %x\n", &pLine);
  17. // Modifier line indirectement par pLine
  18. *pLine = 15;
  19. // Imprimer la valeur
  20. printf("\nline : %i\n", line);
  21. printf("*pLine : %i\n", *pLine); 
  22. return 0;
  23. }


 
ce qui me donne a l'execution
 
line : 10
*pLine : 10
 
&line : bffff874
pLine : bffff874
&pLine : bffff870
 
line : 15
*pLine : 15

Reply

Marsh Posté le 02-07-2005 à 11:09:09    

printf("\n&line : %x\n", &line);
 -> %p

Reply

Marsh Posté le 02-07-2005 à 11:12:18    

merci ca rajoute 0x devant les adresse pour montrer que c'est de l'hexadecimal
 
line : e
*pLine : e
 
&line : 0xbffff877
pLine : 0xbffff877
&pLine : 0xbffff870
 
line : a
*pLine : a
 
 
sinon sa marche avec les variables char mais comme faire avec les chaines?


Message édité par super-tupapau le 02-07-2005 à 11:12:39
Reply

Marsh Posté le 02-07-2005 à 11:27:16    

non ça roule pas.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed