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

如何将SDL2重复纹理加载代码重构为DRY风格?C语言问题求助

解决SDL2重复纹理加载代码的封装问题及访问冲突错误

错误根源分析

你当前的代码有两个核心问题导致了读取访问冲突:

  1. 参数传递类型不匹配:调用loadImg时传的是game->star(SDL_Texture*类型),但函数定义要求第一个参数是GameState*,类型完全不匹配,直接触发内存访问错误。
  2. 函数内部逻辑错误:game = SDL_CreateTextureFromSurface(game->renderer, surface);这行代码完全搞错了逻辑——你把创建出来的SDL_Texture*赋值给了局部的GameState*指针,既没修改到结构体里的纹理变量,还混淆了两种指针类型。

正确的封装实现

这里提供两种符合DRY原则的封装方案,任选其一即可:

方案1:返回创建好的纹理指针

这种方式更直观,函数负责加载并返回纹理,调用方直接赋值给结构体变量:

SDL_Texture* loadTexture(GameState* game, const char* fileName) 
{
    SDL_Surface* surface = IMG_Load(fileName);
    if (surface == NULL)
    {
        printf("无法找到文件:%s\n", fileName);
        SDL_Quit();
        exit(1);
    }

    SDL_Texture* texture = SDL_CreateTextureFromSurface(game->renderer, surface);
    SDL_FreeSurface(surface);

    if (texture == NULL) {
        printf("从%s创建纹理失败\n", fileName);
        SDL_Quit();
        exit(1);
    }

    return texture;
}

调用方式:

game->star = loadTexture(game, "./images/star.png");
game->clouds = loadTexture(game, "./images/clouds.png");
game->bridge = loadTexture(game, "./images/bridge.png");

方案2:通过指针的指针修改目标纹理

这种方式直接在函数内部修改结构体里的纹理变量:

void loadTexture(GameState* game, SDL_Texture** destTexture, const char* fileName) 
{
    SDL_Surface* surface = IMG_Load(fileName);
    if (surface == NULL)
    {
        printf("无法找到文件:%s\n", fileName);
        SDL_Quit();
        exit(1);
    }

    *destTexture = SDL_CreateTextureFromSurface(game->renderer, surface);
    SDL_FreeSurface(surface);

    if (*destTexture == NULL) {
        printf("从%s创建纹理失败\n", fileName);
        SDL_Quit();
        exit(1);
    }
}

调用方式:

loadTexture(game, &game->star, "./images/star.png");
loadTexture(game, &game->clouds, "./images/clouds.png");
loadTexture(game, &game->bridge, "./images/bridge.png");

额外注意事项

  • 去掉了原代码中错误的%s.png拼接——你传入的路径已经包含.png后缀,重复拼接会导致错误的文件名提示。
  • 新增了SDL_CreateTextureFromSurface的返回值检查,避免纹理创建失败后后续代码出错。
  • 参数fileName改用const char*,符合C语言中只读字符串的规范。

内容的提问来源于stack exchange,提问作者Daniil Galitskii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:05:29