[C] wie unbekannten Typ returnieren?

  • Ich hab ne Methode die eine row einer Datenbank-Tabelle returniert.

    Da ich nicht weiß aus welchen Datentypen sich die Tabelle zusammensetzt gebe ich einen Pointer auf ein Array Retour (genauer gesagt einen void **)

    Code
    void **ora_oci_fetch_row();

    Wenn ich diese Funktion dann verwende muss zuerst das Arrayelement ausgewählt und dieses dann auf den korrekten Datentyp gecasted werden. Dann nur noch den Pointer dereferenzieren und schon hat man den Value.

    Code
    void **row = ora_oci_fetch_row();
    unsigned long value = *(unsigned long *) row[0];

    Jetzt schreit aber der Compiler:

    Code
    warning: assignment makes pointer from integer without a cast

    Jemand nen Plan? :)

    I like Toast!

  • Du castest row[0] auf unsigned long*, die Variable value hat aber den Typ unsigned long (ist also kein Pointer).

    Das müsste kompilieren:

    Code
    unsigned long *value = *(unsigned long *) row[0];
  • Jemand nen Plan? :)


    [glaskugel]Am ehesten: Die Warning bezieht sich auf die Zeile, in der du den Rückgabewert von ora_oci_fetch_row zuweist, und du hast den Header, der ora_oci_fetch_row deklariert, nicht (richtig) inkludiert.[/glaskugel]

    Bitte den echten Codeausschnitt posten, Zeilen nummerieren, und die Zeilennummer der Warning auch angeben. Die "assignment makes pointer"-Warning bezieht sich bestimmt nicht auf den Beispielcode, den du gepostet hast, weil da kein Assignment drin vorkommt! Wenn schon, wär der Fehler "initialization makes pointer...". Zumindest bei meiner Version vom GCC.

    *plantsch*

  • Code
    776:  *t=(time_t)0L;
    (...)
    809: #ifdef USE_ORACLE
    810:    idi->dbinfo.oracle_result=ora_oci_store_result();
    811:    if((idi->dbinfo.oracle_row=ora_oci_fetch_row(idi->dbinfo.oracle_result))!=NULL){
    812:       t = *(unsigned long *)idi->dbinfo.oracle_row[0];
    813:    }
    814:    ora_oci_free_result(idi->dbinfo.oracle_result);
    815:    idi->dbinfo.oracle_result=NULL;
    816: #endif

    Zeile 776 verwirrt mich grad selber ein wenig. :)

    I like Toast!

  • a) ich frag mich was ein einsames sterndl vor dem t ueberhaupt tut. Der Code ist nu teilweise von mir und diese Zeile hab nicht ich geschrieben.

    b) selbst wenn ich das Sterndl wegtue hab ich diesselbe Compilerwarnung

    ps: gott bin ich deppert, hab das falsche sterndl weggetan, frage a steht aber noch :)
    pps: gott bin ich noch deppertert, hab das uebersehen

    Code
    int ndo2db_db_get_latest_data_time(ndo2db_idi *idi, char *table_name, char *field_name, unsigned long *t){

    Danke Plantschkuh, freu mich immer sehr ueber deine Hilfe :) bin halt verkatert und schon 10h im Dienst :p

    *a) natürlich dereferenzieren, ich dachte schon das *t steht für "void *t" :)
    *b) auch nur weil ichs an der falschen stelle gelöscht habe.

    I like Toast!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!