Rechercher : dans
Par :

Langage C, pointeur en parametre

Dernière réponse le 18 mai 2009 à 16:06:55 vincent68170, le 18 mai 2009 à 11:36:41 
 Signaler ce message aux modérateurs

Bonjour,

j'ai un programme en C qui utilise une fonction nextHoraire avec un pointeur en perametre:

#define NBHORAIRES 10
const horaire Horaires[nbHoraires]={
{6,0} ,{6,30} ,{7,0} ,{7,30} ,{8,10},
{8,45},{10,15},{12,10},{14,25},{14,45}
};



horaire nextHoraire(horaire hr, horaire *h , int nbHoraires )
{
//horaire h_aux={h.heures,h.minutes};
int i=0;
while ((hr.heures > h[i]->heures) && (i< nbHoraires) )
i++;
if(i== nbHoraires )
return *h[0];
while(( hr.minutes > h[i]->minutes) && i< nbHoraires )
if (h[i]->heures > hr.heures)
return *h[i];
else
i++;
if( (i== nbHoraires) || ( (hr.heures >= h[nbHoraires-1]->heures) && ( hr.minutes >= h [nbHoraires-1]->minutes) ) )
return *h[0];
else
return *h[i];

}

que j'utilise dans un main de la façon suivante:

horaire heure_reelle={4,50};

prochainHoraire=nextHoraire(heure_reelle,&Horaire,NBHORAIRES);

A la compilation j'ai une erreur qui me renvoie à la ligne de déclaration de nextHoraire:
horaire nextHoraire(horaire hr, horaire *h , int nbHoraires )
et qui me dit:
Error 28 "ex_rfid_projet.c" Line 142(68,69): Expecting an identifier.


Quelqu'un pourrait-il maider ou m'expliquer ce que peut signifier cette erreur?
je vous remercie d'avance

Configuration: Windows XP Internet Explorer 7.0

Meilleures réponses pour « langage C, pointeur en parametre » dans :
Les piles en langage C VoirLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage...
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Les pointeurs en langage C VoirDéfinition d'un pointeur Un pointeur est une variable contenant l'adresse d'une autre variable d'un type donné. La notion de pointeur fait souvent peur car il s'agit d'une technique de programmation très puissante, permettant de définir des...
Introduction au langage C VoirPetite histoire du C Le langage C a été mis au point par D.Ritchie et B.W.Kernighan au début des années 70. Leur but était de permettre de développer un langage qui permettrait d'obtenir un système d'exploitation de type UNIX portable. D.Ritchie...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...

1

loupius, le 18 mai 2009 à 12:35:53

Le problème c'est que tu ne nous dis pas comment est déclaré 'horaire'.
D'autre part:
#define NBHORAIRES 10
const horaire Horaires[nbHoraires]={ ...

pose problème, ce doit être: 'const horaire Horaires[NBHORAIRES]'.
A suivre.

Répondre à loupius

2

vincent68170, le 18 mai 2009 à 13:20:28

Merci pour ta réponse. La déclaration de la taille du tableau en minuscule n'est pas le probleme (je l'ai juste mal tapé sur le forum).
horaire est une structure definie de la maniere suivante:

typedef struct{
int8 heures;
int8 minutes;
} horaire;


Merci de m'éclairer

Répondre à vincent68170

3

loupius, le 18 mai 2009 à 13:46:22

Après avoir déclaré:
const horaire Horaires[NBHORAIRES] =
et lancé la fonction:
horaire prochainHoraire = nextHoraire (heure_reelle, Horaires, NBHORAIRES);
il est nécessaire de déclarer ainsi la fonction:
horaire nextHoraire (horaire hr, const horaire h[] , int nbHoraires)
et de modifier la ligne:
while ( (hr.heures > h[i].heures) && (i< nbHoraires) )
ainsi que les suivantes.
AInsi, la compilation ne devrait être qu'un long fleuve tranquille.
Bonne continuation.

Répondre à loupius

4

vincent68170, le 18 mai 2009 à 13:57:46

Merci, j'avais déjà essayé en ecrivant ma foonction de la maniere suivante:
horaire nextHoraire(horaire hr, const horaire h [] )
{
int nbHor;
nbHor = sizeof(h);
int i=0;
while ((hr.heures > h[i].heures) && (i<nbHor ) )
i++;
if(i== sizeof(h) )
return *h[0];
while(( hr.minutes > h[i].minutes) && i< nbHor )
if (h[i].heures > hr.heures)
return *h[i];
else
i++;
if( (i== nbHor) || ( (hr.heures >= h[nbHor-1].heures) && ( hr.minutes >= h[nbHor-1].minutes) ) )
return h[0];
else
return h[i];

}

mais cette fois ci la compilateur m'indique l'erreur suivante (toujours sur la ligne de la déclaration):
*** Error 32 "ex_rfid_projet.c" Line 142(47,54): Expecting a , or )



NB: j'appelle la fonction de la maniere suivante:
prochainHoraire=nextHoraire(heure_reelle,Horaire);


Merci

Répondre à vincent68170

5

loupius, le 18 mai 2009 à 14:08:52

Cette écriture n'a aucun sens:
horaire nextHoraire(horaire hr, const horaire h [] )
{
int nbHor;
nbHor = sizeof(h);

Il est impossible de déterminer la taille du tableau !
Il est nécessaire de passer la taille; une alternative est de marquer la fin du tableau par une séquence particulière (par exemple: {25,0} qui est un horaire absurde) que l'on pourra tester.
Il ne faut pas écrire:
return *h[0];
mais
return h[0];

Répondre à loupius

6

vincent68170, le 18 mai 2009 à 14:25:31

Ok, j'ai remis la taille du tableau en parametre.
Mais il me ressort toujours la même erreur qui semble venir du const devant horaire h[].
(NB: l'erreur est *** Error 32 "ex_rfid_projet.c" Line 142(47,54): Expecting a , or ). )
j'enlève le const pour voir ce que le compilateur me dit... et il m'indique une nouvelle erreur quand j'appelle la fonction:
prochainHoraire=nextHoraire(heure_reelle , Horaire,NBHORAIRES);
=> *** Error 54 "ex_rfid_projet.c" Line 270(44,51): Expecting a variable



voilà la fonction :
horaire nextHoraire(horaire hr,const horaire h[],int nbHor )
{

int i=0;

while ((hr.heures > h[i].heures) && (i<nbHor ) )
i++;
if(i== sizeof(h) )
return h[0];
while(( hr.minutes > h[i].minutes) && i< nbHor )
if (h[i].heures > hr.heures)
return *h[i];
else
i++;
if( (i== nbHor) || ( (hr.heures >= h[nbHor-1].heures) && ( hr.minutes >= h[nbHor-1].minutes) ) )
return h[0];
else
return h[i];

}

Répondre à vincent68170

7

loupius, le 18 mai 2009 à 14:55:58

Bon, on va pas tourner autour du pot pendant 8 jours; voici un code qui se compile bien:

#include<stdio.h>

#define NBHORAIRES 10

typedef struct
{
  int heures;
  int minutes;
} horaire; 

const horaire Horaires[NBHORAIRES] =
{
  {6, 0},{ 6,30},{ 7, 0},{ 7,30},{ 8,10},
  {8,45},{10,15},{12,10},{14,25},{14,45}
};

horaire nextHoraire (horaire hr, const horaire h[], int nbHor)
{
  int i = 0;
  while ((hr.heures > h[i].heures) && (i<nbHor))
    i++;
  if (i == nbHor)
    return h[0];
  while ((hr.minutes > h[i].minutes) && (i< nbHor))
    if (h[i].heures > hr.heures)
      return h[i];
    else
      i++;
  if ( (i != nbHor) && ((hr.heures < h[nbHor-1].heures) || (hr.minutes < h[nbHor-1].minutes)) )
    return h[i];
  return h[0];
}

int main()
{
  horaire heure_reelle = {18,44};
  horaire prochainHoraire = nextHoraire (heure_reelle, Horaires, NBHORAIRES);
  printf ("Prochain horaire: %d h %d mn\n", prochainHoraire.heures, prochainHoraire.minutes);
  return (0);
}
Bonne continuation.

Répondre à loupius

8

vincent68170, le 18 mai 2009 à 15:27:13

Merci c'est exactement ce que je voulais faire. Malheureusement cele m'affiche toujours les mêmes erreurs sous l'envirronement avec lequel je tavail (MPLAB, c'est pour telecharger sur un microcontroleur PIC).
Mais votre solution marche parfaitement.
Merci beaucoup du temps que tu y a consacré

Répondre à vincent68170

9

 loupius, le 18 mai 2009 à 16:06:55

Tu aurais pu préciser cet environnement particulier. Moi j'ai compilé classiquement avec 'gcc'.
Si le 'const' pose un problème, tu le vires !
Bon courage.

Répondre à loupius