Outo C -kielinen määrittely ?

Anonyymi

Mitä seuraavassa C -koodissa tekee määrittely:

double (*mdct_enc)[18] = mdct_enc_long[gr][ch];

?

Jos siinä olisi erikseen ensin:

double mdct_enc[18];

ja sitten:

mdct_enc[18] = mdct_enc_long[gr][ch];

niin silloin se ilmeisesti määrittelisi 18 -alkioisen taulukon, jossa kukin elementti (numeroitu väliltä 0-17) on double -tyyppiä (eli 8 -tavuinen IEEE -liukuluku).

Ja tuo erillinen sijoituslause hakee toisesta, 2-ulotteisesta taulukosta arvon ja sijoittaa sen elementtiin 18 (mitä ei ole olemassa, kun suurin sallittu on 17, kun indeksointi alkaa C -kielessä 0:sta).

C -kielessä * tarkoittaa osoitinta (koska tässä asiayhteydessä kyse ei ole kertolaskusta).

Mutta jos tuo määritteleekin osoittimen 18 -alkioiseen taulukkoon liukuluvuista, niin eikö silloin ole virhe tehdä heti samalla lauseella sijoitus osoittimen osoittamaan paikkaan ilman, että osoittimelle ensin varataan tilaa esim. malloc() -funktiolla ?

Ylläoleva "double (*mdct_enc)[18]" -määrittely on kopioitu allaolevasta C -koodista.

ja ei, kun ".c"-tiedostossa on tuollaista koodia, niin vastaavassa ".h" -tiedostossa ei ole lainkaan mainittu identidieriä mdct_enc

Koodia tässä:


for (gr = 0; gr < mode_gr; gr )

{

int pre_gr = gr_idx[gr ];

int cur_gr = gr_idx[gr 1];



for (ch = 0; ch < stereo; ch )

{

double (*mdct_enc)[18] = mdct_enc_long[gr][ch];

4

1051

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Omaan silmääni mdct_enc näyttää pointterilta double[18] taulukkoon. jonka arvoksi sijoitetaan mdct_enc_long[gr][ch]:n osoite.

    • > Mutta jos tuo määritteleekin osoittimen 18 -alkioiseen taulukkoon liukuluvuista, niin eikö silloin ole virhe tehdä heti samalla lauseella sijoitus osoittimen osoittamaan paikkaan ilman, että osoittimelle ensin varataan tilaa esim. malloc() -funktiolla ?

      Sijoitus tehdään itse osoittimeen, ei osoittimen osoittamaan paikkaan.

    • Anonyymi

      Hetken sai hakea, mutta jotta sijoitus onnistuisi, on mdct_enc_long tyyppiä:
      double (*mdct_enc_long[10][2])[18] = {0};
      -eli saadaan pointteri array-alkioon 18-elementtisessä arrayssa, oisko vaikka mixeri, jossa 18 kanavaa, yksi valitaan?
      -rumaa ja tiukkaa koodia - toisaalta ei vahingossa tule kirjoitettua vääränlaisia pointtereita, kun tuo "18" pitää olla mukana..

    • Anonyymi

      En käsitä miksi tähän pitäisi sotkea malloc() mukaan. Ehkä asia on helpompi ymmärtää näin pienemmässä mittakaavassa.

      #include <stdio.h>
      int main(int argc, char **argv) {
      char v[] = "Testi";
      char *p[3];
      p[1] = &v[3];
      printf("Pointerin *p arvo on: %c\n", *p[1] );
      return 0;
      }

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Ensitreffit Jenni laukoo viinilasin ääressä suorat sanat Jyrkin aikeista: "Mä sanoin, että älä"

      Voi ei… Mitä luulet: kestääkö Jennin ja Jyrkin avioliitto vai päättyykö eroon? Lue lisää: https://www.suomi24.fi/viihde
      Ensitreffit alttarilla
      21
      2586
    2. 148
      2244
    3. Ymmärrän paremmin kuin koskaan

      Roikut kädessäni ja vedät puoleesi. Näen kuitenkin tämän kaiken lävitse ja kaikkien takia minun on tehtävä tämä. Päästän
      Tunteet
      29
      2222
    4. Hullu liikenteessä?

      Mikä hullu pyörii kylillä jos jahti päällä? Näitä tosin kyllä riittää tällä kylällä.
      Kiuruvesi
      52
      2129
    5. Niina Lahtinen uudessa elämäntilanteessa - Kotiolot ovat muuttuneet merkittävästi: "Nyt on...!"

      Niina, tanssejasi on riemukasta seurata, iso kiitos! Lue Niinan haastattelu: https://www.suomi24.fi/viihde/niina-lahti
      Suomalaiset julkkikset
      21
      1722
    6. Kun Venäjä on tasannut tilit Ukrainan kanssa, onko Suomi seuraava?

      Mitä mieltä olette, onko Suomi seuraava, jonka kanssa Venäjä tasaa tilit? Ja voisiko sitä mitenkään estää? Esimerkiks
      NATO
      387
      1613
    7. Ano Turtiainen saa syytteet kansankiihoituksesta

      Syytteitä on kolme ja niissä on kyse kirjoituksista, jotka hän on kansanedustaja-aikanaan julkaissut Twitter-tilillään
      Maailman menoa
      96
      1546
    8. Pyhäinpäivän aamua

      Oikein hyvää huomenta ja rauhallista päivää. ❄️😊🥱☕❤️
      Ikävä
      288
      1436
    9. Varokaa! Lunta voi sataa kohta!

      Vakava säävaroitus Lumisadevaroitus Satakunta, Uusimaa, Etelä-Karjala, Keski-Suomi, Etelä-Savo, Etelä-Pohjanmaa, Pohjanm
      Maailman menoa
      13
      1389
    10. Kunta ostaa kivitipun

      Kunnanjohtajan tuleva uusi ostokohde
      Lappajärvi
      132
      1379
    Aihe