eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingInicjalizacja/przypisanie wartości dla struktur w CInicjalizacja/przypisanie wartości dla struktur w C
  • Path: news-archive.icm.edu.pl!news.icm.edu.pl!nf1.ipartners.pl!ipartners.pl!news2.ipa
    rtners.pl!not-for-mail
    From: JDX <j...@o...pl>
    Newsgroups: pl.comp.programming
    Subject: Inicjalizacja/przypisanie wartości dla struktur w C
    Date: Wed, 21 Dec 2011 12:20:41 +0100
    Organization: N/A
    Lines: 49
    Message-ID: <jcsfeo$20k5$1@news2.ipartners.pl>
    NNTP-Posting-Host: ip-157-25-65-73.multimo.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=ISO-8859-2
    Content-Transfer-Encoding: 8bit
    X-Trace: news2.ipartners.pl 1324466456 66181 157.25.65.73 (21 Dec 2011 11:20:56 GMT)
    X-Complaints-To: a...@i...pl
    NNTP-Posting-Date: 21 Dec 2011 11:20:56 GMT
    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:8.0) Gecko/20111105 Thunderbird/8.0
    X-Enigmail-Version: 1.3.4
    Xref: news-archive.icm.edu.pl pl.comp.programming:194396
    [ ukryj nagłówki ]

    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().

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

  • 21.12.11 13:52

Najnowsze wątki z tej grupy


Najnowsze wątki

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: