FORUM Syndrome-OC - Jacky-PC


  Programmation


  Autre


  [C++] Tableaux, pointeurs, l'embrouille : Besoin d'aide

 




Le salon de discussion : Wile E Coyote, 1 utilisateur anonyme et 17 utilisateurs inconnus

 Mot :   Pseudo :  
 
 Page :  1  2
Page Précédente 
Auteur Sujet :

[C++] Tableaux, pointeurs, l'embrouille : Besoin d'aide

n°3828
Deather2
OpenBSD: the way to go!
Posté le 22-08-2004 à 00:05:30  profilanswer
 

Salut!
Bien, ça fais des nuit que je me heurte à un problème et je vais finir pa r peter un cable :fou:  
 
Voilà, j'ai besoin d'une variable qui contiendrai le nom d'un personnage (donc de type char).
Seulement je sais pas comment déclarer cette variable:
char Name;
char Name[15];
char *Name;
char *Name[15];
 
:??:
 
Ce n'est que le début.
J'ai besoin de creer une fonction qui me retournera le nom à mettre dans cette variable:
 

Code :
  1. char GetName()
  2. {
  3.      //code
  4.      return t_Name;
  5. }


 
Je suppose que la variable t_Name devra être du même type que Name.
J'ai tout essayé, soit il m'emmerde avec des pointeurs qui n'existent pas (quand je met char Name[15] et char t_Name[15]), soit il compile et me fais de beaux segmentation fault, soit il me met n'importe quoi dans la variable (sûrement le pointeur qui merde ...)
 
Bref, je suis completement paumé.
Je me doute que ça doit pas être facile à comprendre, si besoin est je peux envoyer le code source par mail (c'est un RPG que je développe, en C++, sous Linux, avec ncurses, ça doit vous rappeler qqch ;))
 
Merci de m'eclairer, le but ayant qu'a la fin, je puisse faire:

Code :
  1. printw("%c",Name);


 
:)

mood
Google
Posté le 22-08-2004 à 00:05:30  profilanswer
 

n°3829
ced-2k
TODO : Insert text here.
Posté le 22-08-2004 à 00:24:56  profilanswer
 

deather2 a écrit :

Salut!
Bien, ça fais des nuit que je me heurte à un problème et je vais finir pa r peter un cable :fou:  
 
Voilà, j'ai besoin d'une variable qui contiendrai le nom d'un personnage (donc de type char).
Seulement je sais pas comment déclarer cette variable:
char Name;
char Name[15];
char *Name;
char *Name[15];
 
:??:


 
char Name[15];
 
ou plus proprement
char * Name = malloc(15*sizeof(char));
 
pour le reste je pige pas trop ce que tu veux faire?
 
de plus quand tu veux imprimer une chaine c'est
printw("%s",Name);


Message édité par ced-2k le 22-08-2004 à 00:25:48
n°3830
Deather2
OpenBSD: the way to go!
Posté le 22-08-2004 à 00:40:02  profilanswer
 

Merci pour la réponse!
Excuse moi, oui c'est bien %s c'est juste là que je me suis planté (m'embrouille souvent là dessus)
 
Une fois que j'ai crée cette variable, j'ai besoin de faire une fonction qui demandera à l'utilisateur d'entrer le nom via getchar (ça c'est dans le code, y'a normalement pas à s'en soucier) et qui retournera une variable, placée ensuite dans Name
 
en gros j'aurai:
 

Code :
  1. char GetName() //Je dois mettre char *GetName() ?
  2. {
  3.     char t_Name[15]; //Et là? c'est bien comme ça ?
  4.      for(int Tmp=0;Tmp<15;Tmp++)
  5.      {
  6.         t_Name[Tmp]=getchar();
  7.         printw("%s",t_Name[Tmp]);
  8.         refresh();
  9.       }
  10.     return t_Name; //return *t_Name ?
  11. }
  12. int main()
  13. {
  14.     //Initialisation ncurses (flemme de tout mettre)
  15.     char Name[15];
  16.     Name=GetName();
  17.     printw("Nom: %s",Name);
  18. }


 
Tu vois à peu pres ?


Message édité par Deather2 le 22-08-2004 à 00:41:02
n°3832
Deather2
OpenBSD: the way to go!
Posté le 22-08-2004 à 00:46:36  profilanswer
 

Code :
  1. g++ -lncurses -Wall -o Rpg ./main.cpp
  2. [...]
  3. CPersonnage.h:76: error: incompatible types in assignment of `const char[7]' to `char[15]' //Name = "XXXX"; c'est dans le constructeur, le nom par défaut que je veut lui donner
  4. In file included from main.cpp:58:
  5. CPersonnage.cpp: In member function `void CPersonnage::CreateCharacter()':
  6. CPersonnage.cpp:280: error: incompatible types in assignment of `char' to `char[15]' // Name = GetName(); ça c'est à l'apel de la fonction char GetName()
  7. CPersonnage.cpp: In function `char AskCharName()':
  8. CPersonnage.cpp:328: error: invalid conversion from `char*' to `char' //return t_Name; Ca c'est dans char GetName()
  9. CPersonnage.cpp:319: warning: address of local variable `t_Name' returned //char t_Name[15]; même chose ici


 
Voilà, si ça peut t'aider c'est les erreurs que me donne GCC
Les commentaire c'est le code C++ associé à l'erreur


Message édité par Deather2 le 22-08-2004 à 00:47:39
n°3833
Lightness1​024
Posté le 22-08-2004 à 01:07:37  profilanswer
 

Name=GetName();
 
ca c'est totalement impossible, la fonction retourne un pointeur, de plus on est pas certain de la valeur du contenu une fois la fonction retournée.
mais si tu veux prendre le risque, ceci sera bien plus efficace:
strcpy(Name, GetName());
mais je te conseille de passer un pointeur a la fonction getname tu n'aurais pas besoin de tableau intermédiaire.
en fait meme je conseille la reference bien plus pratique !
 
GetName(char name& )
{...}
 
:)

n°3834
Deather2
OpenBSD: the way to go!
Posté le 22-08-2004 à 01:10:08  profilanswer
 

Ahhh pas bête ta dernière idée! merci beaucoup! :)
 
Mais dans ce cas je peux la mettre void, elle écrira directement dans Name ? :)

n°3835
Lightness1​024
Posté le 22-08-2004 à 01:11:29  profilanswer
 

voui, exact

n°3837
Deather2
OpenBSD: the way to go!
Posté le 22-08-2004 à 01:37:43  profilanswer
 

Rah, j'en ai marre, comment je peux lui mettre un nom par défaut dans le constructeur ?
 
si je déclare:
char Name[15];
 
impossible de faire:
Name = "Avatar";
ni
Name = {"A","v","a","t","a","r"};  
là il me dis erreur de syntaxe :D
 
:/
 
désolé mais j'ai jamais rien compris à ce bordel... pourraient pas faire un truc plus simple :o :p


Message édité par Deather2 le 22-08-2004 à 01:38:17
n°3838
Lightness1​024
Posté le 22-08-2004 à 01:42:23  profilanswer
 

tu peux faire ceci!
 
strcpy(Name, "avatar" );
 
je m'explique, "avatar" est une chaine constante, et sa valeur  pour le compilo est un pointeur vers sa premiere lettre.
donc tu essayes d'assigner un pointeur a une variable qui ne devrait pas etre modifée de la sorte (etant donnée que c'est un pointeur elle aussi, mais vers de la mémoire déja allouée !!!)
utilise la copie de mémoire (ou la copie de chaine) comme je te le montre


---------------
MOD1:
http://soj.mesdiscussions.net/foru [...] &post=4024
n°3839
Deather2
OpenBSD: the way to go!
Posté le 22-08-2004 à 01:43:22  profilanswer
 

ok, merci! :)
 
edit: strncpy(Name,"Avatar",15);
 
impec :D merci merci!


Message édité par Deather2 le 22-08-2004 à 01:44:14
n°3840
Lightness1​024
Posté le 22-08-2004 à 01:55:50  profilanswer
 

2 rien, si ta d'autres questions pas de pb


---------------
MOD1:
http://soj.mesdiscussions.net/foru [...] &post=4024
n°3842
Deather2
OpenBSD: the way to go!
Posté le 22-08-2004 à 02:12:12  profilanswer
 

Bien :D
en effet, ça compilait sans pb...
et là, qu'est-ce que je vois ?
printw("Nom: %s",Name);
affiche:
Nom: 1
 
en gros, voilà ce qui est fais:
 
char Name[15]
strcpy(Name,"Avatar" );
printw("Nom: %s",Name);
refresh(); (truc spécifique à ncurses au cas où tu connaisses pas ;))
 
Je sèche moi ! :o

n°3843
nicodache
marmotte en chocolat concept ©
Posté le 22-08-2004 à 02:25:20  profilanswer
 

regle un : TOUJOURS mettre les variables en minuscule, surtout dans les langages "bas niveau" (C, pascal, ada, fortran, perl, etc)
 
2. il manque pas un pointeur ?
genre strcpy(&name, "Avatar" );
 
 
je dis ca comme ca, mais je suis pas sur du tout pour la 2eme


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°3845
Deadog
Dain Bramaged
Posté le 22-08-2004 à 02:36:28  profilanswer
 

Ced-2k a écrit :

char Name[15];
 
ou plus proprement
char * Name = malloc(15*sizeof(char));
 
pour le reste je pige pas trop ce que tu veux faire?
 
de plus quand tu veux imprimer une chaine c'est
printw("%s",Name);


 

Code :
  1. char *name = NULL;
  2. ...
  3. if((name = (char *) calloc(15, sizeof(char))) == NULL) {
  4.   printf("Plus de mémoire disponible" );
  5.   GESTION_D'ERREUR_FATAL;
  6. }


 
ça c préférable ...
 
 
deather > je te conseil plutôt de passer par des pointeurs, c moins chiant à utilisé (je trouve personellement)
 
et fait gaffe dans ta boucle, tu n'écris pas le 0 final
 
fait pt le code concerné si tu veux qu'on control après ;)


Message édité par Deadog le 22-08-2004 à 02:42:20

---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°3849
Deather2
OpenBSD: the way to go!
Posté le 22-08-2004 à 03:16:11  profilanswer
 

Bien bien, je vais tester ce que vous m'avez dis.
 
@nicodache: Pourquoi en minuscule ? Perso j'préfère mettre un truc Maj/Min, c'est bien plus lisble et ça pose pas de pb, si ?

n°3850
Deadog
Dain Bramaged
Posté le 22-08-2004 à 03:20:31  profilanswer
 

par convention
 
les maj+min c'est plutôt pour les nom de fonctions et les tout en maj c'est les defines et macros


Message édité par Deadog le 22-08-2004 à 03:20:52

---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°3851
Deather2
OpenBSD: the way to go!
Posté le 22-08-2004 à 03:38:15  profilanswer
 

Ok - cela dis je préfère garder comme ça, j'ai pris cette habitude et j'aime mieux ;)
bon, ça marche toujours pas... voici le code: (j'ai viré tout ce qui sert à rien)

Code :
  1. class CPersonnage
  2. {
  3. private:
  4. char *Name;
  5. public:
  6. CPersonnage()
  7. {
  8.  Name = NULL;
  9.  if((Name = (char *) calloc(15,sizeof(char))) == NULL)
  10.  {
  11.   MsgBox("Plus de mémoire!!",MSGBOX_OK); //Fonction perso
  12.   Quit();
  13.  }
  14.  strcpy(Name,"Avatar" );
  15. }
  16.  char* AskCharName(void);  //ce que j'appelais GetName()
  17. }
  18. char* CPersonnage::AskCharName(void)
  19. {
  20. int Tmp;
  21. char t_Name[15];
  22. printw("Entrez le nom de votre avatar: " );
  23. refresh();
  24. for(Tmp=0;Tmp<15;Tmp++)
  25. {
  26.  t_Name[Tmp]=getch();
  27.  if(t_Name[Tmp]==10)
  28.  {
  29.   t_Name[Tmp]=0;
  30.   break;
  31.  }
  32.  printw("%s",t_Name[Tmp]);
  33.  refresh();
  34. }
  35. return t_Name;
  36. }


 
Bien voilà l'essentiel...
Ça ne marche toujours pas même comme ça, je sais pas trop quoi faire :/
Même si je fais pas apel à AskCharName(), le strcpy dans le constructeur ne marche pas :(

n°3853
ced-2k
TODO : Insert text here.
Posté le 22-08-2004 à 11:08:51  profilanswer
 

et il est ou ton strcpy dans AskCharName lol?
 
sinon juste pour dire que les for avec un break c'est pas très propre :/ ca serait mieux d'utiliser un while ou meme de mettre la condition de sortie t_Name[Tmp]==10 dans le for...

n°3854
Lightness1​024
Posté le 22-08-2004 à 12:12:54  profilanswer
 

mais qu'est ce qu'on les gens avec les boucles et demi ??
moi je trouve pas que il y ait quelquonque probleme avec ca.
 
remarque: n'oublie surtout pas le destructeur avec le delete [] dedans.
 
je vois pas trop a priori pourquoi ca marcherais pas.
aussi j'ai une remarque que j'avais pas écrite plus haut.
printw("%s",t_Name[Tmp]);
cette ligne ne vas pas.
printw("%c",t_Name[Tmp]);
celle la vaca mieux.
a moins d'avoir fait un ZermoMemory sur ton tableaux c'est risqué d'afficher un caractere en tant que chaine si il n'est pas suivi d'un 0 tu risque d'afficher bcp de choses avant d'en trouver.


---------------
MOD1:
http://soj.mesdiscussions.net/foru [...] &post=4024
n°3855
ced-2k
TODO : Insert text here.
Posté le 22-08-2004 à 14:05:59  profilanswer
 

Lightness1024 a écrit :

mais qu'est ce qu'on les gens avec les boucles et demi ??
moi je trouve pas que il y ait quelquonque probleme avec ca.

je trouve que ca fait de la "programmation spagetti", tu break en plein milieu du for, tu repart 10lignes plus bas...
tandis qu'en mettant la condition de sortie dans le for, tu exécute le for le nombre de fois qu'il faut et tu le saute a la fin...
 
c'est plus lisible quoi [:spamafote]

n°3856
Lightness1​024
Posté le 22-08-2004 à 14:30:55  profilanswer
 

je comprend la remarque mais on sait ou ca va, le break et le continue sont 2 elements du langage qui existent parce que certaines fois ya pas d'alternative.
c'est bien moins spagetti qu'un goto par exemple :)
un switch aussi dans ce cas ca serait spagetti, or c'est une structure qui convient quand on a plusieurs cas a traiter aiguillés par les valeurs d'une seule variable ce qui est un cas tout a fait courant je dirais.
dans certaines tres grandes boucles c'est souvent que break est utilisé plutot que d'attendre d'arriver au while ou au for et executer des centaines de lignes qui bugeraient a cause de ce qu'on vient de tester.


---------------
MOD1:
http://soj.mesdiscussions.net/foru [...] &post=4024
n°3857
Deadog
Dain Bramaged
Posté le 22-08-2004 à 15:12:46  profilanswer
 

moi j'utilise un compromit :
utiliser la structure if then else pour passer directement au prochain bouclage et sortir à ce moment la
 
deather > atta, je regarde


---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°3858
Deadog
Dain Bramaged
Posté le 22-08-2004 à 15:34:16  profilanswer
 

Code :
  1. class CPersonnage
  2. {
  3. private:
  4. char *Name=NULL;
  5. public:
  6. CPersonnage()
  7. {
  8.  if((Name = strdup("Avatar" )) == NULL)
  9.  {
  10.   MsgBox("Plus de mémoire!!",MSGBOX_OK); //Fonction perso
  11.   Quit();
  12.  }
  13. }
  14. free(Name);
  15. Name = AskCharName(); // Normallement, AskCharName ne devrait pas renvoyé de NULL
  16. }
  17. char* CPersonnage::AskCharName(void)
  18. {
  19. int Tmp;
  20. char *t_Name;
  21. printw("Entrez le nom de votre avatar: " );
  22. refresh();
  23. if((t_Name = (char *) calloc(16, sizeof(char))) == NULL) { // 16 pour permettre le 0 final
  24.  MsgBox("Plus de mémoire!!",MSGBOX_OK); //Fonction perso
  25.  Quit();
  26. }
  27. if((t_Name = fgets(t_Name, 16, stdin)) == NULL) { // fgets n'existe pê pas sous win // fgets va lire size-1 caractère, ici 16-1=15, il lira 15 caractère et mettera le 0 final
  28.  MsgBox("Erreur de lecture!!",MSGBOX_OK); //Fonction perso
  29.  free(t_Name);
  30.  Quit();
  31. }
  32. return t_Name;
  33. }


 
 
bon, c'est fait en C style et pour du nux :D tu adapteras ;)


Message édité par Deadog le 22-08-2004 à 15:34:53

---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°3859
Lightness1​024
Posté le 22-08-2004 à 16:25:14  profilanswer
 

fgets fait partie de la librairie standard, t'inkete ca marche sous win.
perso pour les allocations je préfere new et delete [].
 
autre chose, ce code a l'air bizare ? ya du code dans une déclaration de classe ?
euh..


---------------
MOD1:
http://soj.mesdiscussions.net/foru [...] &post=4024
n°3860
Deadog
Dain Bramaged
Posté le 22-08-2004 à 16:27:29  profilanswer
 

--> à destination du constructeur :d mais la c'est l'algo du constructeur qui est à revoir
 
new et delete, c'est sur, mais je fais plus souvant du C que du C++ alors je garde mes habitudes :p


Message édité par Deadog le 22-08-2004 à 16:28:55

---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°3861
Deather2
OpenBSD: the way to go!
Posté le 22-08-2004 à 16:59:25  profilanswer
 

Y'a du code dans le constructeur mais sinon j'ai tout mis le code dans un .cpp ;)
je vais voir pour fgets, mais je code ça sous linux pas sous windows, enfin ça doit être pareil ;)
 
Sinon, faudra qu'on m'explique new et delete car je connais pas du tout, en attendant je googelize :D

n°3862
Deadog
Dain Bramaged
Posté le 22-08-2004 à 17:34:13  profilanswer
 

deather2 a écrit :


Sinon, faudra qu'on m'explique new et delete car je connais pas du tout, en attendant je googelize :D


 
 
 [:alex666]


Message édité par Deadog le 22-08-2004 à 17:35:52

---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°3863
Lightness1​024
Posté le 22-08-2004 à 17:53:20  profilanswer
 

c'est les operateurs d'allocation dynamiques intégrés au C++


---------------
MOD1:
http://soj.mesdiscussions.net/foru [...] &post=4024
n°3864
Deather2
OpenBSD: the way to go!
Posté le 22-08-2004 à 18:17:06  profilanswer
 

Qu'est-ce qu'il y'a Deadog ? :p
--
Ok, en gros faut que je fasse:

Code :
  1. char *Name = new char;
  2. strcpy(Name,"Nomduperso" );


 
et là ça devrait être bon ? :)
 
ps: ohh j'oubliais:

Code :
  1. delete Name;

à foutre dans le destructeur ? (j'sais pu si ca s'apel comme ça lol)


Message édité par Deather2 le 22-08-2004 à 18:19:41
n°3865
Lightness1​024
Posté le 22-08-2004 à 20:00:46  profilanswer
 

attention, si tu fais new char;
tu obtient une variable de type caractere.
ici on veut un tableau de char (une chaine)
donc:
char *Name = new char[16];
 
...
 
delete [] Name;
Name = NULL;


---------------
MOD1:
http://soj.mesdiscussions.net/foru [...] &post=4024
n°3866
Deather2
OpenBSD: the way to go!
Posté le 22-08-2004 à 23:15:02  profilanswer
 

C'est bon j'ai réussi à faire ce que je voulais, je me plantait simplement à l'affichage :)
 
il suffit juste que je fasse un tableau:
 
char Name[15];
 
strcpy(Name,"Nom" );
 
printw("%s",Name);
 
 
impec :) merci à tous!


Message édité par Deather2 le 22-08-2004 à 23:15:51
n°3870
Deather2
OpenBSD: the way to go!
Posté le 23-08-2004 à 05:41:49  profilanswer
 

bon le plus dur est fais, reste un truc qui m'embête:
pour remplir le tableau je fais:
 

Code :
  1. for(Tmp=0;Tmp<15;Tmp++)
  2. {
  3.     t_Name[Tmp]=getch();
  4.     printw("%s", t_Name[Tmp);
  5.     refresh();
  6. }


 
et là j'ai droit à un beau segmentation fault, je comprend pas pourquoi :/


Message édité par Deather2 le 23-08-2004 à 05:42:23
n°3872
Deadog
Dain Bramaged
Posté le 23-08-2004 à 13:33:13  profilanswer
 

pfff, mais t'écoute pas ce kon te dit :/


Message édité par Deadog le 23-08-2004 à 13:33:20

---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°3874
Deather2
OpenBSD: the way to go!
Posté le 23-08-2004 à 17:42:27  profilanswer
 

Arf désolé j'avais zappé ton post :/
Excuse moi, je regarde ça de suite, merci bcp :)
Et de toute façon moi aussi c'est sous nux donc pas de pb ;)

n°3875
Deather2
OpenBSD: the way to go!
Posté le 23-08-2004 à 17:52:06  profilanswer
 

Je te remerci, ça marche (presque!) :)
En fait, le problème c'est que j'utilise ncurses, donc que pour rafraichir l'écran il faut faire appel à refresh(); et que fgets ne le fait pas (logique)
Autre chose, quand on appuie sur entrée ça ne s'arrête pas, enfin c'est déjà un bon début ;)


Message édité par Deather2 le 23-08-2004 à 17:52:43
n°3877
Deadog
Dain Bramaged
Posté le 24-08-2004 à 00:34:43  profilanswer
 

Code :
  1. char machaine[16], c;
  2. int ind=0;
  3. while((c=fgetc(stdin)) != EOF && c != '\n' && ind < 15) {
  4.   machaine[ind] = c;
  5.   printw("%c", c);
  6. refresh();
  7. }
  8. machaine[ind+1] = 0;


 
mais bon, doit y avoir plus simple je pense, quand même, dans les ncurses ?


Message édité par Deadog le 24-08-2004 à 00:35:33

---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°3879
Deather2
OpenBSD: the way to go!
Posté le 24-08-2004 à 04:30:36  profilanswer
 

Code :
  1. char* CPersonnage::AskCharName(void)
  2. {
  3. int Tmp;
  4. char *t_Name,Tmp_char;
  5. printw("Entrez le nom de votre avatar: " );
  6. refresh();
  7. if((t_Name = (char *)calloc(16,sizeof(char))) == NULL)
  8. {
  9.  MsgBox("Plus de mmoire !",MSGBOX_OK);
  10.  Quit();
  11. }
  12. for(Tmp=0;Tmp<15;Tmp++)
  13. {
  14.  if((Tmp_char=getch())!=10)
  15.  {
  16.   t_Name[Tmp]=Tmp_char;
  17.   cout << Tmp_char;
  18.   refresh();
  19.  } else
  20.  {
  21.   t_Name[Tmp]='\0';
  22.   break;
  23.  }
  24. }
  25. free(t_Name);
  26. return t_Name;
  27. }


 
j'ai mis ça et ça marche ... je sais pas pourquoi printf et printw me faisais des Segmentation fault .. merci à tous! :)

n°3881
Deather2
OpenBSD: the way to go!
Posté le 24-08-2004 à 09:52:21  profilanswer
 

Juste une dernière petite question qui m'ennuie...
comme vous le voyez je libère la mémoire de t_Name avant le return... donc il ne retourne que dalle :/
Et le free(t_Name); après le return ne servirait à rien si ?
 
je suis un peu embété la :/

n°3882
ced-2k
TODO : Insert text here.
Posté le 24-08-2004 à 10:26:11  profilanswer
 

tu n'es pas embeté car vu que t_Name est un pointeur tu peux le libérer ou tu veux... meme hors de la fonction AskCharName :)

n°3885
Deadog
Dain Bramaged
Posté le 24-08-2004 à 13:24:33  profilanswer
 

si tenté qu'il transmette le pointeur ...
 
bon, deather, t'écoute un peu !
ton printf/printw segfaulté pke tu faisait un %s alors que tu lui passé qu'un seul caractère (t_Name[Tmp] si j'me souviens bien)
ça on te l'avais déjà dit :d
 
ensuite, dans ta boucle la :
for(Tmp=0;Tmp<15;Tmp++)
     {
        if((Tmp_char=getch())!=10)
        {
           t_Name[Tmp]=Tmp_char;
           cout << Tmp_char;
           refresh();
        } else
        {
           t_Name[Tmp]='\0';
           break;
        }
     }  
 
tu fais tjrs pas attention à ton 0 final !
tu le met bien quand on fait entrer, mais si jamais tu arrive au bout de la boucle sans jamais avoir fait d'entré, tu sors de la boucle et tu te retrouve avec une chaîne sans 0 final :/
 
 
pis remplace Tmp_char=getch())!=10 par Tmp_char=getch())!='\n' ;)


Message édité par Deadog le 24-08-2004 à 13:24:54

---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

mood
Google
Posté le 24-08-2004 à 13:24:33  profilanswer
 

 Page :  1  2
Page Précédente 

Aller à :
Ajouter une réponse

  FORUM Syndrome-OC - Jacky-PC


  Programmation


  Autre


  [C++] Tableaux, pointeurs, l'embrouille : Besoin d'aide

 

Hit Parade