kostenloser Webspace werbefrei: lima-city


Array gleichzeitig initialisieren und an Funktion übergeben

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    tangoal

    Kostenloser Webspace von tangoal

    tangoal hat kostenlosen Webspace.

    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):
    // definition of function
    void myfunc (int arr[], int len);
    
    // call myfunc:
    myfunc ({1,2,3}, 3);
    Ich vermute mal man müsste noch irgendeine Typinformation beim Aufruf angeben, weiß aber nicht wie ich das bewerkstelligen soll.

    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.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Du musst, wie du schon richtig festgestellt hast, das Array noch casten.
    myfunc((int[]) {1, 2, 3});
  4. Autor dieses Themas

    tangoal

    Kostenloser Webspace von tangoal

    tangoal hat kostenlosen Webspace.

    euphoria schrieb:
    Du musst, wie du schon richtig festgestellt hast, das Array noch casten.
    myfunc((int[]) {1, 2, 3});
    Ja, stimmt. Funktioniert. Danke sehr. Manchmal sieht man den Wald vor lauter Bäume nicht :biggrin:

    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
  5. 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
  6. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    darkpandemic schrieb:
    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.
    Disassemblier doch den betreffenden Code, dann siehst du wo das abgelegt wird...
  7. Autor dieses Themas

    tangoal

    Kostenloser Webspace von tangoal

    tangoal hat kostenlosen Webspace.

    @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?
  8. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    tangoal schrieb:
    @hackyourlife: wie disassembliere ich den Code?
    Du brauchst den code nicht einmal zu disassemblieren, das bekommst du noch schneller...
    gcc -S programm.c
    Das
    -S
    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.
  9. Autor dieses Themas

    tangoal

    Kostenloser Webspace von tangoal

    tangoal hat kostenlosen Webspace.

    hackyourlife schrieb:
    Du brauchst den code nicht einmal zu disassemblieren, das bekommst du noch schneller...
    gcc -S programm.c
    Das
    -S
    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.
    Huch, bei CodeBlocks scheint das noch einfacher zu sein... da wird eine ".lss"-Datei schon erzeugt mit den richtigen Compiler-Optionen... danke, trotzdem.
  10. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    tangoal schrieb:
    Huch, bei CodeBlocks scheint das noch einfacher zu sein... da wird eine ".lss"-Datei schon erzeugt mit den richtigen Compiler-Optionen... danke, trotzdem.
    Und wo wird das jetzt im Speicher abgelegt? Wir sind schon ganz neugierig...
  11. Autor dieses Themas

    tangoal

    Kostenloser Webspace von tangoal

    tangoal hat kostenlosen Webspace.

    hackyourlife schrieb:
    tangoal schrieb:
    Huch, bei CodeBlocks scheint das noch einfacher zu sein... da wird eine ".lss"-Datei schon erzeugt mit den richtigen Compiler-Optionen... danke, trotzdem.
    Und wo wird das jetzt im Speicher abgelegt? Wir sind schon ganz neugierig...
    Achso ja:
    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.
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!