我有以下程序,我通过读取以下格式的文件来创建二维数组:
(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++ 的实用程序。