这真是让我烦恼,来自C#背景.
有时,我看到这样写的函数:
int computeResult();
Run Code Online (Sandbox Code Playgroud)
这就是我习惯的.但后来我发现它们写得像这样:
void computeResult(int &result);
Run Code Online (Sandbox Code Playgroud)
我觉得这很奇怪.如果有的话,第二种方法比第一种方法有什么好处?必须有一些东西,因为我一直都在看.
我正在实现一个对象,该对象拥有通过FFI从C库创建的多个资源.为了清理构造函数恐慌时已经完成的工作,我将每个资源包装在自己的结构中并Drop为它们实现.但是,当涉及到删除对象本身时,我不能保证资源将以安全的顺序被删除,因为Rust没有定义结构字段被删除的顺序.
通常情况下,您可以通过设置它来解决这个问题,因此对象不拥有资源,而是借用它们(以便资源可以相互借用).实际上,这会将问题推到调用代码中,其中drop order被很好地定义并且使用借用的语义来强制执行.但这对我的用例来说是不合适的,而且一般来说还是有点狡猾.
令人气愤的是,如果因为某些原因而drop采取这种做法,这将非常容易.然后我可以按照我想要的顺序打电话.self&mut selfstd::mem::drop
有没有办法做到这一点?如果没有,是否有任何方法可以在构造函数出现紧急情况时进行清理而无需手动捕获和重新计算?
有没有办法让一个类可用于IronPython脚本,以便我可以在代码中创建对象?
例如,如果我有一个类,我希望能够从C#代码中定义的名为MyClass的脚本中实例化,如下所示:
public class MyClass
{
string text;
public MyClass(string text)
{
this.text = text;
}
public void Write()
{
Console.WriteLine(text);
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能在Python脚本中这样做?
obj = MyClass("Hello, World!")
obj.Write()
Run Code Online (Sandbox Code Playgroud)
谢谢!
我在使用C++将法语字符写入控制台时遇到问题.使用std::ifstream和从文件加载字符串std::getline,然后使用打印到控制台std::cout.以下是文件中的字符串:
Lachaînequi对应au代码"TEST_CODE"n'apasététrouvéeàl'aidelocale"fr".
以下是字符串的打印方式:
Lacha¯nequi对应au代码"TEST_CODE"n'apasÚtÚtroutÚeÓ''idea locale"fr".
我该如何解决这个问题?
我的游戏使用多线程架构,线程布局如下:
现在,有(hardware_threads - 3)工作线程,每个未使用的硬件单元一个,但我想通过将"资源"和"网络"线程组合到一个单元上再添加一个,因为两个线程都将花费很多时候闲着.
我不想使用lua_CFunction签名来编写从Lua调用的方法,而是想使用我自己的函数签名来简化导出过程.
void foo(call_t *call)
{
int a;
char *b;
char *c;
table_t *d;
/* reading arguments */
a = read_integer(call);
b = read_string(call);
/* do something... */
/* writing arguments */
write_string(call, c);
write_table(call, d);
}
/* export to Lua */
export("foo", foo);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我能想到的只有一个lua_CFunction,它从表中调用包装函数.但是,我不知道如何将Lua函数与C函数和表索引相关联,以便有效地使Lua函数成为闭包.像这样的东西:
lua_register_with_data(state, "foo", base_function, FOO_INDEX);
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
考虑在类型检查期间获得的以下标准化术语表示:
data Normal a
= Neutral (Neutral a)
| Type
| Pi (Normal a) (Normal (Maybe a))
| Abstract (Normal (Maybe a))
data Neutral a
= Variable a
| Apply (Neutral a) (Normal a)
Run Code Online (Sandbox Code Playgroud)
我希望能够在此框架中表示一个修复点,或者至少以保留其head-normal属性的方式,这对于实现替换和定义相等非常方便.
起初,我想过使用微积分本身定义的固定点组合子.但是,Y组合器是不可能的,因为这个术语表示我不能将lambda应用于lambda.Z组合器接近我想要的,但假设结果是一个函数.
如果我只是简单地进行图形缩减,我会将结与Haskell本身联系起来,导致一个懒惰的无限语法树.但是,由于这是用于依赖类型检查器,我需要能够在术语上测试定义相等 - 它会以这种方式陷入无限循环.
我看了很多文章,大多数人讲的是同一个故事:除非必须,否则不要使用指针.来自C#/ Java背景,其中内存全部被管理,我完全不知道什么时候使用指针是合适的,除了这些情况:
什么时候我会使用指针,特别是在gamedev的上下文中?
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
FILE *vertexShaderFile = fopen(vertexShaderPath.c_str(), "rb");
fread(buffer, 1, sizeof(buffer) - 1, vertexShaderFile);
fclose(vertexShaderFile);
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, (const char **)&buffer, nullptr);
glCompileShader(vertexShader);
Run Code Online (Sandbox Code Playgroud)
使用此代码,我在调用 时遇到分段错误glShaderSource()。使用 GDB,我已经确认(着色器代码)的内容buffer正确地以 null 终止。最重要的是,我检查了 和GLEW_ARB_shader_objects都已glShaderSource加载。
这里可能发生了什么?
buffer经过一番修补后,我发现如果我在堆上制作一个副本,即通过std::string从中制作 a 并将glShaderSource()指针传递给其返回的指针c_str(),它就可以工作。
现在我更困惑了。
最重要的是,即使我只是声明一个char *指向buffer并将其传递进去,它也能工作。当您声明指向数组的指针与声明指向指针的指针时,C++11 是否做了一些特殊的事情?
c++ ×5
architecture ×1
boost ×1
c ×1
c# ×1
class ×1
console ×1
embedding ×1
game-engine ×1
haskell ×1
ironpython ×1
latin ×1
lua ×1
opengl ×1
pointers ×1
raii ×1
ref ×1
return-value ×1
rust ×1
shader ×1
type-theory ×1
unicode ×1
windows ×1