C++ 从 ‘char*’ 到 ‘unsigned char*’ 的无效转换?

标签 c++ types casting

我有一个在树莓派中播放音频的代码。我的编译器是 GCC。

编译代码时出现错误:

invalid conversion from ‘char*’ to ‘unsigned char*’.

错误是在调用 ao_play(dev, buffer, done); 时触发的。

我该如何解决?我知道问题出在类型转换上。但是我如何才能在提到的行中转换? (ao_play(dev, buffer, done);)

/*
# install libraries :
sudo apt-get install libmpg123-dev
sudo apt-get install libao-dev

gcc -O2 -o mp3_cpp_audio mp3_cpp_audio.cpp -lmpg123 -lao

./mp3_cpp_audio /var/www/html/mp3_cpp_audio.mp3
*/

#include <ao/ao.h>
#include <mpg123.h>

#define BITS 8


int main(int argc, char *argv[]){
    mpg123_handle *mh;
    unsigned char *buffer;
    size_t buffer_size;
    size_t done;
    int err;

    int driver;
    ao_device *dev;

    ao_sample_format format;
    int channels, encoding;
    long rate;

    if(argc < 2)
        exit(0);

    /* initializations */
    ao_initialize();
    driver = ao_default_driver_id();
    mpg123_init();
    mh = mpg123_new(NULL, &err);
    buffer_size = mpg123_outblock(mh);
    buffer = (unsigned char*) malloc(buffer_size * sizeof(unsigned char));

    /* open the file and get the decoding format */
    mpg123_open(mh, argv[1]);
    mpg123_getformat(mh, &rate, &channels, &encoding);

    /* set the output format and open the output device */
    format.bits = mpg123_encsize(encoding) * BITS;
    format.rate = rate;
    format.channels = channels;
    format.byte_format = AO_FMT_NATIVE;
    format.matrix = 0;
    dev = ao_open_live(driver, &format, NULL);

    /* decode and play */
    while (mpg123_read(mh, buffer, buffer_size, &done) == MPG123_OK)
        ao_play(dev, buffer, done);  // error belong to this line : invalid conversion from ‘char*’ to ‘unsigned char*’

    /* clean up */
    free(buffer);
    ao_close(dev);
    mpg123_close(mh);
    mpg123_delete(mh);
    mpg123_exit();
    ao_shutdown();

    return 0;
}

最佳答案

这是在 Xiph 上给出的原型(prototype):

int ao_play(ao_device *device, char *output_samples, uint_32 num_bytes);

这表明buffer应该是 char* ,不是 unsigned char* .

现在的问题是 mpg123表示对 mpg123_read 的调用需要 unsigned char* :

int     mpg123_read (mpg123_handle *mh, unsigned char *outmemory, size_t outmemsize, size_t *done)

根据 basic.lval , 从 char* 转换是安全的/不是未定义的行为至 unsigned char* , 所以通过 reinterpret_cast<char*>(buffer)ao_play而不是普通的 buffer .

关于C++ 从 ‘char*’ 到 ‘unsigned char*’ 的无效转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53790518/

相关文章:

c# - IsAssignableFrom 与 COM

c++ - 为什么 std::numeric_limits::is_integer 对于 volatile 类型是假的?

c++ - 如何根据 STL 列表中的元素数量分配内存?

html - 为什么 textarea 不是输入 [type ="textarea"]?

java - 转换为通用变量

c - 函数参数和参数中的隐式指针转换

c++ - Qt 5.3 信号和槽、简单函数和 Lambda 表达式

c++ - 错误 LNK2005 : "already defined in SkinHeaderCtrl.obj"

vba - $符号在VBA中有什么作用?

vba - 为什么要在 VBA 类模块中声明新类型?