当前位置: 首页 > news >正文

多线程 二维数组 需要装箱

 

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

然后打印列表地址,发现除了数组越界 /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++;}}}


http://www.mrgr.cn/news/27252.html

相关文章:

  • leetcode hot100刷题【持续更新】
  • 使用cmake时,生成的makefile的作用是什么?
  • JVM 调优篇7 调优案例2-元空间的优化解决
  • 第十一章 【后端】商品分类管理微服务(11.1)——创建父工程
  • Android应用性能优化
  • Java Exception 异常相关总结
  • 音视频开发常见的开源项目汇总
  • uniapp中使用picker-view选择时间
  • Linux vi常用命令
  • JavaScript性能:使网站快速响应
  • LeetCode题练习与总结:基本计算器 Ⅱ--227
  • 语言的布尔类型
  • leetcode 难度【简单模式】标签【数据库】题型整理大全
  • OpenCV-Python笔记(上)
  • 中间件之RocketMQ
  • Python Logging 限制文件大小
  • 2024年汉字小达人区级自由报名备考冲刺:往年真题练一练
  • [数据集][目标检测]疟疾恶性疟原虫物种目标检测数据集VOC+YOLO格式948张1类别
  • 【洛谷】P2880 [USACO07JAN] Balanced Lineup G 的题解
  • C++学习笔记----7、使用类与对象获得高性能(一)---- 书写类(3)