多线程 二维数组 需要装箱

 

做游戏测试写入数组发现数据错误,捯饬半天,想起来二维数组的指针列表故事,尝试重新复制列表

然后打印列表地址,发现除了数组越界 /500 %499 而不是 /500 %500  /499 %499

然后测试不同结构体嵌套,直接 int* map 发现都可以。

 

 

装箱原理:

 int** map=new int*[500];

for(){

map[i]=m->map[i]

}

map[i][j]

 

#include <raylib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <pthread.h>
typedef struct target{
	int* map;
	int x;
	int** mapv3;
}target;
typedef struct message {
	int flag;
	int a;
	int user;
	void* work;
	int* map;
	// 测试void 类型转换会不会丢失信息
	// 二级指针丢失信息
	int** mapv2;			
	target* p;	
	void* workv2;
} message;


void* showv2(void* msg) {
	
	static int cnt = 0;
	static int color = 1;
	message* m = (message*)msg;
	
	//成功	
//	target* p = (target*)m->work;
	// 也成功
	target* p = (target*)m->workv2;
//	二维数组失效
//	int** meshmap = (int**)m->work;
	
	
	// 一维数组测试
//	int* map =(int*)(*m).work;
//	int* map = m->map;
	int* map = p->map;
	
	int** mapv2=m->mapv2;
	
	
	// 原来需要存储数据
	int** mapv3 =new int*[500];
	
	
	
	printf("sizeof m->mapv2 %d\n",sizeof(m->mapv2));
	printf("address m->mapv2 %p\n",m->mapv2);
	printf("address m->mapv2[499] %p\n",m->mapv2[499]);
	printf("address m->mapv2[499][499] %p\n",m->mapv2[499][499]);
	
	
//	for(int i=0;i<500;i++){
//		for(int j=0;j<500;j++){
//			printf("%p\n",m->mapv2[i][j]);
//		}
//		
//	}
	
//	for(int i=0;i<500;i++){
//		mapv2[i]=m->mapv2[i];
//	}
	
	
	// 发现要装箱,这是成功的测试
	for(int i=0;i<500;i++){
//		mapv3[i]=(int*)m->mapv2[i];
		// 测试敌人数组转换,发现成功
		mapv3[i]=(int*)p->mapv3[i];
//		printf("%d %p\n",i,mapv3[i]);
	}
	
	
	
//	for(int i=0;i<500;i++){
//		for(int j=0;j<500;j++){
			mapv2[i][j]=m->mapv2[i][j];
//			mapv3[i][j]=m->mapv2[i][j];
//		}
//	}
	
	
	while (1) {
		while (m->flag == 0 || m->a == 1) {
//			_sleep(1);
//			_sleep(0);
			// 休眠一毫秒其实有很大误差
			_sleep(1);
//			printf("B 发现占用中 %d %d %d %d %d\n", m->a, m->user, m->flag, cnt, color);
		}
		m->a = 1;
		m->user = 1;
//		printf("B 占用中\n");
		
		for (int p = 0; p < 1500; p++) {
			cnt += 1;
			if (cnt >= 500 * 500) {
				cnt = 0;
				color += 1;
			}
//			map[cnt] = color;
//			mapv2[cnt/499][cnt%499]=color;
//			mapv3[cnt/499][cnt%499]=color;
			mapv3[cnt/500][cnt%499]=color;
//			printf("%d\n", cnt);
		}
		
//		printf("%d %d\n", cnt, color);
		
//		printf("B 释放占用\n");
		m->a = 0;
		_sleep(30);
	}
}


int main() {
	
	InitWindow(500, 500, "okk");
	
	RenderTexture mesh = LoadRenderTexture(500, 500);
	BeginTextureMode(mesh);
	ClearBackground(WHITE);
	EndTextureMode();
	
	
	message msg;
	msg.a = 0;
	msg.flag = 0;
	msg.user = -1;
	
	int*map = new int[500 * 500];
	for (int i = 0; i < 500 * 500; i++) {
		map[i] = 0;
	}
	
	int* oldmap = new int[500 * 500];
	for (int i = 0; i < 500 * 500; i++) {
		oldmap[i] = 0;
	}
	
	
	
	int** mapv3 = new int*[500];
	for(int i=0;i<500;i++){
		mapv3[i]=new int[500];
	}
	
	
	
	
	msg.work = (void*)&map;
	msg.map = map;
	target* enemy = new target();
	
	enemy->map = map;
	enemy->mapv3=mapv3;
	
	msg.workv2=(void*)enemy;
	
	msg.mapv2=mapv3;
	printf("address map[][] %p\n",mapv3);
	printf("address map[499][] %p\n",mapv3[499]);
	printf("address map[499][499] %p\n",mapv3[499][499]);
	printf("address map[499][498] %p\n",mapv3[499][498]);
	
	
	
	
	
	pthread_t p;
	pthread_create(&p, NULL, showv2, (void*)&msg);
	
	
	_sleep(1000);
	
	
	int i = 0;
	int j = 0;
	int cnt = 0;
	int color = 1;
	int pv2 = 0;
	SetTargetFPS(160);
	
	while (1) {
		while (msg.a == 1) {
//			printf("C 发现占用中%d\n", msg.user);
			_sleep(10);
		}
		msg.a = 1;
		msg.user = 999;
//		printf("C 占用中\n");
		BeginTextureMode(mesh);
		
		for (int i = 0; i < 500 * 500; i++) {
//			if (oldmap[i] != map[i]) {
//			if (oldmap[i] == map[i]) {
//				
//			} else {
//				DrawPixel(i % 500, i / 500, {map[i] * 10 % 255, map[i] * 50 % 255, map[i] * 30 % 255, 255});
//			}
//			DrawPixel(i % 500, i / 500, {mapv3[i/499][i%499] * 10 % 255, mapv3[i/499][i%499] * 50 % 255, mapv3[i/499][i%499] * 30 % 255, 255});
			DrawPixel(i % 499, i / 500, {mapv3[i/500][i%499] * 10 % 255, mapv3[i/500][i%499] * 50 % 255, mapv3[i/500][i%499] * 30 % 255, 255});
			
		}
		EndTextureMode();
		
		msg.a = 0;
//		printf("C 释放\n");
		BeginDrawing();
		DrawTexturePro(mesh.texture, {0, 0, 500, 500}, {0, 0, 500, 500}, {0, 0}, 0, WHITE);
		DrawTexture(mesh.texture, 0, 0, WHITE);
		
		DrawText(TextFormat("fps %d", GetFPS()), 20, 30, 50, {155, 50, 210, 255});
		EndDrawing();
		
		
		static int flag = 0;
		if (flag > 30) {
			flag = 300;
			msg.flag = 1;
		} else {
			flag++;
		}
	}
	
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值