aidedeclaration programme C

mator

Membre confirmé
21 Octobre 2004
92
0
54
Bonjour, voici le debut de mon programme.Quand je le lance il m'affiche le 1er point d'interrogation sur la console, j'inscris 1504 et il affiche le 2eme point d'interrogation puis les autres et cela marche parfaitement.
Maintenant si au lieu d'inscrire 1504 j'inscris 1505 soit la console disparait soit j'ai un message qui dit "erreur d'adresse".
Même si je passe en unsigned long c'est toujours le même resultat.
Pouvez-vous me dire ce qui ne va pas dans mes declarations et ce qu'il faut changer pour qu'il accepte des valeurs > 1504?
Merci
___________
# include <stdio.h>
main ()
{
FILE *barcd;
FILE *forve;
char possib9[10];
char tout[10];


unsigned short tab[1506][10],zab[1506][1];
unsigned short ca[10],xab[2][10];
unsigned short i,j,y,k,a,r,s,t,v,b,c,d,e,f,g,h,l,m;

barcd = fopen ("possib9","w");
forve= fopen ("tout","r");
scanf("%hu",&y);
for(i=0;i<y;i++) {
for(j=0;j<10;j++) {
fscanf(forve,"%hu",&tab[j]);
}
}

scanf("%hu %hu %hu %hu %hu",&a,&r,&s,&t,&v);
 
En premiere lecture, je ne vois pas de debordement d'index.
Tu es sur que ton fichier "tout" contient suffisamment de données ?

Quelques conseils si tu le permet :

- Evite les declarations de gros tableau en local : ils s'allouent sur la pile et c'est pas cool.
- Commente tes sources.
- Donne des noms clairs a tes variables, evite i,j,k,l.... On n'est plus en Cobol...


Cordialement
 
Autre conseils:
- Pense &#224; fermer tes fichier en fin de programme
- V&#233;rifie que ton fichier en lecture contient des donn&#233;es:
if (!feof(forve))
fscanf(forve,"&#37;hu",&tab[j]);
- Evite les d&#233;clarations qui embrouille l'esprit : zab[1506][1] = zab[1506]
- Comme l'as dit Didier fais des allocations dynamiques MAIS SURTOUT N'OUBLIE pas de les lib&#233;rer!

Jacques
 
Bonjour et merci pour vos reponses.
J'ai verifié les données du tableau et c'est correct.
Mon fichier est bien fermé à la fin.
Par contre je ne sais pas faire d'allocations dynamiques.
La seule chose que je remarque c'est que dans l'expression :unsigned short tab[1506][10],zab[1506][1];
Si je la remplace par : unsigned short tab[1505][10],zab[1505][1];
Au premier scanf quand j'inscris 1503 OU 1504 le programme tourne parfaitement.
C'est quand je repasse à : unsigned short tab[1506][10],zab[1506][1];
Si j'inscris 1504 ou 1505 là cela ne marche plus du tout.
Pourtant à mon faible niveau je ne vois pas ou cela cloche
 
Bonjour et merci pour vos reponses.
J'ai verifié les données du tableau et c'est correct.
Mon fichier est bien fermé à la fin.
Par contre je ne sais pas faire d'allocations dynamiques.
La seule chose que je remarque c'est que dans l'expression :unsigned short tab[1506][10],zab[1506][1];
Si je la remplace par : unsigned short tab[1505][10],zab[1505][1];
Au premier scanf quand j'inscris 1503 OU 1504 le programme tourne parfaitement.
C'est quand je repasse à : unsigned short tab[1506][10],zab[1506][1];
Si j'inscris 1504 ou 1505 là cela ne marche plus du tout.
Pourtant à mon faible niveau je ne vois pas ou cela cloche

Peut etre un probleme de gestion de pile locale. Tes tableaux sont vraiment volumineux.
Tu peut faire un essai rapide pouv voir si c'est cela : deplace la declaration des tableaux avant le "main".
Qu'est que ca donne ?

Cordialement
 
Bonjour, j'ai essayé avec les declarations avant le main et j'ai un message d'erreur qui est
"code overflow".
Par contre quand j'essaye avec le programme tel quel j'ai comme message d'erreur:
erreur systeme : erreur d'adresse veuillez redemarer
et quand je clique j'ai "erreur bus".

Cela me depasse.
 
Salut

Et si tu essais ça, ca donne quoi?

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

#define TAB_SIZE_2D 10

void main(int argc, char* argv[])
{
FILE *barcd;
FILE *forve;
char possib9[10];
char tout[10];


/* unsigned short tab[1506][TAB_SIZE_2D],zab[1506][1];*/
unsigned short *tab;
unsigned short ca[10],xab[2][10];
unsigned short i,j,y,k,a,r,s,t,v,b,c,d,e,f,g,h,l,m;

barcd = fopen ("possib9","w");
if (barcd)
{
forve= fopen ("tout","r");
if (forve)
{
scanf("%hu",&y);
tab = (unsigned short*) malloc (sizeof(unsigned short) * y * TAB_SIZE_2D);
if (tab)
{
for(i=0;i<y;i++)
{
for(j=0;j<TAB_SIZE_2D;j++)
{
if (!feof(forve))
/* fscanf(forve,"%hu",&tab[j]); */
fscanf(forve,"%hu",&tab[(i*TAB_SIZE_2D) + j] );
}
}
free (tab);
}
fclose (forve);
}
fclose (barcd);
}
}
JB