Wie wird in C gekapselt?
-
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.
-
Was ist denn an dem Zitat aus Wikipedia konkret falsch, dann werde ich die Änderung vorschlagen? Auf die Frage müsste ich ja auf jedenfall mindestens ein paar Antworten bekommen und zwar kein drumrumgerede, sondern Fakten.
-
~john schrieb:
P.S. Sowohl K&R wie auch die ISO Norm sprechen nie von Modulen.
Die ISO-Norm erwähnt das in C-Kreisen überaus exotische Wort "Compiler" auch nur ein einziges Mal und das in einer Fußnote.
@Interessehalber: Troll dich.
-
Was bist du denn fürn Arsch, wo trolle ich denn rum und vor allem gegen was oder wen?
Ich will hier die Sache klarstellen, dass man im Zusammenhang mit C sehrwohl auch nach einem Modulkonzept sprechen kann und auch gesprochen wird. Ob das nun elegant gelöst ist oder nicht tut nix zur Sache.