Taille tableau de structure. [Résolu]

Messages postés
14
Date d'inscription
jeudi 25 juin 2009
Statut
Membre
Dernière intervention
3 juillet 2009
- - Dernière réponse : macbang
Messages postés
14
Date d'inscription
jeudi 25 juin 2009
Statut
Membre
Dernière intervention
3 juillet 2009
- 3 juil. 2009 à 11:13
Bonjour,

Mon programme fonctionne très bien pour le moment.

Le seul hic c'est que j'ouvre un fichier texte pour le découper ligne par ligne.

Pour l'instant j'ai testé sur des fichiers texte de environ 500 lignes grand max.

J'ai donc déclaré ma structure et mon tableau de structure comme ceci.

typedef struct infos{

int *id;

char *nom;

}infos;

infos test[500];

J'ai voulu testé le programme avec un fichier contenant BEAUCOUP plus de ligne (environ 50 000).

j'ai donc modifié la déclaration du tableau :

infos test[50000];

Lors de l'exécution, le programme plante ...

Une idée ?

Merci d'avance.
Afficher la suite 

7 réponses

Meilleure réponse
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
3
Merci
Tu fais une fonction qui prends en arguments un FILE*, et une limite de ligne. Cette fonction retourne un tableau de structure dynamiquement.

J'ai pas le code en tête, mais ça pourrait donner ceci:

infos* getLineFromFile(File* file, int limit);

FILE* file1 = fopen(...
FILE* file2 = fopen(...

infos* lines1 = NULL;
infos* lines2 = NULL;

while (!feof(file1) && !feof(file2))
{
  lines1 = getLineFromFile(file1, 100);
  lines2 = getLineFromFile(file2, 100);
  compare(lines1, lines2);
  free(lines1);
  free(lines2);
}

// Tester ici, si feof(file1) et si feof(file2). Si l'un des deux est à la fin et pas l'autre, les fichiers sont différents.

Attention: non testé, syntaxe non vérifiée, c'est juste un principe.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
Tu ne peux pas prévoir la taille de ton fichier. Le mieux reste tout de même de traiter les données par paquet.
Par exemple, tu pourrais très bien découper les lignes de ton fichier, 30 par 30. Les lignes une fois découpées, sont bien utilisées quelque part ? Donc pourquoi ne pas les utiliser au fur et à mesure du traitement que tu effectues dans ton fichier ?
Commenter la réponse de cptpingu
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
Quand je dis: tu ne peux pas prévoir la taille de ton fichier, j'entends par là: tu dois faire des opérations spécifiques pour le savoir. Opérations non nécessaires si tu traites toutes tes données par morceau, jusqu'à atteindre la fin du fichier.
Commenter la réponse de cptpingu
Messages postés
14
Date d'inscription
jeudi 25 juin 2009
Statut
Membre
Dernière intervention
3 juillet 2009
0
Merci
les lignes sont découpé une à une et les infos placé avec une boucle while (fgets) dans mon tableau de structure.
Je re-utilise cette structure pour en comparer les différentes saisis ( par exemple : infos[i].classe == infos[n].classe ).
Seulement il semble que mon programme est du mal a créer un tableau de structure supérieur à un certain nombre (environ 650).
Le programme compile mais lors de son execution il plante à la création du tableau : infos test[650];

Ca me parait étrange puisque je découpe dans une structure un autre fichier texte de la même façon dans une autre fonction ( exactement déclaré de la même manière) et la déclaration est la dernière :
topologie test[8000];    (topologie étant un autre typedef struct).
Commenter la réponse de macbang
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
Si tu déclares de grands tableaux statiques de partout, je ne suis pas étonné que tu soit à cours de mémoire au bout d'un moment...
De plus, si ta structure est "grosse" alors tu alloues 650 * sizeof (ta_struct), ce qui peut faire beaucoup.

Je continue d'appuyer sur le fait que tu devrais comparer ton fichier par morceau, en stockant une partie des lignes récupérées seulement, et pas toutes en même temps. Ca reviendrait au même que ce que tu fais, à la différence que la taille du fichier n'impacterait pas sur la reservation mémoire de manière aussi prononcé.
Commenter la réponse de cptpingu
Messages postés
14
Date d'inscription
jeudi 25 juin 2009
Statut
Membre
Dernière intervention
3 juillet 2009
0
Merci
Oui je vois ce que tu veux dire mais par contre je sais pas trop comment m'y prendre pour arriver a cette fin.
Qu'est-ce qui va changer dans le programme ?
la boucle while (fgets) j'imagine ?
Commenter la réponse de macbang
Messages postés
14
Date d'inscription
jeudi 25 juin 2009
Statut
Membre
Dernière intervention
3 juillet 2009
0
Merci
Merci de ton aide, je vais me pencher dessus.
Commenter la réponse de macbang