Italian Sub ...... signature does not match...

stefanoxjx

Active Member
Licensed User
Ciao a tutti, sto incontrando un problema nel richiamare una funzione.
Qualcosa mi sfugge ma non capisco cosa.

Ho un Activity principale Main, un servizio BT_Service e una ulteriore activity Config
La funzione incriminata è sul modulo BT_Service e se la richiamo da Main funziona perfettamente, mentre se la chiamo da Config ho il seguente errore:

Sub sendpacket signature does not match expected signature.
La funzione in BT_Service è così composta:
B4X:
public Sub SendPacket(packetType As Byte, payload() As Byte)
...
End sub
La chiamata (funzionante) che viene effettuata da Main con un bottone presente nell'activity, è la seguente:
B4X:
Sub btnConfigReq_Click
    CallSub3(BT_Service, "SendPacket", BT_Service.MsgConfigRequest, VoidPayload)
End Sub
La chiamata (NON funzionante) che viene effettuata da Config con un bottone presente nell'activity, è la seguente:
B4X:
Sub btnConfigReq_Click
    Dim VoidPayload(0) As Byte
   CallSub3(BT_Service, "SendPacket", 1, VoidPayload)
End Sub
Probabilmente sto infrangendo qualche regola che non conosco di B4A.
Secondo voi da cosa può dipendere?

Grazie.
 

LucaMs

Expert
Licensed User
No, l'errore è altrove, la chiamata è corretta, è giusta per la routine SendPacket.

A meno che tu non abbia scritto il contrario; la prima potrebbe non essere corretta, dipende dai valori:
BT_Service.MsgConfigRequest, VoidPayload)
Metti un log per quei due valori, prima di chiamare la routine.
 

stefanoxjx

Active Member
Licensed User
Se guardi nella funzione che genera l'errore, ho già sostituito BT_Service.MsgConfigRequest con "1".
Tra le varie prove avevo messo anche al posto di VoidPayload un bel "".
Ti confermo già che se effettuo la chiamata da Config con BT_Service.MsgConfigRequest mi da un errore diverso da quello specificato prima.
 

LucaMs

Expert
Licensed User
Un po' confusionaria, la cosa.

Hai la SendPacket:
B4X:
public Sub SendPacket(packetType As Byte, payload() As Byte)
...
End sub
e poi hai scritto che questo "modo" di chiamarla NON funziona:
B4X:
Sub btnConfigReq_Click
    Dim VoidPayload(0) As Byte
   CallSub3(BT_Service, "SendPacket", 1, VoidPayload)
End Sub
che invece è corretta e funziona benissimo.

Il primo modo, invece, potrebbe non funzionare:
B4X:
Sub btnConfigReq_Click
    CallSub3(BT_Service, "SendPacket", BT_Service.MsgConfigRequest, VoidPayload)
End Sub
ma non posso saperlo perché non conosco il contenuto delle due variabili:
BT_Service.MsgConfigRequest e VoidPayload

Se non scrivi:
B4X:
Sub btnConfigReq_Click
Log("tipo di MsgConfig... = " & GetType(BT_Service.MsgConfigRequest))
Log("MsgConfigRequest  = " & BT_Service.MsgConfigRequest)
Log("VoidPayload = " & VoidPayload)
    CallSub3(BT_Service, "SendPacket", BT_Service.MsgConfigRequest, VoidPayload)
End Sub
non scoprirai il motivo dell'errore (e magari pubblica il diverso messaggio d'errore).

Quasi certamente o MsgConfigRequest non è un byte o VoidPayload non è un array di byte.
 

Star-Dust

Expert
Licensed User
Ciao a tutti, sto incontrando un problema nel richiamare una funzione.
Qualcosa mi sfugge ma non capisco cosa.

Ho un Activity principale Main, un servizio BT_Service e una ulteriore activity Config
La funzione incriminata è sul modulo BT_Service e se la richiamo da Main funziona perfettamente, mentre se la chiamo da Config ho il seguente errore:



La funzione in BT_Service è così composta:
B4X:
public Sub SendPacket(packetType As Byte, payload() As Byte)
...
End sub
La chiamata (funzionante) che viene effettuata da Main con un bottone presente nell'activity, è la seguente:
B4X:
Sub btnConfigReq_Click
    CallSub3(BT_Service, "SendPacket", BT_Service.MsgConfigRequest, VoidPayload)
End Sub
La chiamata (NON funzionante) che viene effettuata da Config con un bottone presente nell'activity, è la seguente:
B4X:
Sub btnConfigReq_Click
    Dim VoidPayload(0) As Byte
   CallSub3(BT_Service, "SendPacket", 1, VoidPayload)
End Sub
Probabilmente sto infrangendo qualche regola che non conosco di B4A.
Secondo voi da cosa può dipendere?

Grazie.
signature does not match... vuol dire che i parametri passati sono sbagliati, ad esempio la sub se ne aspetta 3 e tu ne mandi solo 2. In questo caso è strano, perché sembra corretto.

Ma ho notato una cosa che non mi è chiara:
B4X:
Dim VoidPayload(0) As Byte
Un array di zero elementi? Mi sembra un errore. Non sarebbe meglio?
B4X:
CallSub3(BT_Service, "SendPacket", 1, null)
oppure
B4X:
Dim VoidPayload() As Byte
 
Last edited:

Sagenut

Well-Known Member
Licensed User
Quasi certamente o MsgConfigRequest non è un byte o VoidPayload non è un array di byte.
Non lo avevi visto ma lo avevi intuito. ;)
 

LucaMs

Expert
Licensed User
Non lo avevi visto ma lo avevi intuito. ;)
Si fa per dire, perché sarebbe un array, quello che passa, ma con 0 elementi... probabilmente questo è il problema.
Il guaio è che mi metto a rispondere mentre sviluppo!
(E non ho più l'età per fare 8 cose contemporaneamente 😄 :(😭)
 

stefanoxjx

Active Member
Licensed User
Allora...
l'array da zero byte l'ho creato perchè non avevo trovato nessun'altro modo di trasferire un array con lunghezza zero e a quanto pare B4A mi ha permesso di farlo, visto che proprio quella chiamata di funzione è quella che non dà problemi.
Sembrava brutto anche a me, ma non conoscendo il linguaggio e dovendo fare un'app usa e getta non ho voluto perderci più di tanto tempo.
Detto questo, aggiungendo le righe di log che mi hai detto, il risultato è in tutti e due i casi il seguente:

B4X:
tipo di MsgConfig... = java.lang.Byte
MsgConfigRequest  = 1
VoidPayload = [B@227b412  (cambia ovviamente solo l'indirizzo dell'array)
Ora come consigliato da Star-Dust provo ad adattare il codice in modo che lavori con "null" (mi sembra di averlo già provato ma forse mi sbaglio) piuttosto che con l'array a zero e vedo se migliora qualcosa.
Eventualmente non mancherò di farmi sentire :D
Per il momento grazie.
 
Top