Tag: ruby

如何编译/创建使用c的ruby扩展?

我想创建一个使用c的ruby扩展。 但是当我使用gcc编译它时,我收到此错误: gcc rubyext.c -orubyext -I /usr/local/include/ruby-1.9.1/ In file included from rubyext.c:1: /usr/local/include/ruby-1.9.1/ruby/ruby.h:25:25: error: ruby/config.h: No such file or directory In file included from rubyext.c:1: /usr/local/include/ruby-1.9.1/ruby/ruby.h:107: error: ‘SIZEOF_INT’ undeclared here (not in a function) /usr/local/include/ruby-1.9.1/ruby/ruby.h:108: error: ‘SIZEOF_LONG’ undeclared here (not in a function) /usr/local/include/ruby-1.9.1/ruby/ruby.h:112: error: ‘SIZEOF_VOIDP’ undeclared here (not in a function) In file included […]

从Ruby确定sizeof(double)和sizeof(int)的最简单方法?

要使用Ruby的String.unpack解压缩具有混合双精度和整数的复杂二进制字符串,我需要确定二进制字符串中的偏移量。 通常,双精度数是8个字节,整数是4个字节,但为了使我的代码与机器无关,我想从我的Ruby代码中查询这些大小。 从Ruby中确定整数和双精度大小的最简单方法是什么,即请求对C的sizeof( type )方法的请求的响应?

人们一直在告诉我,我正在用ruby写“C风格迭代器”,我应该这样做,没有i ++的东西

这里的细节并不重要,它只是一个例子,重要的是i = 0,i + = 1动作 def sortAndIndex #sorting keys @disco = Hash[@disco.sort] #basic setup for both input types @years = @disco.keys @albums = @disco.values sum = @years.count #setup for “albums” input @allalbums = [] i = 0 sum.times do thatyear = @years[i] + “, ” + @albums[i] @allalbums << thatyear i += 1 end […]

用SWIG包装C结构

我有包含以下类型定义的C头文件: // example.h typedef struct Vertex { int color; } Vertex; 我尝试用SWIG包装这个结构,但显然我做错了。 我的SWIG界面文件看起来像 // example.i %module example %inline %{ #include “example.h” } 但是,如果我将头文件的内容复制到我的接口文件中,以便后者看起来像 %module example %inline %{ typedef struct Vertex { int color; } Vertex; %} 我可以通过以下方式从Ruby访问结构 irb> require ‘example’ # => true irb> Examlpe::Vertex # => Vertex 有没有办法自动包装头文件? 我不希望每次更改时都将头文件的内容复制并粘贴到接口文件中。 在此先感谢您的帮助。 – t6d

在C中的#include中转换绝对路径

我试图获取一些我从存储库中获取的代码,以便在我的系统上工作。 在其中一个C文件中,它包含标头的绝对路径: #include “/home/user/.rvm/rubies/ruby-1.9.2-p290/include/ruby-1.9.1/x86_64-linux/ruby/config.h” 由于我的系统上不存在此文件和目录,因此编译源代码失败。 我假设如果我将其更改为指向config.h的个人位置,它将成功但在其他人的系统上失败。 有没有办法指出一些符号链接,系统将使用适当的位置为这样的文件? 处理这种情况的最佳方法是什么?

Ruby – 将方法作为回调传递给DLL库

假设我有一个带有此函数的C / C ++库,编译为DLL: #include extern “C” __declspec(dllexport) void __stdcall myFunction(void (*myCallback)(int)) { int result = MessageBox( 0, (LPCWSTR)L”Press yes or no”, (LPCWSTR)L”Test”, MB_YESNO ); myCallback(result); } 它只是打开标准的Win32消息框并将结果传递给回调函数。 问题是:是否可以在Ruby中使用此函数,通过Fiddle或类似的东西,并以某种方式将Ruby方法传递给它,以便从C ++代码中调用它? 这是我用来将DLL库导入Ruby的代码: require “fiddle” myLibrary = Fiddle.dlopen(“myLibrary.dll”) myFunction = Fiddle::Function.new( myLibrary[“myFunction”], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOID ) def myCallback(value) puts “MessageBox result is #{value}” end 这显然不起作用: myFunction.call(method(:myCallback)) 它只是抛出一个TypeError – […]

Nokogiri编译错误 – 找不到库/标题

尝试安装gem,但无法找到标题,尽管指定了它们: sudo gem install nokogiri — –with-xml2-lib=/usr/local/lib –with-xml2-include=/usr/local/include/libxml2 –with-xml2-include=/usr/local/include/libxml2 –with-xslt-include=/usr/local/include/libxslt Building native extensions. This could take a while… ERROR: Error installing nokogiri: ERROR: Failed to build gem native extension. /usr/bin/ruby extconf.rb –with-xml2-lib=/usr/local/lib –with-xml2-include=/usr/local/include/libxml2 –with-xml2-include=/usr/local/include/libxml2 –with-xslt-include=/usr/local/include/libxslt checking for #include … no —– libxml2 is missing. please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies. /usr/local/include/libxml2/libxml/parser.h文件确实存在,所以我不明白为什么这不起作用。 编辑:我在Centos 5.4上

Ncurses:如何在不丢失当前位置的情况下刷新菜单?

如何在不丢失当前位置的情况下重新加载菜单中的数据? 例如,当用户“选择”项目时,执行改变数据的动作。 (更新项目,删除项目或在菜单中添加新项目。)我想重新加载菜单但仍然将光标保持在刚刚选择的项目上。 最好的方法是什么? 作为参考,这个问题似乎非常接近,但我认为它不包括添加/删除问题: 如何替换ncurses&C中的字符串菜单项 这个问题似乎也很相似,但对我来说太具体了: Ncurses菜单 – 记住选择

在不使用其他function的情况下在C扩展中释放全局VM锁定

我不明白为什么在Ruby C API中发布或获取GVL时需要另一级间接。 rb_thread_call_without_gvl()和rb_thread_call_with_gvl()都需要一个只接受一个参数的函数,但并非总是如此。 我不想仅仅为了释放GVL而将我的参数包装在结构中。 它使代码的可读性变得复杂,并且需要从void指针进行转换。 在查看Ruby的线程代码后,我发现了与Python的Py_BEGIN_ALLOW_THREADS / Py_END_ALLOW_THREADS匹配的GVL_UNLOCK_BEGIN / GVL_UNLOCK_END宏,但我找不到有关它们的文档以及它们何时可以安全使用。 在rb_thread_call_without_gvl()也使用了BLOCKING_REGION宏,但是我不确定在不调用rb_thread_call_without_gvl()本身的情况下将它作为独立使用是否安全。 在不必调用其他函数的情况下,在执行流程中安全释放GVL的正确方法是什么?

你如何使用Ruby / DL? 这是正确的吗?

我正在尝试在RSPEC(ruby风味的BDD)和Windows应用程序之间编写一个接口。 应用程序本身是用一种晦涩的语言编写的,但它有一个C API来提供访问。 我已经使用了Ruby / DL,但是即使是最基本的DLL方法调用也很困难。 这是我到目前为止,在一个名为gt4r.rb的文件中: require ‘dl/import’ module Gt4r extend DL::Importable dlload ‘c:\\gtdev\\r321\\bin\\gtvapi’ # GTD initialization/termination functions extern ‘int GTD_init(char *[], char *, char *)’ extern ‘int GTD_initialize(char *, char *, char *)’ extern ‘int GTD_done(void)’ extern ‘int GTD_get_error_message(int, char **)’ end 到目前为止,我的阅读表明这是我需要的所有内容,因此我写了一个RSPEC示例: require ‘gt4r’ @@test_environment = “INCLUDE=C:\\graphtalk\\env\\aiadev\\config\\aiadev.ini” @@normal_user = “BMCHARGUE” describe Gt4r […]