0

这是我在 C 中编译的代码。目前我有一个全局变量“代码”,它是一个结构数组(结构指令)。我一直在尝试将其作为 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);
}
4

3 回答 3

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()codemain()ofp
ofp

于 2013-09-12T18:50:37.733 回答
0

很简单。效率没有真正的变化,因为您目前已经对其进行了编码。唯一的变化是代码的存储将来自堆栈

int main(){ 
 instr code[501];

 read_file(code);
 print_input_list(code);//used for debugging
 print_program(code);
}
于 2013-09-12T18:50:45.783 回答
0

我将继续尝试回答问题的最后一部分:

我也对是什么使局部变量比全局变量更好或更有效感兴趣。

本地和全局定义的变量之间存在一些差异。

  1. 初始化。全局变量始终初始化为零,而局部变量在分配之前将具有未指定/不确定的值。它们不必如前所述进行初始化。
  2. 范围。全局变量可以被文件中的任何函数访问(甚至可以通过 using 从文件中访问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在主代码块中不再可见。当全局变量与局部变量命名相同时,事情可能会变得棘手。允许但不推荐。

编辑:局部变量初始化根据注释进行更改。更改了上面的斜体文本。

于 2013-09-12T19:04:44.327 回答