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

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

11

16.01.2011, 14:13

Howdi.

ich habs nicht als Angriff gesehen ;)

Also wenn du sowieso nach jeder Funktion die ein false zurück liefert eine Fehlerausgabe machst wäre es da nicht besser ein vernünftiges ExceptionSystem zu basteln oder gar gleich eine direktere Fehlerbehandlung?

Deine Variante erscheint mir etwas.. seltsam, zb würde ich dies an deinem Beispiel verdeutlichen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool CCharakter::Func_Erhöhe_Koerperkraft()
{
  if (i_AttributPunkte)
  {
    i_Koerperkraft++;
    fl_TragKraftMax = i_Koerperkraft * 2000.0f;
    i_AttributPunkte--;
    return true;
  }
  else
  {
    // Keine Punkte zum Erhöhen
    *Fehler = St_FehlerCode::FC_CHAR_KEINEATTRIBUTSPUNKTE;
    return false;
  }
}


Würde ich da eher so schreiben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void CCharakter::Func_Erhöhe_Koerperkraft()
{
  if (i_AttributPunkte == 0)
    throw NoAttributePointsException();

  i_Koerperkraft++;
  fl_TragKraftMax = i_Koerperkraft * 2000.0f;
  i_AttributPunkte--;
}


oder so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void CCharakter::Func_Erhöhe_Koerperkraft()
 {
   if (i_AttributPunkte == 0)
   {
    OnError(St_FehlerCode::FC_CHAR_KEINEATTRIBUTSPUNKTE);
    return;
  }
 
   i_Koerperkraft++;
   fl_TragKraftMax = i_Koerperkraft * 2000.0f;
   i_AttributPunkte--;
 }
 


Es ist natürlich eine grosse Portion persönlicher Geschmack dabei, aber diese Varianten hätten den Vorteil das nicht extra mit FehlerCode Pointern gearbeitet werden muss und auch Mechaniken verwendet werden die genau für die Fehlerbehandlung erzeugt wurden. Auch ist die Fehlercode Behandlung nicht wirklich ein Teil deiner Karte, bzw es sollte nicht die Aufgabe der Karte sein die Fehlerbehandlung zu übernehmen. Aus diesem grund würde ich auch eher die 2. variante bevorzugen wenn diese Fehler an den Benutzer gemeldet werden müssen.

12

16.01.2011, 14:43

Also der Klassenname Karte ist bissi Irreführend. Anfangs war sie gedacht um wirklich nur die Karte zu laden und anzuzeigen ect.
Aber derzeit hat sich die Klasse als meine Eigentliche Gameengine entwickelt sprich in dieser Klasse laufen alle Fäden zusammen Deshalb wird dort auch der Fehler Ausgewertet.

Also von Exception war ich nicht so angetan, da mir da in Erinnerung ist das sie zwar zum Fehler abfangen da sind aber das Programm beenden. Kann mich natürlich auch täuschen so tief bin ich in das Thema (Exception) nicht eingestiegen.

Ich will dem Anwender ja nur Sagen: Das z.B. Er einen Gegenstand nicht Anlegen kann weil der Platz Belegt ist oder das er Einen Wert nicht erhöhen kann weil ihm die Punkte dafür fehlen.

Ich muß das noch mal Anschau mit den Exeption.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

13

16.01.2011, 14:53

Dann baue doch für sowas Kontrollfunktionen ein:

C-/C++-Quelltext

1
2
3
4
if (!CanUseAttributePoints())
  Fehlerbehandlung();
else
  BenutzeAttributspunkt();

14

16.01.2011, 14:57

Naja irgendwie kommt mir das bekannt vor :D

C-/C++-Quelltext

1
2
3
4
5
if(!Spieler.Func_Erhöhe_Koerperkraft())
{
    CKarte::Func_Fehler_Auswerten();
}
                    


So habe ich es in meinem Programm bisher.

Aber ich danke dir für dein Vorschlag ich werde mich da nochmal einlesen und dann entscheiden wie ich es mache.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

15

17.01.2011, 10:17

Also von Exception war ich nicht so angetan, da mir da in Erinnerung ist das sie zwar zum Fehler abfangen da sind aber das Programm beenden.


Unbehandelte Ausnahmen führen zum beenden des Programms.

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

16

17.01.2011, 10:20

Vom Design her wäre es natürlich viel Sinnbehafteter wenn man dem user gar nicht erst die Möglichkeit gibt, dumme Dinge anzustellen. Sprich: Wenn der Knopf zum erhöhen der Körperkraft nicht angezeigt wird oder nicht anklickbar ist (disabled). Zusätzlich könnte ein Label anzeigen das nicht genügend Attributspunkte verfügbar sind, damit der Benutzer eine Erklärung hat, wieso denn dieser Knopf nicht benutzbar ist.

mfg Mark

17

17.01.2011, 20:33

Daran hatte ich noch gar nicht gedacht. Danke.
Muß ich mir durch den Kopf gehen lassen wie ich das umsetzen kann.

Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

18

18.01.2011, 22:14

Was mir hier in der Diskussion noch fehlt:
Wenn der Pointer Fehler auf 0 gesetzt wird, ohne das vorher das delete ausgeführt wird, hat man ein schönes Speicherleck. Also sollte man diese Stelle auf jeden Fall überarbeiten. Ein delete auf einen 0-Pointer hat keinen Effekt, der Speicher der mit new reserviert wurde wird dabei jedoch nicht gelöscht.

19

19.01.2011, 12:30

Also erst delete den pointer (Der mit new erzeugt wurde) und dann auf 0 Setzen bzw neue Adresse zuweisen oder ?

Merke ich mir mal für später :) Danke
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

20

19.01.2011, 13:27

Wenn du sowieso nicht vorhast den Pointer zu benutzen sondern ihn gleich auf 0 oder eine bekannte Adresse setzt, benötigst du da weder ein new noch ein delete.

Werbeanzeige