Passage d'un char[] par reference [Résolu]

Signaler
Messages postés
268
Date d'inscription
vendredi 30 avril 2004
Statut
Membre
Dernière intervention
13 mai 2013
-
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
-
Bonsoir a tous, j'ai un problème que je n'arrive pas à comprendre.
Je programme depuis peu sous dev c++, et j'ai une syntaxe que j'utilisai sous borland qui n'est pas acceptée par dev:
voici l'erreur que me renvoi dev:
152 L:\Programation\Mes Programme c++\AlertoRage\main.cpp invalid initialization of non-const reference of type 'char*&' from a temporary of type 'char*' .

voici mon code:

{
char Donnees[2048];
 Recup_Donnees(Donnees);// Ligne 152,apparement l'erreur vien d'ici
//reste du code
}

et la déclaration de Recup_Donnees:
void Recup_Donnees(char* &reponse);

Cette syntaxe marchait parfaitement sous borland je l'ai utilisée plusieur fois.
Je ne comprends pas ce qu'est cette erreur.
Quelqu'un pourrait m'aider?
merci

10 réponses

Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Remplace tt simplement
void Recup_Donnees(char* &reponse);
par void Recup_Donnees(char* reponse);

Neo_Fr
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Non. Il ne s'agit pas du tout de la même chose.
L'équivalent de char *& est char **.

Ceci dit, on ne peut pas faire passer un tableau pour l'adresse d'un pointeur pour la raison qu'un tableau est qu'une zone mémoire accessibles via un index.

tab == &tab[0];
Ce n'est pas un pointeur en tant que tel.

Je ne vois pas trop comment expliquer alors pour faire simple, je vais essayer de vulgariser un peu:
Un pointeur est une variable stockant l'adresse d'une zone mémoire.
Un tableau est une zone mémoire.

Quand une fonction demande un char ** par exemple, c'est pour, généralement, modifier l'adresse où pointe un pointeur.
Mais un tableau est déjà une zone mémoire. Impossible de modifier son emplacement.

Je ne sais pas si c'était clair. Comme je l'avais déjà dis, je suis assez nul pour expliquer ce genre de chose.

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
"tab == &tab[0];"
&tab == &tab[0]
Le résultat est le même mais bon, pour être plus clair...

oublie le ;
Ce n'était qu'un réflexe.

C++ (@++)<!--
Messages postés
268
Date d'inscription
vendredi 30 avril 2004
Statut
Membre
Dernière intervention
13 mai 2013
2
Heu je patoge un peu dans ton explication (faut le temps que ça monte au cerveau surtout a cette heure-ci ), donc en faite si j'ai bien compris c'etais l'adresse de mon pointeur que ma fonction récuperrai et non pas la valeur de Données?!

j'expose juste mon résonement merci de me reprendre là ou je me plante:
reponse pointe sur Donnees qui est un tableau de caractères dans lequel je vais écrire.

je pense que je dit une connerie là!!!

PS:
par contre ce que je n'arrive pas du tout a comprendre c'est pourquoi
quand je faisait ça avec borland il n'y avait aucun problème?

Merci pour votre aide a tous les deux.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Aucune idée pourquoi ça fonctionnait avec Borland. Peut-être en faisait-il un pointeur je sais pas.

Ce que je dis c'est qu'un pointeur, on peut extraire son adresse, car c'est une variable. Pas un tableau, car c'est une zone mémoire. L'adresse que l'on obtient quand on fait &tab correspond à l'adresse de sa première case (&tab[0]). Ce n'est pas un pointeur, c'est un emplacement mémoire.

En ultra simple et résumé : on peut modifier où pointe un pointeur mais pas un tableau. Voilà.

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Je peux déduire que si tu as accepté la réponse de neo_fr, c'est que ta fonction Recup_Donnees ne fait qu'une copie dans un buffer.
Si c'est le cas, tu n'avais pas du tout besoin de référence.

C++ (@++)<!--
Messages postés
268
Date d'inscription
vendredi 30 avril 2004
Statut
Membre
Dernière intervention
13 mai 2013
2
Ben non et c'est bien ça que je ne comprend pas j'avais bel et bien besoin d'un reference, ce n'est pas une copie dont j'ai besoin, mais Recup_Donnees doit me charger la variable que je lui passe par référence,là j'avoue ne plus trop comprendre!
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Post le code de Recup_Donnees pour voir

Neo_Fr
Messages postés
268
Date d'inscription
vendredi 30 avril 2004
Statut
Membre
Dernière intervention
13 mai 2013
2
WSAStartup(0x0202, &WSAData);
 W_IP = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 Hote = gethostbyname(Nom_hote);
 memcpy(&In_Adresse, Hote -> h_addr, Hote -> h_length);
 SockAddrIn.sin_family = AF_INET;
 SockAddrIn.sin_port = htons(80);
 SockAddrIn.sin_addr = In_Adresse;
 connect(W_IP, (SOCKADDR *)&SockAddrIn, sizeof(SockAddrIn));     
 send(W_IP, Adresse, strlen(Adresse), 0);
 Sleep(450);
 recv(W_IP, reponse, 4096, 0);
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
C'est bien d'un char* dont tu as besoin:
http://msdn.microsoft.com/en-us/library/ms740121(VS.85).aspx

Neo_Fr