我最近发现gcc允许定义嵌套函数.在我看来,这是一个很酷的功能,但我想知道如何实现它.
虽然通过将上下文指针作为隐藏参数传递来实现嵌套函数的直接调用当然不难,但gcc还允许获取指向嵌套函数的指针并将此指针传递给任意其他函数,而该函数又可以调用嵌套函数上下文的功能.因为调用嵌套函数的函数只有要调用的嵌套函数的类型,所以它显然无法传递上下文指针.
我知道,其他语言如Haskell有一个更复杂的调用约定允许部分应用程序支持这些东西,但我认为没有办法在C中这样做.如何实现这一点?
以下是一个说明问题的案例的小例子:
int foo(int x,int(*f)(int,int(*)(void))) {
int counter = 0;
int g(void) { return counter++; }
return f(x,g);
}
Run Code Online (Sandbox Code Playgroud)
此函数调用一个函数,该函数调用一个函数,该函数从上下文返回一个计数器并同时递增它.
有没有人知道在生产代码R-tree实现中使用的好和简单?(实际上,任何实现 - R*, R+或者PR-tree会很棒)
它是一个模板或库实现无关紧要,但谷歌发现的一些实现看起来非常令人失望......
关于除零,标准说:
C99 6.5.5p5 - /运算符的结果是第一个操作数除以第二个操作数的商; %运算符的结果是余数.在这两个操作中,如果第二个操作数的值为零,则行为未定义.
C++ 03 5.6.4 - 二进制/运算符产生商,二进制%运算符从第一个表达式除以第二个表达式得到余数.如果/或%的第二个操作数为零,则行为未定义.
如果我们将上述段落视为面值,答案显然是两种语言的未定义行为.但是,如果我们进一步了解C99标准,我们会看到以下段落似乎是矛盾的(1):
C99 7.12p4 - 宏INFINITY扩展为float类型的常量表达式,表示正无穷大或无符号无穷大(如果可用);
标准是否有某种黄金法则,其中未定义的行为不能被(可能)矛盾的陈述所取代?除此之外,我认为如果你的实现定义了INFINITY宏,那么将零除法定义为这样是不合理的.但是,如果您的实现没有定义这样的宏,则行为是Undefined.
我很好奇这两种语言在这个问题上的共识是什么(如果有的话).如果我们谈论整数除法int i = 1 / 0与浮点除法,答案会改变float i = 1.0 / 0.0吗?
注意(1) C++ 03标准讨论了<cmath>包含INFINITY宏的库.
我刚刚创建了一个类型安全的Java n-tuple.
我正在使用一些非传统的方法来实现类型安全(我只是为了好玩).
有人可以就改进它或一些可能的缺陷提供一些意见.
public class Tuple {
private Object[] arr;
private int size;
private static boolean TypeLock = false;
private static Object[] lastTuple = {1,1,1}; //default tuple type
private Tuple(Object ... c) {
// TODO Auto-generated constructor stub
size=c.length;
arr=c;
if(TypeLock)
{
if(c.length == lastTuple.length)
for(int i = 0; i<c.length; i++)
{
if(c[i].getClass() == lastTuple[i].getClass())
continue;
else
throw new RuntimeException("Type Locked");
}
else
throw new RuntimeException("Type Locked");
}
lastTuple = this.arr;
}
public static void setTypeLock(boolean typeLock) {
TypeLock …Run Code Online (Sandbox Code Playgroud) 我正在寻找社区检测算法的实现,例如Girvan-Newman算法(2002).我访问了该领域的几位研究人员的网站(Newman,Santo等)但无法找到任何代码.我想有人在那里发布了这些算法的实现(甚至可能是一个工具包?),但我似乎无法找到它.
我有一个解决方案.
我有一个界面.
我有几个实现该接口的类.
我可以使用"查找所有引用"来查找接口的实现位置,但它也返回接口是返回类型的结果,或者类显式实现接口方法的结果.
有没有更好的方法来快速/轻松地找到哪些类实现接口?
在服务器中,我通过Java套接字向客户端发送了一个字节数组
byte[] message = ... ;
DataOutputStream dout = new DataOutputStream(client.getOutputStream());
dout.write(message);
Run Code Online (Sandbox Code Playgroud)
如何从客户端接收此字节数组?
是否有网上的正则表达式实施列表,显示它们的差异/相似之处?
对于exaple,Emacs elisp Regex与JavaScript或Perl正则表达式不同,更不用说不同编辑器软件使用的所有不同实现,
例如,VS2010使用{}而不是()为反向引用分组表达式.
曾几何时,我可以依赖O'Reilly的Regex Pocket快速参考中的正则表达式转换列表,但在线的内容会更容易,更完整.
顺便说一句,我知道(当然)http://www.regular-expressions.info/这是好的,但没有接近完成.
我将根据此处发布的答案以及我能找到的任何其他内容编制列表.
实现的差异通常{}()[]^$是处理特殊字符的方式(转义规则等),偶尔也会替换; POSIX字符类的处理/可用性,例如[:digit:],选项的使用,例如g i等.
(正在进行的工作,如果你知道任何警告,这些实现的差异请添加它们作为答案)
\\在elisp中使用,以及\在regexp-replace.(){}[]使用正则表达式时,特殊字符会被转义,就像使用它们一样sed.编译器如何实现虚拟继承?
在以下代码中:
class A {
public:
A(int) {}
};
class B : public virtual A {
public:
B() : A(1) {}
};
class C : public B {
public:
C() : A(3), B() {}
};
Run Code Online (Sandbox Code Playgroud)
编译器是否生成两个B::ctor函数实例,一个没有A(1)调用,一个带有它?因此,当B::constructor从派生类的构造函数调用时,将使用第一个实例,否则使用第二个实例.
我正在尝试在枚举中创建一个私有静态最终变量,但我不断收到编译错误.有谁知道如何解决这一问题?
此行有多个标记
- 语法错误,插入"Identifier"以完成EnumConstantHeaderName
- 语法错误,插入"}"以完成EnumBody
class Foo {
...
public enum MyEnum {
private static final String MY_STRING = "a string I use in a constructor";
private static final String MY_OTHER_STRING = "a string I use in another constructor";
MyEnumType(1, MY_STRING),
MyEnumType2(2, MY_STRING),
MyEnumType3(3, MY_OTHER_STRING);
MyEnum(int num, String str) {
...
}
}
...
}
Run Code Online (Sandbox Code Playgroud)