0

だから私は今 C を学ぼうとしていて、解決したいいくつかの基本的な構造体の質問があります。

基本的に、すべては次のコード スニペットを中心にしています。

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

#define MAX_NAME_LEN 127

const char* getName(const Student* s);
void setName(Student* s, const char* name);
unsigned long getStudentID(const Student* s);
void setStudentID(Student* s, unsigned long sid);

int main(void) {
    Student sarah;
    const char* my_name = "Sarah Spond";
    setName(&sarah, my_name);
    printf("Name is set to %s\n", sarah.name);
}

typedef struct {
    char name[MAX_NAME_LEN + 1];
    unsigned long sid;
} Student;

/* return the name of student s */
const char* getName (const Student* s) { // the parameter 's' is a pointer to a Student struct
    return s->name; // returns the 'name' member of a Student struct
}

/* set the name of student s
If name is too long, cut off characters after the maximum number of characters allowed.
*/
void setName(Student* s, const char* name) { // 's' is a pointer to a Student struct |     'name' is a pointer to the first element of a char array (repres. a string)
    int iStringLength = strlen(name);
    for (i = 0; i < iStringLength && i < MAX_NAME_LEN; i++) {
        s->name[i] = name[i];
}   
}

/* return the SID of student s */
unsigned long getStudentID(const Student* s) { // 's' is a pointer to a Student struct
    return s->sid;
}

/* set the SID of student s */
void setStudentID(Student* s, unsigned long sid) { // 's' is a pointer to a Student struct | 'sid' is a 'long' representing the desired SID
    s->sid = sid;
}

しかし、プログラムをコンパイルしようとすると、「unknown type name Student」というエラーが大量に発生します。私は何を間違っていますか?

ありがとう!

4

6 に答える 6

1

Student-の型定義をのtypedef ..直後#define MAX_NAME_LEN 127、つまり参照される前に移動します。

于 2012-09-09T18:32:06.087 に答える
0

Student他のコードによって最初に参照されるときに、構造体の宣言を上に移動する必要があります。そうしないと、それらの関数はそれが何であるかを認識できません。

于 2012-09-09T18:33:23.690 に答える
0

構造体宣言は使用する前に定義する必要があるため、 Student を移動する必要があります

于 2012-09-09T18:33:35.080 に答える
0

cnicutar が言ったように、typedef を移動します。これは、型を使用する前にその型を知っておく必要があるためです。または、型を前方宣言することもできます。

于 2012-09-09T18:34:08.637 に答える
0
> Move the typedef .. right after #define MAX_NAME_LEN 127, i.e. before
> it's being used.

OR, if you want to keep your definition after, and if you are ready to use a pointer to Student, you can:


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

#define MAX_NAME_LEN 127 

// forward declare Student ici
struct Student;

//...

// in main, use a pointer to student
int main(void) { 
    Student *sarah;                             // Changed to pointer
    const char* my_name = "Sarah Spond"; 
    setName(sarah, my_name);                    // Pass the pointer instead of reference
    printf("Name is set to %s\n", sarah->name); // Use the pointer

    //....
    delete sarah;                               // delete object when done
} 


// Change struct decl to the following          // can't explain the diff yet
struct Student {  
    char name[MAX_NAME_LEN + 1];  
    unsigned long sid;  
};
于 2012-09-09T18:50:49.470 に答える
0

C プログラムの基本構造は次のとおりです。

//======DOCUMENT SECTION=========
//File:test.c
//Author:
//Description:
//...
//================================

//====INCLUDE SECTION=============
#include "lib1"
#include <lib2>
//================================

//========DEFINITIONS SECTION=====

#define TRUE 1
#define FALSE 0

//================================

//========STRUCTURES SECTION======
struct P{
};
//================================

//========TYPEDEFS SECTION========
typedef *P P;
//================================

//========FUNCTION HEADERS========
void foo1(...);
int foo2(...,...,...);
//================================


//=========GLOBAL VARIABLES=======
int GLOBAL_INT;
float GLOBAL_FLOAT;
//================================ 


//=====MAIN FUNCTION DEFINITION===
void main(void)
{
    ...
    ...
    ...
}
//=================================


//======FUNCTIONS DEFINITION======
void foo1(...)
{
}

int foo2(...,...,...)
{
}
//================================

main 関数は、C プログラムが開始される場所です。メイン関数は通常、実行時にプログラムに与えられたコマンド引数にもアクセスできます。

通常、次のものがあります。

int main(void);
int main();

int main(int argc, char **argv);
int main(int argc, char *argv[]);
于 2012-09-09T18:52:12.133 に答える