[C++] Passage par adresse

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 !!!!
Configuration: Linux Fedpra Core 3
Firefox 1.5.0.3

7 réponses

  1. Contributeur
    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
    1. 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
      1. Modérateur
        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
        1. 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
          1. Modérateur
            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
            1. Au secours !!! pourquoi ya personne?
              0
              1. Contributeur
                Corrige constructionTrame (trameAConstruire, &trame);
                par constructionTrame (trameAConstruire, trame);
                0
                1. 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