Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Mots clés Nom d'utilisateur
Messages sans réponse

[C++] passage par pointeur

Char Snipeur, le mercredi 15 novembre 2006 à 17:33:11 
 Signaler ce message aux modérateurs

Bonjour,
Je m'en remet aux experts, parceque là je sèche...
j'ai une fonction :

void f(char* ch=0)
     {
       ch=new char[6];
      strcpy(ch,"essai");
      }

Dans le main, je fait :
char* ch="abcde";
f(ch);

en fesant des sorties ecran, ch vaut bien "abcde" avant la fonction f, MAIS aussi après !
Or en passant un pointeur je me serai attendu à ce que la valeur de ch soit modifer ! En fesant des sortie dans la fonction, ch est bien modifier.
J'ai donc fait les sortie des adresses. Il se trouve que l'adresse qui est passer à la fonction est différent de celle du main.
L'adresse est bien modifier dans f par l'opérateur new, mais la modif n'est pas reporter dans le ch du main.
Bref, c'est à perdre son C++ de base.
Pour moi, quand on passe un pointeur, on passe un pointeur !! et pas un nouvel objet créer spécialement pour la fonction et initialiser avec la valeur pointé par le pointeur passé en argument. Salutation !
Char Snipeur

1

kij_82, le mercredi 15 novembre 2006 à 18:04:28
  • +1

Il faut signaler que tu veux updater et donc reprendre la nouvelle valeur dans ton main, sinon, comme tu as peu le voir, la valeur dans le main ne changera pas pour ta variable 'ch', mais uniquement en local, dans ta fonction.
En C, je sais qu'il suffit de placer un '&' dans l'appel de fonction, juste devant la variable a reprendre, c'est à dire 'ch' pour toi :

char* ch="abcde";
f(&ch);


Mais je crois qu'en C++ les pointeurs sont gérés différemment non ?
En tout cas ton erreur viens de là, essai ca avec des sorties et ca devrait aller mieux.
~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82

2

Char Snipeur, le jeudi 16 novembre 2006 à 10:29:06
  • +1

Salut.
Merci de ta réponse, mais comme je m'y attendai, si tu met f(&ch) le compilateur te dit qu'il ne peut convertir char** en char*
en effet, si ch est un (char*) &ch est un (char**)
je ne comprend pas. ce problème plus un autre me fait douter de mon compilateur . gcc 3.2.3 Salutation !
Char Snipeur

Répondre à Char Snipeur

3

Char Snipeur, le jeudi 16 novembre 2006 à 12:49:39
  • +1

J'ai trouvé la solution !
En fait, j'ai mal regarder, la valeur du pointeur est bien passer.
Or un passage par pointeur permet de modifier la valeur pointé, par contre dans f(char* g) g est bien une nouvelle variable prenant comme valeur la valeur du pointeur (l'adresse) par contre si dans la fonction on modifie ce 'g', l'effet ne ce fait pas sentir sur la variable passer en argument. En revanche modifié *g modifiera la valeur pointer par la variable passé à la fonction.
Et en fait, quand on fait char * f="essai", f pointe vers un "const char", il est alors impossible de modifié '*f' (en tout cas c'est la conclusion que je tire de l'erreur de segmentation lorsque je fait f[0]='f').
Au final, comme préconiser par tout le monde, il faut bien faire :
char*ch; strcpy(ch,"essai"); (et oui, on me l'avai bien dit)
en esperant avoir été à peu près clair Salutation !
Char Snipeur

Répondre à Char Snipeur

4

kij_82, le jeudi 16 novembre 2006 à 14:00:16
  • +1

Exact :)
~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~

Répondre à kij_82

5

 mamiemando, le jeudi 16 novembre 2006 à 15:06:01
  • +1

Rappels sur les const

Il ne faut pas confondre un :
const char * (la chaine pointée est constante)
char * const (le pointeur est constant)
const char * const (les deux sont constants)

Pour ton problème...

Je rappelle qu'en C++ tu peux utiliser les référence et encore mieux les std::string :

#include <string>

void f(std::string & s=""){
  s = "essai";
}


Références et pointeurs

A noter que en C et en C++ les paramètres sont des recopies.
- un passage par pointeur va consister à empiler l'adresse de la variable pointée. Cette adresse est recopiée en mémoire mais pas la zone pointée. C'est pour ça qu'en C / C++ on utilise des pointeurs ou des références pour modifier la valeur d'un paramètre (plus exactement la valeur d'une variable pointée par un paramètre).
- on doit au maximum utiliser les références pour que le programme ne perde pas du temps à recopier inutilement des paramètre. Par exemple si je manipule un graphe de grande taille :
void f(graph_t & g); // rapide
void g(graph_t * g); // rapide
void h(graph_t g): // lent !!! car on recopie le graphe à chaque appel de h


Et les const...

Il faut par ailleurs veiller à bien mettre les const (cf début du post) quand ils sont justifiés. Typiquement :
#include <string>
#include <iostream>

void affiche(std::string & s){
  std::cout << s << std::endl;
}

void affiche2(const std::string & s){
  std::cout << s << std::endl;
}

int main(){
  const std::string s = "plop";
  affiche(s); //erreur de compilation car affiche de garantit pas la constance
  affiche2(s); //ok
  return 0;
}

Bonne chance

Répondre à mamiemando
Langage C++ - Les pointeurs Comme en langage C, le langage C++ permet d'utiliser des pointeurs pour manipuler des données, mais il introduit aussi le concept de référence, très pratique pour permettre la modification d'une donnée passée en paramètre d'une fonction. Définition... www.commentcamarche.net/contents/cpp/cpppoint.php3
Pointeur de structure dans fonction C (Résolu) Salut à tous, j'ai une fonction InsereDansListe rien de plus normal qui doit commme son nom l'indique inserer un pointeur vers un element dans une liste. Le probleme c'est que lorsque je passe un pointeur sur une liste vide ou même pleine et que... www.commentcamarche.net/forum/affich-2513913-pointeur-de-structure-dans-fonction-c
[C] pointeur tableau et fonction (Résolu) Bonjour ! Je suis en train de programmer en C pour un logiciel, et je me retrouve face a un petit probleme de passage d'argument dans une fonction. En fait je declare un pointeur de plusieurs entiers, et un pointeur de plusieurs tableaux de 10000... www.commentcamarche.net/forum/affich-2442403-c-pointeur-tableau-et-fonction
Les piles en langage CLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage... www.commentcamarche.net/faq/sujet-8283-les-piles-en-langage-c
[Programmation] Conventions de passage de paramètres sous x86Les conventions de passage de paramètres sous x86 Introduction Cdecl Stdcall Fastcall Register Pascal Sources de ce document et liens Lorsqu'un programme est compilé pour une architecture x86, le passage de paramètres pour... www.commentcamarche.net/faq/sujet-4874-programmation-conventions-de-passage-de-parametres-sous-x86
[C] Passer l'adresse d'une structure (Résolu)Bonjours, alors voilà, j'ai un client / serveur C. Le client passe une requete SQL (sous format texte) au serveur apres connecion. Le serveur est chargé de lancer un module Perl qui effectue une connexion à une base de données et exécute la requete... www.commentcamarche.net/forum/affich-1566882-c-passer-l-adresse-d-une-structure
C liberer pointeur structurebonsoir, comment fais ton en C pour liberer un pointeur de structure free(P_STRUCT); genere une erreur du debbugeur "failure assertrion failed" merci de votre aide jeremie jerelium@free.fr www.commentcamarche.net/forum/affich-301429-c-liberer-pointeur-structure
Passage de paramètres (language C)Bonjour, J'ai un petit problème en language C. Comment dois-je transmettre un tableau déclaré dans le main à une fonction en utilisant les indices et non les pointeurs ? void chargertableau (int); void main() { int tab[5][5]; chargertableau(?????);... www.commentcamarche.net/forum/affich-3779305-passage-de-parametres-language-c
Télécharger Advanced PDF Password RecoveryBon nombres des fichiers PDF disponible sur Internet possèdent des restrictions d'utilisation (impression, modification, copie). Quand ils comportent le fameux cadenas, c'est que le document est sous restriction. Advanced PDF Password Recovery est un... www.commentcamarche.net/telecharger/telecharger-34059301-advanced-pdf-password-recovery
Télécharger Outlook Express Password RevealerOutlook Express Password Revealer est un outil qui permet aux utilisateurs d’Outlook de récupérer leur logins et leurs mots de passes. L’outil est aussi capable de rechercher les dossiers personnels enregistrés dans Ms Outlook. Doté... www.commentcamarche.net/telecharger/telecharger-34060189-outlook-express-password-revealer
Les pointeurs en langage CDéfinition d'un pointeur Un pointeur est une variable contenant l'adresse d'une autre variable d'un type donné. La notion de pointeur fait souvent peur car il s'agit d'une technique de programmation très puissante, permettant de définir des... www.commentcamarche.net/contents/c/cpoint.php3
Langage C++ - Les types de donnéesLes 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... www.commentcamarche.net/contents/cpp/cpptype.php3
Langage C - Les listes chaînéesLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée... www.commentcamarche.net/contents/c/cliste.php3