Kleines Beispielprojekt in C



  • - *.c niemals per #include
    - main-return fehlt
    - switch/case statt if/else Kaskaden
    - FILE immer binär
    - konstante Stringlisten immer per const char *liste[]={"eins","zwei","drei"};
    - Variablendefinitionen immer am Blockanfang
    - FILE Handling immer mit Fehlerkontrolle
    - struct Initialisierung immer per C99 "Designated Initializers": http://www.drdobbs.com/the-new-c-declarations-initializations/184401377
    - const überall wo möglich, z.B. void save(const struct Player* player)
    - wenn schon scanf, dann richtig mit return-Auswertung und Rest-stdin Leerung
    - kein atoi
    - statt printf("\n"); besser puts("");
    - ...



  • Vielen Dank für die Hinweise!
    Hier nochmal ein paar kleine Fragen / Ergänzungen meinerseits:

    Schön objektorientiert, was viele Anfänger sonst gar nicht machen.

    Ja, ich hatte vorher fast nur in Java meine Skripte geschrieben, das hat hier abgefärbt.
    Warum ist Objektorientierung eigentlich die Programmierphilosophie schlechthin? Wenn man beispielsweise nach "objectoriented programming critizism" googlet, findet man teilweise sehr erfahrene Programmierer, die kübelweise Dreck über die OO-Philosophie ausschütten. Aber als Anfänger kann ich diese Diskussion leider nicht beurteilen.

    Niemals Sourcedateien (.c) via Include einbinden.

    Das liest man fast überall. Warum eigentlich nicht? Zumindest bei kleineren Projekten erschließt sich mir der Nutzen aus der besseren Vorgehensweise nicht.

    main-return fehlt

    Ist das nicht optional?

    switch/case statt if/else Kaskaden

    Habe ich in älteren projekten mal gemacht, aber irgendwie finde ich if-else-Konstruktionen schöner. Kann man das auch als Geschmackssache einstufen, oder hat switch-case auch praktische Vorteile?

    kein atoi
    

    Warum nicht? scheint wunderbar zu funktionieren.

    Ich danke für die vielen Hinweise von euch beiden, die restlichen habe ich soweit auf Anhieb verstanden!



  • Nerv nicht, nimm es als gottgegeben hin.



  • Bitte was? Erstmal mäßigst du dich im Ton. Außerdem bin ich hier um zu lernen, nicht um Gedichte aufsagen zu können. Das heißt ich muß die Dinge verstehen, sonst habe ich keinen Nutzen davon. Anwendung ohne Verständnis ist für einen Lernenden sinnlos.



  • Gewoehn dich dran.
    Sei froh, dass war noch Wutz in sanfter Form. Lustig wirds erst wenn er sich durch dich angegriffen fuehlt 🙂

    Faustregel: Beitraege von ihm durchlesen, keine Fragen stellen, einfach alles googlen und so tun als haette er dir nicht geantwortet.


  • Mod

    Dexter1997 schrieb:

    Niemals Sourcedateien (.c) via Include einbinden.

    Das liest man fast überall. Warum eigentlich nicht? Zumindest bei kleineren Projekten erschließt sich mir der Nutzen aus der besseren Vorgehensweise nicht.

    Weil du andernfalls doppelte Definitionen bekommst. Wenn du bei kleinen Projekten schluderst, dann lernst du es nie richtig und wirst niemals etwas größeres schreiben können.

    main-return fehlt

    Ist das nicht optional?

    In C++, aber nicht in C vor dem 1999er Standard.

    kein atoi

    Warum nicht? scheint wunderbar zu funktionieren.

    Weil atoi keine vernünftige Fehlerprüfung erlaubt. Wie unterscheidest du einen Fehler von einer eingegebenen "0"?


  • Mod

    SeppJ schrieb:

    Dexter1997 schrieb:

    Wutz schrieb:

    main-return fehlt

    Ist das nicht optional?

    In C++, aber nicht in C vor dem 1999er Standard.

    Andererseits nutzt Dexter schon C99-Features, Wutz empfiehlt auch struct Intialisierung per C99 "Designated Initializers". Ausserdem möchte er Variablendefinitionen am Blockanfang sehen (im von ihm geposteten Link wird das gerade nicht empfohlen). Wer weiss also schon, warum seine Empfehlungen so ausfallen, wie sie es tun. Die Version des C-Standards scheint jedenfalls nicht der Grund zu sein.



  • Statt deiner fgets und atoi Reihe kannst du auch fscanf(file,"%d",&player->level) nehemen.
    Wenn du den Rückgabewert von fscanf auswertest, kannst du sogar Fehler erkennen.


  • Mod

    camper schrieb:

    SeppJ schrieb:

    Dexter1997 schrieb:

    Wutz schrieb:

    main-return fehlt

    Ist das nicht optional?

    In C++, aber nicht in C vor dem 1999er Standard.

    Andererseits nutzt Dexter schon C99-Features, Wutz empfiehlt auch struct Intialisierung per C99 "Designated Initializers". Ausserdem möchte er Variablendefinitionen am Blockanfang sehen (im von ihm geposteten Link wird das gerade nicht empfohlen). Wer weiss also schon, warum seine Empfehlungen so ausfallen, wie sie es tun. Die Version des C-Standards scheint jedenfalls nicht der Grund zu sein.

    Die Initializer sind ein Feature, wohingegen implizite Rückgabewerte und lokale Definitionen die holde Reinheit der Sprache schänden, wie sie von den Altvorderen ersonnen wurde.



  • Dexter1997 schrieb:

    switch/case statt if/else Kaskaden

    Habe ich in älteren projekten mal gemacht, aber irgendwie finde ich if-else-Konstruktionen schöner. Kann man das auch als Geschmackssache einstufen, oder hat switch-case auch praktische Vorteile?

    ja der code wird übersichtlicher, ist weniger fehleranfällig, besser erweiterbar und (achtung evtl. gefährliches halbwissen) soweit ich weiß kann der compiler damit schnelleren maschinencode erzeugen, weil sich die switch-anweisung besser in sprungbefehle umwandeln lässt.

    kein atoi
    

    Warum nicht? scheint wunderbar zu funktionieren.

    dann gib mal eine zahl ein, die einen überlauf erzeugen würde, also bei int z.b. 5000000000. die dokumentation sagt dazu "undefined behaviour" und das ist (fast) immer schlecht.


Anmelden zum Antworten