15.06.2017 17:54, Admin пишет:
15.06.2017 16:19, Tobias Boege пишет:
All your help was very important for me, I now have completed my cash
register software to the point where it does everything my company
needs. I
must say Gambas is a great language, it's very easy to learn from
scratch,
I'm surprised how obvious everything is. But there is a lot of work
for me
left to do mostly in terms of managing wrong human actions. My software
works good if the employee doesn't do any mistakes, but that's
unrealistic,
so there's a lot of things I want to control and check. And that's
where I'm
stuck.
This library (which still calls itself a driver) theoretically is
able to
return a lot of values that I need, but I can't understand basic
rules of
how do we take output from a C-lib in Gambas.
From http://gambaswiki.org/wiki/howto/extern I understood that I
need to
locate a space in memory and pass a pointer to a library so that it can
write data into that place in ram, which I would then read and set
free.
So I have to declare a pointer, then Alloc(8) it, then pass it to my
library
and then read from it like it is a stream. Does this principle still
work in
current version of Gambas?
If you do Alloc(8), then you get 8 bytes of memory. You most likely
*don't*
want to read that like a stream, but use Integer@() or similar
functions.
What I don't understand is how I construct the code in my particular
case.
To make an interface to the library I declare external pointer like
this:
Extern CreateFptrInterface(ver As Integer) As Pointer
Then I declare some pointers that I'll use with help of the interface I
created:
Extern put_DeviceEnable(p as Pointer, mode as Integer)
Extern GetStatus(p as Pointer, StatRequest as String)
Then I declare the pointer which will be that interface:
Public kkmDrv as Pointer
So then in sub I can do
kkmDrv = CreateFptrInterface(12) ' this establishes the interface
put_DeviceEnabled(kkmDrv, 1) ' this transfers the comand to the library
through the interface.
And it works great.
But then If I want to get some data from the library, as I
understand, I
have to declare another pointer, allocate ram for it and pass my
request.
I don't understand how should I pass that pointer to GetStatus()
while also
passing my interface pointer to it, let alone reading data back.
Totally
confused.
This entirely depends on how the C functions in your library are
declared.
I don't know about your specific library but commonly the occurence
of an
error is indicated by an integer return code, e.g. this might be the
signature of one of the functions in your library:
int myfunction(void *interface, int argument)
If the documentation says that the return value (int) of this function
indicates an error, then you just need to get that return value back
into
your Gambas program, which you accomplish by declaring the function in
Gambas as
Extern myfunction(interface As Pointer, argument As Integer) As
Integer
(notice the trailing "As Integer"). Then you can use "myfunction" in
your
Gambas code like any other function and get and interpret its return
value.
So, if this convention for error reporting is used, it is much
simpler to
get information about errors, without using Alloc() and co. Your library
may use a different convention which actually involves pointers, but
I wouldn't know.
Regards,
Tobi
I should've said it in the beginning. Ofcourse any function returns
integer value of 0 as success or -1 as error, but that only indicates
that function was successfully executed or not. So GetStatus() will
always return 0 because it shurely ran, nothing can go wrong here. But
that's not the result I want. GetStatus() actually gives back a string
with the status I asked for. Not that I fully understand how it does
that. I already gave links to the libfptr.so library itself
(http://allunix.ru/back/atol.tar.gz) and it's header files
(http://allunix.ru/back/atol-header.tar.gz) so that it's clearer, what
I'm talking about, unfortunately I am absolute zero in C to figure
things out myself.
For example I can see that to get serial number of the device driven
by that library i can use a function described like this:
get_SerialNumber(void *ptr, wchar_t *bfr, int bfrSize);
As far as I can tell what it does is it gets data needed and puts it
into some buffer. The result of executing this function through
put_SerialNumber(kkmDrv) will always be returned to me as 0.
So to see what's in that buffer, I have to then invoke
GetStatus(kkmDrv) describe in .h file like GetStatus(void *ptr); and
the integer result of this operation will also always be 0, which
means that GetStatus itself ran successfully, but I don't care about
that, I want to see what it actually told me, not that if it told me
it successfully or not. So that's the main confusion. If all this is
too complicated and lamely explained then nevermind, I expect it to be
so and I'm sorry, that's the best I can do. I'm just really confused
that I recieve two answers, one boolean telling if function
successfully invoked and one string, carrying the actual data I want.
Best Regards,
Dmitry.
UPD: you know, I can be fundamentally wrong about all this library's
functionality. Maybe it does not give me any data afterall, I'm
beginning to think that this integer (or rather boolean) value is all it
gives me back, and the "real" data is just written into it's log file.
Which is sufficient to me, so, I guess, nevermind. Sorry about wasting
your time.
Best regards,
Dmitry.
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Gambas-user mailing list
Gambas-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gambas-user