Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
5年前关闭。
我在以下方法中使用不同的方法遇到问题。
当我运行代码并输入2作为参数时,我得到一个零和1的无限循环。
我不确定该部分有什么问题。
任何帮助都会很棒。谢谢!
每当我选择1作为参数时,我都会输入3作为指令类别,但是我无法输入3类的CPI甚至3类的指令计数。一旦输入CPI和2类的指令计数,它将结束。
这是我得到0和1的无限循环的方法。
我认为我的问题主要出在我身上,但我不确定如何解决。
如果输入
但是,您的代码还有许多其他问题,包括以下事实:
编辑:您编辑您的问题以显示您的全局数组的定义:
这实际上是在声明一个不完整的类型,因为您没有提供大小。一旦到达转换单元的末尾,如果数组仍然具有不完整的类型,则假定它具有一个元素,在程序启动时将其设置为零。因此,您正在有效地创建一个元素数组,因此,尝试循环遍历
如前所述,
如果要使用这样的全局数组,则必须提供一个大小,例如
如果您不想提供大小(例如,因为要在此处选择大小),则必须使用或在函数中定义一个可变长度数组,然后将其传递给需要它的功能。
想改善这个问题吗? 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
似乎正在使用的全局变量Count
和SelectTwo()
与SelectOne()
所写的全局变量不同,因为在SelectOne()
中您可以创建相同名称的局部变量来隐藏它们。编辑:您编辑您的问题以显示您的全局数组的定义:
int CPI[];
int Count[];
这实际上是在声明一个不完整的类型,因为您没有提供大小。一旦到达转换单元的末尾,如果数组仍然具有不完整的类型,则假定它具有一个元素,在程序启动时将其设置为零。因此,您正在有效地创建一个元素数组,因此,尝试循环遍历
SelectTwo()
中的多个元素只是未定义且无意义的行为。如前所述,
CPI
和Count
所使用的SelectOne()
和SelectTwo()
与您全局定义的是不同的,因此SelectOne()
不会读取malloc()
写入的内容。如果要使用这样的全局数组,则必须提供一个大小,例如
int CPI[3];
int Count[3];
如果您不想提供大小(例如,因为要在此处选择大小),则必须使用或在函数中定义一个可变长度数组,然后将其传递给需要它的功能。
关于c - C中的无限循环,怎么了? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25925282/
10-09 18:31