Purebasic und C - Zeiger auf Zeiger

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Purebasic und C - Zeiger auf Zeiger

Beitrag von Makke »

Hallo zusammen,

folgende Struktur möchte ich gerne in PureBasic abbilden um mit einer DLL, die ich aus freiem C Code erstellt habe, zu arbeiten (testen):

Die C Struktur

Code: Alles auswählen

/* archive structure used since diablo 1.00 by blizzard. */
struct mpq_archive {

	/* generic file information. */
	FILE		*fp;			/* file handle. */

	/* generic size information. */
	uint32_t	block_size;		/* size of the mpq block. */
	off_t		archive_offset;		/* absolute start position of archive. */

	/* archive related buffers and tables. */
	mpq_header_s	mpq_header;		/* mpq file header. */
	mpq_header_ex_s	mpq_header_ex;		/* mpq extended file header. */
	mpq_hash_s	*mpq_hash;		/* hash table. */
	mpq_block_s	*mpq_block;		/* block table. */
	mpq_block_ex_s	*mpq_block_ex;		/* extended block table. */
	mpq_file_s	**mpq_file;		/* pointer to the file pointers which are opened. */

	/* non archive structure related members. */
	mpq_map_s	*mpq_map;		/* map table between valid blocks and hashes. */
	uint32_t	files;			/* number of files in archive, which could be extracted. */
};
Und hier die PB Struktur:

Code: Alles auswählen

;- archive structure used since diablo 1.00 by blizzard.
Structure mpq_archive
    ; generic file information.
    *fp     ; file handle. Type: FILE
    
    ; generic size information.
    block_size.l        ; size of the mpq block.
    archive_offset.q    ; absolute start position of archive.
    
    ; archive related buffers and tables.
    mpq_header.mpq_header_s             ; mpq file header.
    mpq_header_ex.mpq_header_ex_s       ; mpq extended file header.
    *mpq_hash.mpq_hash_s                ; hash table.
    *mpq_block.mpq_block_s              ; block table.
    *mpq_block_ex.mpq_block_ex_s        ; extended block table.
    *mpq_file.mpq_file_s                ; pointer to the file pointers which are opened.
    
    ; non archive structure related members.
    *mpq_map.mpq_map_s      ; map table between valid blocks and hashes.
    files.l                 ; number of files in archive, which could be extracted.
EndStructure
Die mpq_file Variable ist (in C) ein Zeiger auf einen Zeiger. Wie kann ich das auf PureBasic verwirklichen?

Das wäre die erste Frage, Danke schonmal für die Antworten.

Die zweite Frage handelt sich um eine weitere Struktur. Die Original Struktur in C sieh wie folgt aus:

Code: Alles auswählen

/* file structure used since diablo 1.00 (0x38 bytes). */
typedef struct {
	uint32_t	seed;			/* seed used for file decrypt. */
	uint32_t	*packed_offset;		/* position of each file block (only for packed files). */
	uint32_t	open_count;		/* number of times it has been opened - used for freeing */
} PACK_STRUCT mpq_file_s;
Diese habe ich in PureBasic wie folgt übersetzt:

Code: Alles auswählen

;- file Structure used since diablo 1.00 (0x38 bytes). */
Structure mpq_file_s Align 4
    seed.l              ; seed used for file decrypt.
    *packed_offset      ; position of each file block (only for packed files). Pointer type is: uint32_t
    open_count.l        ; number of times it has been opened - used for freeing
EndStructure
Die Adresse soll ein unsigned int (32 bit) also 4 bytes sein. Wenn ich mit dem 64 bit Compiler (von PB) kompiliere, wird das aber eine 8 byte große Adresse. Kann ich da um 4 bytes zu erzwingen das Align benutzen oder muss ich mich nicht darum kümmern? Die DLL habe ich mit einem gcc in 64bit Modus kompiliert. Mit dem Align schien mir das beim runterschreiben eine gute Idee zu sein. Beim genauer nachdenken, jedoch nicht. ;-)

Ich bedanke mich schonmal für Eure Hilfe
---
Windows 11 (64 bit)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Purebasic und C - Zeiger auf Zeiger

Beitrag von STARGÅTE »

Makke hat geschrieben: 18.02.2024 15:34 Die mpq_file Variable ist (in C) ein Zeiger auf einen Zeiger. Wie kann ich das auf PureBasic verwirklichen?
In PureBasic gibt es den Typ "Pointer", also der Name mit einem *. In PureBasic hat das aber kein besondere Bedeutung, was hinter diesem Pointer steck. Das einzige was ihm mitgegeben werden kann ist eine Struktur des Zielorts des Pointers.
Wenn ich den Kommentart wörtlich nehme, würde das in PureBasci so aussehen:

Code: Alles auswählen

Structure PointerArray
	*p[0]  ; undefined length of pointers
EndStructure

Structure
	*mpq_file.PointerArray  ; pointer to a list of pointers.
EndStructure
In deiner zweiten Frage ist das Pointer fehl am Platz.
Da es sich um eine Position handeln soll und scheinbar immer genau 32 bit lang sein soll, wäre die Struktur nur:

Code: Alles auswählen

Structure mpq_file_s
    seed.l              ; seed used for file decrypt.
    packed_offset.l      ; position of each file block (only for packed files). Pointer type is: uint32_t
    open_count.l        ; number of times it has been opened - used for freeing
EndStructure
Btw: unsigned gibt es nicht in PureBasic, das ist für die Nutzung der DLL aber auch wurscht.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Purebasic und C - Zeiger auf Zeiger

Beitrag von mk-soft »

Und dann wohl noch "Structure mpq_archive Align #PB_Structure_AlignC"
Bin mir aber nicht sicher bei dieser Struktur ...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Re: Purebasic und C - Zeiger auf Zeiger

Beitrag von Makke »

Hallo,

vielen Dank für die schnellen Antworten. Ich habe die Strukturen jetzt wie folgt erstellt:

Code: Alles auswählen

;- file Structure used since diablo 1.00 (0x38 bytes). */
Structure mpq_file_s; Align 4
    seed.l              ; seed used for file decrypt.
    packed_offset.l     ; position of each file block (only for packed files). Pointer type is: uint32_t
    open_count.l        ; number of times it has been opened - used for freeing
EndStructure

Structure mpq_file_pa
    *pa.mpq_file_s[0] ; undefined length of pointers
EndStructure

;- archive structure used since diablo 1.00 by blizzard.
Structure mpq_archive Align #PB_Structure_AlignC
    ; generic file information.
    *fp     ; file handle. Type: FILE
    
    ; generic size information.
    block_size.l        ; size of the mpq block.
    archive_offset.q    ; absolute start position of archive.
    
    ; archive related buffers and tables.
    mpq_header.mpq_header_s             ; mpq file header.
    mpq_header_ex.mpq_header_ex_s       ; mpq extended file header.
    *mpq_hash.mpq_hash_s                ; hash table.
    *mpq_block.mpq_block_s              ; block table.
    *mpq_block_ex.mpq_block_ex_s        ; extended block table.
    *mpq_file.mpq_file_pa               ; pointer to the file pointers which are opened.
    
    ; non archive structure related members.
    *mpq_map.mpq_map_s      ; map table between valid blocks and hashes.
    files.l                 ; number of files in archive, which could be extracted.
EndStructure
Das Align in der Hauptstruktur hinzugefügt und dieses Pointer Array umgesetzt.

Vielen Dank nochmal. Ich teste jetzt damit.
---
Windows 11 (64 bit)
Antworten