Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

kako dobiti displacemente elemenata strukture (objasnjenje gradiva)

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Paralelni algoritmi 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
venovako
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2002. (22:46:38)
Postovi: (2F9)16
Sarma = la pohva - posuda
56 = 65 - 9

PostPostano: 23:49 uto, 9. 12. 2008    Naslov: Citirajte i odgovorite

Evo jednog prljavog C-ovskog prijedloga za rjesenje problema iz naslova:

http://web.studenti.math.hr/~venovako/UuPR/displ.c

Ako zelite, moze copy-paste i ovdje:
[code:1]#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct {
double d;
char c;
float f;
} S;

static S *s;

ptrdiff_t S_displ_d() { return 0; }
ptrdiff_t S_displ_c() { return ((char*)&(s->c) - (char*)&(s->d)); }
ptrdiff_t S_displ_f() { return ((char*)&(s->f) - (char*)&(s->d)); }

int main() {
const size_t
s = sizeof(S);
const ptrdiff_t
d = S_displ_d(),
c = S_displ_c(),
f = S_displ_f();

printf("sizeof(S): %d\n", s);
printf("Displacement od S.d: %d\n", d);
printf("Displacement od S.c: %d\n", c);
printf("Displacement od S.f: %d\n", f);

return EXIT_SUCCESS;
}[/code:1]

Primijetite da iako je [i]s[/i] NULL-pointer, displacementi se zapravo racunaju pri kompajliranju bez efektivnog dereferenciranja tog pointera.

Evo sto veli [i]student[/i]:
[code:1]sizeof(S): 16
Displacement od S.d: 0
Displacement od S.c: 8
Displacement od S.f: 12[/code:1]

Naravno, kod vas moze biti drugacije.

P.S. Prica o extent-u s vjezbi je simplificirana verzija stvarne. Vise mozete procitati u MPI standardu. Generalno se vodite ovime:
Ako struktura sadrzi podatak koji mora biti na adresi A t.d. A mod M = 0, onda potrazite najveci takav M i najmanji njegov visekratnik <= sizeof(strukture). Npr. kompajler moze zahtijevati da su podaci tipa double na adresama koje su djeljive s 8, a za neke druge tipove je dovoljno da su adrese djeljive s 4 (primjer float-a gore). U nacelu su svi M-ovi parni (stovise, potencije od 2), pa je dovoljno gledati najveci M - u protivnom stvari postaju dosta kompliciranije, no sve je objasnjeno u standardu, a slobodno je (cak dobrodoslo) i pitati...

[size=9][color=#999999]Added after 1 hours 5 minutes:[/color][/size]

Neke vrsti "opce kulture" ali i razumijevanja konkretnog problema radi, zgodno je pogledati npr.:

http://en.wikipedia.org/wiki/Data_structure_alignment
Evo jednog prljavog C-ovskog prijedloga za rjesenje problema iz naslova:

http://web.studenti.math.hr/~venovako/UuPR/displ.c

Ako zelite, moze copy-paste i ovdje:
Kod:
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct {
        double d;
        char c;
        float f;
} S;

static S *s;

ptrdiff_t S_displ_d() { return 0; }
ptrdiff_t S_displ_c() { return ((char*)&(s->c) - (char*)&(s->d)); }
ptrdiff_t S_displ_f() { return ((char*)&(s->f) - (char*)&(s->d)); }

int main() {
        const size_t
                s = sizeof(S);
        const ptrdiff_t
                d = S_displ_d(),
                c = S_displ_c(),
                f = S_displ_f();

        printf("sizeof(S): %d\n", s);
        printf("Displacement od S.d: %d\n", d);
        printf("Displacement od S.c: %d\n", c);
        printf("Displacement od S.f: %d\n", f);

        return EXIT_SUCCESS;
}


Primijetite da iako je s NULL-pointer, displacementi se zapravo racunaju pri kompajliranju bez efektivnog dereferenciranja tog pointera.

Evo sto veli student:
Kod:
sizeof(S): 16
Displacement od S.d: 0
Displacement od S.c: 8
Displacement od S.f: 12


Naravno, kod vas moze biti drugacije.

P.S. Prica o extent-u s vjezbi je simplificirana verzija stvarne. Vise mozete procitati u MPI standardu. Generalno se vodite ovime:
Ako struktura sadrzi podatak koji mora biti na adresi A t.d. A mod M = 0, onda potrazite najveci takav M i najmanji njegov visekratnik ⇐ sizeof(strukture). Npr. kompajler moze zahtijevati da su podaci tipa double na adresama koje su djeljive s 8, a za neke druge tipove je dovoljno da su adrese djeljive s 4 (primjer float-a gore). U nacelu su svi M-ovi parni (stovise, potencije od 2), pa je dovoljno gledati najveci M - u protivnom stvari postaju dosta kompliciranije, no sve je objasnjeno u standardu, a slobodno je (cak dobrodoslo) i pitati...

Added after 1 hours 5 minutes:

Neke vrsti "opce kulture" ali i razumijevanja konkretnog problema radi, zgodno je pogledati npr.:

http://en.wikipedia.org/wiki/Data_structure_alignment


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Paralelni algoritmi 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Možete otvarati nove teme.
Možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan