调用high_score函数时的名称指针问题:所有名称被最新名称覆盖
高分条目名称全部显示为最后一次输入值的问题
运行两次highscore函数后,display_high_score_screen函数可正确显示分数,但所有高分条目的名称均显示为最后一次输入的名称——render_string(displayBuffer, name, 28 + 14 * i, 24)中的name指向同一块内存区域,且无法使用malloc函数解决该问题。
相关代码
struct high_score { char *name; int score; }; void highscore(int *score, uint8_t *displayBuffer, struct high_score *high_score_arr) { uint8_t original_switch = getsw(); char *alphabet_str = " abcdefghijklmnopqrstuvwxyz"; int highScrExit = 0; int first_box_num = 0, second_box_num = 0, third_box_num = 0, fourth_box_num = 0, fifth_box_num = 0, sixth_box_num = 0; int box_num_arr[6] = { first_box_num, second_box_num, third_box_num, fourth_box_num, fifth_box_num, sixth_box_num }; char name_letter_array[8] = { ' ', ' ', ' ', ' ', ' ', ' ', '\0' }; int box_number = 0; while (!highScrExit) { clearBuffer(displayBuffer); uint8_t buttons = getBTNs(); uint8_t switches = getsw(); if (buttons & 0x1) { box_number = (box_number + 1) % 6; delayms(20); } if (buttons & 0x2) { if (box_number > 0) { box_number--; } else { box_number = 5; } delayms(20); } if (buttons & 0x8) { box_num_arr[box_number]++; //Increment the letter for box we're on by one, meaning that [a] will go to [b] name_letter_array[box_number] = alphabet_str[box_num_arr[box_number] % 27]; //change the letter in the name to that letter delayms(20); } if (buttons & 0x4) { if (box_num_arr[box_number] > 0) { box_num_arr[box_number]--; } else if (box_num_arr[box_number] <= 0) { box_num_arr[box_number] = 26; } name_letter_array[box_number] = alphabet_str[box_num_arr[box_number] % 27]; delayms(20); } if ((!(original_switch & 0x8) && switches & 0x8) || ((original_switch & 0x8) && !(switches & 0x8))) { struct high_score player_high_scr = { name_letter_array, *score }; int i; for (i = 4; i >= 0; i--) { if (player_high_scr.score > (&high_score_arr[i])->score){ high_score_arr[i + 1] = high_score_arr[i]; high_score_arr[i] = player_high_scr; } } highScrExit = 1; display_high_score_screen(displayBuffer, high_score_arr); } render_triangle(displayBuffer, 52, 28 - 4 * box_number); int j; render_switch(displayBuffer, 80, 28); render_string(displayBuffer, "save ", 80, 20); //For loop not working for some reason? It's ugly but works render_button(displayBuffer, 80 + 9, 28); render_string(displayBuffer, "up ", 80 + 9, 20); render_button(displayBuffer, 80 + 9+9, 28); render_string(displayBuffer, "down ", 80 + 9+9, 20); render_button(displayBuffer, 80 + 9+9+9, 28); render_string(displayBuffer, "left ", 80 + 9+9+9, 20); render_button(displayBuffer, 80 + 9+9+9+9, 28); render_string(displayBuffer, "right ", 80 + 9+9+9+9, 20); render_string(displayBuffer, "score ", 5, 25); render_string(displayBuffer, "enter ", 28, 26); render_string(displayBuffer, "name ", 35, 24); render_string(displayBuffer, name_letter_array, 45, 28); render_score(displayBuffer, score, 15, 20); displayUpdate(displayBuffer); } } void display_high_score_screen(uint8_t *displayBuffer, struct high_score *high_score_arr) { int mainMenuExit = 0; while (!mainMenuExit) { clearBuffer(displayBuffer); uint8_t buttons = getBTNs(); if (buttons & 0x8) { mainMenuExit = 1; delayms(30); } int i; render_string(displayBuffer, "top ", 5, 22); render_string(displayBuffer, "scores ", 12, 25); render_button(displayBuffer, 100, 28); render_string(displayBuffer, "quit ", 100, 20); for (i = 0; i < 5; i++) { int number = i + 1; char* name = (&high_score_arr[i])->name; int score = (&high_score_arr[i])->score; render_score(displayBuffer, &number, 28 + 14 * i, 30); if (*name != '\0' && score != -1) { render_string(displayBuffer, name, 28 + 14 * i, 24); render_score(displayBuffer, &score, 35 + 14 * i, 18); } } displayUpdate(displayBuffer); } } //Call the high_score function like this: if (gameOver) { int j; for (j = 0; j < 5; j++) { if (score > (&high_score_arr[j])->score) { j = 5; highscore(&score, displayBuffer, high_score_arr); } } //This is the part of the code that assigns name: struct high_score player_high_scr = { name_letter_array, *score }; int i; for (i = 4; i >= 0; i--) { if (player_high_scr.score > (&high_score_arr[i])->score) { high_score_arr[i+1] = high_score_arr[i]; high_score_arr[i] = player_high_scr; } } highScrExit = 1; display_high_score_screen(displayBuffer, high_score_arr); //I should point out that this is how I initialize the array: void init_high_scr_arr() { int i; char *null; *null = '\0'; for (i = 0; i < 5; i++) { high_score_arr[i].name = null; high_score_arr[i].score = -1; } }
已尝试的无效方案
- 让
highscore函数返回high_score结构体 - 将
high_score.name改为数组 - 使用全局变量存储结果
以上方案均未解决问题,所有高分条目的名称仍与最后一次输入的一致。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

