[
struct _snd_pcm; /* Opakes Struct */
typedef struct _snd_pcm snd_pcm_t;
]
wolfgang bauer:
>Am 19.12.19 um 19:45 schrieb Sieghard Schicktanz:
>> Probabely an "opaque structure".
>Ja, das dachte ich mir dann auch. Um weiterzukommen, bin ich
>prinzipiell den Weg gegangen, den du hier vorschlägst:
>> Try an array of pointers to "snd_pcm_t".
>Ich lege ein "unsigned long"-Pointer-Array an und caste dann
>dort, wo es nötig ist.
Ich meine mich zu erinnern, dass es nicht garantiert ist, dass
ein »struct structname *« ohne Informationsverlust in einen
»unsigned long *« und zurück gewandelt werden kann. Es ist nicht
ausgeschlossen, dass »unsigned long«‐Objekte mit strikterem
Alignment angelegt werden als »struct structname«‐Objekte.
Deshalb kann es auch durchaus sein, dass zur Speicherung eines
»unsigned long *« weniger Bits verwendet werden als zur
Speicherung eines Zeigers auf ein Struct.
Desweiteren muss das Bitmuster eines Zeigers auf ein opak
deklariertes »struct mystruct«‐Objekt mit dem eines Zeigers auf
dasselbe, aber nicht opak deklarierte, Objekt übereinstimmen,
damit im folgenden Beispiel module.h die Deklaration von
myfunction zu ihrer Implementierung in module.c passt.
module.h:
struct my_struct;
extern void myfunction (struct mystruct *);
module.c:
#include "module.h"
struct my_struct
{
[…]
};
void myfunction (struct mystruct *p)
{
[…]
};
Weil der Compiler von einem opaken Struct genau nichts weiß, muss
er deshalb für jegliche (auch nicht opake) Structs für die
Bitdarstellung von Zeigern darauf das lascheste Alignment
annehmen, das bei Structs auftreten kann, selbst wenn ein
konkretes, nicht opak deklariertes, Struct strikter ausgerichtet
wird und deshalb ein Zeiger darauf mit weniger Bits dargestellt
werden könnte.
>Die Sache funktioniert nun.
Dann hast Du Glück gehabt. Mach's lieber richtig.
Ich erinnere mich an einen Prozessor, bei dem durch Type‐Casts
von »long int *« (Zeiger auf ein 4‐Bite‐Integer) auf »short int
*« (Zeiger auf ein 2‐Byte‐Integer) oder durch Type‐Casts von
»short int *« auf »char *« die Bitdarstellung des Zeigers sich
jeweils änderte. Wenn man das Bitmuster des Zeigerwertes als
Integer interpretierte, ergab sich bei diesen Type‐Casts eine
Verdopplung. Offenbar wurden »char«‐Objekte an ungeraden oder
geraden Adressen angelegt, »short int«‐Objekte aber nur an
geraden und »long int«‐Objekte nur an durch 4 teilbaren Adressen.
Friedhelm