2016-05-24 12 views
-2

ich nach einem ähnlichen Thema suchen zurückkehren, aber ich finde nichtsC/proc printf Wert zu groß

ich eine Funktion in C, welche ich es rekursiv aufrufen. Die prupose dieser Funktion ist es, eine Abfrage zu erstellen, durch eine andere Funktion (Carga_Datos_OptimizadoV2) auszuführen:

int IC_ObtenerReferenciaInstr(char *Entidad, char *treoseq) 
{      
    char *sCampos []={"T0OPINST.NB_REF_1",""}; 
    char *sFormatos []={"C",""}; 
    char **sDatos=NULL; 
    int lFilas=0; 
    char sDiagnostico [256]; 
    int lRet;          
    size_t valorORI=0; 
    char *sWhereORI=NULL; 

    valorORI = printf(" where t0opoper.cd_entidad='%s' " 
        " and t0opoper.nu_operac_ext_eftvo='%s'" 
        " and t0opoper.cd_entidad=t0opinst.cd_entidad" 
        " and t0opoper.nu_instruc_princ=t0opinst.nu_instruc", 
        Entidad,treoseq); 

    if (valorORI > 0) 
     {    
     sWhereORI = (char *)malloc((valorORI + 1) * sizeof(char)); 

     if(sWhereORI != NULL) 
     { sprintf(sWhereORI," where t0opoper.cd_entidad='%s' " 
          " and t0opoper.nu_operac_ext_eftvo='%s'" 
          " and t0opoper.cd_entidad=t0opinst.cd_entidad" 
          " and t0opoper.nu_instruc_princ=t0opinst.nu_instruc", 
          Entidad,treoseq); 

      lRet=Carga_Datos_OptimizadoV2(sizeof(sFormatos)/sizeof(char *)-1, 
          sWhereORI,"T0OPOPER,T0OPINST",sCampos,sFormatos, 
          &sDatos,&lFilas,sDiagnostico,-1); 
      free(sWhereORI); 
      sWhereORI=NULL; 
     } 
     else 
     { sprintf(sWhereORI,"Warning, sWhere2 over in IC_ObtenerReferenciaInstr."); 
      } 
     } 
    else 
     {return(ERROR);} 

    if (lRet != 0) 
     {return((int)lRet);} 

    if((lFilas>0) && (strcmp(sDatos[0],"")!=0)) 
      {strcpy(treoseq,sDatos[0]); } 

    return(0L); 
}/* end-funcion IC_ObtenerReferenciaInstr */ 

Das Problem ist in „valorORI“, der fängt die Tapferkeit des printf. Wenn ich es 6 mal rekursiv anrufe, gibt das letzte Mal "printf" den Wert 18446744073709551615 zurück (in den anderen Iterationen gibt es einen Wert zwischen 163 und 170 zurück), was zu einem Abbruch führt, wenn ich de free() in free (whereORI).

Ich habe für eine Lösung, die 3 Tage in Folge ... Dank einem suchen, der mir eine Idee geben könnte :)

+1

Das ist nicht C# ... es ist nicht klar, was C# damit zu tun hat. –

+1

'18446744073709551615' ist' 0xFFFFFFFFFFFFFFFF', was passieren kann, wenn ein 64-Bit Wert '-1' ist –

+0

Das ist richtig, es ist nur C, ich entschuldige mich für den Fehler. –

Antwort

2

printf() gibt einen signierten Integer-Typ int. Das Zuweisen zu size_t (ein vorzeichenloser Ganzzahl-Typen) verliert seine Sign-Ness und übergibt so falsch if (valorORI > 0).

Testen Sie zuerst das Ergebnis printf() als int. @Weather Vane

int valorORI = printf(" where ... 
if (valorORI > 0) { 
    /// minor suggested change of malloc code 
    sWhereORI = malloc(sizeof *sWhereORI * (valorORI + 1u)); 

Vielleicht ist OP printf() mit ungültigen Argumenten auf der letzten Iteration aufrufen.

+0

Minor: scheint ungerade, um '0L' von' int IC_ObtenerReferenciaInstr() 'zurückzugeben. Schlagen Sie 'return 0;' – chux

+0

Ähnlich die unnötige Umwandlung in 'return ((int) lRet);' –

+0

Danke für Ihre Antwort! Die Werte der Variablen in der letzten Iteration sind: (gdb) p Entidad $ 5 = 0x7fff4315e040 "13" (gdb) p treoseq $ 6 = 0xa19394 "BG" –