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


von Thomas S. (thomass)


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
1
typedef uint8_t ExecuteDataFnct (uint8_t, uint8_t, uint8_t)
2
3
struct Daten {
4
     uint8_t adresse;
5
     uint8_t currentState;
6
     uint8_t outputState;
7
     uint8_t data1;
8
     uint8_t data3;
9
     uint8_t data4;
10
     ExecuteDataFnct execute;
11
}
12
13
struct Daten AllDaten[10];
14
#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

von Christian S. (doubleq)


Lesenswert?

Hallo Thomas,

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

Grüße Christian

von MeinerEiner (Gast)


Lesenswert?

Naja müsste doch einfach mit
1
anzahl = sizeof(Arrayname) / sizeof(Structname)
gehen?

von Klaus W. (mfgkw)


Lesenswert?

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

von Thomas S. (thomass)


Lesenswert?

Christian S. schrieb:
>
1
> #define NR_ALLDATA 10
2
> struct Daten AllDaten[NR_ALLDATA];
3
>
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.
1
for(i=0;i<10;i++) {
2
     if(!(AllData[i].adresse)) {
3
          AnzahlDaten = i;
4
          break;
5
     }
6
}

Gibt es hier auch eine elegantere Lösung?

Thomas

von (prx) A. K. (prx)


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.

von Oliver (Gast)


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

von Christian S. (doubleq)


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?

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.