Forum: Mikrocontroller und Digitale Elektronik Atxmega: Verschiedene Größen eines Arrays in Objekten


von Jens (Gast)


Lesenswert?

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 :)

von Wolfgang (Gast)


Lesenswert?

Jens schrieb:
> Muss ich da mit new arbeiten? Das will ich eigentlich vermeiden..

Dann lege eine feste Arraygröße fest.

Irgendwoher muss der Speicher schließlich kommen.

von Rolf M. (rmagnus)


Lesenswert?

Jens schrieb:
> class TestKlasse{
>   public:
>     TestKlasse(size);
>
>     unsigned int arr[???];  //Mit new arbeiten?
> };
>
> TestKlasse obj1(100);
1
template <size_t S>
2
class TestKlasse
3
{
4
    //...
5
    unsigned int arr[S];
6
};
7
8
TestKlasse<100> obj1;

von Carl D. (jcw2)


Lesenswert?

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 ;-)

von Jens (Gast)


Lesenswert?

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.

von Jens (Gast)


Lesenswert?

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;

von Dr. Sommer (Gast)


Lesenswert?

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.

von Carl D. (jcw2)


Lesenswert?

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;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.