Allouer un GROS tableau en C

Résolu/Fermé
Deaven - Modifié par Deaven le 19/05/2010 à 16:26
Emmanuel Delahaye Messages postés 107 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 17 juillet 2019 - 20 mai 2010 à 09:32
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
A voir également:

5 réponses

Emmanuel Delahaye Messages postés 107 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 17 juillet 2019 7
19 mai 2010 à 19:01
Tu as oublié de poster le code avec lequel tu as un problème.
0
grou29 Messages postés 39 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 19 mai 2010 9
19 mai 2010 à 23:53
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
0
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 ... :(
0
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Emmanuel Delahaye Messages postés 107 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 17 juillet 2019 7
Modifié par Emmanuel Delahaye le 20/05/2010 à 09:36
Plutôt que de bricoler avec "les () à remplacer par des crochets," utiliser les balises code avec le bouton "<>".

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
0