【发布时间】:2015-02-22 10:26:56
【问题描述】:
我有一个奇怪的问题。我为多边形中的点 (pip) 问题编写了一个 C 程序,当我编写它时,我使用 Elementary OS。该程序运行得非常好。然后我不得不切换到 Ubuntu 14.04 LTS,因为我无法在 Elementary OS Luna 上安装 netCdf。我将 pip 程序复制到新系统中,我想运行它。我编译了程序(没有错误),然后运行它。该程序在到达包含函数的“for”循环时运行良好。当它到达它们时,程序没有写入错误消息,它运行得更远(CPU:100%)并且没有自行停止。
我不明白问题出在哪里。有一个程序可以在一个操作系统上完美运行,而在另一个操作系统上运行得不好。我没有更改程序中的任何内容。而且我还尝试制作一个新的 .c 文件,在其中复制了程序,但它产生了同样的问题。
有人有想法吗?感谢您的帮助!
我用那个命令编译程序:
cc pipn.c -o pipn.exe
并使用 .run 文件运行:(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;
}
【问题讨论】:
-
所以您希望我们为您构建并在调试器中运行它?你不应该在发帖之前尝试一下吗?
-
抱歉,我是 C 编程新手。我不知道这些调试器选项。但是我尝试了很多不同的方法来解决我的问题,但我失败了。对不起,如果打扰到你。我从 ouah 那里得到了答案,它解决了我的问题。在那之后我很惭愧我没有认出它。
-
不完全是“以前完美的 C 程序”。需要修复错误,但不足以使其成为这样。
标签: c ubuntu compilation execution