Kurze Frage schnelle Antwort Thread...


  • Mod

    Das hier übersehene Problem bei dieser Art typedef ist, dass man in C (und das ist C, kein C++) häufig mal den genauen Typen kennen muss, zum Beispiel um Formatstrings für printf/scanf zu schreiben. Die Lösung ist, dass man zusätzlich noch passende Stringkonstanten definiert, so wie es beispielsweise die Standardbibliothek für die typedefs in inttypes.h vormacht:

    #include <stdio.h>
    typedef double FLOAT_TYPE;
    #define PRI_FLOAT_TYPE "f"
    #define SCN_FLOAT_TYPE "lf"
    
    int main (void) 
    {
     FLOAT_TYPE foo;
     puts("Zahl eingeben:");
     scanf("%" SCN_FLOAT_TYPE, &foo);
     printf("Sie haben %" PRI_FLOAT_TYPE " eingegeben.\n", foo);
     return 0;
    }
    


  • SeppJ schrieb:

    Das hier übersehene Problem bei dieser Art typedef ist, dass man in C (und das ist C, kein C++) häufig mal den genauen Typen kennen muss, zum Beispiel um Formatstrings für printf/scanf zu schreiben. Die Lösung ist, dass man zusätzlich noch passende Stringkonstanten definiert, so wie es beispielsweise die Standardbibliothek für die typedefs in inttypes.h vormacht:

    #include <stdio.h>
    typedef double FLOAT_TYPE;
    #define PRI_FLOAT_TYPE "f"
    #define SCN_FLOAT_TYPE "lf"
     
     
    int main (void) 
    {
     FLOAT_TYPE foo;
     puts("Zahl eingeben:");
     scanf("%" SCN_FLOAT_TYPE, &foo);
     printf("Sie haben %" PRI_FLOAT_TYPE " eingegeben.\n", foo);
     return 0;
    }
    

    das hier übersehene problem ist, dass man einfachsten c-code dermaßen verunstalten kann, dass selbst erfahrene programmierer nicht mehr durchsteigen, kurz: das keine sau mehr raff, worum es eigentlich geht.
    auf solche konstrukte sollte man doch möglichst verzichten und nur dort eigene typen definieren, wo es sinnvoll ist.
    mfg


  • Mod

    ogott schrieb:

    das hier übersehene problem ist, dass man einfachsten c-code dermaßen verunstalten kann, dass selbst erfahrene programmierer nicht mehr durchsteigen, kurz: das keine sau mehr raff, worum es eigentlich geht.
    auf solche konstrukte sollte man doch möglichst verzichten und nur dort eigene typen definieren, wo es sinnvoll ist.
    mfg

    Dann zeig mal wie es sonst geht, wenn die Vorgabe ist, dass man einen neuen Typen definieren muss.



  • @all Vielen Dank für eure Antworten

    @hustbaer deine Antwort finde ich als Neuling am nachvollziehbarsten, Danke..

    @SeppJ Danke auch dir aber die Befehle die du benutzt sind mir total fremd... bin Maschinenbaustudent 1. Semester, naja ich setz mich mal wieder vor die Aufgabe ... muss das bis zum 15. checken und noch ein Programm damit schreiben welches sogenannte Personalkarten "sortiert"... also drückt mir die Daumen und wenn ich Fragen hab störe ich euch wieder 😉



  • überall wo ein #define davor steht, das sind makros, das sind anweisungen für den c präprocessor mit einer textersetzungsfunktion.
    http://de.wikipedia.org/wiki/C-Präprozessor#Definition_und_Ersetzung_von_Makros

    z.b. die makros

    #define PRI_FLOAT_TYPE "f"
    #define SCN_FLOAT_TYPE "lf"
    

    kannst du weglassen, weil du mit double arbeiten sollst, dafür kannst du die zu double gehörenden formatzeichen %lf benutzen, damit machst du schon mal nichts falsch.

    die anderen befehle bzw. funktionen wie puts, scanf, prinf kannst du z.b. hier nachlesen
    http://www.cplusplus.com/reference/cstdio/puts/

    tjaa und dann frage ich mich noch, was

    typedef char ZEILE[100]; /*Datentyp mit Name "ZEILE" einführen*/
    

    in deinem eröffnungspost mit der aufgabenstellung zu tun hat. 😕
    dein eröffnun



  • Hallo Jungs.... kapiere grad wieder was nicht... 😞

    Also die Übung lautet:
    Deklarieren Sie einen eigenen Datentyp mit dem Namen FLOAT_ZAHL. Dieser Typ
    soll einfach den Standardtyp double ersetzen und von Ihnen bei der Definition der
    Variablen zahl benutzt werden (im Hauptprogramm "double" durch
    "FLOAT_ZAHL" ersetzen!).

    Meine "Lösung" was falsch ist... :

    #include <stdio.h>
    typedef char ZEILE[100]; /*Datentyp mit Name "ZEILE" einführen*/  
    typedef double FLOAT_ZAHL[];
    int main (void) {
    ZEILE zeile1     = "Erste Textzeile\n";
    ZEILE zeile2     = "Zweite Textzeile\n";
    ZEILE leer_zeile = "\n";
    FLOAT_ZAHL  zahl = 1.5;
    printf("%s%s%s%f\n", zeile1, leer_zeile, zeile2, zahl);
    return 0;
    }
    

    Kann mir jemand das erklären bitte?



  • OK hat sich erledigt 😃

    #include <stdio.h>
    typedef char ZEILE[100]; /*Datentyp mit Name "ZEILE" einführen*/  
    typedef double FLOAT_ZAHL;
    int main (void) {
    ZEILE zeile1     = "Erste Textzeile\n";
    ZEILE zeile2     = "Zweite Textzeile\n";
    ZEILE leer_zeile = "\n";
    FLOAT_ZAHL zahl       = 1.5;
    printf("%s%s%s%f\n", zeile1, leer_zeile, zeile2, zahl);
    return 0;
    }
    

    Doofer Fehler aber habs jetzt 🙂



  • Hallo, ich habe hier ein paar Unklarheiten und zwar geht es um die Eingabe und ausgabe von Textdateien in zusammenhang mit Zeigern

    FILE *input = fopen("input.txt","r");
    fscanf(input, "%79[^\n]", textarray);
    

    Und zwar folgendes: Warum muss input nicht als variable deklariert werden und warum darf ich beim aufrufen von input bei fscanf nicht das * verwenden?

    Muss ich mir das so vorstellen, dass mit FILE * quasi ein array mit dem Inhalt der Datei erzeugt wird? Dann würde sich das wegfallen des * in der zweiten Zeile von selbst erklären.

    Vielen Dank für eure Hilfe 🙂



  • input ist eine Variable. Und zwar vom Typ Zeiger auf FILE
    FILE ist ein typdef einer internen struct.
    Dich als Nutzer der Funktionen geht es gar nichts an, wie diese struct intern aufgebaut ist. 😃

    fscanf erwartet als ersten Parameter einen Zeiger auf eine struct vom Typ FILE
    Also kein *, da es sonst die struct selber wäre.
    Zudem kann fscanf (und die anderen f...-Funktion) so die internen Variablen anpasssen.

    Das ist schon praktisch.

    Geht ja auch so:

    FILE *input; // Variablendefinition
    input = fopen("input.txt","r");
    


  • Vielen Dank!
    Es war zwar nicht die große Erleuchtung meinerseits (was allerdings damit zusammenhängt, dass in meinem Buch noch keine Structs vorgekommen sind), aber ich denke mal, dass ich den Ansatz nun verstanden habe.



  • Es ist auch egal was FILE genau ist.

    Es könnte auch ein int sein, der den Index in einem Array angibt.
    Das hängt von der Implementierung der Ein/Ausgabefunktionen auf dem jeweiligen System ab.



  • Hi Leute,

    bin grad an einer Aufgabe dran, ich bin auch schon "relativ" weit gekommen, leider bekomme ich eine Fehlermeldung die ich einfach nicht verstehe, ich möchte mein Programm nicht öffentlich stellen, würde mich sehr freuen wenn mir einer per PN weiterhelfen kann.

    Grund warum ich es nicht öffentlich stellen möchte ist: Es ist eine "Praktikumsaufgabe" die kontrolliert und bewertet wird, und falls jetzt einer meiner Mitstudenten auch nur ein Teil vom Quelltext kopiert und es sogar "umschreibt" wird es trotzdem erkannt (von einem unserem Prof selbst entwickelten Programm) und man bekommt null Punkte. Also nicht nur meine Kommilitonen sondern auch ich 😞



  • Dann schreib zumindest die Fehlermeldung und evtl. auch die Zeile in der der Fehler auftritt.

    Wenn es am Englisch hapert, dann schau bei leo.org nach.


Anmelden zum Antworten