Passage d'un char[] par reference

Résolu
tibob51 Messages postés 268 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 mai 2013 - 4 mai 2008 à 22:11
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 - 6 mai 2008 à 17:17
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
A voir également:

10 réponses

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

Neo_Fr
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
4 mai 2008 à 23:52
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++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
4 mai 2008 à 23:55
"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++ (@++)<!--
0
tibob51 Messages postés 268 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 mai 2013 2
5 mai 2008 à 01:21
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.
0

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

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
5 mai 2008 à 03:19
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++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
5 mai 2008 à 03:23
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++ (@++)<!--
0
tibob51 Messages postés 268 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 mai 2013 2
6 mai 2008 à 09:07
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!
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
6 mai 2008 à 14:30
Post le code de Recup_Donnees pour voir

Neo_Fr
0
tibob51 Messages postés 268 Date d'inscription vendredi 30 avril 2004 Statut Membre Dernière intervention 13 mai 2013 2
6 mai 2008 à 15:43
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);
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
6 mai 2008 à 17:17
C'est bien d'un char* dont tu as besoin:
http://msdn.microsoft.com/en-us/library/ms740121(VS.85).aspx

Neo_Fr
0
Rejoignez-nous