[C++] Passage par adresse

Grmi91 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   -  
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,
Je fais appel à vos services pour résoudre un problème de la plus petite impotance !!! loooool
En effet j'essaie d'accéder à une méthode en lui attribuant 2 paramètres, le premier de type char* blabla et le second de type char blablabla[50]. Bref voici plutôt un morceau de code :
char* constructionTrame(char* trameAConstruire, char trame[50]);

/************* Méthode principale *************/
int main(int argc, char *argv[])
{
	/* Déclaration des variables */
	(...)
	char *trameAConstruire;
	char trame[50];
	(...)
	
	constructionTrame (trameAConstruire, &trame);
	(...)
}

/* modifier trame[50] */
char* constructionTrame(char* trameAConstruire, char trame[50])
{
	(...)
}


Voici les erreurs à la compilation :
[****@poste27 progV8]$ g++ -o -lm robot robot.cpp liaisonSerie.cpp attrapObjet.cpp
robot.cpp: In function `int main(int, char**)':
robot.cpp:41: erreur: ne peut convertir « char (*)[50] » à « char* » pour l'argument « 2 » vers « char* constructionTrame(char*, char*) »

Donc si quelqu'un sait d'où vient l'erreur, ce serais sympa, même très sympa, de me le dire !!!
Merci à tous.
ps : j'ai tout essayé, mais pas réussi !!!!
A voir également:

7 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Corrige constructionTrame (trameAConstruire, &trame);
par constructionTrame (trameAConstruire, trame);
0
Grmi91 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention  
 
Merci de m'avoir répondu aussi rapidement.
mais après correction toujour une erreur :

/* prototype */
char* constructionTrame(char* trameAConstruire, char *trame);

/************* Méthode principale *************/
int main(int argc, char *argv[])
{
	/* Déclaration des variables */
	(...)
	char *trameAConstruire;
	char trame[50];
	(...)
	
	constructionTrame (trameAConstruire, &trame);
       /*même avec constructionTrame (trameAConstruire, trame); ou autres, ça marche pas */
	(...)
}

/* modifier trame[50] */
char* constructionTrame(char* trameAConstruire, char *trame)
{
	(...)
}



[****@poste27 progV8]$ g++ -o -lm robot robot.cpp liaisonSerie.cpp attrapObjet.cpp
robot.cpp: In function `int main(int, char**)':
robot.cpp:42: erreur: ne peut convertir « char (*)[50] » à « char* » pour l'argument « 2 » vers « char* constructionTrame(char*, char*) »


ps : faut-il que je fasse un fichier robot.h (le morceau de programme ci-dessus est issu du fichier robot.cpp) comme suit :
using namespace std;

class robot
{
	/* méthodes publics */
	public :	
		int main(int argc, char *argv[]);
		char* constructionTrame(char* trameAConstruire, char* trame);
};
0
Grmi91 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention  
 
Au secours !!! pourquoi ya personne?
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
int main(int argc,char **argv){
  char *trame=(char *)calloc(50,sizeof(char));
  // ...
  constructionTrame (trameAConstruire,trame);
  // ...
  free(trame);
  //...
}

La fonction main n'a rien à faire dans la classe robot, on n'est pas en java. Afin d'éviter la confusion avec les headers C, il serait judiceux de renommer robot.h en robot.hpp (mais c'est facultatif).
N'oublie pas qu'en C++ tu peux aussi utiliser les std::string (qui sont des chaînes virtuellement de taille infinie), ce qui évite de dimensionner arbitrairement tes chaînes.
#include <string>
#include <iostream>

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

int main(){
  std::string trame = "tapir";
  // ...
  constructionTrame (trameAConstruire,trame);
  // ...
  affiche_trame(trame);
  // ...
}

Bonne chance
0
Stupeflip Messages postés 391 Date d'inscription   Statut Membre Dernière intervention   94
 
Salut,

En fait c'est simple,

Soit tu fais char * truc dans le main
et tu l'appelles en char * dans ta fonction
Dans ce cas, n'oublie pas les new/delete

Soit tu fais char truc[taille] dans le main
et tu l'appelles en char truc[taille] dans ta fonction

Quand tu lances ta fonction ca sera
constructionTrame (trameAConstruire, trame);

Quand tu mets un & devant, c'est comme si tu parlais d'un char **
0

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

Posez votre question
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Oui d'ailleurs l'utilisation de new et de delete est plus adéquate en C++ que calloc et free, plutôt reservés au C...
0
Grmi91 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention  
 
s'que tu veux dire c'est que je fasse :
/* Prototype */
char* constructionTrame(char* trameAConstruire, char trame[50]);

************* Méthode principale *************/
int main(int argc, char *argv[])
{
	(...)
	char *trameAConstruire;
	char trame[50];
	(...)
        constructionTrame (trameAConstruire, trame);
       (...)
}
/************* Méthode constructionTrame *************/
char* constructionTrame(char* trameAConstruire, char trame[50])
{
       (...)
}


????? si oui ba ensuite ça me met une erreur big up !!!! du style :
collect2: ld terminé par le signal 11 [Erreur de segmentation]
robot(.rodata+0x0): définitions multiples de « _fp_hw »
/usr/lib/gcc/i386-redhat-linux/3.4.2/../../../crt1.o(.rodata+0x0): défini pour la première fois ici
robot(.data+0x4): In function `__data_start':
: définitions multiples de « __dso_handle »

(...)

/tmp/ccFXbvTY.o(.text+0x0): In function `attrapObjet::saisieObjet(char*)':
: définitions multiples de « attrapObjet::saisieObjet(char*)  »
robot(.text+0x780): défini pour la première fois ici
/usr/bin/ld: Warning: size of symbol `attrapObjet::saisieObjet(char*)' changed from 595 in robot to 519 in /tmp/ccFXbvTY.o
/usr/lib/gcc/i386-redhat-linux/3.4.2/../../../crt1.o(.dynamic+0x0): définitions multiples de « _DYNAMIC »
robot(.dynamic+0x0): défini pour la première fois ici

=>truc des bibliothèques
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
au moins là tu as compilé. L'erreur viens maintenant de l'édition de lien.
mais nous ta ligne de compilation.
Tu as bien suivie ce que t'a dit Mamiemando sur la class robot : c pas du java.
en C le point d'entrée est la fonction global main() !
0