2016-11-30 14 views
0

Ich schreibe ein einfaches Programm, das ein physikalisches Problem der realen Welt über Elektronenspin simuliert. Es sollte ein Array von 10 mit 1 oder -1 zufällig füllen. dann für 100-mal ein Element auswählen und die folgende Umwandlung tun, basierend auf seine Nachbarn:*** stack smashing detected *** in einem C++ Array-Programm

+-+ ..... +++ 
-+- ..... --- 
+++ ..... +++ 
--- ..... --- 

und in den folgenden Fällen zufällig ein Ergebnis holen:

-++ ..... --+ or -++ 
--+ ..... --+ or -++ 
+-- ..... ++- or +-- 

etc

aber wenn ich laufe es mir diesen Fehler: * Stack * erkannt Zerschlagung: ./a.out abgebrochen (core dumped) beendete

012.351.

Ich habe überprüft und es ist auf der letzten "else" zwei Zeilen. Es gibt keinen Fehler, wenn ich sie kommentiere.

Mein Code:

#include<iostream> 
#include<fstream> 
#include<stdlib.h> 
using namespace std; 
int main(){ 
    srand(time(NULL)); 
    int arr[10],a[2],i,curr,next,prev,j; 
    double r; 
//Fill arr[10] with random -1 & 1 
    a[0]=-1; a[1]=1; 
    for(i=0;i<10;i++){ 
     r=rand()/(RAND_MAX+1.0)*2.0; 
     arr[i]=a[int(r)];  
    } 
//Cout arr[10] 
    for(i=0;i<10;i++)cout<<arr[i]<<" "; 
    cout<<'\n'; 
//Repeat for 100 times 
    for(j=1;j<=100;j++){ 
     r=rand()/(RAND_MAX+1.0); 
     r=(r)*11; 
     curr=int(r); 
     next=(curr+1)%11; 
     prev=(10+curr)%11; 
     if(arr[prev]==arr[next]){ 
      if(arr[prev]==1)arr[curr]=1; else arr[curr]=-1; 
     } 
     else 
     { 
      r=rand()/(RAND_MAX+1.0)*2.0; 
      arr[curr]=a[int(r)]; 
     } 
    } 
//Cout arr[10] 
    for(i=0;i<10;i++)cout<<arr[i]<<" "; 
    cout<<'\n'; 
    return 0; 
} 

Vielen Dank im Voraus.

+0

'prev = (10 + curr)% 11;' hat möglichen Wert zwischen '[0-10]'. Aber in C beginnt der Array-Index bei 0. Wenn arr 10 Elemente hat, ist der mögliche Index "[0-9]". Also 'arr [prev]' könnte außerhalb der Grenzen sein – Fefux

Antwort

0
r=(r)*11; 
    curr=int(r); 
    //... 
    arr[curr]=//... 

r kann einen Wert von 10.x bei niedriger Wahrscheinlichkeit nehmen, curr wodurch den Wert von 10 zu übernehmen, bei 10 bis arr Zuweisen, welcher Speicher korrumpiert.

+0

Es scheint genau richtig zu sein! wenn ich arr [11] anstelle von [10] Fehlerbehebungen definiere. Wie kann ich es beheben, ohne die Chancengleichheit für alle Array-Elemente zu zerstören? (Ich schätze, es ist r * 10 hat nicht die gleiche Chance für alle Elemente) – Alireza

+0

Wahr, r * 10 macht nicht die gleiche Wahrscheinlichkeit für alle Elemente, aber auch nicht r * 11! Gleiches zu erreichen erfordert 2er-Potenzen und ein erneutes Rollen, wenn du außer Reichweite bist, wenn du ein Nicht-Power-of-2-Limit brauchst. – Joshua

+0

Danke. Ich werde ein "wenn" hinzufügen, um r == 10 Szenario zu verhindern. – Alireza