Oppure

Loading
06/01/11 9:54
And_And92
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 :d .

Grazie a tutti!



#include<iostream>
#include<fstream>
#include<string.h>
#include<conio.h>
using namespace 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()
{
long int 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)]='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 :d .

Grazie a tutti!



#include<iostream>
#include<fstream>
#include<string.h>
#include<conio.h>
using namespace 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()
{
long int 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)]='{parsed_message}';
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
long int 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)]='{parsed_message}';
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)]='{parsed_message}';
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



'; 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 long int 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)]='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 :d .

Grazie a tutti!



#include<iostream>
#include<fstream>
#include<string.h>
#include<conio.h>
using namespace 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()
{
long int 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)]='{parsed_message}';
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
long int 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)]='{parsed_message}';
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)]='{parsed_message}';
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



'; 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)]='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 :d .

Grazie a tutti!



#include<iostream>
#include<fstream>
#include<string.h>
#include<conio.h>
using namespace 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()
{
long int 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)]='{parsed_message}';
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
long int 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)]='{parsed_message}';
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)]='{parsed_message}';
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



'; 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 06/01/11 10:03
aaa
06/01/11 11:46
TheKaneB
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 06/01/11 11:47
aaa
06/01/11 15:59
And_And92
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
 
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! :k:
Ultima modifica effettuata da And_And92 06/01/11 16:10
aaa
06/01/11 18:58
nihal
La cosa che salta all'occhio nel tuo codice è che non hai mai inizializzato la variabile conta... E spesso si trovano espressioni del tipo v[conta].
aaa
06/01/11 19:38
And_And92
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!!
aaa
06/01/11 19:48
And_And92
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! :k:
aaa
10/01/11 15:17
And_And92
Poichè non è ancora stato chiusa la domanda ne approfitto:

perchè se dichiaro il vettore come globale:
 

#include <iostream>
using namespace std;
int v[400000000];
main()
{
            system("pause");
}



non da alcun problema mentre se lo dichiaro nel main da errore di segmentazione?

 

#include <iostream>
using namespace std;
main()
{
            int v[400000000];
            system("pause");
}



Qualcuno sa come posso evitare questo errore?

aaa
10/01/11 20:46
TheKaneB
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ù.

Ecco spiegato il mistero.
aaa