Forum: Mikrocontroller und Digitale Elektronik C: array in array of arrays schreiben


von traumichnichtsagenwerichbin (Gast)


Lesenswert?

Hallo!
Es ist mir fast peinlich aber ich hab einen Knopf im Hirn und es ist 
irgendwie sauschwer das in Google zu suchen (array in array of arrays 
blablabla).
1
#define BUFFER_SIZE 8
2
3
uint16_t pot_buffer[BUFFER_SIZE][4];
4
5
uint16_t pottest[4];
6
pottest[0] = 123;
7
pottest[1] = 456;
8
pottest[2] = 789;
9
pottest[3] = 169;
10
11
pot_buffer[1].potstates = pottest; //ERROR

ERROR: left operand of '.' is not struct/class/union object

Also ich seh hier ein mehrdimensionales Array, meiner Auffassung nach 
besteht das aus 8 Einträgen mit Pointern zu Arrays mit Grösse 4.
Wo ist mein Denkfehler?
Peinlich peinlich.

von traumichnichtsagenwerichbin (Gast)


Lesenswert?

oh nochdazu im falschen Thread gepostet...

von traumichnichtsagenwerichbin (Gast)


Lesenswert?

uh ich seh grad das ist garnicht das initiale Problem, da hab ich schon 
was mit structs probiert.
1
pot_buffer[1] = pottest;

Das war das ursprüngliche Problem
ERROR: invalid lvalue of assignment operation

von TestX (Gast)


Lesenswert?

Fehlermeldung lesen... du versuchst auf das nicht-existierende attribut 
".potstates" zuzugreifen ...

Außerdem solltest du dir überlegen ob du die werte KOPIEREN oder 
REFERENZIEREN willst...momentan versuchst du das letztere... und dafür 
ist das erste array auch falsch initialisiert ...

von traumichnichtsagenwerichbin (Gast)


Lesenswert?

TestX schrieb:
> Fehlermeldung lesen... du versuchst auf das nicht-existierende
> attribut
> ".potstates" zuzugreifen ...
>
> Außerdem solltest du dir überlegen ob du die werte KOPIEREN oder
> REFERENZIEREN willst...momentan versuchst du das letztere... und dafür
> ist das erste array auch falsch initialisiert ...

Eh siehe mein Antwortpost. Demnach muss ich das Array mit Schleife 
kopieren?

von traumichnichtsagenwerichbin (Gast)


Lesenswert?

Ok ich habs im Internet gefunden. Das stichwort war COPY. Manchmal ist 
es in C recht schwer was zu suchen weil die Probleme recht schwer in 
Worte zu fassen sind (ohne da jetzt was ganz generelles zu suchen).
Danke! Gottseimitdir.

von Stefan F. (Gast)


Lesenswert?

Array befüllen ist in C tatsächlich nicht so intuitiv, wie in anderen 
gängigen Sprachen. Du musst wie bereits erkannt die Werte kopieren, und 
dazu eigent sich die Funktion memcpy() sehr gut.

Je nach Hardware ist memcpy() sogar erheblich schneller, als eine 
for-schleife, weil dazu eben spezielle Hardware mit benutzt wird (zum 
Beispiel auf PC's).

von traumichnichtsagenwerichbin (Gast)


Lesenswert?

danke für den tipp. Wie finde ich (zb für eine gegebene 
Mikrocontrollerarchitektur) heraus ob memcopy auf Hardwarebefehle 
zurückgreifen kann?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

In den Sourcen der Standardlibrary des verwendeten Compilers nachsehen.

Oder ein minimalistisches Testprogramm schreiben und das so übersetzen, 
daß der Compiler ein Assemblerlisting ausspuckt.

Andererseits:

Welche Hardwarearchitektur sollte memcpy ohne "Hardwarebefehle" 
umsetzen müssen?

von Falk B. (falk)


Lesenswert?

Im Idealfall sthet das in der jeweiligen Dokumentation des Compilers, 
genauer, in der Doku der libc, die jeder Compiler hat.

von traumichnichtsagenwerichbin (Gast)


Lesenswert?

@rufus: ich hab naiverweise angenommen dass einfache Mikrocontroller 
memcpy wie eine Schleife übersetzen.

Ich sehe aber ein dass memcpy wohl die bessere Variante ist wenn man 
bedenkt dass man irgendwann auf irgendwas Leistungsfähigeres 
übersiedelt.

von Walter S. (avatar)


Lesenswert?

traumichnichtsagenwerichbin schrieb:
> pottest[0] = 123;
> pottest[1] = 456;
> pottest[2] = 789;
> pottest[3] = 169;

falls deine 4 Werte eigentlich ein struct sind, also z.B. so was wie
pottest.x0 = 123;
pottest.y0 = 456;
pottest.x1 = 789;
pottest.y1 = 169;

dann funktioniert eine Zuweisung per
pot_buffer[1] = pottest;

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

traumichnichtsagenwerichbin schrieb:
> ich hab naiverweise angenommen dass einfache Mikrocontroller memcpy wie
> eine Schleife übersetzen.

Na, das wird immer passieren. Daß dafür DMA verwendet wird, quasi am 
Prozessorkern vorbei, das ist eher auszuschließen - welcher Compiler 
weiß schon, was DMA ist?

Manche Architekturen haben auf Speicherkopier-/Verschiebeoperationen hin 
optimierte Schleifenbefehle, andere nicht.

Und? Wo ist das Problem? Soll Dein Programm ständig und dauernd 
irgendwelche Blöcke im Speicher herumkopieren?

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.