Forum: Mikrocontroller und Digitale Elektronik Speichern von mehreren strings und integern


von Karren Karl (Gast)


Lesenswert?

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.

von Karl M. (Gast)


Lesenswert?

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?

von Karren Karl (Gast)


Lesenswert?

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 ;)

von Karl M. (Gast)


Lesenswert?

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 .

von Theor (Gast)


Lesenswert?

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.
1
struct Produkt
2
   char * Name;
3
   float Wert1;
4
   int Wert2;
5
   float Wert3;
6
}
7
8
struct Produkt VariableProdukt = {"Ü-Ei", 1.32, 17, 0.1834};
9
10
printf ("Produktname: %s\n", VariableProdukt.Name);
11
printf ("Preis      : %f\n", VariableProdukt.Preis);
12
printf ("Anzahl     : %d\n", VariableProdukt.Wert2);
13
printf ("Gewicht    : %f\n", VariableProdukt.Wert3);

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.

von Karren Karl (Gast)


Lesenswert?

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 :)

von Peter D. (peda)


Lesenswert?

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
 struct Produkt {
2
    char Name[10];
3
    float Wert1;
4
    int Wert2;
5
    float Wert3;
6
 };

von Karl M. (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Schorsch X. (bastelschorsch)


Lesenswert?

Müssen die Daten im Betrieb geändert werden ?

von Mathias _. (mathias1988)


Lesenswert?

Spricht denn etwas gegen eine verkettete Struktur ?

struct products{
     char Name[10];
     float Wert1;
     int Wert2;
     float Wert3;
     struct products *next;
}

VG,
Mathias

von Theor (Gast)


Lesenswert?

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
>  struct Produkt {
2
>     char Name[10];
3
>     float Wert1;
4
>     int Wert2;
5
>     float Wert3;
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
char Name[10]
2
...
3
FLASH_Status FLASH_ProgramByte(& Name, 'A'); // Erstes Zeichen in Name
4
...

der Name änderbar ist, geht das auch mit Zeigern.
1
char *Name;
2
...
3
FLASH_Status FLASH_ProgramByte(Name, 'A'); // Erstes Zeichen in Name
4
...

oder sogar, um den Zeiger auf einen String zu ändern, den es im Flash 
schon gibt:
1
char *Name;
2
...
3
FLASH_Status FLASH_ProgramWord((uint32_t) Name, & NeuerName);
4
...

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.

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
Noch kein Account? Hier anmelden.