Taille maximum d'un tableau en C

Fermé
andro127 - 1 nov. 2001 à 21:30
MRextra Messages postés 153 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 23 février 2009 - 17 mars 2008 à 11:22
quand je definis mon tableau : int premier[MAXTAB] avec MAXTAB=29000, ca marche , mais pour 30000, ca ne marche plus : il me met l'erreur "Abnormal program termination".
je pensais pourtant que la taille d'un tableau a une dimension était illimitée ! comment puis-je faire ? (c'est un programme qui ecrit dans un fichier les nombres premiers et j'aimerait pouvoir en ecrire au moins 50 000 )

merci de votre aide
a+

10 réponses

un petit calcul : 30000*2octets par int ca fait environ 60 ko
Je crois en general que le systeme (surtout sous un merde connu
sous le nom de Windows) alloue 64ko alors ya pas à chercher plus loin
tu ne peux tout simplement pas le faire...
il faut trouver un autre moyen

En ce qui concerne la declaration en unsigned int , elle ne sert strictement
à rien si ce n'est à te permettre de mettre des nombres plus grands dans le
tableau, mais surement pas a pouvoir en declarer un plus grand

Autre chose, tu peux tout de suite arreter avec tes int, à l'infini
les premiers se rarefient, ca veut dire que plus tu monte moins y en a
ex entre 1 et 10 il y en a 4 (2,3,5,7) alors qu'apres y en a de moins de moins
ce qui fait que par exemple le nieme premiers vaut beaucoup plus de n
dans les gds nombres ( ex le 1000eme nb premier c 9433)

Donc commence dejà par passer aux long int , cherche dejà les 1000 ou 2000
premiers nb premiers et ensuite attaque toi a plus grand

Mais a mon avis dans tous les cas tu peux oublier un tableau de
50 000 elements ...

@+
ps: tu fais comment pour trouver les premiers ?
1
/* Nombres premiers */
/*d'apres JEAN FRUITET*/
#include <stdio.h>
#include <math.h> /* F. Mathéma. */
#define MAXTAB 29000
FILE *fich;
long i,j,n,temps,load,q;
int premier[MAXTAB];

void main(void) /* Programme
principal */
{
fich=fopen("nb.txt","w+");
i=4;
n=9;
j=0;
q=0;
premier[0]=2;
premier[1]=3;
premier[2]=5;
premier[3]=7;
temps=4;

fprintf(fich,"Les 29000 premiers nombres premiers :\n 2\t3\t5\t7\t");
do
{
j=0;
while ((n%premier[j]) &&
(premier[j]<=sqrt(n)) && (j<i))
j++;
if (n%premier[j])
{

temps++;
load++;
fprintf(fich,"%ld\t",n);
if (load % 290==0)
{ q++;
clrscr();
printf(" LOADING\n");
printf(" %d %",q);}
premier[i++]=n;
if (temps % 12==0)
fprintf(fich,"\n");
}
n+=2;
}
while (i<MAXTAB);
} /* Fin du programme */


voila.
en gros il teste chaque nombre compris entre 1 et 29000 (il verifie si le reste de la division entiere par chaque premier precedants est egale a 0 )
le programme a l'avantage d'etre extremement rapide (c'est pas moi qui l'ai concu)

a+
0
barthoi Messages postés 545 Date d'inscription mardi 7 août 2001 Statut Membre Dernière intervention 27 novembre 2002 14
1 nov. 2001 à 22:12
Tu peux peut etre essaye de faire 2 tableaux ???

Ca doit etre un truc du genre probleme par rapport a la taille memoire d'un entier... je me souviens plus tres bien comment cela fonctionne...

MAXTAB est de quel type ??

:)
0
MAXTAB est un entier de type' int'
j'ai deja essayé avec 'long' mais ca ne marche pas car les valeurs des cellules sont trop grandes pour le nombre de cellules que je veux.
si vous avez des idées , dites le svp

merci
0
seb > andro127
2 nov. 2001 à 00:16
Hello,

tu peux utiliser un "unsigned int" au lien de "int" , tu pourras aller jusqu'a 65535
0
andro127 > seb
2 nov. 2001 à 10:14
ca ne cha,ge tjs rien au probleme; mais peur on déslarer le tableau par :' unsigned int tab[montableau]' ????
merci
0
pense au pointeur pour reduire la taille de la memoire que tu utilise les memoire son partitionner en 64 Ko mais le systeme d exploitation peut gerer ce probleme utilise des fichier

pour mieux t aider envoi moi ton cahier de charge pour ke je vois mieux ce qu il faut faire
A+ et bon courage
0
Je connais cet algo,ca s'appelle la trial factorization je l'ai dejà implemente seulement pour trouver des nombres vraiment grands, j'ai ete obligé de creer une classe en C++ pour implementer un type de tres grands nombres
En tout cas ca m'etonnerait qu'à l'origine ce programme ait ete concu pour trouver les nombres premiers entre 1 et 29000 sinon l'auteur n'aurait pas fait la connerie d'utiliser des int, si c toi pense toujours au debordement qui ne te sera jamais signale mais qui te renverra n'importe quoi 32767 cle max des int donc si 32767 tu ajoutes 1 tu passes à -32768 ...

Ce prog a du etre ecrit à l'origine pour trouver des nb premiers jusq'au environ 2000 eme environ mais pas plus ,avec les long tu dois pouvoir aller jusqu'au 500 000eme puisque le max d'un long est 2milliards (en fait 2^31-1 exactement)

@+
0
en fait, je voulais juste savoir si on peux augmenter la capacité de mémoire pour ajouter plus d'éléments ?
il faut savoir que le 29000 ème élément est 337541 !!
ce qui est donc raisonnable pour une variable(n) de type long.
je ne peux pas déclarer mon tableau par 'long premier[MAXTAB]' puisque la memoire alloué etant la meme , moins d'element pourront s'y loger.... d'ou probleme....

merci a tous
0

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

Posez votre question
Je t'avouerais que je ne comprend rien a ce que tu racontes : 337541 est un long et pas un int tu ne peux pas stocker un nombre aussi grand dans un tableau donc de toutes facons tu pourras peut etre arriver a declarer un tableau de plus de 29000 elements
mais tu ne pourras pas depasser le 10000eme nombre premier donc dans tous les cas tu seras bloqué si tu reste dans les int...
@+
ps: je ne comprend pas la phrase:
"je ne peux pas déclarer mon tableau par 'long premier[MAXTAB]' puisque la memoire alloué etant la meme , moins d'element pourront s'y loger.... d'ou probleme.... "
0
c'est pourtant simple !
si je déclare en debut de programme mon tableau par la syntaxe long premier[MAXTAB],avec par exemple MAXTAB=100 :
le programme va réserver pour le tableau 100 espaces mémoire de 32 bits;tandis que avec int premier[MAXTAB ] et MAXTAB=100,il va réserver 100 espaces de 16 bits.
donc , avec une déclaration de tableau comprenant des int, je peux loger plus d'éléments(en principe),mais arrivé a un certain moment,les chiffres inscrits seront plus grands que 32768.

le probleme(je pense) viens du fait que un tableau (déclaré avec des cellules de types long ) reserve un espace de 32 bits pour chaque elément (que cet élément soit 5 ou 2356877)
mais je pensais qu'un tableau pouvait contenir autant d'éléments que l'on souhaite.

c facile a comprendre mais dur a expliquer
a+
0
Eh ben avec cet algo, je viens de generer les 300 000 premiers nb premiers avec un tableau de long sans aucun probleme
le 300millieme c 3 100 007, par contre evidemment à la fin c un peu long...(j'ai mis environ 20 minutes vec un 750Mhz 786MoRam)
Peut etre que comme je suis sous Linux ca marche mieux au niveau des ressources d'un proessus
@+
0
Il te faut utiliser l'allocation dynamique de memoire pour faire cela, meme si tu sais a l'avance la taille maximale de ton tableau.
Les tableaux crées par new() ne se situe pas dans la meme zone memoire que celle que tu utilise et est limitée a ta memoire physique tandis que comme tu fais, je crois que tu est limité a la taille d'un segment, bref : alloc dynamique
0
Xxffd1 Messages postés 9 Date d'inscription samedi 3 novembre 2001 Statut Membre Dernière intervention 14 décembre 2001 5
5 nov. 2001 à 01:06
che pas a quel niveau t'es en programmtion , mais pourquoi tu n'utilises pas de liste dynamique? et ca c'est certain que ca prend autant que tu veux vieux...
(liste STL si tu veux)


hug----------LaTouffe
0
je suis débutant (un mois nvironque j'ai commencé ) mais je ne vois pas ce que tu veux dire par 'liste dynamique'.
si tu avais un exemple concret a me montrer , ce serait pas mal.

merci et a+
0
MarsuGL > andro127
6 nov. 2001 à 00:55
Une liste dynamique est en fait une liste chainée (listes+chainées+C+programmation sur google)

En fait tu vas allouer l'espace memoire necessaire pour une valeur AU MOMENT ou tu en a besoin, pas avant.

il y a quelques fonctions a ecrire pour passer d'une case a l'autre...
le mieux si tu ne veux pas t'embeter c'est de trouver les fonctions toutes faites.
0
Xxffd1 > andro127
6 nov. 2001 à 08:55
hugh vieux..laisse tomber les listes dynamiques, ca prend du temps et du savoir faire au niveau des pointeurs et tout le tralala pour manipuler les listes..(cela dit c'est la meilleure solution à mon avis car tu utilises toute la mémoire possible pour ton prog et tu peux même l'agrandir)...je ne connais pas de sites pour te les expliquer..

je te conseille(cela dit je ne suis pa sûr que cela va marcher) de déclarer ton tableau comme tableau de pointeur mais de type vide tel que suit:

void* TableauElements[];

tu détermineras le type plus tard, mais il faudrait l'instencier avec "new typequetuveux"..

tchussss--laTouffe
0
amon avi, je pense que c'est inutile d'utilmiser un tableau tant que tu vas enregistrer les valeurs dans un fichier, donc je te suggere (puisque la recherche du nombre premier se fera a l'aide d'une boucle) que dès que tu trouve un nombre premier tu l'ecris immediatement dans le fichier puisk'il ne sert a rien d'etre en memoire.
0
MRextra Messages postés 153 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 23 février 2009 35
17 mars 2008 à 11:22
ne refait jamais ,utilise l allocation dynamique si tu travail avec le C++ c'est avec :
tab= new[taille];
avec le C: tabl=(int *)malloc(taille*sizeof(int);
0