You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:49:50