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

Encounter

Frischling

  • »Encounter« ist der Autor dieses Themas

Beiträge: 22

Wohnort: Aachen

  • Private Nachricht senden

1

27.04.2014, 16:07

Fortlaufende Nummer an einen Strukturnamen anhängen

Hallo liebe Spieleprogrammierer Community,

bei einem Problem in der Vergangenheit wo ich im Internet nichts passendes gefunden habe, wurde mir hier sehr hervorragend und freundlich geholfen.
Daher meine Hoffnung, dass ihr mir auch jetzt helfen könnt.

Also mein Problem: Ich möchte neuee Instanzen einer Struktur anlegen und dabei eine fortlaufende Nummer anhängen.

Ich meine dazu schonmal etwas gelesen zu haben, dass irgendwie einfach der Wert der Variable genommen wird und nicht die Variable an sich.

Also z. B. sollte das so ähnlich sein:

C-/C++-Quelltext

1
2
3
4
for(int i = 0; i>5; i++)
{
s_Felddaten Feld i;
}


Am Ende will ich also folgende Instanzen der Felddaten Struktur haben:
Feld0
Feld1
Feld2
Feld3

Wäre super wenn ihr mir da nen kleinen Schubs geben könntet. :)
Ich war hier und hab ALLES gesehen!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

27.04.2014, 16:15

Warum benutzt du nicht ein Array oder einen Container wie std::vector?

Encounter

Frischling

  • »Encounter« ist der Autor dieses Themas

Beiträge: 22

Wohnort: Aachen

  • Private Nachricht senden

3

27.04.2014, 16:36

Hallo David,

ersteinmal vielen dank für die wirklich schnelle Antwort.
Irgendwie hab ich schon damit gerechnet, dass du einer der Ersten Antwortenden bist. :D

Also hab jetzt mal ein wenig expirmentiert und überlegt, aber irgendwie weiß ich nicht wie ich das mit einem Array/Vector lösen sollte.
Ich möchte ja die Daten nicht von Hand eingeben.
Kannst du vielleicht ein kurzes Beispiel zu deiner Idee bringen?
Ich war hier und hab ALLES gesehen!

4

27.04.2014, 16:55

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#include <vector>
//irgendwo
std::vector<s_Felddaten> felder;
//irgendwo
for(int i = 0; i>5; i++)
{
s_Felddaten Feld;
//Irgendwas mit Feld vielleicht noch machen
felder.push_back(Feld);
}


Und schon hast du im std::vector felder 5 Instanzen drin, auf die du z.B. mit dem []-Operator zugreifen kannst.
Also etwa:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
felder[0] //<-s_Felddaten
felder[1]
felder[2]
felder[3]
felder[4]

//oder als Schleife:
for(std::vector<s_Felddaten>::size_type i = 0; i < felder.size(); ++i)
{
    felder[i] //...
}
//oder...
for(auto &a : felder)  //durch Referenz in Schleife veränderbar!
{
    a //...
}
//oder um bestimmte Instanzen z.B. wieder zu löschen o.Ä.
for(auto it = felder.begin(); it != felder.end();)
{
    if(/*something true*)
    {
        //foo
    }
    else //löschen der Instanz.
    {
        it = felder.erase(it);
    }
}

Für die Arrays würde ich übrigens das neue std::array vorschlagen.

C-/C++-Quelltext

1
2
3
std::array<s_Felddaten /*Was ist im Array?*/, 5 /*Größe*/> felder; //es entstehen hierbei 5 Felder
// Solltest du gleich zu Anfang bestimmte Werte vergeben wollen:
std::array<s_Felddaten, 5> felder({{/*Wert0*/, /*Wert1*/, /*Wert2*/, /*Wert3*/, /*Wert4*/}});

Und einen Zeiger auf die Daten gibts natürlich auch, keine Frage:

C-/C++-Quelltext

1
felder.data();  // s_Felddaten*

Warum std::array und kein normales Array? std::array ist weitaus sicherer und hübsch und neu und...
Klarer? :)

MfG
Check

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Checkmateing« (27.04.2014, 17:06)


5

27.04.2014, 16:55

Welche Daten willst du denn da einfügen?
Wenn du allgemein reden möchtest:

C-/C++-Quelltext

1
2
3
4
5
6
struct FelddatenStruktur {
  ...
} felder[5];

for (int i=0; i < 5; ++i)
    felder[i] = i; // <- read/write-Zugriff


P.S: Beschaffe dir bitte Literatur, die sich mit Arrays beschäftigt und lerne die Basics.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Encounter

Frischling

  • »Encounter« ist der Autor dieses Themas

Beiträge: 22

Wohnort: Aachen

  • Private Nachricht senden

6

27.04.2014, 21:09

Welche Daten willst du denn da einfügen?
Wenn du allgemein reden möchtest:

C-/C++-Quelltext

1
2
3
4
5
6
struct FelddatenStruktur {
  ...
} felder[5];

for (int i=0; i < 5; ++i)
    felder[i] = i; // <- read/write-Zugriff


P.S: Beschaffe dir bitte Literatur, die sich mit Arrays beschäftigt und lerne die Basics.


Danke Checkmateing und iSmokiieZz für die Antworten. Mit den normalen Arrays kenn ich mich problemlos aus, das ist kein Problem. Ich wusste nur nicht, dass ich so einfach ein Array als Struktur Instanz verwenden kann.
(Mit Strukturen tu ich mich immer ein wenig schwer).
Der Lösungsvorschlag von iSmokiieZz funktioniert für meinen Zweck perfekt.

Den ganzen Code von dir Checkmateing finde ich auch sehr interessant.
Ich wusste nicht, dass es eine "neue" Art Array gibt.

Also ist folgendes alt:

C-/C++-Quelltext

1
int aBeispiel[] = {1,2,3,4,5,6};


Und dies wäre die modernere Form?:

C-/C++-Quelltext

1
std::array<int,6>aBeispiel({{1,2,3,4,5,6}})


Aber wieso Runde + 2x geschweifte Klammern bei der Definition?
Irgendwie wirkt da etwas zu viel.

Hab mir das dann mal angesehen und diese Form als auch möglich gefunden (finde ich persönlich besser da übersichtlicher):

C-/C++-Quelltext

1
std::array<int,6>aBeispiel = {1,2,3,4,5,6};


Wenn ich das std::array (aus C++11?) richtig sehe, funktioniert es eigentlich genau gleich mit einer kleinen Syntax Abweichung.
Aber man kann soweit ich das jetzt auf die schnelle gesehen habe nicht den Compiler selber die Größe zählen lassen, sondern nur im nachhinein die Größe auslesen.
Aber mit dem std::array kann man mehr machen. Danke auf jedenfall für den Tipp, finde ich sehr interessant.

Achso und hinweis an die die das vielleicht lesen und das std::array auch nicht kennen, um es zu benutzen muss man dies erst einbinden:

C-/C++-Quelltext

1
#include <array>
Ich war hier und hab ALLES gesehen!

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

7

27.04.2014, 21:26

Die geschweiften Klammern bei std::array ist eine initializer_list. Eine direkte Zuweisung im CTor (std::array<int,6>aBeispiel({{1,2,3,4,5,6}})) ist dasselbe wie die Zuweisung mittels des Zuweisungsoperators (std::array<int,6>aBeispiel = {1,2,3,4,5,6};).
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

8

27.04.2014, 21:34

Eine direkte Zuweisung im CTor (std::array<int,6>aBeispiel({{1,2,3,4,5,6}}))

Unnötig sind die Klammern trotzdem:

C-/C++-Quelltext

1
std::array<int,6> arr {1,2,3,4,5,6};
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

28.04.2014, 06:46

Mit den normalen Arrays kenn ich mich problemlos aus, das ist kein Problem. Ich wusste nur nicht, dass ich so einfach ein Array als Struktur Instanz verwenden kann.
Die beiden Sätze widersprechen sind allerdings stark. ;) Zudem ist der zweite Satz Unsinn. Richtig wäre wohl gewesen: "Ich wusste nur nicht, dass man auch ein Array von Strukturen machen kann."
std::array hat den Vorteil, dass er sicher ist und die Größe immer bekannt. Der Nachteil ist, dass die Größe zur Compile-Zeit feststehen muss. std::vector ist da flexibler.
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]

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

10

28.04.2014, 10:05

Aber std::vector hält in der Regel doppelt soviel Speicher belegt, wie nötig wäre.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige