Forum: PC-Programmierung C - Große Anzahl an Variablen/Strukturnen verwalten


von Sipps R. (sipps276)


Lesenswert?

Hey Leute,

Ich bin dabei C zu lernen und habe eine Frage.
Wie kann man ambesten große Mengen an Variablen, welche nur in 
bestimmten situationen benötigt werden verwalten?

Hintergrund: Ich würde gerne ein Textrollenspiel programieren (Ich weis, 
dass das schwer ist und blie bla blub, ich hoffe trozdem das ich eine 
gute Antwort bekomme). Es geht darum Werte von Gegner und Items vorab zu 
bestimmen und diese dan in einer Funktion oder einer Stelle im Program 
benutzt wird.

Ich würde das gerne so Lösen, dass das möglichst wenig Arbeitsspeicher 
benötigt.

Vorab schon mal Danke :)

von Karl H. (kbuchegg)


Lesenswert?

Sipps R. schrieb:

> Hintergrund: Ich würde gerne ein Textrollenspiel programieren (Ich weis,
> dass das schwer ist und blie bla blub, ich hoffe trozdem das ich eine
> gute Antwort bekomme). Es geht darum Werte von Gegner und Items vorab zu
> bestimmen und diese dan in einer Funktion oder einer Stelle im Program
> benutzt wird.

Sieh in deinem C-Buch im Kapitel nach, in denen es um STrukturen 
(struct) geht.

Das ist das Mittel der Wahl um logisch zusammengehörende Dinge zu 
strukturieren.
Und wenn du dann dabei bist, dann lies in deinem C Buch die 2-te Hälfte 
in der es um dynamische Speicherverwaltung geht. Wenn du schon am lesen 
bist, und dein C Buch da ein wenig dürftig aufgestellt ist, dann kauf 
dir auch noch ein Buch, das sich speziell den Thema 'Datenstrukturen' 
widmet. Da gibt es eine Unmenge zu lernen. Nicht umsonst ist dieses 
Thema Stoff für 2 Semester Vorlesungen (samt Übungen) an der Uni.

Willkommen in der Programmierung. Jetzt gehts erst richtig los. Alles 
davor war nur Pipifax.

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Du musst die Daten halt erst dann von der Festplatte laden, wenn sie 
benötigt werden, und danach wieder den RAM freigeben. Zum Beispiel lädst 
du immer nur den aktuellen Raum mit seinen Items, Gegnern usw. Die 
speicherst du im RAM dann in einer entsprechenden Datenstruktur, bei 
Spielen gerne BSP-Trees o.ä. Mithilfe von malloc/free fragst du RAM an 
und gibst ihn wieder frei.

Pro Tip: Für so komplexe Dinge wie ein Spiel mit Speicherverwaltung und 
so lohnt es sich eine Programmiersprache zu lernen, die mehr 
Abstraktions - und Strukturierungsmöglichkeiten bietet als C, wie z.B. 
Java, ruby, Python (anfängergeeignet) oder C++ (kompliziert aber 
mächtig).

von Sipps R. (sipps276)


Lesenswert?

das mit struktur wusste ich schon.

Aber wenn ich sag ich mal 6 Variablen pro Gegenr nutze sind das bei 10 
verschiedenden gegner 60 variablen. Und so wie ich das berstanden habe 
müsste ich die dann ja alle dauerhaft laden, solange die Gegner zufällig 
kommen sollen oder habe ich das falsch verstanden? bzw. einen 
Denkfehler?

aber schon mal danke für die schnelle Antwort :)

von Peter II (Gast)


Lesenswert?

Sipps R. schrieb:
> Aber wenn ich sag ich mal 6 Variablen pro Gegenr nutze sind das bei 10
> verschiedenden gegner 60 variablen

nein. Das ist "EIN" Array mit 10 Elementen vom type struct.

von Dr. Sommer (Gast)


Lesenswert?

Sipps R. schrieb:
> Aber wenn ich sag ich mal 6 Variablen pro Gegenr nutze sind das bei 10
> verschiedenden gegner 60 variablen.
Wenn eine Variable also 4 Byte hat, und einen Rechner mit 4 GB RAM, 
kannst du nur 170000000 Gegner speichern. Vielleicht reicht das für dein 
Spiel ja? Dann könntest du einfach alle Gegner permanent im Speicher 
lassen, ohne mit kompliziertem Nachladen anzufangen...

von Peter II (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Wenn eine Variable also 4 Byte hat, und einen Rechner mit 4 GB RAM,
> kannst du nur 170000000 Gegner speichern.

sogar noch viel mehr, SWAP ist auf den meisten Systemen verfügbar. Damit 
werden gleich Gegner die nicht gebraucht werden ausgelagert.

von Karl H. (kbuchegg)


Lesenswert?

Sipps R. schrieb:
> das mit struktur wusste ich schon.
>
> Aber wenn ich sag ich mal 6 Variablen pro Gegenr nutze sind das bei 10
> verschiedenden gegner 60 variablen. Und so wie ich das berstanden habe
> müsste ich die dann ja alle dauerhaft laden, solange die Gegner zufällig
> kommen sollen oder habe ich das falsch verstanden? bzw. einen
> Denkfehler?

Nein. passt schon.

Von nichts kommt nichts. Speicher ist doch heutzutage wirklich kein 
Problem mehr.

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:
> Sipps R. schrieb:
>> Aber wenn ich sag ich mal 6 Variablen pro Gegenr nutze sind das bei 10
>> verschiedenden gegner 60 variablen
>
> nein. Das ist "EIN" Array mit 10 Elementen vom type struct.

Genau.

Wobei das Array nicht unbedingt in Stein gemeisselt ist.
Das könnte auch eine lineare Liste sein, damit man die Anzahl der zb 
Spieler nicht schon während der Programmierung festlegen muss.

Selbiges mit den Items oder Räumen.
Die wird man zb nicht im Programm festlegen (auch wenn man das könnte), 
sondern beim Programmstart aus einer Datei nachladen. Es kann auch einen 
bunten Mix geben mit Dingen, die zb bei Programmstart zufällig erzeugt 
und in den Räumen verteilt werden. Man könnte auch die Räume eines 
Stockwerks und deren Verbindungen bei Betreten des Stockwerks nach einem 
Algorithmus generieren. Zudem wird es eine Datei geben, in der der 
aktuelle Spielstand abgespeichert wird.

Alles in allem: Bei so einer Aufgabe wird man letzten Endes alle 
Register ziehen (müssen) um zum Ziel zu kommen.

: Bearbeitet durch User
von Sipps R. (sipps276)


Lesenswert?

ok danke an alle :) und vorallem für die schnelle Antworten :)

Ich denke meine Frage ist damit ausreichend beantwortet.

von Mark B. (markbrandis)


Lesenswert?

Sipps R. schrieb:
> Ich würde das gerne so Lösen, dass das möglichst wenig Arbeitsspeicher
> benötigt.

Warum? Ist der Hauptspeicher auf dem System, auf dem Du entwickelst, 
denn so knapp?

Bitte nicht falsch verstehen: Ich sage nicht, dass man Speicherplatz 
verschwenden soll wie Sau. ;-)

Ich bezweifle aber, dass das Dein größtes Problem ist.

von Karl H. (kbuchegg)


Lesenswert?

Mark B. schrieb:

> Ich bezweifle aber, dass das Dein größtes Problem ist.

:-)

Es sagt sich halt so einfach "Ich will mir das und das selber 
programmieren". Dann kapriziert man sich auf unwesentliche Details bis 
man drauf kommt, was da eigentlich alles wirklich dahinter steckt und 
das was einem Kopfzerbrechen machte, eigentlich noch das Simpelste an 
der ganzen Sache ist.

Aber - das ist der Lernprozess.
Sieh es ihm nach. Da mussten wir alle irgendwann einmal durch.

Zum jetzigen Zeitpunkt ist das wichtigste erst mal Konzepte zu haben und 
sich Datenstrukturen zurecht zu legen. Mit 'ein paar Variablen' ist es 
da nicht getan.

: Bearbeitet durch User
von Mark B. (markbrandis)


Lesenswert?

Karl H. schrieb:
> Aber - das ist der Lernprozess.
> Sieh es ihm nach. Da mussten wir alle irgendwann einmal durch.

Stimmt, da hast Du natürlich Recht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.