Diskussion aus FAQ getrennt



  • Sebastian848 schrieb:

    Zum Thema Strings. Ich finde es etwas schlecht das Ihr sagt man solle nicht C mit Cpp mischen. Für Anfänger ist es oftmals leichter zu verstehen wenn man mit C-Strings und Char* arrays anfängt. man soll die sache ja verstehen wie es funktioniert und nicht schlicht und einfach mit Std::String arbeiten. Jeder möchte das verstehen was da passiert und da ist C-String sehr wohl in ordnung.

    Hm, komisch. Ich habe noch kein Java-Lehrbuch gesehen in dem damit angefangen wird, Zeichen-Arrays statt String-Klassen zu benutzen. 🙄

    Nein, diese Behauptung, zuerst zu lernen wie Strings (char-Arrays) intern funktionieren kommt ausschließlich von Leuten, die C vor C++ kannten.



  • Sebastian848 schrieb:

    Oder weiß jemand von euch wie der Windows Explorer programmiert wurde?

    ja, stichwort 'win2k source code leak'. der code sieht wirklich frickelig aus.

    Sebastian848 schrieb:

    Ihr solltet euch dessen vielleicht wieder bewusst werden, das man C nicht verdammen kann, es war nämlich schon viel früher da.

    die grundlagen von C sind tatsächlich bestandteil von C++. wer hätte das gedacht 😉



  • Ist das hier eine FAQ oder ein Diskussions-Thread? 😕 Der Beitrag von Sebastian848 ist völlig fehl am Platz! 👎



  • Artchi schrieb:

    Der Beitrag von Sebastian848 ist völlig fehl am Platz!

    deiner noch mehr 👎



  • LaFee schrieb:

    Artchi schrieb:

    Der Beitrag von Sebastian848 ist völlig fehl am Platz!

    deiner noch mehr 👎

    Jetzt nicht mehr - *mod-power nutzt, um die Off-Topic-Beiträge auszulagern*

    @Sebastian:
    Wer C lernt, muß sich mit so elemantaren Angelegenheiten wie nullterninierte Char-Arrays oder eigener Speicherverwaltung herumschlagen. Das als Einstiegspunkt in C++ zu nehmen ist völlig sinnlos - wichtig ist zunächst, die Sprache praktisch verwenden zu können, und das geht mit std::string und Co. um einiges leichter.
    (wer sich etwas besser auskennt, kann sich ja gerne mit den Interna beschäftigen - und mit den "Altlasten", die C++ von C geerbt hat)

    PS: Von welchem der vielen Tutorials redest du eigentlich?



  • Sebastian848 schrieb:

    ...Für Anfänger ist es oftmals leichter zu verstehen wenn man mit C-Strings und Char* arrays anfängt. ...

    Klar !
    Wenn jemand einen Text an den anderen hängen möchte, ist es viel einfacher, ihm zu sagen:
    - rufe eine Funktion auf, die Dir die Länge der Texte (mittels Schleife über alle Zeichen) ausrechnet
    - alloziere ausreichend Speicher
    - kopiere alle Zeichen des ersten Textes mit einer Funktion in den neuen Buffer,
    - dann nochmal alle Zeichen des 2. dahinter (also "Offset" merken)
    - lösche den Speicher, den der erste Text belegt hat
    - "Biege" den Zeiger Deines ersten Textes so um, dass er auf den neuen zeigt
    - ... und denke daran dass Du möglichst nirgends noch einen Zeiger im Programm hast, der auf die alte Speicherstelle verweist.
    Nicht zu vergessen: Wenn Du einen Fehler hast: Arbeite Dich mit einem Debugger zeichenweise durch 3 Arbeitsspeicherbereiche, beachte Speicheradresse, Bufferlängen und 0-Terminierungen..

    Dagegen ist "text1 += text2;" wirklich kryptisch ! 🙄
    [/Ironie]
    Niemand hier verbietet Anfängern mit C-Strings zu arbeiten, wenn sie lernen wollen, wie sie funktionieren - aber welchen Anfänger interessiert das wirklich ?
    Üblicherweise wollen die erstmal lernen, mit Funktionsaufrufen, Kontrollstrukturen, Variablen, .... umzugehen. Deine Aussage

    Sebastian848 schrieb:

    ......man soll die sache ja verstehen wie es funktioniert und nicht schlicht und einfach mit Std::String arbeiten. Jeder möchte das verstehen was da passiert und da ist C-String sehr wohl in ordnung...

    ist vollkommen unrealistisch.
    Außerdem ist das vollkommen willkütlich: Hast Du Dir schonmal angesehen, wie pow() funktioniert ? Oder malloc() ? Oder printf() ? ....

    Warum sollte man die benutzen dürften aber std::string nicht, wenn sie zur Lösung einer Aufgabe geeignet sind ?
    "Cer" argumentieren gegenüber "C++ern" oftmals mit dieser "überflüssigen Abstraktionsebene" und vergessen dabei, dass sie es sich ganz selbstverständlich selbst hinter so einer gemütlich gemacht haben.

    Gruß,

    Simon2.



  • Ich finde auch, bevor man C lernt, sollte man erstmal alle Assembler-Befehle kennen...



  • Schlagt mich, aber ich stimme mit Sebastians Meinung (zumindest teilweise) überein. JEDER C++ Programmierer kommt früher oder später mit einer reinen C-API in Kontakt und muss sich mit char-Arrays herumärgern und sollte dann auch wissen, wie man richtig mit ihnen umgeht. Also sollte jedes C++-Kurs/Buch/Tutorial eine Einführung in C-Strings geben um anschließend zu verdeutlichen, dass die C++-String Klasse nur ein Wrapper um die NTBFs ist, um den Umgang mit ihnen komfortabler zu machen...
    Außerdem setzt eine Maschinennahe Sprache wie C, und damit auch C++,nun mal eine gewisse Auseinandersetzung mit den Grundlagen voraus, um wirklich effizienten Code zu schreiben.

    Grüße,

    Martin



  • JimmydaMage schrieb:

    Schlagt mich, aber ich stimme mit Sebastians Meinung (zumindest teilweise) überein. JEDER C++ Programmierer kommt früher oder später mit einer reinen C-API in Kontakt und muss sich mit char-Arrays herumärgern und sollte dann auch wissen, wie man richtig mit ihnen umgeht. Also sollte jedes C++-Kurs/Buch/Tutorial eine Einführung in C-Strings geben um anschließend zu verdeutlichen, dass die C++-String Klasse nur ein Wrapper um die NTBFs ist, um den Umgang mit ihnen komfortabler zu machen...

    Ja, sicher sollte man lernen, daß es auch C-Strings gibt und wie sie arbeiten - aber bitte nicht gleich als Einstieg in C++. Auf diese Weise entstehen nur kiloweise halbausgegorene std::string Alternativen, weil die Anfänger versuchen, ausgehend von nullterminierten char-Array eine eigene Verarbeitung zu basteln (und die ist idR schwächer/langsamer/unhandlicher als das Original).

    JiimydaMage schrieb:

    Grüße,

    Martin

    Ja, wie heißt er denn nun? *scnr*



  • Irgendwie ist es schon auffallend, dass die C-String-Verfechter in Diskussionen wie dieser hier meistens eher unerfahrene Entwickler, Forenneulinge oä. sind.

    JimmydaMage: Niemand sagt, dass man nicht irgendwann lernen soll, mit C-Strings umzugehen. Das soll nur nicht das erste sein, was ein C++-Neuling macht.

    Nicht vergessen: Abstraktion ist Euer Freund, tut selten weh.



  • nman schrieb:

    Irgendwie ist es schon auffallend, dass die C-String-Verfechter in Diskussionen wie dieser hier meistens eher unerfahrene Entwickler, Forenneulinge oä. sind.

    Bleibt nur die Frage, ob die erfahreneren evtl nicht mehr wissen, wie's am Anfang war 😉



  • Badestrand schrieb:

    nman schrieb:

    Irgendwie ist es schon auffallend, dass die C-String-Verfechter in Diskussionen wie dieser hier meistens eher unerfahrene Entwickler, Forenneulinge oä. sind.

    Bleibt nur die Frage, ob die erfahreneren evtl nicht mehr wissen, wie's am Anfang war 😉

    Doch, die wissen noch genau, dass ihnen am Anfang auch unsinnigerweise irgendjemand C-Strings eingeredet hat und behauptet hat, std::vector soll man nicht verwenden, weil Zeigerarithmetik immer viel schneller ist usw. und wollen die Folgen derartiger Kommentare anderen Neulingen ersparen.



  • nman schrieb:

    Doch, die wissen noch genau, dass ihnen am Anfang auch unsinnigerweise irgendjemand C-Strings eingeredet hat und behauptet hat, std::vector soll man nicht verwenden, weil Zeigerarithmetik immer viel schneller ist usw. und wollen die Folgen derartiger Kommentare anderen Neulingen ersparen.

    Kann auch sein, weiß ich nich 🙂 Im übrigen ist die Diskussion doch schon dutzende male geführt worden und hat nie was "gebracht". So wie's zur Zeit ist, ist es doch gut, ein paar Leute zeigen den Anfängern den Umgang mit C-Strings und ein paar zeigen den Umgang mit string - heraus kommt ein allwissender Anfänger 😃



  • Tja, was man nicht alles wissen sollte!? Ich benutze in meinen Programmen NIE C-Funktionen. Selbst wenn ich fremde C-Bibliotheken (die ich versuche zu vermeiden, wenn eine C++-Alternative verfügbar) verwende, benutze ich keine C-Funktionen. Bekomme ich einen const char* knall ich den gleich in einen std::string. Und wenn eine Funktionen einen const char* erwartet, habe ich eh schon die ganze Zeit mit einem std::string gearbeitet und übergebe c_str().

    Es ist also eine Lüge zu behaupten, das man als C++ler irgendwann C-Funktionen benutzen muß. Es stimmt höchstens, das man mit einer C-Schnittstelle in Berührung kommt... aber alle C++-Typen (std::string, std::vector usw.) liefern C-kompatible Typen, so das man eben gerade nicht mit C-Funktionen benutzen muß.

    Und dann noch eine Frage: wozu brauche ich C++, wenn ich eh C-Funktionen benutzen soll? Macht doch irgendwie keinen Sinn. Ich benutze doch gerade C++ um von C weg zu kommen.

    malloc und realloc kenne ich nur vom hören sagen. Ich benutze immer std::vector - fertig.

    Dann noch was (ich bin gerade in Fahrt ;)): alle wollen immer eine größere C++-Stdlib und beklagen, das die Entwicklung des C++-Std so lange braucht. Aber im gleichen Atemzug gibts viele, die wollen nicht das man die C++-Std-Klassen wie std::string und std::vector benutzt. Ist doch irgendwie ein Widerspruch! 🙄



  • Badestrand schrieb:

    heraus kommt ein allwissender Anfänger 😃

    Oder ein total verwirrter 😃



  • CStoll schrieb:

    (wer sich etwas besser auskennt, kann sich ja gerne mit den Interna beschäftigen - und mit den "Altlasten", die C++ von C geerbt hat)

    die gehören aber (leider) dazu und unkenntnis dieser altlasten führt früher oder später zu problemen.

    Simon2 schrieb:

    "Cer" argumentieren gegenüber "C++ern" oftmals mit dieser "überflüssigen Abstraktionsebene" und vergessen dabei, dass sie es sich ganz selbstverständlich selbst hinter so einer gemütlich gemacht haben.

    abstraktion ist oft hilfreich, aber sie ist nur sinnvoll, wenn man damit etwas vereinfachen kann. wenn abstraktion zu einem hindernis wird, ist sie sinnlos. es kommt immer auf den jeweiligen fall an. C++ an sich zwingt niemanden zu übertriebener abstraktion - aber - aus irgendeinem unerfindlichen grund neigen eine menge C++ -user dazu, vieles unnötig zu abstrahieren. man braucht nur durch dieses forum zu bowsen und dann kann man die mega-rolleyes kriegen, wie oft zusätzlich komplexität hinzugefügt wird, die eigentlich gar nicht sein muss.
    🙂



  • Bouncer schrieb:

    man braucht nur durch dieses forum zu bowsen und dann kann man die mega-rolleyes kriegen, wie oft zusätzlich komplexität hinzugefügt wird, die eigentlich gar nicht sein muss.
    🙂

    Naja, ist ja auch nicht so, dass Programmieren immer nur einfach ist 😉



  • Bouncer schrieb:

    CStoll schrieb:

    (wer sich etwas besser auskennt, kann sich ja gerne mit den Interna beschäftigen - und mit den "Altlasten", die C++ von C geerbt hat)

    die gehören aber (leider) dazu und unkenntnis dieser altlasten führt früher oder später zu problemen.

    Das kann gut sein - aber einen Neuling gleich damit zu erschlagen führt zu nichts. Dazu ist später noch Zeit, wenn er sich mit den C++ Grundlagen auskennt.

    Simon2 schrieb:

    "Cer" argumentieren gegenüber "C++ern" oftmals mit dieser "überflüssigen Abstraktionsebene" und vergessen dabei, dass sie es sich ganz selbstverständlich selbst hinter so einer gemütlich gemacht haben.

    abstraktion ist oft hilfreich, aber sie ist nur sinnvoll, wenn man damit etwas vereinfachen kann. wenn abstraktion zu einem hindernis wird, ist sie sinnlos. es kommt immer auf den jeweiligen fall an.

    Aber in diesem Fall ist die Abstraktion von char* auf std::string bestimmt kein Hindernis 😉

    man braucht nur durch dieses forum zu bowsen und dann kann man die mega-rolleyes kriegen, wie oft zusätzlich komplexität hinzugefügt wird, die eigentlich gar nicht sein muss.

    Ja, zum Beispiel indem ständig krampfhaft versucht wird, die Funktionsweise von C++ Standardklassen auf Basis der C-Funktionen nachzubilden.

    (aber ich kenne ja deine Meinung zu C++, vista :D)



  • Zuerst einmal: ja, ich gehoere auch zu den Leuten, die sagen "trennt C so weit wie moeglich von C++"

    Das "so weit wie moeglich" steht da extra drin, denn dank der Erblasten ist eine absolute Trennung nicht moeglich, wenn man ueber die ersten Hello-World Anwendungen hinaus ist.
    ABER: Wenn ich eine API hab die mir einen Stapel C-Funktionen liefert, und ich diese Funktionen haeufig benutze, dann baue ich mir Wrapper darum, die das C-Style Gewerkel mit const char*s & Co auf einen moeglichst kleinen Quelltextabschnitt beschraenken.
    Was das Verstaendnis der Hintergruende angeht: klar wird jeder sich irgendwann mit den char-arrays hinter den std::strings auseinandersetzen muessen, aber nicht am Anfang (ich denke das Beispiel mit pow(), sprintf etc. war da schon ganz gut gewaehlt). Man muss nicht sofort alle HJintergruende kennen, sonst koennen wir C++ und auch C an den Nagel haengen und uns erstmal mit Assembler auseinandersetzen. Die Hintergruenden werden erst wichtig, wenns ans Optimieren geht oder man anderweitig in den Eingeweiden der Sprache rumwuehlen muss.

    Dann wurde noch angeprangert, dass hier oft C-Style Code bemaengelt wird und die Leute doch eh frueher oder spaeter ordentlichen Stil lernen. Aber den lernen sie doch nur dadurch dass man ihnen sagt was sie besser machen koennen. Schliesslich sind bestimmt 70% oder mehr der Leute hier Hobbyprogrammierer, die mit ihrem "C/C++"-Buch vor dem Rechner zu Hause sitzen und ausser diesen oftmals grauenhaft sprachvergewaltigenden Buechern nur dieses Forum als Lernmittel und Stilvorlage haben. Aus demselben Grund ist es auch entgegen einigen Behauptungen oft besser, den Leuten Hinweise zu geben, wo sie Loesungsansaetze zu ihren Problemen finden koennen, als ihnen jedesmal stumpf fertigen Quellcode vor die Nase zu setzen. Denn nur durch abtippen lernt man nicht so wirklich viel.



  • Hi pumuckl,

    ich kann dir nur voll zustimmen!!!

    Ich fände es sogar gut, wenn die C++ Compiler eine Option hätten, welcher die C-Altlasten (printf, scanf, malloc, free, ...) als Mißbilligung ("deprecated") wenn nicht sogar als Fehler anprangert (damit die NewBees gleich darauf hingewiesen werden).


Anmelden zum Antworten