Gå til innhold

mytcl problemer med glibc2.3


Anbefalte innlegg

Videoannonse
Annonse

Jeg kan si med en gang at du må caste char** til const char** eksplisitt i koden din.

 

Koden som utløser feilmeldingen:

Tcl_CreateCommand(interp, "sql", sql_command ,(ClientData)s, (Tcl_CmdDeleteProc *)NULL);

 

Feilmeldingen:

invalid conversion from `int (*)(void*, Tcl_Interp*, int, char**)' to  

                                 `int (*)(void*, Tcl_Interp*, int, const char**)'

 

 

sql_command, som blir sendt til Tcl_CreateCommand ser slik ut:

int sql_command(ClientData clientData, Tcl_Interp *interp, int argc, char **argv);

 

Du må med andre ord endre char **argv til const char** argv.

 

..det kan hende du "breaker" noe annet som forventer at argv -ikke- er const når du gjør dette.

 

Det kan ofte være lurt å endre på linjen som feilmeldingen peker på:

Tcl_CreateCommand(interp, 

"sql", 

sql_command, 

(ClientData)s, 

(Tcl_CmdDeleteProc *)NULL);

 

..da ville du med en gang sett at det var linjen sql_command compileren snakket om.

Lenke til kommentar

Fikk dette når jeg endret.

 

mytcl.cc: In function `int sql_command(void*, Tcl_Interp*, int, const char**)':

mytcl.cc:220: error: `ret' undeclared (first use this function)

mytcl.cc:220: error: (Each undeclared identifier is reported only once for each

function it appears in.)

mytcl.cc:226: error: invalid conversion from `const char**' to `char**'

mytcl.cc:226: error: initializing argument 2 of `int Manager::connect(int,

char**)'

mytcl.cc:244: error: invalid conversion from `const char*' to `char*'

mytcl.cc:258: error: invalid conversion from `const char*' to `char*'

mytcl.cc:270: error: invalid conversion from `const char*' to `char*'

mytcl.cc:272: error: invalid conversion from `const char*' to `char*'

mytcl.cc:274: error: invalid conversion from `const char*' to `char*'

mytcl.cc:276: error: invalid conversion from `const char*' to `char*'

mytcl.cc:278: error: invalid conversion from `const char*' to `char*'

mytcl.cc:286: error: invalid conversion from `const char*' to `char*'

make: *** [mytcl.o] Error 1

Lenke til kommentar

Ja - det sier seg selv at den får problemer her.

 

Du kan ta en kopi av argv som ikke er const og jobbe mot denne i stedet. Bruk strcpy().

 

Kunne jeg sett koden? Det om ret så litt rart ut ..

Ta med første linjenummer i det du paster, eks:

linje 220: kode();

kode();

kode();

 

..så ser jeg hva feilmeldingene peker på.

 

Det kan også hende det er lurere å endre det "fra andre siden", men dette vet jeg lite om siden jeg ikke vet hvordan resten av programmet eller headere rundt det forventer at ting skal se ut.

Altså at du i stedet for å forandre på sql_command sitt format (type), så endrer du på Tcl_CreateCommand sin functor-parameter slik at den matcher og kan ta i mot en functor uten const char** .. hvis u skjønner.. Kan som sagt ikke vite om det er en god idé sett fra her jeg står.

Lenke til kommentar

Jeg mente at du skrev inn linjenummeret manuellt - dette fordi linjenummerene i feilmeldingene ikke ser ut til å stemme med koden på den linken ..

 

F.eks:

mytcl.cc:220: error: `ret' undeclared (first use this function)

 

Det finnes ingen ret på den linjen i koden fra den linken.. så koden du compilerer må se annerledes ut, altså ha flere eller færre linjer. (Er det mulig #include kan ha noe med dette å gjøre?)

 

Du kan eventuellt gi meg en temp. shell/ssh-konto - så kan jeg gå inn på maskinen din og compilere og se selv. :)

Lenke til kommentar

Etter litt roting compilerer koden, og "diffen", patchen eller endringene ser slik ut:

 

- forran linja betyr fjernet linje.

+ forran linja betyr ny linje.

 

diff mytcl.old mytcl.cc -u

--- mytcl.old	2003-10-10 19:32:09.000000000 +0200

+++ mytcl.cc	2003-10-10 23:42:44.000000000 +0200

@@ -205,7 +205,7 @@



// -------------------------------------------------------------

//

-int sql_command(ClientData clientData, Tcl_Interp *interp, int argc, char **argv) {

+int sql_command(ClientData clientData, Tcl_Interp *interp, int argc, const char **argv) {

  int ret;



  if(argc == 1) {

@@ -221,7 +221,7 @@



    // -----------------------------------

    if(strcmp(argv[1], "connect")==0) {

-      c = mgr->connect(argc-2, argv+2);

+      c = mgr->connect(argc-2,(char**) argv+2);

      if(c < 0) {

        char *basemsg = "Unable to Connect: ";



        char *errmsg = mgr->getErrorMsg();

@@ -239,7 +239,7 @@



    } else if(strcmp(argv[1], "escape")==0) {

      if(!(argc < 3)) {

-        ret = sql_escape(interp, argv[2]);

+        ret = sql_escape(interp, (char*)argv[2]);

      } else {

        Tcl_SetResult(interp, "Usage: sql escape string", TCL_STATIC);

        ret = TCL_ERROR;

@@ -253,7 +253,7 @@

      if(argc <= 2) {

        Tcl_SetResult(interp, "Usage: sql command ?handle?", TCL_STATIC);

        ret = TCL_ERROR;

-      } else if((connid = stripPrefix(argv[2], HANDLE_PREFIX)) < 0) {

+      } else if((connid = stripPrefix((char*)argv[2], HANDLE_PREFIX)) < 0) {

        Tcl_AppendResult(interp, "mytcl: Invalid handle: ", argv[2], ".", NULL);

        ret = TCL_ERROR;

      } else if(!mgr->inUse(connid)) {

@@ -265,15 +265,15 @@

        Connection *conn = mgr->connection(connid);

        // take care of the command:

        if(strcmp(argv[1], "exec") == 0) {

-          ret = sql_exec(interp, conn, argv[3]);

+          ret = sql_exec(interp, conn, (char*)argv[3]);

        } else if(strcmp(argv[1], "query") == 0) {

-          ret = sql_query(interp, conn, argv[3]);

+          ret = sql_query(interp, conn, (char*)argv[3]);

        } else if(strcmp(argv[1], "endquery") == 0) {

-          ret = sql_endquery(interp, conn, argv[3]);

+          ret = sql_endquery(interp, conn, (char*)argv[3]);

        } else if(strcmp(argv[1], "fetchrow") == 0) {

-          ret = sql_fetchrow(interp, conn, argv[3]);

+          ret = sql_fetchrow(interp, conn, (char*)argv[3]);

        } else if(strcmp(argv[1], "numrows") == 0) {

-          ret = sql_numrows(interp, conn, argv[3]);

+          ret = sql_numrows(interp, conn, (char*)argv[3]);

        } else if(strcmp(argv[1], "affectedrows") == 0) {

          ret = sql_affectedrows(interp, conn);

        } else if(strcmp(argv[1], "insertid") == 0) {

@@ -281,7 +281,7 @@

        } else if(strcmp(argv[1], "disconnect") == 0) {

          ret = sql_disconnect(interp, mgr, connid);

        } else if(strcmp(argv[1], "selectdb")==0) {

-          ret = sql_selectdb(interp, conn, argv[3]);

+          ret = sql_selectdb(interp, conn, (char*)argv[3]);

        } else if(strcmp(argv[1], "isconnected")==0) {

          ret = sql_isconnected(interp, conn);

        } else {

Lenke til kommentar

- forran linja betyr fjernet linje.

+ forran linja betyr ny linje.

 

diff connection.old connection.cc -u

--- connection.old      2003-10-11 00:33:36.000000000 +0200

+++ connection.cc       2003-10-11 00:32:44.000000000 +0200

@@ -16,7 +16,7 @@

    License along with this library; if not, write to the Free Software

    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

*/

-

+#include <string>

#include <tcl.h>



#include "connection.h"

@@ -85,7 +85,7 @@

};



// -------------------------------------------------------------

-int Connection::numrows(int resHandle=0) {

+int Connection::numrows(int resHandle) {

  return((!results[resHandle])?0:mysql_num_rows(results[resHandle]));

};



@@ -136,7 +136,7 @@

};



// -------------------------------------------------------------

-void Connection::endquery(int resHandle=0) {

+void Connection::endquery(int resHandle) {

  if(results[resHandle]) {

    mysql_free_result(results[resHandle]);

    results[resHandle] = NULL;

@@ -147,7 +147,7 @@

// -------------------------------------------------------------

// Note: A new Row is allocated. Has to be freed by calling

// party.

-Row *Connection::fetchrow(int resHandle=0) {

+Row *Connection::fetchrow(int resHandle) {

  Row *ret;



  if (!results[resHandle]) {

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...