Manip' des variables du type char...

Signaler
Messages postés
18
Date d'inscription
mardi 19 février 2002
Statut
Membre
Dernière intervention
3 juin 2004
-
Messages postés
18
Date d'inscription
mardi 19 février 2002
Statut
Membre
Dernière intervention
3 juin 2004
-
J'ai d'eternels problemes pour manipuler les variables char, const char etc...
quand je veux faire passer un argument char a un fonction j'ai souvent des erreurs du genre impossible de convertir en const char...je defini en const char ma variable mais erreur "impossible de convetir const char en const char".
qqun a t'il une bonne adresse ou un bon tut' a me conseiller?
dois-je utiliser les pointeurs ou qqchose comme ca pour manipuler correctement ce type de données...?
je vous serai reconnaissant d'un ptit coup de pouce car ces erreurs me rendent la vie impossible.....argh!
DJeS

12 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Mets un exemple d'erreur, sera plus facile a demarrer une explication.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
18
Date d'inscription
mardi 19 février 2002
Statut
Membre
Dernière intervention
3 juin 2004

oui et bien voila un exemple. je suis sous dec++ 4.9.8.0
je veux pouvoir me connecter avec une socket a une adresse determiner par un utilisateur avec les fct cout et cin de iostream.
sur la ligne :
sin.sin_addr.s_addr = inet_addr(adresse); //adresse étant la variable censée contenir l'adresse
si je la definie en char, ca ne marche evidemment pas puisque il faut un type const char. si je la defini en tant que const char, il me met "uninitialized const 'adress' ", sans doute logiquement puisque ma constante n'en est pas vraiment une....
en bref, j'ai un probleme entre le type de variable utilisée pour la saisie de donnée en entrée clavier en console,
et son utilisation avec des fonctions qui recquiert un certain type de variable...cela doit etre idiot mais j'avoue que ca me bloque...

PS: dites moi si vous n'avez pas compris ma nouvelle explication ;-)
DJeS
Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
2
char *adresse = "127.0.0.1";

ou encore
char adresse[32];
strcpy(adresse, "127.0.0.1");

La deuxieme forme est préférable si tu compte modifier la variable

PS : la transormation en const char* se fait automatiquement si tu lui passe un char*, tu ne doit pas avoir d'erreur de compil. Tu ne lui passait pas des char tt court par hasard (1 seul caractère) ?
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
inet_addr() prend 'const char*' POINTEUR !!! en NON char.

le const indique simplement qu'il ne modifiera pas les octets references par le pointeur que tu passeras, rien d'autre.

char adresse[260];
ou un pointeur resultant d'une alloc dynamique, tout ceci sera valable comme param.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
18
Date d'inscription
mardi 19 février 2002
Statut
Membre
Dernière intervention
3 juin 2004

Merci beaucoup ca marche comme sur des roulettes apres qq experimentations...
non anacr0x ce n'est pas que je n'envoyait qu'un char tout court comme tu dis mais que effectivement, je ne lui passait pas un pointeur et une variable...merci bcp pr vos reponses...j'ai notamment appris que char variable[30] etait conesidéré comme un pointeur char *variable. sauf que dans le premier cas, on "monopolise" 30 octets tandis que dans le dernier c'est" dynamique" et le programme adapte l'espace memoire reservé a la variable...c ca? cependant je ne comprend pas tres bien comment fonctionne l'allocation dynamique pr que tout ne se marche pas dessus (debordement de tampon)...
merci

DJeS
Messages postés
18
Date d'inscription
mardi 19 février 2002
Statut
Membre
Dernière intervention
3 juin 2004

"je ne lui passait pas un pointeur et une variable"...
euh en fait c plutot :
je lui passait une variable et non un pointeur

DJeS
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Fais gaffe que
char *truc;
n'a rien de dynamique de lui meme, il faut allouer l'espace memoir.
truc = (char*) malloc(tailleVoulue);

sinon il ne pointe sur rien de defini et c'est la cata assuree.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
18
Date d'inscription
mardi 19 février 2002
Statut
Membre
Dernière intervention
3 juin 2004

ah d'accord...et si je fais

char machin;
int fct(char *truc)
{
send(socket,truc, strlen(truc),0);
}

fct(machin);

ca doit marcher nan ?
le pointeur *truc on s'en occupe pas vraiment si?
DJeS
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
*truc DOIT etre alloue AVANT emploi sinon exception memoire a tout coup.
Rien n'est implicite dans la gestion de la memoire.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
18
Date d'inscription
mardi 19 février 2002
Statut
Membre
Dernière intervention
3 juin 2004

"Rien n'est implicite dans la gestion de la memoire."
sonne comme un adage que je vais retenir...d'accord ok mer ci beaucoup...
je l'alloue...dans la fonction (fct dans ce cas)?
mais finalement
char truc[40]
est en fait un raccourci de
char *truc;
truc = (char *)malloc(40); ?

DJeS
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
'quasi' idem mais char truc[40] n'a pas a etre desalloue car il n'y a pas d'allocation, juste une reserve sur la pile par abaissement du registre ESP, le compilo mettra tout seul le code pour replacer correctement.
Par contre tout malloc doit etr suivi a un moment ou un autre du free pour liberer la memoire.
Faut lire un bon bouquin de C, indispensable.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
18
Date d'inscription
mardi 19 février 2002
Statut
Membre
Dernière intervention
3 juin 2004

ok et bien merci bcp en tout cas de tes reponses...si tu as une bonne reference de bouquin je suis preneur ;-)

DJeS