Problème C++ const

Résolu/Fermé
choco - 17 mai 2005 à 17:11
 pffff - 31 oct. 2007 à 18:25
Bonjour, voila mon problème.
J'utilise une fonction qui me renvoie un const char.
seulement si je veux faire un strcpy avec un char ca ne marche pas.

exemple :

const char dest;
char source;
strcpy(dest,source);

Comment puis je faire pour réaliser mon strcpy, sachant que je récupère un const char et que je ne peut pas changer le char source (je ne peut pas le mettre en const).
merci d'avance pour votre aide ...

12 réponses

blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
17 mai 2005 à 17:57
salut

par définition, toute variable préfixée du type const ne peut pas être modifiée.

il est donc vain de tenter de copier quoi que ce soit dans une constante:
strcpy(const char * cible, char * source);


cela n'a dailleurs aucun intérêt.
pour travailler sur le contenu d'une constante, on le copie dans une variable
strcpy(chaine_cible, constante_chaine);

d'ailleurs je ne vois pas comment ni pourquoi on pourait modifier le retour d'une fonction après son exécution.

constante: qui ne change pas
variable : qui change

cordialement
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
17 mai 2005 à 18:27
Tu précise un type const dans un prototype de fonction pour garantir qu'un paramètre ne sera pas modifier :

Paramètre classique :

void f(int const i){
...
}

Pour une méthode m de la classe C, rendre "const" le "this"

void C::m(int i) const{
...
}

Le paramètre en question n'a pas besoin d'être const pour être pris. Le seul cas ou un const est nécessaire dans un prototype c'est lorsque tu dois appeler ta méthode sur un paramètre qui lui est const.

Ex :
void f(int const i){
...
g(i); // g doit avoir le prototype g(int const i) pour garantir que i reste constant
...
}

Bonne chance
0
const char dest;
char source;
strcpy(dest,source);

Hum !!! Même sans les problèmes de 'const', ça marcherais déjà mieux avec des char*...

Utilise une chaine de copie temporaire...

J'utilise une fonction qui me renvoie un const char.
seulement si je veux faire un strcpy avec un char ca ne marche pas.

Pourquoi tu veux écraser une variable qui de toute façon ne t'appartient pas ??
Elle a fait quoi pour ça ??
Faut bien comprendre que le const char* qui t'es renvoié est const car il dans l'espace de donnée d'une fonction, qui lui appartient, alors retroune travailler dans ton espace mémoire et arrête d'embêter les fontions système, sinon, je vais le dire au contrôleur d'interruption pour qu'il te balance des Division par Zéro dans la gl, non mais !!!
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
18 mai 2005 à 09:15
segfault la skz !!! Un peu de sérieux, t'as pas alloué ton dest ;o) Bon et perso en c++ j'utilise jamais les char *... Les strings c'est sympa !!! ;o)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
noobinc++ Messages postés 2 Date d'inscription mardi 25 juillet 2006 Statut Membre Dernière intervention 26 juillet 2006
25 juil. 2006 à 23:05
Bonjour, j'ai aussi un pb de const char mais un peu différent. Je veux bien une explication et/ou une aide.

Voilà le descriptif du problème :

j'ai une chaine de caractère défini dans un const char * (avec chaine[255])

une fonction qui extrait une partie de cette chaine avec un indice inf et un indice sup (perso ou strncpy) dans un char *temp (donc pas const)
malheureusement, il me retourne "...ceque je voulais suivi de Ù".
Pourquoi ai-je ce Ù?
Si je fais cela avec temp en tant que const (taille fixée), je n'ai pas ce Ù.
MAis j'ai besoin bien sûr d'une taille dynamique...
au final, je dois faire un strcpy... mais avec un char* comme source, il n'aime pas trop...

PS : J'ai aussi essayé la conversion forcée... sans succès!
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
26 juil. 2006 à 00:13
Peux tu me donner le morceau de code ?
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strcpy.3.html

A priori ça ça doit marcher:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main(){
  char * src = "plop plop";
  char * dst = (char *)calloc(sizeof(char)*255);
  strcpy(dst,(const char *) src);
  free(src);
  free(dst);
  printf("src = [%s]\n",src);
  printf("dst = [%s]\n",dst);
  printf("press any key\n");
  getchar();
  return 0;
}

Bonne chance
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
26 juil. 2006 à 08:48
choco.
si tu n'utilise pas des pointeurs, pas la peine de passer par strcpy !
tu fait directement dest=src, à condition que det ne soit pas const.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
26 juil. 2006 à 09:32
Tout dépend de ce qu'il veut faire. S'il fait un sec = dst, modifier *src modifiera aussi *dst (et réciproquement) je ne sais pas si c'est ce qu'il veut faire.

Bonne chance
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
26 juil. 2006 à 17:31
La je voi pas.
Je suis daccord si tu définie char* dest et char* src
dest=src modifiera alors les deux en même temps par la suite.
Par contre, si tu fait char dest,src;
dest=src ne devrai pas modifier par la suite.
comme int a=0,b=1;
a=b;
b=2;
alors on a a==1 et b==2
si on utilise int* à la place on a :
a==b==2;
Ou alors j'ai rien compris à la base du C/C++ au niveau des char...
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
26 juil. 2006 à 18:12
Ben si ce sont des char ouui... Mais la on a juste parlé de char * ?
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
27 juil. 2006 à 09:07
dans le message original de choco, j'ai beau le relire, je ne voi vraiment pas de *
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749 > Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023
27 juil. 2006 à 09:38
En fait dans ce topic il y a deux questions, celle de choco et celle de noobinc++.
0
noobinc++ Messages postés 2 Date d'inscription mardi 25 juillet 2006 Statut Membre Dernière intervention 26 juillet 2006
26 juil. 2006 à 20:48
MERCI mamiemando, c'est au poil.... mais j'avoue ne pas avoir tout compris sur ce coup là!!
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
26 juil. 2006 à 21:21
Ben dis moi ce que tu n'as pas compris et je tenterais de t'expliquer. En gros l'idée c'est qu'on peut caster d'un objet "non const" vers un objet "const" mais pas le contraire (et même si c'est possible il faut pas le faire :p).

Lorsqu'un objet est déclaré const dans le prototype d'une fonction comme c'est le cas pour toi, cette fonction te garantit que ce paramètre ne sera pas modifié. En effet :
1) const char * = char const * = les chars pointés par le char * sont maintenus constant
2) char * const = le pointeur char * est maintenu constant mais pas les chars pointés
3) const char * const = char const * const = tout est maintenu constant.

Ceci dit ca ne sert à rien car le pointeur est recopié sur la pile lors de l'appel de la fonction donc de toute façon même si strcpy changeait ce pointeur ça n'aurait pas d'impact sur le reste du programme. On peut donc se passer de ce deuxième const qui ne sert en fait à rien.

Partant de là on comprend aisément que la chaine source est en toute logique garantie constante par la fonction strcpy. C'est donc bien un const char *. Alors pourquoi les gens du C on mis ce const ? Tout simplement si tu appellès strcpy avec pour source un const char *. En effet si le const ne figurait pas dans le prototype, gcc refuserait de compiler car strcpy ne garantirait plus la constance de cette source.

Exemple :

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void f(const char * src){
  char * plop = (char *)malloc(sizeof(char)*strlen(src));
  strcpy(plop,src); // Ici on a besoin de garantir la constance de src
  printf("%s\n",plop);
  free(plop);
}

int main(){
  const char *src="j'aime les tapirs";
  f(src);
  return 0;
}

J'espère que c'est plus clair pour toi sinon n'hesite pas à demander des precisions.

Bonne chance
0
Que des boulets
0