Forum: Compiler & IDEs Autodetect Arraygröße bei Definition


von Bla (Gast)


Lesenswert?

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):
1
static const tBla Bla[860] PROGMEM = {
2
...
3
}

von Timmo H. (masterfx)


Lesenswert?

static const tBla Bla[] PROGMEM = "Blubb bla trallalla";

von Jasch (Gast)


Lesenswert?

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...

von Kaj (Gast)


Lesenswert?

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
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.

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

von Tom K. (ez81)


Lesenswert?

gcc frisst auch ein Array, das kein String ist:
1
#include <stdio.h>
2
int main(void)
3
{
4
    const int foo[] = {123, 456, 789};
5
    int le = sizeof foo / sizeof foo[0];
6
    for (int i = 0; i < le; ++i)
7
        printf("%d\n", foo[i]);
8
    return 0;
9
}

von Sven P. (Gast)


Lesenswert?

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.

von Tom K. (ez81)


Lesenswert?

>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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.