string tutorial für STM32 ?

OP #4401256
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 ?
OP
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 ?
Gast
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.
OP
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)
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
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
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
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
Ich kenne Emblocks nicht, aber ...
irgendwo sollte es ein Menüpunkt "Project" geben.
Dort kannst du die benötigten Dateien und Bibliotheken eintragen.
Gast
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.
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
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
> 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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.