eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingInicjalizacja/przypisanie wartości dla struktur w C
Ilość wypowiedzi w tym wątku: 2

  • 1. Data: 2011-12-21 11:20:41
    Temat: Inicjalizacja/przypisanie wartości dla struktur w C
    Od: JDX <j...@o...pl>

    Witam,

    jest sobie następujący kawałek kodu w C:

    typedef struct {
    [... dużo pól typu int ...]
    } MyType;

    void aFunc(MyType *aPar)
    {
    MyType aLocalVar = *aPar;

    [... coś tam coś tam ...]
    }

    Spojrzałem sobie na standard C99
    (http://www.open-std.org/JTC1/SC22/WG14/www/docs/n12
    56.pdf) i taka
    inicjalizacja struktur/unii, czy też ogólniej, przypisanie im wartości
    jest możliwa (rozdziały 6.7.8 i 6.5.16.1). Interesuje mnie coś takiego
    było możliwe w C "od zawsze".

    A pytam, ponieważ wczoraj natknąłem się na ciekawy problem. Otóż gdy
    próbuję skompilować kawałek (nie mojego) kodu z opcją -g (debug stuff
    on) za pomocą cokolwiek archaicznego gcc 3.4.1 dla MIPS32 linker skarży
    mi się na brak memcpy() w miejscach gdzie zmienne typu struct{...} są
    inicjalizowane w w/w sposób. Platforma docelowa jest "embedded" więc nie
    ma dostępnej standardowej "standardowej biblioteki C". Oczywiście mam
    swoją własną bibliotekę gdzie m.in. jest zdefiniowana funkcja
    lib_memcpy() oraz makro definiujące memcpy() jako lib_memcpy() i
    wszystko jest OK jeśli gdzieś tam w kodzie memcpy()jest wołane jawnie.

    Natomiast gdy kompiluję kod z -g0 -O3 (debug stuff off, optimized) to
    kompilacja przebiega bez problemów. Wgląda na to, że gcc używa memcpy()
    jako "konstruktora kopiującego" z tym że w pierwszym przypadku używa (a
    przynajmniej próbuje) funkcji ze standardowej biblioteki C a w drugim
    funkcji wbudowanej w kompilator.

    Oczywiście gdy podmienię inicjalizację na coś takiego:

    MyType aLocalVar;
    memcpy(&aLocalVar, aPar, sizeof(MyType));

    to wszystko jest OK w obu przypadkach.

    Tak więc ponawiam pytanie - czy tego typu inicjalizacja zawsze była
    możliwa w C? Bo mam przeczucie że nie zawsze. A z drugiej strony ten
    problem to dla mnie nowość ponieważ we własnym kodzie zawsze
    inicjalizowałem typy złożone albo przez przypisanie wartości
    poszczególnym polom albo właśnie przez jawne wywołanie memcpy().


  • 2. Data: 2011-12-21 13:52:54
    Temat: Re: Inicjalizacja/przypisanie wartości dla struktur w C
    Od: " " <f...@W...gazeta.pl>

    JDX <j...@o...pl> napisał(a):

    > Witam,
    >
    > jest sobie następujący kawałek kodu w C:
    >
    > typedef struct {
    > [... dużo pól typu int ...]
    > } MyType;
    >
    > void aFunc(MyType *aPar)
    > {
    > MyType aLocalVar = *aPar;
    >
    > [... coś tam coś tam ...]
    > }
    >
    > Spojrzałem sobie na standard C99
    > (http://www.open-std.org/JTC1/SC22/WG14/www/docs/n12
    56.pdf) i taka
    > inicjalizacja struktur/unii, czy też ogólniej, przypisanie im wartości
    > jest możliwa (rozdziały 6.7.8 i 6.5.16.1). Interesuje mnie coś takiego
    > było możliwe w C "od zawsze".
    >
    > A pytam, ponieważ wczoraj natknąłem się na ciekawy problem. Otóż gdy
    > próbuję skompilować kawałek (nie mojego) kodu z opcją -g (debug stuff
    > on) za pomocą cokolwiek archaicznego gcc 3.4.1 dla MIPS32 linker skarży
    > mi się na brak memcpy() w miejscach gdzie zmienne typu struct{...} są
    > inicjalizowane w w/w sposób. Platforma docelowa jest "embedded" więc nie
    > ma dostępnej standardowej "standardowej biblioteki C". Oczywiście mam
    > swoją własną bibliotekę gdzie m.in. jest zdefiniowana funkcja
    > lib_memcpy() oraz makro definiujące memcpy() jako lib_memcpy() i
    > wszystko jest OK jeśli gdzieś tam w kodzie memcpy()jest wołane jawnie.
    >
    > Natomiast gdy kompiluję kod z -g0 -O3 (debug stuff off, optimized) to
    > kompilacja przebiega bez problemów. Wgląda na to, że gcc używa memcpy()
    > jako "konstruktora kopiującego" z tym że w pierwszym przypadku używa (a
    > przynajmniej próbuje) funkcji ze standardowej biblioteki C a w drugim
    > funkcji wbudowanej w kompilator.
    >
    > Oczywiście gdy podmienię inicjalizację na coś takiego:
    >
    > MyType aLocalVar;
    > memcpy(&aLocalVar, aPar, sizeof(MyType));
    >
    > to wszystko jest OK w obu przypadkach.
    >
    > Tak więc ponawiam pytanie - czy tego typu inicjalizacja zawsze była
    > możliwa w C? Bo mam przeczucie że nie zawsze. A z drugiej strony ten
    > problem to dla mnie nowość ponieważ we własnym kodzie zawsze
    > inicjalizowałem typy złożone albo przez przypisanie wartości
    > poszczególnym polom albo właśnie przez jawne wywołanie memcpy().

    o ile ja pamietam jako cos czytalem to nie od samego
    poczatku ale zrobiono to wczesnie gdzies tak w poczatku
    lat 80tych (nie jest to precyzyjne info, tylko mowie ze tak
    cos zapamiatalem, o ile to sa wogole dobre informacje)

    kiedys ostatnio pytalem na grupi pl.comp.lang.c o podobna
    kwestie tj mozliwosc przypisywania (w runtime) wyrazeniami
    typu s = {90,80,70}; to o ile pamietam ktos odpowiedzial ze
    to wrzucono w 89 czy 99 (tez nie pamiatam dokladnie ani daty
    ani w sumie faktu)



    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: