【问题标题】:C++ SDL Mixer Mix_Music : incomplete type is not allowedC++ SDL Mixer Mix_Music:不允许不完整的类型
【发布时间】:2011-05-13 02:31:51
【问题描述】:

每当我尝试创建 Mix_Music 实例时,都会收到此错误:“不允许使用不完整类型”。

但是,我需要在调用Mix_LoadMUS(file)之前获取指针音乐的地址;

代码:

Mix_Music *music;

/* I need the memory address here */

music = Mix_LoadMUS(file);

我该怎么做?

【问题讨论】:

  • 1.包括声明 Mix_MusicMix_LoadUS 的头文件。 2.显然你不需要指针音乐的地址;因为您只显示一个函数,它不需要指针的地址。 3.代码可以简化为Mix_Music *music = Mix_loadMUS(file);
  • 你是对的,我没有展示整个代码。关键是我需要将内存地址传递给将在那里加载文件的线程。所以我想将一个空的 Mix_Music 添加到某种列表/地图中,然后将内存地址传递给线程。是否将文件加载到那里取决于线程。它适用于其他类,但我不知道如何使用 Mix_Music。包括标题。
  • “音乐”的地址,即“&music”,和一个空的“Mix_Music”的地址是不同的东西。在调用 Mix_LoadMUS() 之前,"&music" 是 指向无处的指针 的地址。之后“&music”指向一个新分配的struct _Mix_Music的地址。 “Mix_Music mmus;”将在堆栈上分配一个空的 Mix_Music。使用 staticmalloc()new 会将其放在别处。它的地址是“&mmus”;但那是任意Mix_Music 的地址,而不是来自MIX_LoadMUS() 的地址。这不是一个有用的地址,因为 Mix_LoadMUS() 分配了它自己的结构。
  • music 作为数组中的指针,意味着线程需要访问数组及其索引。查看更新的答案;在这里插入太多了。

标签: c++ sdl-mixer incomplete-type


【解决方案1】:

类型不完整

#include "SDL_mixer.h" 应该没问题1,2

如果没有 SDL 包含告诉它那些 SDL 引用(Mix_Musi、Mix_LoadMUS 等)也引用什么,编译器就无法编译与 SDL 相关的代码。请参阅 kekkai.org/roger3 上的 SDL_Mixer 教程,它有一个完整的示例。

1 SDL 包含文件
2 Mix_LOadMUS
3 SDL 教程及完整示例

--

更新:使用音乐项目数组

这是一个示例,说明如何从线程代码中访问指向 Mix_ Music 的特定指针,或在任何与指针分配词法分离的地方多变的。实际的实现可能希望使用动态数组分配,并且需要为文件未找到或加载失败等添加错误处理。

MEnt.h 用于初始化和线程模块的常用 iclude 文件:

#include <cstdlib>
#include "SDL.h"
#include "SDL_mixer.h"

enum { MAXENTRIES=1024 };
struct MEnt{ 
       Mix_Music * music;
       char *filename;
};

extern MEnt Marray[MAXENTRIES];
extern int Mselected;

程序初始化:

#include "MEnt.h"

// Alocate space for array of music items

MEnt Marray[MAXENTRIES]; 
int Mselected=-1;

在线程的代码中,包括:

#include "MEnt.h"
// Return a pointer for the selected music item:
// Allocate new Mix_Music* if not already done,
// otherwise return the already allocated pointer.
Mix_Music *getSelected(){
    Mix_Music *music;

    if(Mselected >= 0 && Mselected < MAXENTRIES){
      struct MEnt &current=Marray[Mselected];
       if(!(music=current.music) &&
                  (current.filename!=NULL))
          music=current.music=
                  Mix_LoadMUS(current.filename);
    }
    return music;
}      

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2019-10-08
    • 2011-08-12
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多