Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Copax

Frischling

  • »Copax« ist der Autor dieses Themas

Beiträge: 17

Beruf: Fachinformatiker

  • Private Nachricht senden

1

04.02.2014, 09:30

OOP - Instanz in ein Array speichern

Aloha^^

Hab mal wieder ein Problemchen.. nach langen rumprobieren und Tutorials lesen hab ich es endlich mal hinbekommen eine Klasse zu erstellen und auch Instanzen zu erzeugen. Das Problem ist jetzt das alles in der main() Funktion ist und ich es gern dezentralisieren würde.. nur die Funktionen übernehmen das Array mit den Instanzen nicht da es keinen direkten Datentyp hat..

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
int main(int argc, char* args[]){SDL_Surface *screen=NULL;SDL_Surface *menu=NULL;SDL_Surface *button=NULL;int posXY,RohstoffRandom;int YN;time_t t;
    time(&t);srand((unsigned int)t);int x=0;MapDaten Karte[80000];
    SDL_Init (SDL_INIT_EVERYTHING);screen=SDL_SetVideoMode(800,600,32,SDL_SWSURFACE);
while(x==0, x<=79999){
    posXY=rand()%7; if (posXY==0) Karte[x].Begehbar=0;  else Karte[x].Begehbar=1;
    Karte[x].WeltGrund=posXY;
    RohstoffRandom=rand()%4 + 1;    if (RohstoffRandom==1)  {       Karte[x].Rohstoff='G';  }       else if (RohstoffRandom==2)     {           Karte[x].Rohstoff='S';      }           else if (RohstoffRandom==3)         {               Karte[x].Rohstoff='H';          }               else if (RohstoffRandom==4)             {                   Karte[x].Rohstoff='E';              }                   else Karte[x].Rohstoff='X';x++;}x=0;while(x==0, x<=79999){
printf("%s %d %s %d %s %d %s %c \n","Feld " , x, ": ", Karte[x].WeltGrund," Begehbar?: ", Karte[x].Begehbar, " Rohstoff: ", Karte[x].Rohstoff);
x++;}
system("pause");
SDL_Quit();return 0;}


Wie übergebe ich das Array jetzt an Funktionen?
"Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt."



Albert Einstein

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

04.02.2014, 10:08

[...] nur die Funktionen übernehmen das Array mit den Instanzen nicht da es keinen direkten Datentyp hat..

Was genau meinst du damit?

Copax

Frischling

  • »Copax« ist der Autor dieses Themas

Beiträge: 17

Beruf: Fachinformatiker

  • Private Nachricht senden

3

04.02.2014, 10:55

Naja hab ja das Array als "MapDaten Karte[80000];" definiert wobei MapDaten der Aufruf der Klasse ist.. somit hat das Array ja keinen wirklichen Datentyp oder? Also kann ich nicht einfach mit:

void lalala(Array(80000))
{
}

main ()
{
Klasse Array(80000);

lalala(Array);
}

darauf zugreifen.. weil void lalala einen Datentypen erwartet.. aber int Array oder ähnliches geht nicht das das Array ja die Instanz der Klasse ist..
"Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt."



Albert Einstein

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

04.02.2014, 11:12

Du wirfst hier alle möglichen Begriffe durcheinander.
Was genau willst du eigentlich erreichen?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

04.02.2014, 11:15

"Array(80000)" ist kein Datentyp, sondern ein Konstruktor-Aufruf. "Klasse" ist ein Datentyp.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Copax

Frischling

  • »Copax« ist der Autor dieses Themas

Beiträge: 17

Beruf: Fachinformatiker

  • Private Nachricht senden

6

04.02.2014, 11:16

Das Array was die Instanzen meiner Klasse enthält an eine Funktion übergeben..

Ja das weiß ich auch das Array(...) kein Datentyp ist.. aber ich kann der Funktion auch nicht void lalala(Klasse Array(...)) übergeben..
"Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt."



Albert Einstein

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

04.02.2014, 11:18

Mit Arrays arbeitet es sich in C++ nicht so komfortabel.
Du solltest lieber beispielsweise std::vector benutzen.

8

04.02.2014, 11:46

Dein Problem ist, dass man zwar Arrays in einer Funktion übergeben kann, jedoch innerhalb der Funktion die Größe nicht mehr bekannt ist. Im Grunde übergibst du der Funktion lediglich einen Zeiger auf das erste Element Deines Arrays ("friss und stirb").

Die C-Lösung wäre es, die Größe des Arrays als zusätzlichen Parameter zu übergeben.

Die C++-Lösung ist es, wie David schon erwähnte, std::vector< T > zu verwenden und diesen dann per Reference durch die Funktion zu verwenden. Alternativ, wenn du es unbedingt auf dem Stack haben willst, std::array< T, N >.

Darüber hinaus: Ich kenne Deinen Grund nicht, warum Du SDL verwendest. In erster Linie willst Du doch C++(11) lernen. So läufst Du Gefahr, Eigenheiten und Idiome aus der C-Welt einschleichen zu lassen. Wenn Du SDL mit C++ verwendest, endet es meistens damit, dass Du Dir einen Wrapper um die Bibliothek zusammenbastelst. SFML hat hier m. E. das schönere Interface; eben weil sie mit C++ entwickelt wird.

@David: "[...]nicht komfortabel" ist schon sehr wohlwollend ausgedrückt ;)

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

04.02.2014, 13:53

Ja das weiß ich auch das Array(...) kein Datentyp ist.. aber ich kann der Funktion auch nicht void lalala(Klasse Array(...)) übergeben..

Ja. Eben, weil "Array(...)" kein gültiger Bezeichner ist. Du meinst wohl eher

C-/C++-Quelltext

1
2
3
Klasse keinArray;
...
void foobar(Klasse keinArray){}
oder

C-/C++-Quelltext

1
2
3
Klasse Array[80000];
...
void foobar(Klasse Array[80000]){}

"Klasse" ist kein Array!
"Array(80000)" ist auch kein Array und nichtmal ein Datentyp.

Etwas Google hätte da ganz schnell geholfen:
http://www.tutorialspoint.com/cplusplus/…o_functions.htm
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (04.02.2014, 13:59)


Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

10

04.02.2014, 14:15

Du hast anscheinend ein paar gravierende Wissenslücken. Ich würde dir anraten ein C++ Buch deiner Wahl zu nehmen und diese Lücken zu schließen. Schau dir auch mal die STL an. Schlag dir das mit dem Array übergeben, wie du es vielleicht aus Java und C# kennst aus dem Kopf. :dash:

Quelle: http://www.c-plusplus.de/forum/211779-full

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Übergabe als Zeiger 
void ZeigerFunktion(std::vector<Typ> *Vektor) 
{ 
    Vektor->size();  // Zugriff mit -> 
} 
  
// Übergabe als Referenz 
void RefFunktion(std::vector<Typ> &Vektor) 
{ 
    Vektor.size();  // normaler Zugriff mit . 
}

// Aufruf 
std::vector<Typ> V; 
ZeigerFunktion(&V); 
RefFunktion(V);



Wie man ein Array per Pointer an eine Funktion übergibst kannst du hier lesen. Ich rate jedoch davon ab.

Gruß Fb

Werbeanzeige