PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Structur als Parameter an Funktion übergeben [C++]



Ynnus
22.02.2005, 20:22
Hallöchen,

wieder einmal hab ich eine kleine Frage zu C++ und Funktionen. Ich habe eine kleine Funktion geschrieben welche verschiedene Dinge auf dem Bildschirm rendert. Dabei sollen es 20 Objekte sein. Deshalb habe ich ein Array dafür verwendet. Dieses ist vom Typ einer Structur, da ich mehrere Datentypen für diese zu rendernden Objekte benötige.

So sieht erst einmal die Structur aus:

struct sprite_struc
{
float pos_x;
float pos_y;
int size_x;
int size_y;
float speed_x;
float speed_y;
int layer;
float angle;
float transparency;
bool alive;
short int direction_x;
short int direction_y;
float color1;
float color2;
float color3;
};

sprite_struc partikel[21];

Da gibt's also jetzt erstmal 20 Structur-Objekte als Array zusammen gefasst. Diese sollen alle in der Funktion durchgearbeitet werden. Dabei soll diese Funktion aber möglichst unabhängig einzusetzen sein, also ich würde gern nur einfach dieses Structur-Objekten-Array mit den 20 Feldern als Parameter übergeben, und die Funktion nutzt dann diese in der Funktion.

Das ist ein Ausschnitt der Funktion, zum besseren Verständnis:


void displayfire( /* Wie muss der Parameter aussehen? */ )
{
for (int n = 1; n < 20; n++)
{
if (partikel[n].alive == false)
{
partikel[n].alive = true;
partikel[n].pos_x = partikel[0].pos_x;
partikel[n].pos_y = partikel[0].pos_y;
partikel[n].size_x = 33;
partikel[n].size_y = 42;
partikel[n].speed_x = 0;
//... usw ...


Anstelle dass ich jetzt immer dieses Structurobjekt "partikel" nehmen muss, wie es fest in der Funktion heißt, möchte ich da gern als Parameter ein Structurobjekt übergeben welches dann verwendet wird. Also dynamisch je nach übergebenem Parameter und nicht fest an dieses Element "partikel[]" gebunden.

Ich hoffe das war soweit verständlich und dass ein kundiger User mir hierbei helfen kann.

mfg.

Sunny

Firzen
22.02.2005, 20:35
Ich weiß nicht, ob ich das richtig verstanden hab, aber meinst du das so in etwa?


void displayfire(sprite_struc *pStruct, int numStruct){
for(int i = 0; i<numStruct; i++){
// ...
}
}

Ynnus
22.02.2005, 20:46
So dachte ich mir das, sodass man jetzt mit folgendem in der Funktion weiterarbeiten könnte:

void displayfire(sprite_struc *pStruct, int numStruct){
for(int i = 0; i<numStruct; i++)
{
if (pStruct[i].alive == false)
{
pStruct[i].alive = true;
pStruct[i].pos_x = pStruct[0].pos_x;
pStruct[i].pos_y = pStruct[0].pos_y;
pStruct[i].size_x = 33;
pStruct[i].size_y = 42;
pStruct[i].speed_x = 0;
//... usw ...

intern sollen dabei aber die Werte der übergebenen Array-Structur geändert werden. Nur, wie rufe ich dann diese Funktion auf? Ich erhalte hier immer ein paar Fehlermeldungen wenn ich es so schreiben will wie du es vorgeschlagen hast.

conversion from `sprite_struc (*)[25]' to non-scalar type `
Liegt vielleicht daran, dass es hier ja nicht nur eine einfache Variable des Typs einer Structur ist sondern noch dazu ein Array. Gibt's da vielleicht Komplikationen? Oder muss ich die Funktion anders aufrufen? Ich habs jetzt schlicht und einfach mal mit "displayfire(&partikel);" und "displayfire(&partikel[0]);" und solchen Kombinationen versucht. Hat aber irgendwie noch nicht so recht geklappt.

Dingsi
22.02.2005, 21:00
Auch schon displayfire(partikel,20), ohne &, versucht? Denn ein Array ist eigentlich nichts als ein Pointer. Und sollte daher cast-los übertragbar sein.

BTW: sprite_struc partikel[21]; << Warum 21 wenn du nur 20 willst? Beim Index fängt er zwar bei 0 an (partikel[0]-partikel[19] = 20) aber beim definieren zählt er ganz "normal", also von 1. D.h. sprite_struc partikel[20]; ergäbe partikel[0]-partikel[19]. Deins ergäbe partikel[0]-partikel[20] = 21.

Firzen
22.02.2005, 21:01
Also bei mir hat es mit displayfire(Partikel, numPartikel); nie Probleme gegeben.
Partikel ist ein Array vom Typ sprite_struc, und numPartikel ist ein int.

edit: 2 late

mfg
Firzen

Ynnus
22.02.2005, 21:42
Ah, ich Horst, Danke Leute, jetzt ist es klar. Erstmal musste ich das & vor dem Partikel wegnehmen und dann hatte ich noch eine ältere Version (sah so aus: "void displayfire( sprite_struc element, int num);" ziemlich weit oben deklariert, weil meine Funktion nach dem Aufruf erst definiert wurde. Dadurch kam dann der Fehler mit dem falschen Casten, da hatte ich den "*" noch nicht gesetzt.)
Klappt jetzt alles wie es soll. :)
(Übrigends eine Tolle Sache, dieses Programmierforum hier. Flotte und gute Hilfe, nochmals Danke an alle die mir hier immer mal wieder helfen. ;))