Allouer un GROS tableau en C
Résolu
Deaven
-
Emmanuel Delahaye Messages postés 107 Date d'inscription Statut Membre Dernière intervention -
Emmanuel Delahaye Messages postés 107 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je souhaite allouer un gros tableau de flottant en langage C ( typiquement 10^12 cases voir plus si possible). Et là, j'ai le bon vieux "Segmentation Fault" des familles qui me revient en pleine tête... Quelqu'un pour m'aider ?
A noté que sur mon ancien ordi, ça ne lui posait aucun problème, alors que sur le nouveau (2 quad core + 8 Go de Ram s'il vous plait...) impossible !!! L'ancien est un mandrake et le nouveau est un Unbuntu, peut être que le problème vient de là ? (j'y crois moyen...)
Le même code marche très bien sur l'ancien ordi, ce n'est donc pas une erreur de programmation.
Plz help
Je souhaite allouer un gros tableau de flottant en langage C ( typiquement 10^12 cases voir plus si possible). Et là, j'ai le bon vieux "Segmentation Fault" des familles qui me revient en pleine tête... Quelqu'un pour m'aider ?
A noté que sur mon ancien ordi, ça ne lui posait aucun problème, alors que sur le nouveau (2 quad core + 8 Go de Ram s'il vous plait...) impossible !!! L'ancien est un mandrake et le nouveau est un Unbuntu, peut être que le problème vient de là ? (j'y crois moyen...)
Le même code marche très bien sur l'ancien ordi, ce n'est donc pas une erreur de programmation.
Plz help
A voir également:
- Allouer un GROS tableau en C
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Imprimer un tableau excel - Guide
- Tableau croisé dynamique - Guide
5 réponses
Attention
Sache que ton affirmation "Le même code marche très bien sur l'ancien ordi, ce n'est donc pas une erreur de programmation. " est fausse.
En informatique, il arrive que des programmes mal codés fonctionnent "par chance" sur un pc et pas sur un autre. voici quelques exemples:
- un logiciel avec plusieurs processus /threads se comportera différemment sur un pc multi-core ou hyperthreadé.
- d'un OS a l'autre l'accès a une zone non alloué peu échouer sur un et passer sur un autre.
- un pc configuré en anglais peut interpréter le point comme séparateur des décimal et pas un pc en français
- Le temps d'exécution d'un programme variant d'un Pc a l'autre, un programme peut se comporter différemment.
-
Grou29
http://lienssanslien.free.fr
Sache que ton affirmation "Le même code marche très bien sur l'ancien ordi, ce n'est donc pas une erreur de programmation. " est fausse.
En informatique, il arrive que des programmes mal codés fonctionnent "par chance" sur un pc et pas sur un autre. voici quelques exemples:
- un logiciel avec plusieurs processus /threads se comportera différemment sur un pc multi-core ou hyperthreadé.
- d'un OS a l'autre l'accès a une zone non alloué peu échouer sur un et passer sur un autre.
- un pc configuré en anglais peut interpréter le point comme séparateur des décimal et pas un pc en français
- Le temps d'exécution d'un programme variant d'un Pc a l'autre, un programme peut se comporter différemment.
-
Grou29
http://lienssanslien.free.fr
Mon code est un code scientifique faisant dans les 3000 lignes de code... ^^
Après quelque test, le problème vient de l'allocation suivante:
{
int maxat=15000;
int nx=100, ny =100, nz =100, maxliste = 200;
int cliste(nx)(ny)(nz)(maxliste);
int vliste(maxat)(maxliste);
//Remplacer les parenthèses par des crochets
return 0;
}
ça ne marche pas non plus si je fais ça :
{
int cliste(nx*ny*nz*maxliste);
//Toujours remplacer les parenthèses par des crochets
}
Peut être faut il que je passe par un malloc ? ( ce qui m'arrange pas vu le jeu d'indice qu'il va falloir que je fasse dans le code...)
à noter que quand je descend les entiers maxat, nx, ny, nz, maxliste, le code se remet à marcher.
Grou29 : Qu'entends tu par tes deux premiers points ?
Existe t'il des bibliothèque standards qui gèrent ce genre de problème d'allocation ? ou des options de compilation ?
Je n'utilise que <stdio.h> <math.h> (avec l'option -lm à la compil) et <time.h>
Je suis assez surpris que personne ne trouve, je pensais que c'était un problème tout bête ... :(
Après quelque test, le problème vient de l'allocation suivante:
{
int maxat=15000;
int nx=100, ny =100, nz =100, maxliste = 200;
int cliste(nx)(ny)(nz)(maxliste);
int vliste(maxat)(maxliste);
//Remplacer les parenthèses par des crochets
return 0;
}
ça ne marche pas non plus si je fais ça :
{
int cliste(nx*ny*nz*maxliste);
//Toujours remplacer les parenthèses par des crochets
}
Peut être faut il que je passe par un malloc ? ( ce qui m'arrange pas vu le jeu d'indice qu'il va falloir que je fasse dans le code...)
à noter que quand je descend les entiers maxat, nx, ny, nz, maxliste, le code se remet à marcher.
Grou29 : Qu'entends tu par tes deux premiers points ?
Existe t'il des bibliothèque standards qui gèrent ce genre de problème d'allocation ? ou des options de compilation ?
Je n'utilise que <stdio.h> <math.h> (avec l'option -lm à la compil) et <time.h>
Je suis assez surpris que personne ne trouve, je pensais que c'était un problème tout bête ... :(
Je suis désolé, il fallait juste passer par la fonction malloc qui doit mieux gérer les allocations mémoires que la simple déclaration de tableau.
Je suis très confu... merci quand même de vos réponse.
Je suis très confu... merci quand même de vos réponse.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Plutôt que de bricoler avec "les () à remplacer par des crochets," utiliser les balises code avec le bouton "<>".
En ce qui concerne l'allocation de gros tableaux, je te conseille de lire ceci pour comprendre pourquoi ton code risquait de ne pas fonctionner :
http://www.bien-programmer.fr/notes.php#donnees
Tu utilisais la mémoire locale (automatique) qui est limitée (aucun contrôle). La mémoire allouée est aussi limitée (bien plus haut) et au moins, si l'allocation échoue, on est prévenu.
http://www.bien-programmer.fr/notes.php#malloc
http://www.bien-programmer.fr/notes.php#tabdyn_2d
C is a sharp tool
C'est nettement plus clair int x[10];
En ce qui concerne l'allocation de gros tableaux, je te conseille de lire ceci pour comprendre pourquoi ton code risquait de ne pas fonctionner :
http://www.bien-programmer.fr/notes.php#donnees
Tu utilisais la mémoire locale (automatique) qui est limitée (aucun contrôle). La mémoire allouée est aussi limitée (bien plus haut) et au moins, si l'allocation échoue, on est prévenu.
http://www.bien-programmer.fr/notes.php#malloc
http://www.bien-programmer.fr/notes.php#tabdyn_2d
C is a sharp tool