Langage C, fonction avec tableaux

Fermé
Pineau - 4 avril 2008 à 15:18
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 - 9 avril 2008 à 15:35
Bonjour,
Je tente de programmer un logiciel (basique ... sur console) où l'utilisateur saisi des numéro d'intervention (pour une maintenance) et des indices de priorité pour ces interventions. Pour ne pas surcharger mon code j'aurais voulu mettre la boucle qui permet a l'utilisateur de saisir les valeurs à mettre dans les tableaux en fonction.
Le but étant de pouvoir m'en resservir ultérieurement dans un switch qui aura pour but de pouvoir ajouter des valeurs aux actuels tableaux.

Ma boucle est la suivante :

do
{
printf("Numero d intervention : ");
scanf("%d", &I[i]);

if (I[i]!=-1)
{
printf("Indice de priorite : ");
scanf("%d", &P[i]);
printf("\n\n\n");
}
i++;
}
while (I[i-1]!= -1);

Sachant que les tableaux sont : int I[250], P[250] et i mon indice.

J'avais fait une fonction comme ca mais ca ne fonctionne pas.


void initableau(int I[], int P[])
{
int i;

do
{
printf("Numero d intervention : ");
scanf("%d", &I[i]);

if (I[i]!=-1)
{
printf("Indice de priorite : ");
scanf("%d", &P[i]);
printf("\n\n\n");
}
i++;
}
while (I[i-1]!= -1);
}

Je ne m'y connais pas encore très bien dans ce domaine, ce qui explique les GROSSES et probables absurdités copiées plus haut.

Merci d'avance.
A voir également:

6 réponses

cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
4 avril 2008 à 15:58
Bonjour,

Rien de grave :

//Tableaux
int TAB1 [32] = {0};
int TAB2 [32] = {0};

//Appel de la fonction

initableau(TAB1, TAB2) ;
____________________________________
/Passation des adresses de pointeurs.
void initableau(int (*I), int (*P)) 
{ 
//tu n'as pas initialisé i. Ca plantait d'entrée au scanf("%d", &I[i]); 
int i = 0; 

  do 
   { 
     printf("Numero d intervention : "); 
     scanf("%d", &I[i]); 
     if (I[i]!=-1) 
       {
        printf("Indice de priorite : "); 
        scanf("%d", &P[i]); 
        printf("\n\n\n"); 
    } 
  i++; 
  } 
  while (I[i-1]!= -1); 
} 
0
Merci beaucoup de votre réponse si rapide. Je viens de tester ca marche.

Par contre petit truc que je n'ai pas compris ...

Pourquoi doit on utiliser les pointeurs des tableaux dans la declaration des variables de la fonction ?

Merci encore.
0
Decidément je ne suis pas très doué :)

La fonction fonctionne pour le debut, mais pour l'utiliser dans mon switch je dois pouvoir changer la valeur de i.
Vous me l'avez fait initialiser a 0 dans la fonction, mais est il possible d'utiliser cette fonction en ayant un i different ?

Je m'explique : lorsque je sors de ma boucle j'utilise une variable que j'initialise à var=i-2. Cette variable me sert à trier mon tableau en fonction des valeurs des indices. Cependant par la suite l'utilisateur doit etre en mesure de pouvoir ajouter des interventions à la suite des tableaux déjà existants.
Pour ce faire j'ai besoin qu'en entrant dans ma fonction, i soit initialisé a i=var+1.

Est il possible lors de l'appel de fonction de faire en sorte que i prenne cette valeur ?


Merci beaucoup et désolé du dérangement.
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
4 avril 2008 à 17:21
Bonjour,


Attention à bien "gérer" la variable i.
void initableau(int (*I), int (*P), int &i)

Eliminer l'initialisation de i.
//int i = 0;


int i = 0;
i = n....................;
initableau(TAB1, TAB2, i) ;

Ta manière de procéder pour passer les tableaux est tout aussi recevable que celle que j'ai codée. Elle est cependant déconseillée pour des questions de lisibilité qui peuvent induire une confusion quant à la nature execte de ce qui est effectivement passé (tableau ou pointeur).

P.S. J'ai défini i en tant que variable pointée &i de manière à ce que tu puisses récupérer sa valeur modifiée en sortie de initableau.

Cordialement.

Cchristian.
0
Bonjour,

je viens d'essayer ce que vous me décrivez mais lors de la compilation ça me signale une erreur en me disant : "syntax error before '&' token".

En tout cas merci beaucoup de votre aide.
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
4 avril 2008 à 18:02
Bonjour,

Je viens d'apprendre quelque chose que (forcément) j'ignorais, cette manière de procéder (int &i) est spécifique au C++. et tu es en C, alors si tu souhaites que j'essaie de mon côté de mettre en place l'équivalent (en C) dis-le moi.
0
Si cela ne vous dérange pas trop, je veux bien.
En effet cela va m'etre plus qu'utile pour la suite de mon programme.

D'avance je vous en remerci.

Pineau
0

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

Posez votre question
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
5 avril 2008 à 14:42
Bonjour,

Fais un test chez toi, dis-moi si ça tourne, chez moi ça tourne mais je me méfie maintenant des incompatibilités C <=> C++;


void initableau(int (*I), int (*P), signed int *i) ;

//Passation des adresses (pointeurs).
void initableau(int (*I), int (*P), signed int *i) 

{
//Pour des raisons que j'ignore il est préférable de ne pas utiliser
// *i directement en tant qu'indice (résultats incohérents). 
   int j = *i;

do 
  { 
   printf("Numero d intervention : "); 
   scanf("%d", &I[j]); 

   if (I[j]!=-1) 
     { 
      printf("Indice de priorite : "); 
      scanf("%d", &P[j]); 
      printf("\n\n\n"); 
     } 
   j++; 
 }  while (I[j-1]!= -1);

//restauration de *i avec la valeur de j pour utilisation dans la fonction appelante.

  *i = j;
return ;
} 


____________________________________________
int TAB1 [32] = {0};
int TAB2 [32] = {0};

//Appel de la fonction

i = n ..................;
initableau(TAB1, TAB2, &i) ;










0
J'ai verifié ca marche. Merci beaucoup de votre aide.
J'espere ne pas vour avoir trop deranger.


Merci encore.
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
9 avril 2008 à 15:35
Bonjour,

Merci pour ce retour d'information, ça ne m'a pas du tout dérangé, bon courage !
0