2017-01-23 4 views
-1

so versuche ich einige Integer in Zeichenarrays zu konvertieren, die mein Terminal schreiben kann. So kann ich den Wert meiner Codes Berechnungen für Debugging-Zwecke sehen, wenn es ausgeführt wird. wie in, wenn der int_t count = 57 I das Terminal will 57 schreiben so char * würde eine Reihe von Zeichen von 5 und 7Uintx_t zu const Char * in freistehenden C++ mit GNU-Compiler

Der Kicker hier ist aber, dass diese in einer frei stehenden Umgebung ist so, dass Mittel keine Standard-C++ - Bibliothek. EDIT: das bedeutet Nein std :: string, keine c_str, keine _tostring, ich kann nicht nur ganze Zahlen drucken.

Die Header ich haben Zugriff zu werden ISO646, stddef, Schwimmer, Grenzen, stdint, stdalign, stdarg, stdbool und stdnoreturn

Ive aus Gießen des int als const char * ein paar Dinge ausprobiert, Hexe gerade geführt um zufällige Zeichen anzuzeigen. Um meinem Compiler verschiedene Header aus der GCC-Sammlung zu geben, behielten sie nur andere Header, die ich weiter fütterte, bis ich nicht wusste, welche Header der Compiler wollte.

so hier ist, wo der Code zum Drucken verwendet werden muss.

uint8_t count = 0; 
while (true) 
{ 
    terminal_setcolor(3); 
    terminal_writestring("hello\n"); 

    count++; 

    terminal_writestring((const char*)count); 
    terminal_writestring("\n"); 
} 

Jeder Rat mit diesem würde sehr geschätzt werden.

Ich benutze ein gnu, g ++ Cross-Compiler zielte auf 686-Elf und ich denke, ich benutze C++ 11, da ich Zugriff auf stdnoreturn.h habe, aber es könnte C++ 14 sein, da ich nur gerade gebaut Compiler mit den neuesten Gnu-Software-Abhängigkeiten.

+0

Sie sagen "zu' const char * '", aber Sie haben nicht wirklich gesagt, wie das Ergebnis aussehen soll. Möchten Sie durch Leerzeichen getrennte Dezimaldarstellungen erhalten? Hexadezimale Darstellungen? ASCII-kodierte Zeichenäquivalente? Was? –

+0

ASCII-kodierte Zeichenäquivalente wenn count = 50 Ich möchte 50 durch das Terminal gedruckt werden – skyline

+0

Nun, das ist die durch Leerzeichen getrennte dezimale Darstellung, nicht die ASCII-Option (die in Ihrem Beispiel das Zeichen 'P' wäre). Bitte fügen Sie spezifische Anforderungen zur Frage selbst hinzu. –

Antwort

1

Ohne C/C++ Standard Library Sie haben keine Optionen außer Konvertierungsfunktion Schreiben manuell, zB:

template <int N> 
const char* uint_to_string(
    unsigned int val, 
    char (&str)[N], 
    unsigned int base = 10) 
{ 
    static_assert(N > 1, "Buffer too small"); 
    static const char* const digits = "ABCDEF"; 

    if (base < 2 || base > 16) return nullptr; 

    int i = N - 1; 
    str[i] = 0; 

    do 
    { 
     --i; 
     str[i] = digits[val % base]; 
     val /= base; 
    } 
    while (val != 0 && i > 0); 

    return val == 0 ? str + i : nullptr; 
} 

template <int N> 
const char* int_to_string(
    int val, 
    char (&str)[N], 
    unsigned int base = 10) 
{ 
    // Output as unsigned. 
    if (val >= 0) return uint_to_string(val, str, base); 

    // Output as binary representation if base is not decimal. 
    if (base != 10) return uint_to_string(val, str, base); 

    // Output signed decimal representation. 
    const char* res = uint_to_string(-val, str, base); 

    // Buffer has place for minus sign 
    if (res > str) 
    { 
     const auto i = res - str - 1; 
     str[i] = '-'; 
     return str + i; 
    } 
    else return nullptr; 
} 

Verbrauch:

char buf[100]; 
terminal_writestring(int_to_string(42, buf));  // Will print '42' 
terminal_writestring(int_to_string(42, buf, 2)); // Will print '101010' 
terminal_writestring(int_to_string(42, buf, 8)); // Will print '52' 
terminal_writestring(int_to_string(42, buf, 16)); // Will print '2A' 
terminal_writestring(int_to_string(-42, buf));  // Will print '-42' 
terminal_writestring(int_to_string(-42, buf, 2)); // Will print '11111111111111111111111111010110' 
terminal_writestring(int_to_string(-42, buf, 8)); // Will print '37777777726' 
terminal_writestring(int_to_string(-42, buf, 16)); // Will print 'FFFFFFD6' 

anschauliches Beispiel: http://cpp.sh/5ras

+0

Das ist sehr schön! –

+0

Das ist perfekt.(außer ich habe das Gefühl, dass es mit negativen Zahlen nicht funktionieren könnte, aber ich muss das noch testen) Zuerst musste ich manuell jede Zeile durchgehen und in meinen eigenen Worten kommentieren, was es dosierte, bevor ich es schließlich ausarbeitete, was es tat . aber Theres noch einen Teil verstehe ich nicht, und das ist int N und Eavey thingthat geht mit ihm '(& str) [N], int i = N-1, static_assert (N> 1, "Puffer zu klein"); Ich nehme an, dass das der Teil ist, der 42 zu 4 und 2 teilt, aber wie ich nicht verstehe. – skyline

+0

Ja, diese Funktion wird nicht mit Negativen funktionieren, da die Frage uintX_t Typen als Ziel erwähnt. Aber es ist einfach, es zu verbessern, so dass es auch mit Negativen funktioniert. – Rost

-2

Sie könnten einen String deklarieren und den Zeiger um es zu bekommen:

std::string str = std::to_string(count); 
str += "\n"; 
terminal_writestring(str.c_str()); 
+0

Es wäre besser, wenn Sie die Frage tatsächlich lesen würden. –

+0

_ "Der Kicker hier ist jedoch, dass dies in einer freistehenden Umgebung ist, so dass bedeutet keine Standard-C++ - Bibliothek. Die Header, auf die ich zugreifen kann, sind iso646, stddef, float, limits, stdint, stdalign, stdarg, stdbool und stdnoreturn" _ –

Verwandte Themen