Jak elegancko przekazać liczbe do wskaźnika?

W tym miejscu zadajemy pytania na temat języka C, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

Jak elegancko przekazać liczbe do wskaźnika?

Postautor: WoodPaker » czwartek 19 maja 2016, 20:05

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ś?
Life is to short to eject USB safely

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

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

Postautor: Antystatyczny » czwartek 19 maja 2016, 20:20

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);
}
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
PROTON
Expert
Expert
Posty: 527
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

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

Postautor: PROTON » czwartek 19 maja 2016, 20:39

Wystarczy:

wiringPiSPIDataRW(CHANELL, &data, 1) ;
Gott weiß ich will kein Engel sein.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

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

Postautor: Antystatyczny » czwartek 19 maja 2016, 20:42

No tak, tak jest najprościej, ale sądziłem, że chodzi również o pozbycie się konieczności wpisywania parametru len
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

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

Postautor: WoodPaker » czwartek 19 maja 2016, 21:13

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;
}
Ostatnio zmieniony czwartek 19 maja 2016, 21:20 przez WoodPaker, łącznie zmieniany 1 raz.
Life is to short to eject USB safely

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

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

Postautor: Antystatyczny » czwartek 19 maja 2016, 21:15

void SendCMD(INT8U index) przyjmuje jeden parametr, a Ty przekazujesz trzy. Czegoś tu nie rozumiem
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

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

Postautor: WoodPaker » czwartek 19 maja 2016, 21:20

Rozpedzilem sie... Juz poprawiłem
Life is to short to eject USB safely

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

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

Postautor: Antystatyczny » czwartek 19 maja 2016, 21:21

Tak, teraz powinno być dobrze
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

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

Postautor: WoodPaker » czwartek 19 maja 2016, 21:26

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)
Life is to short to eject USB safely

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

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

Postautor: Antystatyczny » czwartek 19 maja 2016, 21:27

Tak, pierwsza wersja niepotrzebnie ma wskaźnik oraz przypisanie do niego. To jest zbędne
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
PROTON
Expert
Expert
Posty: 527
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

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

Postautor: PROTON » czwartek 19 maja 2016, 21:32

Spokojnie, kompilator i tak zoptymalizuje.
Gott weiß ich will kein Engel sein.

Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

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

Postautor: WoodPaker » czwartek 19 maja 2016, 21:32

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?
Life is to short to eject USB safely

Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

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

Postautor: WoodPaker » czwartek 19 maja 2016, 21:34

INT80 jest zadeklarowany jako unsigned char (to tak dla potomnych)
Life is to short to eject USB safely

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

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

Postautor: Antystatyczny » czwartek 19 maja 2016, 21:34

Nie. Moim zdaniem powinieneś mieć return *data;
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

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

Postautor: WoodPaker » czwartek 19 maja 2016, 21:37

OK, dziękuję. Tego mi było trzeba. Niech wam Bozia wynagrodzi w Malinkach ;)
Life is to short to eject USB safely

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

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

Postautor: Antystatyczny » czwartek 19 maja 2016, 21:38

Możesz również zwrócić index. Return index;
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.


Wróć do „Pisanie programów w C”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość