Go Down

Topic: [RESOLU] Aide a la declaration d'une fonction (Read 2621 times) previous topic - next topic

dudux2

Jan 07, 2015, 10:30 pm Last Edit: Jan 09, 2015, 10:47 pm by dudux2
Salut,

J'ai laissé la prog de coté pendant une 15 aine d'années, le retour au pointeur se fait difficile et j'ai besoin d'un petit rafraichissement.
J'aurais souhaité un petit coup de main pour la bonne déclaration de ma fonction, je pense que c'est une histoire de pointeur.

Code: [Select]

// Ma fonction
// Calcul la taille d'un tableau de caractere sans les cellules vide
int calculSizeTabChar(char tabChar[])
{
  int lenght = 0;
  // Calcule le nombre de caractere
  for( unsigned int i = 0 ; i < sizeof(tabChar); i++)
  {
    // Et suppresion des cellules vide
    if(tabChar[i] != 0)
      lenght++;
  }
  return lenght;
}



Code: [Select]

//Utilisation

char data[100] = "Yeah!!! ça marche... pas...";

// Calcul de la longueur reelle des donnees
dataRealLenght = calculSizeTabChar(data);


Sauf erreur de ma part, je pourrais mettre toute mes tableaux de char en local pour ensuite les utilisé dans des fonctions.

Sans les pointeurs je suis obligé de les mettre en global et du coup sans les passé en argument dans ma fonction.

bricoleau

Le problème est le sizeof(tabChar)

sizeof est un opérateur évalué à la compilation du programme, et non à l'exécution.

Pour le compilateur, ta variable tabChar, définie par "char tabChar[]", est juste un pointeur sur un char.

L'opérateur sizeof va te retourner la taille d'un pointeur.
Mets un Serial.println(sizeof(tabChar)) et tu verras bien.

Pour calculer la longueur utile d'une chaîne de caractères, tu peux tout simplement coder :

Code: [Select]
int calculSizeTabChar(char tabChar[])
{
  int lenght = 0;

  while (tabchar[lenght]) length++;

  return lenght;
}


Mais c'est assez dangeureux, car il faut être sûr est certain que ton tableau contient au moins un caractère à 0.
Dans le cas contraire, tu vas "explorer" la ram au-delà de l'espace alloué pour ton tableau.

Il vaudrait mieux une fonction du style :
Code: [Select]
int calculSizeTabChar(char tabChar[], int taillemax)
{
  int lenght = 0;

  while ((tabchar[lenght]) && (lenght < taillemax)) length++;

  return lenght;
}


avec
Code: [Select]
//Utilisation

char data[100] = "Yeah!!! ça marche... pas...";

// Calcul de la longueur reelle des donnees
dataRealLenght = calculSizeTabChar(data, sizeof(data));


Je t'indique ça vite fait sans filet, donc sans garantie de compil, mais en gros c'est l'idée.
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

XavierMiller

Ce ne serait pas strlen() que vous souhaitez utiliser ?

bricoleau

oui  :D

Mais on passerait à côté de l'aspect didactique pour lui permettre de comprendre ce qu'il manipule

Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

dudux2

#4
Jan 08, 2015, 12:28 am Last Edit: Jan 08, 2015, 12:28 am by dudux2
Quote
Bricoleau
Du coup tu me fais pensée à ça, j'ai testé et ça fonctionne! C'est quoi du coup la meilleurs solution.

Code: [Select]

// Calcul la taille d'un tableau de caractere sans les cellules vide
int calculSizeTabChar(char tabChar[], int TAB_CHAR_SIZE)
{
  int lenght = 0;

  // Calcule le nombre de caractere
  for( unsigned int i = 0 ; i <= TAB_CHAR_SIZE; i++)
  {
    // Et suppresion des cellules vide
    if(tabChar[i] != 0)
      lenght++;
  }
  return lenght;
}

dudux2

Bon ok, j'ai réinventé la roue une fois de plus...

Ce ne serait pas strlen() que vous souhaitez utiliser ?
Merci!

Quote
The strlen() function calculates the length of the string src, not including the terminating '\0' character.

dudux2

#6
Jan 08, 2015, 02:37 am Last Edit: Jan 08, 2015, 03:15 am by dudux2
J'en profite, après avoir regardé sur le site d'atmel....

Et celle-ci, elle existe?


Code: [Select]
void tabCharToPt(char tabChar[], int SIZE, byte ptTabChar[])
{
  for( int i = 0 ; i < SIZE; i++)
  {
    if(tabChar[i] != 0)
      ptTabChar[i] = byte(tabChar[i]);
  }     
}

fdufnews

#7
Jan 08, 2015, 08:38 am Last Edit: Jan 08, 2015, 08:40 am by fdufnews
Je dirais strncpy()
La  fonction  strcpy()  copie  la  chaîne pointée par src, y compris le
       caractère nul (« \0 ») final dans la chaîne pointée par dest. Les  deux
       chaînes  ne  doivent  pas se chevaucher. La chaîne dest doit être assez
       grande pour accueillir la copie.

       La fonction strncpy() est identique, sauf qu'au plus n  octets  de  src
       sont  copiés.  Attention :  s'il  n'y a pas de caractère nul dans les n
       premiers octets de src, la chaîne résultante dans dest ne disposera pas
       de caractère nul final.

       Si  la  longueur de src est inférieure à n, strncpy() remplit la fin de
       dest avec des caractères nuls.

bricoleau

http://fr.wikipedia.org/wiki/String.h
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

dudux2

http://fr.wikipedia.org/wiki/String.h
Merci, c'est pas mal, mais si vous avez un lien avec un descriptif plus claire, mieux détaillé comme celle de fdufnews , je suis preneur.

Car par exemple: "Les  deux chaînes ne doivent  pas se chevaucher" eh bien... ça parle pas du tout...

Merci.


zoroastre

Comme je n'ai rien compris à la problématique...

...J'apporte mon mode [VERBOSE]

const int longueurTable1 = sizeof(TABLEAU)/sizeof(TABLEAU[0]);

[/VERBOSE]

 :smiley-mr-green:  :smiley-confuse:  :smiley-zipper:
Gné! ;)

XavierMiller

@zoroastre: cette solution est correcte si le tableau n'est pas dynamique.

dudux2

#12
Jan 09, 2015, 08:36 pm Last Edit: Jan 09, 2015, 08:45 pm by dudux2
En effet le tableau n'est pas dynamique, mais je prend note pour: sizeof(TABLEAU)/sizeof(TABLEAU[0]); je ne l'avais pas dans mes abac celui la.

Ma dernière question: Auriez vous un lien sur les fonction de wstring.h en fr qui explique bien leur utilisation?

Car je ne comprend pas cette partie du descriptif pour
strncpy()
Les  deux chaînes  ne  doivent  pas se chevaucher. [...]

XavierMiller

va jeter un oeil sur "le site du zéro" ou "developpez.net"

dudux2


Go Up