以前完美的 C 程序在 Ubuntu 上编译后没有 运行
Previously perfect C program doesn't run after compiling on Ubuntu
我有一个 st运行ge 问题。我为多边形中的点(pip)问题写了一个C程序,写的时候用的是ElementaryOS。这个方案运行很好。然后我不得不切换到 Ubuntu 14.04 LTS,因为我无法在 Elementary OS Luna 上安装 netCdf。我把pip程序复制到新系统,想运行。我编译了程序(没有错误),然后 运行 它。程序 运行 很好,同时达到 "for" 个包含函数的循环。当它到达他们时,程序没有写错误消息,它 运行 进一步 (CPU: 100% ) 并且没有停止自己。
我不明白这是什么问题。有一个程序 运行 在 OS 上表现完美,而在另一个上表现不佳 运行。我没有更改程序中的任何内容。而且我还尝试制作一个新的 .c 文件,我在其中复制了程序,但它产生了同样的问题。
有人有想法吗?感谢您的帮助!
我用那个命令编译程序:
cc pipn.c -o pipn.exe
并且 运行 带有一个 .运行 文件:(Documents 文件夹中的 .c 和 .txt,没有子文件夹)
binPath=/home/bajogh/Documents
#n latNa lonNa latNb lonNb dx dy
${binPath}/pipn.exe 13 85.0 -180.0 0.0 179.5 0.5 0.5
程序如下:
#include <stdio.h>
#include <stdlib.h>
int innerpoint(int n, float *lon, float *lat, float lon0, float lat0)
{
int i, j, c = 0;
for (i = 0, j = n - 1; i < n; j = i++) {
if ((((lat[i] <= lat0) && (lat0 < lat[j])) ||
((lat[j] <= lat0) && (lat0 < lat[i]))) &&
(lon0 < (lon[j] - lon[i]) * (lat0 - lat[i]) / (lat[j] - lat[i]) + lon[i]))
c = !c;
}
return c;
}//pip?=1, pip!=0
int vertex(int n, float *lon, float *lat, float lon0, float lat0)
{
int i, c = 0;
for (i = 0; i < n; i = i++) {
if ((lat[i] == lat0) && (lon[i] == lon0))
c = !c;
}
return c;
} //testpoint is a vertex?
int sidepoint(int n, float *lon, float *lat, float lon0, float lat0)
{
int i, j, c = 0;
for (i = 0, j = n - 1; i < n; j = i++)
{
if (((lat[i] <= lat0) && (lat0 <= lat[j])) || ((lat[j] <= lat0) && (lat0 <= lat[i])))
if (((lon[i] <= lon0) && (lon0 <= lon[j])) || ((lon[j] <= lon0) && (lon0 <= lon[i])))
if ((((lat0 - lat[i])*(lon[j] - lon[i])) - ((lon0 - lon[i])*(lat[j] - lat[i]))) == 0)
c=!c;
}
return c;
}//testpoint is on a side?
int main(int argc, char **argv)
{
FILE *fp,*finout,*fin;
fp = fopen("polygon.txt", "r"); //polygon coordinates, 2 columns: lon lat
finout = fopen("pip_inout.txt", "w");
fin = fopen("pip_in.txt", "w");
float *lon0;
float *lat0;
float *lon;
float *lat;
float dx,dy;
float latNa,lonNa;
float latNb,lonNb;
int nx,ny;
int q,l;
int p,n;
n=atoi(argv[1]);
latNa=atof(argv[2]);
lonNa=atof(argv[3]);
latNb=atof(argv[4]);
lonNb=atof(argv[5]);
dx=atof(argv[6]);
dy=atof(argv[7]);
//polygon -------------------------------------------
//printf("Number of vertices of polygon?\n");
//scanf("%d",&n);
printf("Number of verticies of polygon: %d\n",n);
if((lon=(float *)calloc(n,sizeof(float)))==NULL)
{
printf("can't alloc for lon\n");
fprintf(stderr,"can't alloc for lon\n");
return (3);
}
if((lat=(float *)calloc(n,sizeof(float)))==NULL)
{
printf("can't alloc for lat\n");
fprintf(stderr,"can't alloc for lat\n");
return(3);
}
for (p=0;p<n;p++)
{
fscanf(fp,"%f %f", &lon[p],&lat[p]);
}
for (p=0;p<n;p++)
{
printf("%11.5f %11.5f\n", lon[p],lat[p]);
}
printf("---------------------------------------\n");
//testpoints
nx=((abs(lonNa)+abs(lonNb))/dx)+2;
ny=((abs(latNa)+abs(latNb))/dy)+1;
printf("nx=%d ny=%d\n",nx,ny);
printf("---\n");
if((lon0=(float *)calloc(nx,sizeof(float)))==NULL)
{
fprintf(stderr,"can't alloc for lon0\n");
return(3);
}
if((lat0=(float *)calloc(ny,sizeof(float)))==NULL)
{
fprintf(stderr,"can't alloc for lat0\n");
return(3);
}
for(q=0;q<ny;q++)
{
lat0[q]=latNa-(dy*q);
for(l=0;l<nx;l++)
{
lon0[l]=lonNa+(dx*l);
printf("%f %f\n",lat0[q],lon0[l]);
}
}
printf("----------------------------------------\n");
//START OF THE PROBLEMATIC SECTION
for (q = 0; q<ny; q++)
{
for(l=0;l<nx;l++)
{
if (vertex(n, lon, lat, lon0[l], lat0[q]) == 1)
{printf("%11.5f %11.5f 1\n", lat0[q], lon0[l]);
fprintf(finout,"%11.5f %11.5f 1\n", lat0[q], lon0[l]);
fprintf(fin,"%11.5f %11.5f\n", lat0[q], lon0[l]);}
else
if (sidepoint(n, lon, lat, lon0[l], lat0[q]) == 1)
{printf("%11.5f %11.5f 1\n", lat0[q], lon0[l]);
fprintf(finout,"%11.5f %11.5f 1\n", lat0[q], lon0[l]);
fprintf(fin,"%11.5f %11.5f\n", lat0[q], lon0[l]);}
else
if (innerpoint(n, lon, lat, lon0[l], lat0[q]) == 1)
{printf("%11.5f %11.5f 1\n", lat0[q], lon0[l]);
fprintf(finout,"%11.5f %11.5f 1\n", lat0[q], lon0[l]);
fprintf(fin,"%11.5f %11.5f\n", lat0[q], lon0[l]);}
else
{printf("%11.5f %11.5f 0\n", lat0[q], lon0[l]);
fprintf(finout,"%11.5f %11.5f 0\n", lat0[q], lon0[l]);}
}
}
printf("-------!!!COMPLETED!!!--------\n");
printf("---< In-points in 'pip_in.txt' >---\n");
return 0;
}
在vertex
中:
i = i++
在 C 中是未定义的行为:使用不同的编译器可能会得到不同的结果。
用clang编译立即指出问题:
clang t1.c
t1.c:21:29: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
for (i = 0; i < n; i = i++) {
~ ^
1 warning generated.
您的代码还有其他问题:
- 您测试
malloc
失败,但不测试 fopen
或没有足够的命令行参数。
- 你应该使用
double
而不是 float
类型。
innerpoint
、vertex
和 sidepoint
中的逻辑在我看来是错误的。匹配时切换 c
。如果有偶数个匹配项,例如,如果您有空段,这些函数将 return 0
。这对于 innerpoint
可能是正确的,但对于 vertex
. 可能是错误的
我有一个 st运行ge 问题。我为多边形中的点(pip)问题写了一个C程序,写的时候用的是ElementaryOS。这个方案运行很好。然后我不得不切换到 Ubuntu 14.04 LTS,因为我无法在 Elementary OS Luna 上安装 netCdf。我把pip程序复制到新系统,想运行。我编译了程序(没有错误),然后 运行 它。程序 运行 很好,同时达到 "for" 个包含函数的循环。当它到达他们时,程序没有写错误消息,它 运行 进一步 (CPU: 100% ) 并且没有停止自己。
我不明白这是什么问题。有一个程序 运行 在 OS 上表现完美,而在另一个上表现不佳 运行。我没有更改程序中的任何内容。而且我还尝试制作一个新的 .c 文件,我在其中复制了程序,但它产生了同样的问题。
有人有想法吗?感谢您的帮助!
我用那个命令编译程序:
cc pipn.c -o pipn.exe
并且 运行 带有一个 .运行 文件:(Documents 文件夹中的 .c 和 .txt,没有子文件夹)
binPath=/home/bajogh/Documents
#n latNa lonNa latNb lonNb dx dy
${binPath}/pipn.exe 13 85.0 -180.0 0.0 179.5 0.5 0.5
程序如下:
#include <stdio.h>
#include <stdlib.h>
int innerpoint(int n, float *lon, float *lat, float lon0, float lat0)
{
int i, j, c = 0;
for (i = 0, j = n - 1; i < n; j = i++) {
if ((((lat[i] <= lat0) && (lat0 < lat[j])) ||
((lat[j] <= lat0) && (lat0 < lat[i]))) &&
(lon0 < (lon[j] - lon[i]) * (lat0 - lat[i]) / (lat[j] - lat[i]) + lon[i]))
c = !c;
}
return c;
}//pip?=1, pip!=0
int vertex(int n, float *lon, float *lat, float lon0, float lat0)
{
int i, c = 0;
for (i = 0; i < n; i = i++) {
if ((lat[i] == lat0) && (lon[i] == lon0))
c = !c;
}
return c;
} //testpoint is a vertex?
int sidepoint(int n, float *lon, float *lat, float lon0, float lat0)
{
int i, j, c = 0;
for (i = 0, j = n - 1; i < n; j = i++)
{
if (((lat[i] <= lat0) && (lat0 <= lat[j])) || ((lat[j] <= lat0) && (lat0 <= lat[i])))
if (((lon[i] <= lon0) && (lon0 <= lon[j])) || ((lon[j] <= lon0) && (lon0 <= lon[i])))
if ((((lat0 - lat[i])*(lon[j] - lon[i])) - ((lon0 - lon[i])*(lat[j] - lat[i]))) == 0)
c=!c;
}
return c;
}//testpoint is on a side?
int main(int argc, char **argv)
{
FILE *fp,*finout,*fin;
fp = fopen("polygon.txt", "r"); //polygon coordinates, 2 columns: lon lat
finout = fopen("pip_inout.txt", "w");
fin = fopen("pip_in.txt", "w");
float *lon0;
float *lat0;
float *lon;
float *lat;
float dx,dy;
float latNa,lonNa;
float latNb,lonNb;
int nx,ny;
int q,l;
int p,n;
n=atoi(argv[1]);
latNa=atof(argv[2]);
lonNa=atof(argv[3]);
latNb=atof(argv[4]);
lonNb=atof(argv[5]);
dx=atof(argv[6]);
dy=atof(argv[7]);
//polygon -------------------------------------------
//printf("Number of vertices of polygon?\n");
//scanf("%d",&n);
printf("Number of verticies of polygon: %d\n",n);
if((lon=(float *)calloc(n,sizeof(float)))==NULL)
{
printf("can't alloc for lon\n");
fprintf(stderr,"can't alloc for lon\n");
return (3);
}
if((lat=(float *)calloc(n,sizeof(float)))==NULL)
{
printf("can't alloc for lat\n");
fprintf(stderr,"can't alloc for lat\n");
return(3);
}
for (p=0;p<n;p++)
{
fscanf(fp,"%f %f", &lon[p],&lat[p]);
}
for (p=0;p<n;p++)
{
printf("%11.5f %11.5f\n", lon[p],lat[p]);
}
printf("---------------------------------------\n");
//testpoints
nx=((abs(lonNa)+abs(lonNb))/dx)+2;
ny=((abs(latNa)+abs(latNb))/dy)+1;
printf("nx=%d ny=%d\n",nx,ny);
printf("---\n");
if((lon0=(float *)calloc(nx,sizeof(float)))==NULL)
{
fprintf(stderr,"can't alloc for lon0\n");
return(3);
}
if((lat0=(float *)calloc(ny,sizeof(float)))==NULL)
{
fprintf(stderr,"can't alloc for lat0\n");
return(3);
}
for(q=0;q<ny;q++)
{
lat0[q]=latNa-(dy*q);
for(l=0;l<nx;l++)
{
lon0[l]=lonNa+(dx*l);
printf("%f %f\n",lat0[q],lon0[l]);
}
}
printf("----------------------------------------\n");
//START OF THE PROBLEMATIC SECTION
for (q = 0; q<ny; q++)
{
for(l=0;l<nx;l++)
{
if (vertex(n, lon, lat, lon0[l], lat0[q]) == 1)
{printf("%11.5f %11.5f 1\n", lat0[q], lon0[l]);
fprintf(finout,"%11.5f %11.5f 1\n", lat0[q], lon0[l]);
fprintf(fin,"%11.5f %11.5f\n", lat0[q], lon0[l]);}
else
if (sidepoint(n, lon, lat, lon0[l], lat0[q]) == 1)
{printf("%11.5f %11.5f 1\n", lat0[q], lon0[l]);
fprintf(finout,"%11.5f %11.5f 1\n", lat0[q], lon0[l]);
fprintf(fin,"%11.5f %11.5f\n", lat0[q], lon0[l]);}
else
if (innerpoint(n, lon, lat, lon0[l], lat0[q]) == 1)
{printf("%11.5f %11.5f 1\n", lat0[q], lon0[l]);
fprintf(finout,"%11.5f %11.5f 1\n", lat0[q], lon0[l]);
fprintf(fin,"%11.5f %11.5f\n", lat0[q], lon0[l]);}
else
{printf("%11.5f %11.5f 0\n", lat0[q], lon0[l]);
fprintf(finout,"%11.5f %11.5f 0\n", lat0[q], lon0[l]);}
}
}
printf("-------!!!COMPLETED!!!--------\n");
printf("---< In-points in 'pip_in.txt' >---\n");
return 0;
}
在vertex
中:
i = i++
在 C 中是未定义的行为:使用不同的编译器可能会得到不同的结果。
用clang编译立即指出问题:
clang t1.c
t1.c:21:29: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
for (i = 0; i < n; i = i++) {
~ ^
1 warning generated.
您的代码还有其他问题:
- 您测试
malloc
失败,但不测试fopen
或没有足够的命令行参数。 - 你应该使用
double
而不是float
类型。 innerpoint
、vertex
和sidepoint
中的逻辑在我看来是错误的。匹配时切换c
。如果有偶数个匹配项,例如,如果您有空段,这些函数将 return0
。这对于innerpoint
可能是正确的,但对于vertex
. 可能是错误的