English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
Caml interface with C on x86_64
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2006-03-13 (18:05)
From: Li-Thiao-Té_Sébastien <sayan@c...>
Subject: Re: [Caml-list] Allocating caml lists from C : possible bug on amd64
Xavier Leroy wrote:
>>I have already tried to be GC-friendly, and use the "standard" way to do
>>things. For example the following function also works using a 32-bit
>>chroot, but also fails with the 64-bit compiler. The question is : why
>>does it fail with the 64-bit compiler?
> Because your C code is wrong.  gcc -Wall is your friend.
>>#include <stdio.h>
>>#include <caml/mlvalues.h>
>>#include <caml/memory.h>
>>#include <caml/bigarray.h>
>>test_liste (value str) {
> Should be "value test_list(value str)".
Indeed, but my previous mail to this list read "value test_liste (value 
str)". No problem noticed without it.

>>   // test function to return a list to caml
>>//   value cons;
>>//   cons = caml_alloc_small (2,0);
>>//   caml_modify(&Field(cons,0),Val_int(0));
>>//   caml_modify(&Field(cons,1),Val_int(0));
>>   CAMLparam1(str);
>>   CAMLlocal1(cons);
>>   cons = caml_alloc (2,0);
> You haven't declared caml_alloc (include <caml/alloc.h>), so the C
> compiler assumes it returns an int instead of a value, and generates
> wrong code.
That was the main problem.

>>   Store_field(cons,0, Val_int(1));
>>   Store_field(cons,1, Val_int(0));
>>   printf("This is test_liste.\n");
>>   printf(String_val(str));
> Should be:  printf("%s", String_val(str));
> (Hint: what happens if str contains "%s" ?)
Well, that one was rather a non-production-ready test anyway. I was 
blocked before even reaching that point.

Thanks very much for the help and the -Wall flag. I should have known :)

Li-Thiao-Té Sébastien