Array gleichzeitig initialisieren und an Funktion übergeben
lima-city → Forum → Programmiersprachen → C/C++ und D
array
assembler
aussehen
bit
code
compiler
dank
datei
datum
frage
hardware
kommentar
option
programm
richtigen compiler
schneller code
segment
speichern
url
version
-
Hi,
ich frage mich, ob man ein Array in C an eine Funktion übergeben kann, wobei das Array erst beim Funktionsaufruf initialisiert wird.
Würde ungefähr so aussehen (funktioniert jedoch nicht):
Ich vermute mal man müsste noch irgendeine Typinformation beim Aufruf angeben, weiß aber nicht wie ich das bewerkstelligen soll.// definition of function void myfunc (int arr[], int len); // call myfunc: myfunc ({1,2,3}, 3);
Oder muss man über den Weg einer vorausgehenden Initialisierung gehen:
// call myfunc: int arr[3] = {1,2,3}; myfunc(arr, 3);
PS: Ich verwende den GNU AVR GCC Compiler. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Du musst, wie du schon richtig festgestellt hast, das Array noch casten.
myfunc((int[]) {1, 2, 3});
-
euphoria schrieb:
Ja, stimmt. Funktioniert. Danke sehr. Manchmal sieht man den Wald vor lauter Bäume nicht
Du musst, wie du schon richtig festgestellt hast, das Array noch casten.
myfunc((int[]) {1, 2, 3});
Davon mal abgesehen: wie sieht es mit der Speicherverwaltung aus?
Bei der "Initialisierung direkt in dem Funktionsaufruf" ist das Array ja irgendwie "konstant". Wo werden solche Konstanten denn normalerweise gesichert? Im Codesegment?
Variablen dagegen müssten in einem Datensegment oder indem Stacksegment gesichert werden (kommt wahrscheinlich auf den Compiler(bzw. -einstellungen) und die Maschine an?).
Beitrag zuletzt geändert: 28.5.2012 20:05:22 von tangoal -
Hallo tangoal,
wo solche Konstanten gespeichert werden ist ganz unterschiedlich. Teilweise landen sie in einem Read-Only-Abschnitt des Datensegmentes Teilweise auch im Code-Segment (häufig bei optimierten Code). Bei 64-Bit Anwendungen ist Code und Datensegment sowieso dasselbe.
Da Du aber für einen AVR-Microcontroller programmierst ist die Frage eher, ob die Daten im Flashspeicher oder im EEPROM abgelegt werden. Segmente wie auf PC-Hardware gibt es dort ja nicht.
Ich tippe da jetzt einfach mal auf den Flash.
Beitrag zuletzt geändert: 28.5.2012 21:20:21 von darkpandemic -
darkpandemic schrieb:
Disassemblier doch den betreffenden Code, dann siehst du wo das abgelegt wird...
Da Du aber für einen AVR-Microcontroller programmierst ist die Frage eher, ob die Daten im Flashspeicher oder im EEPROM abgelegt werden. Segmente wie auf PC-Hardware gibt es dort ja nicht.
Ich tippe da jetzt einfach mal auf den Flash. -
@darkpandemic: stimmt da gibt's ja noch die Optmierung, die ich eingestellt habe. Momentan scheint es so zu sein, dass solche Konstanten in den Program Flash geschrieben werden (wenn ich mir die Bytezahl nach dem builden anschaue).
@hackyourlife: wie disassembliere ich den Code? -
tangoal schrieb:
Du brauchst den code nicht einmal zu disassemblieren, das bekommst du noch schneller...
@hackyourlife: wie disassembliere ich den Code?
Dasgcc -S programm.c
heißt "Compile only", es wird nicht assembliert oder gelinkt. Heraus kommt eine .S-Datei die den Assembler-Code mit Kommentaren enthält. Dort siehst du dann wie der was lädt.-S
-
hackyourlife schrieb:
Huch, bei CodeBlocks scheint das noch einfacher zu sein... da wird eine ".lss"-Datei schon erzeugt mit den richtigen Compiler-Optionen... danke, trotzdem.
Du brauchst den code nicht einmal zu disassemblieren, das bekommst du noch schneller...
Dasgcc -S programm.c
heißt "Compile only", es wird nicht assembliert oder gelinkt. Heraus kommt eine .S-Datei die den Assembler-Code mit Kommentaren enthält. Dort siehst du dann wie der was lädt.-S
-
tangoal schrieb:
Und wo wird das jetzt im Speicher abgelegt? Wir sind schon ganz neugierig...
Huch, bei CodeBlocks scheint das noch einfacher zu sein... da wird eine ".lss"-Datei schon erzeugt mit den richtigen Compiler-Optionen... danke, trotzdem. -
hackyourlife schrieb:
Achso ja:
tangoal schrieb:
Und wo wird das jetzt im Speicher abgelegt? Wir sind schon ganz neugierig...
Huch, bei CodeBlocks scheint das noch einfacher zu sein... da wird eine ".lss"-Datei schon erzeugt mit den richtigen Compiler-Optionen... danke, trotzdem.
Es werden beide Versionen anscheinend einfach im Programm-Flash abgelegt: die einzelnen Array-Werte werden über ein Register in den Speicher geschrieben (ich nehme mal an, das es auf den Stack geschrieben wird) und von dort aus weiterverwendet. Dies ist zumindest für die Optimierung nach Speicherplatzkriterien der Fall. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage