2016-04-11 7 views
-1

Ich schreibe eine Skizze für das Arduino-Board und verwende dafür den folgenden C++ - Code. Ich versuche, Dezimalzahlen in binäre umzuwandeln, indem ich eine Dezimalzahl durch die Dec2bin-Funktion übergebe, die ein Zeichenarray zurückgeben soll, das ich dann ausdrucken werde. Aber ich bin immer die Fehlermeldung:Fehler beim Zurückgeben des Zeichenarrays von der Funktion C++

„Inkompatible Typen Zuordnung von‚char‘auf‚char [0]‘“

bei Funktionsaufruf DEC2BIN und Ich erhalte einen weiteren Fehler bei der Rückkehr die innerhalb der DEC2BIN Funktion sagt:

„Ungültige Konvertierung von‚char *‘auf‚char‘[-fpermissive]“

Wenn jemand könnte bitte helfen sie mir mit diesem wäre es sehr zu schätzen. Ich brauche hier ein Zeichen-Array und keine Zeichenfolge! Vielen Dank!

void loop() { 
// put your main code here, to run repeatedly: 
if (Serial.available() > 0){ 
    char BinaryNum [0]; 
    int Decimal = Serial.parseInt(); 
    BinaryNum = dec2bin(Decimal); 
    Serial.println (BinaryNum); 

} 

} 

char dec2bin (int Decimal){ 

    int Remainder; // Remainder of Decimal%2 
    char Binary [0]; // Character array returned by dec2bin 
    int x = 0; 

    while (Decimal != 0){ 
    Remainder = Decimal%2; 
    Decimal = Decimal/2; 
    Binary[x] = Remainder; 
    Serial.println(Binary[x]); 
    x+=1; 
    } 

    return Binary; 
} 
+2

Keine lokale Variable zurückgeben, in diesem Fall binär. Zuordnen und zurückgeben. – phoxis

+4

'char Binär [0]; 'ist ein Array der Länge 0 (was an sich schon seltsam genug ist). Ohne auf seine Länge zu achten, * versuchst du, ein Array zurückzugeben, in dem du versprochen hast, dass du ein einzelnes "Char" zurückgeben würdest. Nur das zu beheben ist nicht genug, es gibt andere Probleme mit Ihrem Code. – usr2564301

+1

Eine einfache Möglichkeit zur Umwandlung in Binärziffern ist die Verwendung eines 'std :: bitset'.Ich bin mir bewusst, dass Standard-Bibliothek-Unterstützung ein bisschen fehlt standardmäßig auf dem Arduino, aber ich erinnere mich von früheren Arduiono Fragen, dass solche Unterstützung von Dritten verfügbar ist. Einschließlich einiger GitHub-Projekte. –

Antwort

0

Gefahr Gefahr, Sie geben einen Zeiger auf eine lokale Variable, Binary, die auf dem Stapel ist, zurück, sobald die Funktion zurückgibt, ist sie außerhalb des Gültigkeitsbereichs und nicht mehr gültig. Dies wird Verrücktheit verursachen, es wird einige Male funktionieren und dann wird es aufhören zu arbeiten, tu es nicht!

Siehe Can a local variable's memory be accessed outside its scope?

Sie müssen in der Lagerung zu übergeben.

z.

void loop() { 
// put your main code here, to run repeatedly: 
if (Serial.available() > 0){ 
    char BinaryNum[33]; // allows for 32 bits plus null terminator 
    int Decimal = Serial.parseInt(); 
    dec2bin(Decimal, BinaryNum); 
    Serial.println (BinaryNum); 

} 

} 

void dec2bin (int Decimal, char* Binary){ 

    int Remainder; // Remainder of Decimal%2 
    int x = 0; 

    while (Decimal != 0){ 
    Remainder = Decimal%2; 
    Decimal = Decimal/2; 
    Binary[x] = Remainder; 
    x+=1; 
    } 
    Binary[x] = '\0'; 
} 

Auf einem "echten" Computer mit einem Betriebssystem gibt es viel mehr Speicherverwaltung Optionen als auf ein kleines Arduino. Sie könnten Zuteilung aus dem Haufen und verwenden etwas Phantasie wie ein Auto_ptr, um es zu verwalten (siehe What is a smart pointer and when should I use one?).

Dies ist auf etwas so klein wie ein Arduino nicht möglich. Sie könnten es jedoch als eine statische zuweisen. Dies ist für einen ausgefallenen Computer nicht geeignet, da es nicht einspringend und somit nicht threadsicher ist. Die statische Zuweisung erfolgt bei Programmverknüpfung oder -start und persistent über Anrufe hinweg.

void loop() { 
// put your main code here, to run repeatedly: 
if (Serial.available() > 0){ 
    int Decimal = Serial.parseInt(); 
    char* BinaryNum = dec2bin(Decimal); 
    Serial.println (BinaryNum); 

} 

} 

void dec2bin (int Decimal) { 
    static Binary[33]; // allows for 32 bits plus null terminator 

    int Remainder; // Remainder of Decimal%2 
    int x = 0; 

    while (Decimal != 0){ 
    Remainder = Decimal%2; 
    Decimal = Decimal/2; 
    Binary[x] = Remainder; 
    x+=1; 
    } 
    Binary[x] = '\0'; 

    return Binary; 
} 
+0

Ich weiß diese Antwort zu schätzen und sie macht deutlich, was ich falsch gemacht habe. Gibt es jedoch trotzdem die Funktion, das Array zurückzugeben, anstatt es durch die Parameter zu leiten, oder ist das genau das, was getan werden muss? Noch einmal, danke! – Heisenberg

+0

Ich habe meine Antwort aktualisiert. – TomKeddie

0

Ich werde Serial.println() anzunehmen, übernimmt ein nul-terminated char*:

Die Signatur für dec2binchar* dec2bin(int decimal) sein sollte, wo char* ein pointer zu Beginn des char-Array ist.

Dann müssen Sie char* binary = new char[arraySize]; deklarieren und zuordnen. Beachten Sie, dass das Array nicht geändert werden kann. (Vergessen Sie nicht, diesen Speicher später mit delete[] freizugeben). Sie können auch am Ende Ihres Arrays '\0' hinzufügen.

Sehen Sie diese post, wenn Sie das Array selbst anstelle eines Zeigers (nicht empfohlen) zurückgeben möchten.

Verwandte Themen