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:
die ich natürlich mit dem expliziten Namen ML1 oder so aufrufen muss.Code:unsigned char ML1[] EEMEM = "Taster gedrückt!"; // Meldetext
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:
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.Code:uint16_t ESeroff[] EEMEM = { 0, 0,0,0, 0,0,0, 0,0,-12, 19, 0, 0 } ;
Danke für Hilfe
Ciao sagt der JoeamBerg
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:
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.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]); }
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 !
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.
bringt ins TerminalfensterCode:// - - - - - - - - - - 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]); //...
............ADeur
Und das trotz Warnungen. Da ich Warnungen selbst in minimaler Anzahl hasse bitte ich um weitere Hilfe/Aufklärung.
Das krieg ich nicht gebacken. Hoffentlich habe ich trotz der Knappheit alles Wesentliche zum Fehler dargestellt.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); //
Danke im Voraus für die Hilfe.
Ciao sagt der JoeamBerg
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)
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
Dein "avr-libc vom WinAVR-2010011 (klick)" link fehlt weil das auf deine Festplatte steht. Aber nicht in Program Files in meiner.
Aua - ein typischer Anfängerfehler.
http://www.nongnu.org/avr-libc/user-...r__eeprom.html
Ciao sagt der JoeamBerg
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
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.
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
Lesezeichen