- 12V Akku mit 280 Ah bauen    Werbung      
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 52

Thema: Char - Array und Pointer

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    41
    Beiträge
    3.416
    Ausgabe+=myArray[i]+'\n'
    DAS geht so leider nicht, in reinem C gibt es keine dynamischen Strings, du müsstest also entweder hybrid mit ein bisschen C++ und String als Klasse arbeiten oder deine "Ausgabe" als Array bestimmter größe Vorinitialisieren damit genug Platz reserviert ist um alle Zeichen aufnehmen zu können.

    Es gibt Funktionen wie strncat und co. aber ein simples Ausgabe+=irgendwas+"noch was statisches"; dürfte dir dein compiler eigentlich schon um die Ohren hauen.

    http://www.cplusplus.com/reference/cstring/strtok/

    strtok sucht halt nach dem übergebenen token und gibt dir einen Pointer innerhalb des char arrays den du dann mittels memcpy oder strcpy (oder strncpy) in ein anderes array kopieren kannst (gibt aber auch diverse andere string methoden in c)

    Aber
    Das kann ich aber nur, wenn ich eben genau weiß, welche Funktion was genau zurückgibt und erwartet.
    Das ist die Kunsst zu googeln oder man holt sich ein gutes Buch mit inhaltsverzeichnis wenn man offline arbeiten will. Ich kann dir auch nciht aus dem FF sagen welche Funktion wie zu bedienen ist und Methoden die ich vor 3 Jahren verwendet habe muss ich auch heute immer noch nachschlagen weil man sich nciht alles merken kann. Es ist aber immer gut in Bild im Kopf zu haben wie der Speicher verawltet wird statt sich nur auf die Verwendung der EMthoden zu konzentrieren!

    Ich schreib hier mal nur meine persönliche Sichtweise auf nach der ich arbeite bzw. wie ich es mir vorstelle wenn ich von einem single Thread Prozess ausgehe oder wie es halt im µController tickt, solange ich keine Interrupts einsetze!

    JEDER Variable die ich anlege, wird beim compilieren vom Linker im RAM eine feste Position vorgegeben (Optimierung lasse ich mal außen vor).
    Diese Variablen haben dann eine feste Größe und im Fall von Arrays sind das dann halt N viele Variablen hintereinander.

    Wenn ich dynamisch arbeiten will muss sich jemand (im Fall von C ich selbst) darum kümmern diesen Platz zu reservieren und auch wieder freizugeben!

    Wenn ich aber nciht mit malloc, calloc und free arbeiten möchte (ist halt absolut pain in the butt) muss ich halt entsprechend große Puffer Arrays vorhalten in denen ich dann arbeite und mir meine Ergebnisse dann irgendwo hin kopieren.

    Wenn Interrupts oder Multithreading dazu kommen wirds nochmal spannender, dann musst du sicherstellen dass eine Schleife die in einem Arrray etwas macht nicht z.B. durch einen Interrupt unterbrochen wird, in welchem neue DAten ins Array geschrieben werden.

    Wenn ich jetzt mal Java als Referenz nehme, wenn ich eine Liste von Bytes habe (als Ersatz für das char Array) und über diese mit einem Iterator (intelligenter Pointer der sich selbst weiterschieben kann) zugreife, dann aber ein anderer Prozess diese Liste manipuliert, schmiert mir der nächste Zugriff auf den Iterator mit der "Concurrent Modification" Exception ab, also Konkurrierender Zugriffsfehler.

    In Java kann man dann das Modell der Liste ändern und eine Threadsafe Implementation nehmen ... im Einfachsten Fall wird eine Kopie deiner Liste erzeugt, über die der Iterator läuft, während die eigentlichen Daten verändert werden können. du kannst dann nur nicht erwarten, dass der Iterator sich ebenfalls verändert.

    in C++ nimmt man die String Klasse, weil diese bereits dynamischen Speicher einsetzt (Aber immernoch das Problem mit "new" und "delete" hat statt malloc und free)

    Oder man kann die auto:: pointer (das leerzeichen ist nur weil er sonst einen smiley draus macht) library benutzen (bim Namen bin ich mir nicht sicher) weil dir dort viel Arbeit abgenommen wird.

    Strings in C sind gruselig finde ich persönlich.
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  2. #2
    HaWe
    Gast
    ....wobei hinzukommt, dass (groß geschrieben)
    String
    eine spezielle Arduino-Klasse ist, die C++ "benutzt",

    hingegen (klein geschrieben)
    string
    eine allgemeine C++ std Klasse ist, genau: std::string

    Vergeicht man String mit string, fallen einem manche Gemeinsamkeiten, aber auch erhebliche Unterschiede auf, und std::string ist deutlich mächtiger als String und braucht deutlich mehr Speicher.


    zur Unterscheidung sollte man die ISO C char arrays
    char * mystrp;
    char mystra[100]:
    als cstrings bezeichnen, um Verwechslungen zu vermeiden

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690
    Ja, danke für den Link, HaWe!!

    Dann werde ich dort mal öfter reinschauen.

    Allerdings, was strtok() tut, habe ich dann rel. schnell - auch wegen der Fehlermeldungen - herausgefunden. Jetzt, wo ich es nachlesen kann, deckt sich das mit meiner Vorstellung über strtok().

    @Ceos
    Das mit google ist so eine Sache. Dort finde ich schon längere Zeit nichts wirklich Brauchbares. Mit Pech ist unter den ersten Links Werbung (dh. die sind wenig oder gar nicht relevant) und unter den anderen Ergebnissen werden die auch nicht nach meiner Suche richtig gewichtet, jedenfalls nicht so, wie ich das erwarten würde. Wenn ich zum Beispiel "(String)" eingeben (auch gerne in Gänsefüßchen eingefasst), erhalte ich eben nicht überwiegend Erklärungen zu "String" oder "(String)" oder String und Compilern wie C/C++, sondern vornehmlich irgendeinen Unfug, der daraus entsteht, dass man in meiner Suche nach Wörtern sucht, mittels derer sich Geld verdienen lässt, was dazu führt, dass ich Kaufangebote über Strings bekomme. Probier es mal aus! Es ist grausam geworden mit google, finde ich!






    MfG

  4. #4
    HaWe
    Gast
    das mit anklicken von strtok war ntl nur ein Beispiel, das tolle an cplusplus.com sind die code-Beispiele zu allen einzelnen Funktionen und die Übersicht über ähnliche, zusätzliche und weiterführende Funktionen.

    google macht es doppelt schwierig, weil es auch nicht Groß/Kleinschreibung unterscheidet, und String ist eben etwas anderes als string.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690
    Interessant: Arduino-IDE kennt printf()

    Ich frage mich nur, wo geht die Ausgabe dann hin? Geht die nicht normal auf einen Standardstream oder verwechsel ich da was.
    Wenn der nämlich printf kennt, könnte ich auch viele Beispiele aus meinem C-Buch verwenden/nachvollziehen.



    MfG

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    41
    Beiträge
    3.416
    ....wobei hinzukommt, dass (groß geschrieben)
    String
    eine spezielle Arduino-Klasse ist, die C++ "benutzt",

    hingegen (klein geschrieben)
    string
    eine allgemeine C++ std Klasse ist, genau: std::string
    Danke für den Hinweis, ist mir irgendwie garnicht aufgefallen, weil ich strings gerne meide :P
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  7. #7
    HaWe
    Gast
    printf verschwindet bei Arduino-AVR (und vermutlich auch bei ARM Cortex) Boards im Nirwana, denn dort existiert auch kein stdout.
    esp hat da sicher andere Einstellungen, denn hier gibt es auch ein stdio.h (edit: dennoch fraglich, ob auch vollständig wie bei Posix) und hier wird stdout in die Serial Konsole umgeleitet (IIRC).
    Man kann allerdings sprintf() mit Serial.print verwenden (akzeptiert String und cstring), muss aber bei der sprintf-Float-Formatierung ("%f") bei AVR boards aufpassen ("%f" funktioniert aber bei ARM Cortex und bei esp)

    std::string gibt es auch nicht bei Arduino, außer ggf. bei esp (freeRTOS <string> IIRC).
    aber man benutzt ja meist als Arduino-User das abgespeckte/veränderte String.
    Wenn du, Moppi, allerdings von Arduino IDE/API weg willst, gibt es ntl auch kein String mehr.
    Geändert von HaWe (28.10.2019 um 13:02 Uhr)

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    41
    Beiträge
    3.416
    gibts dann auch kein
    http://www.cplusplus.com/reference/memory/auto_ptr/

    in arduino?! halte ich jetzt schon für etwas krass, hätte geadcht das arduino eigentlich die volle c++ unterstützung mitbringt O_o

    PS: scheint als ob auto_ptr teil von std geworden ist ... wie die zeiten sich ändern
    PPS: in c11 sogar deprecated da heißt es http://www.cplusplus.com/reference/memory/unique_ptr/

    ich habe gerade gänsehaut dass mich das zeug bald einholen wird Q_Q
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  9. #9
    HaWe
    Gast
    nein, Arduino bringt nirgends die komplette C++14 std lib oder C99 mit Posix-Definitionen mit, wegen dem micktigen RAM bei AVRs. Bei ARM Cortex wird es sukzessive besser.
    esp aber hat Erweiterungen, z.B. auch pthread und std::thread.

    schreib doch mal ein kleines Programm mit auto_ptr, ich teste es mal.

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    41
    Beiträge
    3.416
    weist du wie lang es her ist dass ich c++ syntax in meinem gedächtnis gegen python eingetauscht habe? XD ich bekomm ja nichtmal mehr ein schulbeispiel zusammen ohne googeln :P
    ich wünschte ich könnte mich noch an die korrekte syntax erinnern eine klasse zu definieren in c++

    ich preogrammiere auch mittlerweilen fast ausschließtlich in reinem C auf µControllern, weil alles andere am RAM scheitert (malloc calloc und co. sind auch tabu)
    oder micropython wenns ein ARM >512k flash ist, weils einfach so urig einfach und bequem ist
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Pointer auf Struct von Byte-Array
    Von Bumbum im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 31.05.2013, 17:01
  2. Char mit array verbinden ?
    Von AsuroPhilip im Forum Software, Algorithmen und KI
    Antworten: 22
    Letzter Beitrag: 08.09.2011, 14:37
  3. gelöst : Frage zu C und 2 Dim char Array
    Von jar im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 29.05.2007, 17:53
  4. zweidemensionales char-array
    Von p_mork im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 15.03.2007, 17:54
  5. Cstring einem char array zuweisen
    Von ceekay im Forum Software, Algorithmen und KI
    Antworten: 8
    Letzter Beitrag: 17.04.2006, 11:20

Berechtigungen

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

    Werbung      Solar Speicher und Akkus Tests