dword tu char*



  • Hallo,

    hab ein ähnliches Problem wie bei int to char*.

    Mit der Funktion

    dword MemChk(void);
    

    lese ich den restlichen Speicher aus einer Datei aus.

    Mit der Funktion

    void putstrxy(byte xp, byte yp, char * str);
    

    kann ich eine Ausgabe tätigen.

    Wie kann ich mir den Returnwert der MemChk(); ausgeben lassen?



  • wenn dword ein

    typedef unsigned long dword;
    

    ist, dann machst du:

    #include <stdlib.h>
    #include <stdio.h>
    
    typedef unsigned char byte;
    typedef unsigned long dword;
    
    size_t get_digits( dword number ) {
    
        size_t digits = 1;
    
        while( number >= 10 ) {
    
            number /= 10;
            ++digits;
        }
    
        return digits;
    }
    
    void putstrxy( byte xp, byte yp, const char *str )
    {
        puts( str );
    }
    
    int main( )
    {
        dword data = 1234;
    
        char *buffer = (char*) malloc( get_digits( data ) + 1 );
    
        sprintf( buffer, "%u", data );
        putstrxy( 0, 0, buffer );
    
        free( buffer );
    
    }
    

    Greetz, Swordfish



  • Ich hab keine stdio.h 😞



  • Wenn du einen ISO/IEC 9899:1999 konformen Compiler hast, hast du auch <stdio.h>...

    Warum denkst du, keine <stdio.h> zu haben?

    Greetz, Swordfish



  • Swordfish schrieb:

    Warum denkst du, keine <stdio.h> zu haben?

    er hat wohl die libs dafür nicht bzw. darf sie nicht benutzen weil's sonst zu gross wird

    dword als hex:

    // für 32 bit dwords
    char *dword_to_string (DWORD d)
    {
       static char string[10];
       int s;
       char *p = string;
    
       for (s=0; s<8; s++)
       {
          *p++ = "0123456789abcdef"[d>>28&15];
          d <<= 4;
       }
       *p = 0;
    
       return string;
    }
    


  • Ich hab's jetzt so:

    char * buffer; 
    dword memory;
    
    size_t get_digits(dword number)
    {     
        size_t digits = 1;    
        while(number >= 10)
        {        
            number /= 10; 
            ++digits; 
        }   
        return digits; 
    }
    
    memory = MemChk();
    *buffer = (char*)malloc(get_digits(memory) + 1);    
    sprintf(buffer,"%u",memory); 
    putstrxy(0,1,buffer);     
    free(buffer);
    

    Passt das so?
    Jedenfalls kommt da Müll raus und ein Fehler!

    pointer truncation "="

    *buffer = (char*)malloc(get_digits(memory) + 1);
    


  • net schrieb:

    Swordfish schrieb:

    Warum denkst du, keine <stdio.h> zu haben?

    er hat wohl die libs dafür nicht bzw. darf sie nicht benutzen weil's sonst zu gross wird

    genau das wollt ich ja von ihm wissen...

    BTW: nice code 👍

    fragensteller123 schrieb:

    Jedenfalls kommt da Müll raus und ein Fehler!

    Glaub' ich dir 😉

    mach aus

    *buffer = (char*)malloc(get_digits(memory) + 1);
    

    das:

    buffer = malloc(get_digits(memory) + 1);
    

    Greetz, Swordfish



  • fragensteller123 schrieb:

    Jedenfalls kommt da Müll raus und ein Fehler!
    pointer truncation "="

    schreib' erstmal welchen compiler du benutzt und für welchen prozessor das sein soll. wenn du keine stdlib benutzen darfst sollteste eventuell auch von 'malloc' die finger lassen. das 'pointer truncation' kommt vielleicht daher, dass irgend wo ein 'far' fehlt z.b. gibt dein malloc ein 'void far *' raus, den du einem 'char (near) *' zuweisen willst.



  • jetzt funktioniert es.
    Im Scanner ist ein 8051 verbaut und ich entwickle mit Keil.

    👍



  • fragensteller123 schrieb:

    jetzt funktioniert es.

    ...und woran lag's?

    fragensteller123 schrieb:

    Im Scanner ist ein 8051 verbaut und ich entwickle mit Keil.

    achso, ich glaub' so'n 8051 hat 'nur' 64kb ram und 64kb rom, ne?
    naja, könnte man malloc schon nehmen glaub' ich (und sprintf auch)



  • die Lösung ist die richtige, ohne *:

    buffer = malloc(get_digits(memory) + 1);
    

    🙂



  • fragensteller123 schrieb:

    die Lösung ist die richtige, ohne *:

    buffer = malloc(get_digits(memory) + 1);
    

    ach ja, du hattest ja am anfang noch ein '*' 😉


Anmelden zum Antworten