Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Errore di frammentazione durante l'esecuzione .exe compilato con dev c++
Forum - C/C++ - Errore di frammentazione durante l'esecuzione .exe compilato con dev c++

Avatar
And_And92 (Normal User)
Newbie


Messaggi: 6
Iscritto: 06/01/2011

Segnala al moderatore
Postato alle 10:54
Giovedì, 06/01/2011
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!



Codice sorgente - presumibilmente C++

  1. #include<iostream>
  2. #include<fstream>
  3. #include<string.h>
  4. #include<conio.h>
  5. using namespace std;
  6. #define n 10000000
  7. int menu();
  8. void crea_primi();
  9. void raddoppia_primi();
  10.  
  11.  
  12.  
  13.  
  14. main()
  15. {
  16. switch(menu())
  17. {
  18. case 1:
  19. cin.ignore();
  20. crea_primi();
  21. break;
  22. case 2:
  23. cin.ignore();
  24. raddoppia_primi();
  25. break;
  26. }
  27. }
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35. int menu()
  36. {
  37. int R;
  38. do
  39. {
  40. cout<<"Cosa vuoi fare?"<<endl;
  41. cout<<"---------------"<<endl;
  42. cout<<"1- Per creare un database di primi premi [1]"<<endl<<endl;
  43. cout<<"2- Per raddoppiare il numero di primi della lista premi [2]"<<endl<<endl;
  44. cout<<"---------------"<<endl;
  45. cin>>R;
  46. system("cls");
  47. }while((R!=1)&&(R!=2)&&(R!=3)&&(R!=4));
  48. return R;
  49. }
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58. void crea_primi()
  59. {
  60. long int j,i,N,z,temp;
  61. int v[n],conta;
  62. bool primo[n];
  63. float a;
  64. char s[n],t[n];
  65. cout<<"Come si deve chiamare il file dove finiranno i primi?"<<endl;
  66. cin.getline(s,n);
  67. s[strlen(s)]='.';
  68. s[strlen(s)]='t';
  69. s[strlen(s)]='x';
  70. s[strlen(s)]='t';
  71. s[strlen(s)]='\0';
  72. system("cls");
  73. a=0;
  74. do
  75. {//1
  76. cout<<"Fino a che numero vuoi visualizzare numeri primi?"<<endl;
  77. cin>>N;
  78. if(N>n)
  79. {//2
  80. cout<<"Impossible superare il "<<n;
  81. system("cls");
  82. }//2
  83. }while(N>n);//1
  84. for(i=0;i<N;i++)
  85. {//1
  86. primo[i]=true;
  87. }//1
  88. for(i=2;i<N;i++)
  89. {//1
  90. if(primo[i]!=false)
  91. {//2
  92. for(j=2;j<=int(i/2);j++)
  93. {//3
  94. if(i%j==0)
  95. {//4
  96. primo[i]=false;
  97. }//4
  98. }//3
  99. if(primo[i]==true)
  100. {//3
  101. v[conta]=i;
  102. conta=conta+1;
  103. }//3
  104. }
  105. else
  106. {//3
  107. for(z=0;(i*z)<N;z++)
  108. {//3
  109. primo[(i*z)]=false;
  110. }//3
  111. }    
  112. }
  113. ofstream Stampa(s);
  114. for(i=0;i<conta;i++)
  115. {
  116. Stampa<<v[i]<<endl;
  117. }
  118. Stampa.close();
  119. }
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133. void raddoppia_primi()
  134. {//0
  135. long int q,i,j,conta,m,v[n];
  136. char s[n],t[n];
  137. bool a,diviso;
  138. do
  139. {//1
  140. for(i=0;i<n;i++)
  141. {
  142. s[i]=0;
  143. }
  144. system("cls");
  145. cout<<"Come si deve chiamare il file da cui prelevare i primi?"<<endl;
  146. cin.getline(s,n);
  147. s[strlen(s)]='.';
  148. s[strlen(s)]='t';
  149. s[strlen(s)]='x';
  150. s[strlen(s)]='t';
  151. s[strlen(s)]='\0';
  152. ifstream Leggi(s);
  153. a=!Leggi;
  154. }while(a==true);//1
  155. cout<<"Come si deve chiamare il file dove finiranno i primi?"<<endl;
  156. cin.getline(t,n);
  157. t[strlen(t)]='.';
  158. t[strlen(t)]='t';
  159. t[strlen(t)]='x';
  160. t[strlen(t)]='t';
  161. t[strlen(t)]='\0';
  162. getch();
  163. ifstream Leggi(s);
  164. ofstream Stampa(t);
  165. do
  166. {//1
  167. Leggi>>v[conta];
  168. Stampa<<v[conta]<<endl;;
  169. conta=conta+1;
  170. }while(!Leggi.eof());//1
  171. for(i=v[conta]+1;i<2*v[conta]-2;i++)
  172. {
  173. for(j=0;j<conta;j++)
  174. {
  175. if(i%v[j]==0)
  176. {
  177. Stampa<<i<<endl;
  178. }
  179. }
  180. }
  181. Leggi.close();
  182. Stampa.close();
  183. }//0


Ultima modifica effettuata da And_And92 il 06/01/2011 alle 11:03
PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 21:46
Lunedì, 10/01/2011
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.


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM
Avatar
nihal (Ex-Member)
Pro


Messaggi: 109
Iscritto: 12/04/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 19:58
Giovedì, 06/01/2011
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].


Chi lotta può perdere. Chi non lotta ha già perso...
PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 12:46
Giovedì, 06/01/2011
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


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM
Avatar
And_And92 (Normal User)
Newbie


Messaggi: 6
Iscritto: 06/01/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 16:59
Giovedì, 06/01/2011
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++

  1. ifstream Leggi(s);
  2. ofstream Stampa(t);
  3. do
  4. {//1
  5. Leggi>>v[conta];
  6. Stampa<<v[conta]<<endl;;
  7. conta=conta+1;
  8. }while(!Leggi.eof());//1
  9. for(i=v[conta]+1;i<2*v[conta]-2;i++)
  10. {
  11. for(j=0;j<conta;j++)
  12. {
  13. if(i%v[j]==0)
  14. {
  15. Stampa<<i<<endl;
  16. }
  17. }
  18. }
  19. Leggi.close();
  20. 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 il 06/01/2011 alle 17:10
PM
Avatar
And_And92 (Normal User)
Newbie


Messaggi: 6
Iscritto: 06/01/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 20:38
Giovedì, 06/01/2011
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!!

PM
Avatar
And_And92 (Normal User)
Newbie


Messaggi: 6
Iscritto: 06/01/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 20:48
Giovedì, 06/01/2011
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:

PM
Avatar
And_And92 (Normal User)
Newbie


Messaggi: 6
Iscritto: 06/01/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 16:17
Lunedì, 10/01/2011
Poichè non è ancora stato chiusa la domanda ne approfitto:

perchè se dichiaro il vettore come globale:
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. using namespace std;
  3. int v[400000000];
  4. main()
  5. {
  6.             system("pause");
  7. }



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

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. using namespace std;
  3. main()
  4. {
  5.             int v[400000000];
  6.             system("pause");
  7. }



Qualcuno sa come posso evitare questo errore?


PM
Avatar
And_And92 (Normal User)
Newbie


Messaggi: 6
Iscritto: 06/01/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 15:37
Martedì, 11/01/2011
Grazie TheKaneB, ora è chiaro. Ti ringrazio infinitamente!
:k::k:

PM