user-0 提问: 求助 关于二维数组赋值

回复:
user: user-0
content: 引用 9 楼 gzwgyfgpf 的回复:这个内层循环好像有问题，赋值和输出不是一样的肯定输出是0，我把两个语句的顺序改了一下 for(i=0;i<=xdim;i=i+3) {  u[o][p]=use[i][j];  printf("%f\n",u[o][p]); o++;  } 真是，我2了，非常感谢！

user: user-1
content: 这个内层循环好像有问题，赋值和输出不是一样的肯定输出是0，我把两个语句的顺序改了一下 for(i=0;i<=xdim;i=i+3) {  u[o][p]=use[i][j];  printf("%f\n",u[o][p]); o++;  }

user: user-0
content: #include <stdio.h> #include <string.h> //#include <process.h>  //#include <direct.h>    #include "WeatherSys.h"		// 天气系统数据结构，详见系统功能规格需求书   	float lon[600][600],lat[600][600]; 	float u[600][600],v[600][600],field[600][600],filtered[600][600];     float use[1500][1500];//???????????? 	int divided[600][600]; 	int divided1[600][600];  	float grid_interval_m; 	int weather_system_number; 	WEATHER_SYSTEM_ATTRIBUTES wsa[WEATHER_MAX];  	int make_grid_latlon(int xdim,int ydim,float lon1,float lat1,float lon2,float lat2,float lon3,float lat3,float iso2); 	void do_gradient(int xdim,int ydim,int skip_grid); 	void do_div_dir(int xdim,int ydim,int skip_grid); 	void do_vor_dir(int xdim,int ydim,int skip_grid);      	int do_filter(int xdim,int ydim,int skip_grid,int critical_radius,int influence_radius); 	int do_divide(int xdim,int ydim,int skip_grid,int plan,int arithmatic,float upper_thresh,float lower_tresh, 	float min_tresh,float thresh_interval,int area_arith,float area_thresh,float min_intensity,float max_border); 	int do_measurement(int xdim,int ydim,int skip_grid,int area_arith,int center_arith,int extreme_center_arith, 	int center_line_arith,int width_arith,int length_arith,float trough_tresh); 	void output_weather(char *filename,char *data_name);  	int data_type,yy,mm,dd,hh,sx,level,xdim,ydim; 	float lon3,lat3,lon1,lon2,lat1,lat2,jg,iso1,iso2,ph,jc; 	char elementname[40],filename[200],preprocess_code[20],output_file[200]; 	int map_project,field_model;     char filter_file[100]; 	char divide_file[100]; 	char weather_file[100]; 	char out_path[] =  "e:\\data\\out\\";  	 	 main() { 	FILE *fp,*fc,*fs;  	int element_number,i,j,k,o,p; 	char string[200],data_name[40]; 	int skip_grid,critical_radius,influence_radius; 	int plan,arithmatic; 	float upper_thresh,lower_thresh,min_thresh,thresh_interval,area_thresh,min_intensity,max_border; 	int area_arith,center_arith,ex_center_arith,center_line_arith,width_arith,length_arith; 	float trough_tresh;     char buff[100];  	char in_path[100];             fs = fopen("e:\\test.txt", "rw");//读取所有文件名    //strcpy(out_path,"e:\\data\\out\\");//指定输出文件路径        while(fgets(filename, 100, fs) != NULL)//当还有文件未处理    {    	   filename[strlen(filename)-1]='\0'; 	   printf("%s\n",filename);//循环获取要处理的文件名      ////////////////////////////////////////////////////////////////////////////////////////     //	读天气系统识别参数。各参数意义详见系统功能规格需求书 	if((fp=fopen("element.cfg","r"))==NULL) { 		printf("Can't open configure file element.cfg!\n"); 		return -1; 	} 	fscanf(fp,"%d",&element_number);	// 读要素数 	for(i=0;i<element_number;i++) { 		fscanf(fp,"%s%s%d%d%d",elementname,preprocess_code,&skip_grid,&critical_radius, 			&influence_radius);		// 读预处理参数：要素名   预处理代码  尺度跳点  滤波临界半径 滤波影响半径 		fscanf(fp,"%d%d%f%f%f%f%f%f%f",&plan,&arithmatic,&upper_thresh,&lower_thresh,	// 读划分参数 			&min_thresh,&thresh_interval,&area_thresh,&min_intensity,&max_border); //  划分算法规划  划分算法  上界阈值  下界阈值  最低阈值  阈值间隔  面积阈值 强度阈值 边界点阈值 		fscanf(fp,"%d%d%d%d%d%d%f",&area_arith,¢er_arith,&ex_center_arith,¢er_line_arith, 			&width_arith,&length_arith,&trough_tresh);		// 读测量参数 //  面积算法  几何中心算法  极值中心算法 中心线算法 区域宽度算法 区域长度算法 槽脊纵横比阈值  //	读数据文件 		 		strcpy(in_path,"e:\\data\\div 1km\\"); 	    strcat(in_path,filename);   //指定文件源路径 		if((fc=fopen(in_path,"r"))==NULL) { 			printf("Can't open data file %s!\n",filename); 			return -1;  		} 		fscanf(fc,"%s%d%s",string,&data_type,data_name);//get the first the line    		if(strcmp(string,"diamond")!=0) { 			printf("Data file %s is not a MICAPS data!\n",filename); 			fclose(fc); 			return -1; 		} 		if(data_type!=4 && data_type!=11) {		// 数据必须是 MICAPS4 或 MICAPS11 格式的网格点数据 			printf("data file %s is not a network data!\n",filename); 			fclose(fc); 			return -1; 		} 		if(data_type==4) { 			fscanf(fc,"%d%d%d%d%d%d",&yy,&mm,&dd,&hh,&sx,&level); 			fscanf(fc,"%f%f%f%f%f%f",&lon3,&lat3,&lon1,&lon2,&lat1,&lat2); 			fscanf(fc,"%d%d",&xdim,&ydim);//gird rule 			fscanf(fc,"%f%f%f%f%f",&jg,&iso1,&iso2,&ph,&jc);  			if (xdim<1000)//if 3KM ///////////////////////////////////////////////////////// 			{ 			for(j=0;j<ydim;j++)  			{ 				for(i=0;i<xdim;i++) 				{ 					fscanf(fc,"%f",&u[i][j]);  					printf("%f\n",u[i][j]); 				     				} 			} 			fclose(fc); 			}              			else if (xdim>=1000)//if 1KM ////////////////////////////////////////////////////////// 			{ 			 			//printf("%d\n",xdim); 			for(j=0;j<ydim;j++) { 				for(i=0;i<xdim;i++) fscanf(fc,"%f",&use[i][j]);   				} 			fclose(fc); 			//fill the u[][] 			p=0;             for(j=0;j<=ydim;j=j+3){ 				o=0; 				for(i=0;i<=xdim;i=i+3) {   					u[o][p]=use[i][j];  					o++;  					printf("%f\n",u[o][p]); 			}  				p++;  			 			}  			}         				printf("No pre-process!\n"); 				for(j=0;j<ydim;j++) 				{ 					for(i=0;i<xdim;i++) 					{ 						field[i][j]=u[i][j]; 					}//if get 3km data,adjust the i&j. 				} 			} 		}     完整代码过长，截取了声明部分和这个函数，后面的没放上来，谢谢

user: user-2
content: 看下完整代码

user: user-0
content: 引用 5 楼 zhangxiangDavaid 的回复:[quote=引用 4 楼 tdvb_123 的回复:] [quote=引用 2 楼 zhangxiangDavaid 的回复:]  	//取第0、3、6……行的数据 	o = 0; 	for (i = 0; i <= ydim; i += 3) { 		for (j = 0; j <= ydim; j++) {   //不用跳列吧 			u[o][p] = use[i][j]; 			printf("%f\n", u[o][p]); 			p++; 		} 		o++; 	}  谢谢您的回复， 行列都跳，而且按照您的程序，u数组依然是0，还有一个问题，就是u数组定义的是全局变量，如果把use定义成局部的，程序就会报UNKNOW SOFTWARE EXCEPTION的错误，不知道能否帮我解答一下，谢谢。[/quote] 列也跳。那就是j+=3; u怎么会依然是0呢？ u[o][p] = use[i][j]; printf("%f\n", u[o][p]); 那说明use[i][j]也是0[/quote]  我不解的就在这里，打印use数组时输出的是正确的内容，但是u数组时就全部都是0，并且如果我把两个数组全部定义成全局变量时不报错，但当一个全局，一个局部时，编译过，运行时直接跳出

user: user-2
content: 引用 4 楼 tdvb_123 的回复:[quote=引用 2 楼 zhangxiangDavaid 的回复:]  	//取第0、3、6……行的数据 	o = 0; 	for (i = 0; i <= ydim; i += 3) { 		for (j = 0; j <= ydim; j++) {   //不用跳列吧 			u[o][p] = use[i][j]; 			printf("%f\n", u[o][p]); 			p++; 		} 		o++; 	}  谢谢您的回复， 行列都跳，而且按照您的程序，u数组依然是0，还有一个问题，就是u数组定义的是全局变量，如果把use定义成局部的，程序就会报UNKNOW SOFTWARE EXCEPTION的错误，不知道能否帮我解答一下，谢谢。[/quote] 列也跳。那就是j+=3; u怎么会依然是0呢？ u[o][p] = use[i][j]; printf("%f\n", u[o][p]); 那说明use[i][j]也是0

user: user-0
content: 引用 2 楼 zhangxiangDavaid 的回复: 	//取第0、3、6……行的数据 	o = 0; 	for (i = 0; i <= ydim; i += 3) { 		for (j = 0; j <= ydim; j++) {   //不用跳列吧 			u[o][p] = use[i][j]; 			printf("%f\n", u[o][p]); 			p++; 		} 		o++; 	}  谢谢您的回复， 行列都跳，而且按照您的程序，u数组依然是0，还有一个问题，就是u数组定义的是全局变量，如果把use定义成局部的，程序就会报UNKNOW SOFTWARE EXCEPTION的错误，不知道能否帮我解答一下，谢谢。

user: user-2
content: 有bug； 加一行：  	//取第0、3、6……行的数据 	o = 0; 	for (i = 0; i <= ydim; i += 3) { 		p = 0;    //加一行 		for (j = 0; j <= ydim; j++) {   //不用跳列吧 			u[o][p] = use[i][j]; 			printf("%f\n", u[o][p]); 			p++; 		} 		o++; 	}

user: user-2
content: //取第0、3、6……行的数据 	o = 0; 	for (i = 0; i <= ydim; i += 3) { 		for (j = 0; j <= ydim; j++) {   //不用跳列吧 			u[o][p] = use[i][j]; 			printf("%f\n", u[o][p]); 			p++; 		} 		o++; 	}

user: user-0
content: for(j=0;j<ydim;j++) { 				for(i=0;i<xdim;i++) fscanf(fc,"%f",&use[i][j]);   				} 			fclose(fc); 			//fill the u[][] 			p=0;             for(j=0;j<=ydim;j=j+3){ 				o=0; 				for(i=0;i<=xdim;i=i+3) {   					u[o][p]=use[i][j];  					o++;  					printf("%f\n",u[o][p]); 			}  				p++;  			 			}