ubyte[] -> immutable(ubyte)[]

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed May 4 02:41:10 PDT 2016


On 5/3/16 5:31 PM, vino wrote:
> On Friday, 10 September 2010 at 15:15:38 UTC, Andrej Mitrovic wrote:
>> Yeah, one would think the destination is on the left (just like the
>> standard C way of doing it), but it's not. I checked it in the docs
>> and the source. And idup works, thanks.
>>
>> Kagamin Wrote:
>>
>>> Andrej Mitrovic Wrote:
>>>
>>> >     foreach (ubyte[] buffer; stdin.byChunk(bufferSize))
>>> >     {
>>> >         immutable(ubyte)[] copy_buffer;
>>> >         copy(buffer, copy_buffer);
>>> > >         writeln(copy_buffer);  // writes nothing
>>> > >         send(tid, copy_buffer);
>>> >     }
>>>
>>> Isn't destination the left argument?
>>> Why you don't use send(tid, buffer.idup);
>>> ?
>
> Hi Andrei/All,
>
>   Request your help, I am trying the program written by you with few
> changes such as the example program read the input from stdin and prints
> the data to stdout, but my program reads the input from the
> file(readfile.txt) and writes the output to another file(writefile.txt),
> and I am getting the below errors while compiling
>
> Testing:
> Read a file(readfile.txt : Contain 20,000 lines) by chunk into a
> buffer(read buffer)
> Pass the buffered data to an output buffer(write buffer) and then write
> the output buffer to a to another file(writefile.txt).
> Error:
>
> [root at localhost DProjects]# dmd readwriteb.d
> readwriteb.d(7): Error: cannot implicitly convert expression
> (__aggr2859.front()) of type ubyte[] to immutable(ubyte)[]
> readwriteb.d(15): Error: cannot implicitly convert expression
> (receiveOnly()) of type immutable(ubyte)[] to std.outbuffer.OutBuffer
> [root at localhost DProjects]#
>
> Version: DMD64 D Compiler v2.071.0
>
> Code:
>
> import std.algorithm, std.concurrency, std.stdio, std.outbuffer, std.file;
>
> void main() {
>     enum bufferSize = 1024 * 100;
>     auto file = File("readfile.txt", "r");
>     auto tid = spawn(&fileWriter);
>     foreach (immutable(ubyte)[] buffer; file.byChunk(bufferSize)) {
>        send(tid, buffer);
>     }
> }
>
> void fileWriter() {
>     auto wbuf  = new OutBuffer();
>     for (;;) {
>        wbuf = receiveOnly!(immutable(ubyte)[])();
>        write("writefile.txt", wbuf);
>     }
> }
>
> After few changes as below I was able to compile, but when i run the
> program there is no data in the writefile.txt
>
> import std.algorithm, std.concurrency, std.stdio, std.file;
>
> void main() {
>     enum bufferSize = 1024 * 100;
>     auto file = File("readfile.txt", "r");
>     auto tid = spawn(&fileWriter);
>     foreach (ubyte[] buffer; file.byChunk(bufferSize)) {
>        send(tid, buffer.idup);
>     }
> }
>
> void fileWriter() {
> auto file = File("writefile.txt", "w");
> for (;;) {
>       auto  wbuf = receiveOnly!(ubyte[])();

buffer.idup turns into immutable(ubyte)[]. You must receive this type:

auto wbuf = receiveOnly!(immutable(ubyte)[])();

What is likely happening is that this receiveOnly throws an exception 
you aren't catching, and then the program hangs. Try catching any 
errors/exceptions in your fileWriter thread function and print them out 
to see what is really happening.

-Steve


More information about the Digitalmars-d-learn mailing list