- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 32

Thema: C: Fragen zu memset, memcpy, malloc

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Vorsicht bei dem Namen "delete" für ein Makro.

    Da HaWe und andere hier meist einen C++ Compiler benutzen um darin C zu machen. Das klein geschriebene delete ist ein reserviertes Wort in C++. Daher gibt es die Konvention Makros möglichst immer GROSS zu schreiben.

    malloc und free sind in C++ eigentlich nur zur Rückwärtskompatibilität mit C vorhanden. Wenn man free auf einem Zeiger ausführt, der auf mit new angeforderten Speicher zeigt, oder andersrum aus Versehen delete auf mit malloc angeforderten Speicher aufruft, dann kann das Programm ganz plötzlich zuende sein.

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Das ist wohl richtig. Für c++ würde ich Makros auch nicht empfehlen.
    Hier mal ein Auszug aus dem Arduino-Kern. Implementation von new und delete [new.cpp]:
    Code:
    #include <stdlib.h>
    
    void *operator new(size_t size) {
      return malloc(size);
    }
    
    void *operator new[](size_t size) {
      return malloc(size);
    }
    
    void operator delete(void * ptr) {
      free(ptr);
    }
    
    void operator delete[](void * ptr) {
      free(ptr);
    }

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Das sind spezielle Überladungen, die kommen bei normalem Anfordern von Speicher nicht zum Einsatz. Es handelt sich um sowas hier:
    https://en.wikipedia.org/wiki/Placement_syntax

    Man kann in C++ ja sowas machen
    Code:
        #include <new>        // Must #include this to use "placement new"
        #include "Fred.h"     // Declaration of class Fred
        void someCode()
        {
          char memory[sizeof(Fred)];     // Line #1
          void* place = memory;          // Line #2
          Fred* f = new(place) Fred();   // Line #3 (see "DANGER" below)
          // The pointers f and place will be equal
          // ...
        }
    das ist eine andere Baustelle.


    Im übrigen ist es meist so, dass new und delete auf malloc und free zurückgreifen, oder auf die Betriebssystemfunktionen die diesese beiden verwenden.

    Aber new und delete rufen auch Konstruktor und Destruktor der angelegten Objekte auf. Ein malloc würde nur Speicher anfordern, das Objekt darin aber nicht initialisieren. Ein free auf etwas mit new angefordertem würde einem Objekt den Speicher klauen, läuft doch später noch der Destruktor knallt es, usw.
    Geändert von Mxt (29.06.2016 um 08:24 Uhr)

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Interessant, schaue ich mir demnächst mal genauer an...

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Wichtig für dich ist nur, dass du dann auch wirklich C machst. Also einen C-Compiler verwenden und mit *.c Codedateien arbeiten.

    C++ ist (und war immer) nur eine Schnittmenge zu C, es ist kein größeres C. Es gibt Sachen, die sind in C und C++ anders.

  6. #6
    HaWe
    Gast
    das geht leider nicht:
    in Arduino habe ich gar keinen Einfluss drauf (ist immer gpp) und auf den Raspi portiert auch nicht immer (wenn Fremd-Libs C++ verwenden, muss ich auch g++ verwenden, ansonsten nutze ich GCC beim Pi ntl wo immer es geht.

    Meinen eigenen Code schreibe ich immer nur in ANSI C Syntax, das ist einfach clean + straight sozusagen.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    HaWe, das Du nur C++ in der Arduino IDE benutzen kannst ist nur bedingt richtig.
    Der Sketch wird durch den eigenen Präprozessor gejagt und dann das CPP-File durch den (kastrierten) g++.
    Wenn Du aber eine "*.c"-Datei dem Projekt hinzufügst, dann wird diese mit dem GCC und nicht dem g++ kompiliert. Bei *.cc *.cpp vice versa.
    Dementsprechend müssen dann die Header "extern "C" { ... }" oder auch nicht enthalten, sonst produziert der Linker freudig Fehlermeldungen.

    Gruß

Ähnliche Themen

  1. Problem mit arrays in memset
    Von HaWe im Forum Arduino -Plattform
    Antworten: 0
    Letzter Beitrag: 05.06.2016, 11:39
  2. Tauchroboter (Fragen über Fragen)
    Von Michi Unfried im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 12
    Letzter Beitrag: 20.02.2014, 21: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, 18:25
  4. miniparser + malloc + speicherproblem?
    Von PCMan im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 09.01.2009, 14:03
  5. Fragen über Fragen - Schrittmotor
    Von Karierteshorts im Forum Motoren
    Antworten: 4
    Letzter Beitrag: 23.03.2005, 08:54

Berechtigungen

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

12V Akku bauen