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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Karren Karl (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Müssen die Daten im Betrieb geändert werden ?

von Mathias _. (mathias1988)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.