grade; "> grade; "> grade; " />

een argument doorgeven (een struct in een array van structs binnen een struct) naar een functie in C

Ik heb een struct "cursus" en een functie ervoor:

typedef struct Course_s
    {
    char* name;
    int grade;
    } Course;

int courseGetGrade(Course const* course)
    {
    assert(course);
    return course -> grade;
    }

en een ander struct "transcript" en een functie:

typedef struct Transcript_s
    {
    char* name;
    struct Course** courseArray;
    } Transcript;

double tsAverageGrade(Transcript const *t)
    {
    double temp = 0;
    int a = 0;

    while(t -> courseArray[a] != NULL)
        {
        temp = temp + courseGetGrade(t -> courseArray[a]);
        a++;
        }

    return (temp/a);
    }

But I cannot seem to pass the argument t -> courseArray[a] to the function courseGetGrade. I'm a little confused with pointers and how this should be implemented, I just don't see why it doesn't work the way it is. The courseArray is an array of Course structs, with a NULL pointer at the end of the array.

Ik krijg de waarschuwing "pass argument 1 van" courseGetGrade "van incompatibel aanwijzertype". Als ik probeer "const" toe te voegen vóór het argument, verandert de waarschuwing in een fout: verwachte uitdrukking vóór "const".

Ik gebruik gewoon C.

Alle hulp wordt zeer op prijs gesteld!

Bewerk. Hier is de volledige uitvoer van de compiler. Er zijn meer functies en dus meer waarschuwingen in de volledige uitvoer dan in de code die ik oorspronkelijk heb gepost:

transcript.c: In function âtsAverageGradeâ:
transcript.c:66: warning: passing argument 1 of âcourseGetGradeâ from incompatible pointer type
course.h:27: note: expected âconst struct Course *â but argument is of type âstruct Course *â
transcript.c: In function âtsSetCourseArrayâ:
transcript.c:89: error: invalid application of âsizeofâ to incomplete type âstruct Courseâ
transcript.c:94: warning: assignment from incompatible pointer type
transcript.c: In function âtsPrintâ:
transcript.c:114: warning: passing argument 1 of âcourseGetNameâ from incompatible pointer type
course.h:24: note: expected âconst struct Course *â but argument is of type âstruct Course *â
transcript.c:114: warning: passing argument 1 of âcourseGetGradeâ from incompatible pointer type
course.h:27: note: expected âconst struct Course *â but argument is of type âstruct Course *â
transcript.c: In function âtsCopyâ:
transcript.c:126: warning: passing argument 2 of âtsSetCourseArrayâ from incompatible pointer type
transcript.c:80: note: expected âstruct Course **â but argument is of type âstruct Course ** constâ

Bewerken.2 Dit is de functie die de fout in regel 89 veroorzaakt:

void tsSetCourseArray(Transcrpt *t, Course **courses)
    {
    assert(t && courses);
    free(t -> courseArray);
    int a = 0;
    while(courses[a] != NULL)
        a++;
    t -> courseArray = malloc(sizeof(struct Course) * (a+1));

    a = 0;
    while(courses[a] != NULL)
        {
        t -> courseArray[a] = courseConstruct(courseGetName(courses[a]), courseGetGrade(courses[a]));
        a++;
        }

    t -> courseArray[a] = NULL;
}
0
De operators . en -> binden heel strak; gebruik geen spaties om hen heen.
toegevoegd de auteur Jonathan Leffler, de bron
Kun je alle uitvoeringen van de compilatie posten?
toegevoegd de auteur hmjd, de bron
Hier is het. Er zijn meer functies en dus meer waarschuwingen in de volledige uitvoer dan ik oorspronkelijk heb gepost:
toegevoegd de auteur Jonas Nordfors, de bron

1 antwoord

Verandering:

typedef struct Transcript_s
{
    char* name;
    struct Course** courseArray;
} Transcript;

naar:

typedef struct Transcript_s
{
    char* name;
    Course** courseArray; /* 'Course' is a typedef for 'struct Course_s'. */
} Transcript;

Ook is het volgende onjuist, om twee redenen:

t -> courseArray = malloc(sizeof(struct Course) * (a+1));

struct Course should be Course but more importantly it should be Course* as space needs to be allocated for the Course*: t->courseArray is a Course**. Change naar:

t -> courseArray = malloc(sizeof(Course*) * (a+1));

Ook zal het volgende de Course instanties in de courseArray niet bevrijden, het zal alleen de array van pointers bevrijden:

free(t -> courseArray);

U moet courseArray herhalen en elk afzonderlijk element bevrijden en vervolgens het array van pointers vrijmaken:

while (t->courseArray[a] != NULL)
{
    free(t->courseArray[a]->name); /* If name was dynamically allocated. */
    free(t->courseArray[a]);
}
free(t -> courseArray);
2
toegevoegd
@JonasNordfors, hetzelfde. Moet sizeof (Course) zijn.
toegevoegd de auteur hmjd, de bron
@JonasNordfors, dat zou moeten werken als cursus is volledig gedefinieerd, zie ideone.com/caGjj.
toegevoegd de auteur hmjd, de bron
Hoe geeft courseConstruct zijn waarde terug? Opmerking Ik ben een bijgewerkt antwoord met betrekking tot malloc() .
toegevoegd de auteur hmjd, de bron
Bedankt! Waarschuwingen zijn nu opgelost, maar de fout: ongeldige toepassing van "sizeof" op onvolledige type "struct Course" blijft bestaan. Om het even welke ideeën?
toegevoegd de auteur Jonas Nordfors, de bron
Ik heb het veranderd en nu krijg ik de foutmelding: ongeldige toepassing van "sizeof" op incompleet type "Course"
toegevoegd de auteur Jonas Nordfors, de bron
Ik weet niet waarom het niet werkt, maar ik heb het in sizeof veranderd (cursussen [a]) en nu is het gecompileerd, maar ik krijg veel valgrind-fouten tijdens het uitvoeren ervan. Ik veronderstel dat ik meer geheugen moet herplaatsen voor elke individuele cursus in de array. Bedankt voor uw hulp, ik ga het morgen proberen op te lossen.
toegevoegd de auteur Jonas Nordfors, de bron
Heel erg bedankt voor uw hulp! Ja, de malloc (sizeof (Course *)) veroorzaakte het probleem, ik corrigeerde ook het vrijmaken van het geheugen en nu werkt het als een charme.
toegevoegd de auteur Jonas Nordfors, de bron