Du bist nicht angemeldet.

Werbeanzeige

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

31

10.06.2012, 00:22

Wenn ich Standards habe, welche Dinge vorschreiben, wieso kann ich mich nicht danach richten? Ich dachte bisher immer genau das sei der Grund für eben diese.

Das Problem ist doch gerade, dass der Standard diese Dinge eben nicht vorschreibt...

Zitat Nummer 3 hätte ich gerne mit ein wenig mehr Text gesehen. So aus dem Kontext gerissen ist es selbstverständlich Unfug. Aber ich habe hier einen Link indem Worte welche meinen vom Sinn her ähneln niedergeschrieben sind: http://www.spieleprogrammierung.net/2010…entwickeln.html

Sry, ich hab absolut keine Ahnung was genau mir das jetzt sagen soll.

Was das letzte Zitat betrifft so wollte ich damit ausdrücken, dass Programme auf anderen Rechnern nicht auf einmal Werte nicht mehr aufnehmen können da ihre Größe schlichtweg nicht mehr ausreicht [...]

In diesem Fall musst du natürlich entsprechend größere Typen verwenden. Mit short hättest du dieses Problem jedenfalls definitv eher als mit int...

[...] Ich beschäftige mich nun eine Weile mit C++ und habe viele Artikel gelesen, einer davon sagte beispielsweise aus das man mittels folgendem Rechnerunabhängige Definitionen schaffen könne:

C-/C++-Quelltext

1
typedef short int16

Selbstverständlich kann auch etwas falsches niedergeschrieben werden, aber naja, das ist dann eben so eine Sache. Sollte das bisher von mir gesammelte Wissen fehlerhaft sein ist eine Begradigung dieser Tatsache natürlich wünschenswert.

Naja, du müsstest diese Definition natürlich immer an den jeweiligen Rechner anpassen, da short eben nicht immer ein 16 Bit Integer sein muss. Aber natürlich, mit sowas kannst du "rechnerunabhängig" mit 16 Bit Integern arbeiten. Die Frage ist jetzt aber, was genau dir das im Allgemeinen bringt?

Ach ja, zu meinen Worten "gefürchtete Portabilität": Ich habe genug Threads zum Thema "Mein Programm läuft auf anderen Rechnern nicht" in diversen Foren gelesen. Meine Finger machten sich da einfach selbständig, aber so unrecht kann ich da wohl nicht haben, oder etwa doch?

Ich weiß nicht, was du mit dieser "gefürchtete Portabilität" meinst, folgedessen kann ich nichts dazu sagen.


Die Daten werden in die Datei geschrieben, aus dieser kann man dann die Laufzeitfehler wie diesen Bug auslesen, oder etwa nicht?

Der Punkt war doch gerade, dass es nun eben keinen Laufzeitfehler gibt, obwohl der Bug drin ist...

Beiträge: 1 235

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

32

10.06.2012, 00:24

Zu dem Beispiel mit den Asteroiden:
Ich würde hier auch Int nehmen.
Die Asteroiden sind wahrscheinlich in einen einem Vector abgelegt und der einfachste Zugriff darauf, ohne Casts, ist nunmal nur mit konsequenter Verwendung von int möglich.
Oder stell dir vor, du möchtest das Spiel irgendwann ausbauen oder den Code woanders wiederverwenden. Dann ärgerst du dich vielleicht, dass du im ein paar Bytes gegeizt hast und jetzt alles umschreiben musst.

Zitat

Ach ja, zu meinen Worten "gefürchtete Portabilität": Ich habe genug Threads zum Thema "Mein Programm läuft auf anderen Rechnern nicht" in diversen Foren gelesen.

Das kommt fast immer von falschen Bibliotheken und Zeiger\Int-Casts.
Hat damit nicht direkt was zu tun.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (10.06.2012, 00:29)


33

10.06.2012, 00:24

@Architekt
Beispiel Mana (unsigned int <> int):
Wenn du beispielsweise die Mana-Count decreast, koennte es sein, dass du mal unter 0 kommst, du pruefst das bei signed so:
if(mana < 0 ) { mana = 0; }

Bei unsigned waere das schon etwas umstaendlicher und weniger verstaendlich:
if(mana > INT_MAX) { mana = 0; }


// Beispiel Asteroiden
Das Problem ist, dass du jetzt noch um die 200 Asteroiden hast - Was aber, wenn es ploetzlich 1000 sein sollen? Es geht hier auch um die Dynamik und Erweiterbarkeit.
Ist dein System fest auf maximal 200 Asteroiden ausgelegt, und du hast ueberall unsigned byte verwendet, dann wird das sicher viel Spass in diversen Klassen und methoden "unsigned byte" durch "int" zu ersetzen :D

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 490

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

34

10.06.2012, 00:24

Weil selbst wenn ich mal eine endlos loop oder dergleichen habe, wie bspw. einen viel zu großen Wert zuzuweisen, bleibt es im Range von 0 - 255.

Mit anderen Worten: Dir würde der Bug niemals auffallen...

Ich hasse deine Punkte, das klingt manchmal so abwertend. :P
Bei einem overflow bekomme ich es natürlich mit und kann es beheben, nur habe ich den Vorteil, dass ich nicht gleich eine riesen Anzahl bekommen kann der mitunter meinen Rechner in die Knie zwingt. Und selbst wenn nicht: unittest und dann sollte die Sache eh auffallen. Bei einem ausgewählten Datentyp passieren nur eben keine oder weniger unangenehmen Seiteneffekt, wie unglaublich hohe Anzahl an Sprites (ich bleib einfach mal bei dem Beispiel) oder, da du auf ein signed int plädiert hattest, eine negative Anzahl und eine damit verbundene mögliche Access Violation oder ein Out of Bound Error.
Außerdem: das mitbekommen eines solchen Bugs ist doch keine Rechtfertigung nur noch int zu nehmen.

edit:

Spiele Programmierer:
dann wäre unsigned int der richtige Weg. ;)

appfyr:
Ein typedef oder alias tut es auch:
typedef/alias verwendeter_typ bye|int;
Problem gelöst.
Selbst wenn nicht: an wievielen Stellen deklarierst du schon den Typen für den Index Zugriff? Das zu ändern/anzupassen sollte absolut kein Problem darstellen.
Es ginge übrigens auch mit einem template. Darüber den verwendeten Typen angeben wie bspw. bei einem Vector. int, long, short, byte, alles kein Problem. :)

Aber in den meisten Fällen weißt man ja eh vorher schon, wieviele es werden sollen. Wenn man weiß, dass man es noch ausbaut, gut, ubyte tut es vllt nicht, aber ushort ganz sicher.
Aber das ganze Thema artet meiner Meinung nach ziemlich aus. Ich bleib dabei und bin dafür sich ein wenig damit zu beschäftigen _was_ man da eig. tut und was man wirklich braucht. Wenn ich nur 65k Asteroiden brauche brauche ich kein int. Das ist meine Meinung. Wenn ihr aber lieber auf Nummer sicher geht oder direkt int nehmt weil ihr schon "selbst aufpasst" das es nicht negativ wird (Java lässt grüßen) dann soll es mir doch recht sein. :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Architekt« (10.06.2012, 00:34)


35

10.06.2012, 00:30

Wenn du das mit typedefs brav und ordentlich umarbeitest ist es fein. Bei Java waere das z.b. nicht moeglich. :)
(Jetzt kommt bestimmt gleich wieder, dass bei Java eh schon alles verloren waere :thumbsup: )

Beiträge: 1 235

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

36

10.06.2012, 00:35

Also wäre mir nicht mal so sicher ob das in Java nicht geht.
In C# gehts. :)
using NeuerType = int;

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

37

10.06.2012, 00:36

Ich hasse deine Punkte, das klingt manchmal so abwertend. :P

Sry, ist nicht abwertend gemeint ;)

Bei einem overflow bekomme ich es natürlich mit und kann es beheben [...]

Wie genau stellst du diesen Overflow fest?

Und selbst wenn nicht: unittest und dann sollte die Sache eh auffallen.

Tut es dann aber mit int genauso.

Bei einem ausgewählten Datentyp passieren nur eben keine oder weniger unangenehmen Seiteneffekt, wie unglaublich hohe Anzahl an Sprites (ich bleib einfach mal bei dem Beispiel) oder, da du auf ein signed int plädiert hattest, eine negative Anzahl und eine damit verbundene mögliche Access Violation oder ein Out of Bound Error.

Ist das so?

C-/C++-Quelltext

1
2
  unsigned char bla = 3;
  int* blub = new int[bla - 7];

Wie groß wird das Array?

38

10.06.2012, 00:37

@Spieleprogrammier
In c# gibts viele dinge, die's in Java nicht gibt - und type aliases ist eines davon.
(Vielleicht koennte man sich durch ableitung was zusammenbasteln, implizit existiert das feature aber nicht.)

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 490

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

39

10.06.2012, 00:41

Das ist jetzt nicht vergleichbar mit meinem Beispiel. Aber ich sagte ja auch weniger und nicht gar keine Seiteneffekte.
Das könnte dir genauso mit einem jedem möglichen Datentyp passieren, klar. Aber wir hatten ja auch vom zuweisen gesprochen.

Wie ich das feststelle? Nun entweder durch Aufpassen/Glück, denn der Fehler wird sich nicht so bemerkbar machen wie bei einem int, wo es passieren kann, das mir das ganze Spiel abschmiert und ich nicht weiß wieso (bspw. wegen out of memory error) oder eben durch die angesprochenen unittest. Bei meinem Programmen sind in jedem Modul unter jeder Klasse/Methode direkt welche dabei, da passiert sowas also eher nicht (ist aber auch D).
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

40

10.06.2012, 00:44

Also mir ist lieber, wenn das ganze Spiel sofort beim entsprechenden new mit einem std::bad_alloc abschmiert und ich den Bug fixen kann, als dass ich meine Bugs nur durch Aufpassen, Glück und Unit Tests finden kann, weil sie sich nicht bemerkbar machen... ;)

Werbeanzeige