Atxmega: Verschiedene Größen eines Arrays in Objekten

Gast #4414743
Hallo,

ich habe in einer Klasse ein Array und möchte beim Übersetzen - nicht 
zur Laufzeit! - das jedes Objekt seine eigene Arraygröße hat.

Beispiel:
1
class TestKlasse{
2
  public:
3
    TestKlasse(size);
4

5
    unsigned int arr[???];  //Mit new arbeiten?
6
};
7

8
TestKlasse obj1(100);

Muss ich da mit new arbeiten? Das will ich eigentlich vermeiden..

Danke für die Hilfe :)
Dazu könnte man Templates benutzen:
1
template<int SIZE> class TestKlasse{
2
  public:
3
    TestKlasse();
4

5
    unsigned int arr[SIZE];
6
};
7

8
TestKlasse<100> obj1;
9
TestKlasse<50>  obj2;
Damit schreibt man den Code einmal und alles andere verwaltet der 
Compiler. Sollte dieser nicht allzu doof sein, wird er nur Code-Teile, 
die wirklich von SIZE abhängig sind, in mehreren Instanzen anlegen.

Verdammt, schon wieder einer schneller ;-)
Gast
Nun, aber das eine Objekt braucht vielleicht 100 Felder, das andere nur 
10.

Die Speichergröße möchte ich zum Zeitpunkt der Übersetzung für jedes 
Objekt festlegen, aber nicht nacher zur Laufzeit.
Gast
Das ist ja ganz schön verwirrend mit den ganzen <>...
Aber ich habs fast!

Wie kann ich die Tempate Methoden untereinandere sich gegenseitig 
aufrufen lassen?
1
template<int SIZE> class TestKlasse{
2
  public:
3
    TestKlasse();
4
    void M1();
5
    void M2();
6

7
    unsigned int arr[SIZE];
8
};
9

10
template<int SIZE> 
11
void TestKlasse<SIZE>::M1(){
12
}
13
 
14
template<int SIZE> 
15
void TestKlasse<SIZE>::M2(){
16
  M2();//?????????????????????????????????????????
17
}
18

19
TestKlasse<100> obj1;
20
TestKlasse<50>  obj2;
Gast
Jens schrieb:
> template<int SIZE>
> void TestKlasse<SIZE>::M2(){
>   M2();//?????????????????????????????????????????
> }

So ist das schon richtig... Aber verwende "size_t SIZE" und nicht "int 
SIZE", dann ist das portabler, und funktioniert z.B. auch auf x86_64 
korrekt.
Jens schrieb:
> Wie kann ich die Tempate Methoden untereinandere sich gegenseitig
> aufrufen lassen?
>
>
1
> template<int SIZE> class TestKlasse{
2
>   public:
3
>     TestKlasse();
4
>     void M1();
5
>     void M2();
6
> 
7
>     unsigned int arr[SIZE];
8
> };
9
> 
10
> template<int SIZE>
11
> void TestKlasse<SIZE>::M1(){
12
> }
13
> 
14
> template<int SIZE>
15
> void TestKlasse<SIZE>::M2(){
16
>   M2();//?????????????????????????????????????????
17
> }
18
> 
19
> TestKlasse<100> obj1;
20
> TestKlasse<50>  obj2;
21
>

falls du in M2() M1() rufen wolltest, dann geht das.
So wie geschrieben, gibt es nur einen Stack-Überlauf.
Und wie schon oben geschrieben, wenn eine der Methoden tatsächlich von 
SIZE abhängt, dann gibt es die eben mehrfach und die jeweils richtige 
wird gerufen.

Zu der <>-Verwirrung: die Zeit, die man in ein vernüftig gebaute 
Template-Klasse investiert, kommt bei der Benutzung schnell wieder 
zurück. Man kann auch den Typ der Array-Element offen lassen:
1
template<typename T, size_t SIZE> class TestKlasse{
2
  public:
3
    TestKlasse();
4
    void M1();
5
    void M2();
6

7
    T arr[SIZE];
8
};
9

10
template<typename T, size_t SIZE> 
11
void TestKlasse<SIZE>::M1(){
12
}
13
 
14
template<typename T, size_t SIZE> 
15
void TestKlasse<SIZE>::M2() {
16
    M1();
17
}
18

19
TestKlasse<uint8_t,100> obj1;
20
TestKlasse<double,50>  obj2;

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.