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.
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.