以前完美的 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 类型。
  • innerpointvertexsidepoint 中的逻辑在我看来是错误的。匹配时切换 c。如果有偶数个匹配项,例如,如果您有空段,这些函数将 return 0。这对于 innerpoint 可能是正确的,但对于 vertex.
  • 可能是错误的