Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Luokan korvike C:ssä

Sivun loppuun

Kestis [14.03.2018 10:58:10]

#

Olen ohjelmoinut jonkin verran C++:aa, C#:a ja PHP:tä. Nyt aloitin sulautetun projektin ja kyseistä mikrokontrolleria ohjelmoidaan C:llä. Muuten OK, mutta kun C:ssä ei ole luokkia.

Tarvitsemani ohjelma kannattaisi ilman muuta toteuttaa luokkien avulla, jos se vain olisi mahdollista.
Miten tällaista olisi lähdettävä toteuttamaan? Laitanko datan tietueeseen ja funktioita, jotka saavat ja paluttavat kyseisiä tietueita?

Grez [14.03.2018 13:58:43]

#

Kestis kirjoitti:

Tarvitsemani ohjelma kannattaisi ilman muuta toteuttaa luokkien avulla, jos se vain olisi mahdollista.
Miten tällaista olisi lähdettävä toteuttamaan?

Se riippuu ihan täysin siitä, millainen tarvitsemasi ohjelma on. Nythän emme tiedä siitä mitään muuta kuin näkemyksesi, että se kannattaisi toteuttaa luokkkien avulla.

Mutta tosiaan POCO-tyyppisen luokan voi korvata ihan vaan structilla ja jos siellä on ei-staattisia funktioita, niin niissä sitten viittaus näennäisen olion sisältämään dataan.

class LukuPari {
    public int LukuA;
    public int LukuB;
    public int Tulo() {
       return LukuA*LukuB;
    }
}
struct LukuPari {
    int LukuA;
    int LukuB;
}
LukuPari_Tulo(LukuPari* this) {
    return this->LukuA * this->LukuB;
}

Pahoittelut jos pointterit yms. kusee kun ei tule C:llä aktiivisesti koodattua.

Kestis [14.03.2018 18:51:39]

#

Ohjelma tulee ajamaan useita PID-säätimiä. Koska PID-säätimeen liittyy useita muuttujia, kuten viritysparametrit, asetusarvo, virhe, edellinen virhe, integraali ym., niin mielestäni kannattaisi tehdä PID-luokka. Wikipedia antaa seuraavan pseudokoodin:

previous_error = 0
integral = 0
loop:
  error = setpoint - measured_value
  integral = integral + error * dt
  derivative = (error - previous_error) / dt
  output = Kp * error + Ki * integral + Kd * derivative
  previous_error = error
  wait(dt)
  goto loop

Jos ohjelma tehtäisiin C++:lla, niin luokan muuttujia olisivat siis previous_error, integral, setpoint, Kp, Ki ja Kd. Jäsenfunktiona olisi funktio, joka laskee tuon loopin sisällä olevan osuuden päivittäen previous_errorin ja integraalin ja palauttaen outputin. Funktiota kutsuttaisiin mainista joka kierroksella ja se saisi parametreina measured_valuen ja dt:n.

jalski [14.03.2018 19:52:02]

#

Kestis kirjoitti:

Ohjelma tulee ajamaan useita PID-säätimiä. Koska PID-säätimeen liittyy useita muuttujia, kuten viritysparametrit, asetusarvo, virhe, edellinen virhe, integraali ym., niin mielestäni kannattaisi tehdä PID-luokka.

Ihan mielenkiinnosta, mikä on sovellus? Jos PI-säätö ei ole hirveän hidas, niin itse unohtaisin derivoivan osan kokonaan.

Grez [14.03.2018 20:06:22]

#

Ihan yhtä hyvinhän tuo toimii jos tekee PID struktuurin ja sitten niistä taulukon ja loopissa pyörittää aina kaikkien PIDien laskemisen. Itse asiassa tuonn kääriminen luokkaan ei tuossa sovelluksessa mielestäni tuo mitään lisäarvoa.

Ilman structiakin toimii kun tekee kustakin muuttujasta oman taulukkonsa.

Kestis [15.03.2018 09:56:19]

#

jalski kirjoitti:

Ihan mielenkiinnosta, mikä on sovellus? Jos PI-säätö ei ole hirveän hidas, niin itse unohtaisin derivoivan osan kokonaan.

Sovellus on paineilmakompressorin tuottaman paineen säätö imukanavaa kuristamalla. Yhdellä PID-säätimellä tehdään servo, joka kääntää imukanavassa olevaa läppäventtiiliä. Toinen PID pyrkii pitämään painepuolen paineen halutussa ohjaamalla kuristuksen määrää. Tavoitteena on saada pinennettyä tarvittavan paineilmasäiliön kokoa.

Varmasti tuon ilman luokkia saa tehtyä, mutta se sattuu olemaan minulle se tutuin tapa totetuttaa tämän tapaisia ohjelmia.

Grez [15.03.2018 13:10:20]

#

Kestis kirjoitti:

Varmasti tuon ilman luokkia saa tehtyä, mutta se sattuu olemaan minulle se tutuin tapa totetuttaa tämän tapaisia ohjelmia.

Ok, eli kyse ei ollutkaan siitä, että "ohjelma kannattaisi ilman muuta toteuttaa luokkien avulla" vaan siitä että olet tottunut käyttämään luokkia.

Mutta ei hätää. Voithan toteuttaa ohjelman vaikka C#:lla käyttäen luokkia. Sitten kun olet simuloinut ohjelman toimivan niin kuin haluat, voit portata sen luokkien osalta suht triviaalisti C:ksi (esim. kuten tuossa edellä esitin)

Toki C#:ssa on tarjolla kaikkea muutakin kuin luokat joita saattaisit vahingossa käyttää ja joita mikrokontrollerin C-ympäristö ei välttämättä tue.

_Pete_ [23.03.2018 13:07:46]

#

Kestis kirjoitti:

(14.03.2018 10:58:10): Olen ohjelmoinut jonkin verran C++:aa, C#:a ja...

Jos oikeasti haluaa "Objekteja" C:llä niin yksi toteutus on GLib:

https://en.wikipedia.org/wiki/GObject

jalski [23.03.2018 19:07:08]

#

_Pete_ kirjoitti:

Jos oikeasti haluaa "Objekteja" C:llä niin yksi toteutus on GLib:

https://en.wikipedia.org/wiki/GObject

Tässä tapauksessa viestiketjun aloittaja oli tekemässä ohjelmaa mikrokontrollerille, jolloin moinen kirjasto ei liene realistinen vaihtoehto.

Itse unohtaisin luokat kokonaan ja pitäisin koodin yksinkertaisena ilman turhia kikkailuja.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta