Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        5年前关闭。
                                                                                            
                
        
我在以下方法中使用不同的方法遇到问题。
当我运行代码并输入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作为参数时,我都会输入3作为指令类,但是我无法输入3类的CPI甚至是3类的指令数。一旦输入CPI和2类的指令数,它将结束。 ”

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

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()SelectOne()所写的全局变量不同,因为在SelectOne()中您可以创建相同名称的局部变量来隐藏它们。

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

int CPI[];
int Count[];


这实际上是在声明一个不完整的类型,因为您没有提供大小。一旦到达转换单元的末尾,如果数组仍然具有不完整的类型,则假定它具有一个元素,在程序启动时将其设置为零。因此,您正在有效地创建一个元素数组,因此,尝试循环遍历SelectTwo()中的多个元素只是未定义且无意义的行为。

如前所述,CPICount所使用的SelectOne()SelectTwo()与您全局定义的是不同的,因此SelectOne()不会读取malloc()写入的内容。

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

int CPI[3];
int Count[3];


如果您不想提供大小(例如,因为要在此处选择大小),则必须使用或在函数中定义一个可变长度数组,然后将其传递给需要它的功能。

关于c - C中的无限循环,怎么了? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25925282/

10-09 18:31