Comment passer un oobjet dans une fonction

Bonjour à tous,

J'ai cette fonction qui fonctionne bien quand je passe un char dans le deuxième parametre

int WI808::sd_append(char * fileName, char * string)
{
..code..
}

J'aimerais pouvoir passer soit un char ou soit un objet que j'ai déclaré comme ceci

struct TheFix {
 char hour[11];
 char valid[2];
 char lat[10];
 char latn[2];
 char lon[10];
 char lone[2];
 char speed[7]; 
 char course[7];
 char date[11];
 char magnetism[3]; // Check if 3 is correct
 char ewindicator[2];
 char mode[2];
 char position[FIXSIZE];

};

TheFix coords;

Comment dois-je remplacer char * string?

int WI808::sd_append(char * fileName, char * string)
{
..code..
}

pour que je puisse appeler ma fonction ainsi

sd_append("Mon_fichier", coords);

Il n'y a pas un truc avec un '&'?

Salut,

Il faut effectivement passer par un pointeur en paramètre ( * , & ...) . Je ne peux pas trop t'aider, car j'ai aussi du mal avec les "struct", "struct def", "typedef"...

il y a plein de lecture à ce sujet sur le net, mais j'avoue qu'un tuto bien rédigé ne nous ferait pas de mal!

http://www.cplusplus.com/doc/tutorial/structures/

Bonjour,

Comme le dit Super_Cinci il y a deux méthodes - soit par adresse * - soit par référence &

Par adresse

// déclaration
int WI808::sd_append(char * fileName,  theFix *c)

// appel fonction
sd_append("toto", &coords);

// accès à la structure
Serial.println(c->lon);

Par référence

// déclaration
int WI808::sd_append(char * fileName,  theFix &c)

// appel fonction
sd_append("toto", coords);

// accès à la structure
Serial.println(c.lon);

D’accord, merci.
Alors j’ai fait comme ça, mais y a un petit truc qui bug (voir plus bas)

int WI808::sd_append(char * fileName, char * string)
{
  sd_append(fileName, string, NULL, NULL);
}

int WI808::sd_append(char * fileName, MyUrl &url, TheFix &coords)
{
  sd_append(fileName, NULL, url, coords);
}


/*
1   = new file created
0   = err file not created
-51 =  Error : sd_gotoToTommandMode return false
-52 = Error : SD_ERR_LISTING_OPENLOG
-53 = error is si KO
-54 = error : Sd unactive (OPENLOG)
*/

// (With Arduino Mini pro)
int WI808::sd_append(char * fileName, char * string, MyUrl &url, TheFix &coords)
{
  uint8_t answer = 0;

  #ifdef OPENLOG
  delay(100);
    if(isSDok)
    {
   
      if(sd_gotoCommandMode())
      {
        // APPEND TO THE FILE GPSLOG
        Serial.print("append ");
        Serial.print(fileName); 
        Serial.print('\r');         // Because of Arduino
          
        unsigned int timeout = 5000; //10000
        unsigned long previous;
        previous = millis();

        do{
          if(Serial.available())
            {
              // Reading mode
              if(Serial.read() == '<')
              {
                answer = 1;
                isCommandMode = false;
              }
            }
          }while((answer <= 0) && ((millis() - previous) < timeout));

          if(answer == 1)
          {
            //isCommandMode = false;
            if(strlen(string) > 0 || string != NULL)
            {
              // Write the fix to the file
              Serial.print("{");
              Serial.print(string);
              Serial.print("}");
              Serial.print('\n');
            }
            else
            {
              //_openlog.write(13);
              Serial.print('\n');
            }
            
            //isCommandMode = false;

            // Return to logfile

          } //end if answer
          else
          {
            #ifdef DEBUG_SD
              sprint(F("SD Append\t\t"));
              sprintln(KO_RESPONSE);  

              Serial.print(F("CMDe1:"));
              Serial.println(isCommandMode);
            #endif

          } // end if answer

        } // sd_gotoCommandMode
        else
        {
          answer = -51;
        }
    }
    else
    {
      #ifdef DEBUG
        sprintln(SD_KO);
      #endif
      answer = -53;
    }

  #else
    #ifdef DEBUG
      sprintln(SD_UNACTIVE);
    #endif
    answer = -54;
  #endif

  return answer;
}

Je peux faire ca

sd_append(fileName, NULL, url, coords);

mais pas l’inverse

sd_append(fileName, string, NULL, NULL);

Comment puis ne pas envoyer de valeur (comme un NULL) dans les deux derniers parametres. Si non, si je compile en commentant ceci:

//sd_append(fileName, string, NULL, NULL);

J’ai pas d’erreur.

Quand tu passes une référence elle ne peut être nulle (contrairement à une adresse explicite)

Donc je devrais faire un truc "bidon" comem ceci?

int WI808::sd_append(char * fileName, char * string)
{
  MyUrl bidon;
  TheFix bidons;
  sd_append(fileName, string, bidon, bidons);
}

Eventuellement, sauf qu'ici tu crée des objet pour rien qui prennent de la place mémoire. Si tu envisages de passer des valeurs nulles c'est que ta fonction utilise ou pas ces valeurs suivant qu'elles sont passées ou pas. Si tu passes tjrs une référence, tu ne va pas pouvoir faire ce test.

D'accord, alors comment je dois faire, car je suis très limite en terme de mémoire et si je peux éviter de faire ceci, c'est donc mieux

Passer la structure pas adresse et utiliser des pointeurs pour y accéder

Devraid-je alors doubler cette fonction de la sorte?

// (With Arduino Mini pro)
int WI808::sd_append(char * fileName, char * string)
{
  uint8_t answer = 0;

  #ifdef OPENLOG
  delay(100);
    if(isSDok)
    {
   
      if(sd_gotoCommandMode())
      {
        // APPEND TO THE FILE GPSLOG
        Serial.print("append ");
        Serial.print(fileName); 
        Serial.print('\r');         // Because of Arduino
          
        unsigned int timeout = 5000; //10000
        unsigned long previous;
        previous = millis();

        do{
          if(Serial.available())
            {
              // Reading mode
              if(Serial.read() == '<')
              {
                answer = 1;
                isCommandMode = false;
              }
            }
          }while((answer <= 0) && ((millis() - previous) < timeout));

          if(answer == 1)
          {
            //isCommandMode = false;
            if(strlen(string) > 0 || string != NULL)
            {
              // Write the fix to the file
              Serial.print("{");
              Serial.print(string);
              Serial.print("}");
              Serial.print('\n');
            }
            else
            {
              //_openlog.write(13);
              Serial.print('\n');
            }
            
            //isCommandMode = false;

            // Return to logfile

          } //end if answer
          else
          {
            #ifdef DEBUG_SD
              sprint(F("SD Append\t\t"));
              sprintln(KO_RESPONSE);  

              Serial.print(F("CMDe1:"));
              Serial.println(isCommandMode);
            #endif

          } // end if answer

        } // sd_gotoCommandMode
        else
        {
          answer = -51;
        }
    }
    else
    {
      #ifdef DEBUG
        sprintln(SD_KO);
      #endif
      answer = -53;
    }

  #else
    #ifdef DEBUG
      sprintln(SD_UNACTIVE);
    #endif
    answer = -54;
  #endif

  return answer;
}
// (With Arduino Mini pro)
int WI808::sd_append(char * fileName, MyUrl &url, TheFix &coords)
{
  uint8_t answer = 0;

  #ifdef OPENLOG
  delay(100);
    if(isSDok)
    {
   
      if(sd_gotoCommandMode())
      {
        // APPEND TO THE FILE GPSLOG
        Serial.print("append ");
        Serial.print(fileName); 
        Serial.print('\r');         // Because of Arduino
          
        unsigned int timeout = 5000; //10000
        unsigned long previous;
        previous = millis();

        do{
          if(Serial.available())
            {
              // Reading mode
              if(Serial.read() == '<')
              {
                answer = 1;
                isCommandMode = false;
              }
            }
          }while((answer <= 0) && ((millis() - previous) < timeout));

          if(answer == 1)
          {
            //isCommandMode = false;
            


// ADAPTER ICI EN FONCTION DES PARAMETRES
            
            //isCommandMode = false;

            // Return to logfile

          } //end if answer
          else
          {
            #ifdef DEBUG_SD
              sprint(F("SD Append\t\t"));
              sprintln(KO_RESPONSE);  

              Serial.print(F("CMDe1:"));
              Serial.println(isCommandMode);
            #endif

          } // end if answer

        } // sd_gotoCommandMode
        else
        {
          answer = -51;
        }
    }
    else
    {
      #ifdef DEBUG
        sprintln(SD_KO);
      #endif
      answer = -53;
    }

  #else
    #ifdef DEBUG
      sprintln(SD_UNACTIVE);
    #endif
    answer = -54;
  #endif

  return answer;
}

Dans le fond, ca me semble mieux, sauf que je dois adapter mon code de la deuxième fonction mais qui sera quasi identique

Oui, c’est une possibilité offerte en C++