Forum: Compiler & IDEs C++ Array in einer Klasse -> Grösse bestimmen


von Patrick B. (p51d)


Lesenswert?

Hallo miteinander

Ich habe eine kleine frage:
Wie kann ich die Grösse eines Arrays in einer Klasse bestimmen?
1
class test{
2
  public:
3
    test();
4
    ~test();
5
    read();
6
    uint16_t buffer[20];
7
};
8
9
test::read(void){
10
  for(uint16_t i = 0; i < (sizeof(buffer)/sizeof(buffer[0])); i ++){
11
    // etwas
12
  }
13
}
Die Schlaufe wird irgendwie durchlaufen, aber nur nicht 20 mahl.
Was mache ich falsch?

MFG
Patrick

von Dussel (Gast)


Lesenswert?

buffer ist ein Zeiger und size[0] ist ein uint16_t. Wie groß der Zeiger 
ist, hängt vom verwendeten System ab. Auf einem modernen Computer sind 
das wahrscheinlich 32 oder 64 Bit. Die Größe eines Arrays kann man 
meines Wissens nicht im Programm bestimmen.

von Karl H. (kbuchegg)


Lesenswert?

Patrick B. schrieb:

> Die Schlaufe wird irgendwie durchlaufen, aber nur nicht 20 mahl.
> Was mache ich falsch?

Du zeigst nicht den restlichen bzw. deinen richtigen Code.
Im Geposteten ist in dieser Richtung erst mal nichts falsch.

von Karl H. (kbuchegg)


Lesenswert?

Dussel schrieb:
> buffer ist ein Zeiger und size[0] ist ein uint16_t. Wie groß der Zeiger
> ist, hängt vom verwendeten System ab. Auf einem modernen Computer sind
> das wahrscheinlich 32 oder 64 Bit. Die Größe eines Arrays kann man
> meines Wissens nicht im Programm bestimmen.

ziemlicher Unsinn, den du da verbreitest.

von Mark B. (markbrandis)


Lesenswert?

Na klar geht das:

1
#include <inttypes.h>
2
#include <iostream>
3
4
using std::cout;
5
using std::endl;
6
7
class test {
8
  public:
9
    test() {};
10
    ~test() {};
11
    void read(void);
12
    uint16_t buffer[127];
13
};
14
15
void test::read(void) {
16
    cout << "Size of array buffer[]: " << (sizeof(buffer)/sizeof(buffer[0])) << endl;
17
}
18
19
int main() {
20
    test a;
21
    a.read();
22
    return 0;
23
}

Size of array buffer[]: 127

von Dussel (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> ziemlicher Unsinn, den du da verbreitest.
Ja? Ok, dann tut es mir leid.

von Karl H. (kbuchegg)


Lesenswert?

Dussel schrieb:
> Karl Heinz Buchegger schrieb:
>> ziemlicher Unsinn, den du da verbreitest.
> Ja?

Ja, leider.
Das fängt schon mal damit an, dass an dieser Stelle überhaupt kein 
Pointer involviert ist.
Wenn er das Array an eine andere Funktion als Parameter 'übergeben' 
hätte, dann hättest du recht. Aber das hat er nicht - zumindest nicht in 
der geposteten Codeskizze. Allerdings kennen wir ja unsere Pappenheimer 
- das heißt ja noch lange nicht, dass er es in seinem richtigen Code 
nicht genau so macht. Daher: der echte Code muss her.

von Patrick B. (p51d)


Angehängte Dateien:

Lesenswert?

Ok, im Anhang ist noch der Code:
Hierbei habe ich die unnötigen Funktionen gelöscht. Es geht nur um die 
Funktion "u8HandleWriteMultipleRegisters" mit der 2. if-Abfrage.
Es wird nur geprüft ob "p__u16StartAdr" nicht ausserhalb des 
Array-Bereichs liegt.

von Patrick B. (p51d)


Lesenswert?

Oh mann... Fehler gefunden.
>  private:
>    sf_uint16 m_au16HoldingRegisters[1];   /// <- sollte 10 sein

Besten Dank für die hilfe (ich war mir einen Moment lang nicht mehr 
sicher, wie man mit sizeof umgehen muss).

von Dussel (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Das fängt schon mal damit an, dass an dieser Stelle überhaupt kein
> Pointer involviert ist.
Ja gut. Zu Rettung meiner Ehre muss ich aber trotzdem sagen, dass Zeiger 
und Arrays sehr verwandt sind. Ich bin immer davon ausgegangen, dass die 
intern gleich behandelt werden. Was ich aber nicht wusste, ist, dass man 
mit sizeof tatsächlich die Größe eines Arrays bestimmen kann.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

1
     sf_uint16 m_au16HoldingRegisters[1];                            /// Holding register

Welchen Sinn hat ein Array, das genau ein Element enthält?

von Patrick B. (p51d)


Lesenswert?

Das ist am Anfang nur als Platzhalter gedacht gewesen.
Das Array soll beim instanzieren der Klasse definiert werden.

von Rolf M. (rmagnus)


Lesenswert?

Patrick B. schrieb:
> Das Array soll beim instanzieren der Klasse definiert werden.

Die Definition des Arrays ist Teil der Definition der Klasse. Beim 
Instanziieren kann man nichts definieren.

von Karl H. (kbuchegg)


Lesenswert?

> Es geht nur um die
> Funktion "u8HandleWriteMultipleRegisters" mit der 2. if-Abfrage.
> Es wird nur geprüft ob "p__u16StartAdr" nicht ausserhalb des
> Array-Bereichs liegt.

Alles schön und gut, aber hier

> sf_uint8 CModbus::u8HandleWriteMultipleRegisters (sf_uint16 p__u16StartAdr, 
sf_uint16 p__u16Num, sf_uint8 p__u8ByteCnt, sf_uint8 p_au8Data[])
{
...


>  for (u16WordCnt = 0; u16WordCnt < p__u16Num; u16WordCnt++, i += 2)/// Save new 
values

vermisse ich den Test ob p__u16Num im zulässigen Bereich ist. Wenn 
nicht, dann bügelst du dir den Speicher nieder. Und bei einer 
Array-Länge von 1, ist das nicht sehr unwahrscheinlich.
Da sollte auf jeden Fall noch ein Test mit rein!

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.