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

#3113376
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
Gast #3113392
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.
#3113415
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
#3113444
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.
Gast #3113556
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.
#3115031
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren