Forum: Mikrocontroller und Digitale Elektronik struct übertragen in Array


von Markus Schmidt (Gast)


Lesenswert?

Hallo habe eine Frage wie überträgt amn aus einem struct ein Array auf
eine Variablen array der selben größe?

struct
{int eins;
 int zwei;
 int drei[50];
}zahlen;

int ziffer_drei[50];

Also ich möchte gerne den Inhalt von drei der Variablen ziffer_drei
zuweisen!
Danke für eure Antworten.

von Berti (Gast)


Lesenswert?

Entweder Pointer oder ne nette for schleife...

von inoffizieller WM-Rahul (Gast)


Lesenswert?

In einer Schleife kopiert man die Werte des einen Feldes in das andere.

for(i=0;i<50;i++) ziffer_drei[i] = zahlen.drei[i];

Interessant wird es, wenn man keine Kopie, sondern mit einer Referenz
(Pointer) arbeitet...

von Markus Schmidt (Gast)


Lesenswert?

Ich benutze einen Zeiger auf die unterschiedlichen structs! Also da gibt
es mehrere von ist das ein problem?

von inoffizieller WM-Rahul (Gast)


Lesenswert?


von inoffizieller WM-Rahul (Gast)


Lesenswert?

Sagen wir es so: Willst du eine Kopie des Array anlegen oder dessen
Werte "nur" ausgeben?

von Markus Schmidt (Gast)


Lesenswert?

Ich möchte eine Kopie des struct array's anlegen genau!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Ich möchte eine Kopie des struct array's anlegen

Nimm die "for-Schleife" (oder heissen die inzwischen
"for-Abfragen"?)

von Markus Schmidt (Gast)


Lesenswert?

Und das geht auch wenn ich mit einem zeiger arbeite?
brauche glaub ich ein wenig Bespielcode!
MfG Markus

von inoffizieller WM-Rahul (Gast)


Lesenswert?


von Xenu (Gast)


Lesenswert?

memcpy(ziffer_drei,zahlen->drei,sizeof(int)*50);

von Xenu (Gast)


Lesenswert?

"zahlen->drei" ist natürlich verkehrt. Anstatt "zahlen" muss
der Name Deines Pointers stehen.

von Karl heinz B. (kbucheg)


Lesenswert?

> Und das geht auch wenn ich mit einem zeiger arbeite?

Das eine hat mit dem anderen nichts zu tun.

Wenn du eine struct hast:

struct MeineZahlen {
 int eins;
 int zwei;
 int drei[50];
};

und eine Variable von diesem Datentyp ...

struct MeineZahlen zahlen;

... dann greift man mit der '.' Syntax auf die Elemente von zahlen
zu:

   zahlen.eins = 1;
   zahlen.zwei = 2;

Hat man aber einen Pointer auf so eine Struktur ...

struct MeineZahlen * ptrZahlen;
(ptrZahlen zeigt natürlich tatsächlich auf so eine Struktur)

... dann muss man den Pointer dereferenzieren um an die struct
zu kommen und von dort ein Element auszuwerten:

    (*ptrZahlen).eins = 1;
    (*ptrZahlen).zwei = 2;

die Klammern sind absolut notwendig, da die Operatorenprioritaeten
sondt für eine falsche Interpretation sorgen würden.

Da dieses

    (*ptrZahlen).eins = 1;

aber eine blöde Schreiberei ist, hat man genau für dieses eine
eigene Schreibweise eingeführt, damit man da nicht künstlich
Klammern schreiben muss:

    ptrZahlen->eins = 1;

Das Prinzip ist:
   Pointer->
liefert dir das worauf der Pointer zeigt im Falle einer Struktur.
Und nach dem -> schreibst du dann die Komponente der Struktur
mit der du arbeiten möchtest. Ob das jetzt ein int ist oder
ein Array von int, oder ein string spielt für das Aufsuchen
der Komponente keine Rolle. Erst dann wenn du die Komponente hast

    ptrZahlen->drei

bestimmt die Komponente was man mit ihr anstellen kann. Das hat
aber nichts mit dem Aufsuchweg zu tun, bis man bei der Komponente
angelangt ist.

    ptrZahlen->drei

ist ein Array. Und Arrays kann man in C nicht direkt zuweisen,
sondern man muss das machen was man mit jedem Array machen
muss: Die Array-Elemente einzeln umkopieren oder einen memcpy
benutzen, der auch nichts anderes macht als in einer Schleife
umzukopieren. Nur arbeitet halt ein memcpy auf Byte-Ebene
während einer for-Schleife halt auf der Ebene des Datentyps im
Array angesiedelt wird (bei einem int-Array werden int kopiert,
bei einem double Array werden double kopiert, etc.)

von Karl heinz B. (kbucheg)


Lesenswert?

> (oder heissen die inzwischen "for-Abfragen"?)

Der war gut .-)

von Markus Schmidt (Gast)


Lesenswert?

Danke habe verstanden!

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.