如何在模块化编程中使用结构?
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]
等。假设 nrofline
是p
的有效索引,你会写
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)。
现在不再报错了。谢谢!
你能在 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]
等。假设 nrofline
是p
的有效索引,你会写
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)。
现在不再报错了。谢谢!