Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3070 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Taille maximale de tableau

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Taille maximale de tableau

n°898950
GROFRED
Posté le 15-11-2004 à 14:03:29  profilanswer
 

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?
 

mood
Publicité
Posté le 15-11-2004 à 14:03:29  profilanswer
 

n°898955
skeye
Posté le 15-11-2004 à 14:06:52  profilanswer
 

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


---------------
Can't buy what I want because it's free -
n°898966
Lam's
Profil: bas.
Posté le 15-11-2004 à 14:16:02  profilanswer
 

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 ?

n°898973
red factio​n
Posté le 15-11-2004 à 14:22:04  profilanswer
 

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
n°898977
Lam's
Profil: bas.
Posté le 15-11-2004 à 14:27:19  profilanswer
 

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 ?

n°899003
Taz
bisounours-codeur
Posté le 15-11-2004 à 14:43:07  profilanswer
 

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

n°899004
red factio​n
Posté le 15-11-2004 à 14:44:06  profilanswer
 

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é

n°899100
el muchach​o
Comfortably Numb
Posté le 15-11-2004 à 15:59:00  profilanswer
 

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.

n°899815
GROFRED
Posté le 16-11-2004 à 14:30:22  profilanswer
 

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
n°899988
Taz
bisounours-codeur
Posté le 16-11-2004 à 17:39:51  profilanswer
 

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

mood
Publicité
Posté le 16-11-2004 à 17:39:51  profilanswer
 

n°900208
darkoli
Le Petit Dinosaure Bleu
Posté le 16-11-2004 à 22:20:06  profilanswer
 

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
n°900413
el muchach​o
Comfortably Numb
Posté le 17-11-2004 à 10:30:13  profilanswer
 

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
n°900419
Taz
bisounours-codeur
Posté le 17-11-2004 à 10:36:37  profilanswer
 

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

n°900423
Taz
bisounours-codeur
Posté le 17-11-2004 à 10:41:25  profilanswer
 

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 ...

n°900435
GROFRED
Posté le 17-11-2004 à 10:53:20  profilanswer
 

ok


Message édité par GROFRED le 17-11-2004 à 10:54:09
n°900467
Taz
bisounours-codeur
Posté le 17-11-2004 à 11:15:30  profilanswer
 

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 :)

n°900484
el muchach​o
Comfortably Numb
Posté le 17-11-2004 à 11:24:44  profilanswer
 

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
n°900494
Taz
bisounours-codeur
Posté le 17-11-2004 à 11:29:53  profilanswer
 

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

n°900503
GROFRED
Posté le 17-11-2004 à 11:37:35  profilanswer
 

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
n°900577
darkoli
Le Petit Dinosaure Bleu
Posté le 17-11-2004 à 13:08:41  profilanswer
 

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
n°900646
cris56
Posté le 17-11-2004 à 14:24:25  profilanswer
 

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

n°900667
GROFRED
Posté le 17-11-2004 à 14:36:13  profilanswer
 

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
n°900917
Taz
bisounours-codeur
Posté le 17-11-2004 à 17:35:11  profilanswer
 

cris56 a écrit :

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

ouala !

n°901104
el muchach​o
Comfortably Numb
Posté le 17-11-2004 à 20:57:37  profilanswer
 

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.

n°904534
GROFRED
Posté le 22-11-2004 à 10:55:20  profilanswer
 

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
n°904548
cris56
Posté le 22-11-2004 à 11:24:26  profilanswer
 

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

n°904591
masklinn
í dag viðrar vel til loftárása
Posté le 22-11-2004 à 12:11:56  profilanswer
 

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
n°904596
Taz
bisounours-codeur
Posté le 22-11-2004 à 12:25:42  profilanswer
 

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

n°904597
GROFRED
Posté le 22-11-2004 à 12:28:25  profilanswer
 

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
n°904602
Taz
bisounours-codeur
Posté le 22-11-2004 à 12:34:13  profilanswer
 

menteur

n°904603
Lam's
Profil: bas.
Posté le 22-11-2004 à 12:36:45  profilanswer
 


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.
 

n°904604
Taz
bisounours-codeur
Posté le 22-11-2004 à 12:38:02  profilanswer
 

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

n°904606
Lam's
Profil: bas.
Posté le 22-11-2004 à 12:44:33  profilanswer
 

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.

n°904614
Taz
bisounours-codeur
Posté le 22-11-2004 à 13:11:32  profilanswer
 

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

n°904625
masklinn
í dag viðrar vel til loftárása
Posté le 22-11-2004 à 13:21:05  profilanswer
 


 [:benou_miam]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°904652
GROFRED
Posté le 22-11-2004 à 13:46:54  profilanswer
 

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...
 
:-)

n°904658
masklinn
í dag viðrar vel til loftárása
Posté le 22-11-2004 à 13:50:18  profilanswer
 

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
n°904662
el muchach​o
Comfortably Numb
Posté le 22-11-2004 à 13:57:14  profilanswer
 

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.

n°904663
cris56
Posté le 22-11-2004 à 14:02:13  profilanswer
 

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

n°904671
Tamahome
⭐⭐⭐⭐⭐
Posté le 22-11-2004 à 14:07:11  profilanswer
 

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 /人◕ ‿‿ ◕人\
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Taille maximale de tableau

 

Sujets relatifs
Passage d'un tableau de string vers du code non managé (DLL)tableau a double entrée en pascal
tableau fixe sur l'écranTransformer un int en String d'une taille spécifique
[C/C++] tableau dynamiqueTaille Image
Information de la taille de stack maximal [gnu]Firefox - étirer un <div> à la taille de son contenu
tableau dans un tableau[HTML] tableau de taille maximale pour un forum
Plus de sujets relatifs à : Taille maximale de tableau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR