Rechercher : dans
Par :

Problème C++ const

Dernière réponse le 31 oct 2007 à 18:25:37 choco, le 17 mai 2005 à 17:11:37 
 Signaler ce message aux modérateurs

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 ...

Meilleures réponses pour « problème C++ const » dans :
Langage C - Les variables Voir Le concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C sont typées, c'est-à-dire que les données contenues dans...
Langage C++ - Les variables Voir Le concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C++ sont typées, c'est-à-dire que les données contenues dans...
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
Les templates en C++ VoirIntroduction Avantages Inconvénients Quand utiliser des templates ? Que dois-je mettre dans les .hpp et dans les .cpp ? Convention de notations Quelques templates célèbres STL BGL Premiers pas Spécifications de templates Template par...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...

1

blurk, le 17 mai 2005 à 17:57:36

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 ¤

Répondre à blurk

2

mamiemando, le 17 mai 2005 à 18:27:15

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

Répondre à mamiemando

3

SKZ, le 17 mai 2005 à 21:24:56

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 !!!

Répondre à SKZ

4

mamiemando, le 18 mai 2005 à 09:15:36

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)

Répondre à mamiemando

5

noobinc++, le 25 jui 2006 à 23:05:11

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!

Répondre à noobinc++

6

mamiemando, le 26 jui 2006 à 00:13:19

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

Répondre à mamiemando

7

Char Snipeur, le 26 jui 2006 à 08:48:35

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. Salutation !
Char Snipeur

Répondre à Char Snipeur

8

mamiemando, le 26 jui 2006 à 09:32:54

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

Répondre à mamiemando

9

Char Snipeur, le 26 jui 2006 à 17:31:19

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... Salutation !
Char Snipeur

Répondre à Char Snipeur

10

mamiemando, le 26 jui 2006 à 18:12:20

Ben si ce sont des char ouui... Mais la on a juste parlé de char * ?

Répondre à mamiemando

13

Char Snipeur, le 27 jui 2006 à 09:07:52

Dans le message original de choco, j'ai beau le relire, je ne voi vraiment pas de * Salutation !
Char Snipeur

Répondre à Char Snipeur

14

mamiemando, le 27 jui 2006 à 09:38:46

En fait dans ce topic il y a deux questions, celle de choco et celle de noobinc++.

Répondre à mamiemando

11

noobinc++, le 26 jui 2006 à 20:48:01

MERCI mamiemando, c'est au poil.... mais j'avoue ne pas avoir tout compris sur ce coup là!!

Répondre à noobinc++

12

mamiemando, le 26 jui 2006 à 21:21:53

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

Répondre à mamiemando

15

 pffff, le 31 oct 2007 à 18:25:37

Que des boulets

Répondre à pffff