/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Shared memory, struct array
Fra : sdfserserser


Dato : 27-10-02 11:10

Jeg har noget kode til at lave shared memory, hvor jeg kan dele en
struct. Men kan man ikke dele et array af structs i shared memory?
Hvordan gør man det?


 
 
Byrial Jensen (27-10-2002)
Kommentar
Fra : Byrial Jensen


Dato : 27-10-02 11:24

sdfserserser <sdfserserser@sdfserserser.com> skrev:
> Jeg har noget kode til at lave shared memory, hvor jeg kan dele en
> struct. Men kan man ikke dele et array af structs i shared memory?
> Hvordan gør man det?

// Nogle erklæringer
struct s
{
int i;
double d;
};
void * GetPointerToTheSharedMemory (void);

// Hent en pointer til den delte hukommelse og tildel den til
// en pointer til struct s
struct s *array = (struct s *) GetPointerToTheSharedMemory ();

// Brug pointeren til struct s som et array
array[4].i = -17;
array[6].d = 3.14;

--
Skal musik- og edb-industrien have ret til fratage forbrugerne deres
rettigheder i henhold til Ophavsretloven, begrænse konkurrencen og
fremme monopoldannelse ved hjælp af tekniske midler? Sig nej! Nu!
Støt underskriftsindsamlingen på http://www.digitalforbruger.dk

sdfserserser (27-10-2002)
Kommentar
Fra : sdfserserser


Dato : 27-10-02 12:39

> // Nogle erklæringer
> struct s
> {
> int i;
> double d;
> };
> void * GetPointerToTheSharedMemory (void);
>
> // Hent en pointer til den delte hukommelse og tildel den til
> // en pointer til struct s
> struct s *array = (struct s *) GetPointerToTheSharedMemory ();
>
> // Brug pointeren til struct s som et array
> array[4].i = -17;
> array[6].d = 3.14;

Det ligner noget jeg kan bruge, men hvordan ser denne funktion ud:
GetPointerToTheSharedMemory () ?

Er det der du har shmget(.. osv.?


Byrial Jensen (27-10-2002)
Kommentar
Fra : Byrial Jensen


Dato : 27-10-02 12:16

sdfserserser <sdfserserser@sdfserserser.com> skrev:
>> // Nogle erklæringer
>> void * GetPointerToTheSharedMemory (void);
>
> Det ligner noget jeg kan bruge, men hvordan ser denne funktion ud:
> GetPointerToTheSharedMemory () ?

Hvor skulle jeg vide det fra når du intet har oplyst om hvilket
styresystem du bruger? Jeg troede at du allerede havde noget kode
som svarer til funktionen når du skrev "Jeg har noget kode til at
lave shared memory" i det første indlæg.

> Er det der du har shmget(.. osv.?

Nej, jeg har den slet ikke, men det er da muligt at implementere
funktionen ved hjælp af shm*-kaldene på systemer som understøtter
dem (f.eks. Linux).

--
Skal musik- og edb-industrien have ret til fratage forbrugerne deres
rettigheder i henhold til Ophavsretloven, begrænse konkurrencen og
fremme monopoldannelse ved hjælp af tekniske midler? Sig nej! Nu!
Støt underskriftsindsamlingen på http://www.digitalforbruger.dk

sdfserserser (27-10-2002)
Kommentar
Fra : sdfserserser


Dato : 27-10-02 16:38

Byrial Jensen wrote:
> sdfserserser <sdfserserser@sdfserserser.com> skrev:
>
>>> // Nogle erklæringer
>>> void * GetPointerToTheSharedMemory (void);
>>>
>>Det ligner noget jeg kan bruge, men hvordan ser denne funktion ud:
>>GetPointerToTheSharedMemory () ?
>>
>
> Hvor skulle jeg vide det fra når du intet har oplyst om hvilket
> styresystem du bruger? Jeg troede at du allerede havde noget kode
> som svarer til funktionen når du skrev "Jeg har noget kode til at
> lave shared memory" i det første indlæg.

Det er jeg ked af. Her er noget kode fra en bog:

------------------
/* heroppe bliver struct'en shared_use_st defineret*/

void *shared_memory = (void *)0;
struct shared_use_st *shared_stuff;
char buffer[BUFSIZ];
int shmid;

shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 |
IPC_CREAT);

if (shmid == -1) {
fprintf(stderr, "shmget failed\n");
exit(EXIT_FAILURE);
}

shared_memory = shmat(shmid, (void *)0, 0);
if (shared_memory == (void *)-1) {
fprintf(stderr, "shmat failed\n");
exit(EXIT_FAILURE);
}

printf("Memory attached at %X\n", (int)shared_memory);

shared_stuff = (struct shared_use_st *)shared_memory;
-------------

Med ovenstående kode kan man lave have en struct i shared memory. Jeg
vil gerne have et array af structs i shared memory og desuden 2 int
variable. De 2 int variable kunne jeg vel bare putte i en struct, så det
passer med ovenstående kode, men struct array'et er mit problem, da jeg
ikke ved hvordan man får det ind i shared memory.

>>Er det der du har shmget(.. osv.?
>>
>
> Nej, jeg har den slet ikke, men det er da muligt at implementere
> funktionen ved hjælp af shm*-kaldene på systemer som understøtter
> dem (f.eks. Linux).

Systemet er Linux.




Byrial Jensen (27-10-2002)
Kommentar
Fra : Byrial Jensen


Dato : 27-10-02 20:46

sdfserserser <sdfserserser@sdfserserser.com> skrev:
> Byrial Jensen wrote:
>> sdfserserser <sdfserserser@sdfserserser.com> skrev:
>>
>>>> // Nogle erklæringer
>>>> void * GetPointerToTheSharedMemory (void);
>>>>
>>>Det ligner noget jeg kan bruge, men hvordan ser denne funktion ud:
>>>GetPointerToTheSharedMemory () ?
>>
>> Hvor skulle jeg vide det fra når du intet har oplyst om hvilket
>> styresystem du bruger? Jeg troede at du allerede havde noget kode
>> som svarer til funktionen når du skrev "Jeg har noget kode til at
>> lave shared memory" i det første indlæg.
>
> Det er jeg ked af. Her er noget kode fra en bog:

Tilret blot størrelsen af det delte lager (2. argument til shmget())
så har brug formodentlig hvad du skal bruge.

> Med ovenstående kode kan man lave have en struct i shared memory. Jeg
> vil gerne have et array af structs i shared memory og desuden 2 int
> variable. De 2 int variable kunne jeg vel bare putte i en struct, så det
> passer med ovenstående kode, men struct array'et er mit problem, da jeg
> ikke ved hvordan man får det ind i shared memory.

Da du ved hvordan man gør for en enkelt struct, kunne du udnytte det
ved at lave én samlet struct for det hele:

struct shared_mem
{
struct shared_use_st array[ARRAY_ELEMENTS];
int i1;
int i2;
};

--
Skal musik- og edb-industrien have ret til fratage forbrugerne deres
rettigheder i henhold til Ophavsretloven, begrænse konkurrencen og
fremme monopoldannelse ved hjælp af tekniske midler? Sig nej! Nu!
Støt underskriftsindsamlingen på http://www.digitalforbruger.dk

sdfserserser (29-10-2002)
Kommentar
Fra : sdfserserser


Dato : 29-10-02 00:36

>>Med ovenstående kode kan man lave have en struct i shared memory. Jeg
>>vil gerne have et array af structs i shared memory og desuden 2 int
>>variable. De 2 int variable kunne jeg vel bare putte i en struct, så det
>>passer med ovenstående kode, men struct array'et er mit problem, da jeg
>>ikke ved hvordan man får det ind i shared memory.
>>
>
> Da du ved hvordan man gør for en enkelt struct, kunne du udnytte det
> ved at lave én samlet struct for det hele:
>
> struct shared_mem
> {
> struct shared_use_st array[ARRAY_ELEMENTS];
> int i1;
> int i2;
> };

Det tænkte jeg faktisk også om ikke man kunne, men fik ikke prøvet det.
Men det har jeg gjort nu og det ser ud til at det virker.

Mange tak for hjælpen.

Jeg er C nybegynder, som det nok kan ses. At specificere hvor meget ting
fylder til forsk. funktioner lader til at være meget vigtigt. Er det
korrekt at size_of funktionen altid angiver hvor meget ting fylder i
hukkommelsen så man kan bruge den til at fortælle hvor meget noget fylder?


Byrial Jensen (29-10-2002)
Kommentar
Fra : Byrial Jensen


Dato : 29-10-02 05:43

sdfserserser <sdfserserser@sdfserserser.com> skrev:

> Jeg er C nybegynder, som det nok kan ses. At specificere hvor meget
> ting fylder til forsk. funktioner lader til at være meget vigtigt.

Ja, det tit meget vigtigt at gøre rigtigt i C.

> Er det korrekt at size_of funktionen altid angiver hvor meget ting
> fylder i hukkommelsen så man kan bruge den til at fortælle hvor
> meget noget fylder?

Det hedder sizeof og er ikke en funktion, men en operator. Den
fortæller altid hvor meget noget fylder i hukommelsen. sizeof's
returværdi er af typen size_t som er et unsigned heltal som skal
være stor nok til rumme alle mulige størrelser. size_t erklæres i
<stddef.h>.

#include <stddef.h>

// Man kan spørge på typenavne i parentes
size_t charsize = sizeof (char);
size_t intsize = sizeof (int);

// Enheden er størrelsen af char, "charsize" har fået værdien 1.
// "intsize" vil typisk være 2, 4 eller 8, men "intsize" behøver
// at være at større end "charsize"

char *p = 0;
int i = 0;

// Man kan også bruge vilkårlige udtryk som /ikke/ udregnes
size_t csize = sizeof *p; // O.k. p defereres ikke, csize == 1
size_t isize = sizeof ++i; // O.k. i skifter ikke værdi, isize == intsize

--
Skal musik- og edb-industrien have ret til fratage forbrugerne deres
rettigheder i henhold til Ophavsretloven, begrænse konkurrencen og
fremme monopoldannelse ved hjælp af tekniske midler? Sig nej! Nu!
Støt underskriftsindsamlingen på http://www.digitalforbruger.dk

sdfserserser (27-10-2002)
Kommentar
Fra : sdfserserser


Dato : 27-10-02 12:57

> Jeg har noget kode til at lave shared memory, hvor jeg kan dele en
> struct. Men kan man ikke dele et array af structs i shared memory?
> Hvordan gør man det?

Glemte at sige at det er C og _ikke_ C++.



Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408509
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste