我一直在努力找到一个有效的填充算法.在许多算法中,我只尝试过"递归线填充",其中一个行为完全符合它应该的主要警告,它偶尔会打击堆栈.:(
我已经尝试了很多我发现的非递归实现,并且它们都非常温和:要么在奇怪的地方留下空隙,要么泛滥整个区域(当它们应该被封闭时).
任何人都有一个用C语言编写的非递归填充工作源代码(或者c ++不是太大的OOP而且我可以很容易地解开)?
我正在使用LD_PRELOAD钩子库函数,在Linux中它工作得很好.但我无法弄清楚如何在OSX中做同等效果.
我在Linux上的设置如下:
代码是:
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <unistd.h>
#include <ruby.h>
void
rb_raise(unsigned long exc, const char *fmt, ...)
{
static void (*libruby_rb_raise)
(unsigned long exc, const char *fmt, ...) = NULL;
void * handle;
char * error;
if (!libruby_rb_raise) {
handle = dlopen("/path/to/libruby.so",
RTLD_LAZY);
if (!handle) {
fputs(dlerror(), stderr);
exit(1);
}
libruby_rb_raise = dlsym(handle, "rb_raise");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
exit(1);
}
}
// ...code...
return Qnil;
}
Run Code Online (Sandbox Code Playgroud)
然后我编译:
gcc …Run Code Online (Sandbox Code Playgroud) 据称Matz说"mixins几乎可以完成多重继承所做的一切,没有相关的缺点"(Matz的话)."
首先,为什么Ruby模块包含不是'多重继承'?在我看来,模块和类之间几乎没有什么区别.当它用作超类时,无法实例化模块这一事实无关紧要.
我也知道,连续的模块包含形成了从类向上扩展的单个继承链(不是树).但是,对我来说,这不足以将它与"多重继承"区分开来,因为Python多重继承系统也"线性化"超类链(使用C3算法),只是Ruby'线性化'过程非常简单.
那么,对于像Python这样的语言,Ruby模块混合与多重继承的确切区别是什么呢?为什么Python采用c3 MRO算法背后的论据不适用于Ruby?如果他们确实适用 - 为什么Ruby决定不采用这种算法?
谢谢
我总是组织我的C源的方法是将结构,宏和函数原型放在头文件和.c文件中的函数实现中.但是,我最近一直在阅读大量项目的其他人的代码,我开始看到人们经常在C源本身中定义诸如结构和宏之类的东西,紧接在使用它的函数之上.我可以看到一些好处,因为你不必去寻找特定函数使用的结构和宏的定义,一切都在与使用它的函数大致相同的地方.但是我也可以看到它的一些缺点,因为它意味着没有一个用于结构/宏定义的中央存储库,因为它们分散在源代码中.
我的问题是,决定何时将宏/结构定义放在C源代码中而不是头文件本身有什么好的经验法则?
我以前记得在c模式中的一个组合键来选择一个C函数(我的意思是选择函数的开始和结束之间的文本进行复制/查杀等)但是我已经忘记了它并且似乎无法在任何地方找到它.有谁记得这个关键组合是什么?
我正在寻找一个很好的和有效的实现小林吴的抗锯齿线绘图算法在C,有没有人有这个代码,他们可以与我分享?
谢谢
出于学习目的,我想将基于单元格的NSOutlineView转换为基于视图的NSOutlineView,
基本上我想要以下内容:
NSTreeController这是'世界上最简单的NSOutlineView'示例http://www.cocoasteam.com/Cocoa_Steam/Worlds_Simplest_Demo.html
我想知道是否有人可以修改它以使其基于视图并像我上面说的那样工作:) :)
我试过看苹果的例子,在互联网上的其他地方搜索,但我仍然无法让它工作 - 所以非常感谢提前:)
我在这方面找不到很多文档.如何打包gem以便在安装gem时编译C扩展?
特别是我想这样做:
在Linux和MacOSX上我想在gem install上编译C扩展
在Windows上我想简单地安装一个预编译的.so
对此的任何帮助,特别是示例源,将非常有用:)
当在Ruby中继承类时,单例类也会被继承:
class A
def self.hello
puts "hello"
end
end
class B < A
end
B.hello #=> "hello"
Run Code Online (Sandbox Code Playgroud)
但是对于模块,情况并非如此:
module M
def self.goodbye
puts "goodbye"
end
end
class A
include M
end
A.goodbye #=> NameError
Run Code Online (Sandbox Code Playgroud)
为了解决这个限制,许多人都会诉诸这个丑陋的黑客:
module M
def self.included(c)
c.extend ClassMethods
end
module ClassMethods
def goodbye
puts "goodbye"
end
end
end
Run Code Online (Sandbox Code Playgroud)
好的,我的问题是:这个模块限制背后有理论/概念上的原因吗?还是只是一个实施难度?
在查看C源代码(YARV/MRI)之后,我可以确定存在实施难度(不是不可克服的,但是一个完全相同),但这是唯一的原因吗?这种限制还有其他原因吗?
谢谢
这个问题不是关于如何在Ruby 1.9.1中使用枚举器,而是我很好奇它们是如何工作的.这是一些代码:
class Bunk
def initialize
@h = [*1..100]
end
def each
if !block_given?
enum_for(:each)
else
0.upto(@h.length) { |i|
yield @h[i]
}
end
end
end
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我可以使用e = Bunk.new.each,然后e.next,e.next获取每个连续的元素,但它究竟是如何暂停执行然后在正确的位置恢复?
我知道,如果0.upto用Fiber.yield它替换的产量很容易理解,但这不是这里的情况.这是一个普通的老yield,所以它是如何工作的?
我看了enumerator.c,但对我来说这是不可理解的.也许有人可以在Ruby中提供一个实现,使用光纤,而不是1.8.6样式的基于延续的枚举器,这一切都清楚了吗?
ruby ×4
c ×3
algorithm ×2
mixins ×2
antialiasing ×1
c-mode ×1
cocoa ×1
emacs ×1
enumerators ×1
fiber ×1
flood-fill ×1
gcc ×1
graphics ×1
inheritance ×1
ld-preload ×1
line ×1
linker ×1
macos ×1
module ×1
objective-c ×1
ruby-1.9 ×1
rubygems ×1
singleton ×1