> I was very much right! You are, but in my VB6 code the sqlite3* object is always represented as a pointer (Long in VB6), so that pointer will then have to be passed ByVal.
> It will if you correct that signature. Ah, OK, thanks. > I strongly recommend doing one of those online courses about C. Agree and got the books, just need the time. RBS On Sun, Jan 24, 2016 at 10:53 PM, Roger Binns <rogerb at rogerbinns.com> wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > On 24/01/16 13:12, Bart Smissaert wrote: > >>> I think that unless the argument is going to be altered I have > >>> to pass > > them always ByVal. That wasn't quite right, eg: int > > sqlite3_close(sqlite3*); sqlite3* is not going to be altered, but I > > can see that this should be passed ByRef > > I was very much right! Both cases apply here - modification and item > size versus pointer (mailbox number) size. > > The type sqlite3 is a structure in C. I don't know the exact > corresponding terminology in VB6 but it looks like "Type". A C > structure is very much like this VB: > > Type Customer > Dim FirstName As String > Dim LastName As String > Dim Id As Long > End Type > > ie it is a name ("Customer") and has various items of data as members, > each with their own type (String, Long etc). > > The sqlite3 structure has 79 members (more with some optional > functionality) and occupies about 300 bytes. Even if none of them > were going to modified, it would be insane to require 79 > parameters/300 bytes be passed, versus one pointer to the structure. > > It is possible to mark things as "not going to be modified" in C. The > tag used is "const". The usage of it varies by code base, as it > wasn't in the original C and it is easy to bypass if you want, plus > various other issues. SQLite does use it. In this case it would be: > > int sqlite3_close(const sqlite3*); > > And logically, how can closing the database not modify at least one of > the 79 members making up the sqlite3 structure? const was > deliberately left out for a reason. > > > It doesn't work though with complex arguments like this: void > > (*xFunc)(sqlite3_context*,int,sqlite3_value**) > > It will if you correct that signature. Elsewhere in the SQLite code, > sqlite3_context and sqlite3_value were both defined (as structs). The > one liner in isolation is not valid because it has no idea what they > are, although the site could be bit more forgiving. Try that again > but put "struct" before them, like so: > > void (*xFunc)(struct sqlite3_context*,int,struct sqlite3_value**); > > This particular case is a callback function. Those can get tricky > even for regular C programmers. > > I strongly recommend doing one of those online courses about C. You > don't need to become an expert, but at least understanding the > concepts will make it *far* easier to translate between the VB world > and C. C is not a big language, and has a lot of simplicity, brevity > and elegance. Understanding pointers is a good test of a programmer. > > Roger > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v2 > > iEYEARECAAYFAlalVcwACgkQmOOfHg372QS51wCglDbd22FVdsA7pmV2uDlqkIZb > j7EAoODoOlnObarBE45EMtAUNf0xw6eR > =4+b6 > -----END PGP SIGNATURE----- > _______________________________________________ > sqlite-users mailing list > sqlite-users at mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users >