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

stefanoxjx

Active Member
Licensed User
Longtime 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.
 

stefanoxjx

Active Member
Licensed User
Longtime 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
Longtime 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
Longtime 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:

LucaMs

Expert
Licensed User
Longtime User
Dim VoidPayload(0) As Byte
Un array di zero elementi? Mi sembra un errore
1600275481791.png


(non c'avevo fatto caso, non mi aspettavo una cosa del genere 😄)
 

Sagenut

Expert
Licensed User
Longtime User
Quasi certamente o MsgConfigRequest non è un byte o VoidPayload non è un array di byte.
Non lo avevi visto ma lo avevi intuito. ;)
 

stefanoxjx

Active Member
Licensed User
Longtime 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