Taille maximale de tableau

Taille maximale de tableau - C - Programmation

Marsh Posté le 15-11-2004 à 14:03:29    

Je dispose d'un programme dans lequel je manipule des tableaux de double dont la taille est variable. Pour le moment je déclare en mémoire environ 20 tableaux monodimensionnels contenant chacun 720 doubles. Je n'ai pas de problème de compilation. Je décide ensuite d'augmenter la taille de ces tableaux à 72000 double par tableau. Je compile et j'ai un message d'erreur (lancé par windoze xp) incompréhensible à base 000xxx. J'ai  un P4 avec 1Go de ram. Je pense que ça peut encaisser 20 tableaux de 72000 doubles...on bien peut-être que non...? Pouvez-vous m'éclairer?
 

Reply

Marsh Posté le 15-11-2004 à 14:03:29   

Reply

Marsh Posté le 15-11-2004 à 14:06:52    

message d'erreur à la compile ou à l'exécution?:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-11-2004 à 14:16:02    

La pile, le tas, les tailles pas défaut des compilos, toussa quoi.  
 
Mais revenons sur l'erreur. Windows affiche une boite de dialogue avec juste marqué "000xxx" ? T'as un Windows piraté ou quoi ?

Reply

Marsh Posté le 15-11-2004 à 14:22:04    

8*72000*20 => 11520000 octets,soit 11250 ko jpense qui a encore de la marge


Message édité par red faction le 15-11-2004 à 14:22:17
Reply

Marsh Posté le 15-11-2004 à 14:27:19    

red faction a écrit :

8*72000*20 => 11520000 octets,soit 11250 ko jpense qui a encore de la marge


Il ne t'as pas dit il alloue ses tableaux. Si c'est en variables locales, alors 11Mo, ça fait beaucoup pour une pile, non ?

Reply

Marsh Posté le 15-11-2004 à 14:43:07    

le C ANSI garantie une taille maximale d'un objet de 32K et le C99 de 64K si je me souviens bien. Même si ton système peut aller beaucoup plus loin, il me semble dangereux d'avoir des objets de telle taille dans la pile

Reply

Marsh Posté le 15-11-2004 à 14:44:06    

je suppose que c alloue a coup de malloc() ou de new, parce que mettre ca sur la pile ou en global c pas tres recommandé

Reply

Marsh Posté le 15-11-2004 à 15:59:00    

En lisant les messages de GROFRED, j'ai la mauvaise impression qu'il fait du C comme on écrit du Fortran 77, auquel cas je crains qu'il ne fasse complètement fausse route.
En F77, il n'y a pas de notion d'alloc dynamique, que je sache et on ne fait pas de distinction entre pile et tas.

Reply

Marsh Posté le 16-11-2004 à 14:30:22    

et oui je pense que "el muchacho à raison"...malheureusement il y a des trucs que je ne comprends pas en c. Je me suis manifestement fait une représentation du fonctionnement qui n'est pas la bonne. Pour moi quand je déclare mes tableaux j'ai des trucs du style:
 

Code :
  1. #include <stdio.h>
  2. #include <math.h>
  3. #define N 72000
  4. double tab1[N];
  5. .....
  6. double tabi[N];
  7. .....
  8. double tab20[N];
  9. int main (void)
  10. {
  11. appel et manipulation des tableaux déclarés avant
  12. return 0;
  13. }


 
Ce qui me parait flou c'est cette histoire de pile et de tas...moi je pensais que la déclaration permettait d'allouer en mémoire l'espace nécessaire et que le compilo se charge de stocker les variables en registre ou en ram suivant les besoins...
Je posterais plus tard le message réel envoyé par windows...
 
J'utilise DEVC++ et mon compilateur est gcc.


Message édité par GROFRED le 18-11-2004 à 12:00:06
Reply

Marsh Posté le 16-11-2004 à 17:39:51    

#define N 72000
 
double tab1[N];
.....
double tabi[N];
.....
double tab20[N];  
 
 
 
va te pendre ...

Reply

Marsh Posté le 16-11-2004 à 17:39:51   

Reply

Marsh Posté le 16-11-2004 à 22:20:06    

GROFRED a écrit :

et oui je pense que "el muchacho à raison"...malheureusement il y a des trucs que je ne comprends pas en c. Je me suis manifestement fait une représentation du fonctionnement qui n'est pas la bonne. Pour moi quand je déclare mes tableaux j'ai des trucs du style:
 
#include <stdio.h>
#include <math.h>
 
#define N 72000
 
double tab1[N];
.....
double tabi[N];
.....
double tab20[N];
 
int main (void)
 
{
appel et manipulation des tableaux déclarés avant
return 0;
}
...

Tu as declaré tes tableaux en tant que variables globales. Est-ce que tu en as réellement besoin ?
Et tu peux utiliser des tableaux à plusieurs dimensions !
Pour ne pas avoir de problème de taille des tableaux et pour que ce soit un peu plus "propre", tu peux faire une allocation dynamique :

Code :
  1. double**  tableaux=NULL;
  2. tableaux=(double**)calloc(NB_TABLEAUX, szieof(double*));
  3. if (tableaux == NULL) /* Oups, allocation impossible */;
  4. for (i=0;i<NB_TABLEAUX;i++)
  5. {
  6.   tableaux[i]=(double*)calloc(N, double);
  7.   if (tableaux[i] == NULL)
  8.    {
  9.     while (i>0) {i--;free(tableaux[i]);taleaux[i]=NULL;}
  10.     free(tableaux);tableaux=NULL;
  11.     /* Oups, allocation impossible */
  12.    }
  13. }

Voilà, ça devrait être un peu mieux. n'oublie pas de désallouer à la fin du traitement ou même en plein milieu si tu dois brusquement le stopper. :D


Message édité par darkoli le 16-11-2004 à 22:21:42

---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 17-11-2004 à 10:30:13    

Taz a écrit :

#define N 72000
 
double tab1[N];
.....
double tabi[N];
.....
double tab20[N];  
 
 
 
va te pendre ...


 
Pas besoin d'être insultant. Pour quelqu'un qui n'a fait que du Fortran jusqu'à présent, ça n'a rien d'étonnant, vu qu'en Fortran (77), les tableaux statiques sont la seule "structure" de données qui existe (ce pourquoi j'ai détesté le Fortran dès le premier jour que j'ai dû en faire à la fac). Bref, GROFRED a bcp à apprendre avant de pouvoir écrire du C.
 
GROFRED > je ne peux que te conseiller d'arrêter complètement d'écrire du code et d'étudier le Kernighan & Ritchie sérieusement pour maitriser les notions de pointeur, allocation/désallocation, et structures de données. C'est un minimum, car Sans maitriser cela, tu n'iras vraiment pas loin en C. Le C, ce n'est pas simplement un changement de syntaxe / Fortran, c'est bcp, bcp de concepts et de connaissances que l'on n'a pas besoin d'avoir en Fortran.
 
D'ailleurs, vu que tu débutes, personnellement, je te conseillerais d'apprendre directement le C++.  
Tu écriras certainement du code "dégueu" , mais tu feras probablement bcp moins d'erreurs parce que le compilo t'aide plus, tu manipules bcp moins de pointeurs directement (grâce à la notion de références), et ça sera tjrs moins "dégueu" qu'en C.


Message édité par el muchacho le 17-11-2004 à 10:47:55
Reply

Marsh Posté le 17-11-2004 à 10:36:37    

darkoli > ton code est pas meilleur. voyons voir si tu saurais alloué N double[N]

Reply

Marsh Posté le 17-11-2004 à 10:41:25    

GROFRED > bonjour, tu fais du C, si tu prends un livre de C, tu ne trouveras la notion de variable globale que dans les derniers chapitres. Je gueuler surtout pour le tab1 tab2 tab3 ... et pour le fait de faire 20 tableaux de 1Mo ...

Reply

Marsh Posté le 17-11-2004 à 10:53:20    

ok


Message édité par GROFRED le 17-11-2004 à 10:54:09
Reply

Marsh Posté le 17-11-2004 à 11:15:30    

non pas OK. parce que si tu traites une grande quantité de données, genre une énorme NxN, c'est bien mieux quand c'est contigu
 
 
mais dis moi, ton N, c'est ta limite max <Assez Gros Pour Que Ça March> ?
 
 
darkoli > j'attend toujours :)

Reply

Marsh Posté le 17-11-2004 à 11:24:44    

Taz a écrit :

non pas OK. parce que si tu traites une grande quantité de données, genre une énorme NxN, c'est bien mieux quand c'est contigu
 
 
mais dis moi, ton N, c'est ta limite max <Assez Gros Pour Que Ça March> ?
 
 
darkoli > j'attend toujours :)


 
Taz, pour te donner une idée de ce à quoi du code Fortran peut ressembler, en Fortran (je parle du 77), il n'y a :
 - pas de structures de données si ce n'est des tableaux statiques (déclarés comme il l'a fait). Oui, en Fortran, la limite c'est bien "assez gros pour que ça marche"
 - aucune notion de portée. TOUT est global (enfin presque).
 - une notion de typage minimaliste puisque limitée aux types fondamentaux (int, float, char).
 
Et c'est pratiquement tout, le reste n'étant guère plus qu'une infâme bouillie de GOTO dans tous les sens. Donc quand tu penses aux millions de lignes de code Fortran écrit par des gorets qui n'utilisent même pas à plein les quelques facilités du langage, tu pleures.


Message édité par el muchacho le 17-11-2004 à 12:13:58
Reply

Marsh Posté le 17-11-2004 à 11:29:53    

OK, alors c'est pas la peine de répéter la même chose en C, toute façon, il ira pas bien loin comme ça

Reply

Marsh Posté le 17-11-2004 à 11:37:35    

Bien tout d'abord, j'ai suivi la remarque de "el muchacho" j'ai acheté le delannoy "langage C". J'ai pas trouvé le K&R mais je vais essayer de le trouver comme c'est la bible...
 
Concernant mon programme il s'agit d'un programme de simulation de la combustion dans un moteur 4 temps sur 720 degrés. Pour faire le calcul, j'utilise la méthode d'intégration d'euler qui n'est précise que si on utilise un pas d'intégration fin soit 1/100 de degrés total je me traîne avec 72001 doubles juste pour le tableau contenant les angles vilebrequin. De là avec des relations diverses et variées, je calcule la pression, le volume de la chambre de combustion, la température, la masse, la vitesse du piston etc etc. Au total j'ai environ 20 variables du système qui ont une valeur (un double) associées à chaque angle. Comme je dois récupérer toutes ces valeurs dans un fichier externe je souhaitais les stocker dans des tableaux différents pour plus de clarté. En conséquence je suis amené à manipuler 20 tab de 72001 valeurs de doubles...charmant. En variables globales puisque je souhaite les écrire toutes dans un fichier, j'ai besoin qu'elles restent stockées quelquepart...j'espère avoir été suffisamment exhaustif dans la description de mon problème et de pouvoir justifier pourquoi j'ai voulu faire comme ça...même si apparamment c'est "pure folie" ;-)


Message édité par GROFRED le 17-11-2004 à 11:39:15
Reply

Marsh Posté le 17-11-2004 à 13:08:41    

Taz a écrit :

darkoli > j'attend toujours :)

Je dois faire quoi ?
Mon code "fonctionne", même si je n'aurais personnellement pas utilisé cette méthode.
Que veux-tu dire par "si tu saurais alloué N double[N]", un tableau à deux dimensions de taille NxN ?


Message édité par darkoli le 17-11-2004 à 13:09:25

---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 17-11-2004 à 14:24:25    

double (*tab)[72000];  
 
...
 
tab = malloc( n * sizeof *tab );

Reply

Marsh Posté le 17-11-2004 à 14:36:13    

Pour éclairer votre lanterne sur mon profil programmation, j'ai eu un enseignement en école d'ingé sur le C fait par des non spécialistes et quand j'étais en thèse j'utilisais Matlab: un environnement de calcul scientifique avec interpréteur de commande. Le langage est hyper permissif dans le sens où tu déclares tes variables sans te soucier du type, pour les tableaux l'allocation mémoire est automatique. La syntaxe est proche du C. Pour finir cette usine à gaz utilise des librairies de calcul LAPACK en FORTRAN. Je m'aperçoit maintenant que toutes ces "simplifications" n'aident pas à acquérir de bonnes habitudes de programmation... :D


Message édité par GROFRED le 17-11-2004 à 14:37:15
Reply

Marsh Posté le 17-11-2004 à 17:35:11    

cris56 a écrit :

double (*tab)[72000];  
 
...
 
tab = malloc( n * sizeof *tab );

ouala !

Reply

Marsh Posté le 17-11-2004 à 20:57:37    

GROFRED a écrit :

Pour éclairer votre lanterne sur mon profil programmation, j'ai eu un enseignement en école d'ingé sur le C fait par des non spécialistes et quand j'étais en thèse j'utilisais Matlab: un environnement de calcul scientifique avec interpréteur de commande. Le langage est hyper permissif dans le sens où tu déclares tes variables sans te soucier du type, pour les tableaux l'allocation mémoire est automatique. La syntaxe est proche du C. Pour finir cette usine à gaz utilise des librairies de calcul LAPACK en FORTRAN. Je m'aperçoit maintenant que toutes ces "simplifications" n'aident pas à acquérir de bonnes habitudes de programmation... :D


Pour des langages spécialisés comme Matlab, le typage dynamique est commode et les erreurs n'ont pas de grosses conséquences, les pb étant plutôt de l'ordre du calcul numérique. Mais pour ce qui est du Fortran par exemple, qui est effectivement une simplification (à l'époque des premiers Fortran, il n'y avait rien d'autre), à partir du moment où un langage comme le C a été créé, ta conclusion est effectivement exacte. Et la facilité d'apprentissage du Fortran n'est pas un avantage par rapport aux millions d'heures perdues à déboguer du code Fortran.

Reply

Marsh Posté le 22-11-2004 à 10:55:20    

Bien à propos de cette histoire de tableau, il semble que ce code fasse planter le système sous win98 et envoie un message d'erreur sous win xp
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5.   double TABMAX [10][72000];
  6.   system("PAUSE" );
  7.   return 0;
  8. }


 
Il me semble clair que le système est incapable de prendre en charge cette quantité d'information et d'allouer la mémoire suffisante. Cependant, Matlab accepte des tableaux [10000]*[10000] et dans ce cas bouffe 800 mo de ram. Pourquoi n'en est t'il pas de même avec mon prog en C? théoriquement à l'image de Matlab je devrais pouvoir déclarer un tableau de 10000*10000...
 
J'ai essayé d'augmenter le fichier de mémoire virtuelle (j'ai 1go de ram et un fichier de 2go de mem virtuelle). Je compile sous gcc mais avec VC++ ça me renvoie le même message d'erreur.
 
:(


Message édité par GROFRED le 22-11-2004 à 10:56:35
Reply

Marsh Posté le 22-11-2004 à 11:24:26    

mais on t'a dis de ne pas déclaré ca sur la pile un objet aussi gros ??

Reply

Marsh Posté le 22-11-2004 à 12:11:56    

depuis le début du thread, cris et taz essaient de t'expliquer que le C n'est pas capable de gérer des objets d'une taille pareille "tout seul".
 
Il faut que tu réserves toi même la mémoire (cris t'as montré une manière de le faire) et alors seulement tu peux taper dedans
et il ne faut pas oublier de libérer la mémoire allouée quand tu n'en as plus besoin.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 22-11-2004 à 12:25:42    

toute façon, quand tu demandes 800Mo de RAM, tu les as pas, le système fait le flemmard et te les fileras à la demande  
 

Citation :

Matlab accepte des tableaux [10000]*[10000]

Super, maintenant, il se passe quoi si tu remplis ton tableau ? Windows va se vautrer comme une merde

Reply

Marsh Posté le 22-11-2004 à 12:28:25    

Taz a écrit :

toute façon, quand tu demandes 800Mo de RAM, tu les as pas, le système fait le flemmard et te les fileras à la demande  
 

Citation :

Matlab accepte des tableaux [10000]*[10000]

Super, maintenant, il se passe quoi si tu remplis ton tableau ? Windows va se vautrer comme une merde


 
non non il accepte le tableau rempli...Concernant les allocations mémoire je pensais qu'écrire:
 
double TABMAX[72000];
 
ça permettait d'allouer la mémoire nécessaire une fois pour toute (dans l'hypothèse ou ç'est possible) et que malloc permet d'allouer dynamiquement de la mémoire c'est à dire pour moi agrandir la taille du tableau pendant l'exécution du prog. Dois-je comprendre que malloc "force" une allocation mémoire qui ne serait pas possible en faisant:
 
double TABMAX[72000];
 
?


Message édité par GROFRED le 22-11-2004 à 13:41:20
Reply

Marsh Posté le 22-11-2004 à 12:34:13    

menteur

Reply

Marsh Posté le 22-11-2004 à 12:36:45    


Pas de problèmes pour Windows.  
Windows NT 4.0 monte à 2Go, et Win2K et XP montent à 3 Go pour le userland (1Go est reservé pour le systemland). Sur une archi 32 bits bien sûr.
 

Reply

Marsh Posté le 22-11-2004 à 12:38:02    

Lam's a écrit :

Pas de problèmes pour Windows.  
Windows NT 4.0 monte à 2Go, et Win2K et XP montent à 3 Go pour le userland (1Go est reservé pour le systemland). Sur une archi 32 bits bien sûr.

nan, mais c'est bon, si t'as un soft qui bouffe 800Mo de mémoire, ton système, il est a genou, encore plus si c'est windows

Reply

Marsh Posté le 22-11-2004 à 12:44:33    

Taz a écrit :

nan, mais c'est bon, si t'as un soft qui bouffe 800Mo de mémoire, ton système, il est a genou, encore plus si c'est windows


Nan nan. Il y a eu du progrès ces 5 dernières années.  
 
Windows va être clairement à genou si tu n'as que 512 Mo de RAM (plus à cause de ses E/S bloquantes que à cause d'une gestion de la RAM foireuse).  
 
Mais vu qu'il en a 1Go, une appli bien codée (et je pense que des trucs comme Matlab, Photoshop et autres sont très bien codées), ça passe comme une lettre à la poste.

Reply

Marsh Posté le 22-11-2004 à 13:11:32    

bah j'avais pas vu qu'il avait 1Gigo

Reply

Marsh Posté le 22-11-2004 à 13:21:05    


 [:benou_miam]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 22-11-2004 à 13:46:54    

nan nan ça passe trankil avec 1go et windaube s'en tire bien. Je suis pas pro micromou mais bon un 2000 ou un XP mériterait presque le nom d'OS. Le problème c'est que micromou à mis dans la tete des gens qu'aussi vrai que le soleil se lèvera demain, l'informatique "ça plante" et c'est normal...je pense que les codeurs microsoftiens qui ont pondu win98 ont le même niveau que moi en C...
 
:-)

Reply

Marsh Posté le 22-11-2004 à 13:50:18    

GROFRED a écrit :

nan nan ça passe trankil avec 1go et windaube s'en tire bien. Je suis pas pro micromou mais bon un 2000 ou un XP mériterait presque le nom d'OS. Le problème c'est que micromou à mis dans la tete des gens qu'aussi vrai que le soleil se lèvera demain, l'informatique "ça plante" et c'est normal...je pense que les codeurs microsoftiens qui ont pondu win98 ont le même niveau que moi en C...


http://jua.planet-d.net/ban/HiDeOut.jpg


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 22-11-2004 à 13:57:14    

Taz a écrit :

bah j'avais pas vu qu'il avait 1Gigo


Ben oui, garçon, t'es fort mais trop impulsif et plein de préjugés, c'est ton problème et ça te jouera des tours. Etre à l'écoute, c'est important.

Reply

Marsh Posté le 22-11-2004 à 14:02:13    

GROFRED > ca alloue pas au meme endroit, la pile à une taille tres limité et independante de ta quantité de memoire virtuelle

Reply

Marsh Posté le 22-11-2004 à 14:07:11    

red faction a écrit :

je suppose que c alloue a coup de malloc() ou de new, parce que mettre ca sur la pile ou en global c pas tres recommandé


 
C'est du C++ ca, pas du C... si tu programmes en mélangeant C et C++, pas étonnant que ca plante...


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed