Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Ciao a tutti,
premetto che mi sono appena iscritto al forum, e che sono un programmatore dilettante,quindi abbiate pazinza con me. Mi stavo trastullando con uno dei miei programmini, che riporto sotto, e con mia sorpresa, variabilmente dall'umore del computer, viene interrotta l'esecuzione del processo improvvisamente e windows mi avverte che c'è stato un errore irreversibile e che il programma verrà terminato.
Facendo il debug, bloodshed dev c++ mi dice che l'errore che si verifica è una violazione d'accesso (errore di frammentazione). Ho cercare di qua e di la nel web ma non ho trovato nulla che riguardasse il mio problema.
Mi sono dimenticato di dire che il programma viene compilato normalmente, non appaiono nemmeno warning.
La mia domanda è:
1)è possibile che l'errore si verifichi solo nel mio pc? (cosa che dubito)
2)se la 1) e falsa, dove sbaglio? Grazie mille a chiunque risponda.
Mi scuso infinitamente per l'assenza di indentazione .
Grazie a tutti!
Codice sorgente - presumibilmente C++
#include<iostream>
#include<fstream>
#include<string.h>
#include<conio.h>
usingnamespace std;
#define n 10000000
int menu();
void crea_primi();
void raddoppia_primi();
main()
{
switch(menu())
{
case 1:
cin.ignore();
crea_primi();
break;
case 2:
cin.ignore();
raddoppia_primi();
break;
}
}
int menu()
{
int R;
do
{
cout<<"Cosa vuoi fare?"<<endl;
cout<<"---------------"<<endl;
cout<<"1- Per creare un database di primi premi [1]"<<endl<<endl;
cout<<"2- Per raddoppiare il numero di primi della lista premi [2]"<<endl<<endl;
cout<<"---------------"<<endl;
cin>>R;
system("cls");
}while((R!=1)&&(R!=2)&&(R!=3)&&(R!=4));
return R;
}
void crea_primi()
{
longint j,i,N,z,temp;
int v[n],conta;
bool primo[n];
float a;
char s[n],t[n];
cout<<"Come si deve chiamare il file dove finiranno i primi?"<<endl;
cin.getline(s,n);
s[strlen(s)]='.';
s[strlen(s)]='t';
s[strlen(s)]='x';
s[strlen(s)]='t';
s[strlen(s)]='\0';
system("cls");
a=0;
do
{//1
cout<<"Fino a che numero vuoi visualizzare numeri primi?"<<endl;
cin>>N;
if(N>n)
{//2
cout<<"Impossible superare il "<<n;
system("cls");
}//2
}while(N>n);//1
for(i=0;i<N;i++)
{//1
primo[i]=true;
}//1
for(i=2;i<N;i++)
{//1
if(primo[i]!=false)
{//2
for(j=2;j<=int(i/2);j++)
{//3
if(i%j==0)
{//4
primo[i]=false;
}//4
}//3
if(primo[i]==true)
{//3
v[conta]=i;
conta=conta+1;
}//3
}
else
{//3
for(z=0;(i*z)<N;z++)
{//3
primo[(i*z)]=false;
}//3
}
}
ofstream Stampa(s);
for(i=0;i<conta;i++)
{
Stampa<<v[i]<<endl;
}
Stampa.close();
}
void raddoppia_primi()
{//0
longint q,i,j,conta,m,v[n];
char s[n],t[n];
bool a,diviso;
do
{//1
for(i=0;i<n;i++)
{
s[i]=0;
}
system("cls");
cout<<"Come si deve chiamare il file da cui prelevare i primi?"<<endl;
cin.getline(s,n);
s[strlen(s)]='.';
s[strlen(s)]='t';
s[strlen(s)]='x';
s[strlen(s)]='t';
s[strlen(s)]='\0';
ifstream Leggi(s);
a=!Leggi;
}while(a==true);//1
cout<<"Come si deve chiamare il file dove finiranno i primi?"<<endl;
cin.getline(t,n);
t[strlen(t)]='.';
t[strlen(t)]='t';
t[strlen(t)]='x';
t[strlen(t)]='t';
t[strlen(t)]='\0';
getch();
ifstream Leggi(s);
ofstream Stampa(t);
do
{//1
Leggi>>v[conta];
Stampa<<v[conta]<<endl;;
conta=conta+1;
}while(!Leggi.eof());//1
for(i=v[conta]+1;i<2*v[conta]-2;i++)
{
for(j=0;j<conta;j++)
{
if(i%v[j]==0)
{
Stampa<<i<<endl;
}
}
}
Leggi.close();
Stampa.close();
}//0
Ultima modifica effettuata da And_And92 il 06/01/2011 alle 11:03
Stai allocando 400 milioni di interi, cioè 1,6GB di memoria.
Se lo fai fuori dalla funzione, vengono allocati nella memoria delle variabili statiche, cioè l'Heap, mentre nel secondo caso viene allocato tra le variabili locali, cioè nello stack.
Su Windows a 32bit, puoi avere max 2GB di Ram per ogni programma, suddivisi tra Heap, codice e stack, quindi quei 1,6GB ci rientrano.
Lo stack invece ha dimensioni tipicamente da 8KB fino a 64KB. Si possono avere stack più grandi, ma l'ordine di grandezza rimane al massimo di 1 MB, non di più.
alur...
non ho il tempo di debuggarti il codice ma ti do un suggerimento che ti aiuterà a farlo.
Intanto non è "frammentazione" ma segmentazione, seconda cosa è un tipo di errore che si verifica quando scrivi su della memoria esterna all'area di allocazione prevista nel tuo processo.
Questo si può verificare quando scrivi su un puntatore non allocato, oppure se scrivi fuori dai limiti di un array. La dereferenziazione di un puntatore nullo (o comunque un puntatore sulla prima pagina di memoria) comporta una exception, che potrebbe venire interpretata come segmentation fault in alcune implementazioni (sarebbe più correttamente un Null Pointer Exception).
Ultima modifica effettuata da TheKaneB il 06/01/2011 alle 12:47
Ho provato a ricontrollare il mio file e, per quanto riguarda gli array, non dovrebero esserci errori, voglio dire errori come scrivere al di fuori dei limiti di uno degli array.
Mentre per quanto riguarda puntatori non allocati, beh, non saprei. Se non sbaglio i puntatori sono delle variabili che contengono un indirizzo di memoria, e non allocati significa che contengono il valore NULL, da quello che ho potuto capire. Solo che nel mio sorgente non sono dichiarati puntatori, vengono solo usati implicitamente nella gestione dei vettori e negli stream dei file. A mio parere è proprio qui l'errore. Il fatto più strano è che fino a quando non ho aggiunto la funzione raddoppia_primi, la funzione crea_primi() funzionava benissimo, ora non va neppure lei.
Il problema è quindi nella seconda funzione, quasi sicuramente nella parte
Codice sorgente - presumibilmente C/C++
ifstream Leggi(s);
ofstream Stampa(t);
do
{//1
Leggi>>v[conta];
Stampa<<v[conta]<<endl;;
conta=conta+1;
}while(!Leggi.eof());//1
for(i=v[conta]+1;i<2*v[conta]-2;i++)
{
for(j=0;j<conta;j++)
{
if(i%v[j]==0)
{
Stampa<<i<<endl;
}
}
}
Leggi.close();
Stampa.close();
e devo ammettere in tutta sincerità che non ho idea di come eseguire un debug di un sorgente, perchè non ce l'hanno mai insegnato a scuola. E mi sembra proprio il momento di comiciare. Ho scartabellato di qua e di la, ma ho trovato solo indicazioni generiche più che una propria guida. Potreste fornirmi qualche link? Grazie mille!
Ultima modifica effettuata da And_And92 il 06/01/2011 alle 17:10
Concordo con nihal, infatti, appena avevo postato il mio ultimo messaggio mi sono dato del "mona", perchè non avevo posto conta=0; ma purtroppo non è questo il problema. sarei stato felice di darti ragione!!
Ragazzi ho risolto: semplicemente n, la costante era troppo grande e generava un errore, il codice è perfetto. Grazie mille a coloro che mi hanno risposto. Chiedo al moderatore di chiudere pure il topic. Grazie a tutti!