C: Emulation von Klassen

Es gibt 29 Antworten in diesem Thema, welches 3.331 mal aufgerufen wurde. Der letzte Beitrag (18. Dezember 2023 um 15:19) ist von Unseen.

  • Ich habe mir den Text nur auszugsweise angeschaut, da schlummern bestimmt noch ein Haufen weiterer Probleme.

    Absolut. Das sind meine Notizen, die meinen aktuellen Kenntnisstand widergeben - der sicher nicht perfekt ist. Das ist ein sich ständig wandelnder Text (meinetwegen z.B. so wie Wikipedia), an dem ich primär für mich selbst schreibe. Wenn ich was dazulerne, pflege ich es jeweils in den Text ein, und dann wird er dadurch vielleicht besser.

    In den nächsten Tagen gehe ich also Deine detaillierten Einwände durch, überprüfe, ob an ihnen was dran ist, und wenn es mir plausibel erscheint, ändere ich den Text.

    Mal sehen, inwieweit ich Lust dazu hab'. Vielleicht geh' ich auch angeln.

  • Ich glaube, die Diskussion hatten wir schon öfter. ;)

    Daran kann ich mich nicht erinnern

    und mir dann erklären, wie du das alles in jeder Sprache realisieren willst

    Wenn Du Dir den von Dir verlinkten Artikel durchliest, wirst Du feststellen, dass generell nicht alle OOP-tauglichen Sprachen auch wirkliche alle OOP-Features unterstuetzen ;)

    Man kann die Begriffe natürlich für sich selbst beliebig umdefinieren. Aber dann wird das eben schwierig in der Diskussion mit anderen.

    Man kann auch alles schwarz-weiss sehen und sich an Definitionen festklammern, aber auch das macht eine Diskussion mit anderen nicht unbedingt leichter ;)

    - neue Spiele für den C64 -
    Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen.

  • Hier gibt es uebrigens eine fertige Lib, die die OOP-Features in eine Nicht-OOP-Sprache wie C hineinbringt:

    Bitte melde dich an, um diesen Link zu sehen.

    - neue Spiele für den C64 -
    Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen.

  • Objektorientierte Programmierung ist in der Informatik ganz eindeutig definiert.

    Neben strikt objektorientierten Sprachen gibt es auch objektbasierte, die ohne Vererbung und Polymorphie auskommen (müssen).

    Hier kannst du dir nochmal die Prinzipien durchlesen und mir dann erklären, wie du das alles in jeder Sprache realisieren willst,

    Bitte melde dich an, um diesen Link zu sehen.

    In C zum Beispiel so:

    Bitte melde dich an, um dieses Medienelement zu sehen.

  • Wenn Du Dir den von Dir verlinkten Artikel durchliest, wirst Du feststellen, dass generell nicht alle OOP-tauglichen Sprachen auch wirkliche alle OOP-Features unterstuetzen ;)

    Steht da auch, dass Sprachen OOP-tauglich sind, die kein einziges OOP-Feature unterstützen?

    Natürlich sind nicht immer alle Features implementiert, aber die wesentlich sind vorhanden, wenn sich eine Sprache Objektorientiert nennt. Ich finde es immer wieder spannend, wie du Quellen auslegst und ins Gegenteil verkehrst. ;)

    Doch doch. Wir hatten genau diese Diskussion schon und andere. Und durch geschickte Argumentation wirst du wie immer recht behalten, irgendwie. Und ich habe diesmal meine Ruhe und verabschiede mich frühzeitig aus der Diskussion.

  • aber die wesentlich sind vorhanden, wenn sich eine Sprache Objektorientiert nennt

    Ich habe nirgendwo von "objektorientierten Sprachen" gesprochen, sondern genau vom Gegenteil - es geht hier um NICHT-objektorientierte Sprachen, und wie man in diesen dennoch objektorientiert programmieren KANN. Das ist das ganze Thema des Threads.

    Ich finde es immer wieder spannend, wie du Quellen auslegst und ins Gegenteil verkehrst. ;)

    Krasse Worte von jemandem, der den Sinn des Threads offenbar nicht mal verstanden hat. Aber danke, Deine Art zu diskutieren koennte man auch mitunter als "spannend" bezeichnen :rolleyes:

    - neue Spiele für den C64 -
    Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen.

  • Beitrag von Mac Bacon (17. Dezember 2023 um 23:57)

    Dieser Beitrag wurde von syshack aus folgendem Grund gelöscht: Ist zwar witzig gemeint, bringt aber nichts Sinnvolles in diese Diskussion. (18. Dezember 2023 um 09:25).
  • Beitrag von ZeHa (17. Dezember 2023 um 23:59)

    Dieser Beitrag wurde von syshack aus folgendem Grund gelöscht: Ist zwar witzig gemeint, bringt aber nichts Sinnvolles in diese Diskussion. (18. Dezember 2023 um 09:25).
  • Nur virtuelle Methoden usw erfordern dann noch etwas mehr Arbeit, da weiss ich aber aus dem Stegreif auch nicht, wie man das nachbilden wuerde.

    zB indem man in die struct für die Basisklasse für jede virtuelle Methode einen Funktionspointer reinschreibt, der auf die zur Instanz passende Implementierung zeigt. Eine virtuelle Methode würde dann nur aus einem Aufruf der richtigen Funktion anhand des Pointers in der struct bestehen.

    (und die offensichtliche Optimierung, in jeder Instanz nur einen einzigen Pointer vorzuhalten, der auf eine komplette Datenstruktur mit allen für diese Klasse relevanten virtuellen Methoden zeigt nennt sich zB in C++ virtual method table bzw. vtable)

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • strik: Ok, bin Deine Hinweise durchgegangen:

    1. Kein "void" in "int main(void) {}": Na gut, habe "void" jeweils eingefügt. gcc meckert aber auch nicht, wenn es fehlt.

    2. Whitespace Zeichen: Ja gut, die werden dann halt "in der Regel" ignoriert, nicht "immer". An der Stelle auf alle Ausnahmen einzugehen, würde den Leser nur verwirren.

    3. "int" ist immer "signed int", "char": Danke für die Hinweise, das sind die Informationen, die ich brauche, um mit C weiterzukommen.

    4. Präprozessor-Anweisungen: Tja, da kenne ich mich halt noch nicht so aus, weil ich Programme, die so groß sind, daß sie sie brauchen, noch nicht geschrieben hab'.

    Ich kann noch nichtmal Deine Kritik überprüfen, daher lasse ich an der Stelle den Text erstmal so wie er ist.

    5. "Bitte melde dich an, um diesen Link zu sehen." mit Anführungszeichen sucht auch in den Standardpfaden: Ah, wußte ich nicht. Wieder was gelernt.

    6. "const" verhält sich komisch: Mag sein.

    7. Dafür, daß man manchmal Variablen erst initialisieren, und später deklarieren muß, ist der Sprachstandard verantwortlich (kein C99), nicht der Compiler: Ok.

    8. for-Beispiele ungünstig: Sehe ich nicht so. An "for 0 bis 9" will ich den Leser erst heranführen, und hole ihn erstmal bei seinem natürlichen Empfinden "for 1 bis 10" ab.

    Mein Beispiel zeigt klar, was "continue" und "break" machen.

    Die Frage ist, was wolltest Du mit so einem Posting bewirken? Das Niveau meines Textes auf das eines amtlichen Lehrbuchs anheben?

    Mir helfen, C besser zu verstehen?

    Oder nur mal damit angeben, daß Du alles besser weißt?

    Dann schreib' doch selbst ein Lehrbuch!

    Wie gesagt hab' ich mehrere gelesen, aber C verhält sich mir gegenüber immer noch wie 'ne Bitch. :)

    Man bräuchte ein Buch, in dem das wirklich erklärt wird. Das war ja auch der Zweck meiner Seite, aber es ist richtig, daß ich mich selbst nicht gut genug damit auskenne, um das wirklich auf Lehrbuchniveau aufzuschreiben. Das müßte halt ein studierter Informatiker machen, der selbst schon viele große C-Projekte umgesetzt hat.

    Aber vielleicht ist es ja mit C so , wie Laotse schon 500 v.Chr. gesagt hatte:

    Zitat von Laotse

    Der, der redet, weiß nicht. Der, der weiß, redet nicht.

  • 1. Kein "void" in "int main(void) {}": Na gut, habe "void" jeweils eingefügt. gcc meckert aber auch nicht, wenn es fehlt.

    Du willst gcc immer mindestens mit "-Wall -Wstrict-prototypes" aufrufen.

    EDIT:

    Zitat

    Dieser Beitrag wurde von Bitte melde dich an, um diesen Link zu sehen. aus folgendem Grund gelöscht: Ist zwar witzig gemeint, bringt aber nichts Sinnvolles in diese Diskussion.

    Wenn "bringt nichts Sinnvolles in die Diskussion" ein Löschgrund ist, würde ich es sehr begrüßen, wenn diese Regel auf alle Forumsbeiträge angewendet wird.

    Yes, I'm the guy responsible for the Bitte melde dich an, um diesen Link zu sehen. cross assembler. And some Bitte melde dich an, um diesen Link zu sehen..

  • Wie gesagt hab' ich mehrere gelesen, aber C verhält sich mir gegenüber immer noch wie 'ne Bitch.

    Welche denn?

    Dafür, daß man manchmal Variablen erst initialisieren, und später deklarieren muß, ist der Sprachstandard verantwortlich (kein C99), nicht der Compiler: Ok.

    Deklaration ist sowas wie "int foo;", Initialisierung zB "foo = 0;". Ein Deklarator darf eine Initialisierung enthalten ("int foo = 0;"). In C vor C99 müssen Variablen vor dem ersten Statement in einem Block (zB einer Funktion) deklariert werden, ob mit oder ohne Initialisierung ist dabei egal (siehe zB ANSI C89 3.5 und 3.6.2).

    Die Frage ist, was wolltest Du mit so einem Posting bewirken? Das Niveau meines Textes auf das eines amtlichen Lehrbuchs anheben?

    Ich rate mal: Die Verbreitung von Fehlinformationen reduzieren. C ist eine historisch gewachsene, komplizierte Sprache mit vielen subtilen Details, die sich auch noch je nach Untervariante unterscheiden und die diversen Compiler setzen da mit ihren Zusatzfeatures nochmal einiges an Komplexität drauf. Man findet daher gerne mal Seiten oder Bücher für "C-Anfänger", die Dinge behaupten oder empfehlen, die im besten Fall falsch aber harmlos sind und im schlimmsten Fall falsch und je nach Compiler und Laufzeitumgebung zu falschen Ergebnissen führen. "void main()" ist zB so ein Fall, auf bestimmten Betriebssystemen kann das zu einem Crash am Programmende führen weil die System-Libraries von einem standardkonformen "int main()" ausgehen.

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.