Brauche Hilfe bei Struct



  • Hm also iwie lags nicht daran...hab auch mal das tyedef weggelassen da waren direkt 2 fehler weniger...aber oben in der Aufgabenstellung ist es ja so angegeben. Dann kann ich schonmal nichts mit der Anweisung "...Datei in ein Feld ArtikelTyp* Artikel[100] einliest ...", wie soll man denn das machen? ArtikelTyp ist doch nur ne Variable und wenn dann müsst man Artikel[100] doch iwie in die Struktur schreiben oder?



  • Also:

    FILE* Textdatei;
    struct ArtikelTyp* Artikel[100];
    int i=0;
    char s;
    

    Es gibt kein struct ArtikelTyp, sondern entweder ArtikelTyp oder struct Schreibwaren. Und das Sternchen bei ArtikelTyp kannste auch weglassen, macht hier nämlich irgendwie wenig Sinn.

    Außerdem gibts einen Fehler bei

    Textdatei=fopen("C:\liste.txt", "r");
    

    Ein Backslash allein reicht nicht - es muss *\* heißen.

    Das mit dem Auslesen der Datei würde ich übrigens mit fscanf machen. Erscheint mir hier am Leichtesten.
    -> http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/



  • Kann man das dann so schreiben, weil irgendwie muss das ja mit der Aufgabenstellung zu beweltigen sein sonst würd mein Lehrer das ja nicht so hinschreiben...aber ich finde das auch nirgends in einem Buch bzw. in seinem Skript^^:

    ...
    FILE* Textdatei;
    ArtikelTyp* Artikel[100];
    ...

    Da meckert der Compiler das "Artikel" ein nichtdeklarierter Bezeichner ist, wo er auch Recht hat aber ich weiß nicht wie man das sonst so lösen könnte wie mein Lehrer das will. Ich würde am liebsten en normales char Feld deklarieren und ab geht die Post aber das mit der Strukturmuss ja iwie ins Spiel gebracht werden...denke ich.



  • pAiSTe schrieb:

    Kann man das dann so schreiben, weil irgendwie muss das ja mit der Aufgabenstellung zu beweltigen sein

    Ja, kannst du, jedoch müsstest du dann für jedes Array-Element Speicher allozieren und das ist an dieser Stelle einfach nur unnötig und erschwerend.

    pAiSTe schrieb:

    sonst würd mein Lehrer das ja nicht so hinschreiben...

    Sag sowas nicht 😉

    btw: Dir fehlt noch ein fclose am Schluss.



  • Also ich hab jetzt einfach mal das ganze so geschrieben, dass ich davon ausgehe, dass nur der Text einer Textdatei in ein Feld eingelesen werden soll. Was es trotzdem mit dem Ausdruck "ArtikelTyp* Artikel[100]" auf sich hat, bleibt mir trotzdem fraglich.
    Danke nochmal für die schnellen Antworten.

    int main(){

    FILE* Textdatei;
    char Artikel[100];
    int i=0;
    char s=NULL;

    Textdatei = fopen("C:\\liste.txt" , "r");

    if(Textdatei==NULL)printf("Datei wurde nicht gefunden.");

    for(i=0;s!=EOF || i<99;i++)
    {
    s=fgetc(Textdatei);
    Artikel[i]=s;

    }
    fclose(Textdatei);
    Artikel[i]='\0';

    printf("%s", Artikel);

    getch();
    return 0;
    }



  • pAiSTe schrieb:

    Was es trotzdem mit dem Ausdruck "ArtikelTyp* Artikel[100]" auf sich hat, bleibt mir trotzdem fraglich.

    Es ist ein Array mit 100 Elementen vom Typ 'Zeiger auf ArtikelTyp'. Um das so zu benutzen musst du, wie gesagt, für jedes dieser Elemente Speicher allozieren, was unnötig ist.

    Warum du die Struktur jetzt weggelassen hast und alles in einem String schreibst, ist mir schleierhaft. Die Struktur ist bzw. war doch eine gute Lösung, oder nicht?!



  • Hm joa okay...wie würde man dann den Speicher dafür allozieren? Mit (ArtikelTyp*)malloc(sizeof(ArtikelTyp))?



  • Gleich sagt wieder jemand, daß man malloc nicht casten soll.



  • for (i = 0; i < 100; i++) {
        Artikel[i] = malloc (sizeof (*Artikel));
    }
    

    Und um auf die Variablen der Struktur zugreifen zu können:

    Artikel[3][0].preis
    Artikel[3][0].bezeichnung
    

    Der zweite Index muss hier immer 0 sein.



  • Also jetzt kommt immer:

    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
    #include <ctype.h>

    struct Schreibwaren{
    float preis;
    char bezeichnung[100];
    char eigenschaft[100];
    }ArtikelTyp;

    int main(){

    FILE* Textdatei;
    ArtikelTyp* Artikel[100];
    int i=0;
    char s=NULL;

    for (i = 0; i < 100; i++) {
    Artikel[i] = malloc (sizeof (*Artikel));
    }

    Textdatei = fopen("C:\\liste.txt" , "r");

    if(Textdatei==NULL)printf("Datei wurde nicht gefunden.");

    for(i=0;s!=EOF || i<99;i++)
    {
    s=fgetc(Textdatei);
    Artikel[i]=s;
    printf("%c", Artikel[i]);
    }
    fclose(Textdatei);
    Artikel[i]='\0';

    getch();
    return 0;
    }

    : error C2065: 'Artikel': nichtdeklarierter Bezeichner
    : error C2065: 'Artikel': nichtdeklarierter Bezeichner
    : error C2065: 'Artikel': nichtdeklarierter Bezeichner
    : error C2070: ''unknown-type'': Ungültiger sizeof-Operand
    : error C2065: 'Artikel': nichtdeklarierter Bezeichner
    : error C2065: 'Artikel': nichtdeklarierter Bezeichner
    : error C2065: 'Artikel': nichtdeklarierter Bezeichner



  • Es fehlt der zweite Index bei Artikel.



  • Hm, also man soll ja den kompletten Text in ein Feld einlesen.
    Für was steht jetzt der 2. Index?
    Müsste man dann das so schreiben?:
    Artikel[i][0]=s;



  • Nimm fscanf zum Einlesen:

    fscanf (Textdatei, "%f %100s %100s", &Artikel[i][0].preis, Artikel[i][0].bezeichnung, Artikel[i][0].eigenschaft);
    

    pAiSTe schrieb:

    Für was steht jetzt der 2. Index?

    Der steht für das (unnötig) allozierte Element.



  • hellseher schrieb:

    Gleich sagt wieder jemand, daß man malloc nicht casten soll.

    Nee, ich werd' einfach nur blind ohne c/c++- Tags.

    Achje, das war jetzt nicht so wirklich konstruktiv 😞



  • Hm nagut ich werde nochmal über alles drüberschaun und nachdenken...dann hab ich nochmal ne kurze aufgabe aber bin mir da nicht so sicher...wie legt man da den Typ fest?
    Und zwar:
    Welchen Wert und welchen Typ haben folgende Ausdrücke?
    a) 19/4.0
    b) 19/5
    c) 62L
    d)(double)(5/3)
    e) (float) 4/3
    f) 1,14
    g) 12/5+3.2
    h) -128
    i) (char) 65/'A'
    J)32UL



  • Welchen Wert und welchen Typ haben folgende Ausdrücke?

    Wenn du castest oder Präfix-Literale verwendest, immer den gewünschten. Sonst den "einfachsten", der den Wert aufnehmen kann.



  • mit "einfachsten" meinst du Priorität oder Bytes?


Anmelden zum Antworten