Hallo,
gibt es eine Möglichkeit, bei der Definition die Arraygröße
wegzulassen/automatisch eintragen zu lassen?
Ich habe ein Array, das wirklich seeehr groß ist und immer mal händisch
hier und da geändert wird, wenn eine neue Version compiliert wird.
Eigentlich ist es ja nicht die Aufgabe eines Programmierers, sowas
nachzuzählen oder bei Veränderungen immer die Zahl abändern zu müssen.
Sowas kann doch sicher ein Präprozessor/Compiler viel besser und
sinnvoller.
"Unsauber" wäre natürlich, einfach 9999 einzutragen und es der
Optimierung anzuvertrauen... aber im Programm selbst wäre es ganz
nützlich, wenn ich dann auch wüsste, wie groß es real ist...
Beispiel (damit klar ist, was gemeint ist):
Timmo H. schrieb:> static const tBla Bla[] PROGMEM = "Blubb bla trallalla";
Und für die gerade aktuelle Größe: sizeof(Bla) / sizeof(Bla[0])
Öhh, die Klammern kann man wohl auch weglassen, bin ich bloss kein Fan
davon...
Bla schrieb:> Eigentlich ist es ja nicht die Aufgabe eines Programmierers,
Natürlich ist es DEINE Aufgabe als Programmiere Speicher anzufordern,
und ergo musst DU auch wissen wie viel Speicher DU brauchst.
Wenn sich die benögtigte Speichergröße bei jedem mal Compiliren ändert
(warum eigentlich?) dann musst DU dir was einfallen lassen... dynamische
Speicher alokierung, make-datei und compiler flags(wäre für dich wohl
das sinnvollste) oder was auch immer... gibt genug möglichkeiten.
Bla schrieb:> Sowas kann doch sicher ein Präprozessor/Compiler viel besser und> sinnvoller.
Speicherverwaltung ist mit Sicherheit NICHT die Aufgabe von Compiler
und/oder Präprozessor. Die liegt entweder beim OS, oder wenn es ein µC
ohne OS ist, dann eben sehr wohl beim PROGRAMMIERER. Aber selbst mit OS
musst DU schon irgendwie sagen, wie viel Speicher DU haben willst.
Bla schrieb:> Ich habe ein Array, das wirklich seeehr groß ist
Was "groß" ist und was nicht, ist sache der ansicht. Die berühmten
"20cm" eben. Wäre geil wenn du mal sagst was das für ein Array ist...
Wenn da ein String drin steht ist es egal, dann kannst du einfach:
1
constcharmySting[]="Mal gucken wie lang das Ding wird.";
Da wird die Größe dann automatisch ermittelt. Bei allem anderen sieht es
schlecht aus.
Bla schrieb:> gibt es eine Möglichkeit, bei der Definition die Arraygröße> automatisch eintragen zu lassen?
Es gibt mit sicherheit Sprachen wo das geht, aber C/C++ gehört nicht
dazu, und ist für sowas auch gar nicht gedacht. Das ist nämlich das
schöne an C/C++: DU hast die Kontroller über das, was passiert.
Grüße
Tom K. schrieb:> gcc frisst auch ein Array, das kein String ist:
Nicht nur gcc.
Es ist völlig legitim, bei der Definition eines Arrays die Größenangabe
wegzulassen. Die Größe des Arrays ergibt sich dann aus der Anzahl der im
Initialisierer aufgeführten Elemente.
>Ich habe ein Array, das wirklich seeehr groß ist und immer mal händisch>hier und da geändert wird, wenn eine neue Version compiliert wird.
Es kann in solchen Fällen sinnvoll sein, das Array nicht manuell zu
bearbeiten, sondern aus den Ausgangsdaten als Teil des Buildprozesses
Code erzeugen zu lassen. Z.B. eine .csv-Datei lässt sich mit ein paar
Zeilen in einer beliebigen Scriptsprache in eine Array-Definition
konvertieren.
Kaj schrieb:> Natürlich ist es DEINE Aufgabe als Programmiere Speicher anzufordern,> und ergo musst DU auch wissen wie viel Speicher DU brauchst.
Keineswegs. Der Compiler kann das auch prima selbst erledigen. Wie
man (über sizeof) hinterher als Programmierer erfährt, wie viele
Elemente wirklich drin sind, wurde ja auch schon genannt.
Kaj schrieb:> Bla schrieb:>> Eigentlich ist es ja nicht die Aufgabe eines Programmierers,> Natürlich ist es DEINE Aufgabe als Programmiere Speicher anzufordern,> und ergo musst DU auch wissen wie viel Speicher DU brauchst.
Warum? Wenn die Größe zur Compilezeit feststeht und der Compiler die
ganz problemlos ermitteln kann, warum soll der Programmierer die
Elemente dann nochmal von Hand abzählen und die Anzahl extra
hinschreiben müssen? Damit der Compiler prüfen kann, wie gut der
Programmierer im Zählen ist?
> Wenn sich die benögtigte Speichergröße bei jedem mal Compiliren ändert> (warum eigentlich?) dann musst DU dir was einfallen lassen...
Wo steht denn was davon, daß sie sich jedesmal ändert? Wenn man z.B.
eine Menüstruktur abbildet und jeder Menü-Eintrag ein Array-Element ist,
ändert sich die Größe halt, wenn man neue Menü-Einträge erzeugt oder die
Menüstruktur umstellt, oder wenn man z.B. eine Debug-Version des
Programms hat, die abhängig von einem #define ein zusätzliches
Debug-Menü beinhaltet oder eben nicht. Welchen Vorteil sollte es
bringen, wenn man die jedesmal neu abzählen muß?
> dynamische Speicher alokierung, make-datei und compiler flags(wäre für> dich wohl das sinnvollste) oder was auch immer... gibt genug> möglichkeiten.
Wie sollen diese Dinge denn dabei helfen, die Anzahl der Elemente eines
statisch im Quellcode definierten Arrays zu ermitteln? Und wie soll man
im Programmspeicher ein Array dynamisch allokieren?
> Bla schrieb:>> Ich habe ein Array, das wirklich seeehr groß ist> Was "groß" ist und was nicht, ist sache der ansicht. Die berühmten> "20cm" eben. Wäre geil wenn du mal sagst was das für ein Array ist...> Wenn da ein String drin steht ist es egal, dann kannst du einfach:const> char mySting[] = "Mal gucken wie lang das Ding wird.";> Da wird die Größe dann automatisch ermittelt. Bei allem anderen sieht es> schlecht aus.
Und warum ist es bei Strings auf einmal nicht mehr - wie du sagst -
seine
"Aufgabe als Programmiere Speicher anzufordern"?
> Es gibt mit sicherheit Sprachen wo das geht, aber C/C++ gehört nicht> dazu, und ist für sowas auch gar nicht gedacht. Das ist nämlich das> schöne an C/C++: DU hast die Kontroller über das, was passiert.
Es gibt keine Sprache, die "C/C++" heißt.