Strona 1 z 1

Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 20:05
autor: WoodPaker
Witajcie drodzy użytkownicy forum microgeek.eu. Mam mały problem dotyczący przekazywania argumentu do funkcji.
Funkcja jest zdefiniowana w następujący sposób:

Kod: Zaznacz cały

int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ;

Jednakże ja chciałbym wysłać jeden bajt, jedną 8 bit liczbę. A robie to wszystko w innej funkcji bo przy okazji SPI muszę pomigać kilkoma innymi pin'ami. Robie to w ten sposób:

Kod: Zaznacz cały

void SendCMD(INT8U index)
{
    digitalWrite(_DC,LOW);
    digitalWrite(_CS,LOW);
    INT8U   *send=&index;
    wiringPiSPIDataRW(CHANELL, send, 1) ;
    digitalWrite(_CS,HIGH);
}

Moje pytanie brzmi. Czy można przekazać tę liczbę w sposób bardziej elegancki? Jak wpiszę

Kod: Zaznacz cały

wiringPiSPIDataRW(CHANELL, index, 1);

to mi się rzuca (i prawidłowo), że próbuję przekazać liczbę bez zamiany do wskaźnika. Ktoś? Coś?

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 20:20
autor: Antystatyczny
A spróbuj tak:

Kod: Zaznacz cały

void SendCMD(INT8U index)
{
    digitalWrite(_DC,LOW);
    digitalWrite(_CS,LOW);
    INT8U   *send;
    *send = index;
    wiringPiSPIDataRW(CHANELL, send, 1) ;
    digitalWrite(_CS,HIGH);
}


ewentualnie tak:

Kod: Zaznacz cały

void SendCMD(INT8U *index)
{
    digitalWrite(_DC,LOW);
    digitalWrite(_CS,LOW);
    wiringPiSPIDataRW(CHANELL, index, 1) ;
    digitalWrite(_CS,HIGH);
}

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 20:39
autor: PROTON
Wystarczy:

wiringPiSPIDataRW(CHANELL, &data, 1) ;

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 20:42
autor: Antystatyczny
No tak, tak jest najprościej, ale sądziłem, że chodzi również o pozbycie się konieczności wpisywania parametru len

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 21:13
autor: WoodPaker
Nie, nie. Parametr len zostaje bo funkcja wiringPiSPIDataRW jest zdefiniowana w osobnej bibliotece, do której nie mam (i nie chce mieć) dostępu. Chodziło mi raczej jak wpisać liczbę do tej funkcji wiedząc, że *data jest wskaźnikiem. Zatem czy to co teraz napisze jest poprawnie?

Kod: Zaznacz cały

void SendCMD(INT8U index)
{
    digitalWrite(_DC,LOW);
    digitalWrite(_CS,LOW);
    wiringPiSPIDataRW(CHANELL,&index, 1) ;
    digitalWrite(_CS,HIGH);
}

int main()
{
    printf("Wsylam...");
    SendCMD(233);
    printf("Wyslalem...");
    return 0;
}

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 21:15
autor: Antystatyczny
void SendCMD(INT8U index) przyjmuje jeden parametr, a Ty przekazujesz trzy. Czegoś tu nie rozumiem

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 21:20
autor: WoodPaker
Rozpedzilem sie... Juz poprawiłem

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 21:21
autor: Antystatyczny
Tak, teraz powinno być dobrze

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 21:26
autor: WoodPaker
Dziękuję Ci dobry człowieku. A powiedz mi. Pierwsza wersja też jest poprawnie tylko dłużej, prawda? (się muszę upewnić, że nie zgłupiałem do końca od czasu kiedy pisałem ostatni program)

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 21:27
autor: Antystatyczny
Tak, pierwsza wersja niepotrzebnie ma wskaźnik oraz przypisanie do niego. To jest zbędne

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 21:32
autor: PROTON
Spokojnie, kompilator i tak zoptymalizuje.

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 21:32
autor: WoodPaker
OK. To jeden problem z głowy. Ale jako, że funkcja wiringPiSPIDataRW(CHANELL,&index, 1) nadpisuje bufor tym co otrzymuje od SPI to w takim razie kod

Kod: Zaznacz cały

INT8U SendCMD(INT8U index)
{
    digitalWrite(_DC,LOW);
    digitalWrite(_CS,LOW);
    INT8U *data=&index
    wiringPiSPIDataRW(CHANELL,data, 1) ;
    digitalWrite(_CS,HIGH);
    return data;
}

int main()
{
    printf("Wsylam...\n");
    INT8U data=SendCMD(233);
    printf("Otrzymalem %d\n",data);
    return 0;
}

Jest poprawny?

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 21:34
autor: WoodPaker
INT80 jest zadeklarowany jako unsigned char (to tak dla potomnych)

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 21:34
autor: Antystatyczny
Nie. Moim zdaniem powinieneś mieć return *data;

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 21:37
autor: WoodPaker
OK, dziękuję. Tego mi było trzeba. Niech wam Bozia wynagrodzi w Malinkach ;)

Re: Jak elegancko przekazać liczbe do wskaźnika?

: czwartek 19 maja 2016, 21:38
autor: Antystatyczny
Możesz również zwrócić index. Return index;