[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
    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
  2. Au secours !!! pourquoi ya personne?
    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. 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
          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. 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. 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