Globale Variablen mit Pointern ersetzen C

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Luger
Beiträge: 3
Registriert: Mo Mär 08, 2021 3:10 pm

Globale Variablen mit Pointern ersetzen C

Beitrag von Luger » Mo Mär 08, 2021 3:17 pm

Moin moin,

Ich arbeite erst seit kurzen mit C (oder überhaupt einer Programmiersprache), da ich in einem Modul in der Uni Informatik habe. Da arbeite ich gerade an einer Abgabe und habe aus etlichen Texten rauslesen können, dass globale Variablen nicht gerade "the way to go" sind. Ich bin mit der "einfachen" Nutzung von Pointern vertraut, doch weiß nicht genau wie ich die bisher erstellten globalen Variablen damit "ersetzten" könnte. So wie der Code gerade ist funktioniert er, was schonmal schön ist! Dabei handelt es sich allerdings auch um eine Rohfassung des Demomodus ---> ein paar Funktionen sind noch nicht erstellt, da ich die Funktionsweise erst einmal gesettet haben wollte.

Es geht letztendlich darum, das ich Werte habe, die jeweils in Funktionen Verwendung finden, wie zum Beispiel einerseits für das wechseln in switch-Funktionen, als auch zum mitzählen von werten in Funktionen. Die Werte werden also Funktionsübertragend verändert. Beispiele für die Nutzung von Pointern die ich im Netz finde konnte ich bisher nicht in meinen Code (aufgrund von persönlicher Unfähigkeit) implementieren.

Kurz zum Code: Es soll eine Art Blackjack oder 17 über 4 geschrieben werden.

Ein Spieler vs COM Modus habe ich schon im petto, möchte aber wie angemerkt erstmal die Funktionsweise haben.
Um die Variablen zu erklären:

erster_zug: zum wechseln wer als erstes entscheiden muss ob eine Karte gezogen
werden soll

COM1_win_dez: Anzahl der Siege
COM2_win_dez: ""

COM1_los_dez: Anzahl Verloren (um eventuelle fehler zu dokumentieren)
COM2_los_dez: ""

stand: Wen ein Spieler einmal keine Karte mehr ziehen möchte, ist er für das
restliche Spiel durch

sw_end: Wenn jemand gewonnen hat, die Aktionen stoppen und neues spiel mit
neuen Anfangskarten starten

sw_nr: zwischen COM1 und COM2 in Aktion zu wechseln

deck_count: einerseits zähler für das blatt array um die nächste karte zu ziehen
andereits prüfvariable wann ein neues deck angemischt werden soll

werte_add[]: Um die Kartenwerte zu speichern und evaluieren
-werte_add[0] kartenwert von COM1
-werte_add[1] kartenwert von COM2

wie man im Code sehen kann, wird oft ein Wert um einen hochgerechnet bzw wechselt zwischen 1-2 oder 1-4.
Die Anmeldung ist schon verschriftlicht, jedoch haben die Variablen BIS AUF *wdh* noch keinen Einfluss auf das Spiel, können also beliebig gewählt werden.

Code: https://pastebin.com/XnY23ctv

Falls der Link nicht gewünscht ist kann ich den auch noch hier reinschreiben.

Vielen Dank im Voraus!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Globale Variablen mit Pointern ersetzen C

Beitrag von Xin » Mo Mär 08, 2021 4:01 pm

Moin ersema. :-)
Luger hat geschrieben:
Mo Mär 08, 2021 3:17 pm
Ich arbeite erst seit kurzen mit C (oder überhaupt einer Programmiersprache), da ich in einem Modul in der Uni Informatik habe. Da arbeite ich gerade an einer Abgabe und habe aus etlichen Texten rauslesen können, dass globale Variablen nicht gerade "the way to go" sind.
Zumindest sollten sie in größeren oder parallel laufenden Programmen eher vermieden werden. Insbesondere, wenn es wächst und damit größer wird oder dann Dinge parallel ausführen möchte.

Für ein Programm, was genau eine einfache Aufgabe hat, spricht eigentlich gar nicht soviel gegen globale Variablen.
Luger hat geschrieben:
Mo Mär 08, 2021 3:17 pm
Ich bin mit der "einfachen" Nutzung von Pointern vertraut, doch weiß nicht genau wie ich die bisher erstellten globalen Variablen damit "ersetzten" könnte.
Nunja, Du könntest alle globalen Variablen in eine Struktur setzen und diese als Programm-Konfiguration an die Funktionen übergeben, die sonst auf globale Variablen zugreifen würden.

Inhaltlich ändert sich damit nicht viel. Man könnte so den Programmstatus kapseln und mehrere Programme gleichzeitig laufen lassen. Was vermutlich weniger die Aufgabe Deines Programms darstellt, nehme ich an?
Luger hat geschrieben:
Mo Mär 08, 2021 3:17 pm
Vielen Dank im Voraus!
Gerne... aber Dein Text enthielt keine einzige Frage... hast Du eine Frage? :-D
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Luger
Beiträge: 3
Registriert: Mo Mär 08, 2021 3:10 pm

Re: Globale Variablen mit Pointern ersetzen C

Beitrag von Luger » Mo Mär 08, 2021 4:29 pm

Moin,

danke schonmal für den schnellen Beitrag ^^, die Frage generell wäre, wie könnte ich Pointer mehrfachfunktionsübergreifend erstellen, die die Übersicht vereinfachen bzw. eventuelle Problematik vorbeugen können? Und dazu, ob es überhaupt in meinem Fall sinnvoll für die Lesbarkeit/Ausführung wäre.

Ich habe mir gerade selber eine Skizze aufgezeichnet um nachzuvollziehen, wohin ich welche Information übergeben muss. Hat sich rausgestellt, dass das ein ziemliches Wirrwarr ist, wo ich auf jeden Fall schnell die Übersicht verlieren würde. Die Art und Weise wie es jetzt gerade ist, finde ich auch eigentlich nicht schlecht (gut bin ziemlich proud, dass ich überhaupt das so hinbekommen habe). Also werde ich erstmal wie du angemerkt hast eine Struktur aufmachen. Das würde ca. so aussehen wie die 'karte' Struktur richtig?

Mehrere Programme sollen nicht gleichzeitig laufen. Nur der eine Code, soll alles für das "Spiel" enthalten.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Globale Variablen mit Pointern ersetzen C

Beitrag von Xin » Mo Mär 08, 2021 4:56 pm

Luger hat geschrieben:
Mo Mär 08, 2021 4:29 pm
danke schonmal für den schnellen Beitrag ^^, die Frage generell wäre, wie könnte ich Pointer mehrfachfunktionsübergreifend erstellen, die die Übersicht vereinfachen bzw. eventuelle Problematik vorbeugen können? Und dazu, ob es überhaupt in meinem Fall sinnvoll für die Lesbarkeit/Ausführung wäre.
Du übergibst den Pointer in jedem Funktionsaufruf. Das ist Mehraufwand zu statischen Variablen. Aber es definiert eben auch den Datenfluss.

Man könnte die Strukturen jetzt weiter Schachteln, um Funktionen Zugriff auf weniger der Variablen zu geben - entsprechend sollten diese Funktionen kein Unheil an anderen Variablen anrichten. Das ist der große Nachteil von globalen Variablen: Es darf jeder alles ändern und man weiß nie, wer das nun getan hat.
Das wäre aber eher ein späterer Schritt.
Luger hat geschrieben:
Mo Mär 08, 2021 4:29 pm
Ich habe mir gerade selber eine Skizze aufgezeichnet um nachzuvollziehen, wohin ich welche Information übergeben muss. Hat sich rausgestellt, dass das ein ziemliches Wirrwarr ist, wo ich auf jeden Fall schnell die Übersicht verlieren würde. Die Art und Weise wie es jetzt gerade ist, finde ich auch eigentlich nicht schlecht (gut bin ziemlich proud, dass ich überhaupt das so hinbekommen habe). Also werde ich erstmal wie du angemerkt hast eine Struktur aufmachen. Das würde ca. so aussehen wie die 'karte' Struktur richtig?
Ja.
Luger hat geschrieben:
Mo Mär 08, 2021 4:29 pm
Mehrere Programme sollen nicht gleichzeitig laufen. Nur der eine Code, soll alles für das "Spiel" enthalten.
Wenn die Daten nicht global sind, könnten Dein Programm mehrere Spiele gleichzeitig verwalten, weil der Spielstand ja eben nicht global - und damit einmalig - verwaltet wird.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Luger
Beiträge: 3
Registriert: Mo Mär 08, 2021 3:10 pm

Re: Globale Variablen mit Pointern ersetzen C

Beitrag von Luger » Mo Mär 08, 2021 7:41 pm

Sooooo, ein Haufen Frustration und einem glühenden Kopf später hab ich's dann auch soweit hinbekommen.
So sieht das ganze dann letztendlich aus:

https://pastebin.com/qyt2YGVs

Die Struktur musste ich jeweils mit Pointer an die Funktion übergeben, und dann zwischen Pointer und Adresse wechseln um die permanente Aktualisierung zu bewirken(??????? - keine Ahnung wie ich das ausdrücken soll :D). Ein relativ stupides Unterfangen, wenn man den Dreh endlich raus hat.
Jetzt werden mir auch die Werte vernünftig im Debugger angezeigt, sodass ich besser nachvollziehen kann ob überhaupt das richtige übertragen wurden.
Vielen lieben Dank für die Inspiration @Xin
Falls dir noch etwas weiteres auffällt, würde ich mich freuen darüber zu hören.

Ach und das weitere Schachteln von Strukturen habe ich jetzt erst einmal gelassen. Das ist meinem Kopf für den Anfang doch ein bisschen zu viel ;D.

Antworten