Variablenzuweisung in for-Schleife

Darüber könnte man jetzt lang und breit diskutieren. Möchte ich aber nicht wirklich.
Du siehst ja was man ändern muss damit es ohne dem bequemen 'auto' Keyword unter C++11 funktioniert. Darauf und noch mehr möchte ich nicht mehr verzichten. Programmieren soll doch einfacher werden. :wink:

Genauso gut könnte man eine platform.local.txt in
\arduino-1.8.19\portable\packages\arduino\hardware\avr\1.8.6\

anlegen und folgenden Inhalt reinschreiben. Wenn man die -std=gnu++11 auf -std=gnu++17 Änderung nicht direkt in der platform.txt machen möchte.

compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -v -std=gnu++17 -fno-exceptions -fpermissive -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto
#compiler.cpp.extra_flags=-fno-sized-deallocation -Wall -Wextra -Werror
compiler.cpp.extra_flags=-fno-sized-deallocation -Wall -Wextra

[Arduino IDE] Feinheiten und Tricks

Wer an C++11 festhalten möchte muss statt 'auto' den expliziten Datentyp schreiben. Wenn es keine Funktionstemplates werden sollen.

// https://forum.arduino.cc/t/variablenzuweisung-in-for-schleife/1082424/52

#include <Streaming.h>

struct Objekt
{
  // default alles public:
  // Elemente bzw. Member
  uint16_t x;
  uint16_t y;
  uint16_t xOffset;
  uint16_t yOffset;
  
  // Konstruktor
  Objekt (uint16_t x, uint16_t y) :
    // Initialisierungsliste
    x {x},
    y {y},
    xOffset {0},
    yOffset {0}
  {}

  void berechneNeuePosition (void)
  { // hier können noch Sicherheitsabfragen rein
    x = x + xOffset;
    y = y + yOffset;
  }
};

// Objekte bzw. Instanzen anlegen
Objekt frischwassertank ( 60, 130);
Objekt bordbatterie     (120,  10);

// Array mit den Instanzen anlegen
Objekt *allObjects [] =
{
   &frischwassertank,
   &bordbatterie
};

void setup(void)
{
  Serial.begin(9600);
  Serial.println("\nReset\n"); 
  // Übergabe an Funktion
  Serial.println("\nParameter"); 
  ausgabe (Serial, frischwassertank);
  ausgabe (Serial, bordbatterie);

  Serial.println("\nKorrektur ..."); 
  korrekturWerte(bordbatterie, 2, 5);
  berechneNeuePosition (bordbatterie);
   
  // Array ausgeben  
  Serial.println("\nRange based for loop"); 
  for (auto &obj : allObjects)
  {
    Serial << obj->x << F(" ") << obj->y << endl;
  }
}

void loop(void)
{

}

void ausgabe (Stream &out, const Objekt &obj)
{
  out << obj.x << F(" ") << obj.y << endl;
}

void korrekturWerte (Objekt &obj, const uint16_t x, const uint16_t y)
{ // hier können noch Sicherheitsabfragen rein
  obj.xOffset = x;
  obj.yOffset = y;
}  

void berechneNeuePosition (Objekt &obj)
{
  obj.berechneNeuePosition();
}

Wegen TO:
Wenn er mit seinem Array und hart kodierten Indexen zurechtkommt, dann soll es so sein.
Jede unüberlegte Änderung im Array zieht einen Rattenschwanz im restlichen Programm nach sich.