Re: Capturing by value in the thread
On Friday, 18 October 2024 at 12:07:24 UTC, Kadir Erdem Demir wrote: It seems [=] functionality C++ does not exist in D. By using a helper function I made that example work. [...] Because 'work' is captured, it is allocated on the heap. The loops are all assigning values to this 'work' in the heap. The values in front of 'work' are all overwritten, so after the thread runs, it prints the last value.
Re: why the sort result is different with C#
i know the reason,C# have several compares methods. String.Compare , String.CompareOrdinal //now the output is same as the D code Array.Sort(arr, string.CompareOrdinal);
why the sort result is different with C#
D code: auto arr = ["b1=1", "b=2","a1=1", "a=2"]; writeln(arr.sort()); output:["a1=1", "a=2", "b1=1", "b=2"] C# code: var arr = new string[]{ "b1=1", "b=2", "a1=1", "a=2" }; Array.Sort(arr); output:["a=2","a1=1","b=2","b1=1"]
Re: pi program
If we worry about the string form and instead try: double reduce_string_loop() { return reduce!"1.0 / (a * a)"(iota(1, 100)); } double reduce_function_loop() { return reduce!((n) => 1.0 / (n * n))(iota(1, 100)); } it should be write : double reduce_loop() { //return iota(1, 100).map!"1.0 / (a * a)".sum; return iota(1, 100).reduce!"a + 1.0 / (b * b)"; }
Re: Chaining struct method invocations
On Monday, 7 September 2015 at 14:12:25 UTC, Bahman Movaqar wrote: I need some help understand the behaviour of my code[1]. Specifically I have trouble with `add` method on line 79. My impression is that since it returns `this`, multiple invocations can be chained like `obj.add(X).add(Y).add(Z)`. However the test on line 92 fails and if I do a `writeln`, only "p1" and "p2" records show up. What am I missing here? Thanks in advance. [1] https://github.com/bahmanm/d-etudes/blob/master/source/e002/models.d struct is a value type,you can convert to ref type by "ref": struct Test { int a; Test add1() { a++; return this; } ref Test add2() { a++; return this; } } Test t1; t1.add1.add1; writeln(t1.a);//1 Test t2; t2.add2.add2; writeln(t2.a);//2
Re: What is the D way to map a binary file to a structure?
On Saturday, 29 August 2015 at 12:56:08 UTC, cym13 wrote: Hi, Let's say I have a simple binary file whose structure is well-known. Here is an example which stores points: struct Point { long x; long y; long z; } struct BinFile { uintmagicNumber; // Some identifier ulong pointsNumber; Point[] points; // Array of pointsNumber points. } What is the best way to read some file and fill a structure with it? Would reading the file into a void[] and then casting it to the struct work with things like internal struct padding? struct Point { long x; long y; long z; } struct BinFile { uintmagicNumber; // Some identifier ulong pointsNumber; Point[] points; // Array of pointsNumber points. this(ubyte [] buf) { auto f = cast(BinFile *)buf.ptr; this = cast(BinFile)*f; this.points = (cast(Point*)&f.points)[0..cast(uint)this.pointsNumber]; } }
why adding extern(C) cause a runtime error?
win7 x86 dmd2.067.1 ok ubuntu x64 dmd2.067.1 error - import std.stdio; import std.socket; extern(C) void recv() { writeln("recv..."); } extern(C) void send() { writeln("send..."); } int main(string[] argv) { //copy from std.socket unittest immutable ubyte[] data = [1, 2, 3, 4]; auto pair = socketPair(); scope(exit) foreach (s; pair) s.close(); pair[0].send(data); auto buf = new ubyte[data.length]; pair[1].receive(buf); assert(buf == data); return 0; } -- send... recv... core.exception.AssertError@a.d(27): Assertion failure ./a() [0x43d61f] ./a(_Dmain+0xcc) [0x43d1bc] ./a(_D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv+0x1f) [0x4400fb] ./a(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate())+0x2a) [0x44004e] ./a(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll()+0x30) [0x4400b4] ./a(void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate())+0x2a) [0x44004e] ./a(_d_run_main+0x1dc) [0x43ffc8] ./a(main+0x17) [0x43d637] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f5fabd8fec5]
build vibe-d-0.7.23 error on win7 x86?
win 7 x86,3GB ram: 1. dmd 2.066 vibe-d-0.7.23, it's ok. 2. dmd 2.067 vibe-d-0.7.23, show error msg "out of memory" why?
Re: how call a c function with stdcall?
On Wednesday, 25 March 2015 at 00:26:21 UTC, Adam D. Ruppe wrote: On Wednesday, 25 March 2015 at 00:09:33 UTC, mzf wrote: i use "implib.exe /system func.lib func.dll" to create a func.lib. You might also need to specify the .def file as the final argument to that. http://digitalmars.com/ctg/implib.html The def file can list aliases for the functions. Maybe try it without the /system flag too. I know there's a way but I don't know exactly what, I just tend to guess and check a little... 1.def file: LIBRARY "func" EXPORTS _sub@8 = sub 2.create lib implib.exe func.lib func.def - now it works fine,thanks!
Re: how call a c function with stdcall?
On Tuesday, 24 March 2015 at 15:26:22 UTC, Adam D. Ruppe wrote: try extern(Windows) isntead of extern(C). use extern(Windows) or extern(System) the compile show the link error: Error 42: Symbol Undefined _sub@8 dll export func name is "sub", and the dll is 3rd party,i can't change the dll code. i use "implib.exe /system func.lib func.dll" to create a func.lib. how can i link correctly?
how call a c function with stdcall?
for example:use vc compile on x86 func.c: __declspec(dllexport) int _stdcall sub(int a,int b) { return a-b; } func.def: LIBRARY EXPORTS sub - i use "implib.exe" to create a omf format lib. D code: import std.exception; //this is a cdecl call extern(C) int sub(int a,int b); void main() { auto c1 = sub(2,1); //when this line run,the c1 value is broken auto c2 = enforceEx!Exception(sub(1,2)); } -- my question is how write D code to call the c function
Re: why GC not work?
On Saturday, 7 February 2015 at 06:08:39 UTC, ketmar wrote: On Sat, 07 Feb 2015 04:30:07 +, Safety0ff wrote: False pointers, current GC is not precise. not only that. constantly allocating big chunks of memory will inevitably lead to OOM due to current GC design. you can check it with manual freeing. there were some topics about it, and the solution is either use 64 bit OS ('cause the memory is here, but there is no address space to allocate it), or use `malloc()` and `free()` from libc. hi,i still have two questions: 1. how large is the "big chunks" ? 10MB? 50MB? ... where are topics about this? if I don't know the exact size, it is very likely a memory leak 2. "auto buf = new byte[](1024*1024*100);" now the gc can't free this buf. can i free it by manual?
Re: How to write asia characters on console?
Thanks, my problem has been solved:) --- import std.stdio; import core.stdc.wchar_; extern(C) int setlocale(int, char*); static this() { fwide(core.stdc.stdio.stdout, 1); setlocale(0, cast(char*)"china"); } int main(string[] args) { string s1 = "hello你好"; writefln("%s", s1); return 0; } This solution has a problem, look at this: http://forum.dlang.org/thread/jfawjvoedsxsznsue...@forum.dlang.org#post-tyslcbycorgfaqimldnd:40forum.dlang.org
Re: why spawn crash?
On Saturday, 24 January 2015 at 01:54:32 UTC, mzf wrote: thanks,you are right. window console show chinese char is not right, so i try to add this code: " extern(C) int setlocale(int, char*); static this() { fwide(core.stdc.stdio.stdout, 1); setlocale(LC_CTYPE, cast(char*)"china"); } " it's looks like solve the problem,but caused another problem. now i use "chcp 65001" command to change the code page and change the font to "lucida console".it works correctly! this way also have problem! look this bug report: Issue 13651 - Writing Unicode text with console code page 65001 (UTF-8) may fail now,i use this code show string on window console: void write(string s) { import std.windows.charset:toMBSz; printf(toMBSz(s)); } void writeln(string s) { write(s); printf("\r\n"); }
why GC not work?
import std.stdio; void testGC() { auto b = new byte[](1024*1024*100); writeln("malloc 100M!"); } void main() { foreach(i;1..100) { testGC(); } } -- core.exception.OutOfMemoryError@(0) win7 x86,dmd v2.066.0
how convert the range to slice ?
is there any simple way to convert? int [] arr1 = [1,2,3].map!"a*2"; //compile error int [] arr2 = [1,2,3].filter!"a<3";//compile error
Re: why spawn crash?
thanks,you are right. window console show chinese char is not right, so i try to add this code: " extern(C) int setlocale(int, char*); static this() { fwide(core.stdc.stdio.stdout, 1); setlocale(LC_CTYPE, cast(char*)"china"); } " it's looks like solve the problem,but caused another problem. now i use "chcp 65001" command to change the code page and change the font to "lucida console".it works correctly!
why spawn crash?
i wrote a test code: void worker(int firstNumber) { Thread.sleep(1.msecs); } void main() { foreach (i; 1 .. 1000) { spawn(&worker, i ); writeln(i); } thread_joinAll(); writeln("ok"); } sometimes it's ok,sometimes it's crashed ! why ? here is one of times callstack message: test.exe!_free() test.exe!_fwide() test.exe!_fwide() test.exe!__ReleaseSemaphore() test.exe!_fwide() test.exe!main@__modctor() 行 3 test.exe!rt@minfo@__T14runModuleFuncsS482rt5minfo11ModuleGroup11runTlsCtorsMFZ9__lambda1Z@runModuleFuncs() test.exe!___threadstartex@4()