做游戏测试写入数组发现数据错误,捯饬半天,想起来二维数组的指针列表故事,尝试重新复制列表
然后打印列表地址,发现除了数组越界 /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*)↦
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++;
}
}
}