我似乎在我的一个类中重载opIndexAssign时遇到了一些麻烦.
我上课了; JSObject的定义如下:
alias char[] String;
Run Code Online (Sandbox Code Playgroud)
...
class JSObject : Dobject
{
/*****************************************************************
* Constructors
******************************************************************/
this( Dobject dobj )
{
super( dobj ) ;
}
this()
{
super( null ) ;
}
this( AssociativeArray data )
{
// initiate
super( null ) ;
// then populate
foreach( k, v ; data )
{
this[ k ] = v ;
}
}
public void opIndexAssign( String key , String val )
{
Value* v = new Value() ;
v.putVstring( val …
Run Code Online (Sandbox Code Playgroud) 我有两个文件:Main.d
和ImportMe.d
.他们的目的应该是不言自明的.它们位于同一目录中,没有明确的模块声明.Main.d
但是,当我尝试编译时,我收到"找不到符号"错误!
$ dmd Main.d -I.
Undefined symbols:
"_D8ImportMe12__ModuleInfoZ", referenced from:
_D4Main12__ModuleInfoZ in Main.o
"_D8ImportMe8SayHelloFxAyaZv", referenced from:
__Dmain in Main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
--- errorlevel 1
Run Code Online (Sandbox Code Playgroud)
同时编译这两个文件工作正常.
$ dmd Main.d ImportMe.d
Run Code Online (Sandbox Code Playgroud)
但是,您不必使用标准库执行此操作.它有什么不同的做法?更改包含路径via -I
没有可见效果.
什么是从D中的char []中删除空格的推荐方法,例如使用dmd 2.057,我有,
import std.stdio;
import std.string;
import std.algorithm;
char[] line;
int main(){
line = r"this is a line with spaces ";
line = removechars(line," ");
writeln(line);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在编译时,这将生成此错误:
Error: cannot implicitly convert expression ("this is a line with spaces ") of type string to char[]
Error: template std.string.removechars(S) if (isSomeString!(S)) does not match any function template declaration
Error: template std.string.removechars(S) if (isSomeString!(S)) cannot deduce template function from argument types !()(char[],string)
Run Code Online (Sandbox Code Playgroud)
在做一些谷歌搜索时,我发现类似的错误被报告为一个错误并且已经在2011年6月提交,但不确定它是指同一件事还是另一个问题.
一般来说,建议从字符串中删除某些字符并将前一个字符数组中的字符顺序排列的方法是什么?
在这种情况下返回 …
如何在d语言结构来实施ubyte []
或ubyte []
在结构,请兄弟帮忙回答一下,谢谢!
如果一个struct包含string
或者char []
该怎么做?
例如,这样的结构:
struct UserLogin
{
align(1):
ushort ClientId;
int AccectId;
string LoginUid;
string LoginPwd;
}
Run Code Online (Sandbox Code Playgroud)
注意我在套接字中的应用!
OK,我想要做的是神仙复杂,但我会试着解释.
比方说,我们希望(在编译时)所有derivedMembers
类的someClass
.那我们就是这样做的:
const string[] methods = [__traits(derivedMembers,someClass)];
Run Code Online (Sandbox Code Playgroud)
现在,我们怎么能得到someClass
的"someClass"
?(是的,它的字符串表示).
让我解释一下我正在尝试做的事情:
我想创建一个"中间"函数,它接受一个function
在一个特定的(预定义的)组类名作为参数(具有参数数组一起)并调用适当的功能从可用静态方法的列表.喜欢execute("someFunc",["one","two","three"]);
.
下面是完整的(测试)的代码:
class Math {
static string noArgs(string[] s) { writeln(s); return ""; }
static string withOneArg(string[] s) { writeln(s); return ""; }
static string withTwoArgs(string[] s) { writeln(s); return ""; }
}
string cases()
{
string ret = "";
const string[] methods = [__traits(derivedMembers,Math)];
foreach (string s; methods)
{
ret ~= "case \"" ~ s ~ "\": return …
Run Code Online (Sandbox Code Playgroud) 我在D中制作了一个计算Fibonacci数字的程序.它应该是最有效的,因为我这样做是为了比较D的执行速度和其他语言的执行速度.然后我在dlang.org上阅读了@nogc属性(这里:http://dlang.org/attribute#nogc ),并试着像这样使用它:
@nogc
@safe
uint fibonacci(uint index)
{
if(index < 2)
return index;
return fibonacci(index - 2) + fibonacci(index - 1);
}
Run Code Online (Sandbox Code Playgroud)
我试过DMD 2.065和GDC 4.8.2,但两个都告诉我: Error: undefined identifier nogc
难道我做错了什么 ?@nogc暂时没有实现吗?
我目前正在尝试DerelictSDL2(D的SDL2库绑定),我编写了一个代码,可以成功加载JPG图像并在窗口中显示.也就是说,当它用dmd编译时.当我尝试使用gdc(并且没有代码修改)时,它会编译,但它不会在运行时加载图像.
我相信我做得对:
SDL_Init(SDL_INIT_VIDEO)
然后
IMG_Init(IMG_INIT_JPG)
在那之后的某个地方
this.data = IMG_LoadTexture(Window.renderer, name.ptr)
其中Window.renderer
是(明显)的SDL_Renderer*
和name.ptr
是一个char*
指向图像的名称来加载.但是,与GDC,编译时IMG_Load
和IMG_LoadTexture
两回null
,而与DMD他们返回一个指针到新创建的质感...
我忘记了别的东西(毕竟,使用dmd它甚至没有工作IMG_Init
)?Derelict是否仅适用于dmd(即使它只与C函数接口)?
dmd:2.065
gdc:4.9.1
编辑:
事实证明问题完全不同.IMG_LoadTexture
为第二个参数获取指向数据的指针,但name.ptr
似乎只适用于dmd.但是,如果我尝试使用这样的硬编码参数:
IMG_LoadTexture(renderer, "../test/res/image.jpg")
它适用于dmd和gdc.
我有以下D程序:
import std.stdio;
enum XYZ : string
{
A = "hello",
B = "foo",
C = "bar"
}
void main()
{
writeln(XYZ.A);
writeln(XYZ.B);
writeln(XYZ.C);
}
Run Code Online (Sandbox Code Playgroud)
打印:
一个
乙
C
我希望它打印hello
,foo
和bar
.为什么程序打印常量的名称而不是其值?那么如何打印字符串值呢?
编译器是DMD v2.063.2
我正在 Windows 8.1 上运行 DMD32 D Compiler v2.071.1(最新更新截至 2016 年 9 月 19 日)。
当我编译文件名中包含“patch”的 D 文件时,生成的可执行文件要求管理员权限。为什么?
如果我命名我的文件foo.d
,一切都很好:
C:\Users\sorbet\Desktop> echo int main(string[] argv) { return 0; } > foo.d
C:\Users\sorbet\Desktop> dmd foo.d
C:\Users\sorbet\Desktop> foo.exe
C:\Users\sorbet\Desktop> echo %ERRORLEVEL%
0
Run Code Online (Sandbox Code Playgroud)
但如果我说出它的名字patch.d
,我突然需要管理员权限:
C:\Users\sorbet\Desktop> echo int main(string[] argv) { return 0; } > patch.d
C:\Users\sorbet\Desktop> dmd patch.d
C:\Users\sorbet\Desktop> patch.exe
Run Code Online (Sandbox Code Playgroud)
啊?
如果我将其命名为文件名中包含“补丁”的名称,例如foopatch.d
. 为什么会发生这种情况,我可以禁用它吗?
我编译了文件stacktrace.d:
void main(){assert(false);}
关闭了ASLR,运行时我得到:
core.exception.AssertError@stacktrace.d(2): Assertion failure
----------------
??:? _d_assertp [0x55586ed8]
??:? _Dmain [0x55586e20]
Run Code Online (Sandbox Code Playgroud)
objdump -t stacktrace|grep _Dmain
给
0000000000032e0c w F .text 0000000000000019 _Dmain
如果我跑步gdb -q -nx -ex start -ex 'disas /rs _Dmain' -ex q stacktrace
:
...
Dump of assembler code for function _Dmain:
0x0000555555586e0c <+0>: 55 push %rbp
0x0000555555586e0d <+1>: 48 8b ec mov %rsp,%rbp
=> 0x0000555555586e10 <+4>: be 02 00 00 00 mov $0x2,%esi
0x0000555555586e15 <+9>: 48 8d 3d 44 c0 02 00 lea 0x2c044(%rip),%rdi …
Run Code Online (Sandbox Code Playgroud) d ×10
dmd ×10
gdc ×2
assembly ×1
attributes ×1
command-line ×1
compilation ×1
derelict3 ×1
mixins ×1
module ×1
phobos ×1
sdl-2 ×1