Warum funktioniert das Programm nicht?????

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
hobbyflug
Beiträge: 13
Registriert: Fr Okt 24, 2014 2:38 pm
Kontaktdaten:

Warum funktioniert das Programm nicht?????

Beitrag von hobbyflug » So Nov 02, 2014 11:08 am

Hallo

Habe gerade zur Übung ein Programm geschrieben, aber es funktioniert einfach nicht. Ich mache immer den selben Fehler, weiß aber nicht welchen und warum.

Bitte um Hifle :(

Code: Alles auswählen

/* 
 * File:   main.c
 * Author: Marcel
 *
 * Created on 2. November 2014, 10:35
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
 * 
 */

struct Cd
{
    char titel[31];
    int jahr;
    double dauer;
};

int leseCDs(struct Cd feld[], int max , FILE *f)
{
    struct Cd cd;
    char s[1000];
    int n;
    int i;
    
    if (f == NULL)
    {
        fclose(f);
        return-2;
    }

    for(i=0; i>-1; i++)
    {
        char s[1000];
        char *p;

        if (fgets(s, sizeof(s), f) == NULL)
        {
            fclose(f);
            return i;
        }

        p=strtok(s, ",");
        if(p == NULL)
        {
            fclose(f);
            return -3;
        }
        strncpy(cd.titel, p,sizeof cd.titel);

        p=strtok(NULL, ",");
        if(p == NULL)
        {
            fclose(f);
            return -4;
        }
        n=sscanf(s, "%d", &cd.jahr) ;
        if(n==0)
        {
            fclose(f);
            return -5;
        }

        p=strtok(NULL, ",");
        if(p == NULL)
        {
            fclose(f);
            return -6;
        }
        n=sscanf(s, "%lf", &cd.dauer) ;
        if(n==0)
        {
            fclose(f);
            return -7;
        }

        feld[i] = cd;
    }
}


struct Cd eingabeCD()
{
    char s[100];
    int n;
    struct Cd cd;
    
    do
    {
        printf("Titel eingeben: ");
        fgets(s, sizeof(s), stdin);
    }
    while (s[0] == '\n');
    strncpy(cd.titel, s, sizeof(cd.titel));

    do
    {
        printf("Jahr eingeben: ");
        fgets(s, sizeof(s), stdin);
        n=sscanf(s, "%d", &cd.jahr );
    }
    while (n!=1 || cd.jahr<1900);

    do
    {
        printf("Dauer eingeben: ");
        fgets(s, sizeof(s), stdin);
        n=sscanf(s, "%lf", &cd.dauer );
    }
    while (n!=1 || cd.dauer <0.0 || cd.dauer>100);
}


void ausgabe (struct Cd cd , int i)
{
    printf("\nCD %d:\n", i);
    printf("Titel: %s\n", cd.titel);
    printf("Jahr: %d\n", cd.jahr);
    printf("Dauer: %.2lf\n",cd.dauer);
    printf("\n\n");
}


int main(int argc, char** argv) 
{
    
    struct Cd bibliothek[100];
    int i;
    int anzahl;
    int err;
    
    printf("\tListe der CD`s\n");
    printf("\t--------------\n\n");
    
   anzahl=leseCDs("daten.csv", bibliothek, 100);
    

    if (anzahl<=0)
    {
        printf("Fehler beim Lesen der Datei %d\n\n",anzahl); 
        return -1;
    }

    
    
    for (i=0;i<anzahl;i++)
        ausgabe(bibliothek[i], i+1);
    
   bibliothek[anzahl]=eingabeCD();                  //sovíele eingaben man machen will, soviele brauche ich
    
    
    err=ausgabe("daten.csv", bibliothek, anzahl);
    
    
    
    
    
    for (i=0;i<=anzahl;i++)                  
        ausgabe(bibliothek[i], i+1);
    
    
    return (EXIT_SUCCESS);
}

Das sind die Fehlermeldungen:

main.c:139:4: warning: passing argument 1 of 'leseCDs' from incompatible pointer type [enabled by default]
main.c:23:5: note: expected 'struct Cd *' but argument is of type 'char *'
main.c:139:4: warning: passing argument 2 of 'leseCDs' makes integer from pointer without a cast [enabled by default]
main.c:23:5: note: expected 'int' but argument is of type 'struct Cd *'
main.c:139:4: warning: passing argument 3 of 'leseCDs' makes pointer from integer without a cast [enabled by default]
main.c:23:5: note: expected 'struct FILE *' but argument is of type 'int'
main.c:156:5: error: incompatible type for argument 1 of 'ausgabe'
main.c:118:6: note: expected 'struct Cd' but argument is of type 'char *'
main.c:156:5: warning: passing argument 2 of 'ausgabe' makes integer from pointer without a cast [enabled by default]
main.c:118:6: note: expected 'int' but argument is of type 'struct Cd *'
main.c:156:5: error: too many arguments to function 'ausgabe'
main.c:118:6: note: declared here
main.c:156:8: error: void value not ignored as it ought to be

lg

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Warum funktioniert das Programm nicht?????

Beitrag von oenone » So Nov 02, 2014 12:49 pm

Du übergibst falsche Parameter an die Funktionen. ausgabe() erwartet struct Cd, du übergibst "daten.csv", ein C-String. Warum? Genau das gleiche bei den anderen.

hobbyflug
Beiträge: 13
Registriert: Fr Okt 24, 2014 2:38 pm
Kontaktdaten:

Re: Warum funktioniert das Programm nicht?????

Beitrag von hobbyflug » Mo Nov 03, 2014 7:09 pm

Also wenn ich daten.csv raus lösche müsste es funktionieren?

Wann kann ich das daten.csv drin lassen?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Warum funktioniert das Programm nicht?????

Beitrag von cloidnerux » Mo Nov 03, 2014 8:25 pm

Also wenn ich daten.csv raus lösche müsste es funktionieren?

Wann kann ich das daten.csv drin lassen?
Auch dann wird es nicht Funktionieren, weil du selber nicht weißt, was du machst:

Code: Alles auswählen

int leseCDs(struct Cd feld[], int max , FILE *f){
[...]
    if (f == NULL)
[...]

 anzahl=leseCDs("daten.csv", bibliothek, 100);
Erst legst du deine Funktion so an, dass ein Array übergeben werden soll, eine Anzahl und ein fertig initialisierter Dateipointer.
Dann rufst du deine Funktion mit Pfad, Array und einer Anzahl und erwartest irgendeine andere Zahl zurück.

Da stimmt etwas sehr gewaltig nicht!
Redundanz macht wiederholen unnötig.
quod erat expectandum

hobbyflug
Beiträge: 13
Registriert: Fr Okt 24, 2014 2:38 pm
Kontaktdaten:

Re: Warum funktioniert das Programm nicht?????

Beitrag von hobbyflug » Di Nov 04, 2014 6:21 pm

anzahl=leseCDs(bibliothek, 100 , f);

Fehlt noch etwas?

ProgBeginner
Beiträge: 76
Registriert: Mo Jul 29, 2013 2:26 pm

Re: Warum funktioniert das Programm nicht?????

Beitrag von ProgBeginner » Di Nov 04, 2014 9:54 pm

Ich hab mich da jetzt auch nicht durchgefuchst, ABER :

Die Frage, die sich stellte, war doch, warum du einen String übergibst ( "daten.csv" ist ein String ), obwohl von deinen Funktionen ganz andere Datentypen verlangt werden.

Von Datentypeninkompatibilität sprechen übrigens auch die Fehlermeldungen, die in deinem Eröffnungspost stehen.
Verwechsle niemals Freie Software mit Freeware - da gibt es markante Unterschiede. Freie Software kann Geld kosten, Freeware ist aber selten frei.

hobbyflug
Beiträge: 13
Registriert: Fr Okt 24, 2014 2:38 pm
Kontaktdaten:

Re: Warum funktioniert das Programm nicht?????

Beitrag von hobbyflug » Mi Nov 05, 2014 5:35 pm

Und wie kann ich das Problem beheben??

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8861
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Warum funktioniert das Programm nicht?????

Beitrag von Xin » Mi Nov 05, 2014 7:08 pm

hobbyflug hat geschrieben:Und wie kann ich das Problem beheben??
Kennst Du dieses Spielzeug für Kleinkinder, wo man Würfel in viereckige Löcher stopfen muss und runde Scheiben in runde Löcher?
Du versuchst derzeit einen Würfel in ein rundes Loch zu packen. Das ist das Problem.

Als Anfänger kannst Du Dir überlegen, wie Du aus dem Würfel eine runde Scheibe bekommst, oder aus dem runden Loch ein viereckiges.
Als Fortgeschrittener guckst Du erstmal an, welches Problem Du eigentlich mit der Funktion lösen möchtest, wenn Du einer Funktion einen Parameter übergibst.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten