Makro zum Simulieren des zweidimensionalen Zugriffsfeldes in C

8

OpenCL bietet nur Zugriff auf eindimensionale Arrays mit den C99-Spezifikationen. Mein Problem ist jedoch in zwei Dimensionen und ich verwende zweidimensionale Arrays auf der Host-Seite

Anstatt meinen Code durch das Berechnen von Indizes weniger lesbar zu machen, möchte ich ein C-Makro verwenden, um das Element A[i][j] zu erhalten. Leider bin ich ziemlich schlecht darin und habe wenig Erfahrung in C. Ich denke, ich habe die allgemeine Vorstellung davon, wie es gemacht wird, aber wenn jemand es kritisieren könnte, würde es geschätzt werden.

Es wäre etwa so:

%Vor%

Dabei ist u die Matrix, y ist die Zeile und x ist die Spalte und das Makro gibt das zurück Wert bei u[y][x]

Die Matrix wird statisch zugewiesen, so dass das Makro eine WIDTH-Komponente hat.

%Vor%     
Robert 19.08.2011, 22:54
quelle

3 Antworten

6

Noch sauberer wäre es, für jedes Array, das Sie verwenden, ein Makro zu definieren, damit Sie es genau wie einen 2D-Array-Zugriff aussehen lassen können. Mit dem Array A würden Sie also definieren:

%Vor%

Beachten Sie die Klammern um die ersetzten Werte. Dies behandelt Fälle, in denen die Substitution ein Ausdruck ist, wie A(i + 1, j) . Ohne die Klammern würde dies zu A[i + 1*WIDTH + j] expandieren, was nicht das ist, was Sie wollen:

%Vor%

Um das gleiche Problem mit dem zweiten Argument zu vermeiden, sind beide im Substitutionstext in Klammern eingeschlossen.

    
Jeremy W. Sherman 19.08.2011 23:11
quelle
6

Da alle bisherigen Antworten auf eine konstante Breite basieren, ist hier eine (schwergewichtige) Lösung für Spalten mit beliebiger Breite:

%Vor%

Entarre das Array einfach mit free .

Natürlich können Sie auch ein Feld für die Höhe hinzufügen und unter anderem Grenzen überprüfen. Sie könnten diese auch als tatsächliche Funktionen schreiben oder ein Makro verwenden, um struct -Typen automatisch zu deklarieren, so dass Sie keinen anonymen struct -Typ für alles verwenden müssen. Wenn Sie es auf dem Stapel benötigen, können Sie alloca auf Kosten der Portabilität verwenden.

Wenn Sie eine konstante Matrixgröße haben, können Sie einige Casting-Hacks verwenden, um "native" 2D-Indizierung zu erreichen (über den Operator [] ):

%Vor%

Beachten Sie, dass dies im Gegensatz zu der anderen Lösung eine zweite Variable erzeugt, die wahrscheinlich nicht sehr sauber ist, aber ich denke, dass ich eine ziemlich klare Mangelmethode verwendet habe, damit sie in der Praxis nicht in die Quere kommt.

    
Chris Lutz 19.08.2011 23:32
quelle
2

Keine Kritik, Sie haben bereits die Lösung gegeben:

%Vor%

OK, vielleicht denke ich anders, aber ich würde es als

definieren %Vor%

Das ist aber nicht besser, nur eine Vorliebe.

    
Rudy Velthuis 19.08.2011 23:02
quelle