将变量(结构数组)从全局更改为本地(简单C程序)

时间:2013-09-12 18:43:31

标签: c arrays global local

这是我在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);
}

3 个答案:

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

我在ifpreadfile()codemain()移动了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定义的变量之间存在一些差异。

  1. 初始化即可。全局变量始终初始化为零,其中局部变量在分配之前将具有未指定/不确定的值。它们不必如前所述进行初始化。
  2. 范围即可。全局变量可以被文件中的任何函数访问(甚至可以通过使用extern来访问文件,而不传递对它的引用。因此,在您的示例中,您不需要将对代码的引用传递给函数。函数可以正常访问它。局部变量只在当前块中定义。
  3. 例如:

    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在主代码块中不再可见。当您将全局变量命名为局部变量时,事情可能会变得棘手。这是允许的,但不推荐。

    编辑:本地变量初始化会根据评论进行更改。上面用斜体更改了文字。