【问题标题】:Previously perfect C program doesn't run after compiling on Ubuntu [closed]以前完美的 C 程序在 Ubuntu 上编译后无法运行 [关闭]
【发布时间】: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


【解决方案1】:

vertex:

i = i++

在 C 中是未定义的行为:使用不同的编译器可能会得到不同的结果。

【讨论】:

  • 非常感谢,它解决了我的问题。我不知道为什么我没有认出它......
  • @Bajogh 不客气!
【解决方案2】:

用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。如果匹配数为偶数,例如如果您有空段,这些函数将返回 0。这对于innerpoint 可能是正确的,但对于vertex 可能是错误的。

【讨论】:

    猜你喜欢
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2019-11-06
    • 2021-06-12
    • 2012-02-10
    • 2022-06-15
    相关资源
    最近更新 更多