在C中无限循环,有什么不对?

时间:2014-09-19 02:09:26

标签: c if-statement for-loop

我在使用不同方法时遇到以下代码问题。 当我运行我的代码并输入2作为我的参数时,我得到一个零和1的无限循环。 我不确定该部分有什么问题。 任何帮助都会很棒。谢谢!

/*global variables*/
int CPI[];
int Count[];

每当我选择1作为我的参数时,我输入3作为我的指令类但是我无法输入第3类的CPI甚至第3类的指令数。一旦我输入CPI和第2类的指令数结束。

void SelectOne(){
  tot = 0;
  printf("\n Enter the number of instruction classes: ");
  scanf("%d", &n);

  printf("\n Enter the frequency of the machine (MHz): ");
  scanf("%d", &f);

  int CPI[n];
  int Count[n];

  int a;
  for(a = 1; a < n; a++){

    /*printf("%d",n);*/

     printf(" Enter CPI of class %d : ", a);
     scanf("%d", &CPI[a-1]);

     printf(" Enter instruction count of class %d : ", a);
     scanf("%d", &Count[a-1]);
     tot =+ Count[a-1];

  }

}

这是我获得0和1的无限循环的方法。

void SelectTwo(){

  printf("\n ---------------------------");
  printf("\n +Class/t + CPI/t +Count +");

  int a;
  for(a = 1; a <= n; a++){
     printf("\n %d\t + %d\t + %d ", a, CPI[a-1], Count[a-1]);

  }


}

我认为我的问题是主要的,但我不确定如何解决这个问题。

int main(){

  int sel = 1;

  while(sel != 4){
     printf("\n 1) Enter Parameters ");
     printf("\n 2) Print table of parameters ");
     printf("\n 3) Print table of performance ");
     printf("\n 4) Quit");

     printf("\n \n Enter Selection: ");
     scanf("%d", &sel);

     if(sel == 1){
        SelectOne();
     }
     if(sel == 2){
        SelectTwo();
     }
     if(sel == 3){
        SelectThree();
     }
     else{
        printf("quit");
     }


  }

}

1 个答案:

答案 0 :(得分:0)

&#34;每当我选择1作为我的参数时,我输入3作为我的指令类但是我无法输入第3类的CPI甚至第3类的指令数。一旦我输入CPI和指令数第2课它结束了。&#34;

这是因为你告诉它。这里:

for(a = 1; a < n; a++){

如果您输入3,则循环会在a == 1时运行一次,第二次在a == 2时运行,然后退出,因为a < 3不再为真。你想要这个:

for( a = 0; a < n; a++ ){      /*  Change a = 1 to a = 0  */
    printf(" Enter CPI of class %d : ", a + 1);
    scanf("%d", &CPI[a]);      /*  Change [a-1] to [a]  */

    printf(" Enter instruction count of class %d : ", a + 1);
    scanf("%d", &Count[a]);    /*  Change [a-1] to [a]  */
    tot += Count[a];           /*  Change =+ to += and [a-1] to [a]  */
}

您的代码还有很多其他问题,包括CPI似乎正在使用的全局变量CountSelectTwo()与{{1}不同的事实正在写入,因为在SelectOne()中你创建了隐藏它们的同名的局部变量。

编辑:您编辑了问题以显示全局数组的定义:

SelectOne()

这实际上做的是声明一个不完整的类型,因为你没有提供大小。一旦你到达翻译单元的末尾,如果数组仍然有一个不完整的类型,那么它假定有一个元素,这在程序启动时设置为零。因此,您有效地创建单元素数组,因此尝试在int CPI[]; int Count[]; 中循环遍历多个元素只是未定义且无意义的行为。

如上所述,SelectTwo()使用的CPICount与您在全局定义的SelectOne()SelectTwo()不同,因此SelectOne()不会从int CPI[3]; int Count[3]; 读取1}}写信给。

如果你想使用像这样的全局数组,你必须提供一个大小,例如

malloc()

如果您不想提供尺寸(例如,因为您希望用户选择尺寸),那么您必须使用{{1}}或定义变量函数中的length数组,并将其传递给需要它的函数。