0

私は構造体「コース」とそのための関数を持っています:

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

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

および別の構造体「トランスクリプト」と関数:

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);
    }

しかし、引数t->courseArray[a]を関数courseGetGradeに渡すことができないようです。私はポインタとこれをどのように実装すべきかについて少し混乱していますが、なぜそれがそのように機能しないのかわかりません。courseArrayはCourse構造体の配列であり、配列の最後にNULLポインターがあります。

「互換性のないポインタ型から「courseGetGrade」の引数1を渡す」という警告が表示されます。引数の前に「const」を追加しようとすると、警告がエラーに変わります。「const」の前に式が必要です。

プレーンCを使用しています。

すべての助けは大歓迎です!

編集。これが完全なコンパイラ出力です。私が最初に投稿したコードよりも多くの関数があり、したがって完全な出力にはより多くの警告があります。

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â

Edit.2これが89行目のエラーの原因となる関数です。

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;
}
4

1 に答える 1

2

変化する:

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

に:

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

また、次の2つの理由により、正しくありません。

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

struct Courseである必要がありますCourseが、より重要なのは、 :isCourse*にスペースを割り当てる必要があるためです。への変更:Course*t->courseArrayCourse**

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

また、以下はのCourseインスタンスを解放せずcourseArray、ポインタの配列のみを解放します。

free(t -> courseArray);

courseArray個々の要素を繰り返して解放してから、ポインターの配列を解放する必要があります。

while (t->courseArray[a] != NULL)
{
    free(t->courseArray[a]->name); /* If name was dynamically allocated. */
    free(t->courseArray[a]);
}
free(t -> courseArray);
于 2012-06-23T21:24:26.573 に答える