Les structures en langage c

Résolu/Fermé
chayfer Messages postés 6 Date d'inscription jeudi 2 juin 2011 Statut Membre Dernière intervention 2 mars 2012 - 2 juin 2011 à 19:04
 frank - 26 janv. 2014 à 14:06
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!

2 réponses

rdany Messages postés 18 Date d'inscription mercredi 1 juin 2011 Statut Membre Dernière intervention 15 février 2012 1
4 juin 2011 à 18:26
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: https://docs.microsoft.com/en-us/windows/console/setconsolecursorposition?redirectedfrom=MSDN ). La fonction SetConsoleTextAttribute (lien MSDN, en anglais: https://docs.microsoft.com/en-us/windows/console/setconsoletextattribute?redirectedfrom=MSDN ) 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.
1
rdany Messages postés 18 Date d'inscription mercredi 1 juin 2011 Statut Membre Dernière intervention 15 février 2012 1
4 juin 2011 à 18:31
dsl pour le doublon, j'ai pas mal de mal avec Internet Explorer depuis hier soir.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
Modifié par lami20j le 4/06/2011 à 18:37
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 https://www.commentcamarche.net/infos/25957-commentcamarche-l-equipe/

Ici quelques liens qui pourront t'aider
https://www.commentcamarche.net/infos/
https://www.commentcamarche.net/infos/

Bonne continuation
</Hors sujet>

P.S. J'ai restauré 2 de tes messages
https://forums.commentcamarche.net/forum/affich-22260211-les-structures-en-langage-c#9 et ton dernier
0
rdany Messages postés 18 Date d'inscription mercredi 1 juin 2011 Statut Membre Dernière intervention 15 février 2012 1
4 juin 2011 à 20:30
Bonjou lami20j,

<hors sujet>

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

<fin du hors sujet>
0
rdany Messages postés 18 Date d'inscription mercredi 1 juin 2011 Statut Membre Dernière intervention 15 février 2012 1
Modifié par rdany le 2/06/2011 à 23:56
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: https://www.commentcamarche.net/contents/119-les-structures-en-langage-c pour plus de détails sur les structures, et ici: https://forums.commentcamarche.net/forum/affich-37622105-langage-c-les-types-de-donnees , sous "Créer un type de donnée" pour une description succinte du mot-clé typedef, ainsi que sur le post ici: https://forums.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.
0
chayfer Messages postés 6 Date d'inscription jeudi 2 juin 2011 Statut Membre Dernière intervention 2 mars 2012
3 juin 2011 à 13:13
merci bcp rdany pour ton aide,oui tu m'as bien aider et j'ai arrivé à corrigé mes erreurs!c'est vrai que d'aprés nos fautes en apprends c'est l'objectif de mon mini projet sauf que c'est ma premiére année préparatoire en cette matiére c'est pour cela des fois j'ai besoin d'un coup de main! merciiii
0
chayfer Messages postés 6 Date d'inscription jeudi 2 juin 2011 Statut Membre Dernière intervention 2 mars 2012
3 juin 2011 à 13:23
voila le mini projet que le prof nous à demandé de le faire je trouve un probleme






GESTION d'UNE BANQUE


Soit les 2 structures suivantes :

* « Client » il contient les informations sur les clients.
o Id _client: entier.
o nom : chaîne de caractères.
o prénom : chaîne de caractères.
o profession : chaîne de caractères.
o Num_tel: chaîne de caractères.
o Date d'ouverture.
o Profession.

* « compte » il contient les informations sur les comptes des clients.
o Id_compte : entier.
o Id_client : entier.
o Solde de base : réel.
Travail à faire :

Réaliser les programmes menus suivants :

1. MENU GENERAL.


MENU GENERAL
A. Gestion des clients
B. Gestion des comptes
C. Gestion des opérations
D. Quitter
Id_client :
Nom :
Prenom :
Profession :
Num_tel :
Retour


Nom :
Prenom :
Profession :
Num_tel :
Retour
2. MENU GESTION DES CLIENTS

MENU GESTION DES CLIENTS

1. Ajout client
2. Modification
3. Suppression
4. Recherche
5. MENU GENERAL
supression se fait ==> 1.Un par un
2.Tout


la recherche se fait a partir de==> 1. Par id_client
2. Par nom







Id_compte : nouveau compte se fait a partir de id client et idcompte!
Id_client :
Solde de base :
Date d'ouverture :




3. MENU GESTION DES Comptes :

MENU GESTION DES COMPTES
1. Nouveau compte
2. Consultation
3. Fermeture du compte
4. MENU GENERAL

et ça c'est un tableau que l'on doit afficher!
Id_client :
Id_compte| Nom & Prénom| Solde de base| Opérations effectuées/date
|
-
-
-
-

4. MENU GESTION DES OPERATIONS :
Id_compte :
Id_client :
Montant retiré :



MENU GESTION DES OPEARTIONS
1 .Retrait
2. Virement
3. MENU GENERAL


Id_compte :
Id_client :
Montant versé : le virement se fait à partir de ces 3 donnés



« Gestion des clients »

1) On ne peut pas ajouter un client qui existe déjà.
2) la Modification et la Suppression se font par id_client.
3) La suppression doit être confirmé (Supprimer O/N ?).

« Gestion des comptes»

1) On ne peut pas ajouter un compte qui existe déjà.
2) Un client peut avoir plusieurs comptes.
3) la fermeture du compte se fait par id_compte.
4) La suppression doit être confirmer (Supprimer O/N ?).
5) Le solde de base doit être supérieur à 1000DH.

« Gestion des opérations»

6) Le retrait ne doit pas dépasser 700 DH.



c'est le mini projet ....que je doit faire! :|
0
rdany Messages postés 18 Date d'inscription mercredi 1 juin 2011 Statut Membre Dernière intervention 15 février 2012 1
Modifié par rdany le 3/06/2011 à 16:36
De rien, on est là pour çà. C'est sympa, comme mini-projet. N'hésites pas à revenir, si tu as besoin d'explications.

PS: pour les problèmes de gets et du stockage du code ASCII au lieu des valeurs numériques, c'est bon aussi ?
0
chayfer Messages postés 6 Date d'inscription jeudi 2 juin 2011 Statut Membre Dernière intervention 2 mars 2012
Modifié par chayfer le 3/06/2011 à 17:56
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);
}
}
0
rdany Messages postés 18 Date d'inscription mercredi 1 juin 2011 Statut Membre Dernière intervention 15 février 2012 1
Modifié par rdany le 4/06/2011 à 18:25
0