Forum: Mikrocontroller und Digitale Elektronik von einer struktur zur nächsten springen


von Struki (Gast)


Lesenswert?

hi
ich habe in c veschiedenen strukturen angelegt insgesamt
10 stück nun möchte ich mit hilfe einer for schleife
die strukturen einzeln nacheinader abarbeiten
weis jemand wie das geht?
mfg

von Philipp B. (philipp_burch)


Lesenswert?

Hm, Array? Zeig doch mal den Code, ich blick' net so recht, wie das 
aussehen soll.

von Struki (Gast)


Lesenswert?

code hab ich noch keinen nur so ideen
int i;
struct { ...} mikrocontroller[i];
struct { ...} mikrocontroller[i+1];
usw
und das ganze dann in einer for schleife
nacheinander bearbeuten
 for(i =0 ;i< = 11 ;i++)
mikrocontroller[i].bla ...
....

also das geht natürlich so nicht geht ist mir klar aber wie macht mans 
richtig

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn "struct {...}" in beiden Fällen gleich ist, dann kannst Du ein 
Array von Strukturen definieren - und sowas scheinst Du ja vermutlich 
vorzuhaben.
1
struct blafusel
2
{
3
  int laber;
4
  char schwafel;
5
};
6
7
8
struct blafusel meintollesarray[4];
9
10
for (i = 0; i < 4; i++)
11
{
12
  meintollesarray[i].laber = i;
13
}

Das ist jetzt nur eine Vermutung - Deine Frage ist so extrem ungenau 
formuliert, daß es durchaus sein kann, daß ich sie nicht verstanden 
habe.


Literaturhinweis:

Kernighan & Ritchie, Programmieren in C, 2. Auflage, Hanser-Verlag

von Struki (Gast)


Lesenswert?

hallo ich glaube das würde sogar funktionieren
ich werds mal testen
was gäbe es für eine lösung wenn die struct nicht gleich ist?

zb

struct { ...} mikrocontroller[1];
struct { ...} mikrocontroller[2];
mfg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das geht so gar nicht, Du deklarierst zwei Arrays mit gleichem Namen.

Außerdem ist ein Array mit genau einem Element nicht wirklich sinnvoll 
...

Da C nicht erst zur Laufzeit Informationen über die verwendeten 
Variablen erhält, ist es auch nicht möglich, in einem Array 
gewissermaßen unterschiedliche Strukturen abzulegen.

Das ginge nur auf dem platzverschwendenden Weg der Unions und müsste mit 
einer zusätzlichen Strukturtypkennung garniert werden:
1
struct bla 
2
{
3
  int fusel;
4
};
5
6
struct laberschwall
7
{
8
  float wasauchimmer;
9
};
10
11
struct gurkenhobel
12
{
13
  unsigned long wert;
14
};

Aus diesen Strukturen kann nun eine Metastruktur erzeugt werden
1
enum Typkennung 
2
{
3
  tBla,
4
  tLaberschwall,
5
  tGurkenhobel
6
};
7
8
struct Monster
9
{
10
  enum Typkennung typ;
11
  union
12
  {
13
    struct bla sBla;
14
    struct laberschwall sLaberschwall;
15
    struct gurkenhobel sGurkenhobel;
16
  } inhalt;
17
};

Davon kann ein Array angelegt werden
1
struct Monster MeinArray[10];

Und so wird was in dieses Array hineingeschrieben
1
MeinArray[4].typ = tGurkenhobel;
2
MeinArray[4].inhalt.sGurkenhobel.wert = 12;

Das ist aber eher von theoretischem Nutzen, da es ineffizient mit 
Speicher umgeht, wenn die in der Union zusammengefassten Strukturen 
unterschiedlich groß sind. Auch ist das ganze sehr fehlerträchtig, da 
vor jedem Zugriff der Typ der nun tatsächlich verwendeten Struktur 
überprüft werden muss.

Ein Datenmodell, das eine derartigen Aufbau erfordert, sollte noch mal 
überarbeitet werden.




von Struki (Gast)


Lesenswert?

hi
ursprünglich wars ja so geplant
struct { ...} mikrocontroller1;
struct { ...} mikrocontroller2;
struct { ...} mikrocontroller3;
struct { ...} mikrocontroller4;
............


ich hab nen avr prozessor und an diesem hängen 10 weiter at98c 
prozessoren
verbunden als i2c bus. (das ganze funzt auch)

ich möchte nun 10 structs anlegen die dann die daten für die jeweilligen 
prozesoren
enthalten  das ganze möchte ich über eine for schleife hinaus schieben
aber wie komme ich mit ner for schleufe  von mikrocontroller1 zu 
mikrocontroller2
mfg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das geht so erst recht gar nicht.

In C kann der Name einer Variablen nicht zur Laufzeit bestimmt werden 
und ebenso ist der Zugriff auf eine Variable mit einem zur Laufzeit 
generierten Namen nicht möglich.

Inwiefern unterscheidet sich denn das, was Du praktischerweise nur durch 
Punkte andeutest? Unterscheidet es sich denn überhaupt, und wir reden 
nur aneinander vorbei?

Wenn sich die Strukturen unterscheiden, wie stellst Du Dir dann den 
Zugriff auf die Strukturelemente innerhalb der for-Schleife vor?
Mal angenommen, die erste Struktur hat ein Strukturelement a, die zweite 
aber nicht - was soll dann innerhalb der Schleife damit geschehen?

Literaturhinweis: Ein Buch zum Thema "Algorithmen und Datenstrukturen in 
C"

von Struki (Gast)


Lesenswert?

du hast recht das ist ja auch der grund warum ich hier im forum danach 
frage

bzw ich wäre ja auch für ne andere lösung offen
die struktur elemente unterscheiden sich ebenfalls (auch da haste recht)

wie würdest du sowas machen?

ich hab mir zb gedacht das ich keine struktur verwende
sonder ein einfaches feld[i]
in den jeweiligen feldern sind dann die daten zum verschieken
das wäre allerdings bei 10 proztessoren sehr kompliezeirt

von Philipp B. (philipp_burch)


Lesenswert?

Hm, vielleicht solltest du mal genau beschreiben, was du denn 
schlussendlich tun willst, denn so ist das alles relativ konfus.

edit: Falls du einfach einen Datenstrom hast, den du in verschiedene 
Strukturen packen willst, je nachdem was es jetzt eben ist, dann ist ein 
Cast dein Freund. Ist allerdings nicht ganz ungefährlich, im 
Zweifelsfall schreibt man sich dazu eine entsprechende Funktion, die 
auch die richtige Byteorder und all das Zeugs berücksichtigt.

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.