[encore une question de debutant sur les tableau et structure]
38 réponses
babar
Malgres la bonne dizaine de message qui traite le sujet ici, j'ose quand
meme demander un peu d aide parce que je ne comprend pas pourquoi mon
code ne marche pas.
merci de bien vouloir regarder ce code et me signaler ce qui vous semble
incorrect.
#include <stdio.h>
#include <string.h>
typedef struct Matrice{
char valeur[50][25];
int effectif;
int teffectif[50];
}mat;
int ch_id(mat matrice,char id[10]); // permet de donné la ligne de
chaque element du tableau ( ref par id de 9 caractere)
char mget(mat matrice,char id[10],int pos);// permet de recup 1 caractere
void mput(mat *matrice,char id[10],int pos,char chput);// permet de
mettre 1 caractere
void mmget(mat matrice,char id[10],int pos1, int pos2, char
resultat[pos2-pos1]);//permet de recup une chaine de caractere
void mmput(mat *matrice,char id[10],int pos1,int pos2,char
chput[pos2-pos1]);//permet de mettre une chaine de caractere
void mnewline(mat *matrice, char id[10]);//permet de construire une ligne
void mdelline(mat *matrice, char id[10]);//permet de detruire une ligne
void mprintline(mat matrice, char id[10]);//permet d affiché une ligne
void mid(char id[10]);//permet d entrée une id
int main()
{
int i,choix,pos1,pos2;
char id[10],temp[10];
mat test;
test.effectif=0;
for (i=0;i<=50;i++)test.teffectif[i]=0;
printf(" Bienvenue dans le programme d\' edition de tableau\n Menu
: \n \n");
printf(" 1. Lire une ligne\n");
printf(" 2. Cree une ligne\n 3. Lire un element d une ligne \n 4.
Lire une chaine d une ligne\n");
printf(" 5. Ecrire un caractere dans une ligne a une position
precise\n");
printf(" 6. Ecrire une chaine de caractere ds une ligne a une
position precise \n");
printf(" 7. Effacer une ligne\n 8. Quitter\n");
choix=0;
while (choix!=8){
printf("Votre choix :");
scanf("%d",&choix);
switch (choix){
case 1 :
printf("Lire une ligne.\n");
mid(id);
mprintline(test,id);
break;
case 2 :
printf("Creer une ligne.\n");
mid(id);
mnewline(&test,id);
break;
case 3 :
printf("Lire un element.\n");
mid(id);
printf("Position de l element : ");
scanf("%d",&pos1);
temp[0]=mget(test,id,pos1);
printf("%c -- a ete recuperer.\n",*temp);
break;
case 4 :
printf("Lire une chaine.\n");
mid(id);
printf("Borne -- max 10 : ");
scanf("%d %d",&pos1,&pos2);
mmget(test,id,pos1,pos2,temp);
printf("%s -- a ete recuperer.\n",*temp);
break;
case 5 :
printf("Ecrire un caractere.\n");
mid(id);
printf("Position de l element : ");
scanf("%d",&pos1);
printf("Entrer le caractere :");
scanf("%c",&temp);
mput(&test,id,pos1,*temp);
printf("%s -- a ete recuperer.\n",temp);
break;
case 6 :
printf("Ecrire une chaine de caractere.\n");
mid(id);
printf("Borne -- max 10 : ");
scanf("%d %d",&pos1,&pos2);
printf("Entrer la chaine : ");
scanf("%s",&temp);
mmput(&test,id,pos1,pos2,temp);
printf("%s -- a ete recuperer.\n",temp);
break;
case 7 :
printf("Effacer une ligne");
mid(id);
mdelline(&test,id);
break;
case 8 :
printf("Merci et a bientot");
break;
}
if (choix!=8){
printf(" 1. Lire une ligne\n");
printf(" 2. Cree une ligne\n 3. Lire un element
d une ligne \n 4. Lire une chaine d une ligne\n");
printf(" 5. Ecrire un caractere dans une ligne
a une position precise\n");
printf(" 6. Ecrire une chaine de caractere ds
une ligne a une position precise \n");
printf(" 7. Effacer une ligne\n 8. Quitter\n");
}
}
void mprintline(mat matrice, char id[10]){
int ligne;
ligne=ch_id(matrice,id);
printf("%s \n",matrice.valeur[ligne]);
}
int ch_id(mat matrice,char id[10])
{
int i,j;
for (j=0;j<=matrice.effectif;j++){
i=0;
while (strcmp(&matrice.valeur[j][i],&id[i])==0 && i<=9) i++;
if (i==10) break;
}
Le code initial proposé par babar compile sans warning sous gcc 3.4.4
Upgrade !
-- http://harpo.free.fr/
babar
Malgres la bonne dizaine de message qui traite le sujet ici, j'ose quand meme demander un peu d aide parce que je ne comprend pas pourquoi mon code ne marche pas.
merci de bien vouloir regarder ce code et me signaler ce qui vous semble incorrect.
Ca déjà...
Compiling: main.c main.c: In function `main_': main.c:65: warning: format argument is not a pointer (arg 2) main.c:73: warning: char format, different type arg (arg 2) main.c:74: warning: passing arg 4 of `mput' with different width due to prototype main.c:83: warning: char format, different type arg (arg 2) main.c: In function `mid': main.c:110: warning: char format, pointer arg (arg 2) main.c: In function `mmget': main.c:131: warning: passing arg 3 of `strncpy' as unsigned due to prototype main.c:176:2: warning: no newline at end of file main.c: In function `mid': main.c:128: error: prior parameter's size depends on 'pos2' main.c:128: error: prior parameter's size depends on 'pos1' main.c:134: error: prior parameter's size depends on 'pos2' main.c:134: error: prior parameter's size depends on 'pos1' Process terminated with status 1 (0 minutes, 0 seconds) 4 errors, 7 warnings
merci :) mais pourquoi dev-cpp m a pas donné ces warning et ces erreurs ?
Malgres la bonne dizaine de message qui traite le sujet ici, j'ose
quand meme demander un peu d aide parce que je ne comprend pas
pourquoi mon code ne marche pas.
merci de bien vouloir regarder ce code et me signaler ce qui vous
semble incorrect.
Ca déjà...
Compiling: main.c
main.c: In function `main_':
main.c:65: warning: format argument is not a pointer (arg 2)
main.c:73: warning: char format, different type arg (arg 2)
main.c:74: warning: passing arg 4 of `mput' with different width due to
prototype
main.c:83: warning: char format, different type arg (arg 2)
main.c: In function `mid':
main.c:110: warning: char format, pointer arg (arg 2)
main.c: In function `mmget':
main.c:131: warning: passing arg 3 of `strncpy' as unsigned due to
prototype
main.c:176:2: warning: no newline at end of file
main.c: In function `mid':
main.c:128: error: prior parameter's size depends on 'pos2'
main.c:128: error: prior parameter's size depends on 'pos1'
main.c:134: error: prior parameter's size depends on 'pos2'
main.c:134: error: prior parameter's size depends on 'pos1'
Process terminated with status 1 (0 minutes, 0 seconds)
4 errors, 7 warnings
merci :)
mais pourquoi dev-cpp m a pas donné ces warning et ces erreurs ?
Malgres la bonne dizaine de message qui traite le sujet ici, j'ose quand meme demander un peu d aide parce que je ne comprend pas pourquoi mon code ne marche pas.
merci de bien vouloir regarder ce code et me signaler ce qui vous semble incorrect.
Ca déjà...
Compiling: main.c main.c: In function `main_': main.c:65: warning: format argument is not a pointer (arg 2) main.c:73: warning: char format, different type arg (arg 2) main.c:74: warning: passing arg 4 of `mput' with different width due to prototype main.c:83: warning: char format, different type arg (arg 2) main.c: In function `mid': main.c:110: warning: char format, pointer arg (arg 2) main.c: In function `mmget': main.c:131: warning: passing arg 3 of `strncpy' as unsigned due to prototype main.c:176:2: warning: no newline at end of file main.c: In function `mid': main.c:128: error: prior parameter's size depends on 'pos2' main.c:128: error: prior parameter's size depends on 'pos1' main.c:134: error: prior parameter's size depends on 'pos2' main.c:134: error: prior parameter's size depends on 'pos1' Process terminated with status 1 (0 minutes, 0 seconds) 4 errors, 7 warnings
merci :) mais pourquoi dev-cpp m a pas donné ces warning et ces erreurs ?
babar
Emmanuel Delahaye wrote:
Alors élève le niveau de diagnostic de ton compilateur.
C'est une réponse diplomatique. Je dirais : 'change de compilateur', il n'est pas normal qu'un compilateur compile un code grossièrement erroné sans signaler d'erreur. Le code initial proposé par babar compile sans warning sous gcc 3.4.4 de
code::blocks, sous XP x64, avec les paramètres proposés par défaut par l'IDE. Après un simple copié-collé, et une seule ligne à remettre d'un seul tenant. Pas d'autre outil pour tester, j'ai cassé de la bécane.
merci pour la defence :)
Emmanuel Delahaye wrote:
Alors élève le niveau de diagnostic de ton compilateur.
C'est une réponse diplomatique.
Je dirais : 'change de compilateur', il n'est pas normal qu'un
compilateur compile un code grossièrement erroné sans signaler
d'erreur.
Le code initial proposé par babar compile sans warning sous gcc 3.4.4 de
code::blocks, sous XP x64, avec les paramètres proposés par défaut par
l'IDE. Après un simple copié-collé, et une seule ligne à remettre d'un
seul tenant.
Pas d'autre outil pour tester, j'ai cassé de la bécane.
Alors élève le niveau de diagnostic de ton compilateur.
C'est une réponse diplomatique. Je dirais : 'change de compilateur', il n'est pas normal qu'un compilateur compile un code grossièrement erroné sans signaler d'erreur. Le code initial proposé par babar compile sans warning sous gcc 3.4.4 de
code::blocks, sous XP x64, avec les paramètres proposés par défaut par l'IDE. Après un simple copié-collé, et une seule ligne à remettre d'un seul tenant. Pas d'autre outil pour tester, j'ai cassé de la bécane.
merci pour la defence :)
Emmanuel Delahaye
mais pourquoi dev-cpp m a pas donné ces warning et ces erreurs ?
Probabmement mal reglé (j'utilise le même compilateur que toi, soit mingw mais avec Code::Blocks, ce qui ne change rien)
je peux faire un copié-collé ? Y'a pas de copyright ? ... au moins une courte citation...
En fait, tu as raison, je me contente assez petitement de '-W -Wall', tu as raison de bien secouer le cocotier, fais quand même attention, fais comme moi, met un casque.
je peux faire un copié-collé ? Y'a pas de copyright ?
... au moins une courte citation...
En fait, tu as raison, je me contente assez petitement de '-W -Wall', tu
as raison de bien secouer le cocotier, fais quand même attention, fais
comme moi, met un casque.
je peux faire un copié-collé ? Y'a pas de copyright ? ... au moins une courte citation...
En fait, tu as raison, je me contente assez petitement de '-W -Wall', tu as raison de bien secouer le cocotier, fais quand même attention, fais comme moi, met un casque.
-- http://harpo.free.fr/
Emmanuel Delahaye
probablement, mais moi pas comprendre grand chose ... j ose supposer que se sont des commande a ajouté lors de l appel du compilateur ?
Oui, avec gcc. Makefile ou IDE recommandés...
-- A+
Emmanuel Delahaye
probablement, mais moi pas comprendre grand chose ... j ose supposer que
se sont des commande a ajouté lors de l appel du compilateur ?
Malgres la bonne dizaine de message qui traite le sujet ici,
puis plus loin...
char valeur[50][25];
Stop. Là moi je m'arrête, et je demande : as-tu lu la FAQ, en particulier la partie 7 qui traite des tableaux et tout particulièrement des « tableaux à plusieurs dimensions », concept en réalité inconnu du C ?
La réponse, à parcourir de très très loin ton message, semble être non.
Ton programme est a la fois long (donc rempli de défauts qui se répètent) et construit typiquement à l'envers par rapport aux concepts du langage C (manipulation de tableaux, passage de structures par valeur). On aurait pris un programme Basic fonctionnant bien, et on l'aurait traduit mot-à-mot en C, qu'on obtiendrait quelque chose de proche. Mais cela n'a pas grand'chose à voir avec le langage C.
En C, il y a un truc qui s'appelle les pointeurs. Indispensable, et incontournable. Et avant de vouloir manipuler les "matrices" et les structures, il me paraît indispensable de maîtriser plus les pointeurs que ce que tu montres ici.
Évite aussi les tableaux de taille calculée, les compilateurs ne sont pas sûrs.
for (j=0;j<=matrice.effectif;j++){ i=0; while (strcmp(&matrice.valeur[j][i],&id[i])==0 && i<=9) i++; if (i=) break; } Si cela fonctionne en général (c'est-à-dire avec des chaînes qui ne font PAS toutes 9 caractères), tu peux encadrer ta bibliothèque C, ell est vraiment super au niveau du ramasse-miettes. Revise d'abord ce que font strcmp (et strncmp et memcmp), strcpy et strncpy (ici, tu les utilises exactement à l'envers), et aussi memcpy/memmove. Tu veras que cela va simplifier ton programme. Tu vas aussi pouvoir laisser tomber teffectif, et donc réviser mput.
Désolé si je te paraîs dur (on va dire que je suis fatigué), mais je trouve tellement que tu pars sur une fausse route que je trouve cela franchement dommage...
Antoine
En news:4402692b$0$11078$636a55ce@news.free.fr, babar va escriure:
Malgres la bonne dizaine de message qui traite le sujet ici,
puis plus loin...
char valeur[50][25];
Stop. Là moi je m'arrête, et je demande : as-tu lu la FAQ, en particulier la
partie 7 qui traite des tableaux et tout particulièrement des « tableaux à
plusieurs dimensions », concept en réalité inconnu du C ?
La réponse, à parcourir de très très loin ton message, semble être non.
Ton programme est a la fois long (donc rempli de défauts qui se répètent) et
construit typiquement à l'envers par rapport aux concepts du langage C
(manipulation de tableaux, passage de structures par valeur). On aurait pris
un programme Basic fonctionnant bien, et on l'aurait traduit mot-à-mot en C,
qu'on obtiendrait quelque chose de proche.
Mais cela n'a pas grand'chose à voir avec le langage C.
En C, il y a un truc qui s'appelle les pointeurs. Indispensable, et
incontournable. Et avant de vouloir manipuler les "matrices" et les
structures, il me paraît indispensable de maîtriser plus les pointeurs que
ce que tu montres ici.
Évite aussi les tableaux de taille calculée, les compilateurs ne sont pas
sûrs.
for (j=0;j<=matrice.effectif;j++){
i=0;
while (strcmp(&matrice.valeur[j][i],&id[i])==0 && i<=9) i++;
if (i=) break;
}
Si cela fonctionne en général (c'est-à-dire avec des chaînes qui ne font PAS
toutes 9 caractères), tu peux encadrer ta bibliothèque C, ell est vraiment
super au niveau du ramasse-miettes.
Revise d'abord ce que font strcmp (et strncmp et memcmp), strcpy et strncpy
(ici, tu les utilises exactement à l'envers), et aussi memcpy/memmove. Tu
veras que cela va simplifier ton programme. Tu vas aussi pouvoir laisser
tomber teffectif, et donc réviser mput.
Désolé si je te paraîs dur (on va dire que je suis fatigué), mais je trouve
tellement que tu pars sur une fausse route que je trouve cela franchement
dommage...
Malgres la bonne dizaine de message qui traite le sujet ici,
puis plus loin...
char valeur[50][25];
Stop. Là moi je m'arrête, et je demande : as-tu lu la FAQ, en particulier la partie 7 qui traite des tableaux et tout particulièrement des « tableaux à plusieurs dimensions », concept en réalité inconnu du C ?
La réponse, à parcourir de très très loin ton message, semble être non.
Ton programme est a la fois long (donc rempli de défauts qui se répètent) et construit typiquement à l'envers par rapport aux concepts du langage C (manipulation de tableaux, passage de structures par valeur). On aurait pris un programme Basic fonctionnant bien, et on l'aurait traduit mot-à-mot en C, qu'on obtiendrait quelque chose de proche. Mais cela n'a pas grand'chose à voir avec le langage C.
En C, il y a un truc qui s'appelle les pointeurs. Indispensable, et incontournable. Et avant de vouloir manipuler les "matrices" et les structures, il me paraît indispensable de maîtriser plus les pointeurs que ce que tu montres ici.
Évite aussi les tableaux de taille calculée, les compilateurs ne sont pas sûrs.
for (j=0;j<=matrice.effectif;j++){ i=0; while (strcmp(&matrice.valeur[j][i],&id[i])==0 && i<=9) i++; if (i=) break; } Si cela fonctionne en général (c'est-à-dire avec des chaînes qui ne font PAS toutes 9 caractères), tu peux encadrer ta bibliothèque C, ell est vraiment super au niveau du ramasse-miettes. Revise d'abord ce que font strcmp (et strncmp et memcmp), strcpy et strncpy (ici, tu les utilises exactement à l'envers), et aussi memcpy/memmove. Tu veras que cela va simplifier ton programme. Tu vas aussi pouvoir laisser tomber teffectif, et donc réviser mput.
Désolé si je te paraîs dur (on va dire que je suis fatigué), mais je trouve tellement que tu pars sur une fausse route que je trouve cela franchement dommage...
Antoine
Harpo
Emmanuel Delahaye wrote:
je peux faire un copié-collé ?
Oui, bien sûr, c'est fait pour.
L'usage des mots d'un dictionnaire n'enfreint aucun coyright, la manière subtile dont tu emploies les options de GCC pourrait faire penser que ta manière de les utiliser puisse l'être. Encore merci pour ton poëme.
-- http://harpo.free.fr/
Emmanuel Delahaye wrote:
je peux faire un copié-collé ?
Oui, bien sûr, c'est fait pour.
L'usage des mots d'un dictionnaire n'enfreint aucun coyright, la manière
subtile dont tu emploies les options de GCC pourrait faire penser que
ta manière de les utiliser puisse l'être.
Encore merci pour ton poëme.
L'usage des mots d'un dictionnaire n'enfreint aucun coyright, la manière subtile dont tu emploies les options de GCC pourrait faire penser que ta manière de les utiliser puisse l'être. Encore merci pour ton poëme.