Wróciłem ostatnio do jednego ze swoich starych projektów, zrealizowanych w oparciu o PIC32. Chciałem dodać do niego jedną dość ważną funkcjonalność - możliwość wrzucania danych za pomocą MQTT. Udało mi się znaleźć bibliotekę napisaną w oparciu o starzy stos Microchipa (biblioteki MLA), który użyłem w swoim projekcie. Zależało mi na tym, bo nie chciałem przenosić całego kodu na nowsze biblioteki Harmony.
Przyjrzałem się bliżej kodowi i znalazłem przyczynę. Podczas parsowania pakietu CONNACK wywoływana jest funkcja MQTTReadPacket(), która pobiera dane z socketa do bufora MQTTBuffer. Potem jednak kod sprawdza stan stan bajtu rxBF[1], gdzie spodziewa się znaleźć Return Code i na jego podstawie podjąć decyzję do co dalszego działania.
Problem polega na tym, że w obecnej wersji kodu tablica rxBF nie jest nigdzie wykorzystywana. Nie trafiają do niej żadne dane (a więc również i pakiet CONNACK) i cały czas znajdują się w niej same zera. Program interpretuje więc odczytaną wartość jako Connection Accepted i przechodzi do dalszych czynności.
Chciałem się bliżej przyjrzeć funkcji MQTTReadPacket() i tutaj trafiłem do króliczej nory. ;)
Okazuje się, że została ona zdefiniowana i zdeklarowana z pustą listą parametrów (bez void), podobnie jak to się robi z bezparametrowymi funkcjami w C++. Widzę jednak, że w paru miejscach w kodzie funkcja przyjmuje parametr w postaci wskaźnika na BYTE, przykładowo:
BYTE llen; WORD len= MQTTReadPacket(&llen);
Potem zawartość takiej zmiennej jest wykorzystywana w kodzie jako element indeksu tablicy MQTTBuffer - również w tych częściach kodu, które działały prawidłowo. Szybkie poszukiwania w internecie ujawniły, że możliwość zdeklarowania pustej listy argumentów to historyczna zaszłość. Wszyscy przestrzegają przed robieniem tego. Natomiast nigdzie nie mogę znaleźć informacji o tym, w jaki sposób to działa i co właściwie robią te kawałki kodu. Ktoś ma jakiś pomysł?