2013-09-22 117 views
0

脚本的第一部分必须从文本文件中读取风数据。文件的第一个数字是行的数量,每行包含6个数据:latitud,longitude,height ,模块,高程和方位角。当我在调试模式下在VC++上运行我的脚本时,我注意到dat不是wind_dat的矢量,而只是一个* wind_dat *的类型元素。但是,如果我插入的断点周期的fscanf我敢肯定,所有的变量都读,但不能保存在DAT,只有第一排..结构指针的问题

我在这里发布的相关代码我脚本:

typedef struct wind { 
double xlat; 
double ylong; 
double zheight; 
double mod; 
double elev; 
double az;} wind_dat; 

static wind_dat * dataprocess(const char *, int*); 
static void pol2cart(double *, double, double, double); 

wind_dat  *dat; 
int   num; 


int main(int argc, char **argv) 
{ 

dat=dataprocess(filename,&num); 
... 
} 

static wind_dat* dataprocess (const char *filename, int *num) 
{ 
int it; 
double coord[3], obs_cart[3], a[3][3]; 
FILE *ptrfile; 

if ((fopen_s(&ptrfile,filename, "r"))!=0) 
{printf("\nError while opening file.\n"); 
exit(EXIT_FAILURE);} 
fscanf_s(ptrfile,"%d",num); 

if ((dat=(wind_dat*)malloc((*num)*sizeof(wind_dat)))==NULL) 
    exit(EXIT_FAILURE); 

pol2cart(obs_cart,obs[0],obs[1],obs[2]+6371000); 
a[0][0]=cos(az)*cos(obs[1]+PI)+sin(az)*sin(PI+obs[1])*cos(PI-obs[0]); 
a[0][1]=cos(az)*sin(obs[1]+PI)-sin(az)*cos(obs[1]+PI)*cos(PI-obs[0]); 
a[0][2]=-sin(az)*sin(PI-obs[0]); 
a[1][0]=sin(az)*cos(obs[1]+PI)-cos(az)*sin(obs[1]+PI)*cos(PI-obs[0]); 
a[1][1]=sin(az)*sin(obs[1]+PI)+cos(az)*cos(obs[1]+PI)*cos(PI-obs[0]); 
a[1][2]=cos(az)*sin(PI-obs[0]); 
a[2][0]=sin(obs[1]+PI)*sin(PI-obs[0]); 
a[2][1]=-sin(PI-obs[0])*cos(obs[1]+PI); 
a[2][2]=cos(PI-obs[0]); 
for (it=0;it<(*num);it++) 
    {fscanf_s(ptrfile,"%lf %lf %lf %lf %lf %lf",&dat[it].xlat, &dat[it].ylong, &dat[it].zheight, &dat[it].mod, &dat[it].elev, &dat[it].az); 

    pol2cart(coord, dat[it].xlat, dat[it].ylong, dat[it].zheight+6371000); 
    coord[0]=coord[0]-obs_cart[0]; 
    coord[1]=coord[1]-obs_cart[1]; 
    coord[2]=coord[2]-obs_cart[2]; 
    dat[it].xlat = coord[0]*a[0][0]+coord[1]*a[0][1]+coord[2]*a[0][2]; 
    dat[it].ylong = coord[0]*a[1][0]+coord[1]*a[1][1]+coord[2]*a[1][2]; 
    dat[it].zheight=coord[0]*a[2][0]+coord[1]*a[2][1]+coord[2]*a[2][2]; 
    dat[it].az=dat[it].az-az/PI*180; 
    dat[it].mod=dat[it].mod*arrow_factor; 
    } 
fclose(ptrfile); 
return(dat); 
} 

static void pol2cart(double *dat, double x, double y, double z) 
{ 

dat[0]=z*cos(x*180/PI)*cos(y*180/PI); 
dat[1]=z*cos(x*180/PI)*sin(y*180/PI); 
dat[2]=z*sin(x*180/PI); 
} 
+0

请添加适当的语言标签,[C]或[C++]。那么你可能会获得更多的关注。 – dyp

回答

0

在监视窗口,类型dat,100看到阵列的第一100个元素dat点。

调试器无法从变量声明中知道dat实际上指向多个对象。所以它需要一个提示。