Re: How can I put the current value of a variable into a delegate?

2024-05-08 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 6 May 2024 at 16:41:38 UTC, Steven Schveighoffer wrote:
This is a very old issue: 
https://issues.dlang.org/show_bug.cgi?id=2043 since "moved" to 
https://issues.dlang.org/show_bug.cgi?id=23136


I would love to see a solution, but the workaround at least 
exists!


-Steve


Interestingly enough C# used to have the same behaviour but MS 
decided to go for a breaking change in C# 5; now it behaves as 
most people expect.


Since it's an unsolved problem to keep links working for 10+ 
years I gave up looking for something official about the subject. 
Here's an SO question about it though:


https://stackoverflow.com/questions/14184515/action-delegate-uses-the-last-values-of-variables-declared-outside-foreach-loop




Re: how can I load html files and not .dt or diet files in vibe.d

2024-02-01 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 1 February 2024 at 03:20:31 UTC, dunkelheit wrote:
this is my code, I'm a begginer on vibe, and I want to use html 
and not diet files


Take a look at the static file example, I think that's close to 
what you're looking for.


https://github.com/vibe-d/vibe.d/blob/master/examples/http_static_server/source/app.d


Re: Error: none of the overloads of template `once.main.each!((l)

2023-10-04 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 4 October 2023 at 08:11:12 UTC, Joel wrote:

What am I missing?


Splitter returns a forward range so you can't slice the result. 
You can use take() and drop() instead. Also, converting a string 
range to int[] doesn't seem to work, but I don't know if it 
should. Here is a version that works:


```D
import std;

void main() {
struct DateRem {
Date date;
string rem;
string toString() const => text(date.toSimpleString, " ", 
rem);

}
DateRem[] daterem;
data
.splitter('\n')
.filter!(l => l.length && l[0].isDigit)
.each!((l) {
auto parts=l
.splitter
.take(3)
.map!(to!int)
.array;
if (parts.length==3) {
daterem~=DateRem(Date(parts[2],parts[1],parts[0]),
l.splitter.drop(3).join(" "));
}
});
daterem.each!writeln;
}

auto data="04 10 2023 17:28, not much
30 9 2023 21:08, very little";
```


Re: Inheritance and arrays

2023-07-03 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 3 July 2023 at 09:50:20 UTC, Arafel wrote:
Is this a conscious design decision (if so, why?), or just a 
leak of some implementation detail, but that could eventually 
be made to work?


Besides the pointer adjustment problem mentioned by 
FeepingCreature, it's an unsound conversion even with just class 
inheritance. Consider:


```
class A {}
class B : A {}
class C : A {}

void main()
{
  auto bArr = [new B()];
  A[] aArr = bArr; // If this was allowed..
  aArr[0] = new C(); // This would be a problem, because bArray 
would now contain a C.

}
```


Re: Union with bits ?

2023-06-14 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 14 June 2023 at 00:59:30 UTC, Paul wrote:
I would like to have labeled bits in a union with a ubyte.  
Something like this:

```d
struct MyStruct {
union {
ubyte status;
bit A, B, C…etc
}
}
```
Is something like this possible?

Thanks


You can do something like this if you don't mind compiling with 
-preview=bitfields:


```d
union {
ubyte status;
struct {
bool A : 1, B : 1, C : 1, D : 1;
}
}
```


Re: iota where step is a function

2023-05-24 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 24 May 2023 at 16:39:36 UTC, Ben Jones wrote:
Is there a range like iota in phobos where step is a function?  
I want to specify begin/end and have the "step" be next = 
fun(prev).  Should be easy to write, but don't want to reinvent 
the wheel.


I think you’re looking for either recurrence() or sequence(), 
also defined in std.range.


Re: How to workaround assignment not allowed in a condition?

2022-10-12 Thread Rene Zwanenburg via Digitalmars-d-learn
On Wednesday, 12 October 2022 at 02:15:55 UTC, Steven 
Schveighoffer wrote:

Am I missing something?


Perhaps I am, but why not turn it into a numeric comparison, like:

```
while((i = 5) == 0)
```


Re: Way to pass params to a function passed to a fiber?

2022-10-03 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 3 October 2022 at 08:10:43 UTC, Bienlein wrote:
My question is whether someone has an idea for a better 
solution.


You can pass a lambda to the fiber constructor. For example:


```
void fiberFunc(int i)
{
writeln(i);
}

void main()
{
auto fiber = new Fiber(() => fiberFunc(5));
fiber.call();
}
```


Re: How Stop Worker Thread if Owner Thread is Finished?

2020-10-27 Thread Rene Zwanenburg via Digitalmars-d-learn

On Tuesday, 27 October 2020 at 11:36:42 UTC, Marcone wrote:
I want to use isDaemon to automatic stop worker thread if 
ownner thread is finished


Terminating threads without properly unwinding the stack is 
generally a very bad idea. Most importantly the destructors of 
stucts on the stack won't run which can cause problems like locks 
not being released.


This isn't specific to D either. For example Raymond Chen writes 
about the TerminateThread function in Windows here:

https://devblogs.microsoft.com/oldnewthing/20150814-00/?p=91811

You should signal the thread somehow that it's time to stop 
working


Re: How is this an "Access Violation"

2020-10-27 Thread Rene Zwanenburg via Digitalmars-d-learn
On Tuesday, 27 October 2020 at 02:05:37 UTC, Ruby The Roobster 
wrote:

   void construct(string type,atom base,atom bonded)
{
base = new 
atom(base.name.idup,base.mass,base.electro_negativity,base.valence_electrons,base.electrons,base.protons,base.neutrons,base.pos);

(...)
assert(this.base.valence >= 1 && 
this.bonded.valence >=1 && this.base.electro_negativity >= 0 && 
this.bonded.electro_negativity >= 0,"For a single bond, both 
atoms need to have at least one free electron and have to have 
electro negativity.");


Going by the assert this is a member function of a class or 
struct with base and bonded members. I think you meant to assign 
the newly created atoms to those fields instead of overwriting 
your arguments.


Re: [windows] Can't delete a closed file?

2019-05-09 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 9 May 2019 at 12:33:37 UTC, Cym13 wrote:

On Thursday, 9 May 2019 at 11:31:20 UTC, Cym13 wrote:

...


To dismiss any doubt about AV or other processes coming into 
play I took the binary and ran it with wine on linux with the 
exact same end result.

For reference my windows system is a 64b windows 10.


You could try to use the find handle function in Process Explorer 
to figure out what process has the file open:


https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer


Re: Memory reference that does not stop garbage collection.

2019-02-08 Thread Rene Zwanenburg via Digitalmars-d-learn

On Friday, 8 February 2019 at 15:42:13 UTC, Jonathan Levi wrote:

I should be able to use `core.memory.GC.removeRange` right?


That would leave dangling references in the array. You may be 
interested in this, but I have not used it myself:


https://repo.or.cz/w/iv.d.git/blob/HEAD:/weakref.d


Re: cas and interfaces

2018-12-27 Thread Rene Zwanenburg via Digitalmars-d-learn
On Tuesday, 25 December 2018 at 22:07:07 UTC, Johannes Loher 
wrote:
Thanks a lot for the info, that clarifies things a bit. But it 
still leaves the question, why it works correctly when 
inheriting from an abstract class instead of implementing an 
interface... Any idea about why that?


Unlike interfaces, base class references don't need adjustment. 
You can see this in action by printing addresses:


https://run.dlang.io/is/m6icVr

import std.stdio;

interface I {}
class Base : I {}
class Derived : Base { }

void main()
{
auto derived = new Derived;
Base base = derived;
I i = derived;

writeln(cast(void*)derived);
writeln(cast(void*)base);
writeln(cast(void*)i);
}


7FC1F96EE000
7FC1F96EE000
7FC1F96EE010


Re: How does calling function pointers work?

2018-11-12 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 12 November 2018 at 16:29:24 UTC, helxi wrote:
On Monday, 12 November 2018 at 16:25:13 UTC, Rene Zwanenburg 
wrote:
Idk where you got that syntax from, but there's no syntactic 
difference between calling normal functions and function 
pointers:


import std.stdio;
import std.concurrency;
import core.thread;

void worker(int firstNumber) {
foreach (i; 0 .. 4) {
Thread.sleep(500.msecs);
writeln(firstNumber + i);
}
}

void main() {
foreach (i; 1 .. 3) {
spawn(, i * 10);
}
}


Looks like worker needs an int and spawn(, i * 10) seems 
to feed it's second arg to worker(?)


That's right. spawn() is a function in the standard library that 
takes a function pointer, and all the arguments to pass to that 
function. It's a bit unusual in that regard: normally when using 
function pointers the arguments are provided by the code that 
receives the function pointer. Internally, spawn will call the 
function pointer just like I did in my example, but on another 
thread.


Here's an example where a function pointer is passed around with 
the arguments provided by the callee:

https://run.dlang.io/is/ArCN5t



Re: How does calling function pointers work?

2018-11-12 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 12 November 2018 at 16:08:28 UTC, helxi wrote:
As far as I understand, calling a function pointer with an 
argument in D looks like:


call(, argTofn0, argTofn1, argTofn3);


Idk where you got that syntax from, but there's no syntactic 
difference between calling normal functions and function pointers:


https://run.dlang.io/is/I6u0rg



Re: Test if variable has void value

2018-08-22 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 22 August 2018 at 13:50:07 UTC, Andrey wrote:

Hello,
How to test if variable has void value?


string text = void;
if(text == void)
{
   writeln("Is void");
}


Tried this:

if(is(text == void))

but doesn't work.


You can't. When using a void initializer the actual value is 
garbage until initialized properly, and that garbage can look 
like anything including a valid instance.


So if the flow of your program can't guarantee that the value has 
been initialized at a certain point, you'll have to track it 
yourself some way. Nullable may be of help:


https://dlang.org/phobos/std_typecons.html#Nullable



Re: Coreect way to create delegate for struct method.

2018-08-22 Thread Rene Zwanenburg via Digitalmars-d-learn

On Tuesday, 21 August 2018 at 21:29:38 UTC, Andrey wrote:

Hello,
This is a code:

   (...)
   test.handler = 


That's an internal pointer, and internal pointers are not allowed 
in structs precisely because of the issues you're running into: 
the pointer will be invalid after a move.


You may be able to get it kind of working, but I'd recommend 
looking for another solution to your problem. This is one of 
those things that will come back to bite you later.


Re: asdf json library moved to libmir

2018-07-12 Thread Rene Zwanenburg via Digitalmars-d-announce

On Wednesday, 11 July 2018 at 21:42:45 UTC, yannick wrote:

Hi All,

Since i'll be leaving Tamedia (who sponsored development of 
Asdf) and it's not under active use anymore here we decided to 
donate it to libmir.


...

cheers,
y


Thanks for keeping it alive. I've used asdf at work last week to 
build a json plugin for logparser:


https://en.wikipedia.org/wiki/Logparser

I have yet to ask permission to open source it, but I'll make an 
announcement if the boss agrees.


Memory corruption with COM object

2018-07-06 Thread Rene Zwanenburg via Digitalmars-d-learn
I've been staring at this problem the past few hours without 
making any progress. But I feel like I'm overlooking something 
obvious..


Using Adam's comhelpers, I've made a JSON plugin for LogParser. 
However after running for a bit it'll crash with signs of memory 
corruption.


My guess was the GC was collecting things still in use, and 
disabling the GC does indeed 'fix' the problem. Looking through 
comhelpers, the code doesn't add a GC root for a created object 
before handing it off to the C side. I've added root adding and 
removing, expecting that to fix the problem. However it didn't 
help.


The DLL uses the helper functions like dll_process_attach in 
DllMain, so druntime is initialized.


What would be a good way to figure out why the GC decides to 
collect objects I'm still holding on to?


Re: Configuring DerelictGL3

2018-06-06 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 6 June 2018 at 23:26:23 UTC, Entity325 wrote:
I can't imagine things like "glEnable/DisableClientState" are 
deprecated.


They are. All the missing symbols are indeed deprecated.

attempting to load the deprecated functions according to the 
documentation page did a whole lot of nothing


Could you post the exact code you used? I'm not using the old 
functions, but that should work.


Re: D Library Breakage

2018-04-13 Thread Rene Zwanenburg via Digitalmars-d

On Friday, 13 April 2018 at 05:31:25 UTC, Jesse Phillips wrote:
Well if DIP1000 isn't on by default I don't think Phobos should 
be compiled with it.


I think that the version issue is not unique to D and would be 
good to address, but I don't see the compiler reading the 
object file to determine how it should built the import files.


More importantly, it can be perfectly valid to link object files 
compiled with different options. Things like parts of the program 
that shouldn't be optimized, or have their logging calls 
added/removed.


Re: Aggressive conditional inlining with ldc only, not dmd

2018-03-26 Thread Rene Zwanenburg via Digitalmars-d-learn

On Sunday, 25 March 2018 at 22:09:43 UTC, Nordlöw wrote:

eventhough I compile with -release -inline -nobounds flags.


Just to make sure: are you passing -O as well?


Re: How to make AA key a pointer

2018-02-19 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 19 February 2018 at 14:57:47 UTC, Clinton wrote:

On Monday, 19 February 2018 at 14:55:01 UTC, Clinton wrote:

Hi all, I need advice from better developers on this concern.

I'm using an AA to reference another array for quicker access:

[...]


Sorry, on second look my explanation isn't very clear. I want 
to know if:


bool[string] myAA;

myAA[contact.id] = true; // Does this copy contact.id or is 
this a pointer to contact.id?


It's a pointer. In D, string is an alias to immutable(char)[] 
(Slice of immutable characters). A slice is a combination of 
pointer and length.


Re: Debugging on Windows

2018-02-09 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 8 February 2018 at 21:09:33 UTC, JN wrote:

Hi,

is there any way to debug binaries on Windows? I'd at least 
like to know which line of code made it crash. If it's D code, 
I get a call trace usually, but if it's a call to a C library, 
I get a crash and that's it. I am using VSCode and I'd prefer 
to debug in it if possible, but using other IDEs is a 
possibility for me if that will help.


You can debug D programs from VS Code using the C++ plugin:

https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools

It requires some configuring, but from what I remember it was all 
very straightforward.


Re: SegFault with HibernateD

2018-01-12 Thread Rene Zwanenburg via Digitalmars-d-learn

On Friday, 12 January 2018 at 07:33:37 UTC, Mike Parker wrote:

On Friday, 12 January 2018 at 05:24:52 UTC, Venkat wrote:
I get a SegFault with the main method below which uses 
HibernateD . The second main method which uses ddbc just works 
fine. What is wrong with the first main method ? I have 
attached the error at the bottom although I don't think it 
says much.




This is the error.



object.Exception@source/dub/generators/build.d(530): Program


It says enough to know that the exception is being thrown from 
dub and not your program. You program is never executed because 
dub throws the exception before it gets that far. You should 
report this at the dub repository: 
https://github.com/dlang/dub/issues


It looks to me like the program is being run through dub, and dub 
is just reporting the program's exit code.


Hard to guess what the issue is, I'd attach a debugger to see 
where it crashes.


Re: High-resolution thread sleep

2017-12-15 Thread Rene Zwanenburg via Digitalmars-d-learn
On Friday, 15 December 2017 at 01:49:56 UTC, Steven Schveighoffer 
wrote:


So... you plan on rendering more than 1000 frames per second?

I think in any case, even if the API allows it, you are 
probably not getting much better resolution on your non-windows 
systems.


Have you tried it anyway and see how it works? I think it might 
actually work just fine.


-Steve


The higher precision would be needed b/c updating and rendering 
takes time, so the sleep time would be timePerFrame - 
timeSpendOnRendering.


Problem is you'll need vsync anyway to avoid tearing. 
Applications that use their own timing to limit the framerate 
without using vsync are easy to recognise: they have a tear 
slowly moving around on the screen. It's visually even more 
annoying than regular tearing.


Re: High-resolution thread sleep

2017-12-14 Thread Rene Zwanenburg via Digitalmars-d-learn
On Thursday, 14 December 2017 at 23:45:18 UTC, Ivan Trombley 
wrote:

Something along the lines of this:

while (render)
{
  immutable auto startTime = MonoTime.currTime;

  // Render the frame...

  immutable auto remain = m_frameDuration - (startTime - 
MonoTime.currTime);

  if (remain > Duration.zero)
Thread.sleep(remain);
}


In that case, the best thing you can do is use vsync as the 
waiting mechanism ;)


Re: High-resolution thread sleep

2017-12-14 Thread Rene Zwanenburg via Digitalmars-d-learn
On Thursday, 14 December 2017 at 21:11:34 UTC, Ivan Trombley 
wrote:
I need to be able to put a thread to sleep for some amount of 
time. I was looking at using Thread.sleep but it appears that 
on Windows, it's limited to millisecond resolution. Is there a 
way to do this in a cross-platform way that is higher 
resolution?


Sleeping for very short periods is usually a bad idea for various 
reasons. What do you need it for?


If you really need this, go for a loop with a high resolution 
timer.


Re: Email validation

2017-11-28 Thread Rene Zwanenburg via Digitalmars-d-learn

On Tuesday, 28 November 2017 at 18:47:06 UTC, Vino wrote:

Hi All,


You can do this easily using the std.net.isemail module:

https://dlang.org/phobos/std_net_isemail.html



Re: opAssign for most struct assignment calls not executed

2017-11-23 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 23 November 2017 at 15:26:03 UTC, Timoses wrote:

A aaa = a;


That's initialization, not assignment, which is subtly different. 
It will call the postblit on aaa instead of opAssign. A postblit 
can be defined this way:


this(this)
{

}

There is no way to access the original a from the postblit. All 
fields have already been copied, you can use it to duplicate 
reference types, increment reference counts, and other things 
like that.


Re: DateTime trying to do it at compile time.

2017-10-26 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 26 October 2017 at 17:55:05 UTC, Mr. Jonse wrote:
when calling Clock.currTime() in a this() in a class. I have no 
idea why it is trying to do it at compile time and failing. I 
thought if ctfe couldn't compile it would do it at run time 
anyways? Seems like a bug.


I suspect you're trying to instantiate your class in a static 
context, which causes it to be constructed at compile time. For 
example:



class A
{
  this() {
// Do sth. with datetime
  }
}

class B
{
  // This will construct A at compile time. This also
  // means a single A instance is shared between all
  // B instances. This is different from most langs!
  A a = new A;
}

// This will also construct at compile time.
A moduleScopedA = new A;


The solution is to new A in your class or module constructor.


Re: How to modify process environment variables

2017-10-17 Thread Rene Zwanenburg via Digitalmars-d-learn

On Tuesday, 17 October 2017 at 05:57:50 UTC, Ky-Anh Huynh wrote:

On Tuesday, 17 October 2017 at 04:56:23 UTC, ketmar wrote:


you can use libc's `putenv()` in D too, it is ok. just import 
`core.sys.posix.stdlib`,  it is there. D is not antagonistic 
to C, and doesn't try to replace the whole libc with it's own 
libraries. so if you see something that libc has and you'd 
like to use -- just do it! ;-)


I see :) I have always tried to avoid C if possible :D


As an alternative, a search on code.dlang.org turned up this lib:

http://code.dlang.org/packages/dotenv


Re: code.dlang.org is offline?

2017-09-22 Thread Rene Zwanenburg via Digitalmars-d

On Friday, 22 September 2017 at 08:14:43 UTC, Szabo Bogdan wrote:

Hi,

Is there a reason why code.dlang.org is offline?

Thanks,
Bogdan


It works fine for me. Can you verify?


Re: Making a repo of downloaded dub package

2017-09-05 Thread Rene Zwanenburg via Digitalmars-d-learn

On Tuesday, 5 September 2017 at 06:23:26 UTC, Dukc wrote:

On Monday, 4 September 2017 at 20:31:35 UTC, Igor wrote:
Search for word "local" here: 
https://code.dlang.org/docs/commandline. Maybe some of those 
can help you. If not you could make a pull request for dub 
that would support such a thing :)


That will make a Dub package out of a Git package, but I'm 
trying to do it vice-versa (And so that it is able to use the 
same histoy as the repository). I think it will require Git 
commands, but what commands exactly? I was unable to figure 
that out myself.


When you go to the package's page on code.dlang, look for the 
github repository link in the top right corner. You can fork from 
there.


Re: Remove all blank lines from a file

2017-08-31 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 31 August 2017 at 14:44:07 UTC, vino wrote:

Hi All,

  Can some provide me a example of how to remove all blank 
lines from a file.


From,
Vino.B


This one doesn't read the entire file into memory:

import std.stdio;
import std.array;
import std.algorithm;
import std.uni;

void main(string[] args)
{
auto inputFile = File(args[1]);
auto outputFile = File(args[2], "wb");

inputFile
.byLine
.filter!(line => !line.all!isWhite)
.copy(outputFile.lockingTextWriter);
}

But if you want to replace the input file, you'd have to write to 
a temp file, remove the original, then move the temp file.


Re: Import modules too verbose in some cases

2017-08-10 Thread Rene Zwanenburg via Digitalmars-d

On Wednesday, 9 August 2017 at 23:57:19 UTC, Johnson Jones wrote:
Sometimes one doesn't want to import either the whole module 
nor specify a single function to import. It seems that 
basically D has all the info to import the function implicitly 
because it usually gives a nice error message tells us which 
module to import for the function.


It doesn't have that information available, and that's unlikely 
to change due to the compilation model. Rather, a few very common 
cases have been hardcoded in the compiler:


https://github.com/dlang/dmd/blob/4d86fcba2fd2ef86cc85738cd2ac2b059dbb5800/src/ddmd/imphint.d


Re: Getting enum from value

2017-08-05 Thread Rene Zwanenburg via Digitalmars-d-learn

On Saturday, 5 August 2017 at 15:33:57 UTC, Matthew Remmel wrote:

Any ideas?


You can use to! in std.conv:


import std.stdio;
import std.conv;

enum Foo
{
A = "A",
B = "B"
}

void main()
{
writeln("A".to!Foo);  
}


Re: [OT] - A hacker stole $31M of Ether — how it happened, and what it means for Ethereum

2017-08-04 Thread Rene Zwanenburg via Digitalmars-d

On Friday, 4 August 2017 at 08:33:42 UTC, RazvanN wrote:

On Friday, 4 August 2017 at 05:57:00 UTC, Nick B wrote:
See - 
https://medium.freecodecamp.org/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce


[...]


I don't think the problem was with the blockchain here. It is 
usually a bad idea to have turing-complete scripts over 
blockchains. From what I've seen the bug was that there was 
issued a library call based on a user-provided string. That 
could have never happened if they would have used D with @safe



D's OpDispatch is very similar to what caused this bug ;)

struct Library
{
  void doSomethingUseful(){}
  void doSomethingNice(){}
  void resetSecurity(){}
}

struct BuggyContract
{
  private void customizedBehaviour(){}

  void opDispatch(string f)()
  {
if(f == "doSomethingUseful")
{
  customizedBehaviour();
}
else
{
  mixin("Library.init." ~ f ~ "();";
}
  }
}


Re: Function with static array as parameter

2017-07-12 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 12 July 2017 at 12:57:19 UTC, Rene Zwanenburg wrote:

On Wednesday, 12 July 2017 at 12:20:11 UTC, Miguel L wrote:
What is the best way in D to create a function that receives a 
static array of any length?


Templatize the array length:

void foo(size_t length)(int[length] arr)
{

}


That being said, this may lead to template bloat and excessive 
copying. What are you trying to do? Is there a reason you can't 
use a slice?


Re: Function with static array as parameter

2017-07-12 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 12 July 2017 at 12:20:11 UTC, Miguel L wrote:
What is the best way in D to create a function that receives a 
static array of any length?


Templatize the array length:

void foo(size_t length)(int[length] arr)
{

}


Re: D and memory mapped devices

2017-06-14 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 14 June 2017 at 08:10:57 UTC, Russel Winder wrote:
but the bitfields mixin template appears to do more than add 
all the bit twiddling functions to emulate the bitfields. This 
would appear a priori to not allow for actual memory mapped 
devices using it, or am I missing something?


I've casted void buffers to structs containing bitfields to read 
pre-existing binary files, and that worked just fine. I don't see 
why it would be different for memory mapped devices. What do yo 
mean by 'do more'?


Re: purity question

2017-05-30 Thread Rene Zwanenburg via Digitalmars-d-learn

On Tuesday, 30 May 2017 at 11:34:52 UTC, ketmar wrote:
If malloc were marked as pure, wouldn't that mean it must 
return the same pointer every time you call it with the same 
size?


of course. but D "pure" is not what other world knows as 
"pure". we love to mess with words.


Well, there's the ability to modify non-const reference 
parameters from a pure function, but that's not applicable to 
malloc. Are there any other special rules?


Re: purity question

2017-05-30 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 29 May 2017 at 01:36:24 UTC, Jonathan M Davis wrote:

A simple example: anything that has a malloc/free pair.


Yeah, if you do it right, you should be fine, but you have to 
do it right, and it's very easy to miss some detail that makes 
it wrong to insist to the compiler that what you're doing is 
pure.


If malloc were marked as pure, wouldn't that mean it must return 
the same pointer every time you call it with the same size?


Re: See you soon at dconf

2017-05-03 Thread Rene Zwanenburg via Digitalmars-d

On Wednesday, 3 May 2017 at 15:05:02 UTC, Bastiaan Veelo wrote:

On Wednesday, 3 May 2017 at 14:38:41 UTC, Rene Zwanenburg wrote:
On Wednesday, 3 May 2017 at 13:36:45 UTC, Steven Schveighoffer 
wrote:
I am at the Ludwig van Beethoven hotel. Just had a 2 hour 
nap, couldn't sleep on the plane. So a few beers will do me 
well (first of which I'm having now ;). Where were you 
thinking to meet?


-Steve


Are you still at the hotel bar? I just went down there but saw 
no-one.


Sorry I lost cellular connection. Steve an I took the U7 to 
Ibis, 6 stops. We are 9 chaps atm. "Kurzstreckefahrkarte" is 
enough, the cheap ticket.


Ah great, I'll go there as well.


Re: See you soon at dconf

2017-05-03 Thread Rene Zwanenburg via Digitalmars-d
On Wednesday, 3 May 2017 at 13:36:45 UTC, Steven Schveighoffer 
wrote:
I am at the Ludwig van Beethoven hotel. Just had a 2 hour nap, 
couldn't sleep on the plane. So a few beers will do me well 
(first of which I'm having now ;). Where were you thinking to 
meet?


-Steve


Are you still at the hotel bar? I just went down there but saw 
no-one.


Re: See you soon at dconf

2017-05-03 Thread Rene Zwanenburg via Digitalmars-d

On Wednesday, 3 May 2017 at 13:50:53 UTC, Bastiaan Veelo wrote:
On Wednesday, 3 May 2017 at 13:36:45 UTC, Steven Schveighoffer 
wrote:


(first of which I'm having now ;). Where were you thinking to 
meet?


If there's beer where you are, I can get to you. 20 min.


I'm also staying at the Beethoven. First I've got to finish 
something up, then I'll join you as well.


Re: Why map return [] ?

2017-04-14 Thread Rene Zwanenburg via Digitalmars-d-learn

On Friday, 14 April 2017 at 15:49:00 UTC, Suliman wrote:
I found problem! ResultRange should be converted to array 
before it can be `map`ed


That shouldn't be necessary. Can you post your complete code?


Re: Can't build simple project. Very strange errors

2017-04-14 Thread Rene Zwanenburg via Digitalmars-d-learn

On Friday, 14 April 2017 at 15:42:33 UTC, Suliman wrote:

On Friday, 14 April 2017 at 15:40:18 UTC, Rene Zwanenburg wrote:

On Friday, 14 April 2017 at 15:31:21 UTC, Suliman wrote:
On Friday, 14 April 2017 at 15:22:49 UTC, Rene Zwanenburg 
wrote:

On Friday, 14 April 2017 at 09:49:09 UTC, Suliman wrote:

on: dub build --compiler=ldc2


link

OPTLINK (R) for Win32  Release 8.00.17


Optlink isn't able to link object files produced by ldc. 
Could you try an x64_86 build? You'll need the Microsoft 
linker.


I do not have VS on my PC :(


You don't need VS, the Windows SDK should be fine too. It's a 
free download :)


How to check if it's installed and how to use linker from it?


If it's installed you can find it in the programs and features 
list as 'Windows Software Development Kit for Windows X'. The DMD 
installer will look for it during installation, so reinstalling 
DMD after installing the SDK should work. I'm not sure how LDC 
does it, but last time I installed LDC it also just worked.


Re: Can't build simple project. Very strange errors

2017-04-14 Thread Rene Zwanenburg via Digitalmars-d-learn

On Friday, 14 April 2017 at 15:31:21 UTC, Suliman wrote:

On Friday, 14 April 2017 at 15:22:49 UTC, Rene Zwanenburg wrote:

On Friday, 14 April 2017 at 09:49:09 UTC, Suliman wrote:

on: dub build --compiler=ldc2


link

OPTLINK (R) for Win32  Release 8.00.17


Optlink isn't able to link object files produced by ldc. Could 
you try an x64_86 build? You'll need the Microsoft linker.


I do not have VS on my PC :(


You don't need VS, the Windows SDK should be fine too. It's a 
free download :)


Re: Can't build simple project. Very strange errors

2017-04-14 Thread Rene Zwanenburg via Digitalmars-d-learn

On Friday, 14 April 2017 at 09:49:09 UTC, Suliman wrote:

on: dub build --compiler=ldc2


link

OPTLINK (R) for Win32  Release 8.00.17


Optlink isn't able to link object files produced by ldc. Could 
you try an x64_86 build? You'll need the Microsoft linker.


Re: DUB mismatch between project structure and dub.json contents

2017-04-10 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 10 April 2017 at 12:56:49 UTC, Nordlöw wrote:
src/knet/traversal.d(20,8): Error: module factixs from file 
src/knet/factixs.d must be imported with 'import factixs;'


What am I doing wrong?


My first guess would be that the module declaration in that file 
is incorrect. Are you sure it's set to knet.factixs? The module 
declaration needs to be present or it will be put in the root 
package.


Re: delegate with optional parameters

2017-04-03 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 3 April 2017 at 05:00:15 UTC, Inquie wrote:
Yes, but they are really not any different. They only look 
different. A field can be a function just like a method because 
they look exactly the same except on is in a vtable and the 
other is in the fields memory. But both point functions.


It should be possible to create a wrapper struct around your 
'overloads' with an opDispatch which selects the right delegate.


Re: Registering for DConf, PayPal appears to be broken.

2017-04-02 Thread Rene Zwanenburg via Digitalmars-d

On Saturday, 1 April 2017 at 23:54:45 UTC, Walter Bright wrote:

On 4/1/2017 12:38 PM, Rene Zwanenburg wrote:
I just tried to register for DConf, but PayPal is borken at 
the moment. (Not the

link on the DConf website, PayPal itself is throwing errors)

In case it's still not working tomorrow, would it be possible 
to register some

other way? I don't have a credit card.


You can mail the D Foundation a check:

  D Language Foundation
  6830 NE Bothell Way Ste C-162
  Kenmore, WA 98028

Let me know when you do, and I'll reserve your ticket for you.

For credit cards, eventbrite will work, too:

  
https://www.eventbrite.com/e/dconf-2017-berlin-tickets-31277455712


I learned the hard way years ago to have more than one service 
for ticket purchases, as one or the other always goes down :-(


Thanks, but luckily PayPal works now. It turned out that their 
service agreement had been updated some time ago and I needed to 
login to my account and accept it.


Instead of telling me that, it showed a generic 'something is not 
working right now, try again later' during checkout.


Anyway, see you at DConf!


Registering for DConf, PayPal appears to be broken.

2017-04-01 Thread Rene Zwanenburg via Digitalmars-d

Hi,

I just tried to register for DConf, but PayPal is borken at the 
moment. (Not the link on the DConf website, PayPal itself is 
throwing errors)


In case it's still not working tomorrow, would it be possible to 
register some other way? I don't have a credit card.


Re: Why is [0] @safer than array.ptr?

2017-01-24 Thread Rene Zwanenburg via Digitalmars-d-learn
On Tuesday, 24 January 2017 at 11:38:16 UTC, Jonathan M Davis 
wrote:
Likely because it does bounds checking, so you at least know 
that it's not null. But I don't see why that would really 
improve much considering that the odds are that you're really 
going to be accessing far more than just the first element with 
the pointer. It seems _slightly_ better from a safety 
perspective but only slightly. So, I don't know what the point 
is in suggesting it as an alternative.


- Jonathan M Davis


Pointer arithmetic is forbidden in @safe code so that's not a 
problem. The reason this was introduced was indeed bounds 
checking. For example:


@safe:

int parse(ref char[] input)
{
  // Pop all numeric characters from the front of the input slice 
and convert to int

}

void main()
{
  auto input = "123".dup;
  parse(input);
  // Since all numeric chars have been popped, input is now 
effectively input[$ .. $].

  // This means input.ptr is pointing past the end of the array.
  writeln(input.ptr); // Out of bounds access
}


Re: Strange Bug

2017-01-20 Thread Rene Zwanenburg via Digitalmars-d-learn

On Friday, 20 January 2017 at 08:19:57 UTC, Chris M. wrote:
I have no idea if this is an issue with D, or OpenSSL, or if 
I'm just doing something completely wrong. I'm writing a 
program that will either encrypt or decrypt a string using AES 
in ECB mode (for a school assignment) and it's giving me a very 
strange bug.


[...]

auto encOut = new ubyte[inputStr.length];

// Encrypt and convert to base64
AES_set_encrypt_key(aesKey.ptr, aesKey.sizeof * 8, );
AES_ecb_encrypt(inputStr.ptr, encOut.ptr, , 
AES_ENCRYPT);


Here's the problem. I tried running this without the if-else 
statements (i.e. encrypting and decrypting all in one run of 
the program, code below). If I leave in the base64 encoding and 
decoding, and use decB64 as the input to decrypt, it still 
doesn't work. However, if I decrypt with encOut directly, or 
assign encOut to decB64, it somehow works.


My guess:

The encrypted output will be a bit longer than your input. You're 
not getting an out of bounds exception during encryption since 
OpenSSL only has the pointer to write to, not a buffer length it 
can check. The memory behind your buffer is apparently committed, 
and will be written to by OpenSSL. This is why using the same 
buffer to decrypt works: it continues to read after the end of 
the buffer. (In case it's not clear, writing and reading past the 
end of the buffer is really bad)


I expect OpenSSL to have a helper function to calculate the 
required buffer size for a given input length. Use that to 
allocate the buffer.


Re: Phobos: Determining number of hours or minutes or seconds till now

2017-01-20 Thread Rene Zwanenburg via Digitalmars-d-learn
On Friday, 20 January 2017 at 03:48:14 UTC, rikki cattermole 
wrote:
As per the documentation this is wrong for anything beyond a 
few weeks.

Although I have no idea if that's the case implementation wise.


I think the documentation is talking about the units used, not 
length of the duration. The reason Duration makes this 
distinction is because months and everything larger have a 
variable length. I'm not sure though.


Re: Phobos: Determining number of hours or minutes or seconds till now

2017-01-19 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 19 January 2017 at 14:04:36 UTC, aberba wrote:
Using the standard library, how do a get number of hours or 
seconds or minutes or days or months or years till current time 
from a past timestamp (like "2 mins ago")? Not with manual 
calculations but from Phobos functions.


You can get a duration by subtracting two timestamps. For example:

auto delta = (Clock.currTime - timeStamp).total!"seconds";


Re: Thread will get garbage collected?

2017-01-17 Thread Rene Zwanenburg via Digitalmars-d-learn
On Tuesday, 17 January 2017 at 08:58:33 UTC, Arun Chandrasekaran 
wrote:
Interesting. Why doesn't the thread get GC'd in this case even 
without any reference still active?


There will be a reference to it in druntime itself:
http://dlang.org/phobos/core_thread.html#.Thread.getThis


Re: Changing template parameters

2017-01-16 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 16 January 2017 at 15:56:16 UTC, Jack Stouffer wrote:

Same way you use any template parameters,

 auto i = uniform!("(]")(0, 1000);


Also, if the template parameter consists of a single token you 
can omit the parens:


auto i = uniform!"(]"(0, 1000);


Re: Alias variable from another class

2016-12-15 Thread Rene Zwanenburg via Digitalmars-d-learn

On Tuesday, 13 December 2016 at 19:13:24 UTC, Begah wrote:

Any ideas?


Closest you can get is wrapping it in a property. If you need to 
do this often you may be able to generate them, check the recent 
"Getters/Setters generator" thread in Announce for some 
inspiration.


Re: Updated D then undefined symbols in vibed

2016-11-24 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 24 November 2016 at 16:17:19 UTC, Jot wrote:
Any more ideas? Obviously something isn't getting linked in in 
the VS project.


This is definitely a stale object file problem. From that error 
message it appears to use the .dub directory to store object 
files of your dependencies. Try nuking it, then run dub to 
recreate it.


Re: Updated D then undefined symbols in vibed

2016-11-24 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 24 November 2016 at 09:52:32 UTC, Jot wrote:
Seems like someone decided to screw up a lot of people by 
removing a lot of stuff ;/ I guess I should learn my lesson 
about assuming a "stable" dmd release won't completely kill my 
project.


There are still some old object files or libs hanging around. 
MSBuild doesn't know you've updated DMD and reuses them.


Dub shouldn't have this problem. If you've generated the solution 
from a dub file, try a rebuild with Dub first. I suspect MSbuild 
will work after that.


Re: Why don't Function Lambdas Cast to Delegate?

2016-11-21 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 21 November 2016 at 16:24:38 UTC, Q. Schroll wrote:
Why don't lambdas cast to a delegate if they are of type R 
function(Args)? I don't see any reason to that; a lambda should 
be a delegate type by default, and a function only as a special 
guarantee/optimization. It just makes them cumbersome to use 
with toDelegate.
Probably there is a good reason why R function(Args) does not 
implicitly cast to R delegate(Args); I can imagine something 
internally (memory layout etc.) causes that. I'd just like to 
know.


A delegate has the hidden context pointer as parameter in 
addition to the 'visible' parameters. That causes functions and 
delegates with the same declared params to look different on the 
ABI level.


Re: D Lang installation on Windows, dependency on Visual Studio?

2016-11-15 Thread Rene Zwanenburg via Digitalmars-d

On Tuesday, 15 November 2016 at 16:20:53 UTC, AB wrote:
Hopefully, future releases of DMD will fix this inconsistency 
by requiring Visual Studio for 32-bit D programs as well.


You already do, if you compile with -m32mscoff.


Re: DMD 64-bit Windows

2016-11-10 Thread Rene Zwanenburg via Digitalmars-d

On Thursday, 10 November 2016 at 09:35:00 UTC, Mario Silva wrote:
I haven't tried it yet, but I would want to avoid changing the 
compiler at this point, since we already have all our tooling 
build around DMD.


That is why I'm asking specifically about the state of the 
64-bit windows version of DMD.


There is no official 64 bit build of DMD, but it's quite easy to 
make one yourself using Digger:


https://github.com/CyberShadow/Digger

Since the 64 bit build is not automatically tested master will 
sometimes fail to compile, but sticking to releases always works 
for me so far.




Re: [vibe.d] showing images

2016-10-26 Thread Rene Zwanenburg via Digitalmars-d-learn
On Wednesday, 26 October 2016 at 12:42:09 UTC, Nicholas Wilson 
wrote:

doctype html
html
body
-foreach(s; images)
// it doesn't seem to like #{s} or !{s}
img(src=s)

--
shared static this()
{
auto router = new URLRouter;
router.registerWebInterface(new CamController);

auto settings = new HTTPServerSettings;
settings.port = 8081;
settings.bindAddresses = ["::1", "127.0.0.1"];
listenHTTP(settings, router);


}
class Controller
{
void index(HTTPServerRequest req, HTTPServerResponse res)
{
auto images = 
dirEntries("public/images",SpanMode.breadth)

.map!(f=> f.name).array;
writeln(images); // ["public/images/testprog.jpg"]
res.render!("index.dt",images);
}
 }

What am I missing? I just get a 404 for the image.


You need to make the images accessible over HTTP. Note the use of 
staticFileServer in the following example:


http://vibed.org/docs#http-routing


Re: File.write write extra CR character if a string has CRLF on windows

2016-10-06 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 6 October 2016 at 15:00:00 UTC, Pham wrote:

string s is multi-lines (CRLF as line break)
The write function will write extra CR character for each CRLF 
pair -> why (bug?)


import std.file;
import std.stdio;

string s = ...;

auto fHandle = File("f:\\text.txt", "w"); // open for writing
fHandle.write(s);
fHandle.close();


Take a look at this thread:

http://forum.dlang.org/post/ehdnboaufaadgiaah...@forum.dlang.org


Re: The XML and JSON library

2016-09-30 Thread Rene Zwanenburg via Digitalmars-d
On Friday, 30 September 2016 at 03:27:36 UTC, Nick Sabalausky 
wrote:
You don't have to USE the web framework stuff to the use json 
part.


This sort of question has come up before, but I've really never 
understood the problem. Sounds more ideologic than anything 
real to me.


Since Vibe has been split into subpackages it's not an issue 
anymore, but before that I copied Vibe's Json code into my 
project so I didn't need to depend on the entire Vibe codebase.


DMD ICE's are much, much less frequent than they were a few years 
ago, but with largish projects I still regularly run into them, 
which is a reason for me to not include more code than necessary.


Re: Member not accessible in delegate body

2016-09-23 Thread Rene Zwanenburg via Digitalmars-d-learn

On Friday, 23 September 2016 at 07:54:15 UTC, John C wrote:
How is it possible that "onTextChanged" isn't accessible but 
the private method "changeSize" *is*?


Smells like an oversight. I guess the compiler doesn't see the 
delegate as a member of a Control subclass, so it can't access 
protected members. Private works because private in D means 
module private.


Please file an issue. As a workaround you can try to take the 
address of the method in the closure (untested):


void delegate() foo()
{
  auto func = 

  return () => func(); // I think this will work
}


Re: Vibe.d compilation error: backend/cgelem.c 5018 dmd failed with exit code 1.

2016-09-23 Thread Rene Zwanenburg via Digitalmars-d-learn

On Friday, 23 September 2016 at 08:39:44 UTC, llaine wrote:
Okay I tried yesterday, after 4hours of process, I never went 
through the end of minification.


At the beginning I enter YES should I enter NO instead?


Hmm that's strange. I don't get any yes or no questions. What is 
the exact message you get?


I've been looking into using dustmite with dub a bit, and running

dub dustmite "../DustmiteResult" 
--compiler-regex=".*backend/cgelem\.c 501.*" --build=release


in your project directory should just work..


Re: Vibe.d compilation error: backend/cgelem.c 5018 dmd failed with exit code 1.

2016-09-21 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 21 September 2016 at 20:22:42 UTC, llaine wrote:

The project is pretty big, DustMite would handle this?


Yes, but it may take some time. For large projects, running it on 
a server is advisable. 3K LOC should be doable on a desktop 
machine.


Dub has built-in support for running Dustmite. I'm not very 
familiar with it, but it looks like you'll want to use 'dub 
dustmite' with the --compiler-regex switch with a regex matching 
the ICE assert message.


Re: Copy a struct and its context

2016-09-11 Thread Rene Zwanenburg via Digitalmars-d-learn

On Sunday, 11 September 2016 at 05:44:13 UTC, Yuxuan Shui wrote:
I recently noticed nested struct capture its context by 
reference (which, BTW, is not mentioned at all here: 
https://dlang.org/spec/struct.html#nested). And bliting a 
struct obviously doesn't do a deep copy of its context.


So my question is, is there a way to deep copy the context of a 
struct?


I've tried a few things, but I don't think you can. The root 
issue is that the context pointer is void*, so you can't do 
meaningful reflection on it.


Re: Storing a reference

2016-09-01 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 1 September 2016 at 20:38:13 UTC, Yuxuan Shui wrote:
I think my approach is probably better, because I believe 
(correct me if I'm wrong): 1) it will never refer to a null 
object.


That's true, but you can ensure the same thing for the wrapper:

struct Ref()
{
  @disable this();
  this(T* value)
  {
assert(value !is null);
this.value = value;
  }
  // rest same as before
}

2) after DIP1000 is implemented we will be able to make sure 
there will be no dangling reference.


I'm not very familiar with the details of DIP1000, so I can't 
comment on that.


Re: Storing a reference

2016-09-01 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 1 September 2016 at 19:37:25 UTC, Yuxuan Shui wrote:

I just figured out how to store a reference:

@safe:
auto x(ref int a) {
struct A {
ref int xa() { return a; }
}
return A();
}
void main() {
import std.stdio;
int b = 10;
auto a = x(b);
a.xa = 20;
writeln(b); //Prints 20
}

I have no idea if this is a right thing to do. Can someone tell 
me if this is idiomatic D, and whether there're any catches to 
this method or not?


Thanks.


This will allocate a closure. A struct definition inside a 
function has a hidden context / closure pointer, unless it's a 
static struct.


There is nothing like a ref variable in D. If you want to refer 
to something someplace else, use a pointer. You can create a 
pointer wrapper which acts like a reference (untested):



auto toRef(ref T value)
{
  return Ref!T();
}

struct Ref(T)
{
  private T* value;
  @property ref T _value() { return *value; }
  alias _value this;
}

Note that D's pointer syntax is a bit friendlier than C++'s: the 
dot operator works fine on pointers. A good reason to use the Ref 
wrapper is to forward arithmetic operations to the wrapped value.


Re: Checking all elements are unique.

2016-08-31 Thread Rene Zwanenburg via Digitalmars-d-learn
On Wednesday, 31 August 2016 at 08:38:11 UTC, Andrea Fontana 
wrote:

Something like this: https://dpaste.dzfl.pl/9fa55b2a7927 ?

Andrea


Or use findAdjacent:

auto idsAreUnique = ids.array.sort.findAdjacent.empty;

http://dlang.org/phobos/std_algorithm_searching.html#.findAdjacent


Re: DerelictGL3.reload with specified path question.

2016-08-17 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 17 August 2016 at 22:59:31 UTC, WhatMeWorry wrote:
I want to store all my shared/dynamic libraries within a 
special directory relative to where the application directory 
is. All of the derelictXX.loads(path) compiles except 
DerelictGL3.reload(lib);  which doesn't seem to be implemented.


Don't ever ship OpenGL.dll with your application: it's provided 
by the graphics driver. The only exception to this rule that I 
can think of is if you want to use a software implementation for 
some reason.


Re: randomIO, std.file, core.stdc.stdio

2016-07-27 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 27 July 2016 at 02:20:57 UTC, Charles Hixson wrote:
O, dear.  It was sounding like such an excellent approach until 
this
last paragraph, but growing the file is going to be one of the 
common

operations.  (Certainly at first.) (...)
So I'm probably better off sticking to using a seek based i/o 
system.


Not necessarily. The usual approach is to over-allocate your file 
so you don't need to grow it that often. This is the exact same 
strategy used by D's dynamic arrays and grow-able array-backed 
lists in other languages - the difference between list length and 
capacity.


There is no built-in support for this in std.mmfile afaik. But 
it's not hard to do yourself.


Re: DConf 2016 on YouTube

2016-07-22 Thread Rene Zwanenburg via Digitalmars-d-announce

On Thursday, 21 July 2016 at 16:35:44 UTC, Ali Çehreli wrote:

Stealing the opportunity to announce this news... :)

  
https://www.youtube.com/playlist?list=PL3jwVPmk_PRyTWWtTAZyvmjDF4pm6EX6z


Reddit:


https://www.reddit.com/r/programming/comments/4txf9w/dconf_2016_video_playlist/

Ali


This is great, my thanks to everyone involved!


Re: Battle-plan for CTFE

2016-07-08 Thread Rene Zwanenburg via Digitalmars-d-announce

On Friday, 8 July 2016 at 11:32:10 UTC, Stefan Koch wrote:
I forgot to mention I posted a short article about the CTFE 
design on my blog.

https://codesoldier.blogspot.com

Feel free to comment or give suggestions.


Thanks! Posts like these are always interesting to read. I 
noticed a few mistakes:


I have been working a rewrite -> I have been working on a rewrite
complicated corer-case -> complicated corner-case
that have to handled correctly -> that have to be handled 
correctly

a cononical from -> a canonical from


Re: Dynamic arrays, emplace and GC

2016-07-05 Thread Rene Zwanenburg via Digitalmars-d-learn

On Tuesday, 5 July 2016 at 13:48:46 UTC, Claude wrote:
Ah ok. I tried using void[size] static array and it seems to 
work without having to use GC.addRange().


Correct. void[] means the type of the data is unknown, so the GC 
has to assume it can contain pointers.


This also means that _everything_ in any void buffer has to be 
treated as a potential pointer. In other words, if you allocate a 
void buffer and fill it with ints, and one of those ints happens 
to have a value equal to the address of a GC-allocated object, 
the GC will assume the int is a pointer to that object and not 
free it.


Re: Initializing static array with contents of (static and dynamic) arrays

2016-07-05 Thread Rene Zwanenburg via Digitalmars-d-learn

On Tuesday, 5 July 2016 at 12:34:20 UTC, Johannes Loher wrote:

I tried this, but it does not work correctly with slices.


The length of a slice is a runtime value, which is why it can't 
be used to set static array size. What were you trying to 
achieve? Avoid copying the input arrays, or accepting any slice?


In case of the first, you can put ref in front of the Args:
auto combineArrays(Args...)(ref Args args)

The second case will be a bit harder to solve nicely..


Re: Initializing static array with contents of (static and dynamic) arrays

2016-07-04 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 4 July 2016 at 19:22:52 UTC, Johannes Loher wrote:
This looks really nice, but I have several occurences of this, 
with different arrays (and lengths), so i would need to create 
several of those structs. But it looks really clean :)


You can use a template to remove the boilerplate. Here's a quick 
example:


https://dpaste.dzfl.pl/43b379992648


Re: Commit size and Page fault's very large for simple program

2016-07-04 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 4 July 2016 at 11:42:40 UTC, Rene Zwanenburg wrote:

...


I forgot to mention:

If you're on Windows compilation defaults to 32 bit, false 
pointers can be a problem with D's current GC in 32 bit 
applications. This isn't an issue for the sample application 
though, since you're not putting random numbers in the allocated 
arrays.


64 bit doesn't suffer from this. There's also a GSoC project 
underway, aimed at improving the GC. I'm not sure what the exact 
goals are, but IIRC work on making the GC precise is being done, 
which would eliminate the false pointer issue.


Re: Commit size and Page fault's very large for simple program

2016-07-04 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 4 July 2016 at 01:57:19 UTC, Hiemlick Hiemlicker wrote:

version(Windows)

void main()
{
import std.random;

while(getchar() != EOF)
{
auto x = new int[std.random.uniform(100, 1000)];

writeln("");
bThread.Now();

}
}

more or less, ends up with a huge amount of page faults and a 
several hundred MB commit size(hold enter down a bit). I'm 
trying to understand this. Is that normal behavior for normal 
programs(haven't tried it with a similar C++ example though).


The PF's are most likely due to default initialization, so you 
may not see those in a C++ equivalent (or, actually, the exact 
equivalent would be to initialize the array as well, in that case 
you'd get PF's too). If you've determined default initialization 
is causing performance problems in a hot piece of code, D 
provides facilities to disable it.


I realize the GC has to do some work and all that but the 
program only has a working set of a few MB yet a commit of 10 
times that.


Is commit size essentially "touched" memory but really doesn't 
mean much to overall free ram?(can other programs use it at 
some point)?


Strictly speaking there's no relation between commit size and 
RAM, from your application's POV there's only the virtual address 
space. Committed memory can be paged to disk if the OS determines 
your application isn't actively using certain pages.





We know the program is not using more than 10MB


It's an array of ints, so you'll have to multiply that by four ;)

of extra memory(since x is local)... so I'd only expect the 
footprint to be a max of around 15-20MB. not 150MB+(depends on 
how fast and long you hit enter).


Keeping memory usage to an absolute minimum would mean the GC has 
to do a collection on every allocation. As a very coarse rule of 
thumb, expect a GC heap (not just the D GC) to be about 1.5 to 2 
times as large as strictly necessary. This is to reduce the 
amount of collections. Since your example is doing nothing but 
hammering the GC I'm not surprised the heap is a bit larger than 
that.


Re: Range non-emptyness assertions and opIndex

2016-07-01 Thread Rene Zwanenburg via Digitalmars-d-learn

On Friday, 1 July 2016 at 10:35:04 UTC, Nordlöw wrote:
I think this is a important issue since asserts are not 
optimized away in release mode and D is very much about 
performance.


Asserts are removed in release mode, enforce isn't. Here's an 
example:


=
void main(string[] args)
{
assert(args.length >= 1);
}
=

dmd testfile.d

This calls the assert function as expected:
=
_Dmain:
  : 55 pushrbp
  0001: 48 8B EC   mov rbp,rsp
  0004: 48 83 39 01cmp qword ptr 
[rcx],1
  0008: 73 0E  jae 
0018

  000A: B9 03 00 00 00 mov ecx,3
  000F: 48 83 EC 20sub rsp,20h
  0013: E8 00 00 00 00 call
_D5test28__assertFiZv

  0018: 31 C0  xor eax,eax
  001A: 5D pop rbp
  001B: C3 ret
=

Now compiling in release mode:
dmd -release testfile.d

No assert in sight:
=
_Dmain:
  : 55 pushrbp
  0001: 48 8B EC   mov rbp,rsp
  0004: 31 C0  xor eax,eax
  0006: 5D pop rbp
  0007: C3 ret
=


Re: How to use a char[] buffer in D

2016-06-23 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 23 June 2016 at 05:59:10 UTC, Andrew Chapman wrote:

Perfect, thank you! :-) Works like a charm.

On Wednesday, 22 June 2016 at 22:41:24 UTC, H. S. Teoh wrote:
On Wed, Jun 22, 2016 at 09:57:04PM +, Andrew Chapman via 
Digitalmars-d-learn wrote:



Maybe try:

if (buffer[] in myHash) { ... }

?  Does that make a difference?


T


If the keys are fixed-length, you may want to consider using 
immutable(char[4]) as key. That way there is no GC allocation for 
the strings at all, the only allocations are done by the AA.


Re: Templated class defaults and inheritence

2016-06-19 Thread Rene Zwanenburg via Digitalmars-d-learn

On Saturday, 18 June 2016 at 17:48:47 UTC, Joerg Joergonson wrote:

class foo(T) if (is(T : subfoo)) X;


FYI this can also be done in the template parameter list:

class foo(T : subfoo){}


Re: Weird compiler

2016-06-19 Thread Rene Zwanenburg via Digitalmars-d

On Sunday, 19 June 2016 at 14:45:29 UTC, mogu wrote:
Moreover, I wonder if D is really a cross-platform programming 
language?! The official dmd only supports x86 structure. You 
can never build a project with third party static library in 
windows independently.


Back when DMD on windows exclusively used the OMF object format 
and optlink, a common complaint was that DMD didn't use the 
microsoft tools. I guess the DMD installer could ask to install 
the SDK when VS isn't present though.


And how I can build an android program? LDC2? So what dmd is? 
Only for a bit faster compiling time?


Yeah, use LDC or GDC for the fastest executables and widest 
platform support. Don't underestimate the value of fast 
compilation, it's incredibly useful while writing code.


After a whole day struggled in dmd and static library, I 
rewrote the demo GUI tool in Nim. Only in ten minutes, all 
works. Sigh.


You can always post in the forums if you're stuck. The learn 
forum is quite active most of the day.


Re: Weird compiler

2016-06-19 Thread Rene Zwanenburg via Digitalmars-d

On Sunday, 19 June 2016 at 14:05:22 UTC, mogu wrote:
Today, I'm working on a private GUI tool which must be run at 
linux and windows. It's awful that I compile a little 64bit 
program(or -m32mscoff) in windows must have visual studio which 
has tremendous size installed even though I only need a linker. 
It's weird that a compiler compiles to binary targets needs 
another compiler or tools. Sigh.


There's no need to install VS if you don't use it otherwise, the 
windows platform SDK should suffice; it comes with the microsoft 
linker and all the lib files, and the DMD installer should detect 
it just fine.


Re: Out of order execution

2016-06-16 Thread Rene Zwanenburg via Digitalmars-d-learn

On Thursday, 16 June 2016 at 01:57:19 UTC, Joerg Joergonson wrote:

Is there an efficient lazy way to make this happen?


No, I don't see how that would work.

Suppose I can't run the loop twice for performance 
reasons(there is other stuff in it) and I don't want to store 
the state and call info then sort them out afterwards.


Storing the state is your best bet. Based on your recent post 
about OpenGL I assume this is for the same project?


If so, you can reuse the storage buffer between frames. Generally 
speaking it's the allocations that are slow, copying some state 
to a buffer shouldn't be expensive. Use separate buffers for the 
Do1 and Do2 calls so you don't have to sort.


Re: GTKD - Application crashes - or not? [Coedit]

2016-06-15 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 15 June 2016 at 10:31:18 UTC, TheDGuy wrote:
Thanks a lot for your answer, getcwd() returns the path where 
coedit is located on my harddrive:

C:\Program Files (x86)\Coedit_32\coedit.2update6.win32

How can i change that?


I'm not familiar with Coedit, but the run options seem to contain 
a field for setting it:

https://github.com/BBasile/Coedit/wiki#run-options

You may be able to use the symbolic strings there:
https://github.com/BBasile/Coedit/wiki#symbolic-strings


Re: GTKD - Application crashes - or not? [Coedit]

2016-06-15 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 15 June 2016 at 09:48:19 UTC, TheDGuy wrote:
But if i execute the app my hand (in the windows command window 
or my double click) it works as expected (so no error)? Why is 
that?


My first guess would be that Coedit does not use the directory 
where the executable is located as working directory. You can 
check what getcwd returns:

https://dlang.org/phobos/std_file.html#.getcwd


Re: What's up with GDC?

2016-06-14 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 13 June 2016 at 20:21:28 UTC, Joerg Joergonson wrote:
Are you running some other program that might be sending a lot 
of broadcast messages?




Not that I know of. I haven't tried running it outside VS 
though so it might be doing something weird. I'll investigate 
further when I get a chance and get further down the road.


It's often useful to attach a sampling profiler when the process 
is eating CPU. It should tell you what's going on at a glance.


I believe VS has a sampling profiler built in, but it most likely 
won't demangle D symbols, so the function names will be a bit 
hard to read.


Re: Range and poolTask

2016-06-06 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 6 June 2016 at 10:26:11 UTC, moechofe wrote:
The functions passed to map or amap take the type of the 
element of the range as argument, but not a range itself.


Right. I don't think I understand what the semantics of your 
example would be though.. Could you elaborate a bit?


Re: Range and poolTask

2016-06-06 Thread Rene Zwanenburg via Digitalmars-d-learn

On Monday, 6 June 2016 at 09:32:30 UTC, moechofe wrote:

I wonder if it is possible to write something like this:
---
// taskPool.distribute -- take a range and distribute entries 
to different threads.

dirEntries().distribute(function(R1,R2)(R1 from,R2 to){
from
.filter!xxx
.map!yyy
.tee!zzz(to);
})
.each!www;
---
This would be great.


This might be useful:

http://dlang.org/phobos/std_parallelism.html#.TaskPool

Or, more specifically,

http://dlang.org/phobos/std_parallelism.html#.TaskPool.amap
http://dlang.org/phobos/std_parallelism.html#.TaskPool.map


Re: Creating a "fixed-range int" with opDispatch and/or alias this?

2016-06-01 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 1 June 2016 at 19:59:51 UTC, Mark Isaacson wrote:
FWIW, the fixed range int part of this question is just an 
example, I'm mostly just interested in whether this idea is 
possible without a lot of bloat/duplication.


I suspect not.. Here's how std.typecons.Proxy is doing it:

https://github.com/dlang/phobos/blob/master/std/typecons.d#L5109


Re: Using referenceCounters

2016-06-01 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 1 June 2016 at 18:14:33 UTC, Begah wrote:
I started using reference counters for my assets in my 
application :

 - Images
 - Models
 - 


For my resource manager I started out with something similar to 
what you're describing, but I eventually changed the design which 
turned out to be an immense improvement so I'll just describe 
that ^^


- Differentiate between the type implementing a resource, and 
handles to a resource.
- Split up the resource manager, which stores the 'real' resource 
for a given handle, and the cache where you look up resources by 
name.


A stripped down version of the resource manager looks something 
like this:




template ResourceManager(ResourceType)
{
  struct HandleImpl
  {
~this()
{
  // Destroy the resource, make sure you mark the 
corresponding slot in the array as free

}

size_t slot;
  }

  alias Handle = RefCounted!HandleImpl;

  private ResourceType[] resources;

  // When creating a resource add it to the manager and pass 
around the opaque handle instead.

  Handle add(ResourceType resource)
  {
// Find an empty slot in the resources array, put the 
resource there, and return a handle pointing to that slot.

  }

  // This should be used sparingly. Most code shouldn't care 
about resource implementation. The parts that do can get at it 
via this function, but shouldn't hold on to the reference longer 
than necessary.

  ResourceType getActualResource(Handle handle) { ... }

  // This allows you to hot-swap resources while keeping the 
resource implementation logically const. Hot-swapping is 
extremely valuable, I've always found myself wanting to support 
it sooner or later. I've tried to do it in different ways, but it 
always ended up in a mess. Using handles on the other hand turned 
out to be clean and easy.

  void update(Handle handle, ResourceType newResource) { ... }
}



Note that it doesn't allow you to search for resource by name or 
anything, this is just a simple mapping between handles and the 
resource implementation. It doesn't store instances of the 
RefCounted handles itself, so there are no issues with resources 
not being cleaned up.


Now when you have this in place you can build a caching mechanism 
on top of it:




template ResourceCache(ResourceType, alias loadByName)
{
  alias Manager = ResourceManager!ResourceType;

  Manager.Handle[string] cache;

  Manager.Handle get(string name)
  {
// Check if the resource is already in the cache, if not load 
it using the loadByName function and store it.

  }

  void purge()
  {
// the keys property allocates a new array with the AA keys, 
which is important since we're modifying the AA.

foreach(key; cache.keys)
{
  // This is the part you were actually interested in. It's 
important to take a pointer to the handle here, and not reference 
it directly. I had some issues with that in the past, I'm not 
sure if that's still the case.

  auto ptr = key in cache;
  if(ptr.refCountedStore.refCount == 1) // If this is the 
last reference

  {
destroy(*ptr); // I'm not sure if this is still 
necessary, there was some issue with AAs in the past. It may be 
fixed today. Destroying the handle doesn't hurt either way so I 
left it in.

cache.remove(key);
  }
}
  }
}



So cached resources don't get cleaned automatically if you don't 
call purge, but that's usually the right thing to do anyways. For 
example when you're changing scenes (I assume this is for some 
kind of game?) you can simply destroy the current scene, load 
another, then purge the cache, without having to reload resources 
used by both scene 1 and 2.


Another upside is that this doesn't require every resource to be 
named / backed by file. Resources can be dynamically generated at 
runtime without special casing anywhere.


Re: Base64 of String without casting

2016-06-01 Thread Rene Zwanenburg via Digitalmars-d-learn

On Wednesday, 1 June 2016 at 09:31:51 UTC, tcak wrote:
I understand that Base64 uses Ranges, and since String is seen 
and used as unicode by Ranges (please tell me if I am wrong).


I am guessing, for this reason, auto btoa = 
std.base64.Base64.encode("Blah"); doesn't work. You need to be 
casting the string to ubyte[] to make it work which doesn't 
look and feel nice at all.


Can/shall we add another alias into the module for encode 
method, so it accepts a string, and casts it to ubyte[] by 
itself?


This should do the trick:

https://dlang.org/phobos/std_string.html#.representation


Re: Preferred method of creating objects, structs, and arrays with deterministic memory management

2016-06-01 Thread Rene Zwanenburg via Digitalmars-d-learn
I was wondering: what's the preferred method for deterministic 
memory management?


You may be interested in RefCounted. It only works for structs, 
not classes, but it's still useful.


 - Classes/Structs have constructors and destructors. I am 
unconfident with my knowledge as to how this works with malloc 
and free.


malloc() and free() operate on a lower level, they only care 
about raw memory. When you malloc() some space, you can construct 
an object there using emplace(), and it can be destructed by 
using detroy().


- Many features and types use the GC such as exceptions, the 
new keyword, and all arrays except statics.


It's important to differentiate static arrays, and slices with 
static storage. For example:


class C
{
  static int[] someSlice; // This is a slice with static storage. 
The memory it is referring to may be GC allocated, but it doesn't 
have to (this is true for all slices btw).


  int[4] someStaticArray; // This is a static array, i.e. an 
array with a fixed length. In D static arrays are value types, so 
it's allocated in its enclosing scope and copied when you pass it 
around.

}

 - std.container.array can be used for deterministic arrays, 
but has the issue of dangling pointers. There is probably a 
good solution to this, but I don't know it.


I don't know of any dangling pointer issues with Array. It's 
possible to create cycles resulting in a leak, but that's only 
likely to happen if you heavily rely on refcounting everything.


 - There seems to be no way to completely turn off the GC. That 
is, never have the runtime allocate the memory used by the GC.


Like Rikki said, if you really want to the GC can be replaced 
with an asserting stub. This isn't as hard as it sounds, just add 
something like the file he linked to to your project. Since all 
declarations are extern(C) there is no name mangling, and the 
linker will prefer your own definitions over the ones in 
druntime. I don't recommend you do this though unless you really 
know what you're doing.


This are the pieces I've gathered, but I don't really know 
what's true or how to use this knowledge. Some ideas I've 
gleaned may also be outdated. Does anyone know the "correct" 
way one would go about a non-GC program, and if a program can 
be ran without ever instantiating a GC? Has there been any 
progress on reducing the std library's usage of the GC?


You can annotate your functions as @nogc. The compiler will 
disallow any potential GC use, including calling other functions 
that are not @nogc.


P0nce is doing real time audio stuff, iirc he's using a thread 
with a @nogc entry point for the strictly real-time parts, and 
regular GC-using code in another thread for everything else.


  1   2   3   >