Wert in Matrix ablegen

Gast #2182632
Lesenswert?

Hallo ich hab mir das so voegestellt:

struct a{int zahl:2,};
struct b{a senkrecht[2]};
struct c{b waagrecht[4]};

Nur wie bekomme ich meinen 16 bit Wert am besten hier rein?
Möchte es ohne Maskieren machen wenn das geht? hat einer eine Idee 
hierzu?
#2182670
Lesenswert?

C_Anfänger schrieb:
> struct a{int zahl:2,};
> struct b{a senkrecht[2]};
> struct c{b waagrecht[4]};

Das funktioniert so aber nicht, weil ein struct immer "aufgerundet" 
wird. Wie genau haengt von der verwendeten Prozesso-Architektur ab. So 
wird oft auf ganze 32 bit Worte aufgerundet.

Testweise koennte man sich zum Beispiel mal sizeof(a), sizeof(b) und 
sizeof(c) ausgeben lassen.

Normalerweise implementiert man so etwas mit Zugriffsfunktionen, die das 
entsprechende maskieren uebernehmen.
#2182729
Lesenswert?

C_Anfänger schrieb:
> hallo und wie würde das ganze dann aussehen?

Mal sehen:
1
#include <stdint.h>
2

3
static uint16 val;
4

5
uint16_t GetElement(unsigned int x, unsigned int y)
6
{
7
  return (val >> (x * 4 + y) * 2) & 3;
8
}
9

10
void SetElement(unsigned int x, unsigned int y, uint16_t n)
11
{
12
  unsigned int shift = (x * 4 + y) * 2;
13
  uint16_t mask = 3 << shift;
14
  val = (val & ~mask) | ((n & 3) << shift);
15
}

Irgendwie so müsste es gehen, wenn ich richtig verstanden habe was Du 
machen möchtest.
Gast #2182753
Lesenswert?

ALso die Aufgabenstellung ist so mein 16 bit Wert soll angeben welche 
Elemente in einer Matrix mit 0 , 1 oder -1 gefüllt sind.
00 = 0
01 = 1
10 = -1
11 ungültig
matrix c[2][4]
So wenn jetzt mein unit16 Wert so aussehen würde 1001000010100001
Müste ich die Daten wie folgt in der Matrix ablegen.
c[0][0] =10
c[0][1] =01
c[0][2] =00
c[0][3] =00
c[1][0] =10
c[1][1] =10
c[1][2] =00
c[1][3] =01
hierraus würde ich dann bestimmen ob es 0 ,1 oder -1 ist.
Gast #2182758
Lesenswert?

C_Anfänger schrieb:
> ALso die Aufgabenstellung
Hausaufgaben? Hier gibts Hilfe aber keinen fertigen Code (wollte ich nur 
mal erwähnt haben.)

 ist so mein 16 bit Wert soll angeben welche
> Elemente in einer Matrix mit 0 , 1 oder -1 gefüllt sind.
> 00 = 0
> 01 = 1
> 10 = -1
> 11 ungültig
> matrix c[2][4]
> So wenn jetzt mein unit16 Wert so aussehen würde 1001000010100001
> Müste ich die Daten wie folgt in der Matrix ablegen.
> c[0][0] =10
> c[0][1] =01
> c[0][2] =00
> c[0][3] =00
> c[1][0] =10
> c[1][1] =10
> c[1][2] =00
> c[1][3] =01
> hierraus würde ich dann bestimmen ob es 0 ,1 oder -1 ist.

Denk dir doch erstmal eine eindimensionale Matrix und packe die Elemente 
gedanklich hintereinander:
1
c[0] c[1] c[2] c[3]
2
 00   01   10   01
Vergleiche mit deinem uint16_t-Wert: 00011001. Fällt dir was auf? 
Einfache Bitschieberei. 2-dimensional wird es etwas komplizierter aber 
das Prinzip bleibt gleich.

Mache es wie Kai S., eine Funktion GetElement und eine Funktion 
SetElement.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren