小编McB*_*Bob的帖子

如何正确内联静态库

我正在重写我的一个小C数学库,它最终会成为用户的静态库,并希望从我的矢量数学界面的内联中受益.

我有以下内容:

[mymath.h]

...
...
extern float clampf( float v, float min, float max );
...
...
Run Code Online (Sandbox Code Playgroud)

[mymath.c]

inline float clampf( float v, float min, float max )
{
    if( v < min ) v = min;
    if( v > max ) v = max;

   return v;
}
Run Code Online (Sandbox Code Playgroud)

由于我的库是静态的,我只是要向用户提供.h(和.lib),clampf在编译时是否会在程序中内联函数?

我做了正确的事情,但在声明函数extern.h中和内联.c

c

15
推荐指数
2
解决办法
6777
查看次数

使用C/C++作为脚本语言

我正在尝试创建一个将C/C++用作"脚本语言"的架构.我已经有一个原型工作基于:

http://www.codeproject.com/Articles/29999/Compiling-C-code-at-runtime

http://runtimecompiledcplusplus.blogspot.com

我的原型允许我重新编译动态链接库/共享对象并在运行时重新加载它.我只有一个小问题让我们举例说明以下代码:

[bot.c]

typedef struct
{
    float health;

    float speed;

    bool  alive;

} Bot;

Bot bot = { .health = 100.0f,
        .speed  = 1.0f,
        .alive  = true };

void OnCollision( void )
{
    bot.health -= 10.0f;

    if( bot.health <= 0.0f )
    { bot.alive = false; }
}


void OnUpdate( void )
{
    if( bot.alive )
    {
        /* Update animation */
    }
}
Run Code Online (Sandbox Code Playgroud)

如果将bot.c脚本分配给1个机器人就可以了,但是如果我将回调分配给多个机器人,它们会共享相同的数据(1个被点击,它们都会受到攻击!).如何为每个机器人"单独"运行bot脚本?

我已经在(使用了setjmp/longjmp的),但其风险对C++的构造函数和析构函数(也迫使你的宏集成的功能里面,这在我的情况不是一个选项,我的用户)在C/C++协程研究.

我正在考虑运行多个线程,但会出现同样的问题(因为数据来自dll /所以它是共享的).我不太熟悉fork/co-process,但它似乎不适用于我的情况.而且我不认为管道也是一种选择......我几乎卡住了.

反正有没有解决这个问题?

ps:是的我知道像Lua或Javascript(V8)这样的脚本语言具有内置协程或Lua lua_thread会解决我的问题,但我想坚持使用C/C++接口让用户编写代码,因为它的对于游戏性能至关重要!

c c++ scripting

9
推荐指数
1
解决办法
3804
查看次数

四元数"lookAt"功能

我正在努力解决以下问题.我正在使用骨骼动画,我希望(即)玩家的头部跟随太空中的另一个物体.我的上轴是+ Z我的前轴是+ Y,四元数的大小是W.我试着使用gluLookAt的mesa代码并使用3x3矩阵转换为四元数但它不能按预期工作所以我走向另一个方向......

到目前为止,我得到了以下代码"几乎"工作,至少玩家的头部正在旋转(但X角度似乎影响Y旋转轴)在良好的方向,但它直视上面而不是跟随一个对象约65度的地板:

qt LookRotation( v3 lookAt, v3 upDirection )
{
qt t;

v3 forward = lookAt;
v3 up = upDirection;

OrthoNormalize( &forward, &up );

v3 right = v3_cross( up, forward );

mat3 m = mat3_make( right.x, up.x, forward.x,
                    right.y, up.y, forward.y,
                    right.z, up.z, forward.z );

t.w = sqrtf( 1.0f +
             m.r[ 0 ].x +
             m.r[ 1 ].y +
             m.r[ 2 ].z ) * 0.5f;

float w4_recip = 1.0f / ( 4.0f * t.w );

t.x = ( m.r[ …
Run Code Online (Sandbox Code Playgroud)

c opengl math quaternions

6
推荐指数
2
解决办法
1万
查看次数

跨平台OpenAL SFX

我的引擎可以运行,OSX,Windows,Linux,Android和iOS; 我使用OpenAL处理3d声音.在OSX和iOS上,我正在使用为平台和其他Im使用OpenAL-soft的默认库.

使用OpenAL-soft音效可以使用ALC_EFX但是对于OSX和iOS我似乎只能访问ALC_ASA(这是Apple特有的,与EFX相比似乎有限).这是我唯一的选择吗?我无法使用OpenAL拥有真正的跨平台SFX系统?无论如何我可以在iOS/OSX上使用ALC_EFX吗?

android openal ios openal-soft

6
推荐指数
0
解决办法
95
查看次数

在发布时使用dladdr

我为我的应用程序编写了一个分析工具,我使用dladdr将函数指针转换为name.只要Im在调试中,一切正常,但只要我在发布中编译(使用XCode 5.1),所有名称转换都会失败并返回NULL ex:

#include <dlfcn.h>
int main( int argc, char **argv )
{
    Dl_info info;

    if( dladdr( main, &info ) != 0 )
    { fprintf( stderr, "%s\n", info.dli_sname ); }
Run Code Online (Sandbox Code Playgroud)

我尝试了多个编译器标志,我将其传递给C/C++标志:-export-dynamic -fPIC以及-Wl, - export-dynamic没有任何作用...有没有办法仍然使用优化进行编译并保留函数地址 - > dladdr的名称翻译功能?

c c++ xcode gcc clang

5
推荐指数
1
解决办法
1141
查看次数

C&Lua防止访问不良或双重免费

我成功地将Lua集成到了我的应用程序中,为用户提供了脚本访问权限.现在我的问题是:我如何防止双重免费或不良访问违规?

我已经为每个结构实现了Init和Free函数,例如:

  • structaInit
  • structaFree

每次将struct指针链接到另一个时,我也会跟踪,增加我所有结构中的引用计数.

但是用户总是可以在Lua中做这样的事情:

a = structaInit();

b = structbInit();

structbSetA( b, a ); -- This add ++a.reference

a.reference = 0; 

a = structaFree( a ); -- If a->reference == 0 then I free

-- Then struct b->a is still a valid pointer but that have been free.
Run Code Online (Sandbox Code Playgroud)

无论如何我可以阻止这种情况发生吗?

c c++ lua

3
推荐指数
1
解决办法
425
查看次数

如何为LUA创建安全的C接口

我正在研究如何在我的应用程序中集成完整的脚本支持,但有一点问题,规划我的C API是LUA友好的.

基本上我有一堆通过init和free函数创建的结构,如下所示:

[test.h]

typedef struct
{
char name[ 50 ];
} Test;


Test *TestAdd( char *name );

Test *TestDelete( Test *test );
Run Code Online (Sandbox Code Playgroud)

[test.c]

Test *TestAdd( char *name )
{
Test *test = ( Test * ) calloc( 1, sizeof( Test ) );

strcpy( test->name, name );

return test;
}


Test *TestDelete( Test *test )
{
free( test );
return NULL;
}
Run Code Online (Sandbox Code Playgroud)

我使用swig生成LUA模块,因此我创建了以下接口文件:

[test.i]

%module test
%{

%}

Test *TestAdd( char *name );

Test *TestDelete( Test * test );
Run Code Online (Sandbox Code Playgroud)

如果用户代码如下所示,一切正常: …

c lua swig

0
推荐指数
1
解决办法
219
查看次数

SSE到霓虹灯(_mm_movelh_ps)

我将一些SSE代码移动到Neon,我找不到与_mm_movelh_ps相同的任何东西.我谷歌相当有点找不到任何东西......我错过了什么?有没有任何霓虹功能做同样的事情或我将不得不在CPU上实现它(不理想).

提前致谢!

c sse neon

0
推荐指数
1
解决办法
546
查看次数

标签 统计

c ×7

c++ ×3

lua ×2

android ×1

clang ×1

gcc ×1

ios ×1

math ×1

neon ×1

openal ×1

openal-soft ×1

opengl ×1

quaternions ×1

scripting ×1

sse ×1

swig ×1

xcode ×1