Wie wird in C gekapselt?



  • pointercrash() schrieb:

    Aber Komfort kostet Rechenzeit.

    Da hast du im allgemeinen Recht, dies trifft aber nicht auf das OOP von C++ zu, da dieses nicht mehr existiert sobald du kompiliert hast. Lass dir das mal von den Profis hier genauer erklären. Wenn du sowas produziert hast dann liegt das nicht an C++ sondern eher daran dass du anscheinend extrem schlecht programmiert hast.

    Wenn du weiter bei der Meinung bleibst das C++ wegen OOP x mal langsamer ist als C oder nur doppelt so langsam werden sie dich hier fachlich auseinander nehmen. Bitte beschäftige dich ein wenig wie OOP in C++ umgesetzt wurde und die wirst sehen das davon unterm Strich nichts übrig bleibt also auch keine große Performance kostet, tut mir leid.



  • oppcpp schrieb:

    Lass dir das mal von den Profis hier genauer erklären. Wenn du sowas produziert hast dann liegt das nicht an C++ sondern eher daran dass du anscheinend extrem schlecht programmiert hast.

    Davon gehe ich auch aus, aber mir fiel nichts Besseres ein, war aus einem C++- Lehrbuch abgepinselt.

    Aber eigentlich war mir gar nichts am c vs. cpp gelegen, klar kann man in cpp besser kapseln und wie man in C kapselt, ist ausreichend erörtert - viel mehr gibt's ja nicht.



  • pointercrash() schrieb:

    Aha, den kannte ich noch nicht. Hast Du schon Erfahrungen damit gemacht, ob die Ports wirklich ohne Federlesens auf verschiedenen Plattformen identisch funktionieren?

    Der Comeau Compiler gilt als der Compiler, der der ISO Norm am nächsten kommt bzw. diese komplett umsetzt. ISO C++ Code sollte daher auf jeder Plattform problemlos übersetzt werden. Ich selbst habe den Compiler noch nicht für Projekte genutzt, aber er gilt in der C++ Community als faktische Referenz Implementation der ISO Norm.

    pointercrash() schrieb:

    Und wie sieht der erzeugte C- Code aus, kann man den noch halbwegs debuggen?

    Es werden "#line" Directiven genutzt, darüber hinaus ist das Name Mangling komplett verschieden. Das Debugging ist ergo nicht so einfach, wie mit einem reinem C++ Compiler mit passenden Debugger.

    pointercrash() schrieb:

    Dann wär' das durchaus eine erprobenswerte Option.

    Zum Testen muß man sich den Compiler kaufen, da die online Tryout Variante effektiv nur dazu taugt zu testen, ob der Compiler einen bestimmten Code verarbeitet. Für die verbreiteten Plattformen kostet eine Lizenz US$50.

    P.S. C99 unterstützt der Compiler ebenfalls.



  • pointercrash() schrieb:

    Davon gehe ich auch aus, aber mir fiel nichts Besseres ein, war aus einem C++- Lehrbuch abgepinselt.

    Bei so etwas ist es extrem wahrscheinlich, daß der Code nicht wirklich dasselbe getan hat, sondern nur das gleiche Ergebnis produziert hat.



  • C ist doch nur was für Fickler.

    🙂



  • Hier mal ein Beispiel was man mit C in Verbindung mit der Speicherverwaltung alles falsch machen kann.

    unsigned char *get_line(int fd)
    {
        int i;
        unsigned char *line;
        line = (char*)malloc(1);
        for (i=1; line[i]!=’\n’ || line[i]!=’;’; i++)
        {
            read(fd, &line[i], 1);
            line = (char*)realloc(line, 1);
        }
    return line;
    }
    
    • Die zugehörige Dokumentation wurde nicht gelesen.
    • Der zugehörige Header <stdlib.h> wurde nicht angegeben.
    • Die daraufhin generierten Warnungen des Compilers ». . . makes a pointer from
      an int . . . « wurden durch Typ-Casting weggedrückt, weil sie nicht verstanden
      wurden und daher störten.
    • Es wurde ein falscher Typ beim Typ-Cast angegeben.
    • Die daraufhin erfolgten Warnmeldungen ». . . incompatible pointer types . . . «
      wurden ignoriert.
    • Der gezwungenermaßen vom Compiler angenommene Ausweichtyp int als
      Rückgabetyp kann ungeeignet sein und zu schweren Fehlern des Programms führen.
      Der Typ-Cast ändert nichts daran – der repariert hier überhaupt nichts.
    • Auch im Aufrufer von get_line() war keine Freigabe des Speichers durch
      free vorgesehen.
    • In keinem Fall wird die retournierte Adresse auf Fehlschlag geprüft.
    • Der Rückgabewert von read wird nicht geprüft.
    • Der Inhalt des Speicherbereiches wird auf einen bestimmten Inhalt geprüft, bevor
      dieser überhaupt mit Daten gefüllt wird.
    • Der Index beginnt mit [i=1] und adressiert ein nichtexistierendes zweites Byte
      des Speicherplatzes schon zu Beginn.
    • Die Schleife läuft ewig, weil || statt && verwendet wurde.
    • Der Aufruf von realloc ist sinnlos, da der Speicherplatz in seiner Größe von
      bereits 1 Byte nicht verändert wird.
    • Der Index adressiert fortlaufend nichtexistierenden Speicherplatz.
    • Das Byte, das read() einfüllt, wird niemals geprüft, da der Index i jeweils
      zuvor erhöht wird.
    • Ein Anfordern von nur ein Byte Speicherplatz ist grundsätzlich grober Unfug.
    • Die Verwendung dieser Funktionen zum Lesen einer Zeile ist Unfug, solange die
      Zeilenlänge nicht wesentlich größer als 30000 Byte sein kann.


  • Warum braucht ihr Kapselung um OO zu programmieren?



  • Hi

    Ficky schrieb

    C ist doch nur was für Fickler.

    Und du hast keine Ahnung ! Also labere nicht.

    lowbyte



  • lowbyte_ schrieb:

    Und du hast keine Ahnung ! Also labere nicht.

    Geh doch nicht auf das Getrolle ein 🙄



  • In C wird über da Modulkonzept gekapselt. So sind in einzelnen Übersetzungseinheiten z.B. die static Variabeln nur dort sichtbar. Das weiß man nach ein paar Tagen C lernen und ich kann nicht verstehen wie dadurch so ein riesen Thread entstehen kann?



  • Hi

    Das entsteht dadurch:

    1. Dass wie man sehen kann, die Meinungen zu Teil stark auseinander gehen. Oder man sich manchmal nicht ganz versteht.
    2. Durch Wiki Helden ...
    3. Durch solche die keine Ahnung haben, und den Thread voll labern.

    Ich bin auch nicht perfekt... Aber so einen Thread der (fast) jeden Aspekt der OOP anschneidet verglichen mit C, sollte man nicht vollmüllen mit so miderwertigen Kommentaren wie(unten von ficky). Weil es für ein Anfänger sicher nützlich und Intressant ist sowas zu lesen.

    Ficky schrieb
    Zitat:

    C ist doch nur was für Fickler.

    Nah egal ... ich hoffe der Thread wird mal so stehen gelassen. Ich denke damit ist alles gesagt.

    lowbyte



  • Interessenhalber schrieb:

    In C wird über da Modulkonzept gekapselt.

    C kennt keine Module - sondern nur Übersetzungseinheiten.



  • ~john schrieb:

    Interessenhalber schrieb:

    In C wird über da Modulkonzept gekapselt.

    C kennt keine Module - sondern nur Übersetzungseinheiten.

    *kopfklatsch ja her Staatsanwalt, trotzdem wird in der Fachliteratur auch von Modulkonzepten gesprochen, auch wenn es im Endeffekt nur die einzelen Übersetzungseinheiten sind. Es wird übrigens auch von Headerdateien gesprochen obwohl es nur Textdateien sind mit der Endung .h, nur mal so als Tipp.

    Sorry, vielleicht bist du auch noch nicht lange dabei um das zu wissen.



  • ~john schrieb:

    Interessenhalber schrieb:

    In C wird über da Modulkonzept gekapselt.

    C kennt keine Module - sondern nur Übersetzungseinheiten.

    dennoch kann man sie als Module bezeichnen und so programmieren 🙄



  • supertux schrieb:

    ~john schrieb:

    Interessenhalber schrieb:

    In C wird über da Modulkonzept gekapselt.

    C kennt keine Module - sondern nur Übersetzungseinheiten.

    dennoch kann man sie als Module bezeichnen und so programmieren 🙄

    Nagut für C schon, in C++ geht's nicht *gg*



  • und wir sind in ANSI C Forum und reden über Kapselung in C 😕



  • Interessehalber schrieb:

    *kopfklatsch ja her Staatsanwalt, trotzdem wird in der Fachliteratur auch von Modulkonzepten gesprochen,

    Zu C gibt es viele extrem schlechte Bücher. In Zusammenhang mit C von Module zu sprechen ist eine maßlose Übertreibung. Zu einem Modulkonzept gehört mehr als nur die Sichtbarkeit von Variablen und Funktionen auf eine Übersetzungseinheit beschränken zu können. Vergleiche dies mit den Modulkonzepten von Ada, Fortran o.ä.

    P.S. Sowohl K&R wie auch die ISO Norm sprechen nie von Modulen.



  • Ihr erzählt ja einen Quatsch. Auch wenn C nicht gerade ein supergeniales Modulkonzept hat so wird trotz alle dem davon gesprochen. Selbst in Wikipedia wird dies erwähnt. Wie das nun realisiert ist, ist doch wohl egal es wird jedenfalls davon gesprochen.

    Wikipedia schrieb:

    Eine Modularisierung in C erfolgt auf Dateiebene. Eine Datei bildet eine Übersetzungseinheit; intern benötigte Funktionen und Variablen können so vor anderen Dateien verborgen werden. Die Bekanntgabe der öffentlichen Funktionsschnittstellen erfolgt mit sogenannten Header-Dateien. Damit verfügt C über ein schwach ausgeprägtes Modulkonzept

    Wenn das nicht stimmt könnt ihr den Artikel mit sicherheit leicht ändern. Ich schaue dann in 2 Wochen nochmal rein. Ist der Artikel nicht geändert hattet ihr unrecht.



  • supertux schrieb:

    und wir sind in ANSI C Forum und reden über Kapselung in C 😕

    Trotzdem ist es seltsam, weil C und C++ das gleiche Modell bezüglich Übersetzungseinheit/Kompilieren/Linken etc haben.

    In C++ gibst halt ein Modulekonzept, dass dem Standardkomitee als Vorschlag eingereicht würde. Dies hat mehr Semantik als eine Übersetzungseinheiten.

    btw Wikipedia ist keine gute Referenz.



  • Schon klar das man das Modulkonzept bzw. das was in dem Zusammenhang genannt wird nicht mit denen anderer Sprachen vergleichen kann.

    Wenn ihr alle immer die Weisheit mit Löffeln gefressen habt verstehe ich nicht warum die Artikel bei Wikipedia nicht von euch geändert werden? Wenn nicht von den Profis, von wem dann? Ihr habt doch auch schon bestimmt vom Wikipedia profitiert und könntet doch auch was zurückgeben, davon lebt das Lexikon ja.


Anmelden zum Antworten