Re: LDC / BetterC / _d_run_main

2018-03-10 Thread Richard via Digitalmars-d-learn

On Saturday, 10 March 2018 at 10:57:05 UTC, Johan Engelen wrote:

On Saturday, 10 March 2018 at 07:54:33 UTC, Mike Franklin wrote:

On Saturday, 10 March 2018 at 02:25:38 UTC, Richard wrote:

Hi,
I've been trying to see if I can get an mbed project to work 
with Dlang

basically compiling D code for use on a Cortex-M Proccessor


You might be interested in the following, if you're not 
already aware:

 * https://github.com/JinShil/stm32f42_discovery_demo
 * https://bitbucket.org/timosi/minlibd


There is also: https://github.com/kubo39/stm32f407discovery and 
its submodules.


The STM32 demo only supports GDC right now, but I'll be 
updating it to support LDC when 2.079.0 lands there.


Awesome.

-Johan


That's interesting
I've uploaded by own setup over here if anyone's interested

  * https://github.com/grbd/GBD.Dlang.MbedBlinkyTest




Re: LDC / BetterC / _d_run_main

2018-03-10 Thread Richard via Digitalmars-d-learn

On Saturday, 10 March 2018 at 07:54:33 UTC, Mike Franklin wrote:

On Saturday, 10 March 2018 at 02:25:38 UTC, Richard wrote:

Hi,
I've been trying to see if I can get an mbed project to work 
with Dlang

basically compiling D code for use on a Cortex-M Proccessor


You might be interested in the following, if you're not already 
aware:

 * https://github.com/JinShil/stm32f42_discovery_demo
 * https://bitbucket.org/timosi/minlibd

The STM32 demo only supports GDC right now, but I'll be 
updating it to support LDC when 2.079.0 lands there.  2.079.0 
removes some coupling of the compiler to the runtime, so I 
should be able to avoid the following bugs:


https://github.com/ldc-developers/ldc/issues/created_by/JinShil


so I tried this instead
```
extern (C) int _d_run_main(int argc, char **argv, void* 
mainFunc) {

MainFuncType mFunc = cast(MainFuncType) mainFunc;
return mFunc(null);
}
```

but nope that didn't seem to work ether, compiles okay but the 
code in main() (D space) isn't called
I'd imagine this should be a simple thing, anyone got any 
ideas?


The following worked fine for me on my x64 Linux desktop with 
LDC version 1.8.0 (DMD v2.078.3, LLVM 5.0.1)


``` main.d
import core.stdc.stdio;

private alias extern(C) int function(char[][] args) 
MainFuncType;
extern (C) int _d_run_main(int argc, char **argv, void* 
mainFunc)

{
MainFuncType mFunc = cast(MainFuncType) mainFunc;
return mFunc(null);
}

void main()
{
printf("Hello, World!\n");
}
```

Compile with: ldc2 -defaultlib= -debuglib= -betterC main.d

Mike



Based on the above this seems to work fine so I'll use this since 
it's the simplest option.

```
extern(C) int main(int argc, char** argv) {
return d_main();
}

int d_main() {
  // Do stuff
}
```


This compiles but main() is never called btw
```
import core.stdc.stdio;

private alias extern(C) int function(char[][] args) MainFuncType;
extern (C) int _d_run_main(int argc, char **argv, void* mainFunc)
{
MainFuncType mFunc = cast(MainFuncType) mainFunc;
return mFunc(null);
}

int main() {
  // Do stuff
}
```
I tried compiling with
ldc2 -defaultlib= -debuglib= -mtriple=thumb-none-linux-eabi 
-mcpu=cortex-m3 --od=. -c -betterC main.d




LDC / BetterC / _d_run_main

2018-03-09 Thread Richard via Digitalmars-d-learn

Hi,
I've been trying to see if I can get an mbed project to work with 
Dlang

basically compiling D code for use on a Cortex-M Proccessor
So far I've been using the latest release of LDC with the 
-BetterC Flag
From what I can gather, normally without -BetterC it works like 
this:


  * main() - C main generated by the compiler
  * _d_run_main - called by C main to setup the runtime
  * _Dmain - main function in D land, is called by _d_run_main

With -BetterC enabled, it instead works like this

  * main() - C main generated by the compiler
  * _d_run_main - needs to be written by the user since there's 
no runtime

  * _Dmain - main function in D land

so basically I need to write my own basic _d_run_main to call 
_Dmain.

Code in github does something like this typically
```
private alias extern(C) int function(char[][] args) MainFunc;
private extern (C) int _d_run_main(int argc, char** argv, 
MainFunc mainFunc)

{
return mainFunc(null);
}
```

However the LDC compiler doesn't like this as it expects the 
mainFunc parameter to be a void pointer

so I tried this instead
```
extern (C) int _d_run_main(int argc, char **argv, void* mainFunc) 
{

MainFuncType mFunc = cast(MainFuncType) mainFunc;
return mFunc(null);
}
```

but nope that didn't seem to work ether, compiles okay but the 
code in main() (D space) isn't called

I'd imagine this should be a simple thing, anyone got any ideas?



Re: question about conditional operator (?:)

2016-07-26 Thread Richard via Digitalmars-d-learn

On Tuesday, 26 July 2016 at 13:19:54 UTC, ag0aep6g wrote:
Operator precedence is different from what you think. `a ? b : 
c = d` means `(a ? b : c) = d`. But you want `a ? b : (c = d)`. 
So you need parentheses around `p+=1`.


Or just go with `if` and `else`. It's clearer anyway.


From http://wiki.dlang.org/Operator_precedence

Priority(15 is highest)
3  Conditional operator  ?: 
2  Assignment operators= -= += <<= >>= 
>>>= = *= %= ^= ^^= ~=


I was actually close to not needing parentheses :). But I see 
that your suggestion to stick with if else in this case is the 
sensible thing to do, especially since ?: seems to lead to more 
errors. Thanks for the answers.


question about conditional operator (?:)

2016-07-26 Thread Richard via Digitalmars-d-learn

Hello all,

I've got a program that correctly computes the largest factor in 
the prime decomposition of a positive number:


*
import std.math std.stdio;

ulong largestPrimeFactor(ulong n) {
for(ulong p=2; p<=sqrt(cast(real)n); ) {
if(n%p==0)
n/=p;
else
p+=1;
}
return n;
}

void main() {
writeln(largestPrimeFactor(4));
}
*

However, if I replace the content of the for loop with the ?: 
operator, the program is not

correct anymore (largestPrimeFactor(4) now returns 3):

*
import std.math std.stdio;

ulong largestPrimeFactor(ulong n) {
for(ulong p=2; p<=sqrt(cast(real)n); ) {
n%p==0 ? n/=p : p+=1 ;
}
return n;
}

void main() {
writeln(largestPrimeFactor(4));
}
*

What am I doing wrong here?
I'm using dmd version 2.071.1-0 on ubuntu.