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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

11

06.07.2014, 15:04

Nur meinen private und protected Member Variablen gebe ich einen Underscore.

Der Funktionsaufruf einer virtuellen Member Funktion im Konstruktor ist meistens das Indiz für einen Logik Fehler.
Es ist zwar erlaubt aber tut nicht unbedingt das, was man erwarten würde.
Denn von einer virtuellen Funktion würde man wohl erwarten, dass immer die Funktionen aufgerufen wird, die zum jeweiligen Objekt gehört.
In diesem Beispiel ist das Objekt ein "Car", aber im Konstruktor "Vehicle" verhält sich das Objekt wie ein "Vehicle" und nicht wie ein "Car".
Das ist nur im Konstrutktor und Destruktor so und im C++ Standard festgelegt.
D.h. im Vehicle Konstruktor wird nicht "Car::Info" sondern "Vehicle::Info" aufgerufen, obwohl ein "Car" Objekt allokiert wurde.
Dieser Fehler ist mir einmal unterlaufen und ich habe eine ganze Weile gebraucht, bis ich ihn gefunden habe :-)

( Interessant, dass bisher noch keiner was zur Implementierung der "Car::Info" Funktion gesagt hat.
Was die Funktion macht ist zwar in C und C++ erlaubt, aber eindeutig Java und C# Style und in C++ führt es nicht zum gewünschten Ergebnis ;-) )
EDIT: Hatte zu lange zum Schreiben gebraucht, aber anscheinend ist es inzwischen doch einigen aufgefallen ^^

idontknow

unregistriert

12

06.07.2014, 15:08

Ja, das ist ein fieser Fehler. In den meisten anderen Sprachen ist das kein Problem, weshalb ihn wohl viele übersehen haben.

Ahh habs gerade ausprobiert und auch verstanden, ist wirklich fies, wenn man sowas übersieht.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

13

06.07.2014, 15:14

In C könnte man damit folgendes machen ( DON'T DO THIS AT HOME :P ):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
const char* RightSubString(const char* str, size_t len_from_right)
{
    size_t len = strlen(str);
    if (len_from_right >= len)
        return str;
    return str + (len - len_from_right);
}
/* ... */
//RightSubString("Hello, World", 5) -> liefert "World";

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »LukasBanana« (06.07.2014, 17:45)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

14

06.07.2014, 16:04

Womit du eine weitere Stolperfalle gezeigt hast.
Dein Vergleich wird nämlich keinesfalls true sein, weil dort Adressen verglichen werden.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

15

06.07.2014, 16:09

Dein Vergleich wird nämlich keinesfalls true sein, weil dort Adressen verglichen werden.

"len_from_right" und "len" sind Längen, keine Addressen.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

16

06.07.2014, 16:37

Außerdem darf mal Adressen ganz legal nach Standard vergleichen solange sie zum gleichen Speicherbereich gehören.

Wenn in C nicht alle Strings nullterminiert wären, könnte man außerdem auch beliebige Substrings, nicht unbedingt bis ganz zum Ende, ohne Kopie durchführen.
In meiner String-Klasse mache ich das zum Beispiel auch teilweise so.

idontknow

unregistriert

17

06.07.2014, 16:41

Dein Vergleich wird nämlich keinesfalls true sein, weil dort Adressen verglichen werden.

"len_from_right" und "len" sind Längen, keine Addressen.

und jetzt? Hat ja gar nichts mit dem Problem zu tun..

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

18

06.07.2014, 16:42

Es geht nicht darum ob man es darf oder nicht.
Hier werden zwei Adressen vergleichen, die niemals gleich sein werden: RightSubString("Hello, World", 5) == "World";
Oder irre ich mich?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

19

06.07.2014, 16:47

Ups, das habe ich irgendwie gar nicht wahr genommen. Sah für mich irgendwie wie eine Erklärung aus, nicht so als ob es direkt zum Code gehören würde.
Wenn so ein Vergleich wirklich irgendwo im Code stehen würde, wäre er in der Praxis schon immer "false", da hast du recht. Allerdings ist das Ergebnis des Vergleiches wahrscheinlich sogar auch noch unspezifiziert. Das heißt, er könnte vielleicht sogar "true" sein, wenn der Compiler so schlau ist und zum Beispiel die Strings faltet oder andere ominöse Dinge passieren. Die Strings gehören schließlich nicht in den selben Speicherbereich, folglich sollte man nicht vergleichen dürfen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (06.07.2014, 16:53)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

20

06.07.2014, 17:11

RightSubString("Hello, World", 5) == "World";


:dash:
Diese Zeile Code sollte eigentlich nur Pseudocode sein um zu zeigen, was "RightSubString" zurückliefert.
Derartige Vergleiche soll man natürlich nicht machen.
War vlt. etwas blöd dargestellt, ich hätte es wohl auskommentieren sollen.

Werbeanzeige

Ähnliche Themen