mikrocontroller.net

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


Autor: Struki (Gast)
Datum:

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

Autor: Philipp Burch (philipp_burch)
Datum:

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

Autor: Struki (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn "struct {...}" in beiden Fällen gleich ist, dann kannst Du ein 
Array von Strukturen definieren - und sowas scheinst Du ja vermutlich 
vorzuhaben.
struct blafusel
{
  int laber;
  char schwafel;
};


struct blafusel meintollesarray[4];

for (i = 0; i < 4; i++)
{
  meintollesarray[i].laber = i;
}

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

Autor: Struki (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
struct bla 
{
  int fusel;
};

struct laberschwall
{
  float wasauchimmer;
};

struct gurkenhobel
{
  unsigned long wert;
};

Aus diesen Strukturen kann nun eine Metastruktur erzeugt werden
enum Typkennung 
{
  tBla,
  tLaberschwall,
  tGurkenhobel
};

struct Monster
{
  enum Typkennung typ;
  union
  {
    struct bla sBla;
    struct laberschwall sLaberschwall;
    struct gurkenhobel sGurkenhobel;
  } inhalt;
};

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

Und so wird was in dieses Array hineingeschrieben
MeinArray[4].typ = tGurkenhobel;
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.




Autor: Struki (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Struki (Gast)
Datum:

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

Autor: Philipp Burch (philipp_burch)
Datum:

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

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.