mikrocontroller.net

Forum: PC-Programmierung Klassen Member Array Initialisierung in C++


Autor: Peter Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum o/

ich habe eine Frage zur Initialisierung von Array Membern einer Klasse 
in C++ in der Initialisierungsliste. Beim CodeReview ist mir öfters 
sowas hier unter gekommen:

Deklarationen:
*.h
float bufferA[A][B]
int buffer[C]
AnotherClass* array[D]

Dazugehöriger Klassenconstruktor Definition dann:
*.cpp
MyClass::MyClass() :
bufferA({}),
buffer({}),
array({})

Hier meckert mir PC-Lint diese Vorgehensweise aber an, bspw:
Type mismatch (initialization) (int [4320] = int)

Deshalb meine Frage: ist die Initialisierung so überhaupt zulässig? 
Konnte darüber leider nichts finden. Gibt es denn überhaupt dann eine 
Möglichkeit dies in der Initialisierungsliste zu tun? Die Möglichkeit im 
Konstruktorrumpf selbst ist mir bekannt.

Schönen Gruß,
Peter

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Je nun, mit welcher C++-Version bist du unterwegs, was sagt der Compiler 
dazu, was hast du dazu auf den einschlägigen Internetseiten (z.B. 
Cplusplus.com) nachgelesen, und was steht dazu in deinem C++-Buch?

Jemand, der Codereviews durchführt, sollte all diese Antworten 
griffbereit haben.

Oliver

Autor: Peter Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mea culpa - die dazugehörigen Informationen waren für wahr ein wenig 
dünn. Genauer:

* C++03
* mein gcc sagt überhaupt nichts dazu
* Die Aussagen auf bspw. stackoverflow sind widersprüchlich, zum 
Beispiel hier: 
http://stackoverflow.com/questions/11837078/initia...
* Meine Literatur gibt nur Material her für eine direkte Initialisierung 
mit Werten: array{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }

Mir geht es aber explizit um die Möglichkeit mit ({ }), sowie der 
best-practise Variante

Autor: Torsten Robitzki (Firma: robitzki.de) (torstenrobitzki)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
PC lint ist auch nur ein "Compiler" und wird auch so seine bugs haben. 
Initializer Syntax ist ja erst mit C++11 aufgenommen worden. Kann PC 
Lint C++11?

Persönlich finde ich die leeren Arrays in der in der 
Initialisierungsliste ja recht überflüssig.

Autor: Pit (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Torsten R. schrieb:
> PC lint ist auch nur ein "Compiler" und wird auch so seine bugs haben.
> Initializer Syntax ist ja erst mit C++11 aufgenommen worden. Kann PC
> Lint C++11?
>
> Persönlich finde ich die leeren Arrays in der in der
> Initialisierungsliste ja recht überflüssig.

Bei der Initialisierung mit {} werden die Array-Elemente auf 0 gesetzt.
Bei sowas - int data[17]; - steht irgendwelcher Mist drin.

Gruß Pit

Autor: Brad (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pit schrieb:
> Bei der Initialisierung mit {} werden die Array-Elemente auf 0 gesetzt.

Genauer gesagt wird für jedes Array-Element der Standardkonstruktor 
aufgerufen. In Falle der primitiven Datentypen wären das dann die 
"Pseudo"-Konstruktoren int() und float(), die definitionsgemäß mit 0 
bzw. 0.0f initialisieren.

Autor: Carl Drexler (jcw2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hier meckert mir PC-Lint diese Vorgehensweise aber an, bspw:
> Type mismatch (initialization) (int [4320] = int)

Dann scheint es die leere Intializer-Liste für Arrays nicht richtig zu 
verstehen und hat "{}" dann zu "{0}" übersetzt, was aber auch valides 
C++ ist und genau das gleiche, "::memset(array,0,sizeof(array));", 
machen sollte

Schönes Beispiel, wie veraltete Richtlinien den Einsatz verbesserter 
Verfahren be(/ver)hindern können.

Kauf dir ein besseres Lint oder glaub den Compilerwarnings.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.