structit

Jos määritellään

time_t taim;
struct tm *aika, nyt;
time(taim);
aika = localtime(&taim); //OK
nyt = localtime(&taim); // Ei OK

miksi tuo alin rivi antaa herjaa???
9571
Äänestä

Muut lukivat myös

Vastaukset 9

Vanhimmat

Nyt kun sen noin sanoit, niin tajusin itsekkin.
Jatketaan tyhmillä kysymyksillä, kun on kerran päästy vauhtiin.

Jos määritellään:
struct tm *nyt, *aika;
Niin mihin nuo *muuttujat osoittavat jos mitään
osoitetta ei niille anneta. Samaan paikkaan??

Äänestä
  • tilansa.

    Äänestä

  • saa oman kirjoitti:

    tilansa.

    "struct tm *nyt, *aika;"

    olet niille osoitteen antanut.

    Äänestä

  • Tällaista pohdin...

    int main(void) {

    struct tm *eka, *toka;
    time_t t;

    time(&t);
    eka = localtime(&t);
    toka = localtime(&t);

    printf("eka:%stoka:%s", asctime(eka), asctime(toka));

    toka = gmtime(&t);

    printf("\neka:%stoka:%s", asctime(eka), asctime(toka));

    return 0;
    }

    Miksi tuo "eka"(kin) tuossa jälkimmäisessä tulostuksessa muuttuu gm ajaksi, vaikka se annetaan "toka"lle??

    Äänestä

  • strutsi kirjoitti:

    Tällaista pohdin...

    int main(void) {

    struct tm *eka, *toka;
    time_t t;

    time(&t);
    eka = localtime(&t);
    toka = localtime(&t);

    printf("eka:%stoka:%s", asctime(eka), asctime(toka));

    toka = gmtime(&t);

    printf("\neka:%stoka:%s", asctime(eka), asctime(toka));

    return 0;
    }

    Miksi tuo "eka"(kin) tuossa jälkimmäisessä tulostuksessa muuttuu gm ajaksi, vaikka se annetaan "toka"lle??

    Johtuu siitä, että localtime() palauttaa osoitteen staattiseen bufferiin. Tuo on ns. non-re-entrant funktio. Mikäli haluat, että se käyttää sinun varaamaa bufferia, käytä funktiota localtime_r().

    Äänestä

  • Tuossa tapauksessa muuttujien sisältö on sitä, mitä pinossa (stack) sattuu juuri tolla hetkellä olemaan (eli jotain roskaa). Ne siis eivät ole valideja muistiosoitteita.

    Eivät siis välttämättä samaan paikkaan. Tuollaisina niiden dereferointi aiheuttaa segmentation violation -trapin ja prosessi keskeytetään.

    Äänestä

struct tm *aika, nyt;

aika on pointteri(osoite) tm-tyyppiseen struktuuriin (todennäkoisesti 4 bytea pitkä).

nyt on tm-tyyppinen struktuuri (todennäköisesti paljon suurempi)

localtime() varaa itse tilaa sille struktuurille ja antaa sinulle vain osoitteen siihen. Eli tapauksessa nyt=localtime() yrität kopioida sisällön jo luodusta struktuurista omaan struktuuriin (mikä ei tietenkään onnistu)

Kun luot osoitemuuttujia (tai muuttujia) varaat nille tilaa, mutta niiden sisältö voi olla mitä tahansa ennen kuin itse määrittelet sen. Tavallinen ohjelnointivirhe on että olettaa että sisältö on nolla.

Äänestä

Asia alkaa pikkuhiljaa hahmottua. Paljonhan tässä on vielä kysymysmerkkejä, mutta ainakin pvmlaskuri tuli suunnilleen valmiiksi.

Kiitos vastanneille.

Äänestä

Kommentoi aloitusta


strutsi kirjoitti:

Jos määritellään

time_t taim;
struct tm *aika, nyt;
time(taim);
aika = localtime(&taim); //OK
nyt = localtime(&taim); // Ei OK

miksi tuo alin rivi antaa herjaa???

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu