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];
Outo C -kielinen määrittely ?
4
1051
Vastaukset
- 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
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/viihde212586- 1482244
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än292222Hullu liikenteessä?
Mikä hullu pyörii kylillä jos jahti päällä? Näitä tosin kyllä riittää tällä kylällä.522129Niina 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-lahti211722Kun 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ää? Esimerkiks3871613Ano Turtiainen saa syytteet kansankiihoituksesta
Syytteitä on kolme ja niissä on kyse kirjoituksista, jotka hän on kansanedustaja-aikanaan julkaissut Twitter-tilillään961546- 2881436
Varokaa! Lunta voi sataa kohta!
Vakava säävaroitus Lumisadevaroitus Satakunta, Uusimaa, Etelä-Karjala, Keski-Suomi, Etelä-Savo, Etelä-Pohjanmaa, Pohjanm131389- 1321379