目次 - 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