-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: String Array

  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557

    String Array

    Anzeige

    Wie kann ich verschiedene (gleich lange) Strings in einem Array so ablegen, dass ich sie mit einem Pointer, z.B. txtptr {1..4} anwählen kann. Derzeit verwende ich z.B. einzelne Strings der Art:

    Code:
      unsigned char ML1[]   EEMEM = "Taster gedrückt!";     // Meldetext
    die ich natürlich mit dem expliziten Namen ML1 oder so aufrufen muss.

    Suche etwas wie dies
    ??? EEMEM = " auf "
    ??? EEMEM = " ab "
    ??? EEMEM = " zu "
    ??? EEMEM = "mist "

    mit dem jeweils gleichen Namen, aber einem wählbaren Pointer : emma[2]. Entsprechende Felder mit Zahlen bekomme ich ja hin:

    Code:
    uint16_t ESeroff[]    EEMEM = { 0,   0,0,0, 0,0,0, 0,0,-12, 19,   0,   0 } ;
    Seit Tagen Suche ich immer wieder nach ner Lösung mit Strings statt Zahlen, finde in keinem Tutorial und nicht im K&R etwas hilfreiches. Etliche Experimente sind fehl geschlagen.

    Danke für Hilfe
    Ciao sagt der JoeamBerg

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.03.2011
    Beiträge
    1.401
    Ich glaube deine Frage zu verstehen und versuche daher mal eine Antwort.

    Es gibt keinen Datentyp string in C. In anderen Sprachen schon. Als String wird in C ein Array of Chars bezeichnet. Was du also brauchst ist ein Array of Arrays of Chars, anders gesagt ein zweidimensionales Array of Chars, etwa so:

    char Texte[5][10];

    Das sind 5 Texte mit einer jeweiligen Länge von maximal 9 Zeichen plus der Endekennung durch '\0'.

    Wie geht man damit um? Hier ein Beispiel:
    Code:
    char texte[][10] = {"eins", "zwei", "drei"};
    
    int main(int argc, char** argv) {
    
        printf("%s\n", texte[1]);
    
        strcpy(texte[1], "neu");
    
        printf("%s\n", texte[1]);
    }
    Dazu ein paar Bemerkungen: Die erste Dimension des zweidimensionalen Arrays kann man sich vom Compiler auszählen lassen, daher ist beim Initializer die erste eckige Klammer leer. Die zweite muß man selber einsetzen. Sie muß so groß sein, daß der längste Text (plus '\0') reinpasst.

    So wie bei char Text[10], Text die Adresse des Anfangs des Arrays ist, die man z.B. mit printf("%s", Text) ausgibt, ist texte[1] die Adresse des zweiten Char-Arrays oder Strings.

    Ich bin sicher nicht der große Lehrbuchschreiber, hoffe aber doch daß ich das verständlich formuliert habe und daß es dein Problem trifft.

    Achso, die Ausgabe des obigen Programms ist:

    zwei
    neu

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    Zitat Zitat von Klebwax Beitrag anzeigen
    ... hoffe .. verständlich formuliert habe und daß es dein Problem trifft ...
    Danke Klebwax; immerhin bist Du auf dem besten Weg zum großen Lehrbuchschreiber *kompliment* - es funktioniert wirklich gut. Danke für die schnelle Hilfe und diese wirklich saubere, verständliche Beschreibung - komplett mit Anwendungsbeispiel. Ich hatte (schon mal als grundlegenden Fehler, trotz K&R-Nachhilfe) beim zweidimensionalen Array schon mal die Koordinaten verwechselt :-/ - aber dank Deiner Ausführung klappte es praktisch schon auf Anhieb. Vielen Dank, hat mir wieder mal STUNDEN gespart.
    Anmerkung: die zitierten Codezeilen stammen aus verschiedenen Modulen, ich hoffe, dass die Lösung/Problematik trotzdem klar dargestellt wird.

    Code:
    //   -  -  -  -  -  -  -  -  -  -
      char SVdef [][6]
            EEMEM = {  "     ", "Ko+/-", "Kor/l", "KoNir", "KoNil",
                       "ADeur", "ADeul", "     ", "ADe o", "Au rl", "Au +-" } ; //   -  -  -  -  -  -  -  -  -  -
      void UART0_eep_string( char data [6] ) ;      // EEPROM-String an UART0
    //   -  -  -  -  -  -  -  -  -  -
    // ============================================================================== =
    // ==   Ausgabe Text aus EEPROM an UART0
    // ============================================================================== =
     void UART0_eep_string( char data [6] )
     {                              //
      char c;              
      while(1)                      // String *data an UART0
      {                             //
        c = eeprom_read_byte(data); //
        if ( c == 0 ) return;       //
        uputchar0 ( c );            // Ein Zeichen an UART0
        data++;                     //
      }                     // Ende while(1)
     }              // Ende void UART0_eep_string(const unsigned char *data)
    // ============================================================================== =
    // ============================================================================== =
    //   -  -  -  -  -  -  -  -  -  -
    // ... im Main/
      UART0_eep_string(SVdef [5]);
    //...
    bringt ins Terminalfenster
    ............ADeur

    Und das trotz Warnungen. Da ich Warnungen selbst in minimaler Anzahl hasse bitte ich um weitere Hilfe/Aufklärung.
    Code:
    ../KoCo_inf15.c: In function 'uart0_eep_string':
    ../KoCo_inf15.c:89: warning: pointer targets in passing
    ...... argument 1 of '__eerd_byte_m1284p' differ in signedness
    Build succeeded with 1 Warnings...
    
    function 'uart0_eep_string':
    ../KoCo_inf15.c:89:
        c = eeprom_read_byte(data); //
    Das krieg ich nicht gebacken. Hoffentlich habe ich trotz der Knappheit alles Wesentliche zum Fehler dargestellt.

    Danke im Voraus für die Hilfe.
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Was ist das Datentyp von data in den Funktion eeprom_read_byte(data)? Schau uns bitte mal den Funktion Header davon.

    Data ist ein char. Aber laut den Warnung könnte eeprom_read_byte ein signed char erwarten.
    Geändert von Valen (20.03.2013 um 11:41 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    Zitat Zitat von Valen Beitrag anzeigen
    Was ist das Datenyp von data in den Funktion eeprom_read_byte(data) ...
    Danke Valen, Du hast Recht - trotzdem . . .

    1) die Funktion ist die Bibliotheksfunktion aus der avr-libc vom WinAVR-2010011 (klick). Diese Funktion ist dort gelistet mit :
    uint8_t eeprom_read_byte (const uint8_t *__p) __ATTR_PURE__

    ABER wenn ich in meiner Routine "void UART0_eep_string( char data [6] )" das "c" als uint8_t c definiere - gibts trotzdem die Warnung

    ../KoCo_inf15.c:90: warning: pointer targets in
    ...... passing argument 1 of '__eerd_byte_m1284p' differ in signedness

    Leider :-/

    - - - Aktualisiert - - -

    Trotz Allem: es läuft genau wie ich will - und ich kann endlich mit dem Befehl "D" (= Display all Data) eine Liste der Daten für meine zehn Servos bekommen >> mit Angabe/Kürzel<< des jeweiligen Servos:

    HTML-Code:
         Servodaten
         Servo    |    Aktuell  Min  ~Max Offset
         1    Ko+/-    3600      1600 5600 0    
         2    Kor/l    3600      1600 5600 0    
         3    KoNir    3850      3000 4700 0    
     
         4    KoNil    3200      2300 4100 0    
         5    ADeur    3600      1600 5600 0    
         6    ADeul    3600      1600 5600 0    
     
         7             3600      1600 5600 0    
         8    ADe o    3600      1600 5600 0    
         9    Au rl    3600      2800 4400 -12  
         10   Au +-    3600      2800 4400 19
    Geändert von oberallgeier (20.03.2013 um 12:15 Uhr)
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.167
    Dein "avr-libc vom WinAVR-2010011 (klick)" link fehlt weil das auf deine Festplatte steht. Aber nicht in Program Files in meiner.

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    Zitat Zitat von Valen Beitrag anzeigen
    Dein "avr-libc vom WinAVR-2010011 (klick)" link fehlt weil das auf deine Festplatte ...
    Aua - ein typischer Anfängerfehler.

    http://www.nongnu.org/avr-libc/user-...r__eeprom.html
    Ciao sagt der JoeamBerg

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    29
    Beiträge
    1.221
    Das Problem ist nicht "c" sondern dein Array, das aus chars besteht. Und chars sind signed, die EEPROM-Funktion will aber einen Pointer auf unsigned chars (uint8_t) haben.

    Die statische 2D-Array-Variante verschwendet übrigens Platz, da wirklich X*Y Bytes alloziert werden selbst wenn X-1 Strings nur halb so groß sind.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    Zitat Zitat von markusj Beitrag anzeigen
    Das Problem ... Array ... aus chars ... EEPROM-Funktion will ... Pointer auf (uint8_t) ...
    Danke für die Hilfe und dass Du da drüber schaust. Über die Deklaration uint8_t war ich schon gestolpert, als ich mir vorhin die Erklärungen zur Funktion im user manual angesehen hatte. Egal - auch ein uint8_t c; hatte nicht geholfen, es kommt dieselbe Warnung.

    Zitat Zitat von markusj Beitrag anzeigen
    ... Die statische 2D-Array-Variante verschwendet übrigens Platz ...
    Danke. Im Moment hab ich ja noch ewig Platz im m1284; Compilermeldung nach dem Build: "EEPROM: 390 bytes (9.5% Full)". Genau diese Platzfrage ist ja auch einer der Gründe - neben den 20 MHz und anderen Karten zum selben Projekt mit demselben Controller - warum ich den m1284 gewählt hatte. Immerhin meldet der Compiler auch noch "Program: 12190 bytes (9.3% Full) und Data: 2034 bytes (12.4% Full)". Also total viel Platz nach oben. Wie gesagt - war bei mir so ne Art Standardisierung die hier sogar gute Vorteile zeigt. Und die paar Euro mehr krieg ich grad noch hin ;-)
    Ciao sagt der JoeamBerg

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. String nach Array umwandeln (?)
    Von slavezero im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 07.06.2012, 18:21
  2. Zahl in String/Array schreiben
    Von Steffen08 im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 24.02.2009, 12:10
  3. Array zweidimensional für String
    Von elko68 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 30.12.2008, 20:19
  4. Array ---> String
    Von Thinker im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 23.01.2007, 10:06
  5. String-Array in C
    Von Guy im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 13.12.2006, 15:49

Stichworte

Berechtigungen

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