如何在模块化编程中使用结构?

How can you use structures in modular programming?

你能在 C 语言的模块化编程中使用结构吗?如果是这样,你怎么能那样做?我试图将 p[].ptr 放在函数头中,它不断地在 ']' 之前请求和表达。

typedef struct Words {
   char *ptrletter;
    int numbers;
} Word;
Word *p=(Word*)malloc(sizeof(Word)*lines);
p[nrofline].ptrletter=(char*)malloc(sizeof(char)*(a[nrofline]+1));
strcpy(p[nrofline].ptrletter,"");
p[nrofline].numbers=0;
fillwordnr(f,p[nrofline].ptrletter,p[nrofline].numbers,lines,nrofline,a,c,string[]);

其中

void fillwordnr(FILE *f, char letters[], int numbers[],  int lines, 
int nrofline, int *a, char c, char string[]){
do {
    c=fgetc(f);
    if ((c>='A' && c<='Z') || (c>='a' && c<='z')){
        string[0] = tolower(c);
        string[1]='[=11=]';
        strcat(letters[nrofline],string);
    }
    else if (c>='0' && c<='9') {
        string[0]=c;
        string[1]='[=11=]';
        numbers[nrofline]=(numbers[nrofline])*10+(c-'0');
    } else if (c == '\n'){
        string[0]='[=11=]';
        strcat(letters[nrofline],string);
        nrofline++;
        if (nrofline<lines){
            letters[nrofline]=(char*)malloc(sizeof(char)*(a[nrofline]+1));
            numbers[nrofline]=0;
            strcpy(letters[nrofline],"");
        }
    }
}while (c!=EOF);
}

*** 好的,问题是它不能编译?因为它给出了错误 <>

我将 nroflines 放在括号之间,但它仍然给出相同的错误。

是的,您可以在包含多个文件的程序中使用结构。

嗯,这是个问题:

fillwordnr(f,p[].ptrletter,p[].numbers,lines,nrofline,a,c,string[]);

您必须指定要使用 p 的哪个元素 - p[0]p[1]p[i] 等。假设 nroflinep 的有效索引,你会写

fillwordnr( f, p[nrofline].ptrletter, p[nrofline].numbers, lines, nrofline, a, c, string );

老实说,根据您发布的代码,您并不清楚您想要完成什么。

C 语法。

fillwordnr(f,p[].ptrletter,p[].numbers,lines,nrofline,a,c,string[]);

it constantly requests and expression before the ']'.

当然可以。在代码的其他地方,int variableName[] 中的 [] 描述了变量的类型。数组。类似于 int* variableName,它是一个指向 int 的指针。数据类型不同。当尝试使用数组时,它不想知道它是什么类型的数据结构,它想要实际的数据。当您调用 p[] 时,您不会发送所有数据结构。你甚至不只是发送一个。您正在发送数据结构的类型。 p[].herp 是胡言乱语。

您想发送到函数中的内容类似于:

fillwordnr(f,p[0].ptrletter,p[0].numbers,lines,nrofline,a,c,string);

或者,如果您希望对整个数据集执行此操作:

for(int i=0; i<numWords; i++)
{
  //...
  fillwordnr(f,p[i].ptrletter,p[i].numbers,lines,nrofline,a,c,string);
  //...
}

为了所有神圣的东西,获得更好的命名系统而不是 a、c、string 作为字符串的名称,数字作为 int 的名称。它将使您和任何查看代码的人免于头疼。命名很重要。

好的,我发现了错误。感谢大家的帮助!

所以我不得不按照 Philip 所说的去做,即:

fillwordnr(f,p[0].ptrletter,p[0].numbers,lines,nrofline,a,c,string);

John Bode 所说的(我用 string[] 代替了 string)。

现在不再报错了。谢谢!