Taulukon alkioiden siirto

Bittioperointi

Olisi tarvetta jonkinlaiselle siirto-operaattorille C-kielessä.

Ohjelmani on peli, jossa on tarkoitus kerätä taulukkoon saatuja pistetuloksia. Tulokset ovat positiivisia kokonaislukuja ja ne tulee asettaa taulukossa paremmuusjärjestykseen siten, että parhain tulos(suurin kokonaisluku) on taulukon alkiossa 0 ja huonoin alkiossa 15. Taulukon koko on siis 16 alkiota. Kyseessä on AVR-ohjaimessa pyörivä peli ja sen EEPROM-muistiin tallennettava taulukko.

Pulma on siinä, että se taulukon alkio, johon tieto kirjoitetaan ei saa hukata alkuperäistä tietoaan, vaan taulukon alkioita tulee siirtää siten, että kaikkia niitä alkioita, joiden arvo alittaa tallennettavan tuloksen, siirretään yhden alkion verran oikealle, eli kohti taulukon rajaa, jolloin taulukon lopussa(alkiossa 15) oleva data katoaa, kun seuraava tulee tilalle. Tämä on ainut data, joka saa kadota.

Onko C-kielessä jonkinlaista siirto-operaattoria, joka siirtäisi taulukon alkioiden sisältöä samaan tapaan, kuin bittioperaattorit >> ja

5

434

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • fffssd

      string.h:
      void *memmove(void *dest, const void *src, size_t n);

      vastaava varmaan löytyy tuostakin

    • Toi on helppo!

      Tommone kantsii tehä linkitetyllä listalla: linitetyssä listassa jokainen, paitsi ei viimeinen, alkio osoittaa seuraavaan. Nerokasta!

      • Lista rules!

        Jos ohjelmoi räiskintäpeliin vaik karanun, joka rähähtää, nii sit voi laittaa helpost listaan jokaisen sirpaleen ja sen soltun suoleten pätkät, johon se osui ja vähän ballistiikkaa, niin saa saa aikaseks tosi näyttävii pöllähdyksii


    • dx

      Onko kyseessä siis sellainen ulkoinen EEPROM, jonka käsittelyyn on erillisiä funktiota tyyliin eeprom_write(), eeprom_read() jne? Miksi et voi vaan lukea niitä arvon alittavia arvoja (paitsi alkiota 15) keskusmuistiin ja kirjoittaa niitä EEPROM:ille yhtä arvoa edemmäksi ja uuttaa arvoa sitten siihen vanhaan kohtaan? Tämä on kyllä niin perusjuttu, että varmaan missasin jotain, koska jos olet osannut EEPROM:ia käyttää, niin ihan varmasti olisit tämänkin osannut tehdä...

      • Bittioperointi

        Jeps. Homma on nyt kunnossa ja tein sen seuraavanlaisella koodinpätkällä:

        for(i=0; i pistetulokset[i])
        {
        for(j=11; j>i; j--)
        pistetulokset[j] = pistetulokset[j-1];

        if(i != 13)
        pistetulokset[i] = pisteet;

        break;
        }
        }

        Pisteet-muuttuja siis sisältää pelaajan keräämät pisteet. Pienensin pistetulokset-taulukon 12 alkion kokoiseksi. Joku syy mulla siihenkin oli, mutten nyt enää muista mikä. Ennen kuin keksin tuon koodinpätkän, yritin siirtoa yhdellä for-silmukalla, mutta sen myötä uusi tulos ilmaantui aina taulukon ensimmäiseen alkioon siinä olevan vanhan tuloksen päälle.

        Käyttämäni EEPROM-muisti on Atmega32-ohjaimen sisäistä eepromia. Pääsen siihen käsiksi luultavasti paljon yksinkertaisemmin, kuin yleisesti. Käyttämäni kääntäjäympäristö CodevisionAVR sallii eepromin käytön tavallisten globaalien muuttujien tapaan. Erikoisuutena tarvitaan ainoastaan eeprom-etuliite muuttujamäärittelyyn. Ei siis ole tarpeen huolehtia mistään muistiosoitteista tai kirjoitusfunktioista. Taulukon esittely ohjelmassani tapahtuu funktioiden ulkopuolella seuraavasti:

        eeprom unsigned int pistetulokset[12] = {0,0,0,0,0,0,0,0,0,0,0,0};

        Ja siinä kaikki. Tuota 12:n alkion kokoista etumerkitöntä positiivista kokonaislukutaulukkoa voi nyt käyttää samoin, kuin RAM-muistissa sijaitsevaa globaalia taulukkoa. Hienoa siinä on myös se, että määrittelyyn kirjoitetusta alustuksesta huolimatta alustus ei tapahdu joka kerta, kun ohjaimen resetoi, vaan ainoastaan silloin, kun ohjelman lataa flash-muistiin ulkoisella ohjelmointilaitteella.


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

    Luetuimmat keskustelut

    1. Voiko normaali ihminen ryhtyä vasemmistolaiseksi?

      Tätä jäin pohdiskelemaan.
      Maailman menoa
      203
      4266
    2. SDP haluaa 40 000 nettomaahanmuuttajaa

      SDP:n Suunnanmuutos-vaihtoehtobudjetissa, käy ilmi, että demarit itse asiassa vaativat räjähdysmäistä ”työperäisen” maah
      Maailman menoa
      146
      3798
    3. Orpo: Velkajarrua vastustavaa puoluetta vaikea ajatella hallitukseen

      No Minja Koskelan kommunistipuolue jäi ulos tuosta. Kaikki eduskuntapuolueet vasemmistoliittoa lukuun ottamatta sopivat
      Maailman menoa
      137
      3261
    4. Hienoa! Eduskunta luopui käteisen käytöstä

      Nyt tuo sama muutos pitää saada myös muuhun yhteiskuntaan. Käteistähän ei tarvitse tänä päivänä enää kuin rikolliset.
      Maailman menoa
      52
      1638
    5. Ikävä sinua mies

      Vuosia kuluu, mutta tunteet ei ole hävinnyt. Tasoittuneet toki, kun ei olla nähty. Järki palannut päähän kuitenkin. Se i
      Ikävä
      19
      1538
    6. Mikä tämä henkilö mahtaa touhuta Parkanossa

      Kamalaa https://www.ylasatakunta.fi/teksti/pirkanmaan-karajaoikeus-vangitsi-koiran-tappamisesta-epaillyn-6.68.127794.b58
      Parkano
      34
      1490
    7. Sulla on avaimet ja keinot

      Jos haluat jatkaa tutustumista. Itse olen niin jäässä etten pysty tekemään enää mitään. Pidempi keppi johon on helpompi
      Ikävä
      25
      1395
    8. Orpo loukkaantui fasismiin viittaavasta sanavalinnasta

      Mutta miksi loukkaantui? Orpohan on tehnyt yhteistyötä fasistien kanssa jo vuonna 2019, siis jo neljä vuotta ennen loukk
      Maailman menoa
      27
      1351
    9. Kiinnostaa - ei kiinnosta - kiinnostaapas

      Selittäkää hämmentyneelle miksi miehiä ei ikinä kiinnosta silloin, kun sitä olisi itsekin kiinnostunut? Sitten kun siirt
      Sinkut
      117
      1165
    10. Martina haluaa Marbellaan

      Martinan tekisi mieli ottaa lennot Marbellaan, jossa näkisisi kauniita ja hyväntuulisia ihmisiä. No sitten pitää matkust
      Kotimaiset julkkisjuorut
      215
      1063
    Aihe