1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

[C] wie unbekannten Typ returnieren?

    • Frage
  • davewood
  • 27. Februar 2008 um 14:52
  • Unerledigt
  • davewood
    17
    davewood
    Mitglied
    Reaktionen
    9
    Punkte
    3.204
    Beiträge
    536
    • 27. Februar 2008 um 14:52
    • #1

    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!

  • totycro
    2
    totycro
    Mitglied
    Punkte
    40
    Beiträge
    7
    • 27. Februar 2008 um 15:24
    • #2

    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];
  • davewood
    17
    davewood
    Mitglied
    Reaktionen
    9
    Punkte
    3.204
    Beiträge
    536
    • 27. Februar 2008 um 15:26
    • #3

    hmm... aber ich dereferenziere den pointer bevor ich ihn an value zuweise.

    I like Toast!

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 27. Februar 2008 um 16:51
    • #4
    Zitat von davewood

    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*

  • davewood
    17
    davewood
    Mitglied
    Reaktionen
    9
    Punkte
    3.204
    Beiträge
    536
    • 27. Februar 2008 um 17:58
    • #5
    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
    Zitat


    gcc -O3 -g3 -ggdb3 -W -Wall -pedantic -DHAVE_CONFIG_H -I/home/nagios/ndoutils-1.4b7-oracle/liboci/lib/oracle_instantclient_10_2-64/include -I../liboci/include -c -o db.o db.c
    db.c: In function ‘ndo2db_db_connect’:
    db.c:202: warning: unused variable ‘connect_string’
    db.c: In function ‘ndo2db_db_hello’:
    db.c:322: warning: implicit declaration of function ‘asprintf’
    db.c:535:17: warning: multi-character character constant
    db.c: In function ‘ndo2db_db_escape_string’:
    db.c:535: warning: overflow in implicit constant conversion
    db.c: In function ‘ndo2db_db_query’:
    db.c:625: warning: implicit declaration of function ‘ndo2db_log_debug_info’
    db.c: In function ‘ndo2db_handle_db_error’:
    db.c:730: warning: implicit declaration of function ‘ora_oci_ping’
    db.c:697: warning: unused parameter ‘query_result’
    db.c: In function ‘ndo2db_db_get_latest_data_time’:
    db.c:812: warning: assignment makes pointer from integer without a cast

    Alles anzeigen

    Zeile 776 verwirrt mich grad selber ein wenig. :)

    I like Toast!

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 27. Februar 2008 um 18:16
    • #6

    Dann ist t wohl kein unsigned long, sondern (unsigned long *) ? Also z.B. in Zeile 812 das erste Sterndl wegtun...

    *plantsch*

  • davewood
    17
    davewood
    Mitglied
    Reaktionen
    9
    Punkte
    3.204
    Beiträge
    536
    • 27. Februar 2008 um 18:49
    • #7

    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!

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung