Hallo
Ich befasse mich momentan mit dem STM32 und Emblocks.
Gibt es eine möglichkeit einen Teil eines Strings in einen anderen zu
kopieren ?
Code:
1
charparameter[][200];
2
chartxt[100];
3
4
sprintf(parameter[150],"PD15");
5
6
sprintf(txt,"%s\r\n",parameter[150]);
7
USART_send(USART1,txt);
Ich möchte vom string 'parameter' ein oder mehrere Zeichen lesen und per
Uart ausgeben. Wie genau muss ich dass machen, geht das mit der
sprintf-funktion ?
Kennt jemand ein gutes Tutorial ?
Kaj G. schrieb:> Michael L. schrieb:>> Kennt jemand ein gutes Tutorial ?> Ein Buch über C reicht da schon.
Damit die Antwort des äußerst hilfsbereiten Vorposters auch Sinn macht
ergänz ich das mal:
Es gibt Funktionen für sowas in der Standardbibliothek. <string.h>
strcpy bzw. strncpy, strncat usw.
http://www.tutorialspoint.com/c_standard_library/string_h.htm
tiptop ! sowas habe ich gesucht
noch was: in BASIC gibt es die funktion MID(str, start, len) diese gibt
von einem string (str) von der startposition (start) ein teilstück mit
länge (len) zurück. Gibts sowas auch in C ? oder muss man das selber
machen ?
Michael L. schrieb:> char parameter[][200];
Ein leeres Klammerpaar mscht nur Sinn, wenn man das Array auch gleich
initialisiert.
Dann erkennt der Compiler an der Anzahl der Werte die Größe vom Array.
Zu strncpy sei noch gesagt, dass es den Stringterminator nicht setzt,
wenn die Maximalzahl der Zeichen kopiert wurde.
strncat macht das. Und bei einem Leerstring als Ziel ist es eine
Kopie.
Geh' mal davon aus, dass es kein Tutorial zur Stringbehandlung mit dem
STM32 gibt.
Geh das Problem einfach folgendermaßen an:
Beschäftige Dich mit den Stringmanipulationsmöglichkeiten unter C. Da
gibt es bestimmt so einiges und schau dann, notfalls in den
Headerdateien nach, ob diese Funktionen von Deinem Compiler unterstützt
werden, bzw. implementiert wurden.
P.S. Die Bücher, die Du im Internet zu C und dessen Anwendung findest
sind Legion. Auch die zugehörigen Bibliotheken, bzw. deren Beschreibung,
findest Du dort.
besten dank für die tips.
Habe aber trotzdem noch eine frage zu den arrays.
Das sollte ein array erstellen mit 200 elementen, in jedem element
sollte ein beliebig langer string abgelegt werden können, stimmt das so
?
1
charparameter[][200];
Im element 150 lege ich jetzt den string "1234" ab, das besagte elemnt
hat jetzt eine länge von 4. Kann ich jetzt auch den string "12345678"
hineinschreiben, oder überläuft das element ?
Michael L. schrieb:> Das sollte ein array erstellen mit 200 elementen, in jedem element> sollte ein beliebig langer string abgelegt werden können, stimmt das so> ?>
1
>charparameter[][200];
2
>
Nein.
Für ein beliebig langes Element müßte für jedes der 200 Felder der
gesammte Speicher reserviert werden, denn der ist immer die Obergrenze.
Das klappt aber schon beim zweiten Feld nicht mehr, da ist schon alles
vom ersten belegt. Du mußt also eine Obergrenze setzen, die höchstens so
groß ist wie der verfügbare Speicher geteilt durch 200. Sinnvoll ist das
aber auch nicht wirklich.
array[] kannst Du nur benutzen, wenn Du gleichzeitig Werte zuweist. Der
Compiler kann dann die Klammer mit der Länge des größten Werts füllen.
Das kannst Du aber in jedem C-Buch nachlesen.
Bei deinem Vorhaben musst du über Zeiger und dynamischen Speicher gehen.
Oder du wechselst zu C++. Da kannst du die Klasse std::string nehmen.
Egal welche Sprache du nimmst, du musst sie erstmal lernen.
Mit einem Buch. Da ist auch die Plattform erstmal egal.
Noch zum Array:
In C kannst du ein (echtes) Array nach der Definition nicht mehr in der
Größe und Lage verändern.
Ein Array (egal welcher Dimension) ist ein zusammenhängender
Speicherblock.
Du kannst das, wie schon geschrieben, mit Zeigern und dynamischem
Speichern umgehen.
Besten Dank für eure hilfe. Also ein Buch für C und C++ habe ich bereits
zur Hand.
In dem Buch stand schon beschrieben dass man die [] Klammern eines
arrays lehr lassen kann, wenn es direkt initialisiert wird. Ich habe
dann angenommen, dass es sich bei lehren klammern automatisch anpasst.
Wie es das bei anderen Sprachen auch gibt.
Nochmals zurück zu C, ich programmiere mit EMblocks, und möchte nun eine
andere C-datei einbinden:
main.c
1
#include"init.h"
2
3
intmain(void)
4
{
5
test();
6
}
init.h
1
#ifndef INIT_H
2
#define INIT_H
3
4
voidtest();
5
6
#endif /* INIT_H */
init.c
1
#include"init.h"
2
3
voidtest(){
4
5
}
Der compiler meldet nun einen Fehler, dass die void test() nicht
gefunden wurde. Nach goooglen muss man in der MAKEFILE die zusätzliche
C-datei aufführen. Bei Emblocks gibt es aber kein MAKEFILE, was muss ich
da genau machen ? Die beiden dateien init.c und init.h sollten doch so
richtig sein ? Ich nehme deshalb an, dass die zusätzlichen dateien
irgendwo vermerkt werden müssen, damit sie der compiler findet
Michael L. schrieb:> Besten Dank für eure hilfe. Also ein Buch für C und C++ habe ich bereits> zur Hand.
Du musst die auch durcharbeiten.
Betrachte C und C++ als zwei verschiedene Sprachen, die außer ein paar
Schlüsselwörtern nichts gemein haben.
> In dem Buch stand schon beschrieben dass man die [] Klammern eines> arrays lehr lassen kann, wenn es direkt initialisiert wird. Ich habe> dann angenommen, dass es sich bei lehren klammern automatisch anpasst.> Wie es das bei anderen Sprachen auch gibt.
Schließe bei Arrays nie von dem Verhalten anderer Sparachen auf das
Verhalten von C.
nicht ein Array unbekannter Größe, bestehend aus 200stelligen Zeichen.
Wenn ich den TO richtig verstehe, dann will er das genau andersrum. Und
Strings sind in C Zeiger auf Zeichenfolgen mit Hex 0 am Ende.
Also
1
// 200 Zeiger auf Zeichenketten
2
char*parameter[200]={
3
"PD1",
4
...
5
"PD200"
6
};
7
chartxt[100];
8
// Parameter 150 senden
9
sprintf(txt,"%s\r\n",parameter[150]);
10
USART_send(USART1,txt);
Will man allerdings die "paramenter" zur Laufzeit befüllen, dann braucht
man eine wie auch immer geartete Speicherverwaltung.
DirkB schrieb:> irgendwo sollte es ein Menüpunkt "Project" geben.
aja, habs gefunden, jetzt läufts ohne fehler
Carl D. schrieb:> Will man allerdings die "paramenter" zur Laufzeit befüllen, dann braucht> man eine wie auch immer geartete Speicherverwaltung.
nein für meine zwecke habe ich das so gemacht:
1
charparameter[200][12];
so habe ich 200 parameter mit je 12 zeichen. in der regel habe ich
zwischen 1 - 10 zeichen pro parameter die ich speichern muss
> Carl D. schrieb:>> Will man allerdings die "paramenter" zur Laufzeit befüllen, dann braucht>> man eine wie auch immer geartete Speicherverwaltung.>> nein für meine zwecke habe ich das so gemacht:> char parameter[200][12];
Hättest du mal hingeschrieben. In deinem 1. Post steht davon leider
nichts. Und wenn das Zielfeld eine feste Länge hat, dann besser:
Außerdem will printf, das bei der Ausgabe, bei "%s" einen String, d.h.
mit hex 0 am Ende. Kommandos über 11 Zeichen Länge führen dann zu
lustigen Fehlern.