Zusätzlich zu den obigen Kommentaren möchte ich die Probleme mit dem Arbeitsspeicher, die Sie auf Arduino-Platinen haben, weiter hervorheben, insbesondere mit dem Uno (und anderen, die denselben Mikrocontroller verwenden). Ich habe kürzlich ein einfaches Space Invaders-Spiel geschrieben, das auf einer 32x32-LED-Matrix läuft, und bin wiederholt auf Probleme gestoßen, die durch zu wenig Arbeitsspeicher verursacht wurden.
Der Uno hat nur 2048 Bytes RAM. Die Bibliothek für meine Matrix übernahm 3/4 davon und ließ mir rund 400 Bytes für das Spiel übrig. Da ich beabsichtige, das Projekt irgendwann zu "upgraden", um mehrere Spiele mit demselben Programm auf der Grundlage des leistungsfähigeren Due auszuführen, habe ich den Code mit OO-Prinzipien und viel Klassenvererbung entworfen. (Die Spielklasse wurde mit virtuellen Aktualisierungs- und Ziehungsaufrufen vererbt, die Spieleinheiten wurden alle vererbt).
Mir ging so ziemlich der Speicher aus, als ich die Eindringlinge hinzufügte. Ich habe versucht, Speicherplatz zu sparen, indem ich ihre Mitgliedsvariablen bitweise abgetastet habe, aber beim Hinzufügen der Schildobjekte ging mir der Speicherplatz wieder aus. Nachdem ich ein bisschen mehr geschabt hatte, lief ich aus und fügte die Bomben / Kugeln hinzu. Zu diesem Zeitpunkt durchsuchte ich den Code und entfernte alle "virtuellen" Tags (alle meine Klassenprototypen werden aus einem Visual Assist-Snippet erstellt und alle Destruktoren werden automatisch virtuell). Dies halbierte sofort meinen Speicherverbrauch und gab genug frei, um den Code zu vervollständigen.
Kurz gesagt, das Endergebnis ist C ++ - Code, der keine C ++ - Funktionen verwendet. Möglicherweise halten Sie sich auch nur an C und sind sich Ihrer Speichernutzung sehr bewusst. Wenn Sie die 2 KB überschreiten, erhalten Sie keine Hilfe. Insbesondere, wenn Sie eine dynamische Zuordnung verwenden, funktioniert der Code nicht mehr und Sie kratzen sich eine Weile am Kopf, bis Sie die Möglichkeit eines Speicherüberlaufs in Betracht ziehen.
PS - Bitfeldvariablen sind schlecht. Sehr schlecht. Abgesehen vom zusätzlichen Verarbeitungsaufwand habe ich die Häufigkeit, mit der ich dem Spiel einen neuen Status hinzufüge, aus den Augen verloren, aber der Code wurde nicht ausgeführt und ich konnte nicht verstehen, warum. Meine Statusvariable war nicht breit genug, um den neuen Statuswert aufzunehmen, sodass ich einen unerwarteten Status erhielt.