[C++] Passage par adresse

Fermé
Grmi91 Messages postés 12 Date d'inscription jeudi 23 juin 2005 Statut Membre Dernière intervention 17 octobre 2017 - 9 mai 2007 à 14:29
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 10 mai 2007 à 12:55
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
9 mai 2007 à 14:36
Corrige constructionTrame (trameAConstruire, &trame);
par constructionTrame (trameAConstruire, trame);
0
Grmi91 Messages postés 12 Date d'inscription jeudi 23 juin 2005 Statut Membre Dernière intervention 17 octobre 2017
9 mai 2007 à 14:50
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 jeudi 23 juin 2005 Statut Membre Dernière intervention 17 octobre 2017
9 mai 2007 à 15:12
Au secours !!! pourquoi ya personne?
0
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
9 mai 2007 à 16:00
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 jeudi 8 février 2007 Statut Membre Dernière intervention 4 décembre 2007 94
9 mai 2007 à 16:02
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 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
9 mai 2007 à 16:13
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 jeudi 23 juin 2005 Statut Membre Dernière intervention 17 octobre 2017
9 mai 2007 à 16:22
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 vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
10 mai 2007 à 12:55
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