2017-06-11 2 views
0

Hallo :) Ich bin ein sehr neuer Programmierer und kann nicht herausfinden, warum ich diesen Fehler habe. Um zu erklären, wenn ich das Programm auszuführen (Code unten) mit unterschiedlichen Werten in der LinieProgramm kompiliert, aber gelegentlich stürzt unter Berufung auf Grund 255 (CodeBlocks)

array2D *a = new array2D(320,240); 

(beispielsweise Ändern 320 und 240 bis 32 und 24) das Programm abstürzt entweder irgendwann nach der getSize Funktion ausführt oder nach Ausführung der prtValue-Funktion (häufiger die ehemalige). Wenn ich den Code jedoch unabhängig von den Werten in der obigen Zeile erstelle, gibt er 0 Fehler und 0 Warnungen zurück.

Ich habe den Code auf cpp.sh getestet und diese Website ändert die Werte genau und gibt jedes Mal das korrekte/vollständige Ergebnis aus, also frage ich mich, ob dies ein CodeBlocks/mein Hardware-Problem ist? Der Debugger gibt auch nur ein Problem zurück, und es scheint mit der setValue-Funktion zu sein, aber mein untrainiertes Auge kann nicht sagen, was falsch ist.

Entschuldigung für die Ignoranz. Auch hier habe ich fast keine Erfahrung und bin irgendwie ratlos. Vielen Dank im Voraus für jegliche Hilfe, die Sie möglicherweise leisten können.

#include <iostream> 
using namespace std; 

class array2D 
{ 
protected: 
    int xRes; 
    int yRes; 
    float ** xtable; 
public: 
    array2D (int xResolution, int yResolution); 
    void getSize(int &xResolution, int &yResolution); 
    void setValue(int x,int y,float val); 
    float getValue(int x,int y); 
    ~array2D(); 
}; 

array2D::array2D(int xResolution, int yResolution) 
{ 
    xRes=xResolution; 
    yRes=yResolution; 

    xtable = new float*[xResolution]; 

    for(int i=0;i < xResolution;i++) 
    { 
     xtable[i] = new float[yResolution]; 
    } 

    for(int i=0;i < xRes;i++) 
    { 
     for(int j=0;j < yRes;j++) 
     { 
      xtable[i][j]=0; 
     } 
    } 
} 

void array2D::getSize(int &xResolution, int &yResolution) 
{ 
    xResolution=xRes; 
    yResolution=yRes; 
    cout << "Size of Array (rows, columns): " << xResolution << ", " << yResolution << endl; 
} 

void array2D::setValue(int x,int y,float val) 
{ 
    xtable[x][y] = val; 
} 

float array2D::getValue(int x,int y) 
{ 
    return xtable[x][y]; 
} 

array2D::~array2D(){ 
    cout << "Destructing array" << endl; 
} 

int main() 
{ 
    array2D *a = new array2D(32,24); 
    int xRes, yRes; 
    a->getSize(xRes,yRes); 
    for(int i=0;i < yRes;i++) 
    { 
     for(int j=0;j < xRes;j++) 
     { 
      a->setValue(i,j,100.0); 
     } 
    } 

    for(int j=0;j < xRes;j++) 
    { 
     for(int i=0;i < yRes;i++) 
     { 
      cout << a->getValue(i,j) << " "; 
     } 
     cout << endl; 
    } 

    a->~array2D(); 
} 
+1

Manuell einen Destruktor aufrufen ist fast immer eine schlechte Idee. Ich denke du meinst "delete ein" genau am Ende dort. – user4581301

+1

Lesefassung [Was ist die Dreiregel?] (Https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) Es wird später viel Verwirrung ersparen. – user4581301

+0

@ user4581301 danke, dass du mich informiert hast - ich werde diesen Teil entfernen und studieren! –

Antwort

2

Sie verwenden xRes und yRes falsch in dem folgenden Block:

for(int i=0;i < yRes;i++) 
{ 
    for(int j=0;j < xRes;j++) 
    { 
     a->setValue(i,j,100.0); 
    } 
} 

Diesem Grund, Sie am Ende Speicher zugreifen, die Sie nicht zugreifen sollen, wenn xRes und yRes unterschiedlich sind. Das verursacht undefiniertes Verhalten.

Tauschen Sie sie aus. Verwenden Sie:

for(int i=0;i < xRes;i++) 
{ 
    for(int j=0;j < yRes;j++) 
    { 
     a->setValue(i,j,100.0); 
    } 
} 
+0

Natürlich! Ich weiß nicht, wie oft ich das betrachtete und immer noch dachte, es sei richtig. Sieht so aus, als hätte ich die i- und j-Platzierung im folgenden for-loop-Block falsch gesetzt (schließlich getValue aufrufen). Noch einmal, du bist ein Retter! –

+0

@KOne, ich bin froh, dass ich helfen konnte. –

Verwandte Themen