> 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
>

Reply via email to