J'arrive pas a l'expliquer en un mot...

Titof301 Messages postés 10 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 5 mai 2007 - 4 mai 2007 à 23:21
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 6 mai 2007 à 00:18
Bonjour a tous, j'ai une question probablement bête mais bon (  ). Est-il possible d'utiliser le contenu d'une variable int par exemple à l'intérieur d'un programme pour... hum un exemple serait plus simple...

bool V_0(char[][16], char[][12]), V_1(char[][16], char[][12]), V_2(char[][16], char[][12]),
        V_3(char[][16], char[][12]), V_4(char[][16], char[][12]), V_5(char[][16], char[][12]),
        V_6(char[][16], char[][12]), V_7(char[][16], char[][12]), V_8(char[][16], char[][12]), V_9(char[][16],  char[][12]);
 int extract[10][3] = {{1,10},{12,15},{29,3},{33,5},{39,2},{42,1},{44,3},{48,2},{51,4},{56,7}}, i=0, j=0;
 char donnees[10][16]={'\0'}, temp[16];
 
 for (i=0; i<10; i++)
 {
    extraire_chaine(chaine,extract[i][j],extract[i][j+1],donnees, i);
    cout << donnees[i] << "voir" << endl;
    V_i (donnees, tab_marques);  <======

}

Donc bon j'était en pleine recherche pour raccourcir mon programme, et j'ai penser à sa (et qui pourrais me servir plus tard). En gros, j'ai plusieurs fonction qui ont un nom de type V_0, V_1, V_2, etc, ET à l'intérieur de mon FOR j'utilise le i pour des fonctions. Je voulais savoir si il était possible de faire un seul appel de fonction dans le FOR en se servant de la valeur de mon i (0 à 9) pour qu'elle soit appeler à chaque passage, dans les différentes fonctions? J'ai essayer quelques trucs mais j'arrive pas... alors est-ce possible?

merci d'avance

9 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 mai 2007 à 00:08
Nenni, après compilation une fonction est simplement une adresse donc plus de nom à donner.
Peut se résoudre par un tableau de pointeurs de fonction.

ciao...
BruNews, MVP VC++
0
Titof301 Messages postés 10 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 5 mai 2007
5 mai 2007 à 03:33
merci beaucoup!!! effectivement avec un tableau de pointeur sa fonctionne nickel

Par contre, j'ai un petit probleme d'un autre ordre.
Je ne comprends pas vraiment pourquoi (ptete la fatigue... lol)... Je veux par exemple convertir un char en int :

bool V_2(char donnees[10][16], int a)
{
if (atoi(donnees[a][0]) == 2)
    return true;
else
    return false;

et il me donne cette erreur :
error C2664: 'atoi' : cannot convert parameter 1 from 'char' to 'const char *'

j'ai déjà utiliser cette fonction (atoi) d'une manière un peu différente, mais là, où est le probleme?
Merci d'avance!
0
gagah1 Messages postés 509 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 3 août 2010
5 mai 2007 à 08:42
Si tu veux convertir un char en int , utilises l'operateur cast: (int)donnees[a][0];
La fonction atoi convertit une chaine de caractère càd un tableau de char terminer par un caractère NULL. Si tu veux utiliser atoi , castes comme ceci:
atoi((const char*)donnees[a][0]);
0
emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 mai 2007 2
5 mai 2007 à 10:34
Salut,
Tu peux pas appeler directement V_i comme tu pourrais le faire dans des langages interprétés.


Ce que tu peux faire en C par contre, c'est un tableau de fonctions. La syntaxe va être complètement pourrie par contre.


Tu as des fonctions :
bool V_0(char **, char **);
Un pointeur sur cette fonction s'écrit :
bool (* V)(char **, char **);
Un tableau de pointeurs devrait s'écrire :
bool (* V[10])(char **, char **);


Au pire tu mets deux étoiles avant V plutôt que *V[10], je n'ai pas pu tester. Une fois que c'est fait, il faut initialiser ce tableau en mettant :
V[0] = V_0; V[1] = V_1; ...


Mais je me demandais si le plus simple est pas de faire passer le paramètre i en paramètre aux fonctions V_i ? Parce que le traitement de V_i doit etre dépendant du paramètres i plutot.
Ca devrait être plus simple à faire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ncoder Messages postés 244 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 6 avril 2008 1
5 mai 2007 à 16:37
Tu n'as qu'à faire
if (atoi(donnees[a]) == 2)

A+
Bonne programmation
<hr size="2" width="100%" />                                         Site
0
Titof301 Messages postés 10 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 5 mai 2007
5 mai 2007 à 23:44
Merci a tous pour votre aide!!
pour le probleme no1 avec les V_i, j'ai réussi grace au tableau de pointeur de fonction.
Ca me donne en gros:
bool (*ptrFonction[])(char[][16], int, char [][12]) = { V_0, V_1, V_2, V_3, V_4, V_5, V_6, V_7, V_8, V_9 };



for (i=0; i<10; i++)
 {
  extraire_chaine(chaine,extract[i][j],extract[i][j+1],donnees, i);
  if (!ptrFonction[i](donnees, i, tab_marques)) cout << donnees[i] << " n'est pas valide!!!" << endl;
 }


Pour le prob no2, bah en ce moment j'ai tester ces 2 la qui marchent :
if ((donnees[a][0] - '0') == 2)       (j'ai lu à quelque part le principe, je crois comprendre en gros...)
if (atoi(donnees[a]) == 2)           (ca marche aussi, mais pourtant donnees[a] contient par exemple 2HN ...comment sa se fait que sa marche quand meme?)

et pour le cast, quand je fait test=int(donnees[a][0]); test contient 53 au lieu de 5 par exemple, je l'utilise mal? Je sais que les autres marchent mais le cast pourrait surement me servir un jour ou l'autre.
0
Titof301 Messages postés 10 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 5 mai 2007
5 mai 2007 à 23:55
ah pendant que j'y pense, je me demande sa depuis un bout, est-ce qu'il y a un moyen de faire plusieurs comparaisons dans un if par exemple sans devoir retaper l'argument de gauche a chaque fois? du style :

if (atoi(donnees[a]) == 2 || 4 || 5 || 9)

au lieu de : if (atoi(donnees[a]) 2 || atoi(donnees[a]) == 4 || atoi(donnees[a]) == 5 || atoi(donnees[a]) == 9)
0
emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 mai 2007 2
6 mai 2007 à 00:08
Salut,

Le seul moyen c'est de faire un switch.

switch (atoi(donnees[a])) {
  case 2: case 4: case 5: case 9: printf("truc\n");
}

Une autruche ne se cuit pas aux petits lardons.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 mai 2007 à 00:18
Si tu es certain qu'il n'y a qu'un chiffre comme dans "2HN" alors la version: octet - '0' est nettement plus performante que atoi().

ciao...
BruNews, MVP VC++
0
Rejoignez-nous