- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Uhren-Testprogramm funktioniert nicht

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    Zitat Zitat von fredyxx Beitrag anzeigen
    Danke für die Antwort, aber damit erhalte ich die Fehlermeldung:
    no match for 'operator=' (operand types are 'String' and 'void')

    Nun dämmert es bei mir, dass ich das Problem schon mal hatte. Finde aber die Stelle noch nicht wo und wie ich das gelöst hatte.

    vG

    fredyxx
    Die Arduino-C++-Klasse String (groß geschrieben) ist das größte Übel seit wir von den Bäumen herunter gekommen sind, wahrscheinlich sogar, seit wir die Ozeane verlassen haben.
    Es hat nichts, aber auch rein gar nichts mehr zu tun mit Standard-C(++) Datentypen wie char* a, char a[] oder string a (klein geschrieben).

    probier's mal mit Abfrage des 1. Zeichens in deinem "String":
    (einfaches Hochkomma für Zeichen, keine Doppel-Anführungszeichen für Zeichenketten!)
    if(Zeit_einlesen[0]=='j') .......


    edit:
    ah, hat sich zeitlich überschnitten!

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    [QUOTE=HaWe;639090]
    probier's mal mit Abfrage des 1. Zeichens in deinem "String":
    (einfaches Hochkomma für Zeichen, keine Doppel-Anführungszeichen für Zeichenketten!)
    if(Zeit_einlesen[0]=='j') .......

    Danke , das klappt auch!

    Was bedeutet die [0] ??

    vG
    fredyxx

  3. #3
    HaWe
    Gast
    [QUOTE=fredyxx;639092]
    Zitat Zitat von HaWe Beitrag anzeigen
    probier's mal mit Abfrage des 1. Zeichens in deinem "String":
    (einfaches Hochkomma für Zeichen, keine Doppel-Anführungszeichen für Zeichenketten!)
    if(Zeit_einlesen[0]=='j') .......

    Danke , das klappt auch!

    Was bedeutet die [0] ??

    vG
    fredyxx
    strings jeder Art sind grundsätzlich arrays, an jeder Stelle steht ein einzelner Buchstabe.
    Buchstaben sind meist Bytes (unsigned char), bei Arduino seltsamerweise signed char (auf anderen Systemen oder als Steuerzeichen auch teilw. int, führt hier aber zu weit ).
    Die Nummerierung startet in C mit der Null, daher ist array[0] die erste "Zelle", array[1] die 2., usw., bei einem string oder array der Länge n ist also array[n-1] der letzte Buchstabe, der direkt zum string gehört.
    Es folgen dann bei C-strings noch das terminierende Byte 0 ( '\0'), und ggf voher noch das "Enter-Zeichen" (carriage-return, line-feed), wenn du nach deiner string-Eingabe am Schluss die Enter-Taste gedrückt hast, in C auf AVR und ARM und Linux ist das das '\n' (alles andere führt hier zu weit).
    \0 ist der ASCII-Wert 0, nicht das Zahlsymbol 0,
    \n ist der ASCII-Wert 10.

    Für dich ist vor allem wichtig, dass wenn du nur 1 Zeichen per Serial eingibst und mit ENTER abschließt, dieses Zeichen an der 1. Array-Stelle gespeichert wird, also array[0], und dass aber noch weitere Steuerzeichen folgen können, die das System drangehängt hat.

    (edited: )
    Leider kann man sich aber (wie erwähnt) bei Arduino nie recht drauf verlassen, was das alles genau ist. Wenn du also ein 'j' eingibst + ENTER, kann dein String-array so aussehen
    j \0
    -oder-
    j \n \0
    -oder (passiert, wenn man lange genug wartet bevor man dann irgendwann ENTER drückt), auch nur:-
    j
    - IMMER aber steht das j an 1. Stelle, also in der Zelle array[0].


    ANSI C- oder C++ -Funktionen entfernen oder verarbeiten die string-Steuerzeichen mit ihren recht gut dokumentierten Standard-Funktionen, Arduino verwendet dazu die seltsam-verqueren und nicht bis maximal hundsmiserabel dokumentierten String-Class Funktionen wie trim().
    Geändert von HaWe (15.09.2017 um 18:01 Uhr)

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von HaWe Beitrag anzeigen
    Die Arduino-C++-Klasse String (groß geschrieben) ist das größte Übel seit wir von den Bäumen herunter gekommen sind, wahrscheinlich sogar, seit wir die Ozeane verlassen haben.
    Es hat nichts, aber auch rein gar nichts mehr zu tun mit Standard-C(++) Datentypen wie char* a, char a[] oder string a (klein geschrieben).
    Was bewegt dich zu solchen haarsträubenden Falschaussagen?
    String-Objekte sind in Arduino als Wrapper um einen Buffer vom Typ char* realisiert, um den Umgang mit Zeichenketten zu vereinfachen und wesentliche Funktionalität wie Vergleich, Modifikation, Verkettung etc. bereitzustellen.

  5. #5
    HaWe
    Gast
    es steht nirgends in der Arduino-Dokumentation erklärt.
    Wer das rauskriegen will, muss die Arduino-C++ String lib-sourcecode-Kauderwelschs durchpflügen, dass ist Arduino-Standard-Nutzern nicht zuzumuten, und insb. ist es absolut konfus, weil Arduino in C++ geschrieben ist (nicht in C), und in C++ die library <string> existiert mit ihrem Datentyp string, und nicht char* wie in ANSI-C <string.h> bzw. <cstring>.
    string und char* sind aber nicht identisch und auch nicht kompatibel zu einander, und auch String ist nicht kompatibel zu char*.

    ps,
    versuche mal, die C-Funktionen wir strncpy, strstr oder strtok auf String anzuwenden!
    Und dann wie vergleichsweise C++-Funktionen wie string::substring, string::copy, string::compare auf String anzuwenden sind.
    Geändert von HaWe (14.09.2017 um 13:33 Uhr)

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von HaWe
    string und char* sind aber nicht identisch und auch nicht kompatibel zu einander
    'string' ist in Arduino nicht definiert! Folgendes produziert den Fehler 'error: 'string' was not declared in this scope':
    Code:
    void setup() {
        string s = "Kompiliert nicht!";
    }
    void loop() {}
    Zitat Zitat von HaWe
    ... und auch String ist nicht kompatibel zu char*...
    versuche mal, die C-Funktionen wir strncpy, strstr oder strtok auf String anzuwenden!
    Folgender Code zeigt die 'Kompatibilität' von String und C-Funktionen, die mit char* arbeiten:
    Code:
    void setup() {
        String s1 = "Hallo Welt!";
        
        Serial.begin(9600);
        Serial.println(s1);
        
        String s2 = "Ha";
        s2 += "We";
        strncpy(s1.c_str()+s1.indexOf('W'), s2.c_str(), s2.length() );
        Serial.println(s1);
    }
    
    void loop() {}
    [Ausgabe: Hallo Welt! Hallo HaWe!]

    PS: Sorry fredyxx fürs Thread-Hijacken.

  7. #7
    HaWe
    Gast
    Zitat Zitat von Sisor Beitrag anzeigen
    'string' ist in Arduino nicht definiert! Folgendes produziert den Fehler 'error: 'string' was not declared in this scope':
    Code:
    void setup() {
        string s = "Kompiliert nicht!";
    }
    void loop() {}
    Folgender Code zeigt die 'Kompatibilität' von String und C-Funktionen, die mit char* arbeiten:
    Code:
    void setup() {
        String s1 = "Hallo Welt!";
        
        Serial.begin(9600);
        Serial.println(s1);
        
        String s2 = "Ha";
        s2 += "We";
        strncpy(s1.c_str()+s1.indexOf('W'), s2.c_str(), s2.length() );
        Serial.println(s1);
    }
    
    void loop() {}
    [Ausgabe: Hallo Welt! Hallo HaWe!]

    PS: Sorry fredyxx fürs Thread-Hijacken.
    das güldet nicht!
    du verwendest eine (non-Standard-C) Arduino-String-Class-eigene interne Umwandlungsmethode String::c_str(), um erst Strings in char* umzuformen, und erst dann wendest du cstring- (string.h) Funktionen darauf an!

    Wirklich kompatibel zu ANSI-C char* wäre es nur, wenn du Strings an sich mit cstring-Funktionen verwenden könntest, also z.B.

    String str1= "To be or not to be";
    String str2;
    String str3;

    /* copy to sized buffer (overflow safe): */
    strncpy ( str2, str1, sizeof(str2) );

    /* partial copy (only 5 chars): */
    strncpy ( str3, str2, 5 );
    str3[5] = '\0'; /* null character manually added */

    puts (str1);
    puts (str2);
    puts (str3);


    Output WÄRE (!):

    To be or not to be
    To be or not to be
    To be

    (aus cplusplus.com, verändert)


    Viel SINNVOLLER wäre es allerdings gewesen, C++ string als Grundlage zu nehmen,
    alle string-class-Methoden auf String zu vererben,
    und sie dann durch die Arduino-eigenen String-Methoden zu erweitern.

    DAS wäre C++ kompatibel (da man alle C++ string Methoden weiterhin auch in String zur Verfügung HÄTTE) und durch zusätzliche Methoden Arduino-Anfänger-geeignet.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    du verwendest eine (non-Standard-C) Arduino-String-Class-eigene interne Umwandlungsmethode String::c_str(), um erst Strings in char* umzuformen, und erst dann wendest du cstring- (string.h) Funktionen darauf an!
    Schwachsinn! String ist ein Wrapper für einen char* Buffer in Objektform. c_str() ist eine Gettermethode, um genau diesen Buffer zu bekommen. Es findet keine Umformung / Umwandlung statt.

  9. #9
    HaWe
    Gast
    Schwachsinn! wenn was auch immer immer benötigt wird, um String zu char* und string.h Funktionen kompatibel zu machen, dann ist es eben nicht a priori kompatibel!

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Zitat Zitat von HaWe Beitrag anzeigen
    Wirklich kompatibel zu ANSI-C char* wäre es nur, wenn du Strings an sich mit cstring-Funktionen verwenden könntest, also z.B.
    Das wäre einfach zu erreichen (durch eine zusätzliche Memberfunktion in der Stringklasse). Aber da muss man die Arduinoentwickler in Schutz nehmen, dass sie den Zugriff mit ".c_str()" machen, genau wie std::string auch. Microsoft hat das in den 1990ern in seiner CString Klasse gemacht.
    https://msdn.microsoft.com/en-us/lib...(v=vs.60).aspx
    Das produziert mehr Probleme als es löst, deswegen macht man das heute nicht mehr so.

    Zur Kritik an der Arduino String Klasse
    https://forum.arduino.cc/index.php?topic=364772.0
    When Arduino 1.0 was released, the "String" class was faulty due to compiler/library problems and could easily create wrong results and programs "hanging".

    This problem was fixed at some point, I think with release of IDE 1.0.5.

    So at least the "String" class is working "error free" now, if that was your question.

    But of course "String" is BAD BAD BAD, because of:
    - using more RAM than actually needed to solve any problem
    - encourages programmers to write programs that eat up more RAM than is actually available
    - slowing down program execution which might be bad if every microsecond is counting in your application
    - fragments RAM, so that after some time of running an application the RAM could be fragmented too much, so that no "String" of certain length can be allocated any longer.
    In C++ ist std::string nur ein typedef für std::basic_string<char>, wo schon der Name andeutet, dass da char drinstecken...
    http://en.cppreference.com/w/cpp/string/basic_string

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. atmega32 führt testprogramm nicht aus
    Von exzoys im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 15
    Letzter Beitrag: 01.02.2011, 10:08
  2. Testprogramm läuft nicht
    Von 9999 im Forum Robby RP6
    Antworten: 24
    Letzter Beitrag: 30.05.2009, 17:05
  3. Testprogramm funktioniert nicht!
    Von Gillich im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 2
    Letzter Beitrag: 04.04.2008, 23:49
  4. Testprogramm für rn Control funktioniert nicht richtig
    Von thdrummer im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 1
    Letzter Beitrag: 26.02.2007, 15:18
  5. Genauigkeit von Uhren
    Von orph im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 25.09.2006, 16:48

Berechtigungen

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

Solar Speicher und Akkus Tests