string tutorial für STM32 ?

OP #4401256
Lesenswert?
• ▲
▼
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
char parameter[][200]; 
2
char txt[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 ?
Gast #4401404
Lesenswert?
• ▲
▼
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.
#4401445
Lesenswert?
• ▲
▼
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.
OP #4401740
Lesenswert?
• ▲
▼
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
char parameter[][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 ?
1
strcpy(parameter[150],"1234");
(Firma: Outside the Asylum) #4401747
Lesenswert?
• ▲
▼
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
> char parameter[][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.
Gast #4401750
Lesenswert?
• ▲
▼
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.
Gast #4401754
Lesenswert?
• ▲
▼
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.
OP #4402054
Lesenswert?
• ▲
▼
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
int main(void)
4
{
5
test();
6
}


init.h
1
#ifndef INIT_H
2
#define INIT_H
3

4
void test();
5

6
#endif /* INIT_H */


init.c
1
#include "init.h"
2

3
void test(){
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
Gast #4402073
Lesenswert?
• ▲
▼
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.
#4402082
Lesenswert?
• ▲
▼
Ist
1
char parameter[][200];
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
char txt[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.
OP #4402141
Lesenswert?
• ▲
▼
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
char parameter[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
#4402152
Lesenswert?
• ▲
▼
> 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:
1
snprintf(parameter[150],sizeof(parameter[150]),"PD15");

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren