Olisi sellainen tilanne, että C-kielisessä ohjelmassani, joka tulee omaan sulautettuun projektiin, olisi tarpeen tehdä hieman "ehdollista esittelyä".
Ohjelmassani tullaan yhteen funktioon, jossa vertaillaan staattisen taulukon soluja tilanteesta riippuen yhteen kuudesta eri paikallisesta taulukosta.
Putkahti nimittäin mieleen, että koska kyseisessä funktiossa käytetään vain yhtä niistä kuudesta paikallisesta taulukosta, niin muut taulukot tuhlaavat muistia olemalla olemassa.
Funktioon tultaessa sen sisään tuodaan arvo, josta riippuen pitäisi esitellä vain yksi taulukoista. Funktion päätyttyä taulukko luonnollisesti lakkaa olemasta.
Millaisilla komennoilla voisin ehdollistaa taulukon esittelyn funktiossa? Kokeilin jo tavallista if()-lausetta, mutta kääntäjä herjaa, että "must declare first in block."
Olen toistaiseksi ratkaissut ongelman erillisillä funktioilla, joissa kussakin on vain yksi paikallinen taulukko, mutta kun haluaisin myös siistiä koodia, niin en haluaisi ohjelmassa olevan useita sellaisia pätkiä, mitkä ovat suoritettavan tehtävän kannalta todella samanlaisia.
Käytän CodevisionAVR Standard versiota kääntäjänä. Kyllä, kaupallinen Codevision, eli kääntäjän vaihtoon en aio ryhtyä.
Ohjelmassani tullaan yhteen funktioon, jossa vertaillaan staattisen taulukon soluja tilanteesta riippuen yhteen kuudesta eri paikallisesta taulukosta.
Putkahti nimittäin mieleen, että koska kyseisessä funktiossa käytetään vain yhtä niistä kuudesta paikallisesta taulukosta, niin muut taulukot tuhlaavat muistia olemalla olemassa.
Funktioon tultaessa sen sisään tuodaan arvo, josta riippuen pitäisi esitellä vain yksi taulukoista. Funktion päätyttyä taulukko luonnollisesti lakkaa olemasta.
Millaisilla komennoilla voisin ehdollistaa taulukon esittelyn funktiossa? Kokeilin jo tavallista if()-lausetta, mutta kääntäjä herjaa, että "must declare first in block."
Olen toistaiseksi ratkaissut ongelman erillisillä funktioilla, joissa kussakin on vain yksi paikallinen taulukko, mutta kun haluaisin myös siistiä koodia, niin en haluaisi ohjelmassa olevan useita sellaisia pätkiä, mitkä ovat suoritettavan tehtävän kannalta todella samanlaisia.
Käytän CodevisionAVR Standard versiota kääntäjänä. Kyllä, kaupallinen Codevision, eli kääntäjän vaihtoon en aio ryhtyä.
Vastaukset 5
Vanhimmat
Moi.
Olisitko mukava ja pasteisit tänne vähän sitä sun koodiasi, sillä ainkin itse olen vielä niin alkeissa että en oikein keksinyt tosta sun jutustasi mitä meinaat?
T: En ikinä, waretatte sen vielä.... perkeleet.
Tämä pätkä on funktioiden esittely ohjelman alussa:
int koodin_1_tarkistus(int valittu_lukko);
int koodin_2_tarkistus(int valittu_lukko);
int koodin_3_tarkistus(int valittu_lukko);
int koodin_4_tarkistus(int valittu_lukko);
int koodin_5_tarkistus(int valittu_lukko);
int koodin_6_tarkistus(int valittu_lukko);
Tässä siirrytään funktion_kutsu-muuttujan arvon perusteella eri funktioihin pääohjelmassa ja viedään sisään valittu_lukko-muuttujan arvo ja palautetaan se myös sieltä:
if(funktion_kutsu == 3) valittu_lukko = koodin_1_tarkistus(valittu_lukko);
if(funktion_kutsu == 4) valittu_lukko = koodin_2_tarkistus(valittu_lukko);
if(funktion_kutsu == 5) valittu_lukko = koodin_3_tarkistus(valittu_lukko);
if(funktion_kutsu == 6) valittu_lukko = koodin_4_tarkistus(valittu_lukko);
if(funktion_kutsu == 7) valittu_lukko = koodin_5_tarkistus(valittu_lukko);
if(funktion_kutsu == 8) valittu_lukko = koodin_6_tarkistus(valittu_lukko);
Seuraavassa funktion rakenne. Niitä on siis 6 kpl. Ne olisi siis tarkoitus yhdistää, mutta kun jokaisessa funktiossa olevan taulukon solut ovat hieman toisistaan poikkeavia(asetetaan vakioiksi koodausvaiheessa, eivät muutu ohjelman ajon aikana, vaan käytetään vertailuun), niin vain yksi taulukko tarvitaan, mikä niistä se on, sen määrää tilanne, mutta muita taulukoita ei tarvitse olla olemassa. Siihen tarvittaisiin ehdollista esittelyä
/**********************************************
TARKISTETAAN NUMEROKOODI LUKOLLE 1
**********************************************/
int koodin_1_tarkistus(int valittu_lukko)
{
int i=0; // Indeksi taulukoille (HUOM, VAIN TÄSSÄ FUNKTIOSSA!)
int tarkistus[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // Tarkistustaulukko. Kirjoita tähän oikea koodi!
while(i
if(i == 10) funktion_kutsu=9; // Koodi oikein
else funktion_kutsu=10; ;// Virheellinen koodi
return valittu_lukko;
}
Heei! else funktion_kutsu=10; //sulla on kaks puolipistettä jos huomaat, oliko?
Okei. Olen tyytynyt sellaiseen ratkaisuun, että yhdessä funktiossa esitellään kaikki 6 taulukkoa, joista sitten vain yhtä käytetään tilanteesta riippuen.
Ei se muistin tuhlaaminen mitään varsinaista ongelmaa alun alkuunkaan ole aiheuttanut. Periaatehan vain ohjelmoinnissa vaan on sellainen, että muistia ei saisi tuhlata.
Mainitsemasi pilkkuvika on luultavasti tullut pastatessani koodia tänne Suomi24-palstalle. En muista kääntäjän ilmoittaneen asiasta. Ja vaikka se olisi siitä ilmoittanutkin, olen sitten varmaan jo korjannut sen.
Tässä jotain ajatusta: entä jos esittelisit vain alunperinkin vain yhden taulukon. Täyttäisit sen solut sitten valitun lukkonumeron mukaan (kannattaa käyttää if-lauseen sijaan switch - case -rakennetta lukko valitessa). Samoin voit sitten täyttää tarkistustaulukon lukkonumeron mukaan. Näin et myöskään kovakoodaisi lukkokoodia funktion sisään (mikä ei ole koskaan hyvä ratkaisu).
Onko tuo koodi[] globaali taulukko? Jos on, kannattaa harkita laittaa muulla lailla (siis esim. pääohjelman taulukoksi).