2016-04-29 12 views
2

Es gibt eine solche Anordnung in C-Code definiert: u8 palette[4][4];Was ist C# analog für den zweidimensionalen Array-Zugriff von C: palette [val & 3]?

später ein Element wie das zugegriffen: palette[ val & 3 ]

In C-Code ist es so verwendet: memcpy(dest3+12, palette[ val & 3 ], 4);

Ich verstehe nicht, welches Element zugegriffen wird über diesen Code. Ich habe versucht, das gleiche in C#, aber es sagt mir Wrong number of indices inside []; exptected 2

+0

Was ist mit 'val% 3'? – rhughes

Antwort

2

In C wäre palette nur ein Zeiger, jederzeit dereferenzierbar. pallete[i] ist in C auch für u8 palette[4][4]; gültig. Wenn Sie jedoch in C# byte[,] palette = new byte[4,4]; deklarieren, müssen Sie ordnungsgemäß zwei Indizes verwenden, um auf das Array zuzugreifen. Möglicherweise möchten Sie Ihre palette in C# als flaches Array byte[] palette = new byte[4*4] und für pallete[x,y] schreiben Sie palette[y*4 + x].

+0

Danke. Jetzt verstehe ich, was dort vor sich geht. – Kosmos

1

palette ist ein Quadrat matix 4x4.

Mit val & 3 werden nur die ersten 2 Bit des val Variablenwerts berücksichtigt. Das heißt, Sie greifen auf den maximalen Index 0x03 zu.

Welcher Wert auch val hat, nur die ersten 2 Bits werden berücksichtigt.

ZB wenn val 8-Bit-weise ist:

val 
0b11111100 & 3 = 0b00000000 
0b11111101 & 3 = 0b00000001 
0b11111110 & 3 = 0b00000010 
0b11111111 & 3 = 0b00000011 

Ihr Code das Array Zeile für Zeile zugreift.

+1

Vielen Dank für die Erklärung, aber ich habe keine andere Sache verstanden. Wie es möglich war, dass zweidimensionaler Array durch einzelnen Index zugegriffen wurde.Auf welchen Index genau wurde so zugegriffen. Aber Maximilian Gerhardt hat mir das erklärt. – Kosmos

4

In C können Sie auf bestimmte Zeile im Array zeigen, weil C-Array nur eine Sequenz von Elementen ist. Zwei aufeinanderfolgende Arrays sind wiederum nur eine Abfolge von Elementen, und deshalb ist es möglich, in C auf das Sub-Array zuzugreifen. Deshalb können Sie die Größe eines Arrays in C nicht direkt vom Array-Pointer abrufen. In C# gibt es zwei Typen von "multidimensionalen" Arrays: Multidimensional arrays und Jagged Arrays.

Klassisches multidimensionales kann nicht nur durch Unterindex zugreifen, weil Array in C# nicht nur eine Abfolge von Elementen ist, sondern auch eine header in which contain size of array, type pointer and sync block. Zwei nachfolgende C# -Arrays enthalten einen Header und das C# -Array-Format wird nicht erfüllt.

Jagged array ist Array von Arrays und Sie können auf Sub-Array mit nur Sub-Index in ähnlicher Weise wie C# zugreifen.

Equivalent Code in C# wäre:

byte[][] palette = new byte[4][]; 

for (int i = 0; i < palette.Length; i++) 
{ 
    palette[i] = new byte[4]; 
} 

byte[] destination = new byte[4]; 

int val = 1; 
Array.Copy(palette[val & 3], 0, destination, 12, 4); 

Beachten Sie, dass in memcpy sind Parameter in der Reihenfolge: Ziel, Quelle während in Array.Copy Parameter sind in umgekehrter Reihenfolge: Quelle, Ziel

+0

Danke für die gute Antwort. Ich fühle mich schlecht, akzeptierte Antwort von einer anderen Person wegzunehmen und kann das nicht tun. – Kosmos

+0

Kein Problem, ich werde vielleicht ein Abzeichen bekommen, um mehr Stimmen zu bekommen als angenommene Antwort :-) – qub1n