F:\collect2.exe [Error] ld returned 1 exit status是什么地方出了问题?

时间:2021-01-26 18:34:37
程序运行什么都不出现

代码如下:
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
#define N  10
char walk[10][10];
void generate_random_walk();
void print_array();

void generate_random_walk(char walk[][10])
{
int j,k;
int m,n;
 for(m=0;m<N;m++)
 {
  for(n=0;n<N;n++)

 if(m==0 &&n==0)
walk[m][n]='A';
 else
walk[m][n]='.';}
 }
 k='A';
m=0;n=0;
srand((unsigned) time(NULL));
do
{   
   k=k+1;
while(walk[m-1][n]=='.' || walk[m+1][n]=='.' || walk[m][n+1]=='.' || walk[m][n-1]=='.')
{
if(m>=0&&m<10&&n>=0&&n<10)
{
j = rand() % 4;
switch(j){
case 0: if(walk[m][n+1]=='.')
{walk[m][n+1]=walk[m][n]+1;
n +=1;
}break;
case 1: if(walk[m+1][n]=='.')
{walk[m+1][n]=walk[m][n]+1;
m +=1;
} break;
case 2: if(walk[m][n-1]=='.')
{walk[m][n-1]=walk[m][n]+1;
n-=1;
}break;
case 3:if(walk[m-1][n]=='.')
{walk[m-1][n]=walk[m][n]+1;
m -=1;
    } break;
}
}
  }
 if(walk[m-1][n]!='.' && walk[m+1][n]!='.' && walk[m][n+1]!='.' && walk[m][n-1]!='.')
    break;
  
}while(k<92);

}
void print_array(char walk[][10]) 
{ int m,n;
for(m=0;m<N;m++)
{
for(n=0;n<N;n++)
printf("%2c",walk[m][n]);
 printf("\n");}

}
int main()
{  
  generate_random_walk(walk);
print_array(walk);

}

5 个解决方案

#1


这段代码有问题,如果if(m>=0&&m<10&&n>=0&&n<10)不满足,没有更新m和n所以造成了死循环

while(walk[m-1][n]=='.' || walk[m+1][n]=='.' || walk[m][n+1]=='.' || walk[m][n-1]=='.')
{
if(m>=0&&m<10&&n>=0&&n<10)
{
j = rand() % 4;
switch(j){
case 0: if(walk[m][n+1]=='.')
{walk[m][n+1]=walk[m][n]+1;
n +=1;
}break;
case 1: if(walk[m+1][n]=='.')
{walk[m+1][n]=walk[m][n]+1;
m +=1;
} break;
case 2: if(walk[m][n-1]=='.')
{walk[m][n-1]=walk[m][n]+1;
n-=1;
}break;
case 3:if(walk[m-1][n]=='.')
   {walk[m-1][n]=walk[m][n]+1;
m -=1;
   } break;
}
}
}

#2


在while(walk[m-1][n]=='.' || walk[m+1][n]=='.' || walk[m][n+1]=='.' || walk[m][n-1]=='.') 时,if得到不到满足,循环条件一直为true,导致死循环

#3


不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。

#4


代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#5


单从出错信息来看,是个链接错。

#1


这段代码有问题,如果if(m>=0&&m<10&&n>=0&&n<10)不满足,没有更新m和n所以造成了死循环

while(walk[m-1][n]=='.' || walk[m+1][n]=='.' || walk[m][n+1]=='.' || walk[m][n-1]=='.')
{
if(m>=0&&m<10&&n>=0&&n<10)
{
j = rand() % 4;
switch(j){
case 0: if(walk[m][n+1]=='.')
{walk[m][n+1]=walk[m][n]+1;
n +=1;
}break;
case 1: if(walk[m+1][n]=='.')
{walk[m+1][n]=walk[m][n]+1;
m +=1;
} break;
case 2: if(walk[m][n-1]=='.')
{walk[m][n-1]=walk[m][n]+1;
n-=1;
}break;
case 3:if(walk[m-1][n]=='.')
   {walk[m-1][n]=walk[m][n]+1;
m -=1;
   } break;
}
}
}

#2


在while(walk[m-1][n]=='.' || walk[m+1][n]=='.' || walk[m][n+1]=='.' || walk[m][n-1]=='.') 时,if得到不到满足,循环条件一直为true,导致死循环

#3


不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。

#4


代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#5


单从出错信息来看,是个链接错。