-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 33

Thema: C: Fragen zu memset, memcpy, malloc

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.431

    C: Fragen zu memset, memcpy, malloc

    Anzeige

    hallo,
    es ist kein spezielles Arduino Thema, sondern generell zu C, aber nachdem es kein C Unterforum gibt, denke ich, hier passt es am besten hin...


    ich habe ein paar praktische und ein paar grundsätzliche Fragen zu den C Funktionen memset, memcpy und malloc.

    Fangen wir mit dem letzten an:

    ich übergebe eine Integer Variable an eine Funktion

    foo(int arrlen) {...}

    und möchte nun, dass daraus die Funktion temporär einen int16_t Array von genau dieser Länge einrichtet, es soll etwas ähnliches herauskommen (und benutzt werden können) wie
    int16_t array[arrlen];
    - aber eben mit variabler arrlen, je nachdem, was eben an Parametern an foo() rübergeschoben wird.

    Meine Idee war, dafür malloc() zu benutzen.
    Ich weiß nun nicht, ob es klug ist, meine (wschl falsche) Idee hier hinzuschreiben, um niemand auf die falsche Fährte zu leiten, daher lass ich es lieber
    - denn meine Idee funktioniert nicht aus irgendwelchen Gründen
    (was aber durchaus auch mit den nachfolgenden Array-Operationen zu tun haben kann).

    Könnte jemand evt mal seine Idee kurz posten? Dann könnte ich es mal mit meinem Ansatz vergleichen.

    Danke im vorraus!
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    599
    Hallo,

    ich bin nicht so der C-Experte, aber ich denke in neurem C (ISO-Standard C99 oder C11 ?) ist sowas erlaubt
    Code:
    void f(int n)
    {
        int16_t a[n];
    
        // Beispiel ...
        a[0] = 42;
    }
    das ist dann ein VLA (Variable Length Array).

    Ein Problem in der Arduino IDE dürfte sein, dass das eigentlich C++ (nach 2003 Standard) ist. In C++ gibt es keine VLA.

    Ab dem 2011er Standard würde in C++ aber gehen
    Code:
    void f(int n)
    {
        std::array<int16_t, n> a;
    
        // Beispiel ...
        a[0] = 42;
    }

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.431
    danke, das ist ja jetzt ein ganze anderer Ansatz, sehr schön!
    das mit C++ ist nicht meine Welt, das andere aber eine gute Idee - werde ich heute abend testen!

    Dann zeig ich jetzt mal meine Karten...

    int16_t * buf;
    buf = (int16_t *) malloc(arrlen);

    was ist davon zu halten?
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    599
    Nun, es ist der Anfang vieler Speicherlöcher.


    So fängt es an
    Code:
    void Schlump()
    {
        //...
    
        ding = malloc(irgendwas);
    
        // ...
    
    
        // Hoffentlich
        free(ding);
    }
    und nach der nächsten Überarbeitung sieht es dann so aus:
    Code:
    void Schlump()
    {
        //...
    
        ding = malloc(irgendwas);
    
        if (irgendwas())
        {
             // ...
          
            return;                 // Huch, ham wa da nich was vergessen
        }
    
    
        // ...
    
    
        // Hoffentlich
        free(ding);
    }

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.431
    jap, das mit free ist klar

    aber wenn man's nicht vergisst...?

    die Anschluss-Frage wäre auch:

    int16_t * buf;

    buf = (int16_t *) malloc(arrlen);
    oder:
    buf = (int16_t *) malloc(arrlen*sizeof(int16_t) );

    ...
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    599
    Zitat Zitat von HaWe Beitrag anzeigen
    jap, das mit free ist klar
    aber wenn man's nicht vergisst...?
    Spätestens wenn mehrere an einem Programm arbeiten, wird es irgendwann wer vergessen.

    Deshalb sieht es in modernem C++ jetzt so aus, statt
    Code:
    void f()
    {
        int* pi = new int;
    
         // ...
    
        delete pi;
    }
    nur noch
    Code:
    void f()
    {
         auto pi = std::make_unique<int>();
    
         // ...
    }
    gelöscht wird automatisch, wenn irgendwo (auch durch eine exception) die Klammern verlassen werden.


    Die Zusatzfrage überlasse ich dann mal den sicher bald erscheinenden C-Experten.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.431
    C++ ist für mich definitiv keine Option, ich hasse Objekte wie der Teufel das Weihwasser...

    a-Bär:

    wenn eins hiervon richtig ist, wäre das schon mal gut zu wissen
    (ich tippe aufs zweite...)


    buf = (int16_t *) malloc(arrlen);
    oder:
    buf = (int16_t *) malloc(arrlen*sizeof(int16_t) );
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    599
    Zitat Zitat von HaWe Beitrag anzeigen
    (ich tippe aufs zweite...)
    Würde ich auch vermuten, aber wie gesagt ich bin kein C-Experte.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    Hallo HaWe,

    wie Du getippt hast:
    Code:
    size_t len = 8;
    
    int16_t *ptr = (int16_t*)malloc(arrlen * sizeof(int16_t));
    
    /* Oder wenn's mit 0 initialisiert sein soll: *)
    ptr = (int16_t*)calloc(arrlen, sizeof(int16_t));
    ist die richtige Antwort.

    Allerdings ist es dann üblich mittels Pointer Arithemetik und nicht mit dem Array-Operator auf das Feld zuzugreifen also drittes Element im Feld;
    Code:
    *(ptr + 2) = 32 * 27 + *(ptr + 1);
    ist aber Geschmackssache.

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.431
    ok, super, danke - hatte ich beide getestet, Fehler besteht fort, dann liegt es nicht an malloc.

    calloc kannte ich noch gar nicht, und es beantwortet eigtl sogar schon die nächste Frage, trotzdem, der Vollständigkeit halber:

    wenn ich mit
    buf = (int16_t *) malloc(arrlen*sizeof(int16_t) );
    den array angelegt habe, wie kann ich ihn manuell (nachträglich) mit Null initialisieren?

    Jetzt geht es also um memset...
    ist das hier korrekt:
    memset(buf, 0, sizeof(buf) );
    ...
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

Seite 1 von 4 123 ... LetzteLetzte

Ähnliche Themen

  1. Problem mit arrays in memset
    Von HaWe im Forum Arduino -Plattform
    Antworten: 0
    Letzter Beitrag: 05.06.2016, 12:39
  2. Tauchroboter (Fragen über Fragen)
    Von Michi Unfried im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 12
    Letzter Beitrag: 20.02.2014, 22:03
  3. Rasenmähroboter fragen zur lenkung und mehr fragen :-)
    Von andiwalter im Forum Staubsaugerroboter / Reinigungs- und Rasenmähroboter
    Antworten: 11
    Letzter Beitrag: 11.05.2009, 19:25
  4. miniparser + malloc + speicherproblem?
    Von PCMan im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 09.01.2009, 15:03
  5. Fragen über Fragen - Schrittmotor
    Von Karierteshorts im Forum Motoren
    Antworten: 4
    Letzter Beitrag: 23.03.2005, 09:54

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •