Nimetön Struct ja Union
C-ohjelmointikielessä on anonyymejä rakenteita ja unioneita, jotka mahdollistavat rakenteiden ja unionien määrittelyn ilman nimen määrittämistä.
Mitä ovat anonyymit rakenteet ja unionit?
Anonyymillä unionilla tai rakenteella ei ole tunnistetta. Tämän vuoksi et voi luoda itsenäisiä muuttujia kyseisestä tyypistä; sen sijaan niitä käytetään tyypillisesti muiden rakenteiden sisällä.
// Anonymous union
union {
char x;
int y;
};
// Anonymous structure
struct {
char x;
int y;
};
Anonyymit rakenteet ja unionit ovat erityisen hyödyllisiä, kun ne sisällytetään toisiin rakenteisiin ja niitä käytetään vain siinä kontekstissa, jossa ne on määritelty.
Käytännön esimerkki
Tarkastellaan tilannetta, jossa halutaan esittää ASCII-taulukko, jossa sama arvo voidaan tulkita joko numeerisena koodina tai merkkisymbolina. Anonyymin unionin käyttäminen rakenteen sisällä mahdollistaa tehokkaan vaihtamisen näiden kahden tulkinnan välillä.
main.c
123456789101112131415161718192021#include <stdio.h> struct ASCIItable { // Anonymous union allows dual representation of the same memory union { char symbol; int num; }; }; int main() { struct ASCIItable AZtable; AZtable.num = 65; // ASCII code for 'A' // Print all uppercase letters and their numeric codes for (int i = 0; i < 26; i++) { printf("num = %d | symbol = `%c`\n", AZtable.num + i, AZtable.symbol + i); } return 0; }
Tässä esimerkissä rakenne ASCIItable sisältää anonyymin unionin. Unionin avulla samaa muistialuetta voidaan tulkita joko numeerisena arvona (num) tai merkkinä (symbol).
Kun AZtable.num asetetaan arvoon 65, se vastaa ASCII-koodia merkille 'A'. Käyttämällä samaa muistia, AZtable.symbol edustaa myös merkkiä 'A'. Toistamalla 26 kertaa voidaan tulostaa kaikki isot kirjaimet ja niiden ASCII-koodit, mikä havainnollistaa, kuinka sama muisti voi esittää useita näkymiä tietoihin.
Swipe to start coding
Luo funktio findFurthestPoint, joka etsii pisteen, joka on kauimpana origosta (0,0) kaksiulotteisella tasolla. Kukin piste esitetään rakenteella Point, joka sisältää anonyymin sisäkkäisen rakenteen, jossa on kentät x ja y.
Funktion tulee laskea jokaiselle pisteelle euklidinen etäisyys kaavalla:
distance = sqrt(x*x + y*y)
ja palauttaa sen pisteen indeksi, jolla on suurin etäisyys.
- Laske funktion sisällä ensimmäisen pisteen etäisyys origosta kaavan avulla.
- Alusta
maxIndexarvolla0. - Käytä
for-silmukkaa, jossai = 1ja toista kunnesi = npisteisiin asti. - Laske jokaiselle pisteelle etäisyys yllä olevalla kaavalla.
- Jos etäisyys on suurempi kuin
maxDistance, päivitämaxDistancejamaxIndexnykyisen pisteen etäisyyteen ja indeksiin. - Silmukan jälkeen palauta
maxIndexkauimmaisen pisteen indeksinä.
Ratkaisu
Kiitos palautteestasi!
single
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Mahtavaa!
Completion arvosana parantunut arvoon 4.35
Nimetön Struct ja Union
Pyyhkäise näyttääksesi valikon
C-ohjelmointikielessä on anonyymejä rakenteita ja unioneita, jotka mahdollistavat rakenteiden ja unionien määrittelyn ilman nimen määrittämistä.
Mitä ovat anonyymit rakenteet ja unionit?
Anonyymillä unionilla tai rakenteella ei ole tunnistetta. Tämän vuoksi et voi luoda itsenäisiä muuttujia kyseisestä tyypistä; sen sijaan niitä käytetään tyypillisesti muiden rakenteiden sisällä.
// Anonymous union
union {
char x;
int y;
};
// Anonymous structure
struct {
char x;
int y;
};
Anonyymit rakenteet ja unionit ovat erityisen hyödyllisiä, kun ne sisällytetään toisiin rakenteisiin ja niitä käytetään vain siinä kontekstissa, jossa ne on määritelty.
Käytännön esimerkki
Tarkastellaan tilannetta, jossa halutaan esittää ASCII-taulukko, jossa sama arvo voidaan tulkita joko numeerisena koodina tai merkkisymbolina. Anonyymin unionin käyttäminen rakenteen sisällä mahdollistaa tehokkaan vaihtamisen näiden kahden tulkinnan välillä.
main.c
123456789101112131415161718192021#include <stdio.h> struct ASCIItable { // Anonymous union allows dual representation of the same memory union { char symbol; int num; }; }; int main() { struct ASCIItable AZtable; AZtable.num = 65; // ASCII code for 'A' // Print all uppercase letters and their numeric codes for (int i = 0; i < 26; i++) { printf("num = %d | symbol = `%c`\n", AZtable.num + i, AZtable.symbol + i); } return 0; }
Tässä esimerkissä rakenne ASCIItable sisältää anonyymin unionin. Unionin avulla samaa muistialuetta voidaan tulkita joko numeerisena arvona (num) tai merkkinä (symbol).
Kun AZtable.num asetetaan arvoon 65, se vastaa ASCII-koodia merkille 'A'. Käyttämällä samaa muistia, AZtable.symbol edustaa myös merkkiä 'A'. Toistamalla 26 kertaa voidaan tulostaa kaikki isot kirjaimet ja niiden ASCII-koodit, mikä havainnollistaa, kuinka sama muisti voi esittää useita näkymiä tietoihin.
Swipe to start coding
Luo funktio findFurthestPoint, joka etsii pisteen, joka on kauimpana origosta (0,0) kaksiulotteisella tasolla. Kukin piste esitetään rakenteella Point, joka sisältää anonyymin sisäkkäisen rakenteen, jossa on kentät x ja y.
Funktion tulee laskea jokaiselle pisteelle euklidinen etäisyys kaavalla:
distance = sqrt(x*x + y*y)
ja palauttaa sen pisteen indeksi, jolla on suurin etäisyys.
- Laske funktion sisällä ensimmäisen pisteen etäisyys origosta kaavan avulla.
- Alusta
maxIndexarvolla0. - Käytä
for-silmukkaa, jossai = 1ja toista kunnesi = npisteisiin asti. - Laske jokaiselle pisteelle etäisyys yllä olevalla kaavalla.
- Jos etäisyys on suurempi kuin
maxDistance, päivitämaxDistancejamaxIndexnykyisen pisteen etäisyyteen ja indeksiin. - Silmukan jälkeen palauta
maxIndexkauimmaisen pisteen indeksinä.
Ratkaisu
Kiitos palautteestasi!
single