C Arrays (PB mit C Backend)

Für allgemeine Fragen zur Programmierung mit PureBasic.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

C Arrays (PB mit C Backend)

Beitrag von ccode_new »

Hi Leute!

Gibt es eine einfache Möglichkeit direkt auf in C deklarierte Arrays (Inline) zuzugreifen?

Beispiel:

Code: Alles auswählen

Define.c test

!char a_keys[4][4] = {  //key code
!  {'1','2','3','A'},
!  {'4','5','6','B'},
!  {'7','8','9','C'},
!  {'*','0','#','D'}
!};

!v_test = a_keys[1][0];

Debug Chr(test)
Wie kann man direkt auf a_keys zugreifen?

Danke!
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: C Arrays (PB mit C Backend)

Beitrag von ccode_new »

Code: Alles auswählen

;???
Procedure.i getArray(x.i, y.i)
  !char a_keys[4][4] = {  //key code
  !  {'1','2','3','A'},
  !  {'4','5','6','B'},
  !  {'7','8','9','C'},
  !  {'*','0','#','D'}
  !};
  !return a_keys[v_x][v_y];
EndProcedure

Debug Chr(getArray(2,3)) ;C

;Ich denke ich bleibe erstmal bei dieser Lösung:
Dim keys.b(3, 3)
CopyMemory(?keys, @keys(), ?keys_end - ?keys_start)

DataSection
  keys:
  keys_start:
  Data.b '1','2','3','A'
  Data.b '4','5','6','B'
  Data.b '7','8','9','C'
  Data.b '*','0','#','D'
  keys_end:
EndDataSection

Debug Chr(keys(2, 3)) ;C
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: C Arrays (PB mit C Backend)

Beitrag von juergenkulow »

Code: Alles auswählen

//C Feld mit Tasten. 
char a_keys[4][4] = {   {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} };//key code

Code: Alles auswählen

gcc -c a_keys.c

Code: Alles auswählen

; C Array a_keys
Import "/tmp/a_keys.o" ; Bitte anpassen.
  a_keys 
EndImport

Procedure.i getArray(x.i, y.i)
  ! char *c=&a_keys; 
  ! return c[v_x+4*v_y];
EndProcedure

Debug Chr(getArray(3,2))
ShowMemoryViewer(@a_keys,16)
;C
;00000000006446C0  31 32 33 41 34 35 36 42 37 38 39 43 2A 30 23 44  123A456B789C*0#D

CompilerIf Not Defined(PB_Compiler_Backend,#PB_Constant)
  CompilerError "Bitte benutzen Sie PureBasic ab Version 6.00 Beta1" 
CompilerElseIf #PB_Compiler_Backend<>#PB_Backend_C
  CompilerError "Bitte stellen Sie auf C Backend um."
CompilerEndIf 
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: C Arrays (PB mit C Backend)

Beitrag von ccode_new »

@juergenkulow
Hallo!

Da hast sich ja jemand (von den wenigen Leuten die täglich die deutsche PB-Forum-Seite besuchen) Gedanken gemacht.
:mrgreen:

Aber mit deine Lösung wird es ja nur noch umständlicher.
Trotzdem finde ich dein Lösungskonzept sehr gut. ("Es funktioniert ja!")

Es wäre einfach nur schön wenn man z.B. mit:
!char a_keys[4][4] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} };

das Array erstellen könnte und danach einfach auf dieses Array mit PureBasic-Mitteln zugreifen könnte. (Wunschdenken)
z.Bsp.:
keys(1,2) = 'P'
oder
PrintN(keys(1,1)) ;5

Danke für deinen Lösungsvorschlag. :allright:

Anbei:
Ich finde sowieso diese "Import : EndImport", "Module", "Prototypes", oder "Pseudotypes" , etc. Dinge bei PureBasic sehr Geil.
Aber "Interfaces" schrecken mich bis jetzt immer etwas ab.
:D
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: C Arrays (PB mit C Backend)

Beitrag von juergenkulow »

Code: Alles auswählen

; Dynamische PureBasic Arrays unterscheiden sich von mehrdimensionalen C Arrays.
Import "/tmp/a_keys.o" ; Bitte anpassen.
  a_keys 
EndImport
Dim mykeys.b(3, 3) 
; typedef long long quad;
; typedef quad integer  ;
; typedef struct pb_array2 { void *a; integer b[2]; } pb_array2;
; pb_array2 a_mykeys={0}            ;
; a_mykeys.b[0]=4; 
; a_mykeys.b[1]=4; 
; SYS_AllocateMultiArray(2,1,1,0,&a_mykeys);
CopyMemory(@a_keys, @mykeys(), 16)
; integer p0=(integer)((integer)(&a_keys));
; integer p1=(integer)((char*)a_mykeys.a);
; integer rr0=PB_CopyMemory(p0,p1,16);
a.a=mykeys(2, 3)
; v_a=((char*)a_mykeys.a)[2*a_mykeys.b[0]+3];
Debug Chr(a)
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: C Arrays (PB mit C Backend)

Beitrag von ccode_new »

Hallöchen juergenkulow,

deine aktuelle Lösung ist so simple wie genial.

Damit ist einfaches auslesen und schreiben möglich.

Danke!
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten