View mode: basic / threaded / horizontal-split · Log in · Help
January 06, 2012
Re: Problem with Hiredis Binding
On 1/6/2012 11:38 AM, Puming wrote:
> On Thursday, 5 January 2012 at 22:02:25 UTC, Andrej Mitrovic wrote:
>
>> Your problem is that you're calling printf on a static char array. If
>> you're going to use printf you have to use it on the .ptr (pointer)
>> field of the static array. Replace this call:
>>
>> printf("Connection error: %s\n", c.errstr);
>> with
>> printf("Connection error: %s\n", c.errstr.ptr);
>>
>> On my end I get:
>> Connection error: Connection refused
>>
>> Also I think you should replace the "int integer" in struct redisReply
>> to "long integer". I think `long long` in C is 8 bytes, which is the
>> equivalent to D's long type.
>
> Thanks for the tip. I've changed code as you suggested.
> And for the type `long long`, I changed `int` to `c_long` (in
> core.stdc.config) according to http://dlang.org/interfaceToC.html
>
> But there is still problem. My code does actually connect, as I have a
> redis-server running on my machine, and the commands actually runned, as
> I use a redis-cli and found that "foo : bar" is actually set into redis.
> But
>
> ---
> reply = cast(redisReply*) redisCommand(c, "GET foo");
> writefln("GET foo: %s", *reply);
> writefln(to!string(reply.str));
> ----
>
> output these:
>
> ---
> GET foo: redisReply(1, 0, 0, 2, 152397072, 0)
> 80B1F42
> 段错误 // (which is Chinese for Segfault)
> ---
>
> So maybe I got it wrong when converting char* to string?
>
>
>

I think the problem still lies with your declaration of the integer 
field. c_long in D is supposed to be equivalent to the long type in C, 
*not* long long. It is declared as 32 bits on a 32-bit system and 64 
bits on a 64-bit system. I believe that in practice, most C compilers 
implement long long as 64 bits on both 32- and 64-bit systems. I 
recommend you use long on the D side, rather than c_long. And, actually, 
it would be best to compile a test with the same C compiler used to 
compile redis to verify the size of long long.
January 06, 2012
Re: Problem with Hiredis Binding
> I think the problem still lies with your declaration of the 
> integer field. c_long in D is supposed to be equivalent to the 
> long type in C, *not* long long. It is declared as 32 bits on a 
> 32-bit system and 64 bits on a 64-bit system. I believe that in 
> practice, most C compilers implement long long as 64 bits on 
> both 32- and 64-bit systems. I recommend you use long on the D 
> side, rather than c_long. And, actually, it would be best to 
> compile a test with the same C compiler used to compile redis 
> to verify the size of long long.

I changed c_long to long and it actually works !!! Thanks very 
much. Now I'm wondering should I use `long` or do some static 
check for the type just like what c_long does for C' long type? 
I'm only using 32bit Ubuntu, so not able to check this on other 
systems. Wonder whether there is a c_long_long type.

In http://dlang.org/interfaceToC.html it says in 32bit system 
c_long is equivalent to `long long` in C. Is this wrong?
January 06, 2012
Re: Problem with Hiredis Binding
Here is what I've got so far:

1. "long long" in C is always 64bit, so in D it's "long";
2. C's char* string should be converted to!string when used in 
"writeln";
3. String literals in D -IS- zero terminated;

And now it's working fine. Thanks everybody :)
January 06, 2012
Re: Problem with Hiredis Binding
On 1/6/2012 2:34 PM, Puming wrote:
>
>>
> In http://dlang.org/interfaceToC.html it says in 32bit system c_long is
> equivalent to `long long` in C. Is this wrong?

Well, either the documentation is wrong or the implementation is. Looks 
like one for Bugzilla.
January 06, 2012
Re: Problem with Hiredis Binding
Mike Parker wrote:

> On 1/6/2012 2:34 PM, Puming wrote:
>>
>>>
>> In http://dlang.org/interfaceToC.html it says in 32bit system c_long is
>> equivalent to `long long` in C. Is this wrong?
> 
> Well, either the documentation is wrong or the implementation is. Looks
> like one for Bugzilla.

The documentation is wrong. c_long is meant to be used _only_ for C's "long" 
type, so it must be 32bit for 32bit architectures and 64bit for (most) 64bit 
architectures. See also: http://en.wikipedia.org/wiki/64-bit#64-
bit_data_models

No need to file a bug though, I posted a fix here: https://github.com/D-
Programming-Language/d-programming-language.org/pull/55
January 06, 2012
Re: Problem with Hiredis Binding
Puming:

> 1. "long long" in C is always 64bit, so in D it's "long";

In C "long long" isn't always 64 bit.

Bye,
bearophile
January 06, 2012
Re: Problem with Hiredis Binding
On 1/6/12, Johannes Pfau <spam@example.com> wrote:
> The documentation is wrong.

That was my fault. I was going to fix the original docs which had no
mention of c_long/c_ulong and I ended up screwing up the tables.
Sorry!
Next ›   Last »
1 2
Top | Discussion index | About this forum | D home