2010-12-05 9 views
4

Ich schreibe eine Klasse für den Arduino. Es ist schon gut geht so weit, aber ich bin jetzt Art von stecken ...C++/Arduino: dynamische Int-Array

Ich habe einen int-Array in meiner Klasse deklariert

class myClass 
{ 
    public: MyClass(int size); 
    private: 
    int _intArray[]; 
}; 

Wenn ich die Klasse zu initialisieren MyClass myClass1(5) ich das Array müssen schauen so {0,0,0,0,0}.

Meine Frage: Was muss ich tun, damit das Array 'Größe' Nullen enthält?

MyClass::MyClass(int size) 
{ 
    //what goes here to dynamically initialize the array 
    for(int i=0; i < size; i++) _intArray[i] = 0; 
} 

Edit: Im Anschluss an verschiedenen Antworten unten, wird Arduino nicht die Standard-Bibliothek ist so leider sind std::vector keine Option

Antwort

2

Ihr Code wie ich dies schreibe:

class myClass 
{ 
    public: MyClass(int size); 
    private: 
    int _intArray[]; 
}; 

Die Deklaration von _intArray ist ungültig C++: ein Raw-Array muss eine Größe haben, die bei c angegeben wird ompile Zeit.

Sie können stattdessen verwenden Sie stattdessen eine std::vector:

class myClass 
{ 
public: 
    MyClass(int size) 
     : intArray_(size) // Vector of given size with zero-valued elements. 
    {} 

private: 
    std::vector<int> intArray_; 
}; 

Anmerkung 1: einige Compiler können Ihrem Original-Code als Spracherweiterung ermöglichen, um die „struct Hack“ (das ist eine C-Technik zu unterstützen das ist in C++ nicht notwendig).

Hinweis 2: Ich habe den Namen Ihres Mitglieds geändert. Im Allgemeinen können Unterstriche am Anfang von Namen problematisch sein, da sie Konflikte mit Namen aus der C++ - Implementierung verursachen können.

Beifall & hth.,

+1

Ich bekomme eine Fehlermeldung "ISO C++ verbietet Deklaration von 'Vektor' ohne Typ" ledLib.h: 40: Fehler: ISO C++ verbietet Deklaration von 'Vektor' ohne Typ MyClass.h: 40: Fehler: ungültige Verwendung von '::' MyClass.h: 40: Fehler: erwartet ';' vor '<' token MyClass.h: Im Konstruktor 'MyClass :: MyClass (int)': MyClass.h: 36: error: Klasse 'MyClass' hat kein Feld namens 'intArray_' – JNK

+0

@JNK: Haben Sie '' header? –

+1

Ich habe es (jetzt) ​​aufgenommen, aber es ändert nichts ... :( – JNK

2

Sie sollten einen std :: vector verwenden.

class myCLass { 
public: 
    myClass(int size) 
     : intarray(size) { 
    for(int i = 0; i < size; i++) intarray[i] = 0; 
    } 
private: 
    std::vector<int> intarray; 
}; 
+0

warum nicht ": intarray (size, 0) {"? –

+0

@Oxsnarder: Meh, nicht wirklich so versiert in Vektor Konstruktoren. – Puppy

+1

Die Nullsetzungsschleife ist nicht notwendig: 'std :: vector' garantiert, dass diese Elemente auf Null gesetzt werden. –

2

Ich werde versuchen, die folgenden:

class myClass 
{ 
    public: 
    MyClass(int size); 
    ~MyClass(); 
    private: 
    int* _intArray; 
}; 

MyClass::MyClass(int size) { 
    _intArray = new int[size]; 
    for (int i=0; i<size; ++i) _intArray[i] =0; // or use memset ... 
} 

MyClass::~MyClass() { 
    delete[] _intArray; 
} 

Oder, noch besser, vector stattdessen eine STL verwenden ...

2

sollten Sie wirklich verwenden Vektoren, wie andere vorgeschlagen haben. Ein Workaround könnte wie gezeigt aussehen (falls Sie nicht memcpy oder eine Schleife verwenden möchten).

Dies wäre nützlich, wenn Sie ein wirklich großes Array haben. Beachten Sie, dass es eine Umleitungsebene für den Zugriff auf das Array hinzufügen würde.

class myClass 
{ 
public: 
    myClass(){ 
     mt = T(); // value initialize. 
    } 
private: 
    struct T{ 
     int _intArray[10]; 
    } mt; 
}; 

int main(){ 
    myClass m; 
}