Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Taulukon alustaminen muulla kuin nollalla

vesikuusi [18.12.2020 00:49:54]

#

Onko oheinen ihan validia (ja ei-rangaistavaa) C99:ää?

uint8_t data2[32] = { [0 ... (sizeof(data2) - 1)] = 0x5a };

Ilmeisesti ei tarkalleen ottaen ISO-yhteensopivaa, mutta kääntyy.

Tämä on ainoa löytämäni idioottivarmalta tuntuva tapa alustaa taulukko jollakin muulla kuin nollalla (kääntäjää käyttäen). Se vaikuttaa kuitenkin tavallaan häröltä, enkä meinaa nopeasti löytää mitään vastaavia esimerkkejä netistä.

Häröltä minusta vaikuttaa myös tuo sizeof(data2) käyttäminen saman taulukon alustuksessa. Toisaalta siinä ei tunnu olevan mitään outoa, koska kääntäjä kyllä tietää tietotyypin alustusvaiheessa. Lähinnä lienee iskenyt keskiyön epävarmuus.

Testaamani perusteella tuo on OK.

(Tottakai aina voisi käyttää erillistä vakiota sekä taulukon koon määrittelyssä että tuossa alustuksessa.)

Lopullinen koodini tähän liittyen näyttää enemmän tältä.

struct s {
    int i;
    uint8_t data[32];
};

static struct s sdata = {
    .data = { [0 ... (sizeof(sdata.data) - 1)] = 0xff }
};

Ja lopulta, olen testannut asiaa näin.

#include <stdio.h>
#include <stdint.h>

struct s {
    int i;
    uint8_t data[32];
};

static struct s sdata = {
    .data = { [0 ... (sizeof(sdata.data) - 1)] = 0xff }
};

static uint8_t data2[32] = { [0 ... (sizeof(data2) - 1)] = 0x5a };

int main() {
    for (int i = 0; i < 32; ++i) {
        printf("0x%x", sdata.data[i]);
    }
    printf("\n");
    for (int i = 0; i < 32; ++i) {
        printf("0x%x", data2[i]);
    }
    printf("\n");
}

Tuloste

0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff
0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a0x5a

Metabolix [18.12.2020 17:13:31]

#

Kuten GCC parametreilla -Wall -pedantic -std=c2x kertoo, tuo merkintätapa ei kuulu standardiin. Standardissa on määritelty vain yksittäisten arvojen asettaminen. GCC:n dokumentaatiossa kohdassa Designated Initializers kerrotaan tämä myös:

GCC, 6.29 Designated Initializers:

To initialize a range of elements to the same value, write ‘[first ... last] = value’. This is a GNU extension.

vesikuusi [18.12.2020 22:34:56]

#

Kiitos vastauksesta. Kaippa se on paras pysytellä standardissa jos vaikka kääntäjää joutuisi joskus vaihtamaan tai jotain. Taulukon alustus käännöksenaikaisesti muulla kuin nollalla on kyllä yksi sellainen juttu C:ssä mitä kaipaisi.

Ehkä sitä varten voisi tehdä makron ettei tarvitse 32 kertaa kirjoittaa '0xff,'.

Matti Holopainen [18.12.2020 23:08:55]

#

Miksi et käyttäisi funktiota

void * memset ( void * ptr, int value, size_t num );

Fill block of memory
Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).

vesikuusi [18.12.2020 23:32:50]

#

Koska haluan alustaa taulukon käännöksen aikana sen sijaan että alustus tapahtuisi ajonaikaisesti.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta