目次 - API(機能別) - ファイル入出力 - SDL_AllocRW

SDL_AllocRW

実装のない空のSDL_RWopsを確保する

構文

SDL_RWops* SDL_AllocRW(void)

戻り値

成功のとき確保したメモリへのポインタ, 失敗のときNULLを戻す. SDL_GetError()で詳細を知ることができる.

サンプルコード

#include 
#include "SDL.h"

/* これらの関数はSDL_RWops内のポインタ以外で使ってはならない */
static Sint64 mysizefunc(SDL_RWops * context)
{
    return -1;
}

static Sint64 myseekfunc(SDL_RWops *context, Sint64 offset, int whence)
{
    return SDL_SetError("この種類のSDL_RWopsはシークできない");
}

static size_t myreadfunc(SDL_RWops *context, void *ptr, size_t size, size_t maxnum)
{
    SDL_memset(ptr,0,size*maxnum);
    return maxnum;
}

static size_t mywritefunc(SDL_RWops *context, const void *ptr, size_t size, size_t num)
{
    return num;
}

static int myclosefunc(SDL_RWops *context)
{
    if(context->type != 0xdeadbeef) {
        return SDL_SetError("myclosefunc()で処理できない不正なSDL_RWops");
    }

    free(context->hidden.unknown.data1);
    SDL_FreeRW(context);
    return 0;
}

SDL_RWops *MyCustomRWop(void)
{
    SDL_RWops *c=SDL_AllocRW();
    if(c==NULL) return NULL;

    c->size = mysizefunc;
    c->seek = myseekfunc;
    c->read = myreadfunc;
    c->write= mywritefunc;
    c->close= myclosefunc;
    c->type = 0xdeadbeef;
    c->hidden.unknown.data1 = malloc(256);
    return c;
}

詳細

自分でSDL_RWopsの実装を提供するのでなければ, この関数を使う必要はない. 単に共通のデータ元の読込/書込を行うSDL_RWopsが必要なのであれば, SDL_RWFromFile()SDL_RWFromMem()などのSDLに組み込まれた実装を使うべきである.

戻り値のポインタはSDL_FreeRW()で解放するべきである. あなたのプログラムが使うmalloc()/free()と, SDLが内部で使うmalloc()/free()は, OSやコンパイラによる違いがあるかもしれない. これらを混合して使うとセグメンテーション違反などのエラーを引き起こす可能性がある. SDL_RWopsはcloseメソッドが呼ばれたとき自分自身を解放しなければならない. 全てのSDL_RWopsはこの関数で確保するべきである. そうすれば, SDL_FreeRW()で正しく解放できる.

バージョン

SDL 2.0.0以降

関連項目(関数)

SDL_FreeRW

SDL Wikiへのリンク

SDL_AllocRW - SDL Wiki