Go Down

Topic: Funktion erstellen (Read 530 times) previous topic - next topic

Serenifly

Es ist falsch egal wo es steht. Ob Funktion oder nicht spielt keine Rolle
Erstens musst du schon beim Tastendrücken aufpassen dass du nicht über die Array-Grenze schreibst. Zweitens erwartet atoi() ein Null-terminiertes char Array

combie

#16
Sep 17, 2018, 08:29 pm Last Edit: Sep 17, 2018, 08:31 pm by combie
Arrays sind anderes als in manchen anderen Sprachen kein eigenständiger Datentyp.
Deine Aussage hat mich gerade stutzig gemacht.

Immerhin:
C++ trägt sehr wohl die Größe eines Arrays mit sich rum.


Das kann man auch schön nutzen, um Bereichsüberschreitungen zu vermeiden.
Man muss es allerdings zufuß machen. Automatisch erkannt werden Bereichsüberschreitungen nur bei der Initialisierung.

Ein echter Fortschritt, gegenüber C.



Testprogramm:
Code: [Select]


using EinEigenerType = char[5];


char testA[] = "9999";
char testB[5] = "9";
EinEigenerType testC = "9";
EinEigenerType testD = "999999"; // hier wirft der Compiler eine Warnung


void setup()
{
  Serial.begin(9600);     
  Serial.println("Start");
  Serial.println(sizeof(testA));
  Serial.println(sizeof(testB));
  Serial.println(sizeof(testC));
  Serial.println(sizeof(testD));
}

void loop()
{
   
}


Schreie nach Besserem, bis du es auch erhältst.
Das noch Bessere verabschiedet sich rechtzeitig vor deinem Lärm.

Quelle: Martin Gerhard Reisenberg

postmaster-ino

Hi

So oder so verhindert der Kompiler (zumindest hier beim Arduino) aber nicht, daß man auf das x-te Element des Array zugreift, egal, wie hoch X ist, egal ob lesend, oder schreibend.
Wie's bei einem Speicherüberlauf aussieht - kA (also wohin testA[15000] dann schaut) und oder ob die Größe des Index reglementiert ist wobei uint16_t schon recht weit hinter die Speichergrenze reichen wird.

MfG

combie

#18
Sep 17, 2018, 10:02 pm Last Edit: Sep 17, 2018, 10:30 pm by combie
So oder so verhindert der Kompiler (zumindest hier beim Arduino) aber nicht, daß man auf das x-te Element des Array zugreift, egal, wie hoch X ist, egal ob lesend, oder schreibend.
Da hast du Wahr!

Und das hat auch seinen Grund!

Würde C++ diese Laufzeitprüfungen machen, dann wären die erzeugten Kompilate erheblich größer, und langsamer. Das würde der "Maschinennähe" gar nicht gut tun.
Es sind ja nicht nur die Arrays, sondern eher die Zeiger, welche in die Wiese zeigen(können)
Und auf Zeiger will man nicht verzichten.

Ein C/C++ Programmierer ist halt nicht auf Rosen gebetet, ihm wird nicht bei jeder Gelegenheit der Hintern abgeputzt.
Er ist selber verantwortlich, für das, was er/sie/es tut.

:smiley-twist:  Eine gute Gelegenheit, etwas Verantwortung, Disziplin und Sorgfalt zu lernen. :smiley-twist:


Hier mal ein Progrämmchen, welches die Äquivalenz von Zeigern und Arrays vorführt:
(und ja, der Code ist Standardkonform)
Code: [Select]


unsigned long test[] {30,40,50};


void setup()
{
  Serial.begin(9600);     
  Serial.println("Start");

  int i = 1;
  Serial.println( test[i] );
  Serial.println( i[test] );
  Serial.println( 1[test] );
  Serial.println( *(test+i) );
  Serial.println( *(1+test) );
}

void loop()
{

}
Schreie nach Besserem, bis du es auch erhältst.
Das noch Bessere verabschiedet sich rechtzeitig vor deinem Lärm.

Quelle: Martin Gerhard Reisenberg

postmaster-ino

Hi

... kommt mir bekannt vor ... in Assembler hat man nicht Mal Das :o
(und auch, wenn ich Assembler schon irgendwie geil finde, hat man's in C++ doch erheblich einfacher)

MfG

gregorss

... und auch, wenn ich Assembler schon irgendwie geil finde, hat man's in C++ doch erheblich einfacher ...
Nicht ohne Grund ist C/C++ so beliebt: Es ermöglicht eine sehr maschinennahe Programmierung, bei der einem viel Assembler-Gehampel abgenommen wird.

Gruß

Gregor
Meine Pizza schmeckt am besten, wenn ich sie selber esse.

Go Up