C ohjelman käynnistys parametrien välittäminen

Jos aikoo jollakin tavoin hyödyntää C -kielistä ohjelmassaan, Linux ohjelmista tuttua tapaa ohjata ohjelman suoritusta saateparametreilla, täytyy ohjelman pää runko alkaa: int main(int argc,char* argv[]) {} tutun int main() sijasta.

Jos nyt tässäkin käytetään switch() selvitystä parametrien mukaiseen haarautumiseen ohjelman sisällä, tuottaa joidenkin merkkien välittäminen ongelmia, yksi näistä on kertomerkkinä tunnettu tähti *. Koska c -kielessä se on myös osoitintyyppisen muuttujan merkki.

int *ip;
double *dp;
float *fp;
char *ch

Yritin tämän eilen ilmestyneen kyselyn pohjalta rakentaa mat.c ohjelman, jossa parametreja ei kysellä ajon aikana, vaan ne annetaan käynnistyksen yhteydessä. Parametri selvityksessä käytin switch() selvitystä haaroittamaan laskutehtävän vaatimaan haaraan. Mutta jouduin käynnistysparametreissa laittamaan operaattorit lainausmerkkien sisään, joka ei todellakaan ole hyvä ratkaisu.

Esim.
mat 22.3 " " 33.4
mat 22.3 "-" 33.4
mat 22.3 "/" 33.4
mat 22.3 "*" 33.4

Olisiko jollakulla tähän helppoa ratkaisua tarjolla?

Koodi: https://pastebin.com/zQadffw9
31808
Äänestä

Muut lukivat myös

Vastaukset 31

Vanhimmat

Tuohan on täyttä asiaa. Itse olen syyllinen siihen void main(void) -esimerkkiin. Hyi minua.

Oliskos mitään jos laittaisi kohtuullisen tyypilliseen linux/unix -tyyliin jotensakin näin:

mat -a 2 3
5

mat -m 2 3
6

Eli -a olisi add ja -m olisi multiply ja niin edespäin?

Äänestä

Miksi käytät tuossa operaattorissa inttiä? Parametrithän ovat merkkitaulukkoja (char).
int op = *argv[2];

Kokeile tuohon op=argv[2];

Äänestä
  • Siis
    char op=argv[2];

    Äänestä

  • Anonyymi kirjoitti:

    Siis
    char op=argv[2];

    Tuolla onko se char vai int, ei käytännössä ole eroa, koska switch() käsittelee sitä kuitenkin sisäisesti kokonaislukuna. Kummallakin täytyy asiat hoitaa näin:

    >>> mat 22 - 33
    22.00 - 33.00 = -11.00
    >>> mat 22 33
    22.00 33.00 = 55.00
    >>> mat 22 / 33
    22.00 / 33.00 = 0.67
    >>> mat 22 "*" 33
    22.00 * 33.00 = 726.00

    eli tuo kertomerkki on sijoitettava lainausmerkkien sisään, muut merkit toimisivat hyvin. Nyt kun ajattelee että tuota laajentaa käsittämään kaikkia c kielen operaattoreita kuten

    1) Aritmeettiset operaattorit (5kpl)
    2) Vertailu - ja loogiset operaattorit (6kpl)
    3) Lisäys - ja vähennysoperaattorit (2kpl)
    4) Sijoitusoperaattori
    5) Ehto-operaattori
    6) Cast-operaattori
    7) Bittioperaattorit
    8) Pilkku-operaattori
    9) Sizeof-operaattori

    niin luulen että vastaan on tulossa lisää ongelmia tämän switch() lajittelun kanssa. Tämän laajennoksen lisäys jo antaisi ohjelmalle paikan komentoputkien osana, jossa tämä kykenee ottamaan vastaan toisen ohjelman syötteen ja myös antamaan ulos tuloksen siinä muodossa että komentoputki pystyy hyödyntämään tämän mat-ohjelman antamaa palautetta.


    Myöskään tämä (mat -a 2 3) tyylinen saateparametrien jako ei miellytä, mieluummin luovun tästä switch() lajittelusta, johonkin toiseen.

    Äänestä

  • Anonyymi kirjoitti:

    Tuolla onko se char vai int, ei käytännössä ole eroa, koska switch() käsittelee sitä kuitenkin sisäisesti kokonaislukuna. Kummallakin täytyy asiat hoitaa näin:

    >>> mat 22 - 33
    22.00 - 33.00 = -11.00
    >>> mat 22 33
    22.00 33.00 = 55.00
    >>> mat 22 / 33
    22.00 / 33.00 = 0.67
    >>> mat 22 "*" 33
    22.00 * 33.00 = 726.00

    eli tuo kertomerkki on sijoitettava lainausmerkkien sisään, muut merkit toimisivat hyvin. Nyt kun ajattelee että tuota laajentaa käsittämään kaikkia c kielen operaattoreita kuten

    1) Aritmeettiset operaattorit (5kpl)
    2) Vertailu - ja loogiset operaattorit (6kpl)
    3) Lisäys - ja vähennysoperaattorit (2kpl)
    4) Sijoitusoperaattori
    5) Ehto-operaattori
    6) Cast-operaattori
    7) Bittioperaattorit
    8) Pilkku-operaattori
    9) Sizeof-operaattori

    niin luulen että vastaan on tulossa lisää ongelmia tämän switch() lajittelun kanssa. Tämän laajennoksen lisäys jo antaisi ohjelmalle paikan komentoputkien osana, jossa tämä kykenee ottamaan vastaan toisen ohjelman syötteen ja myös antamaan ulos tuloksen siinä muodossa että komentoputki pystyy hyödyntämään tämän mat-ohjelman antamaa palautetta.


    Myöskään tämä (mat -a 2 3) tyylinen saateparametrien jako ei miellytä, mieluummin luovun tästä switch() lajittelusta, johonkin toiseen.

    Merkkijonothan ovat char-taulukoita, eivät integerejä.

    Ensimmäisen merkin saa taulukosta:

    char op=argv[2][0];

    Esimerkiksi '*' on shelleissä varattu muuhun käyttöön, ja sen eteen on laitettava escape-merkki '\'.

    laskin 1 \* 2 toimii, mutta laskin 1 * 2 ei.

    Äänestä

Tuohon jos jaksaisi vielä vääntää kunnollisen jakolaskun ja muutenkin laittaa sen toimimaan murtolukujenkin kanssa niin olis aika jees.

Sitten pitäisi tehdä vielä varmaan niin että sinne väliin voisi heittää niitä muita merkkejä niin että voisi kirjoittaa hyödyllisiä lauseita tyyliin sata plus kolme josta sitten miinus seiskyt.

Ehkä sittenkin lopulta olisi fiksumpi tehdä koko paska niillä plus ja miinus ja kertomerkeillä.

Ja sulut pitäisi ehdottomasti toteuttaa. Samoin kuin prosenttilasku.


Eiköhän poijjaat koodata koko matlab tässä joutessa :-D

Äänestä
  • Alkuun riittäisi joku tälläinen yhteensopivuus komentoputkissa;

    echo '10 20 30' | xargs mat {} / 3

    Äänestä

  • Anonyymi kirjoitti:

    Alkuun riittäisi joku tälläinen yhteensopivuus komentoputkissa;

    echo '10 20 30' | xargs mat {} / 3

    Tein yhden version tuosta komentoputkiin sovittamisesta. Pidin asiat yksinkertaisena, eikä niin ollen sisällä minkäänlaista virheen tarkistusta. Käyttö kuitenkin onnistuu näin:

    KERTOLASKU
    >>> echo '10 20 30' | xargs x "*" 3
    10.00 * 3.00 = 30.00
    20.00 * 3.00 = 60.00
    30.00 * 3.00 = 90.00

    JAKOLASKU
    >>> echo '10 20 30' | xargs x / 3
    10.00 / 3.00 = 3.33
    20.00 / 3.00 = 6.67
    30.00 / 3.00 = 10.00

    VÄHENNYSLASKU
    >>> echo '10 20 30' | xargs x - 3
    10.00 - 3.00 = 7.00
    20.00 - 3.00 = 17.00
    30.00 - 3.00 = 27.00

    YHTEENLASKU
    >>> echo '10 20 30' | xargs x 3
    10.00 3.00 = 13.00
    20.00 3.00 = 23.00
    30.00 3.00 = 33.00

    Eli tässä ideana on että ohjelman nimi on X. Tämän x.c koodi löytyy osoitteesta:
    https://pastebin.com/nXGwQimh

    Ei ole ohjelma ainakaan koolla pilattu, ja komentoputkea jalostamalla, syöte voidaan lukea vaikka tiedostosta. Mutta tässäkään ei päästy eroon tuosta "*" kertomerkin kehystämisestä lainausmerkeillä.

    Äänestä

  • Anonyymi kirjoitti:

    Alkuun riittäisi joku tälläinen yhteensopivuus komentoputkissa;

    echo '10 20 30' | xargs mat {} / 3

    Tein yhden version tuosta komentoputkiin sovittamisesta. Pidin asiat yksinkertaisena, eikä niin ollen sisällä minkäänlaista virheen tarkistusta. Käyttö kuitenkin onnistuu näin:

    KERTOLASKU
    >>> echo '10 20 30' | xargs x "*" 3
    10.00 * 3.00 = 30.00
    20.00 * 3.00 = 60.00
    30.00 * 3.00 = 90.00

    JAKOLASKU
    >>> echo '10 20 30' | xargs x / 3
    10.00 / 3.00 = 3.33
    20.00 / 3.00 = 6.67
    30.00 / 3.00 = 10.00

    VÄHENNYSLASKU
    >>> echo '10 20 30' | xargs x - 3
    10.00 - 3.00 = 7.00
    20.00 - 3.00 = 17.00
    30.00 - 3.00 = 27.00

    YHTEENLASKU
    >>> echo '10 20 30' | xargs x 3
    10.00 3.00 = 13.00
    20.00 3.00 = 23.00
    30.00 3.00 = 33.00

    Eli tässä ideana on että ohjelman nimi on X. Tämän x.c koodi löytyy osoitteesta:
    https://pastebin.com/nXGwQimh

    Ei ole ohjelma ainakaan koolla pilattu, ja komentoputkea jalostamalla, syöte voidaan lukea vaikka tiedostosta. Mutta tässäkään ei päästy eroon tuosta "*" kertomerkin kehystämisestä lainausmerkeillä.

    Äänestä

  • Anonyymi kirjoitti:

    Alkuun riittäisi joku tälläinen yhteensopivuus komentoputkissa;

    echo '10 20 30' | xargs mat {} / 3

    Tein yhden version tuosta komentoputkiin sovittamisesta. Pidin asiat yksinkertaisena, eikä niin ollen sisällä minkäänlaista virheen tarkistusta. Käyttö kuitenkin onnistuu näin:

    KERTOLASKU
    >>> echo '10 20 30' | xargs x "*" 3
    10.00 * 3.00 = 30.00
    20.00 * 3.00 = 60.00
    30.00 * 3.00 = 90.00

    JAKOLASKU
    >>> echo '10 20 30' | xargs x / 3
    10.00 / 3.00 = 3.33
    20.00 / 3.00 = 6.67
    30.00 / 3.00 = 10.00

    VÄHENNYSLASKU
    >>> echo '10 20 30' | xargs x - 3
    10.00 - 3.00 = 7.00
    20.00 - 3.00 = 17.00
    30.00 - 3.00 = 27.00

    YHTEENLASKU
    >>> echo '10 20 30' | xargs x 3
    10.00 3.00 = 13.00
    20.00 3.00 = 23.00
    30.00 3.00 = 33.00

    Eli tässä ideana on että ohjelman nimi on X. Tämän x.c koodi löytyy osoitteesta:
    https://pastebin.com/nXGwQimh

    Ei ole ohjelma ainakaan koolla pilattu, ja komentoputkea jalostamalla, syöte voidaan lukea vaikka tiedostosta. Mutta tässäkään ei päästy eroon tuosta "*" kertomerkin kehystämisestä lainausmerkeillä.

    Äänestä

  • Anonyymi kirjoitti:

    Alkuun riittäisi joku tälläinen yhteensopivuus komentoputkissa;

    echo '10 20 30' | xargs mat {} / 3

    Tein yhden version tuosta komentoputkiin sovittamisesta. Pidin asiat yksinkertaisena, eikä niin ollen sisällä minkäänlaista virheen tarkistusta. Käyttö kuitenkin onnistuu näin:

    KERTOLASKU
    >>> echo '10 20 30' | xargs x "*" 3
    10.00 * 3.00 = 30.00
    20.00 * 3.00 = 60.00
    30.00 * 3.00 = 90.00

    JAKOLASKU
    >>> echo '10 20 30' | xargs x / 3
    10.00 / 3.00 = 3.33
    20.00 / 3.00 = 6.67
    30.00 / 3.00 = 10.00

    VÄHENNYSLASKU
    >>> echo '10 20 30' | xargs x - 3
    10.00 - 3.00 = 7.00
    20.00 - 3.00 = 17.00
    30.00 - 3.00 = 27.00

    YHTEENLASKU
    >>> echo '10 20 30' | xargs x 3
    10.00 3.00 = 13.00
    20.00 3.00 = 23.00
    30.00 3.00 = 33.00

    Eli tässä ideana on että ohjelman nimi on X. Tämän x.c koodi löytyy osoitteesta:
    https://pastebin.com/nXGwQimh

    Ei ole ohjelma ainakaan koolla pilattu, ja komentoputkea jalostamalla, syöte voidaan lukea vaikka tiedostosta. Mutta tässäkään ei päästy eroon tuosta "*" kertomerkin kehystämisestä lainausmerkeillä.

    Äänestä

  • Anonyymi kirjoitti:

    Alkuun riittäisi joku tälläinen yhteensopivuus komentoputkissa;

    echo '10 20 30' | xargs mat {} / 3

    Tein yhden version tuosta komentoputkiin sovittamisesta. Pidin asiat yksinkertaisena, eikä niin ollen sisällä minkäänlaista virheen tarkistusta. Käyttö kuitenkin onnistuu näin:

    Kertolasku
    >>> echo '10 20 30' | xargs x "*" 3
    10.00 * 3.00 = 30.00
    20.00 * 3.00 = 60.00
    30.00 * 3.00 = 90.00

    Jakolasku
    >>> echo '10 20 30' | xargs x / 3
    10.00 / 3.00 = 3.33
    20.00 / 3.00 = 6.67
    30.00 / 3.00 = 10.00

    Vähennyslasku
    >>> echo '10 20 30' | xargs x - 3
    10.00 - 3.00 = 7.00
    20.00 - 3.00 = 17.00
    30.00 - 3.00 = 27.00

    Yhteenlasku
    >>> echo '10 20 30' | xargs x 3
    10.00 3.00 = 13.00
    20.00 3.00 = 23.00
    30.00 3.00 = 33.00

    Eli tässä ideana on että ohjelman nimi on X. Tämän x.c koodi löytyy osoitteesta:
    https://pastebin.com/nXGwQimh

    Ei ole ohjelma ainakaan koolla pilattu, ja komentoputkea jalostamalla, syöte voidaan lukea vaikka tiedostosta. Mutta tässäkään ei päästy eroon tuosta "*" kertomerkin kehystämisestä lainausmerkeillä.

    Äänestä

  • Anonyymi kirjoitti:

    Alkuun riittäisi joku tälläinen yhteensopivuus komentoputkissa;

    echo '10 20 30' | xargs mat {} / 3

    Tein yhden version tuosta komentoputkiin sovittamisesta. Pidin asiat yksinkertaisena, eikä niin ollen sisällä minkäänlaista virheen tarkistusta. Käyttö kuitenkin onnistuu näin:

    Kertolasku
    >>> echo '10 20 30' | xargs x "*" 3

    Jakolasku
    >>> echo '10 20 30' | xargs x / 3

    Vähennyslasku
    >>> echo '10 20 30' | xargs x - 3

    Yhteenlasku
    >>> echo '10 20 30' | xargs x 3

    Eli tässä ideana on että ohjelman nimi on X. Tämän x.c koodi löytyy osoitteesta:
    https://pastebin.com/nXGwQimh

    Ei ole ohjelma ainakaan koolla pilattu, ja komentoputkea jalostamalla, syöte voidaan lukea vaikka tiedostosta. Mutta tässäkään ei päästy eroon tuosta "*" kertomerkin kehystämisestä lainausmerkeillä.

    Äänestä

  • Anonyymi kirjoitti:

    Alkuun riittäisi joku tälläinen yhteensopivuus komentoputkissa;

    echo '10 20 30' | xargs mat {} / 3

    Tein yhden version tuosta komentoputkiin sovittamisesta. Pidin asiat yksinkertaisena, eikä niin ollen sisällä minkäänlaista virheen tarkistusta. Käyttö kuitenkin onnistuu näin:

    Kertolasku
    >>> echo '10 20 30' | xargs x "*" 3
    10.00 * 3.00 = 30.00
    20.00 * 3.00 = 60.00
    30.00 * 3.00 = 90.00

    Jakolasku
    >>> echo '10 20 30' | xargs x / 3
    10.00 / 3.00 = 3.33
    20.00 / 3.00 = 6.67
    30.00 / 3.00 = 10.00

    Vähennyslasku
    >>> echo '10 20 30' | xargs x - 3
    10.00 - 3.00 = 7.00
    20.00 - 3.00 = 17.00
    30.00 - 3.00 = 27.00

    Yhteenlasku
    >>> echo '10 20 30' | xargs x 3
    10.00 3.00 = 13.00
    20.00 3.00 = 23.00
    30.00 3.00 = 33.00

    Eli tässä ideana on että ohjelman nimi on X. Tämän x.c koodi löytyy osoitteesta:
    https://pastebin.com/nXGwQimh

    Ei ole ohjelma ainakaan koolla pilattu, ja komentoputkea jalostamalla, syöte voidaan lukea vaikka tiedostosta. Mutta tässäkään ei päästy eroon tuosta "*" kertomerkin kehystämisestä lainausmerkeillä.

    Äänestä

  • Anonyymi kirjoitti:

    Tein yhden version tuosta komentoputkiin sovittamisesta. Pidin asiat yksinkertaisena, eikä niin ollen sisällä minkäänlaista virheen tarkistusta. Käyttö kuitenkin onnistuu näin:

    Kertolasku
    >>> echo '10 20 30' | xargs x "*" 3

    Jakolasku
    >>> echo '10 20 30' | xargs x / 3

    Vähennyslasku
    >>> echo '10 20 30' | xargs x - 3

    Yhteenlasku
    >>> echo '10 20 30' | xargs x 3

    Eli tässä ideana on että ohjelman nimi on X. Tämän x.c koodi löytyy osoitteesta:
    https://pastebin.com/nXGwQimh

    Ei ole ohjelma ainakaan koolla pilattu, ja komentoputkea jalostamalla, syöte voidaan lukea vaikka tiedostosta. Mutta tässäkään ei päästy eroon tuosta "*" kertomerkin kehystämisestä lainausmerkeillä.

    Tummosena että tulostaa koko laskukaavan x.c antamaa tulostetta on hankala käyttää komentoputkessa seuraavan vaiheen parametrina, joten lopullisessa versiossa joutuu tulosteen rajaamaan pelkkään vastaukseen. Tilapäisesti voi vastausta lyhentää vaikka näin:

    >>> echo '10 20 30' | xargs x - 3 | cut -c 15-25

    Kuten huomaat x.c istuu Linux komentojen joukkoon täydellisesti, vain operaatioita on lisättävä tarpeen mukaan. Luultavasti se sitten joskus on matlab ohjelman veroinen.

    Kuva nykyisen vastauksen lyhentämisen tuloksesta:
    https://s7.gifyu.com/images/Paate_117.png

    Äänestä

  • Anonyymi kirjoitti:

    Tummosena että tulostaa koko laskukaavan x.c antamaa tulostetta on hankala käyttää komentoputkessa seuraavan vaiheen parametrina, joten lopullisessa versiossa joutuu tulosteen rajaamaan pelkkään vastaukseen. Tilapäisesti voi vastausta lyhentää vaikka näin:

    >>> echo '10 20 30' | xargs x - 3 | cut -c 15-25

    Kuten huomaat x.c istuu Linux komentojen joukkoon täydellisesti, vain operaatioita on lisättävä tarpeen mukaan. Luultavasti se sitten joskus on matlab ohjelman veroinen.

    Kuva nykyisen vastauksen lyhentämisen tuloksesta:
    https://s7.gifyu.com/images/Paate_117.png

    Nyt+näyttönä+siitä+että+on+ymmärretty+tämän+x.c+ohjelman+merkitys,+voisi+joku+Linux+komentojen+tuntia+laatia+komentoputken+joka+ratkaisee+prosenttilaskutehtävän.Montako+kertaa+100+on+otettava+5%+pois,+ennekuin+luku+on+alle+1.+Tämähän+tarkoittaa+sitä+että+tämä+x.c+on+pistettävä+ruokkimaan+itseään.

    Äänestä

Jaha. Moderointi oli sitten poistanut sen mun lähdekoodin sisältävän viestin. Noh, ei se mitään. Tässä nyt edes linkki kuvaan siitä koodista. Jos tällä kertaa pysyisi.

https://i.postimg.cc/LRKQ952c/mat.jpg

Äänestä

Tuo kertomerkkiongelma johtunee siitä, että * on ns. wildcard-parametri, jolle Linux shell tekee jonkinlaisen "esikäsittelyn", ilmeisesti antaa sen tilalla kaikkien hakemistossa olevien tiedostojen nimet. Voit kokeilla vaikkapa tekaista sellaisen koodin pätkän, joka tulostaa kaikki ohjelman saamat parametrit, niin näet mitä tapahtuu.

Tuolta löytyy tästä aiheesta lisää, ja myös keino jolla tuon toiminnan saa estettyä 'noglob' optiolla. https://stackoverflow.com/questions/2617453/controlling-shell-command-line-wildcard-expansion-in-c-or-c

Äänestä
  • Tai sitten jos ei halua noglobilla rampauttaa wildcardien toimintaa, niin joutunee käyttämään kertomerkkinä jotain muuta, vaikkapa x kirjainta.

    Äänestä

Joku tuossa yläpuolella kehoitti alustamaan suoritusta BASH komentotulkissa komennolla:

set -o noglob

No kun tuon alustuksen tekee, ei kertomerkki (*) poikkea millään tavalla muista operaattoreista. Joten tuo on sisällytettävä tuohon x.c ohjelmaan. Siinä se ratkaisu sitten onkin.

Mutta toimiiko tuo nyt x.c ohjelmasta käsin asettaa ensin (set -o noglob) ja suorituksen jälkeen palauttaa tila ennalleen (unset noglob) komennolla. Testaan miten se tulee onnistumaan.

Äänestä

  • Anonyymi kirjoitti:

    Voi tehdä toki bash-skriptin, jonka alkuun laitat set-komennon. Tosin sitten menee vähän idea koko "laskimesta", kun saman voi tehdä suoraan bashilla..

    Bash-skripteistä tarinaa vaikka tuossa: https://likegeeks.com/linux-bash-scripting-awesome-guide-part3/

    Olet aivan oikeassa, on hyvin vaikeaa ellei mahdotonkin löytää jokin matemaattinen tehtävä mitä ei jo olemassa olevilla BASH komennoilla pysty ratkaisemaan, mutta tehtävästä riippuen asiantuntemusta pitää sitten löytyä että onnistuu.

    Äänestä

  • Tässä muuten tuo (argc-test.cpp) C kielinen testi ohjelma noiden saateparametrien näkyvyyttä testaamaan. Meni vahingossa C puolelle, mutta ei tällä kertaa ole merkitystä kumpi se on. https://pastebin.com/WjMSUV3A

    Äänestä

  • Anonyymi kirjoitti:

    Olet aivan oikeassa, on hyvin vaikeaa ellei mahdotonkin löytää jokin matemaattinen tehtävä mitä ei jo olemassa olevilla BASH komennoilla pysty ratkaisemaan, mutta tehtävästä riippuen asiantuntemusta pitää sitten löytyä että onnistuu.

    Kyllähän C-kieli kannattaa kuitenkin jollain tavalla opetella. On hyötyä esimerkiksi Arduinon kanssa touhutessa, vaikkei se yksi yhteen täysin sama olekaan. Bittitasolla nyplääminen on kuitenkin helppoa.

    Äänestä

  • Anonyymi kirjoitti:

    Voi tehdä toki bash-skriptin, jonka alkuun laitat set-komennon. Tosin sitten menee vähän idea koko "laskimesta", kun saman voi tehdä suoraan bashilla..

    Bash-skripteistä tarinaa vaikka tuossa: https://likegeeks.com/linux-bash-scripting-awesome-guide-part3/

    Nyt näyttää siltä että (x) käynnistimen joutuu tekemään, jossa olisi jotain tällaista;

    #!/usr/bin/env bash
    set -o noglob
    xx $@
    unset noglob

    eli työtekevä olisikin nimeltään xx ja käynnistin olisi x

    En saanut tuota set -komentoa toimimaan ohjelman sisältä, enkä myöskään ulkoisena komentona, eli tein erilliset BASH komentotiedostot päälle ja pois ottoa varten. Se kyllä suoritetaan, mutta sillä ei ole vaikutusta ohjelman kulkuun.

    Näin sen ajoin päälle ohjelmassa (x)
    system("setnoglob");

    Näin sen otin pois päältä lopuksi:
    system("unsetnoglob");

    Mitään virheitä ei kääntäessä esiinny, testasin myös normaaleilla Linux komennoilla, ja ne toimivat, esimerkiksi (ls) parametrien kanssa ja ilman. Käynnistimen kanssa asiat toimii kaikilta osin oikein.

    Mitäs tässä vielä kokeilisi?

    Äänestä

  • Anonyymi kirjoitti:

    Nyt näyttää siltä että (x) käynnistimen joutuu tekemään, jossa olisi jotain tällaista;

    #!/usr/bin/env bash
    set -o noglob
    xx $@
    unset noglob

    eli työtekevä olisikin nimeltään xx ja käynnistin olisi x

    En saanut tuota set -komentoa toimimaan ohjelman sisältä, enkä myöskään ulkoisena komentona, eli tein erilliset BASH komentotiedostot päälle ja pois ottoa varten. Se kyllä suoritetaan, mutta sillä ei ole vaikutusta ohjelman kulkuun.

    Näin sen ajoin päälle ohjelmassa (x)
    system("setnoglob");

    Näin sen otin pois päältä lopuksi:
    system("unsetnoglob");

    Mitään virheitä ei kääntäessä esiinny, testasin myös normaaleilla Linux komennoilla, ja ne toimivat, esimerkiksi (ls) parametrien kanssa ja ilman. Käynnistimen kanssa asiat toimii kaikilta osin oikein.

    Mitäs tässä vielä kokeilisi?

    Mainittakoon että ei tuo käynnistimen käyttö ole vallan tavaton juttu, koska myös Chromium ja Google Chrome käyttävät niitä, ajaakseen profiilikohtaiset asetukset voimaan. Muuten vaan en haluaisi antaa tuumaakaan periksi alkuperäisestä tavoitteesta.

    Äänestä

  • Anonyymi kirjoitti:

    Mainittakoon että ei tuo käynnistimen käyttö ole vallan tavaton juttu, koska myös Chromium ja Google Chrome käyttävät niitä, ajaakseen profiilikohtaiset asetukset voimaan. Muuten vaan en haluaisi antaa tuumaakaan periksi alkuperäisestä tavoitteesta.

    Nyt meni maku koko C-kielestä, kun ei löydy ratkaisua kuinka c -ohjelmassa saatetaan voimaan BASH Shell komento: set -o noglob

    Äänestä

  • Anonyymi kirjoitti:

    Nyt meni maku koko C-kielestä, kun ei löydy ratkaisua kuinka c -ohjelmassa saatetaan voimaan BASH Shell komento: set -o noglob

    Komentoputkissahan normaalistikin suositellaan käyttämään lainausmerkkejä, esimerkiksi hakemistorakenne ja verkko-osoitteet suorastaan pakottaa lainausmerkkien käyttöön.

    Äänestä

Nyt on jätkät kova meno! Ensimmäistä kertaa ikinä näen mitään järjellistä keskustelua suomi24:ssä!

Äänestä
  • Sämppärit joutuu sämppäämään ylimääräistä, kun välillä tulee asiallista ketjua etusivulle. Eivät mielellään anna kenenkään kirjoitella sellaista mistä eivät itse mitään ymmärrä.

    Äänestä

Säppäreiden kiusaksi.

Äänestä

Ketjusta on poistettu 1 sääntöjenvastainen viesti.

Kommentoi aloitusta


Anonyymi kirjoitti:

Jos aikoo jollakin tavoin hyödyntää C -kielistä ohjelmassaan, Linux ohjelmista tuttua tapaa ohjata ohjelman suoritusta saateparametreilla, täytyy ohjelman pää runko alkaa: int main(int argc,char* argv[]) {} tutun int main() sijasta.

Jos nyt tässäkin käytetään switch() selvitystä parametrien mukaiseen haarautumiseen ohjelman sisällä, tuottaa joidenkin merkkien välittäminen ongelmia, yksi näistä on kertomerkkinä tunnettu tähti *. Koska c -kielessä se on myös osoitintyyppisen muuttujan merkki.

int *ip;
double *dp;
float *fp;
char *ch

Yritin tämän eilen ilmestyneen kyselyn pohjalta rakentaa mat.c ohjelman, jossa parametreja ei kysellä ajon aikana, vaan ne annetaan käynnistyksen yhteydessä. Parametri selvityksessä käytin switch() selvitystä haaroittamaan laskutehtävän vaatimaan haaraan. Mutta jouduin käynnistysparametreissa laittamaan operaattorit lainausmerkkien sisään, joka ei todellakaan ole hyvä ratkaisu.

Esim.
mat 22.3 " " 33.4
mat 22.3 "-" 33.4
mat 22.3 "/" 33.4
mat 22.3 "*" 33.4

Olisiko jollakulla tähän helppoa ratkaisua tarjolla?

Koodi: https://pastebin.com/zQadffw9

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu