Hallo,
ich programmiere seit langem wieder etwas in C auf einem STM32 und
benötige für folgende Problemstellung eure Hilfe.
Ich möchte gern über ein Display und Taster Produkte auswählen, die
einen Namen und Werte in Form von Zahlen haben. Die Frage ist nur, wie
ich das mehr oder weniger in einer Variable halten kann, um eventuell
später auch neue Produkte während der Laufzeit hinzufügen zu können.
Im groben soll es so aussehen:
Produktname, Wert1, Wert2, Wert3.
Ein Array kommt, denke ich, nicht in Frage, da ja jeder Teil des Strings
in einer Arrayzelle abgelegt und es damit ziemlich groß wird.
In structs habe ich noch nicht so viele Erfahrungen, aber könnte man es
damit lösen?
Vielen Dank für euere Hilfe.
Hallo,
Nur so eine ganz blöde Idee was passiert, wenn die Spannung abgeschaltet
wird oder sogar ausfällt?
Dann sind die temporären Daten doch gelöscht, macht das dann noch Sinn?
Es wird alles im Flash gespeichert. Wie genau die Lösung aussieht und
wie die Daten zur Laufzeit und ohne Spannung gehalten werden, wird ja
gerade recherchiert ;)
Hallo,
Ich verstehe es nicht wo das Problem ist aber, ich würde ein re also
einfällt über der neuen Datenstruktur Sting, Zahl Zahl Zahl anlegen .
Wenn was anderes erfahren wolltest, müsstest du doch genauer sagen, was
das für Daten sind.
Strings sind ja auch nur Daten aus einer einander Kettung von Zeichen,
die mit einer 0 voneinander getrennt werden .
Karren Karl schrieb:> [...]> Im groben soll es so aussehen:>> Produktname, Wert1, Wert2, Wert3.>> Ein Array kommt, denke ich, nicht in Frage, da ja jeder Teil des Strings> in einer Arrayzelle abgelegt und es damit ziemlich groß wird.> In structs habe ich noch nicht so viele Erfahrungen, aber könnte man es> damit lösen?>> Vielen Dank für euere Hilfe.
Ja. Mit structs würde man sozusagen, die Anzahl der Variablen
verringern. Man könnte das eine strukturelle Organisation nennen.
Der benötigte Speicherplatz wird aber auf diese Weise nicht geringer,
als wenn Du die Werte in einzelnen Variablen speicherst oder in einem
Array.
Speicherplatz lässt sich allein durch strukturelle "Organisation" nicht
sparen. Dazu würde zusätzlicher Code nötig sein und dazu müssten viele
Daten gespeichert werden. Dann würde der Gesamtspeicherplatz geringer
sein, als wenn man die Daten in ihrer Ursprungsform (String, float,
integer) speichert.
Siehst Du! Das hat mir schon geholfen. Ich erstelle einfach ein
hinreichen großes Array, wo pro Zeile ein Produkt abgelegt wird und über
die Auswertung der Zeichen separiere ich die Daten, die ich für meine
Bearbeitung benötige.
Irgendwo habe ich da auch vor Jahren mal was gemacht.
Danke :)
Theor schrieb:> struct Produkt> char * Name;> float Wert1;> int Wert2;> float Wert3;> }
Das geht aber nur, wenn Name konstant ist. Soll er änderbar sein, muß
man Platz für die maximale Länge reservieren.
Hallo, noch eine Anmerkung:
Wenn man die Daten als char* schreibt, dann liegen sie im statischen
Speicher .
Wenn sie im Flash-Speicher liegen sollen, muss man das anders
organisieren insbesondere, da hier nur der Zeiger auf das Array von
Zeichen abgelegt wird.
Peter D. schrieb:> Theor schrieb:>> struct Produkt>> char * Name;>> float Wert1;>> int Wert2;>> float Wert3;>> }>> Das geht aber nur, wenn Name konstant ist.
Warum sollte man den nicht ändern können?
> Soll er änderbar sein, muß man Platz für die maximale Länge reservieren.
struct Produkt {
> char Name[10];> float Wert1;> int Wert2;> float Wert3;> };
Wesentlich hier ist nicht primär, dass die eine Variante eine
Größenangabe hat und die andere nicht, sondern, dass es zwei völlig
unterschiedliche Arten sind, den String zu halten.
Die erste Variante enthält nur einen Verweis auf den String, der dann
noch irgendwo anders liegen muss, die zweite enthält ihn direkt.
Spricht denn etwas gegen eine verkettete Struktur ?
struct products{
char Name[10];
float Wert1;
int Wert2;
float Wert3;
struct products *next;
}
VG,
Mathias
Peter D. schrieb:> Theor schrieb:>> struct Produkt>> char * Name;>> float Wert1;>> int Wert2;>> float Wert3;>> }>> Das geht aber nur, wenn Name konstant ist. Soll er änderbar sein, muß> man Platz für die maximale Länge reservieren.>
1
>structProdukt{
2
>charName[10];
3
>floatWert1;
4
>intWert2;
5
>floatWert3;
6
>};
7
>
Das wäre eine von mehreren Möglichkeiten. Richtig.
Man kann den Namen aber doch auch verändern, wenn man Zeiger verwendet.
So wie mit:
1
charName[10]
2
...
3
FLASH_StatusFLASH_ProgramByte(&Name,'A');// Erstes Zeichen in Name
4
...
der Name änderbar ist, geht das auch mit Zeigern.
1
char*Name;
2
...
3
FLASH_StatusFLASH_ProgramByte(Name,'A');// Erstes Zeichen in Name
4
...
oder sogar, um den Zeiger auf einen String zu ändern, den es im Flash
schon gibt:
Beim Schreiben in den Flash-Speicher muss natürlich noch mehr
berücksichtigt werden. Die tatsächliche Pointer-Grösse und die
Deklarationen. Das Speicherlayout im Linker-Script etcpp. Das ist hier
nur der erste grobe Schritt. Der Code ist in dieser Form nicht
kompilierbar.
Die Funktionen beziehen sich auf Deklarationen aus stm32f?xx_flash.c
Aber im wesentlichen geht es so.