-
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/