我的代码
#include <stdlib.h>
#include <stdio.h>
int main()
{
int i=0;
int j=0;
size_t count=0;
float numbers[20][100];
float velocity[21][101];
char *line = NULL;
FILE *myFile;
myFile = fopen("vel.txt", "r");
if (myFile == NULL)
{
printf("Error Reading File\n");
exit (0);
}
while(i < 20 && getline(&line, &count, myFile)!=-1) {
int len = 0, pos = 0;
j = 0;
while(j < 100 && 1 == sscanf(line + pos, "%f%n", &numbers[i][j++], &len))
pos += len;
i++;
}
free(line);
fclose(myFile);
for( i = 0; i < 21; i++ )
for( j = 0; j < 101; j++ )
{
if( i= 1 && j == 1 )
{
velocity[i][j]=numbers[i][j];
}
else if ( i= 1 && j == 101 )
{
velocity[i][j]=numbers[i][j];
}
else if ( i=1 && j >= 2 && j <= 100)
{
velocity[i][j]=(numbers[i][j-1]+numbers[i][j])/2;
}
else if(i >= 2 && i <= 20 && j == 1)
{
velocity[i][j]=(numbers[i-1][j]+numbers[i][j])/2;
}
else if(i >= 2 && i <= 20 && j == 101)
{
velocity[i][j]=(numbers[i-1][j]+numbers[i][j])/2;
}
else if(i >= 2 && i <= 20 && j >= 2 && j <= 100) //means i goes from 2,20 j goes from 2,100
{
velocity[i][j]=(numbers[i-1][j]+numbers[i][j]+numbers[i][j]+numbers[i][j])/4;
}
else if( i= 21 && j == 1 )
{
velocity[i][j]=numbers[i][j];
}
else if ( i=21 && j >= 2 && j <= 100)
{
velocity[i][j]=(numbers[i][j-1]+numbers[i][j])/2;
}
else
{
velocity[i][j]=numbers[i][j];
}
}
return 0;
}
我可以用gcc编译这个但是exe是runnin gforever.So有些东西是错的。我试着这样调试
Breakpoint 1, main () at a1.c:11
11 char *line = NULL;
(gdb) c
Continuing.
Breakpoint 2, main () at a1.c:35
35 if( i= 1 && j == 1 )
(gdb) c
Continuing.
Breakpoint 2, main () at a1.c:35
35 if( i= 1 && j == 1 )
(gdb) c
Continuing.
Breakpoint 2, main () at a1.c:35
35 if( i= 1 && j == 1 )
(gdb) n
39 else if ( i= 1 && j == 101 )
但我是初学者,这个断点告诉我什么?
答案 0 :(得分:3)
这是你的问题:
if( i= 1 && j == 1 )
每次循环播放时,您最终会将i
重置为1
。将其更改为
if ( i == 1 && j == 1 )
避免这种情况的一个常见技巧是将常量表达式放在左侧:
if ( 1 == i && 1 == j )
这样,如果你忘记了=
个符号之一,编译器会对你大喊大叫(常量表达式不能作为赋值的目标)。 请注意,我个人并不赞同这种做法 - 我只提到它是一种可能的选择。 IMO,正确要做的是提高编译器的警告级别。
修改强>
关于使用gdb进行调试,所有断点都是在特定指令处停止执行;它实际上并没有告诉你任何事情。但是,它让您有机会检查程序的状态。
要查看特定变量的内容,请使用p
命令:
(gdb) p i
(gdb) p j
要检查特定地址的内存,请使用x
:
(gdb) x/b &i
检查从变量i
的地址开始的单个字节:
(gdb) x/32b &i
检查从变量i
的地址开始的32个字节。
您还可以使用bt
检查堆栈的状态。 Here's一个方便的gdb命令备忘单。
答案 1 :(得分:3)
开启警告。
大多数C编译器默认情况下没有警告。这很不幸,因为它们为调试提供了大量信息。
命令行编译器通常使用-Wall
,但通常不会打开所有警告。是的,这很愚蠢。如果您正在使用clang
,则可以使用-Weverything
来获取所有内容。除了gcc
之外,-Wextra
还有-Wall
。大多数人都-pedantic
以确保您遵循标准。
修复所有警告,即使它们看起来很傻。您的代码有一堆很容易修复。
使用valgrind。
在您修复警告后,您可以使用Valgrind等程序查找内存问题。这通常与valgrind ./your_executable
一样简单。这将显示你走出分配内存的所有地方,这是C中非常常见的问题。
解释结果可能具有挑战性。 Learn C The Hard Way有一些关于如何做到这一点的信息。
将代码分解为函数并对其进行测试。
这种基本技术适用于任何语言:编写小型可测试函数并测试它们。通过确保每个小部件都可以工作,您只需要担心将它们粘合在一起的代码。
在您的代码中,例如,与velocity
和numbers
一起使用的巨型for循环应该在它自己的函数中。然后它可以与输入构建`数字的代码。
你不需要任何想要进行测试的东西,assert()
可以正常工作。 Here's an example from another question