Taille maximum d'un tableau en C

[Fermé]
Signaler
-
Messages postés
153
Date d'inscription
mercredi 26 décembre 2007
Statut
Membre
Dernière intervention
23 février 2009
-
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

/* 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+
Messages postés
545
Date d'inscription
mardi 7 août 2001
Statut
Membre
Dernière intervention
27 novembre 2002
14
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 ??

:)
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
> andro127
Hello,

tu peux utiliser un "unsigned int" au lien de "int" , tu pourras aller jusqu'a 65535
> seb
ca ne cha,ge tjs rien au probleme; mais peur on déslarer le tableau par :' unsigned int tab[montableau]' ????
merci
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
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)

@+
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
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.... "
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+
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
@+
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
Messages postés
9
Date d'inscription
samedi 3 novembre 2001
Statut
Membre
Dernière intervention
14 décembre 2001
5
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
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+
> andro127
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.
> andro127
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
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.
Messages postés
153
Date d'inscription
mercredi 26 décembre 2007
Statut
Membre
Dernière intervention
23 février 2009
35
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);