¨Lesen eines Textfiles mit Komma-deliminator

Hi.

Ich sehe ja jetzt erst, dass du dort nochmal über einen Zeiger auf das
Element im Array zugreifst. Wie ist denn der Typ der Stars Variablen
genau?

Es müßte so aussehen:
C++:
ES_Stars* Stars;

Stars[mCount].Name = Text1;
Gruß
 
Bin jetzt nicht ganz sicher was du meinst. *Stars[] ist ein dynamisches Array vom struct ES_Star, das ich oben gepostet habe. Falls du es übersehen hast, hier ist es nochmal:

Code:
struct ES_Star
{
	std::string Name;
	float Magnitude;
	std::string Spectrum;
	int Fraction;
	std::string Sequence;
	double x;
	double y;
	double z;
	double Distance;
};

Falls du nicht das gemeint hast verstehe ich deine Frage nicht richtig.

Das Array ist ein member der Klasse zu der die Funktion gehört:

Code:
class ES_Cluster
{
public:
	ES_Cluster(void);
	~ES_Cluster(void);
	void ConvertHyg(void);
	double nStars;
	ES_Star *Stars[];
};

Wie oben gezeigt wird das Array dann zu beginn der Funktion ConvertHyg iniziiert.

Code:
*Stars = new ES_Star[150000];
Im Moment ginge das eigentlich noch mit einem statischen Array, aber später werde ich auf ein Dynamisches angewiesen sein, also habe ich es gleich von Begin weg dynamisch definiert.

Edit: Habe noch kurz etwas rumprobiert und einige interessante entdeckungen gemacht: Wenn ich das Array statisch definiere läuft die Sache. Wenn ich es aber in der benötigten grösse statisch definiere (150'000) erhalte ich einen Stack-overflow.
 
Zuletzt bearbeitet:
Bin jetzt nicht ganz sicher was du meinst. *Stars[] ist ein dynamisches Array vom struct ES_Star, das ich oben gepostet habe.
So wie du es definiert hast, ist das ein Array von Zeigern auf ES_Star, das allerdings die Länge 0 hat.

Das Array ist ein member der Klasse zu der die Funktion gehört:

Code:
class ES_Cluster
{
public:
	ES_Cluster(void);
	~ES_Cluster(void);
	void ConvertHyg(void);
	double nStars;
	ES_Star *Stars[];
};

Wie oben gezeigt wird das Array dann zu beginn der Funktion ConvertHyg iniziiert.

Code:
*Stars = new ES_Star[150000];
Die Zeile ist gleichbedeutend mit
C++:
Stars[0] = new ES_Star[150000];
Das führt eigentlich schon zu undefiniertem Verhalten, weil du auf das erste Arrayelement eines Arrays der Länge 0 zugreifst. Aber angenommen, es geht trotzdem nichts schief, in Stars[0] landet also der Zeiger auf den reservierten Speicherbereich. Dann weißt du aber trotzdem nicht, was in Stars[1] steht (abgesehen davon, dass der Zugriff darauf wieder zu undefiniertem Verhalten führt).

Halte dich also einfach an den Vorschlag von deepthroat und definiere dein "Array" als
C++:
ES_Star *Stars;
, initialisiere es mit
C++:
Stars = new ES_Star[150000];
und greife über
C++:
Stars[mCount].Name
darauf zu.

Grüße, Matthias
 
Zuletzt bearbeitet von einem Moderator:
Die Zeile ist gleichbedeutend mit
Stars[0] = new ES_Star[150000];

Ah! Das erklärt in der Tat so einiges!

Halte dich also einfach an den Vorschlag von deepthroat und definiere dein "Array" als

ES_Star *Stars;

, initialisiere es mit
Stars = new ES_Star[150000];

Jetzt verstehe ich erst richtig was DeepThroat mir zu sagen versuchte. In der Tat, die Sache scheint jetzt zu funktionieren. Und ich komme mir etwas dumm vor das ich es geschafft habe ein dynamisches Array falsch zu definieren obwohl ich das vorher schon zig male gemacht habe... *seufz*

Vielen Dank für eure Geduld, speziell an DeepThroat!
 

Neue Beiträge

Zurück