Hvorfor virker det her ikke?

Tags:    c++

class Objects
{
public:
float Vertex[8][3];
int Edge[12][2];
int FaceCount[2];
int FaceConnect[6];
};

Objects Plane;

Plane.Vertex = {{0,0,0}, {1,0,0}, {0,1,0}, {1,1,0}};
Plane.Edge = {{0,1}, {0,2}, {1,3}, {2,3}, {0,3}};
Plane.FaceCount = {3, 3};
Plane.FaceConnect = {0, 2, 3, 0, 1, 3};



9 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
class Objects
{
public:
float Vertex[8][3];
int Edge[12][2];
int FaceCount[2];
int FaceConnect[6];
};

Objects Plane;

Plane.Vertex = {{0,0,0}, {1,0,0}, {0,1,0}, {1,1,0}};
Plane.Edge = {{0,1}, {0,2}, {1,3}, {2,3}, {0,3}};
Plane.FaceCount = {3, 3};
Plane.FaceConnect = {0, 2, 3, 0, 1, 3};


Hej Mikkel

Så vidt jeg husker er det du prøver på at lave intialisering af dine array's. Dette er fuld lovlig hvis du gjorde når du erkære dine array's, men vist ikke efter de er erklæret.
Eks:

void func(void)
{

int tmp[4] = {1,2,...}; //lovlig

int tmp[4]; //ulovlig
tmp ={1,2,3...}; //ulovlig

Så du kan nok bliver nød til at lave en løkke til at intialisere dine array's.

Hilsen Thomas



Jeg har prøvet at lave den lidt om til:

#include <iostream>

class Objects
{
public:
void setVertex( float IndVertex[3] );
float getVertex();

private:
float Vertex[3];
};

void Objects::setVertex( float IndVertex[3] )
{
Vertex[3] = IndVertex[3];
};

float Objects::getVertex()
{
return Vertex[3];
};

int main()
{
Objects Plane;
float Ver[3] = {0.5, 0.5, 0.5};
Plane.setVertex ( Ver );
std::cout << Plane.getVertex();
return 0;
};


Den compiler og linker men når den kører programmet siger den:
"Unhandled exception in Text1.exe: 0xC0000005: Access Violation"


Her gør du det samme som før. Først bliver de deklæret og derefter initialiseret. Du slipper nok ikke for løkken...eller måske du kan gøre det i din constructor ?:
Fold kodeboks ind/udKode 


Ellers kan du gøre dette:
Fold kodeboks ind/udKode 




Jeg har prøvet at lave den lidt om til:

#include <iostream>

class Objects
{
public:
void setVertex( float IndVertex[3] );
float getVertex();

private:
float Vertex[3];
};

void Objects::setVertex( float IndVertex[3] )
{
Vertex[3] = IndVertex[3];
};

float Objects::getVertex()
{
return Vertex[3];
};

int main()
{
Objects Plane;
float Ver[3] = {0.5, 0.5, 0.5};
Plane.setVertex ( Ver );
std::cout << Plane.getVertex();
return 0;
};


Den compiler og linker men når den kører programmet siger den:
"Unhandled exception in Text1.exe: 0xC0000005: Access Violation"



#include <iostream>

class Objects
{
public:
void setVertex( float IndVertex[3][3] );
float getVertex();

private:
float Vertex[3][3];
};

void Objects::setVertex( float IndVertex[3][3] )
{
Vertex[0][0] = IndVertex[0][0];
Vertex[1][0] = IndVertex[1][0];
Vertex[2][0] = IndVertex[2][0];

Vertex[0][1] = IndVertex[0][1];
Vertex[1][1] = IndVertex[1][1];
Vertex[2][1] = IndVertex[2][1];

Vertex[0][2] = IndVertex[0][2];
Vertex[1][2] = IndVertex[1][2];
Vertex[2][2] = IndVertex[2][2];
}

float Objects::getVertex()
{
return Vertex[3][3];
}


int main()
{
Objects Plane;
Objects Plane2;
int stop;
float Ver[3][3] = {{0, 0, 0}, {0,0,0}, {0,0,0}};
float Ver2[3][3] = {{1, 1, 1}, {1,1,1}, {1,1,1}};
Plane.setVertex ( Ver );
Plane2.setVertex( Ver2 );
std::cout << Plane.getVertex() << "\\n";
std::cout << Plane2.getVertex() << "\\n";
return 0;
}


Okay nu ser det ud til at virke...
Men hvordan kan det være at command prompt udskriver:

1.14838e-038
0





Okay nu ser det ud til at virke...
Men hvordan kan det være at command prompt udskriver:

1.14838e-038
0

Det er fordi du går ud over arrayet. Du har allokeret plads til tre gange tre floats men du returnerer den på plads 3,3 (altså række 4 kolonne 4) så det er tilfældigt, hvad du får.

Hvis du vil have dem alle sammen skrevet ud skulle du hellere overstyre << operatoren:
Fold kodeboks ind/udKode 




Men hvordan kan det være at nummer Plane2 altid returnere 0?.

int main()
{
Objects Plane;
Objects Plane2;
int stop;
float Ver[3][3] = {{0, 0, 0}, {0,0,0}, {0,0,0}};
float Ver2[3][3] = {{0, 0, 0}, {0,0,0}, {0,0,0}};
Plane.setVertex ( Ver );
Plane2.setVertex( Ver2 );
std::cout << Plane.getVertex() << "\\n";
std::cout << Plane2.getVertex() << "\\n";
return 0;
}

Plane og Plane2 har samme værdi men returnere noget forskelligt.



Og hvordan kan Plane returnere 1.14838e-038?
Den burde returnere 0 eftersom Vertex[3][3] = 0.



Nååh når man erklærer en array starter man fra 1 men når man definere en plads starter man fra 0 ja... Har aldrig helt forstået hvorfor.



Tak for hjælpen



t