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

Messages postés
10
Date d'inscription
samedi 4 février 2006
Statut
Membre
Dernière intervention
5 mai 2007
- - Dernière réponse : BruNews
Messages postés
21042
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
Afficher la suite 

9 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
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++
Commenter la réponse de BruNews
Messages postés
10
Date d'inscription
samedi 4 février 2006
Statut
Membre
Dernière intervention
5 mai 2007
0
Merci
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!
Commenter la réponse de Titof301
Messages postés
509
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
3 août 2010
0
Merci
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]);
Commenter la réponse de gagah1
Messages postés
149
Date d'inscription
mercredi 28 mars 2007
Statut
Membre
Dernière intervention
17 mai 2007
0
Merci
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.
Commenter la réponse de emmatopiak
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
0
Merci
Tu n'as qu'à faire
if (atoi(donnees[a]) == 2)

A+
Bonne programmation
<hr size="2" width="100%" />                                         Site
Commenter la réponse de ncoder
Messages postés
10
Date d'inscription
samedi 4 février 2006
Statut
Membre
Dernière intervention
5 mai 2007
0
Merci
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.
Commenter la réponse de Titof301
Messages postés
10
Date d'inscription
samedi 4 février 2006
Statut
Membre
Dernière intervention
5 mai 2007
0
Merci
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)
Commenter la réponse de Titof301
Messages postés
149
Date d'inscription
mercredi 28 mars 2007
Statut
Membre
Dernière intervention
17 mai 2007
0
Merci
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.
Commenter la réponse de emmatopiak
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
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++
Commenter la réponse de BruNews