Hallo Zusammen, ich habe mir das Franzis Lernpaket Microcontroller in C programmieren gekauft und habe bei dem Projekt zur UART-Kommunikation ein Problem. Im Anhang findet ihr die main.c-Datei und die Fehlermeldung beim Compilieren. Das Problem ist dass ich nur dann meine unsigned char Array schicken kann wenn ich es bei der Implementierung des Arrays definiere, d.h. wenn ich unsigned char str[10] = "abcdefgh"; schreibe. Wenn ich aber nur ein unsigned char str[10]; implementiere und später str[10]="abcdefgh" definieren möchte kann ich es nicht ohne die Fehlermeldungen. Ich hoffe Ihr könnt mir da weiter helfen, da ich ehrlich gesagt nicht verstehe warum es nicht funktioniert. Nach meinem Verständnis ist es doch egal ob ich bei der Implementierung definiere oder erst danach. Vielen Dank im Voraus und frohe Feiertage.
Hallo, Das Problem ist, dass diese Zeile str[10]="abcdefgh" das 10. Element des Array mit einer ganzen Zeichenkette beschreiben möchte. Das geht natürlich nicht. Das "[10]" muss weg.
Lucas Pelchen schrieb: > da ich ehrlich gesagt nicht > verstehe warum es nicht funktioniert. Prinzipiell liegt es daran dass du es nicht gewagt hast ein Buch über C Grundlagen zu lesen und daraus zu lernen.
Lucas Pelchen schrieb: > Wenn ich aber nur ein unsigned char str[10]; implementiere und später > str[10]="abcdefgh" definieren möchte kann ich es nicht ohne die > Fehlermeldungen. Dein C-Buch verrät Dir, was Du hier falsch machst. Stichwort "Zuweisung" und Stichwort "Zugriff auf Array-Elemente". Abgesehen davon ist Deine Verwendung der Begriffe "implementieren" und "definieren" falsch.
1 | char str[100]; |
hiermit definierst Du ein char-Array mit 100 Elementen
1 | str[100] = "abcdefghi"; |
hiermit versuchst Du, dem 101. Element Deines char-Arrays eine Stringkonstante zuzuweisen Die Elemente eines char-Arrays aber sind chars (d.h. ein einzelnes Zeichen), denen kann man nur einzelne Zeichen, nicht aber Zeichenketten zuweisen. Und: Du greifst auf das 101. Element zu, Dein Array aber hat nur 100 Elemente. In C (und anderen C-artigen Programmiersprachen) hat das erste Element eines Arrays den Index 0 und nicht 1.
Vielen Dank für die schnelle Antworten. die Tatsache ist, dass ich es auch schon ohne [10] versucht habe es jedoch auch zu einer Fehlermeldung kommt. was ich nicht verstehe warum die "abc..."-Folge als const char[10] definiert ist. Ich muss zugeben dadurch, dass ich eig. immer vorzugsweise mit string arbeite, statt mit char muss ich mich daran noch gewöhnen.
Lucas Pelchen schrieb: > Vielen Dank für die schnelle Antworten. > die Tatsache ist, dass ich es auch schon ohne [10] versucht habe es > jedoch auch zu einer Fehlermeldung kommt. was ich nicht verstehe warum > die "abc..."-Folge als const char[10] definiert ist. > Ich muss zugeben dadurch, dass ich eig. immer vorzugsweise mit string > arbeite, statt mit char muss ich mich daran noch gewöhnen. Weil es in C eben keinen Datentyp String gibt. Einzelzeichen werden im Typ char gespeichert, z.B. 'a' oder als Hexadezimalwert 0x61. Zeichenketten werden in einem Array von Chars angelegt und mit dem \0 - Nullterminator abgeschlossen. Ein String in C ist also ein Array bestehend aus lauter Einzelzeichen mit Terminierung.
Ohmann schrieb: > Ein String in C ist also ein Array bestehend aus lauter Einzelzeichen > mit Terminierung. Hinzu kommt, daß C keine Zuweisung von Arrays kennt.
Danke für die Informationen zu den Arrays in c. Aber ich verstehe nicht warum es nicht funktioniert das unsigned char Array str mit dem Wert "abcdefghi" zu füllen. Selbst wenn der \0-Terminator an die "abcdefghi"-Folge angeschlossen wird? Was mich verwirrt: Im c-File des Beispielprogramms funktionert alles.
Versuchs mal mit: [c] char * s; while(1){ s = "Text"; }
In deinem Beispiel: dtostrf(Cap,1,3,str); uart_putStr(str);
Lucas Pelchen schrieb: > Aber ich verstehe nicht > warum es nicht funktioniert das unsigned char Array str mit dem Wert > "abcdefghi" zu füllen. Selbst wenn der \0-Terminator an die > "abcdefghi"-Folge angeschlossen wird? du reservierst Platz für unsigned char str[10]; 10 Zeichen dann kannst du zwar bis zu 10 Zeichen reinschreiben, hier mit 8 Zeichen "abcdefgh" aber das Ende der NULL Terminator fehlt. Jede Funktion die nun nicht weiss wo das Ende ist liest bis ins Nirwana. mit strcpy(str, "abcdefgh"); kopierst du nun die "abcdefgh" in deine Variable str mit NULL am Ende. In str liegt nun "abcdefgh\0" also abis h 8 Zeichen + die 0 am Ende also 9 Zeichen belegt. Die Zählweise bei unsigned char str[10]; geht aber von str[0] erstes Zeichen bis str[9] letztes 10tes Zeichen. Der "String" ist aber nur 8 Zeichen lang "abcdefgh" zähle durch von str[0] bis str[9] und das Ende ist str[8] als 9tes Zeichen mit der NULL, das str[9] ist zwar nicht leer aber ungenutzt, kann irgendwas drin sein. Jede Funktion die mit str arbeitet, strcpy, strcmp, strcat weiss das und arbeitet bis zur NULL so sie vorhanden ist, ohne NULL gehst in die IRRE und es crasht! Steht aber in JEDEM C-Buch.
Danke die strcpy()-Funktion is'n super tipp. Funktioniert wie es soll. Dank euch.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.