Arduino - ukazatel pole jako parametr funkce

robin martinez

  • *****
  • 892
  • Have you hugged your toilet today?
    • Zobrazit profil
    • Null Storage
    • E-mail
Arduino - ukazatel pole jako parametr funkce
« kdy: 31. 03. 2014, 13:38:54 »
Ahoj, jelikož vím, že tu pár lidí s arduinem (teoreticky i pouhým Céčkem) dělá, měl bych dotaz, který nemůžu rozlousknout...

mám pole:
int x = 8;    //x se může měnit
byte  led
  • = {1,2,3,4,5,6,7,8};[/b]

    a funkci, která jeho obsah posílá shiftem na externě připojený registr s LEDkama:

    Kód: [Vybrat]
    void SendToLed(byte *(data)[])
    {
      digitalWrite(latchPinOut, 0);
      delayMicroseconds(20);
      for(byte x = numDigital; x > 0; x--) {
        shiftOut(dataPinOut, clockPin, *(data + x)); 
      }
      digitalWrite(latchPinOut, 1);
    }

    funkci pak volám:

    SendToLed(&led);

    chci tedy to pole posílat referencí a furt mi to nějak nejde, je tu někdo, kdo by poradil?
    momentálně mi to píše chybu typu: "cannot convert 'byte (*)[8]' to 'byte**''. V ukazatelích jsem zběhnutej, ale nevím, co tam můžu mít blbě, zkoušel jsem různé varianty tech pointerů a referencí, ale bez úspěchu :X

    Díky
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.

I do Linux, Hardware and spaghetti code in PHP, Python and JavaScript


robin martinez

  • *****
  • 892
  • Have you hugged your toilet today?
    • Zobrazit profil
    • Null Storage
    • E-mail
Re:Arduino - ukazatel pole jako parametr funkce
« Odpověď #1 kdy: 31. 03. 2014, 13:40:52 »
pole:
Kód: [Vybrat]
int x = 8;    //x se může měnit
byte  led[x] = {1,2,3,4,5,6,7,8};

funkci deklaruji:

Kód: [Vybrat]
void SendToLed(byte *(data)[])
{
  digitalWrite(latchPinOut, 0);
  delayMicroseconds(20);
  for(byte x = numDigital; x > 0; x--) {
    shiftOut(dataPinOut, clockPin, *(data + x)); 
  }
  digitalWrite(latchPinOut, 1);
}

funkci volám:

Kód: [Vybrat]
SendToLed(&led);
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.

I do Linux, Hardware and spaghetti code in PHP, Python and JavaScript

robin martinez

  • *****
  • 892
  • Have you hugged your toilet today?
    • Zobrazit profil
    • Null Storage
    • E-mail
Re:Arduino - ukazatel pole jako parametr funkce
« Odpověď #2 kdy: 31. 03. 2014, 13:41:36 »
edit: fakt by to tu nechtělo editaci příspěvků?
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.

I do Linux, Hardware and spaghetti code in PHP, Python and JavaScript

v

Re:Arduino - ukazatel pole jako parametr funkce
« Odpověď #3 kdy: 31. 03. 2014, 13:50:32 »
SendToLed(led); nebo SendToLed(&led[0]);

robin martinez

  • *****
  • 892
  • Have you hugged your toilet today?
    • Zobrazit profil
    • Null Storage
    • E-mail
Re:Arduino - ukazatel pole jako parametr funkce
« Odpověď #4 kdy: 31. 03. 2014, 13:53:39 »
Ha! Díky, odzkoušet to zatím nemůžu, ale už to nepíše chybu... Nevím, co se stalo, ale dík!
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.

I do Linux, Hardware and spaghetti code in PHP, Python and JavaScript


Michal Kovacic

Re:Arduino - ukazatel pole jako parametr funkce
« Odpověď #5 kdy: 31. 03. 2014, 14:02:21 »
Ahoj, jelikož vím, že tu pár lidí s arduinem (teoreticky i pouhým Céčkem) dělá, měl bych dotaz, který nemůžu rozlousknout...

mám pole:
int x = 8;    //x se může měnit
byte  led
  • = {1,2,3,4,5,6,7,8};[/b]

    a funkci, která jeho obsah posílá shiftem na externě připojený registr s LEDkama:

    Kód: [Vybrat]
    void SendToLed(byte *(data)[])
    {
      digitalWrite(latchPinOut, 0);
      delayMicroseconds(20);
      for(byte x = numDigital; x > 0; x--) {
        shiftOut(dataPinOut, clockPin, *(data + x)); 
      }
      digitalWrite(latchPinOut, 1);
    }

    funkci pak volám:

    SendToLed(&led);

    chci tedy to pole posílat referencí a furt mi to nějak nejde, je tu někdo, kdo by poradil?
    momentálně mi to píše chybu typu: "cannot convert 'byte (*)[8]' to 'byte**''. V ukazatelích jsem zběhnutej, ale nevím, co tam můžu mít blbě, zkoušel jsem různé varianty tech pointerů a referencí, ale bez úspěchu :X

    Díky
V ukazatelích nejsem úplne zbehlej (ať to znamená cokoli) ale pokud ma funkce pracovat s polem bytu, pak to pracovat nebude...
Možnosti náprav je několik ale asi nejjednodušší bude deklarovat

void SendToLed(byte* data)

A volat ji

SendToLed(led)

Je mozné, ze to vypíše nějaké varováni, ale mělo by to pracovat.
Další možnosti jsou složitější na různé závorky, ale jde to.

robin martinez

  • *****
  • 892
  • Have you hugged your toilet today?
    • Zobrazit profil
    • Null Storage
    • E-mail
Re:Arduino - ukazatel pole jako parametr funkce
« Odpověď #6 kdy: 31. 03. 2014, 14:06:56 »
Díky, já netušil, že se musí poslat ten první prvek, tedy fce(&pole[0]); a už vůbec jsem netušil, že jde poslat jen jméno pole bez reference: fce(pole);

Budu doufat, že to pak půjde (kódim - respektive upravuju něco z netu - to tady bez hardwaru, ten příjde až dýl). Díky za osvětu...
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.

I do Linux, Hardware and spaghetti code in PHP, Python and JavaScript

v

Re:Arduino - ukazatel pole jako parametr funkce
« Odpověď #7 kdy: 31. 03. 2014, 14:12:39 »
teď jsem se ještě podíval na váš kód a musím se připojit ke kolegovi, tu funkci si přepište

Tomáš Marný

Re:Arduino - ukazatel pole jako parametr funkce
« Odpověď #8 kdy: 31. 03. 2014, 15:44:40 »
Asi budu vypadat jako že si chci akorát rejpnout, ale v základech jazyka C opravdu, ale opravdu tápeš. Ušetřil by sis spoustu času, kdyby sis pořídil nějakou normální učebnici jazyka C (Heroutova Učebnice jazyka C by nemusela být špatnou volbou) a celou si ji pročetl, včetně vypracování úkolů. Protože jinak se tu budeš stále dokola ptát na základní věci a programovat stejně neohrabaným způsobem, jako to ukazuješ na svém příkladu (nejen, že tam máš tu chybu, ale takhle se to fakt nedělá; ne že by to bylo vyloženě špatně, ale přesně totéž, co jsi napsal, dělá operátor indexace - hranaté závorky; druhá možnost je použití dereference s dekrementací - např. *ptr--, která může být rychlejší v závislosti na schopnostech překladače a použité architektury).
Taky naprosto tápeš (jako spousta začátečníků) v syntaxi deklarací a matláš tam zbytečné závorky, které to celé akorát znepřehledňují. Takže věz, že při zápisu/čtení deklarací se postupuje od deklarovaného objektu nejdřív doprava a pak od něj doleva, respektuje přitom kulaté závorky. Takže obklopit závorkami jen samotný deklarovaný identifikátor je asi tak stejně smysluplné, jako v matematickém výrazu dát do závorky jedno nezáporné číslo.
Příklad:

Kód: [Vybrat]
int *x[]1. "x" je... (postupuju dále doprava)
2. ...pole... (napravo už nic není, takže pokračuji od "x" směrem doleva)
3. ...ukazatelů... (jdu dále doleva)
4. ...na "int". (hotovo)

Kód: [Vybrat]
int (*x)[]1. "x" je... (postupuji doprava, ale narážím na závorku, takže se obracím doleva)
2. ...ukazatel (postupuju dále doleva, ale narážím na levou závorku, takže pokračuju od pravé závorky dále doprava)
3. ...na pole (napravo už nic není, takže jdu od levé závorky dále doleva)
4. ..."int"ů. (hotovo)

Kód: [Vybrat]
int *x()1. "x" je...
2. ...funkce...
3. ...vracející ukazatel...
4. ...na "int"

Kód: [Vybrat]
int (*x)()1. "x" je...
2. ...ukazatel...
3. ...na funkci...
4. ...vracející "int"

atd...

Taky mechanické používání referenčního operátoru svědčí o naprostém nepochopení jeho smyslu - C používá jen předávání proměnné hodnotou, takže v některých případech je třeba předat ukazatel na samotnou proměnnou místo pouhé kopie její hodnoty, a to pomocí referenčního operátoru &. Jenže když nějaká proměnná sama o sobě již ukazatelem je už jaksi ze své podstaty - jako třeba pole, tak je použití další reference zbytečné, v 99% případů samozřejmě nezamýšlené a tím pádem chybné. Dále, argumenty se funkci neposílají, ale předávají. V OOP se posílají zprávy objektům. Ale to všechno jsou základy, které se dají vyčíst z jakékoli učebnice.

Re:Arduino - ukazatel pole jako parametr funkce
« Odpověď #9 kdy: 31. 03. 2014, 16:21:56 »
Díky, já netušil, že se musí poslat ten první prvek, tedy fce(&pole[0]); a už vůbec jsem netušil, že jde poslat jen jméno pole bez reference: fce(pole);

Budu doufat, že to pak půjde (kódim - respektive upravuju něco z netu - to tady bez hardwaru, ten příjde až dýl). Díky za osvětu...

pole je totiz uz sam o sobe ukazatel. pole[4] je pak ekvivalentni *(pole+4)
Jak rikali predrecnici, zopakovat si, jak se chovaji pole a pointery v C :)

robin martinez

  • *****
  • 892
  • Have you hugged your toilet today?
    • Zobrazit profil
    • Null Storage
    • E-mail
Re:Arduino - ukazatel pole jako parametr funkce
« Odpověď #10 kdy: 31. 03. 2014, 16:23:12 »
Jojo, tyhle věci (napůl) znám. Jak jsem (špatně) napsal, tak vím, o co jde, ale nikdy jsem s tím jakože pořádně nedělal...

Nicméně se špatným/nevhodným použitím referenčního operátoru souhlasím. Koukl jsem do "Herouta", přečetl znovu a už jsem si vzpomněl!


Tomaskom: ano, *(pole+4) znám a dokonce to tam v programu i používám.
Já nejsem blbej, jen někdy potřebuju nakopnout :D
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.

I do Linux, Hardware and spaghetti code in PHP, Python and JavaScript