Variablen an Funktionen übergeben scheitert!?



  • Naja, ich meine das eher in der Handhabung und Auswertung von Strings, aber generell finde ich ein "Enter" schon schöner. 🙂
    So extrem computernah sind die auch oft nicht.

    Oh... wo wie .... mal schauen, was ich übersehen habe...
    Ups, wirklich noch nicht gesehen. 😃



  • Ah, ok, so ganz geheuer ist mir dieses Konstrukt nicht:

    for(const char *pos = str; *pos != '\0'; ++pos )
    	    keycode(*pos);
    

    Der zerteilt quasi den String und sortiert jedes Zeichen auf ein Feld(Zeiger?) in Char.
    Das Sternchen ist doch ein Platzhalter für variable Anzahl von Elementen, wenn ich das richtig kapiert habe.
    So langsam wird mir manches klar. 😃 Ich hatte Char als eine Art String wahrgenommen, was so gar nicht hinhaut.

    Nein, die Codierfunktion macht keinen Output. Das war nur im Beispiel so.
    Die liefert mit Return einen int-Code zurück.

    Dank dir. Das hilft mir beim weiterdenken ... 🙂


  • Gesperrt

    @j-foe sagte in Variablen an Funktionen übergeben scheitert!?:

    Ah, ok, so ganz geheuer ist mir dieses Konstrukt nicht:
    for(const char *pos = str; *pos != '\0'; ++pos )
    keycode(*pos);

    Der zerteilt quasi den String und sortiert jedes Zeichen auf ein Feld(Zeiger?) in Char.

    Das Konstrukt ist völlig korrekt, und liest eine Zeichenkette bis zum nächsten newline char.

    Vielleicht solltest du mal C lernen? Obwohl... mich stören solche Rückfragen nicht...

    Edit: Pardon, bis zum Zeichenkettenende.


  • Mod

    @j-foe sagte in Variablen an Funktionen übergeben scheitert!?:

    Das Sternchen ist doch ein Platzhalter für variable Anzahl von Elementen, wenn ich das richtig kapiert habe.

    Nein, nein, überhaupt nicht! Da muss ich leider omggg zustimmen, du musst noch viel über die grundlegende Syntax von C und C++ lernen, sonst wird das nichts mit den Zeichenketten. Und auch grundlegende Konzepte, wie was ein Array ist. Leider kann ich kein php, daher kann ich dir die C-Konzepte nicht mit php-Begriffen erklären.

    So langsam wird mir manches klar. 😃 Ich hatte Char als eine Art String wahrgenommen, was so gar nicht hinhaut.

    Genau, deswegen schrieb ich ja so oft darüber, dass Zeichen und Zeichenfolgen ganz was anderes sind.



  • Dieser Beitrag wurde gelöscht!


  • Ja, da unterscheiden sich PHP und C grundlegend, was es nicht ganz einfach macht. Arrays in PHP, vor allem multidimensionale assoziative Arrays sind eine derart geniale Sache, dass man mathematische/wiss. Probleme und eben auch riesige Datentransformationen mit links hin bekommt. Das kann ich mir in C nicht ansatzweise vorstellen, dass das irgendwie geht. Aber C soll das wahrscheinlich auch überhaupt nicht leisten, sondern hardwarenah sein, was man beim Umstieg doch enorm merkt. Zumindest ist der Syntax sehr ähnlich, was das lesen etwas erleichtert, aber z.B. Variablentypen gibt es zwar in PHP, aber die kann man getrost ignorieren, denn eine Variable kann alles sein (was enorme Vorteile birgt), aber man kann sie natürlich dennoch definieren und transformieren, wenn das Bedeutung haben sollte.
    Danher ist das Umdenken nicht ganz easy... aber so langsam verstehe ich, was in C gemeint ist. 😉

    Ich versuche auch immer zu kurze, kryptische Statements zu vermeiden, was in C aber recht üblich ist (aus verschiedenen Gründen).
    Na ich wollte mich in C nicht zu arg tief rein knien, da ich solch grundlegende Probleme nicht viele habe und auch gesundheitlich muss ich aufpassen, was ich meinem Kopf zumute.

    Im Prinzip ist die Zeile schon ok, aber sie übergeht, dass es eben nicht nur um Zeichen geht, sondern auch um quasi mehr als ein Zeichen, was bei Sondertastenbefehlen in die Quere kommt.
    Ich glaube, ich werde doch wieder auf die Int-Code-Variante gehen, denn selbst mit einzelnen Zeichen motzt mich mein Programm schon an. 😃 Ich werds schon irgendwie schaffen ...



  • Momentan ist das nächste Problem, dass ich die PS2Keyboard.h zwar angepasst habe, aber dennoch die F-Tasten nicht korrekt einfangen kann... 😃
    Das Projekt machts einem echt nicht leicht.



  • @j-foe PHP und C sind verschiedene Generationen von Programmiersprachen.
    C ist von Profis für Profis gemacht worden, die wissen was sie tun.

    Der Arduino war ursprünglich ein 8-Bit Mikrocontroller. Gerade die von dir gelobten assozoativen Arrays brauchen viel dynamischen Speicher, den das kleine Teil nun mal nicht hat.

    Aber der Arduino verstent durchaus C++ und hat eine eigene Klasse für Strings.

    Und wenn du einen 32-Bit-Controller hast, spricht auch nichts gegen den Einsatz von C++ (auch ohne Arduino-Umgebung.)



  • @j-foe sagte in Variablen an Funktionen übergeben scheitert!?:

    Das kann ich mir in C nicht ansatzweise vorstellen, dass das irgendwie geht. Aber C soll das wahrscheinlich auch überhaupt nicht leisten, sondern hardwarenah sein, was man beim Umstieg doch enorm merkt.

    C hat halt wenig syntaktischen Zucker und viele Dinge müssen von Hand gemacht werden. Es erfordert eine Menge Diszplin um in C sauber zu programmieren.

    BTW: Vor einiger Zeit wollte ein Kollege man eine1E6 x 1E6 Matrix in Dreiecksform in C invertieren. Ich habe ihm die GSL Lib empfohlen. Nur mal damit du eine Vorstellung von wissentschaftlicher Arbeit unter C bekommst. :->

    BTW: Ich mag kein C++ auf kleinen Embedded Controller, weil man nicht weiß wieviel C++ da funktioniert. 2 KB SRAM auf einem ATmega328 ist halt nicht viel.



  • Ja, sag ich ja, die Sprachen sind in allem wirklich sehr unterschiedlich. Das merke ich deutlich. 😉

    Die Tastatur bekomme ich nun auch in den Griff.
    Ich hatte bei der Lib etwas ins Klo gegriffen und mich von der Bescheidenheit dessen ablenken lassen, der die bessere Lib geschrieben hat. 😃



  • @DirkB sagte in Variablen an Funktionen übergeben scheitert!?:

    C ist von Profis für Profis gemacht worden, die wissen was sie tun.

    Sorry, aber bei mir sträuben sich da die Nackenhaare. Denn egal welche Programmiersprache benutzt wird, es gibt immer wieder weniger qualifizierte Nutzer und dann kommen Stilblüten der folgenden Form zu Tage:

    #include "sdk_common.h"						// Besteht aus mehreren tausend #define Anweisungen, welche pro Projekt konfiguriert werden müssen.
    #if NRF_MODULE_ENABLED(APP_FIFO)			// ???
    #include "app_fifo.h"
    
    #define FIFO_LENGTH() fifo_length(p_fifo)  	// Makros werden sehr oft benutzt
    
    DFU_TRANSPORT_REGISTER(nrf_dfu_transport_t const ble_dfu_transport) =
    {
        .init_func  = ble_dfu_transport_init,
        .close_func = ble_dfu_transport_close,
    };
    
    NRF_BALLOC_DEF(m_buffer_pool, MAX_DFU_PKT_LEN, MAX_DFU_BUFFERS);	// malloc? 
    
    __WEAK void assert_nrf_callback(uint16_t line_num, const uint8_t * file_name)  // _WEAK muss man auch erst mal kennen
    {
    }
    
    NRF_FSTORAGE_DEF(nrf_fstorage_t fstorage) =		// Scheint eine Art von IPC Variable zu sein, welche recht anfällig für falsch konfigurierte #defines ist
    {
        .evt_handler = fstorage_evt_handler,
        .start_addr = 0x3e000,
        .end_addr   = 0x3ffff,
    };
    
    #endif
    

    Und das ist nur ein best off 5 minutes.

    Und da wünsche ich mir halt mehr syntaktischen Zucker in C. Vor allen Dingen wenn man Elemente aus höheren Programmiersprachen benötigt. Denn ehrlich gesagt möchte ich keine C Laien Implementierung mehr von std::vector oder std::list sehen, kein goto CleanUpRessources, keine mangelnde Typsicherheit,...


  • Mod

    Beschuldige nicht den Erfinder des Hammers für die Taten von Sonntagshandwerkern.

    "von Profis für Profis" ist schon historisch richtig, aber der erste Compiler musste ja auch auf einem 1970er Computer laufen (wo so etwas wie "der kann ASCII" bahnbrechend war). Da kannst du die Sprache nicht mit tonnenweise Syntaxzucker vollladen. Gewissermaßen war C zu der Zeit tonnenweise Syntaxzucker auf Assembler.



  • Man hätte für die Arduinos was anderes finden sollen. Es gibt zwar Python auch nun dafür, aber ich mag die Sprache nicht.
    Naja, muss man irgendwie durch, wenn man die Teile nutzbar machen will.

    Anfangs ging nun auch die neue Lib für PS2 gut, aber jetzt erkennt der kein SHIFT und Großbuchstaben sind damit tabu... achje... wie kann das denn passieren!? 😃
    Bei der anderen Lib gehen die Funktionstasten nicht, auch wenn man die Lib mit Werten bestückt, was schon auch kurrios ist...

    Hat jemand Erfahrungen mit einer Lib für PS2 Tastaturen?


  • Gesperrt

    Was war eigentlich noch mal die Frage gewesen? Wie man eine (utf8) Zeichenkette in PHP und C splittet?



  • @j-foe Naja, Arduino kommt halt aus der Microcontroller Welt. Da ist/war c erstmal das Mittel der Wahl, da für Abstraktionen häufig die Ressourcen fehlen. Arduino hat einen C++ Compiler, und wenn man C++ kann, bekommt man einiges an Abstraktionen, wewlche zur Compiletime soweit zerfallen, dass man es in der Anwendung nicht mehr merkt.

    Die einfache Variante wäre, die String Klasse aus der Arduino Biblitothek für Strings zu verwenden. Jetzt allokiert die Speicher auf dem Heap. Speicher auf dem Heap hat man in der Microcontroller Welt nur begrenzt zur Verfügung, im Gegensatz z.B. zu PC Anwendungen. Daher ist man damit eher zurück haltent.

    Vlt gibt es irgendwo auf Gihub auch Code, der C-Artige Zeichenketten als Klasse kapselt, so das man von außen das einfach benutzen kann. Würde sich vlt mal lohnen nach zu suchen.

    Aber, dein eigentliches Problem war die Verwirrung zwischen Zeichenkette char* die man mit "" umschließt und einzelnen Zeichen char die man mit ''umschließt, richtig?

    Wenn du lieber mehr highlevel Programmiersprachen mit mehr Abstraktionsmöglichkeiten verwenden willst, ist vlt der Arduino nicht das richtige Mittel und du könntest drüber nachdenken, auf nen Raspi umzusteigen.



  • @omggg In PHP Kinderkram ... in C++ eine fiese Aufgabe. 😃



  • @Schlangenmensch Ja, genau, die Zuweisung war das Hauptproblem, da diese in anderen Programmiersprachen so nicht unterschieden werden (trotz dem sie sich aber zum unterscheiden eignen und so genutzt werden, aber nur um sich gegeneinander abzugrenzen.).
    Das hilft mir hier schonmal weiter.
    Momentan aber habe ich das nächste Problem vor mir... urgs! Die Lib für die Tastatur scheint nicht ok zu sein, aber fixen kann ich das natürllich nicht... ich habs versucht, aber kam noch mehr Quark raus... klaro! 😃
    Ich mache da vllt. mal einen neuen Fred auf dazu. Vielleicht kann da ja jemand helfen? Das wäre spitze!



  • @j-foe sagte in Variablen an Funktionen übergeben scheitert!?:

    In PHP Kinderkram ... in C++ eine fiese Aufgabe

    Nein, in "normalem Computer-C++" auch Kinderkram.

    Du hast z.B. auch oben von "assoc arrays" geschrieben. Die gibt es in C++ natürlich auch, das nennt sich allerdings std::map bzw. std::unordered_map (siehe https://en.cppreference.com/w/cpp/container/map). Und für Strings würdest du normalerweise std::string nutzen (und nicht char *). Diese Klassen sind Teil der Standardbibliothek. Auf einem normalen PC ist die Bibliothek natürlich verfügbar und es wäre überhaupt kein Problem, sowas in C++ zu schreiben.

    Das Problem ist nun, dass du auf dem Arduino die Bibliothek nicht zur Verfügung hast. Stell es dir vor wie php, wo die normalerweise verfügbaren Funktionen einfach fehlen. Siehe auch https://stackoverflow.com/questions/37575303/is-the-c-standard-library-fully-supported-on-arduino - es ist also nicht so sehr ein C++-Problem, sondern eher dem Arduino geschuldet.



  • @wob Ja, die std::map hatte ich auch schon im Auge, aber das sah mir immer nur aus wie eine Tabelle, nicht wie ein multidimensionales Array. Da hatte ich das dann gelassen und Arrays brauchen viel Speicher, das hatte ich zu Beginn auch dann gleich gemerkt. 😃

    Jo, am Arduino ist einiges nicht verfügbar. Aber wahrscheinlich eben, wegen des kleinen Variablenspeichers.
    ESP32 ist glaub etwas großzügiger, aber da läuft nicht alles, was ich brauche, leider. Da habe ich Probleme, den Output für den KC auf einem Pin zu generieren, aber ich hatte das auch noch nicht arg ausgetestet... es lief zumindest nicht auf Anhieb. Die Pins für entsprechenden Output sind auch andere, da muss ich mal schauen. Derzeit reicht der Arduino aber noch.

    Wird schon werden, ist ja nur Hobby... 😉


  • Mod

    Du redest wirres Zeug. Ein assoziatives Array ist ja gerade kein multidimensionales Array, sondern so etwas wie eine Tabelle. Eben wie std::map. Und "normale" Arrays sind die speichersparendste Form, Information zu speichern. Daher ist das ja auch bevorzugt für den Mikrocontroller, anstatt dort den Speicher für den Aufbau von Assoziationen zu verschwenden, die man gar nicht braucht.

    Das soll kein Angriff sein, aber du musst wirklich zwei Sachen lernen:

    • Wie diverse Standarddatenstrukturen wirklich im inneren auf der Hardware funktionieren
    • Dir fehlt tatsächlich ein bisschen das logische Verständnis, z.B. wie schon oben beschrieben, dass eine Tüte Gummibärchen was anderes ist als die Gummibärchen darin

    Du bist ein bisschen zu verwöhnt von vermeintlichen Anfängersprachen, die dir die Notwendigkeit um dieses Wissen abgenommen haben (auf Kosten von Effizienz). Aber bei einem Mikrokontroller ist Effizienz alles, und du musst diese Konzepte verstehen.


Anmelden zum Antworten