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:
Code:
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:
Code:
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:
Code:
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.
 
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.
 
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.
 
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:
Code:
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:
Code:
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:
Code:
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:
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 ?)
 
Quasi certamente o MsgConfigRequest non è un byte o VoidPayload non è un array di byte.
Non lo avevi visto ma lo avevi intuito. ;)
 
Il guaio è che mi metto a rispondere mentre sviluppo!
Che poi... se almeno mi pagassero...
Al massimo, se proprio devi, commissionali a me, che ti faccio un ottimo prezzo: 50c per ogni riga di codice ?

P.S. Righe vuote e di commento compresi, ovviamente ?

per ogni riga scritta qui... sarei quasi miliardario ?
 
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:

Code:
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.
 
Back
Top