PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Speicherzugriffsfehler



BigOne
18-12-2002, 17:39
Hallo!

Ich hab mein erstes C++-Programm zusammengebastelt. Es rechnet aus, wie man Lieder am sinnvollsten auf die zwei Seiten eine Kassette verteilt. Ich hab noch sehr wenige Funktionen drin. Mit großer Mühe hab ich es geschaft das Programm zu kompilieren, und dann, beim ersten Start:

"Speicherzugriffsfehler", und das Programm tut nichts. Ich weiß nicht, wo der Fehler liegt, darum poste ich mal den gesamten Code(ist ja nicht sehr umfangreich), und hoffe, dass ihr mir helfen könnt:


#include <iostream.h>

/* The class in which the order of the tracks on
* the audio-cassette is stored.
* It consists of an array and the methods to calculate
* the order and to return a pointer to the array. */

class cassette
{
private:
int *SideA;
int *SideB;
int numberOfTracksA;
int numberOfTracksB;
float sideASize;
float sideBSize;
float lengthOfCassette;
float bestSideALength;
int *bestTree;
int bestNumberOfTracks;

bool proofTree(int *tree, int value, int numberOfTracks)
{
for(int i = 0; i < numberOfTracks; ++i)
if(value == tree[i])
return true;
return false;
}
// appearFunktion prüft, ob die Methode calculate sich selbst
// aufrufen soll nach folgenden Gesichtspunkten:
// 1. der Index der for-schleife darf noch nicht im aktuellen
// Baum vorkommen
// 2. wenn die Aktuelle Zeit nicht die so groß ist, wie der maximal-
// Wert für die Aktuelle Seite, und diesen auch nicht durch den Funktions-
// aufruf überschreitet.
// 3. wenn der Index der for-schleife noch in keiner höheren Stufe
// vorkam.
bool appearCalculate(int index, int *tree, int numberOfSteps, int *exclude, int sizeOfExclude, float maxSideA, float lengthOfTree, float *tracks)
{
bool appear = true;
if(lengthOfTree + tracks[index] >= maxSideA)
appear = false;
if(proofTree(tree, index, numberOfSteps) == false)
appear = false;
if(proofTree(exclude, index, sizeOfExclude) == true)
appear = false;
return appear;
}
// gibt die beste Reihenfolge der CD-Tracks auf Seite A zurück
void calculateBestSideA(float *tracks, int numberOfTracks, int *exclude, int excludeSize, int *tree, int depth, float maxSideA, float lengthOfTree)
{
for(int i = 1; i <= numberOfTracks; ++i)
{
if(appearCalculate(i, tree, depth, exclude, excludeSize, maxSideA, lengthOfTree, tracks) == true)
{
tree[depth - 1] = i;
exclude[excludeSize];
excludeSize += 1;
calculateBestSideA(tracks, numberOfTracks, exclude, excludeSize, tree, depth + 1, maxSideA, lengthOfTree + tracks[i]);
}
else if(lengthOfTree + tracks[i] > maxSideA)
if(lengthOfTree > bestSideALength)
{
for(int h = 0; h < depth; ++h)
bestTree[h] = tree[h];
bestSideALength = lengthOfTree;
bestNumberOfTracks = depth;
}
exclude[excludeSize] = i;
excludeSize += 1;
}
}
public:
cassette(int numberOfTracks, float *tracks, float length)
{
bestTree = new int[numberOfTracks];
bestSideALength = 0;
lengthOfCassette = length;
calculate(tracks, numberOfTracks);
}
void calculate(float *tracks, int numberOfTracks)
{
float maxSideA = lengthOfCassette / 2;
int *exclude = new int[numberOfTracks];
int *tree = new int[numberOfTracks];
calculateBestSideA(tracks, numberOfTracks, exclude, 0, tree, 1, maxSideA, 0);

}
float returnLength(int side)
{
if(side == 'a')
return sideASize;
else
return sideBSize;
}
int *returnSide(int side)
{
if(side == 'a')
return SideA;
else
return SideB;
}
int returnNumberOfTracks(int side)
{
if(side == 'a')
return numberOfTracksA;
else
return numberOfTracksB;
}
};

int main(void)
{
float a[5] = {1,2,3,4,5};
cassette cassette1(5, a, 3);
int *b = cassette1.returnSide('a');
for(int i = 0; i < cassette1.returnNumberOfTracks('a'); i++)
cout << a[b[i]] << endl;
}

Danke im Vorraus.

anda_skoa
18-12-2002, 22:25
Hmm ich bekommen keinen Fehler, es tut nur nix.
Vielleicht ein Copy&Paste Problem von mir.

Du solltest mal mit -Wall kompilieren.

da gibt es eine Warnung



if(appearCalculate(i, tree, depth, exclude, excludeSize, maxSideA, lengthOfTree, tracks) == true)
{
tree[depth - 1] = i;
exclude[excludeSize]; // <-- hier: statement with no effect
excludeSize += 1;
calculateBestSideA(tracks, numberOfTracks, exclude, excludeSize, tree, depth + 1, maxSideA, lengthOfTree + tracks[i]);
}


Vielleicht kannt du beim nächsten Mal weniger weit einrücken, bitte :)

Abgesehen davon, sieh dir mal die Containerklassen der STL an:
http://www.cppreference.com/

zB vector und list.
Dann ersparst du dir das fehleranfällige Handhaben von int Array über Pointer.

Ciao,
_

BigOne
19-12-2002, 13:55
Danke für den Tip. Ich hab gerade erst angefangen C++ zu programmieren.

Die Stelle, die zu gefunden hast, hab ich geändert. Tut sich aber leider immer noch nichts. Kann das vielleicht an meinem Kernel liegen, mit dem Speicherzugriffsfehler?

The Ripper
19-12-2002, 14:03
Gdb meint, dass der Speicherzugriffsfehler hier (vorletzte Zeile)


cout << a[b[i]] << endl;

auftritt.

cassette1.returnNumberOfTracks('a') scheint einen zu grossen Wert zurückzugeben, heut abend prüfe ich das mal genauer.

The Ripper
19-12-2002, 16:46
Hmm, nachdem ich den Debugger benutzt habe, habe ich gemerkt, dass ich ihn überhaupt nicht hätte benutzen müssen :D
Sieht so aus, als hättest du bei dem Programm einen Teil vergessen: SideA und numberOfTracksA, die dein Hauptprogramm von den Funktionen returnSide() bzw. returnNumberOfTracks() zurückgegeben bekommt, sind überhaupt nicht initialisiert. Wirklich berechnet hat die Klasse also vor der Ausgabe im Hauptprogramm noch nichts, und es ist auch noch keine Funktion enthalten, die einer der beiden genannten Variablen einen Wert zuweist.