PDA

Visualizza la versione completa : [C++] Problema strano su limite numeri


ivano_reg
29-03-2008, 17:43
Salve a tutti. Ho compilato questo piccolo programmino in C++ che espleta la funzione di Crivello di Eratostene, un processo per trovare numeri primi. Praticamente, si fa un array riempendolo tutto con un numero, poi si comincia da 2 e si cambia il numero all'indice dell'array che corrisponde a 2 e ai suoi multipli. Poi da 3 e così via finchè si tolgono tutti i multipli e i numeri primi che si trovano nell'array hanno un flag che identifica che quell'indice è un numero primo. Il mio problema sta nel fatto che nel definire il massimo numero da cui è formato l'array, il mio compilatore (Dev-cpp) lo compila ma poi dà errore sulla finestra exe, che va in crash. Posto il programma:

#include <cstdlib>
#include <iostream>
#define MAXNUMERI 30
#define NUMERO_PRIMO 1
#define NUMERO_COMPOSTO 0
using namespace std;

int main()
{
int numero[MAXNUMERI];
for (int i=1;i<=MAXNUMERI;i++)
{
numero[i]=NUMERO_PRIMO;
}
for (int c=2;c<=MAXNUMERI;c++)
{
if (numero[c]==NUMERO_PRIMO)
{
int i=c+c;
do
{
numero[i]=NUMERO_COMPOSTO;
i=i+c;
}
while (i<=MAXNUMERI);
}
}
for (int i=1;i<=MAXNUMERI;i++)
{
if (numero[i]==NUMERO_PRIMO)
{
cout<<i<<endl;
}
}
int a;
cin>>a;
return 0;
}


"numero" è l'array e MAXNUMERI è il valore che identifica il massimo numero di caselle dell'array. Come mai se metto più di "circa" 45 il programma si compila ma va in crash?? (Come vedere. nelle ultime 2 righe ho dichiarato una nuova variabile per leggerla, poiché altrimenti il programma si chiudeva subito senza presentare i risultati: perchè??).

Grazie a tutti

Metflar
29-03-2008, 18:34
intanto cambia i cicli che usi per scorrerre il vettore...si parte da 0 nn da 1!sn da cambiare soprattutto il primo e il terzo...

Metflar
29-03-2008, 18:53
ecco cm va modificato il tuo codice e ti mostro anche l'utilità del tag CODE


#include <cstdlib>
#include <iostream>
#define MAXNUMERI 30
#define NUMERO_PRIMO 1
#define NUMERO_COMPOSTO 0
using namespace std;

int main()
{
int numero[MAXNUMERI];
for (int i=0;i<MAXNUMERI;i++)
{
numero[i]=NUMERO_PRIMO;
}
for (int c=2;c<=MAXNUMERI;c++)
{
if (numero[c]==NUMERO_PRIMO)
{
int i=c+c;
do
{
numero[i]=NUMERO_COMPOSTO;
i=i+c;
}
while (i<=MAXNUMERI);
}
}
for (int i=0;i<MAXNUMERI;i++)
{
if (numero[i]==NUMERO_PRIMO)
{
cout<<i<<endl;
}
}
int a;
cin>>a;
return 0;
}
questo è l'output ke da:


0
1
2
3
5
7
11
13
17
19
23
29

ivano_reg
29-03-2008, 19:20
A parte il fatto che non serve partire da 0 visto che non mi importa come indagine sui numeri primi... comunque il fatto è che non hai risolto il mio problema. Nel sorgente che mi hai postato prova a mettere ad es. 45 e a compilarlo ed eseguirlo: vedrai che si blocca tutto!

menphisx
29-03-2008, 19:55
no invece serve partire da zero, primo perchè non capisco il motivo di sprecare una cella di memoria, secondo, perchè questo codice va in overflow:


for (int i=1; i <= MAXNUMERI; i++){

numero[i]=NUMERO_PRIMO;

}


un po' di indentazione non guasterebbe.

ivano_reg
29-03-2008, 20:08
Dici un arithmetic overflow o uno static overflow?

oregon
29-03-2008, 20:20
Intende dire che non devi trattare l'elemento MAXNUMERI del vettore perche' questo non esiste e vai a scrivere oltre il limite del vettore stesso (con ovvio crash ...).

ivano_reg
29-03-2008, 21:03
Ahhhh avete ragione non ci avevo pensato!! Sapete,sono abituato al TurboPascal in cui gli array partono da 1... :dhò:

ivano_reg
29-03-2008, 21:43
Ok grazie per la notazione, ora ho cambiato tutto... Ma il problema non si risolve!! Adesso la finestra di esecuzione appare e scompare in un secondo... vi prego aiutatemi è importante!

oregon
29-03-2008, 21:59
Mostra nuovamente il codice corretto, con le indentazioni e utilizzando i tag CODE ...

Loading