C++ Array in einer Klasse -> Grösse bestimmen

OP #3113376
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
Gast
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.
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.
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
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.
Gast
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.
> 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!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 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.