www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Berechnung " Wieviel Datensätze sind in einer Struktur gespeichert"


Autor: Thomas S. (thomass)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie schon im Betreff geschrieben möchte ich gerne berechnen wieviele 
Datensätze in der Struktur gespeichert sind.
Ich habe eine Struktur die so aussieht
typedef uint8_t ExecuteDataFnct (uint8_t, uint8_t, uint8_t)

struct Daten {
     uint8_t adresse;
     uint8_t currentState;
     uint8_t outputState;
     uint8_t data1;
     uint8_t data3;
     uint8_t data4;
     ExecuteDataFnct execute;
}

struct Daten AllDaten[10];
#define NR_ALLDATA (sizeof(AllData) / (sizeof(*AllData))


Nun möchte ich nach der Initialisierung die Anzahl der Datensätze 
berechnen.
Hat vielleich jemand einen Ansatz oder Idee?

Danke

Thomass

Autor: Christian S. (doubleq)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,

warum nicht
#define NR_ALLDATA 10
struct Daten AllDaten[NR_ALLDATA];
?

Grüße Christian

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja müsste doch einfach mit
anzahl = sizeof(Arrayname) / sizeof(Structname)
gehen?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das Ganze natürlich nur, wenn er mit "Struktur" eigentlich "Feld" 
meint...

Autor: Thomas S. (thomass)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian S. schrieb:
>
> #define NR_ALLDATA 10
> struct Daten AllDaten[NR_ALLDATA];
> 
Hallo Christian.
auch diese Variante liefert nur die Größe der des Struct AllData.

In meinem Fall startet das Programm und registriert alle Slaves die sich 
im Bus befinden.
Dies kann einer sein oder maximal 10.
Nach dem scannen sind zB. 5 Slaves angeschlossen nun möchte ich die 
Anzahl gerne berechnen.
Ich habe es schon so probiert.
for(i=0;i<10;i++) {
     if(!(AllData[i].adresse)) {
          AnzahlDaten = i;
          break;
     }
}

Gibt es hier auch eine elegantere Lösung?

Thomas

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht nachher zählen, sondern beim Eintragen mitzählen und den Zähler 
global speichern. Wenn vorkommen kann, dass ein Slave im Nachhinein 
verschwinden wird es etwas komplizierter.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Gibt es hier auch eine elegantere Lösung?

Nö. Entwder direkt bei der Registrierung mitzählen, oder hinterher, wie 
du es im Beispiel gezeigt hast. Anders geht es nicht.

Oliver

Autor: Christian S. (doubleq)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ... Du hast ein array fester Größe, das Du aber nicht zwingend 
vollständig mit für Dich wichtigen Daten füllst, ja?

Dann bringen Dich Berechnungen mit sizeof nicht weiter, denn woher soll 
so eine Funktion wissen wie voll Dein array ist. Der Speicherplatz für 
10 Strukturen ist so oder so belegt, ob Du dann sinnvolle Daten 
reinpackst oder nicht spielt dann keine Rolle mehr.
Ich denke am sinnvollsten wäre es, noch eine Counter-Variable 
einzuführen in die direkt bei der Registrierung Deiner Slaves die 
gefundene Anzahl reingeschrieben wird, bzw ein Zähler bei jedem 
erkannten Slave um eins erhöht wird.

Wie Du es gemacht hast geht es natürlich auch, aber wieso Rechenzeit 
verschwenden um Werte auszurechnen, an die Du anders viel schneller und 
einfacher kommen kannst? Oder gibt es noch einen Grund warum eine 
Countervariable ausscheidet?

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.