Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[encore une question de debutant sur les tableau et structure]

38 réponses
Avatar
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");
}
}

return 0;
}

void mid(char id[10]){
printf("Entrer l'id ( 9 caracteres ) : ");
scanf("%s",&id);

}

char mget(mat matrice,char id[10],int pos){
int ligne;
ligne=ch_id(matrice,id);
return matrice.valeur[ligne][pos];
}

void mput(mat *matrice,char id[10],int pos,char chput){
int ligne;
ligne=ch_id(*matrice,id);
(*matrice).valeur[ligne][pos]=chput;
if (pos-(*matrice).teffectif[ligne]>=0)
(*matrice).teffectif[ligne]=(*matrice).teffectif[ligne]+pos-(*matrice).teffectif[ligne]+1;

}

void mmget(mat matrice,char id[10],int pos1, int pos2, char
resultat[pos2-pos1]){
int ligne;
ligne=ch_id(matrice,id);
strncpy(resultat,&matrice.valeur[ligne][pos1],pos2-pos1);
}

void mmput(mat *matrice,char id[10],int pos1,int pos2,char
chput[pos2-pos1]){
int ligne,i;
ligne=ch_id(*matrice,id);
for(i=pos1;i<=pos2;i++) (*matrice).valeur[ligne][i]=chput[i-pos1];
if (pos2-(*matrice).teffectif[ligne]>=0)
(*matrice).teffectif[ligne]=(*matrice).teffectif[ligne]+pos2-(*matrice).teffectif[ligne]+1;

}

void mnewline(mat *matrice, char id[10]){
strcpy((*matrice).valeur[(*matrice).effectif],id);
(*matrice).valeur[(*matrice).effectif][9]='\0';
(*matrice).effectif++;
(*matrice).teffectif[(*matrice).effectif-1]=10;

}

void mdelline(mat *matrice, char id[10]){
int ligne,i;
ligne=ch_id(*matrice,id);
for(i=ligne+1;i<=(*matrice).effectif-1;i++)
strcpy((*matrice).valeur[i-1],(*matrice).valeur[i]);
(*matrice).effectif--;
for(i=ligne+1;i<=(*matrice).effectif-1;i++)
(*matrice).teffectif[i-1]=(*matrice).teffectif[i];

}

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;
}

return j;
}

10 réponses

1 2 3 4
Avatar
Harpo
babar wrote:

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.


C'est vague comme diagnostic...

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)


La ligne au-dessus devrait sans doute commencer par un // , j'imagine
que cela vient du copier-coller.

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<P;i++)test.teffectif[i]=0;


Manque ');' à la fin de la ligne.

(...)
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);


temp est défini comme 'char temp[10]' *temp est donc un char, or %s
demande une chaîne.
Etc...

Je pense qu'il faut lire les messages du compilateur qui doit dire à peu
près la même chose que moi.

--
http://harpo.free.fr/

Avatar
Pierre Maurette
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.
C'est frugal comme indice, non ?


merci de bien vouloir regarder ce code et me signaler ce qui vous semble
incorrect.
Votre code compile sans problème, c'est bien mais ce n'est pas

suffisant. Il vous faudrait soit le réduire, soit donner un embryon
d'explication, peut-être le texte de l'exercice donné par le prof ? ;-)
Comme ça, je n'ai pas trop envie de décoder ce qu'est cette "id" sur 9
caractères.

Donc, juste quelques remarques:


#include <stdio.h>
#include <string.h>

typedef struct Matrice{
char valeur[50][25];
int effectif;
int teffectif[50];
}mat;
La taille de cette structure avec un sizeof(int) de 4 sera& au moins de

1454 char. En fait 1456, avec du padding entre valeur[][] et effectif.
Rappel: Un tableau comme une structure occupent leur taille dans la
mémoire automatique, disons la pile. Si vous travaillez sur une ou deux
mat, c'est jouable mais il faut le savoir.
En revanche, si le passage de tableaux à une fonction est d'autorité
remplacé par le passage de son adresse, les structures sont passées par
recopie, même si elles contiennent des tableaux. Il sera donc judicieux
de passer des mat* là ou vous passiez déjà des mat* et des const mat*
là où vous passiez des 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
Voir plus hat. De plus, vous avez un petit problème de nommage. matrice

est à la fois un mat et un mat*, c'est dangereux. Quand à l'opportunité
de matrice qui évoque un tableau pour une structure qui emballe ce
tableau, à vous de voir.



int main()
{
int i,choix,pos1,pos2;
char id[10],temp[10];
mat test;
test.effectif=0;
for (i=0;i<P;i++)test.teffectif[i]=0;
Vous écrivez en test.teffectif[50], or les indices alloués vont de 0 à

49. Boum.


printf(" Bienvenue dans le programme d' edition de tableaun Menu
: n n");
printf(" 1. Lire une lignen");
printf(" 2. Cree une lignen 3. Lire un element d une ligne n 4. Lire
une chaine d une lignen");
printf(" 5. Ecrire un caractere dans une ligne a une position
precisen");
printf(" 6. Ecrire une chaine de caractere ds une ligne a une position
precise n");
printf(" 7. Effacer une lignen 8. Quittern");

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 lignen");
printf(" 2. Cree une lignen 3. Lire un element d
une ligne n 4. Lire une chaine d une lignen");
printf(" 5. Ecrire un caractere dans une ligne a une
position precisen");
printf(" 6. Ecrire une chaine de caractere ds une
ligne a une position precise n");
printf(" 7. Effacer une lignen 8. Quittern");
}
}
Votre gestion du clavier ne peut servir qu'à des test. Je ne suis pas

bon non plus là-dessus, mais je ferais bien un truc de ce genre:

while (choix!='8'){
printf("Votre choix :");
fflush(stdin);
choix = getc(stdin);
switch (choix){
case '1' :
/* ...... */

En prévoyant expressément un case default.
MAis voyez plutôt la FAQ, ou attendez l'intervention des spécialistes,
pour ces histoire de saisie.

return 0;
}

void mid(char id[10]){
printf("Entrer l'id ( 9 caracteres ) : ");
scanf("%s",&id);

}
Ça me parait bien dépendant du bon vouloir de l'utilisateur, non ?


[ pas lu attentivement]

(*matrice).teffectif[i-1]=(*matrice).teffectif[i];
(*matrice).teffectif[i-1] c'est aussi matrice->teffectif[i-1]



--
Pierre Maurette

Avatar
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.
C'est frugal comme indice, non ?




Oui, veuillez m'excuser, a l'heure ou j ai ecris le message tout me
parraissait clair ... maintenant apres un semblant de nuit je comprend
le probleme que vous avez pu avoir. L'objectif vien a geré une base de
donnée. Enfin plusieur mais il n'y en aura qu'une d'ouverte a la fois.
Le probleme vien que lorsque j'utilise le fonction pour lire une ligne
que j aurai deja construite le programme me renvoi rien ou (null)
merci de bien vouloir regarder ce code et me signaler ce qui vous
semble incorrect.
Votre code compile sans problème, c'est bien mais ce n'est pas

suffisant. Il vous faudrait soit le réduire, soit donner un embryon
d'explication, peut-être le texte de l'exercice donné par le prof ? ;-)
Comme ça, je n'ai pas trop envie de décoder ce qu'est cette "id" sur 9
caractères.
Le id permet d etre plus efficasse dans les recherche et les lien entre

les informations des differentes matrice. mais cela n'interviendra pas
avant longtemps ... j aurai peut etre du m en separé pour faire ceci

Donc, juste quelques remarques:


#include <stdio.h>
#include <string.h>

typedef struct Matrice{
char valeur[50][25];
int effectif;
int teffectif[50];
}mat;
La taille de cette structure avec un sizeof(int) de 4 sera& au moins de

1454 char. En fait 1456, avec du padding entre valeur[][] et effectif.
Rappel: Un tableau comme une structure occupent leur taille dans la
mémoire automatique, disons la pile. Si vous travaillez sur une ou deux
mat, c'est jouable mais il faut le savoir.
En revanche, si le passage de tableaux à une fonction est d'autorité
remplacé par le passage de son adresse, les structures sont passées par
recopie, même si elles contiennent des tableaux. Il sera donc judicieux
de passer des mat* là ou vous passiez déjà des mat* et des const mat* là
où vous passiez des mat.

meme si j ai pas vraiment compris la raison, je vais essayé.


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
Voir plus hat. De plus, vous avez un petit problème de nommage. matrice

est à la fois un mat et un mat*, c'est dangereux. Quand à l'opportunité
de matrice qui évoque un tableau pour une structure qui emballe ce
tableau, à vous de voir.



int main()
{
int i,choix,pos1,pos2;
char id[10],temp[10];
mat test;
test.effectif=0;
for (i=0;i<P;i++)test.teffectif[i]=0;
Vous écrivez en test.teffectif[50], or les indices alloués vont de 0 à

49. Boum.




c'est en effet un probleme qui va etre vite reglé.

printf(" Bienvenue dans le programme d' edition de tableaun Menu
: n n");
printf(" 1. Lire une lignen");
printf(" 2. Cree une lignen 3. Lire un element d une ligne n 4.
Lire une chaine d une lignen");
printf(" 5. Ecrire un caractere dans une ligne a une position
precisen");
printf(" 6. Ecrire une chaine de caractere ds une ligne a une
position precise n");
printf(" 7. Effacer une lignen 8. Quittern");

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 lignen");
printf(" 2. Cree une lignen 3. Lire un
element d une ligne n 4. Lire une chaine d une lignen");
printf(" 5. Ecrire un caractere dans une
ligne a une position precisen");
printf(" 6. Ecrire une chaine de caractere ds
une ligne a une position precise n");
printf(" 7. Effacer une lignen 8. Quittern");
}
}
Votre gestion du clavier ne peut servir qu'à des test. Je ne suis pas

bon non plus là-dessus, mais je ferais bien un truc de ce genre:

while (choix!='8'){
printf("Votre choix :");
fflush(stdin);
choix = getc(stdin);
switch (choix){
case '1' :
/* ...... */

En prévoyant expressément un case default.
MAis voyez plutôt la FAQ, ou attendez l'intervention des spécialistes,
pour ces histoire de saisie.



quel est la difference entre getc et getchar ?
(apres teste cette forme ne permet pas d entré dans le switch)

return 0;
}

void mid(char id[10]){
printf("Entrer l'id ( 9 caracteres ) : ");
scanf("%s",&id);

}
Ça me parait bien dépendant du bon vouloir de l'utilisateur, non ?


[ pas lu attentivement]



disons que sa me permet de retrouvé des information contenu dans le
tableau sans etre dependant de leur position dans le tableau

(*matrice).teffectif[i-1]=(*matrice).teffectif[i];
(*matrice).teffectif[i-1] c'est aussi matrice->teffectif[i-1]



merci de votre aide


Bastien


Avatar
babar
babar wrote:

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.


C'est vague comme diagnostic...

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)


La ligne au-dessus devrait sans doute commencer par un // , j'imagine
que cela vient du copier-coller.

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<P;i++)test.teffectif[i]=0;


Manque ');' à la fin de la ligne.

(...)


je reconnais que le 50 devrai etre 49, mais je ne vois pas ou le ); est
manquant
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);


temp est défini comme 'char temp[10]' *temp est donc un char, or %s
demande une chaîne.
Etc...

je demande l affichage du tableau de caractere entier, il me semblait

que c'etait le moyen de le faire.

#include <stdio.h>

int main()
{
char entree[50];
printf("entré un mot :");
scanf("%s",&entree);
printf(" se mot a eté entré : %s %c n",entree, entree[0]);


return 0;
}

ce programme se compile et s exécute correctement en affichant bien le
mot et la premiere lettre du mot

Je pense qu'il faut lire les messages du compilateur qui doit dire à peu
près la même chose que moi.

l autre programme se compile aussi sans erreur le probleme est ailleur,

lorsque je demande de lire une ligne il me renvoi rien ou (null).

merci de votre reponse

Bastien


Avatar
babar
je vien de me rendre compte qu'appele matrice une base de donné sa fait
un peu speciale ... veuillé m'excusez ... j m'en vais corriger tout sa


Bastien
Avatar
Pierre Maurette
[...]
La taille de cette structure avec un sizeof(int) de 4 sera& au moins de
1454 char. En fait 1456, avec du padding entre valeur[][] et effectif.
Rappel: Un tableau comme une structure occupent leur taille dans la
mémoire automatique, disons la pile. Si vous travaillez sur une ou deux
mat, c'est jouable mais il faut le savoir.
En revanche, si le passage de tableaux à une fonction est d'autorité
remplacé par le passage de son adresse, les structures sont passées par
recopie, même si elles contiennent des tableaux. Il sera donc judicieux
de passer des mat* là ou vous passiez déjà des mat* et des const mat* là
où vous passiez des mat.

meme si j ai pas vraiment compris la raison, je vais essayé.

Ce n'est pas ça qui gêne le fonctionnement à mon avis. Mais c'est, ou

ce sera, un point important à comprendre.

[...]

quel est la difference entre getc et getchar ?
Vous avez raison. Sauf erreur, getchar() et getc(stdin), c'est pareil.


(apres teste cette forme ne permet pas d entré dans le switch)


Sous toutes réserves, les entrées standard n'étant pas mes copines:

#include <stdio.h>

const char* str_menu =
"1. Lire une lignen"
"2. Cree une lignen"
"3. Lire un element d une lignen"
"4. Lire une chaine d une lignen"
"5. Ecrire un caractere dans une ligne a une position precisen"
"6. Ecrire une chaine de caractere ds une ligne a une position
precise n"
"7. Effacer une lignen"
"8. Quittern"
"n"
;

int main(void)
{
int choix = '';
puts(" Bienvenue dans le programme d' edition de
tableaunnMenun");

while (choix!='8')
{
puts(str_menu);
printf("%s", "Votre choix :");
fflush(stdin);
choix = getchar();
switch (choix)
{
case '1' :
puts("Lire une ligne.");
break;
case '2' :
puts("Creer une ligne.");
break;
case '3' :
puts("Lire un element.");
break;
case '4' :
puts("Lire une chaine.");
break;
case '5' :
puts("Ecrire un caractere.");
break;
case '6' :
puts("Ecrire une chaine de caractere.");
break;
case '7' :
puts("Effacer une ligne.");
break;
case '8' :
puts("Merci et a bientot...");
break;
default:
puts("Pas bonne touche!");
}
}
return 0;
}

--
Pierre Maurette


Avatar
Marc Boyer
Le 27-02-2006, Pierre Maurette a écrit :
Sous toutes réserves, les entrées standard n'étant pas mes copines:
[SNIP]

fflush(stdin);


Non portable.
scanf("%*[^n]%*c");
vide la ligne courante.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exiter des sots
IF -- Rudyard Kipling

Avatar
Targeur fou
Marc Boyer wrote:

Salut,

Sous toutes réserves, les entrées standard n'étant pas mes copine s:
[SNIP]

fflush(stdin);


Non portable.


C'est même pire que ça, appliquer fflush() sur un flux d'entrée est
un UB (cf §J2)

scanf("%*[^n]%*c");
vide la ligne courante.


A+

Regis


Avatar
babar
Le menu fonctionne, mais se qui ne fonctionne pas c'est la fonction
et/ou (encor inderterminé) l affichage du resultat de la recherche et/ou
(et encor plus genant) la modification du tableau... mais bon cela ne
reste que des supposition, j vais faire des testes pour voir ou cela flanche

merci de vos reponse

Bastien
Avatar
Pierre Maurette
Le menu fonctionne,
Attention quand même, c'est bugué, lisez les autres messages (Marc

Boyer). Bah, que je me trompe ne peux déranger un babar ...

--
Pierre Maurette

1 2 3 4