我構建了一個程序來顯示警衛的行爲。首先有100個(我在代碼中放10個,因爲更容易發現錯誤)(1到100個)燈。起初,他們都在,但: -當運行代碼時它不響應(但它在後臺運行正常)
- 他經過他們第一次後,他把他們全部關閉。
- 第二次經過他們之後,他改變了燈號 ,這些燈號代替了2及其倍數(2 4 6 8 ...) - ,這些燈號是現在開啓的,而相反的。
- 第三次他改變了第三名和 3(3 6 9 ....)的倍數 - 那些現在和現在相反的人。
- 第四時間他改變在第四位的那些和 4的倍數(4 8 12 ....)
程序顯示許多燈如何在端部均關閉。 現在我構建的代碼編譯器顯示沒有警告或錯誤,但運行時它會停止響應。 (編譯器設置爲顯示所有警告。)
有沒有人知道代碼有什麼問題?
#include<stdio.h>
#define N 100
int firstwalk(int light[N]);
int secondtwalk(int light[N]);
int thirdtwalk(int light[N]);
int fourthtwalk(int light[N]);
int main()
{
int light[N] = {0};
int i;
for (i = 0;i < N;i++)
{
light[i] = 1;
}
printf("Lights before the first walk- ");
for (i = 0;i < N;i++)
{
printf("%d ", light[i]);
}
firstwalk(light);
secondtwalk(light);
thirdtwalk(light);
fourthtwalk(light);
printf("the lights that were off are :- ");
for (i = 0;i < N;i++)
{
if (light[i] == 0)
printf("%d ", i+1);
}
}
int firstwalk(int light[N])
{
int i;
for (i = 0;i < N;i++)
{
light[i] = 0;
}
printf("Lights after the first walk- ");
for (i = 0;i < N;i++)
{
printf("%d ", light[i]);
}
printf("\n");
return light;
}
int secondtwalk(int light[N])
{
int i;
for (i = 1;i < N;i= i * 2 + 1)
{
light[i] = 1;
}
printf("Lights after the second walk- ");
for (i = 0;i < N;i++)
{
printf("%d ", light[i]);
}
printf("\n");
return light;
}
int thirdtwalk(int light[N])
{
int i;
for (i = 2;i < N;i= i * 3 + 2)
{
if (light[i] == 1)
light[i] = 0;
else light[i] = 1;
}
printf("Lights after the third walk- ");
for (i = 0;i < N;i++)
{
printf("%d ", light[i]);
}
printf("\n");
return light;
}
int fourthtwalk(int light[N])
{
int i;
for (i = 3;i < N;i= i * 4 + 3)
{
if (light[i] == 1)
light[i] = 0;
else light[i] = 1;
}
printf("Lights after the third walk- ");
for (i = 0;i < N;i++)
{
printf("%d ", light[i]);
}
printf("\n");
return light;
}
謝謝。
C不檢查您是否打破界限的數組。你只需要做對。在開發時,您可以先計算數組索引,然後根據限制進行檢查,然後使用索引。 –
請注意,您的函數應該返回一個整數,但它們返回一個指向int的指針...並且不使用返回值(這不是您的bug,只是一個觀察) – Gam
使用'valgrind'和'gdb'調試你的代碼 –