* mixing C/C++
@ 2003-11-08 9:30 Elias Athanasopoulos
2003-11-08 13:36 ` James Stevenson
2003-11-10 15:00 ` Matthew Studley
0 siblings, 2 replies; 8+ messages in thread
From: Elias Athanasopoulos @ 2003-11-08 9:30 UTC (permalink / raw)
To: linux-c-programming
Hello!
I want to create Ruby bindings for a C++ project, so my first
step is to call C++ code from C, since Ruby has a plain C API.
Consider I have a Foo class which its implementation is compiled
in a shared lib (libtest.so). I have a second wrapper lib:
#include "libtest.h"
extern "C" class Foo * wrap_foo_ctor() { return new Foo(); }
extern "C" void wrap_foo_set_food(Foo *f, int i) { f->set_food(i); }
extern "C" int wrap_foo_hello(Foo *f) { return f->hello(); }
Using the above my C program is:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
struct Foo *m = (struct Foo*) wrap_foo_ctor();
wrap_foo_set_food(m, 10);
wrap_foo_hello(m);
free(m);
return 1;
}
And:
elathan@velka:~/src/bindings> gcc foo.c -Wall -ltest -lwrap -o foo -L/home/elathan/src/bindings
foo.c: In function `main':
foo.c:6: warning: implicit declaration of function `wrap_foo_ctor'
foo.c:8: warning: implicit declaration of function `wrap_foo_set_food'
foo.c:9: warning: implicit declaration of function `wrap_foo_hello'
elathan@velka:~/src/bindings> ./foo
10
My main question is how to silent the implicit declaration warning in
gcc, which is, of course, correct. I want everything to compile with -Wall.
Is there a warkaround?
I tried to create a C header file, but I don't know how to make a C prototype
of:
class Foo * wrap_foo_ctor() { return new Foo(); }
Or silent the 'icompatible pointer type' warning in declarations, such as:
int wrap_foo_hello(Foo *f) { return f->hello(); }
TIA,
--
University of Athens I bet the human brain
Physics Department is a kludge --Marvin Minsky
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: mixing C/C++ 2003-11-08 9:30 mixing C/C++ Elias Athanasopoulos @ 2003-11-08 13:36 ` James Stevenson 2003-11-10 15:00 ` Matthew Studley 1 sibling, 0 replies; 8+ messages in thread From: James Stevenson @ 2003-11-08 13:36 UTC (permalink / raw) To: Elias Athanasopoulos; +Cc: linux-c-programming Hi this is because you program doesnt know what the functions are called so you need to add protypes. Either create a header and put a prototype of the function name in there and include the header file or add the prototypes to the top of the C file. James On Sat, 8 Nov 2003, Elias Athanasopoulos wrote: > Hello! > > I want to create Ruby bindings for a C++ project, so my first > step is to call C++ code from C, since Ruby has a plain C API. > > Consider I have a Foo class which its implementation is compiled > in a shared lib (libtest.so). I have a second wrapper lib: > > #include "libtest.h" > > extern "C" class Foo * wrap_foo_ctor() { return new Foo(); } > extern "C" void wrap_foo_set_food(Foo *f, int i) { f->set_food(i); } > extern "C" int wrap_foo_hello(Foo *f) { return f->hello(); } > > Using the above my C program is: > > #include <stdio.h> > #include <stdlib.h> > > int main(void) > { > struct Foo *m = (struct Foo*) wrap_foo_ctor(); > > wrap_foo_set_food(m, 10); > wrap_foo_hello(m); > > free(m); > > return 1; > } > > And: > > elathan@velka:~/src/bindings> gcc foo.c -Wall -ltest -lwrap -o foo -L/home/elathan/src/bindings > foo.c: In function `main': > foo.c:6: warning: implicit declaration of function `wrap_foo_ctor' > foo.c:8: warning: implicit declaration of function `wrap_foo_set_food' > foo.c:9: warning: implicit declaration of function `wrap_foo_hello' > elathan@velka:~/src/bindings> ./foo > 10 > > > My main question is how to silent the implicit declaration warning in > gcc, which is, of course, correct. I want everything to compile with -Wall. > Is there a warkaround? > > I tried to create a C header file, but I don't know how to make a C prototype > of: > > class Foo * wrap_foo_ctor() { return new Foo(); } > > Or silent the 'icompatible pointer type' warning in declarations, such as: > > int wrap_foo_hello(Foo *f) { return f->hello(); } > > TIA, > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: mixing C/C++ 2003-11-08 9:30 mixing C/C++ Elias Athanasopoulos 2003-11-08 13:36 ` James Stevenson @ 2003-11-10 15:00 ` Matthew Studley 2003-11-10 17:37 ` Elias Athanasopoulos 1 sibling, 1 reply; 8+ messages in thread From: Matthew Studley @ 2003-11-10 15:00 UTC (permalink / raw) To: Elias Athanasopoulos, linux-c-programming Have you considered using SWIG to automatically generate your wrappers? ... SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages. SWIG is primarily used with common scripting languages such as Perl, Python, Tcl/Tk, and Ruby... http://www.swig.org/ May be a useful resource. I've used it with C and Python. regards Matt ----- Original Message ----- From: Elias Athanasopoulos <elathan@phys.uoa.gr> To: <linux-c-programming@vger.kernel.org> Sent: Saturday, November 08, 2003 9:30 AM Subject: mixing C/C++ > Hello! > > I want to create Ruby bindings for a C++ project, so my first > step is to call C++ code from C, since Ruby has a plain C API. > > Consider I have a Foo class which its implementation is compiled > in a shared lib (libtest.so). I have a second wrapper lib: > > #include "libtest.h" > > extern "C" class Foo * wrap_foo_ctor() { return new Foo(); } > extern "C" void wrap_foo_set_food(Foo *f, int i) { f->set_food(i); } > extern "C" int wrap_foo_hello(Foo *f) { return f->hello(); } > > Using the above my C program is: > > #include <stdio.h> > #include <stdlib.h> > > int main(void) > { > struct Foo *m = (struct Foo*) wrap_foo_ctor(); > > wrap_foo_set_food(m, 10); > wrap_foo_hello(m); > > free(m); > > return 1; > } > > And: > > elathan@velka:~/src/bindings> gcc foo.c -Wall -ltest -lwrap -o foo -L/home/elathan/src/bindings > foo.c: In function `main': > foo.c:6: warning: implicit declaration of function `wrap_foo_ctor' > foo.c:8: warning: implicit declaration of function `wrap_foo_set_food' > foo.c:9: warning: implicit declaration of function `wrap_foo_hello' > elathan@velka:~/src/bindings> ./foo > 10 > > > My main question is how to silent the implicit declaration warning in > gcc, which is, of course, correct. I want everything to compile with -Wall. > Is there a warkaround? > > I tried to create a C header file, but I don't know how to make a C prototype > of: > > class Foo * wrap_foo_ctor() { return new Foo(); } > > Or silent the 'icompatible pointer type' warning in declarations, such as: > > int wrap_foo_hello(Foo *f) { return f->hello(); } > > TIA, > -- > University of Athens I bet the human brain > Physics Department is a kludge --Marvin Minsky > > > - > To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > > > This incoming email to UWE has been independently scanned for viruses and any virus detected has been removed using McAfee anti-virus software > > > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: mixing C/C++ 2003-11-10 15:00 ` Matthew Studley @ 2003-11-10 17:37 ` Elias Athanasopoulos 2003-11-12 4:35 ` convert INT to CHAR but print's BEEP J. 0 siblings, 1 reply; 8+ messages in thread From: Elias Athanasopoulos @ 2003-11-10 17:37 UTC (permalink / raw) To: Matthew Studley; +Cc: linux-c-programming On Mon, Nov 10, 2003 at 03:00:31PM -0000, Matthew Studley wrote: > Have you considered using SWIG to automatically generate your wrappers? > > ... SWIG is a software development tool that connects programs written in C > and C++ with a variety of high-level programming languages. SWIG is > primarily used with common scripting languages such as Perl, Python, Tcl/Tk, > and Ruby... Yes, I have tried it. I found it quite complicated in the sense that I can't control stuff; it's difficult to hack the auto-generated swig files. Also, it lacks compatibility with Ruby 1.8. Thanks for your reply. Regards, -- University of Athens I bet the human brain Physics Department is a kludge --Marvin Minsky ^ permalink raw reply [flat|nested] 8+ messages in thread
* convert INT to CHAR but print's BEEP... 2003-11-10 17:37 ` Elias Athanasopoulos @ 2003-11-12 4:35 ` J. 2003-11-12 7:11 ` Mikael Aronsson 2003-11-13 6:36 ` convert INT to CHAR but print's BEEP Jeff Woods 0 siblings, 2 replies; 8+ messages in thread From: J. @ 2003-11-12 4:35 UTC (permalink / raw) To: linux-c-programming Wednesday, November 12 05:19:21 Hello, I have kind of a problem with converting an int to a char. The get_rand_str() function returns an string build of random charaters with a max length of int `MAX'. This seems to work at first glance: ~: ./program qqxfrd However if I examen the output closer: ~: ./program | od -a 0000000 q q soh x stx f etx r eot d enq nl 0000014 Now I know why my computer keeps beeping everytime it outputs a string :-) What is the correct way of changing the int value to a char value so that I can append it to the return string ? char *get_rand_str(int max) { int i = 0; char value; char *retval = NULL; for(; i < max; i++) { value = get_ascii_code(97, 122); retval = (char *)realloc(retval, sizeof(char)); strcat(retval, &value); } return retval; free(retval); } int get_ascii_code(int low, int high) { int k = 0; double d = 0; d = (double)rand() / ((double)RAND_MAX + 1); k = (int)(d * (high - low + 1)); return(low + k); } Thank you.... J. -- KonkyFong ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: convert INT to CHAR but print's BEEP... 2003-11-12 4:35 ` convert INT to CHAR but print's BEEP J. @ 2003-11-12 7:11 ` Mikael Aronsson 2003-11-13 1:26 ` convert INT to CHAR - SOLVED J. 2003-11-13 6:36 ` convert INT to CHAR but print's BEEP Jeff Woods 1 sibling, 1 reply; 8+ messages in thread From: Mikael Aronsson @ 2003-11-12 7:11 UTC (permalink / raw) To: linux-c-programming Hi ! The problem with strcat is that you cannot just use a pointer to the character because all C string functions require that you end the string with a zero (0) byte. You could do something like this for eample: char temp[ 2]; temp[ 0] = my_character; temp[ 1] = '\0'; strcat( org_string, temp); Mikael ----- Original Message ----- From: "J." <mailing-lists@xs4all.nl> To: <linux-c-programming@vger.kernel.org> Sent: Wednesday, November 12, 2003 5:35 AM Subject: convert INT to CHAR but print's BEEP... > Wednesday, November 12 05:19:21 > > Hello, I have kind of a problem with converting an int to a char. > The get_rand_str() function returns an string build of random > charaters with a max length of int `MAX'. > > This seems to work at first glance: > ~: ./program > qqxfrd > > However if I examen the output closer: > ~: ./program | od -a > 0000000 q q soh x stx f etx r eot d enq nl > 0000014 > > Now I know why my computer keeps beeping everytime it > outputs a string :-) > > What is the correct way of changing the int value to a > char value so that I can append it to the return string ? > > char *get_rand_str(int max) { > int i = 0; > char value; > char *retval = NULL; > > for(; i < max; i++) { > value = get_ascii_code(97, 122); > retval = (char *)realloc(retval, sizeof(char)); > strcat(retval, &value); > } > > return retval; > free(retval); > } > > int get_ascii_code(int low, int high) { > int k = 0; > double d = 0; > > d = (double)rand() / ((double)RAND_MAX + 1); > k = (int)(d * (high - low + 1)); > return(low + k); > } > > Thank you.... > > J. > > -- > KonkyFong > > - > To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: convert INT to CHAR - SOLVED.... 2003-11-12 7:11 ` Mikael Aronsson @ 2003-11-13 1:26 ` J. 0 siblings, 0 replies; 8+ messages in thread From: J. @ 2003-11-13 1:26 UTC (permalink / raw) To: linux-c-programming On Wed, 12 Nov 2003, Mikael Aronsson wrote: > Hi ! > > The problem with strcat is that you cannot just use a pointer to the > character because all C string functions require that you end the string > with a zero (0) byte. > > You could do something like this for eample: > char temp[ 2]; > temp[ 0] = my_character; > temp[ 1] = '\0'; > strcat( org_string, temp); > > Mikael THnkx.. I fixed that, and I allocated the return value with calloc, this works ... :) I learnend something again.... Thnkx J. -- FOnkTong ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: convert INT to CHAR but print's BEEP... 2003-11-12 4:35 ` convert INT to CHAR but print's BEEP J. 2003-11-12 7:11 ` Mikael Aronsson @ 2003-11-13 6:36 ` Jeff Woods 1 sibling, 0 replies; 8+ messages in thread From: Jeff Woods @ 2003-11-13 6:36 UTC (permalink / raw) To: J.; +Cc: linux-c-programming At 11/12/2003 05:35 AM +0100, J. wrote: >Hello, I have kind of a problem with converting an int to a char. The >get_rand_str() function returns an string build of random charaters with a >max length of int `MAX'. I'm sure there are faster algorithms, but how about something simple like: #include <stdlib.h> typedef unsigned char U8; typedef unsigned short U16; /* Set <buf_len> bytes at <buf> to random values from <low> to <high>. */ void set_rand_buf(char *buf, size_t buf_len, U8 low, U8 high) { U8 range = high - low + 1; while (buf_len--) *buf++ = low + (U8)((range*rand())/(RAND_MAX+1.0)); } /* Sample calls */ #include <assert.h> int main(void) { char buf[80]; size_t k; EXAMPLE_1: /* Completely fill buf with random data; may include embedded nulls */ set_rand_buf(buf, sizeof buf, 0, 255); for (k = 0; k < sizeof buf; k++) printf("byte[%3d]=%3hu\n", k, (U16)buf[k]); EXAMPLE_2: set_rand_buf(buf, 50, '0', '9'); /* Get 50 random ASCII digits. */ buf[50] = 0; /* Null-terminate the string. */ printf("50 digits: %s\n", buf); EXAMPLE_3: set_rand_buf(buf, 26, 'a', 'z'); /* Get 26 random lower-case letters. */ buf[26] = 0; /* Null-terminate the string. */ printf("26 letters: %s\n", buf); EXAMPLE_4: #DEFINE LEN 27 /* Get LEN random hex digits in ASCII */ assert(LEN < sizeof buf); set_rand_buf(buf, LEN, 0, 15); /* First get LEN hex values */ { /* Convert hex values from binary to ASCII */ char *ptr = buf + LEN; while (ptr-- > buf) *ptr = (*ptr >= 10) ? ('a' - 10 + *ptr) : ('0' + *ptr); } buf[LEN] = 0; /* Null-terminate as a string. */ printf("hex digits %s\n", buf); return 0; /* No-error program exit */ } P.S. The above code has never been compiled, so there may be all kinds of typos or other errors present. -- Jeff Woods <kazrak+kernel@cesmail.net> ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2003-11-13 6:36 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2003-11-08 9:30 mixing C/C++ Elias Athanasopoulos 2003-11-08 13:36 ` James Stevenson 2003-11-10 15:00 ` Matthew Studley 2003-11-10 17:37 ` Elias Athanasopoulos 2003-11-12 4:35 ` convert INT to CHAR but print's BEEP J. 2003-11-12 7:11 ` Mikael Aronsson 2003-11-13 1:26 ` convert INT to CHAR - SOLVED J. 2003-11-13 6:36 ` convert INT to CHAR but print's BEEP Jeff Woods
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).