Les Allergies
Alimentaires
Posez votre question Signaler

Les structures en langage c [Résolu]

chayfer 3Messages postés 2 juin 2011Date d'inscription 2 mars 2012Dernière intervention - Dernière réponse le 4 juin 2011 à 20:30
bonjour les amies!
aidez moi a trouvé la bonne syntaxe de gets voici ce que m'affiche le programme à partir de la ligne gets (invalid use of undefined type 'struct clients '!
voici le code complet:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<errno.h>
typedef struct clients {
int *idclient;
char nom[30] ;
char prenom[30] ;
char profession[30];
int numtel;
int dateouverture;
char Profession[30];
}clients;
struct clients c;
typedef struct compte
{
int idcompte;
int idclient;
float soldebase;
}compte;
void ajout (clients *c ,int *comp)
{
printf("entrer votre id");
scanf("%d",&c[*comp ].idclient);
printf("entrer le nom");
fflush (stdin);
gets( c[*comp].nom);
printf("entrer votre prenom");
fflush(stdin);
gets(c[*comp].prenom);
printf("entrer votre profession");
fflush (stdin);
gets( c[*comp].profession);
printf("entrer le numéro de tel");
fflush (stdin);
gets( c[*comp].numtel);
printf("entrer la date d'ouverture");
fflush(stdin);
gets( c[*comp].dateouverture);
*comp++;
}
void modifier (struct client c[],int comp)
{ int pos,x;
printf("entrer l'id");
scanf("%d",&x);
pos= rechercher (c,comp,x);
if (pos==1)
printf("id incorrect");
else
{
printf("entrer le nom");
fflush(stdin);
gets(c[pos].nom);
printf("enrer prenom");
fflush(stdin);
gets(c[pos].prenom);
printf("entrer votre profession");
fflush(stdin);
gets(c[pos].profession);
printf("entrer numtel");
fflush(stdin);
gets(c[pos].numtel);
}
}
int rechercher(stuct clients c[100],int comp ,int x)
{ int i;
for(i=0;i<comp;i++)
{
if("c[i].idclient==x");
return i;
return 1;
}
}
je n'est pas encore finis d'écrire mon code car je complile en écrivant et je veux savoir l'erreur cé au bout de cette ligne gets(c[pos].nom);
veuillez me répondre si cé possible!
Lire la suite 

Les structures en langage c »

11 réponses
Réponse
+1
moins plus
Bonjour,

gotoxy fait partie d'extensions de Borland au standard du langage C. Ton message d'erreur m'indique que tu utilises MinGW (Windows) ou gcc (linux), mais sous linux, je crois que gotoxy est prise en charge, donc tu utilises MinGW (sous Code::Blocks ou DevCpp). Tu doit aussi avoir le warning "implicit declaration of 'gotoxy'", émis par le compilateur, ton message d'erreur étant émis par le linker, qui ne sait pas quelle librairie additionnelle il doit utiliser. Si tu travailles effectivement sous Windows (tu as créé un projet application console), tu peux utiliser la fonction SetConsoleCursorPosition (lien MSDN, en anglais: http://msdn.microsoft.com/en-us/library/ms686025(v=vs.85).aspx ). La fonction SetConsoleTextAttribute (lien MSDN, en anglais: http://msdn.microsoft.com/en-us/library/ms686047(v=vs.85).aspx ) te permet même de changer la couleur de texte (foreground) et celle du fond (background), bien que ce ne soit qu'esthétique, et donc pas important dans un premier temps.

Par exemple (compilé sous Code::Blocks 10.5):

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
COORD coord;

coord.X = 10;
coord.Y = 5;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_BLUE | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); // texte blanc brillant, fond bleu

printf("Hello world!\n");

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED); // Couleurs d'origine: texte blanc sous fond noir

return 0;
}

Par contre, çà ne fonctionnera que sous Windows 2000 professionnel ou ultérieur (donc pas sous un vrai DOS).

PS: le code passe mal sur le forum. De SetConsoleTextAttribute jusqu'au bout du commentaire, c'est sur la même ligne, pour les deux appels à cette fonction.
rdany- 4 juin 2011 à 18:31
dsl pour le doublon, j'ai pas mal de mal avec Internet Explorer depuis hier soir.
lami20j- 4 juin 2011 à 18:36
Salut,

<Hors sujet>
Je vois que tu es nouveau sur CCM. Soit le bienvenu.
Si un de tes messages a du mal à passer, c'est peut être à cause de robot qui réagit à certains termes.
Pour éviter la réécriture de texte (des fois long) et/ou s'énerver d'avoir perdu ce qu'on a écrit, si tu as firefox je te propose d'installer lazarus qui te permettra de récupérer le texte perdu.
En même temps tu peux contacter un modo par MP pour restauration.
Ici la liste des modo http://www.commentcamarche.net/contents/ccmguide/ccmequipe.php3

Ici quelques liens qui pourront t'aider
http://www.commentcamarche.net/contents/ccm/
http://www.commentcamarche.net/faq/commentcamarche-176

Bonne continuation
</Hors sujet>

P.S. J'ai restauré 2 de tes messages
http://www.commentcamarche.net/forum/affich-22260211-les-structures-en-langage-c#9 et ton dernier
rdany- 4 juin 2011 à 20:30
Bonjou lami20j,

<hors sujet>

Merci pour les liens, les infos et le coup de pouce!

<fin du hors sujet>
Ajouter un commentaire
Réponse
+0
moins plus
Bonsoir,

Pour déclarer une structure machin contenant une variable a de type int et une variable b de type char:
struct machin{
int a;
char b;
}machin;

Pour déclarer une variable bidule de type structure machin:
struct machin bidule;

La déclaration:
typdef struct{
int a;
char b;
}machin;

déclare un nouveau type, le type machin, qui est une structure consituée d'une variable a de type int et d'une variable b de type char .

Pour déclarer une variable bidule de type machin:
machin bidule;

Le typedef permet donc de se passer du struct lors de déclarations de variables de type structure.

Je te propose d'aller ici: http://www.commentcamarche.net/contents/c/cstruct.php3 pour plus de détails sur les structures, et ici: http://www.commentcamarche.net/contents/c/ctype.php3 , sous "Créer un type de donnée" pour une description succinte du mot-clé typedef, ainsi que sur le post ici: http://www.commentcamarche.net/forum/affich-9854493-typedef#q=typedef&cur=4&url=%2F pour plus de détails et un exemple sur le sujet.

Ensuite, avec toutes ces infos, vérifie ton code, tranquillement. Notamment:
- les déclarations des types clients et comp, suivant si tu veux que ceux-ci soient des types ou des structures,
- ainsi que les variables relatives à ces types (ou à ces structures, le cas échéant).

[EDIT]

Voilà pour les structures et le typedef. En revanche, tu vas avoir des problèmes avec
gets. Cette fonction ne limite pas le nombre de caractères entrés (risque de buffer overflow - dépassement de capacité), et elle prend comme argument un pointeur vers un tableau de type char, et retourne un pointeur vers le tableau de caractères si la lecture sur stdin (le plus souvent, c'est le clavier) ou NULL en cas d'erreur. Cette fonction ne prend pas de paramètre lui indiquant la taille du tableau, d'où le risque de dépassement de capacité. Je te recommande plutôt d'utiliser fgets, qui prend en paramètres, dans cet ordre: un pointeur vers un tableau de type char, la taille de ce tableau, flot de données (stdin ou fichier). Cette fonction a les même retours que gets. Par exemple,
char test[256];
int *nRet = fgets(test, 256, stdin);
if(nret==NULL) // = if(!nRet)
printf("Erreur lors de la saisie.\n");
fflush(stdin);

De plus, dans ta structure, tu as, par exemple: int numtel
Ecrire un char dans un int est autorisé par le compilateur car le type char est en fait un int (déclaré comme ceci: typedef int char;), mais fonctionnellement, numtel contiendra, après remplissage, le code ASCII étendu (pour simplifier l'explication: code ASCII), qui est un nombre codé sur 8 bits, donc compris entre 0 et 255, du premier caractère présent dans le tampon du clavier. Si l'utilisateur de ton programme saisi un numéro de téléphone sur 10 chiffres, c'est la cata: supposons, pour simplifier,qu'un int ne puisse contenir qu'un seul code ASCII (ce n'est pas le cas, mais autant faire simple), avec gets, NumTel contiendra le code ASCII du premier caractère saisi, DateOuverture contiendra le code ASCII du second caractère saisi, et Profession[0], le troisième, Profession [1], le quatrième, et ainsi de suite, jusqu'au dixième, c'est un buffer overflow, sans compter que tu ne stocke pas le numéro de téléphone, mais du code ASCII. Avec fgets, pas de buffer overflow, avec, par exemple, en supposant la variable c déclarée comme étant une variable de type structure: fgets(c.numtel, 1, stdin); mais toujours le problème du code ASCII au lieu du numéro de téléphone. Le même principe s'applique pour DateOuverture.

Quant à scanf, je t'apporte une précision: si tu l'utilise avec la chaîne de formatage %s pour entrer une chaîne de caractères (au lieu %d pour formater l'entrée saisie au format double ou %i pour formater cette même entrée au format entier - integer en anglais), sache que scanf supprime les espaces qui lui semblent inutiles et parfois, tout ce qui suit l'espace en question.

Je te propose de revoir un peu ton code, tu es tombé dans quelques pièges que tu sauras maintenant éviter.

[FIN D'EDIT]

L'idéal étant à mon sens que tu résolves les problèmes par toi-même (c'est comme çà qu'on apprend, en faisant des erreurs et en les corrigeant après s'être documenté, au besoin), j'espère t'avoir suffisamment guidé, dans cet objectif. Si toutefois tu as besoin de plus de détails, n'hésite pas.
chayfer- 3 juin 2011 à 16:37
oui c'est bon ,j'ai seulement un problem avec gotoxy pour afficher les donnés dans le tableau de consultation! lors de la compilation une erreur s'affiche( undifened reference to gotoxy)
voici le code que j'ai écris :
for (i=0;i<*compt;i++)
{
gotoxy(2,i+3);
printf(" %s",com[i].idcompte);
gotoxy(25,i+3);
printf(" %s",c[i].nom);
gotoxy(49,i+3);
printf(" %d",com[i].soldebase);
gotoxy(73,i+3);
printf("%d",com[i].dateouverture);
}
}
rdany- 4 juin 2011 à 17:00
Désolé, oublié un espace après mes liens pour que çà aille. Les voici:
http://msdn.microsoft.com/en-us/library/ms686025(v=vs.85).aspx
et
http://msdn.microsoft.com/en-us/library/ms686047(v=vs.85).aspx
rdany- 4 juin 2011 à 17:36
Je vois que mon commentaire a été perdu (celui du 4 juin vers 16h45). Je te le réécrit: Apparamment, tu travailles soit sous Code::Blocks, soit sous DevCpp. Le message d'erreur que tu as est émis par le linker de MinGW (c'est GCC pour Windows). Tu dois aussi avoir un warning "implicit declaration of'gotoxy'". gotoxy est une fonction faisant partie d'une extension au standard du langage C fournie dans les compilateurs Borland. Pour s'en servir avec leur compilateur, il faut inclure conio.h et indiquer au linker de quelle librairie additionnelle il doit se servir. Il existe des conio.h avec leur librairie pour MinGW sur le net. Si tu travailles effectivement sous Windows (tu as créé un projet console), tu peux te servir de la fonction SetConsoleCursorPosition (lien MSDN, en anglais: http://msdn.microsoft.com/en-us/library/ms686025(v=vs.85).aspx ). Tu peux même changer la couleur du texte et la couleur de fond avec SetConsoleTextAttribute (lien MSDN, en anglais: http://msdn.microsoft.com/en-us/library/ms686047(v=vs.85).aspx ), bien que ce ne soit qu'esthétique et pas indispensable dans un premier temps.

Par exemple (compilé sous Code::Blocks 10.5):

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
COORD coord;

coord.X = 10;
coord.Y = 5;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_BLUE | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY); // texte blanc brillant, fond bleu

printf("Hello world!\n");

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED); // Couleurs d'origine: texte blanc sous fond noir

return 0;
}
Ajouter un commentaire
Ce document intitulé « Les structures en langage c » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?