2017-07-21 1 views
-5

Ich verwende eine Bibliothek für ein Arduino-Projekt, das eine Funktion hat, die ich aufrufen muss. Diese Funktion akzeptiert nur einen Parameter des Typs const char*. Nennen wir es foo.Füllen Sie ein Char-Array mit Int-Werten

Ich muss einige int Werte zu foo übergeben, also konvertiere ich sie zuerst mit sprintf. So weit, ist es gut.

Das Problem kommt, wenn ich versuche, ein Array mit int Werte char umgewandelt zu füllen und dann foo mit jedem der Werte im Array nennen.

Ich hoffe, das erklärt das Problem besser:

#include <iostream> 
using namespace std; 


// This function cannot be modified because 
// is a part of a library 
void foo(const char *bar){ 
    cout << "Result: " << bar << endl; 
} 

int main() { 
    char *values[10]; // My array of values 
    char tmp[10]; // Temporary buffer for the int > char conversion 

    for(int i = 0; i < 10; i++){ 
     int samplevalue = i * 2; // Just a sample value, not important 
     sprintf(tmp, "%d", samplevalue); // Copy the sample value to the temporary buffer 
     values[i] = tmp; // Assign the value of the temp var to a position in my values array 
     cout << values[i] << endl; 
    } 

    cout << "==============" << endl; 


    // Here comes the problem: 
    for(int i = 0; i < 10; i++){ 
     foo(values[i]); 
    } 

    return 0; 
} 

Der Ausgang dieses Codes ist folgende:

0 
2 
4 
6 
8 
10 
12 
14 
16 
18 
============== 
Result: 18 
Result: 18 
Result: 18 
Result: 18 
Result: 18 
Result: 18 
Result: 18 
Result: 18 
Result: 18 
Result: 18 

Wie Sie sehen können, die alle die Ergebnis Linien sind gleich der letzte Wert, der dem tmp var. Ich nehme an, es liegt daran, dass jeder der Werte im Array values[10] einen Zeiger auf die Variable tmp statt auf seinen tatsächlichen Wert enthält.

Was ich möchte, ist eine andere Nummer auf jedem Ergebnis Zeile, wie in der ersten for Schleife.

Ich denke, es ist ziemlich offensichtlich, dass ich nicht einmal in der Nähe bin, ein C++ - Experte zu sein, und jede Hilfe wird sehr geschätzt.

Danke!

+1

Sie haben nur ein 'tmp' also warum würden Sie mehrere Werte erwarten? – stark

+0

Da dies als [tag: arduino] markiert ist, bedeutet das, dass Sie keinen Zugriff auf 'std :: sting' und' std :: to_string() 'haben? – NathanOliver

+0

Erwarten Sie (char *) Werte [10] oder char (* Werte [10]), Stellen Sie sicher, dass Sie Klammern verwenden, um anzugeben, welche Art Sie verwenden möchten. –

Antwort

-1

Ok, ich muss es endlich funktionieren lassen. In Arduino Strings werden als String variable; erklärt, und die c_str() Funktion wandelt eine Zeichenkette in eine const char *, so dass ich wandeln die int Nummer String, und dann zu const char *:

for(int i = 0; i < 10; i++){ 
    String tmp = String(i * 2); 
    values[i] = tmp.c_str(); 
} 

Und das ist es! Es funktioniert jetzt :)

+0

Das ist falsch, 'values ​​[i]' wird ein schwebender Zeiger sein. –

1

Ein char * Zeiger und ein Array sind keine Zeichenfolge. Verwenden Sie stattdessen std::string.

#include <iostream> 
using namespace std; 


// This function cannot be modified because 
// is a part of a library 
void foo(const char *bar) 
{ 
    cout << "Result: " << bar << endl; 
} 

int main(void) 
{ 
    std::string values[10]; // My array of values 
    char tmp[10]; // Temporary buffer for the int > char conversion 

    for (int i = 0; i < 10; i++) { 
     int samplevalue = i * 2; // Just a sample value, not important 
     sprintf(tmp, "%d", samplevalue); // Copy the sample value to the temporary buffer 
     values[i] = tmp; // Assign the value of the temp var to a position in my values array 
     cout << values[i] << endl; 
    } 

    cout << "==============" << endl; 


    // Here comes the problem: 
    for (int i = 0; i < 10; i++) { 
     foo(values[i].c_str()); 
    } 

    return 0; 
} 

Wenn ein Array verwendet wird, alle Zeiger in Ihrem values Array Punkt tmp, können Sie prüfen, ob durch ähnliche

fprintf(stdout, "%p\n", values[i]); 

So durch values und Drucken der Adresse Looping, weil Sie sprintf() in tmp Alle Werte, der Wert, der gedruckt wird, ist immer der letzte, es gibt keine Kopie impliziert in

values[i] = tmp; 

das macht nur values[i] zeigen Sie auf tmp, so dass Sie Zugriff auf values[i] wirklich zugreifen tmp.

Mit std::string Kopie erfolgt.

Auch sollten Sie wahrscheinlich einen String-Stream verwenden, um Zahlen in jedem values[i] direkt zu schreiben, weil sprintf() sehr gefährlich ist.

Oder besser noch eine echte C++ Lösung wie diese verwenden,

#include <iostream> 
#include <vector> 
#include <sstream> 

// This function cannot be modified because 
// is a part of a library 
void foo(const char *bar) 
{ 
    std::cout << "Result: " << bar << std::endl; 
} 

int main(void) 
{ 
    std::vector<std::string> values; 
    for (int i = 0; i < 10; i++) { 
     values.push_back(std::to_string(2 * i)); 
     std::cout << values[i] << std::endl; 
    } 
    std::cout << "==============" << std::endl; 
    for (size_t i = 0; i < values.size(); i++) { 
     foo(values[i].c_str()); 
    } 
    return 0; 
} 

Beachten Sie, dass jetzt, können Sie die Anzahl der Elemente in values ändern können, und Sie können es als ein Array verwenden, wenn Sie benötigen, nur Lesen Sie die Dokumentation für std::vector.

+0

Sie müssen auch 'foo (Werte [i]) ändern;' ist 'values' ist ein Array von' std :: string's. – NathanOliver

+0

Beachten Sie, dass das OP die Funktion, die ein 'const char *' braucht, nicht ändern kann. – NathanOliver

+0

@NathanOliver Bekannt! –

Verwandte Themen