涉及数组的C程序中的分段错误[已关闭]

问题描述 投票:0回答:0

我有以下程序,我通过读取以下格式的文件来创建二维数组:

(181,1) 1.000 79.000 0.410 -2.000 -1.200 2.332 59.036 7.194 129.000 0.398 1.389 59.036 0.097 7.194 129.000 0.398
(182,1) 2.000 79.000 0.430 -2.400 -0.500 2.452 78.232 7.092 131.000 0.417 1.409 78.232 0.105 7.092 131.000 0.417
(183,1) 3.000 79.000 0.420 -2.300 -0.300 2.319 82.569 6.993 133.000 0.409 1.387 82.569 0.096 6.993 133.000 0.409
(184,1) 4.000 79.000 0.420 -2.200 -0.800 2.341 70.017 6.667 137.000 0.409 1.390 70.017 0.097 6.667 137.000 0.409
(185,1) 5.000 79.000 0.400 -1.900 -1.400 2.360 53.616 6.536 140.000 0.388 1.393 53.616 0.099 6.536 140.000 0.388
(186,1) 6.000 79.000 0.370 -1.500 -2.200 2.663 34.287 6.369 143.000 0.350 1.444 34.287 0.121 6.369 143.000 0.350
(187,1) 7.000 79.000 0.330 -1.100 -2.900 3.102 20.772 6.250 146.000 0.291 1.517 20.772 0.156 6.250 146.000 0.291
(188,1) 8.000 79.000 0.280 -0.700 -3.600 3.667 11.004 6.061 155.000 0.189 1.611 11.004 0.207 6.061 155.000 0.189
(189,1) 9.000 79.000 0.230 -0.200 -4.200 4.205 2.726 5.882 163.000 0.000 1.701 2.726 0.230 5.882 163.000 0.000
(190,1) 10.000 79.000 0.180 0.400 -3.800 3.821 353.991 5.714 176.000 0.000 1.637 353.991 0.180 5.714 176.000 0.000
(191,1) 11.000 79.000 0.150 -0.200 -1.800 1.811 6.340 5.747 196.000 0.136 1.302 6.340 0.063 5.747 196.000 0.136

此数组的尺寸为 360x159,总大小为 57240 个元素

在脚本中,我想做的是,当在两个维度上滚动 hs_array[i][j] 时,如果值为 0,那么我们尝试找到数组 hs_array 在所有点 1 点处的最大值远离数组中的原始点 i,j。然后,它使用 hs_array[i][j] 出现最大值的 i,j 位置来查找该位置处其他数组的值。不幸的是,当运行此代码时,我有时会遇到分段错误错误。

下面是我正在使用的程序的片段。

float max(float hs_arr[],int i_arr[],int j_arr[],char* type)
{
        float max;
        int length,i,j;
        int loc_i,loc_j;
        length=sizeof(hs_arr) ;
   
        max=hs_arr[0];
        j=0;
        for (i=0;i<length;i++)
        {
                if(hs_arr[i]>max)
                {
                        max=hs_arr[i];
                        j=i;
                }
        }
        if (strcmp(type,"loc_i")==0)
        {
                loc_i=i_arr[j];
                return loc_i;
        }
        else if (strcmp(type,"loc_j")==0)
        {
                loc_j=j_arr[j];
           
                return loc_j;
        }
        else
        {
                return max;
        }
}



int main(int argc, char *argv[])
{
        FILE    *fp=NULL, *fpraf=NULL;
        float   hs_array[360][250],u_array[360][250],v_array[360][250],wspd_array[360][250],wdir_array[360][250],pswl_array[360][250],dswl_array[360][250],hswl_array[360][250],pwind_array[360][250],dwind_array[360][250],hwind_array[360][250],primper_array[360][250],primdir_array[360][250],primhgt_array[360][250];
        int     i,j,k,vdtg,arrsiz,size, numLat, numLon, numVal, lonCount
        char    inpFname[81], buf[8000];
        float  hs_final,u_final,v_final,wspd_final,wdir_final,pswl_final,dswl_final,hswl_final,pwind_final,dwind_final,hwind_final,primper_final,primdir_final,primhgt_final;
        int     loc_i,loc_j;

    vdtg = atoi(argv[1]);
    startLat = atof(argv[2]);
    endLat = atof(argv[3]);
    startLon = atof(argv[4]);
    endLon = atof(argv[5]);
    interval = atof(argv[6]);


   if ((fp=fopen(inpFname,"rt"))==NULL)
    {
            printf("\nERROR: Cannot open/read input file [%s]\n\n",inpFname);
            exit(1);
    }


    i=-1;
    j=0;
    k=1;
    while(!feof(fp))
    {
            i=i+1;
            fgets(buf,8000,fp);
            sscanf( buf, "%s %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f", points, &lat, &lon, &hs, &u, &v, &wspd, &wdir, &pswl, &dswl, &hswl, &pwind, &dwind, &hwind, &primper, &primdir, &primhgt );
            if (i>lonCount)
            {
                    i=0;
                    j=j+1;
            }
            hs_array[i][j]=hs;
            u_array[i][j]=u;
            v_array[i][j]=v;
            wspd_array[i][j]=wspd;
            wdir_array[i][j]=wdir;
            pswl_array[i][j]=pswl;
            dswl_array[i][j]=dswl;
            hswl_array[i][j]=hswl;
            pwind_array[i][j]=pwind;
            dwind_array[i][j]=dwind;
            hwind_array[i][j]=hwind;
            primper_array[i][j]=primper;
            primdir_array[i][j]=primdir;
            primhgt_array[i][j]=primhgt;


    for (j=0;j<numLat;j++)
    {
            for (i=0;i<numLon;i++)
            {
                    //printf("i is %d j is %d and hs is %0.3f\n",i,j,hs_array[i][j]);
                    if (hs_array[i][j] == 0)
                    {
                            float hs_arr[]={hs_array[i-1][j+1],hs_array[i-1][j],hs_array[i-1][j-1],hs_array[i][j+1],hs_array[i][j-1],hs_array[i+1][j+1],hs_array[i+1][j],hs_array[i+1][j-1]};


                            int i_arr[]={i-1,i-1,i-1,i,i,i+1,i+1,i+1};
                            int j_arr[]={j+1,j,j-1,j+1,j-1,j+1,j,j-1};

                            //printf("i is %d -->array is %d %d %d %d %d\n",i,i_arr[0],i_arr[1],i_arr[2],i_arr[3],i_arr[4]);                                
                            sprintf(type,"val");
                            hs_final=max(hs_arr,i_arr,j_arr,type);

                            sprintf(type,"loc_i");
                            loc_i=max(hs_arr,i_arr,j_arr,type);
                            sprintf(type,"loc_j");
                            loc_j=max(hs_arr,i_arr,j_arr,type);
                            //printf("i is %d and j is %d\n",loc_i,loc_j);
                            u_final=u_array[loc_i][loc_j];
                            v_final=v_array[loc_i][loc_j];
                            wspd_final=wspd_array[loc_i][loc_j];
                            wdir_final=wdir_array[loc_i][loc_j];
                            pswl_final=pswl_array[loc_i][loc_j];
                            dswl_final=dswl_array[loc_i][loc_j];
                            hswl_final=hswl_array[loc_i][loc_j];
                            pwind_final=pwind_array[loc_i][loc_j];

                           dwind_final=dwind_array[loc_i][loc_j];
                            hwind_final=hwind_array[loc_i][loc_j];
                            primper_final=primper_array[loc_i][loc_j];
                            primdir_final=primdir_array[loc_i][loc_j];
                            primhgt_final=primhgt_array[loc_i][loc_j];

                    }
                    else
                    {
                            hs_final=hs_array[i][j];
                            u_final=u_array[i][j];
                            v_final=v_array[i][j];
                            wspd_final=wspd_array[i][j];
                            wdir_final=wdir_array[i][j];
                            pswl_final=pswl_array[i][j];
                            dswl_final=dswl_array[i][j];
                            hswl_final=hswl_array[i][j];
                            pwind_final=pwind_array[i][j];
                            dwind_final=dwind_array[i][j];
                            hwind_final=hwind_array[i][j];
                            primper_final=primper_array[i][j];
                            primdir_final=primdir_array[i][j];
                            primhgt_final=primhgt_array[i][j];
                    }
            }
    }

如何调整代码,以便不再出现分段错误错误。我正在使用 g++ 编译此代码,因为这里有一些依赖于 g++ 的实用程序。

c++ arrays c segmentation-fault
© www.soinside.com 2019 - 2024. All rights reserved.