Talk:Use another language to call a function: Difference between revisions

From Rosetta Code
Content added Content deleted
(→‎C code is wrong: +1 on fix.)
Line 53: Line 53:
I would like to fix the C code (by changing <tt>unsigned Size</tt> to <tt>size_t Size</tt>, and while there, by adding to main() some return statements), but I worry that if I fix the C code, then I will destroy all the examples that use the old C code. --[[User:Kernigh|Kernigh]] 15:45, 12 February 2011 (UTC)
I would like to fix the C code (by changing <tt>unsigned Size</tt> to <tt>size_t Size</tt>, and while there, by adding to main() some return statements), but I worry that if I fix the C code, then I will destroy all the examples that use the old C code. --[[User:Kernigh|Kernigh]] 15:45, 12 February 2011 (UTC)


I'd say fix it. Go saw that as a problem too. &mdash;[[User:Sonia|Sonia]] 23:35, 12 February 2011 (UTC)
:I'd say fix it. Go saw that as a problem too. &mdash;[[User:Sonia|Sonia]] 23:35, 12 February 2011 (UTC)

:+1 on fix. There is a template to warn others to review their entries too, but I can't remember what it is ... ... nope, still can't remember. --[[User:Paddy3118|Paddy3118]] 06:02, 13 February 2011 (UTC)

Revision as of 06:02, 13 February 2011

I am unsure if this is same as C FFI, or not. If yes, then merge. --Dmitry-kazakov 13:57, 11 August 2009 (UTC)

It's not. Call foreign language function and C FFI are the same task in essence though (and there are other closely related ones too; this is an area needing some rationalization). —Donal Fellows 11:46, 17 August 2009 (UTC)

Task needs work/splitting?

While writing the Tcl implementation, it occurred to me that a number of languages might want to deal with the cases where a parameter is an ‘in’ parameter differently from the case given (really a single ‘out’ parameter, plus a bit of metadata to describe the buffer size). No time to work on this now though. —Donal Fellows 13:10, 18 August 2009 (UTC)

C code is wrong

<lang c>#include <stdio.h>

extern int Query (char * Data, size_t * Length);

int main (int argc, char * argv []) {

  char     Buffer [1024];
  unsigned Size = sizeof (Buffer);
  
  if (0 == Query (Buffer, &Size))
  {
     printf ("failed to call Query\n");
  }
  else
  {
     char * Ptr = Buffer;
     while (Size-- > 0) putchar (*Ptr++);
     putchar ('\n');
  }

}</lang>

<lang c>#include <stdio.h>

int Query (char * Data, size_t * Length) {

  printf("Length = %zu, 0x%zx\n", *Length, *Length);
  return 0;

}</lang>

$ cc -v
Reading specs from /usr/lib/gcc-lib/amd64-unknown-openbsd4.8/4.2.1/specs
Target: amd64-unknown-openbsd4.8
Configured with: OpenBSD/amd64 system compiler
Thread model: posix
gcc version 4.2.1 20070719 
$ cc -o main main.c query.c
main.c: In function 'main':
main.c:10: warning: passing argument 2 of 'Query' from incompatible pointer type
$ ./main 
Length = 7971459302400, 0x74000000400
failed to call Query

It should say 'Length = 1024', not 'Length = 7971459302400'. The problem is that main() passed an unsigned * but Query() expects size_t *. On my machine, unsigned is 4 bytes but size_t is 8 bytes.

I would like to fix the C code (by changing unsigned Size to size_t Size, and while there, by adding to main() some return statements), but I worry that if I fix the C code, then I will destroy all the examples that use the old C code. --Kernigh 15:45, 12 February 2011 (UTC)

I'd say fix it. Go saw that as a problem too. —Sonia 23:35, 12 February 2011 (UTC)
+1 on fix. There is a template to warn others to review their entries too, but I can't remember what it is ... ... nope, still can't remember. --Paddy3118 06:02, 13 February 2011 (UTC)