这是我在C中编译的代码。目前我有一个全局变量'code',它是一个结构数组(struct instruction)。我一直试图在main中将其作为局部变量,并将其作为参数传递。另外我相信这意味着我需要读取文件返回结构指令*。如果有人能够解释,或者告诉我如何正确使用“代码”作为局部变量,我将不胜感激。此外,我对使局部变量比全局变量更好或更有效的原因感兴趣。谢谢!
#include<stdio.h>
#include <stdlib.h>
typedef struct instruction{
int op; //opcode
int l; // L
int m; // M
} instr;
FILE * ifp; //input file pointer
FILE * ofp; //output file pointer
instr code[501];
void read_file(instr code[]);
char* lookup_OP(int OP);
void print_program(instr code[]);
void print_input_list(instr code[]);
int main(){
read_file(code);
print_input_list(code);//used for debugging
print_program(code);
}
void read_file(instr code[]){
int i = 0;
ifp = fopen("input.txt", "r");
while(!feof(ifp)){
fscanf(ifp,"%d%d%d",&code[i].op, &code[i].l, &code[i].m);
i++;
}
code[i].op = -1; //identifies the end of the code in the array
fclose(ifp);
}
答案 0 :(得分:0)
您必须在需要它们的函数内移动声明:
#include <stdio.h>
#include <stdlib.h>
typedef struct instruction{
int op; //opcode
int l; // L
int m; // M
} instr;
void read_file(instr code[]);
char* lookup_OP(int OP);
void print_program(instr code[]);
void print_input_list(instr code[]);
int main(){
instr code[501]; // code[] declaration moved HERE!!!!
read_file(code);
print_input_list(code);//used for debugging
print_program(code);
}
void read_file(instr code[]){
int i = 0;
FILE * ifp; //ifp FILE* declaration moved HERE!!!!
ifp = fopen("input.txt", "r");
while(!feof(ifp)){
fscanf(ifp,"%d%d%d",&code[i].op, &code[i].l, &code[i].m);
i++;
}
code[i].op = -1; //identifies the end of the code in the array
fclose(ifp);
}
我在ifp
内readfile()
和code
内main()
移动了ofp
声明。
变量ofp
已被删除,因为它未被使用
如果您在另一个函数中使用{{1}},请在那里声明它。
答案 1 :(得分:0)
足够简单。 您目前编码的效率没有真正的变化。 唯一的变化是代码的存储将来自堆栈
int main(){
instr code[501];
read_file(code);
print_input_list(code);//used for debugging
print_program(code);
}
答案 2 :(得分:0)
我会继续尝试回答问题的最后部分:
此外,我对使局部变量更好或更好的原因感兴趣 效率高于全局变量。
Local和Global定义的变量之间存在一些差异。
extern
来访问文件,而不传递对它的引用。因此,在您的示例中,您不需要将对代码的引用传递给函数。函数可以正常访问它。局部变量只在当前块中定义。例如:
int main() {
int j = 0;
{
int i = 0;
printf("%d %d",i,j); /* i and j are visible here */
}
printf("%d %d",i,j); /* only j is visible here */
}
这不会编译,因为i
在主代码块中不再可见。当您将全局变量命名为局部变量时,事情可能会变得棘手。这是允许的,但不推荐。
编辑:本地变量初始化会根据评论进行更改。上面用斜体更改了文字。