EXTERN - Speicherzugriffsfehler(11)

Alle Fragen zur Programmierung, die nicht in die speziellen Themen passen
Antworten
Benutzeravatar
gambi
Moderator
Beiträge: 321
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

EXTERN - Speicherzugriffsfehler(11)

Beitrag von gambi » So 1. Feb 2015, 18:14

Hallo,
ich habe hier ein Problem mit der externen Library liblinphone.
gambas code
Public Struct _LVTable
   DtmfReceived As Pointer
   InviteReceivedCb As Pointer
End Struct

Public Struct LinphoneCoreVTable
    _LinphoneVTable As Struct _LVTable
End Struct


Library "liblinphone:6"

'LinphoneCore* linphone_core_new(const LinphoneCoreVTable * vtable,
'      Const char * config_path,
'      Const char * factory_config_path,
'      void * userdata 
'   )     

Extern linphone_core_new(vtable As LinphoneCoreVTable, config_path As String, factory_config_path As String, userdata As Pointer) As Pointer


Public Sub Form_Open()
End

Public Sub Button1_Click()

   Dim LC, uData As Pointer
   Dim cPath, fPath As String
   Dim lpct As New LinphoneCoreVTable
   
   cPath = Null
   fPath = Null  
   udata = Null
   
'  Instanciate a LinphoneCore object given the LinphoneCoreVTable
'  lc = linphone_core_new(&vtable, Null, Null, Null);
    
   LC = linphone_core_new(lpct, cPath, fPath, uData)

End
Wenn die Funktion in Zeile 38 aufgerufen wird, rattert die Initialisierung von linphone erst mal los, bevor es zu dem o.g. Fehler kommt.

Hat jemand eine Idee dazu?
gg

Quellen:
http://www.linphone.org/docs/liblinphon ... rials.html
http://www.linphone.org/docs/liblinphon ... Table.html
http://www.linphone.org/docs/liblinphon ... c8433ca42f

tux_
Moderator
Beiträge: 950
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: EXTERN - Speicherzugriffsfehler(11)

Beitrag von tux_ » So 1. Feb 2015, 23:18

Code: Alles auswählen

linphone_core_new(const LinphoneCoreVTable * vtable, [...])
Man moechte einen Pointer von dir. Also
gambas code
Extern linphone_core_new(vtable As Pointer, [...])
' ...
LC = linphone_core_new(VarPtr(lpct), cPath, fPath, uData)
Einen Versuch ist es jedenfalls wert...

Was ich noch sehe: wir haben

Code: Alles auswählen

typedef struct _LinphoneCoreVTable LinphoneCoreVTable
Das ist in deinem Code aber nicht so: du deklarierst LinphoneCoreVTable so, dass es einen _LVTable enthaelt. In C waere das tatsaechlich moeglich, aber in Gambas... Du moechtest ja, dass der Inhalt von _LVTable direkt in deiner LinphoneCoreVTable-Struktur drin ist. Aber in Gambas-Klassen werden Member immer ueber Pointer auf extern allozierte Speicherbereiche realisiert, nicht ueber Inklusion. Das ist gerade, was du nicht willst. Ich weisz allerdings nicht, wie das bei Structs geregelt ist. Davon abgesehen sieht dein _LVTable noch nicht fertig aus. Ein Segfault kann auch auftreten, wenn die allozierten Strukturen kleiner sind, als die Bibliothek erwartet.

Erinnerst du dich noch daran, als ich sagte, dass die Einbindung von Linphone ueber Extern unangenehm werden koennte? ;-)
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

vuott
Foriker
Beiträge: 90
Registriert: Fr 16. Jan 2015, 01:27
Kontaktdaten:

Re: EXTERN - Speicherzugriffsfehler(11)

Beitrag von vuott » Mo 2. Feb 2015, 00:02

gambi hat geschrieben: gambas code
Public Struct _LVTable
   DtmfReceived As Pointer
   InviteReceivedCb As Pointer
End Struct

Public Struct LinphoneCoreVTable
    _LinphoneVTable As Struct _LVTable
End Struct
...linphonecore.h file header report a very complex and long Structure:

Code: Alles auswählen

/**
* This structure holds all callbacks that the application should implement.
* None is mandatory.
**/
typedef struct _LinphoneVTable{
LinphoneGlobalStateCb global_state_changed; /**<Notifies globlal state changes*/
LinphoneRegistrationStateCb registration_state_changed;/**<Notifies registration state changes*/
LinphoneCallStateCb call_state_changed;/**<Notifies call state changes*/
NotifyPresenceReceivedCb notify_presence_recv; /**< Notify received presence events*/
NewSubscribtionRequestCb new_subscription_request; /**< Notify about pending subscription request */
AuthInfoRequested auth_info_requested; /**< Ask the application some authentication information */
CallLogUpdated call_log_updated; /**< Notifies that call log list has been updated */
TextMessageReceived text_received; /**< A text message has been received */
DtmfReceived dtmf_received; /**< A dtmf has been received received */
ReferReceived refer_received; /**< An out of call refer was received */
BuddyInfoUpdated buddy_info_updated; /**< a LinphoneFriend's BuddyInfo has changed*/
NotifyReceivedCb notify_recv; /**< Other notifications*/
DisplayStatusCb display_status; /**< Callback that notifies various events with human readable text.*/
DisplayMessageCb display_message;/**< Callback to display a message to the user */
DisplayMessageCb display_warning;/** Callback to display a warning to the user */
DisplayUrlCb display_url;
ShowInterfaceCb show; /**< Notifies the application that it should show up*/
ZeroconfRefresh zeroconf_refresh; /** Refresh the Zeroconf Friend List */
} LinphoneCoreVTable;
Why do you wrote in your Structure only 2 fields ?

Benutzeravatar
gambi
Moderator
Beiträge: 321
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

Re: EXTERN - Speicherzugriffsfehler(11)

Beitrag von gambi » Mo 2. Feb 2015, 22:36

Hallo tux_,
..., dass die Einbindung von Linphone ueber Extern unangenehm werden koennte?
Aber sicher, einfach kann doch jeder :mrgreen:

Oh ja. Die Arbeit mit den EXTERNEN hat es in sich. Insbesondere dann, wenn der C-Durchblick fehlt.
Nun gut, ich habe mir deinen Vorschlag angeschaut und ausprobiert. Leider ohne Erfolg. Dein Hinweis jedoch auf die unvollständige STRUCT, was übrigens auch vuott meinte (thanx for the hint), hat mich dazu bewegt, die STRUCT vollständig abzubilden und auf die Verschachtelung zu verzichten.
gambas code
Public Struct LinphoneCoreVTable
   global_state_changed As Pointer
   registration_state_changed As Pointer
   call_state_changed As Pointer
   notify_presence_received As Pointer
   new_subscription_requested As Pointer
   auth_info_requested As Pointer
   call_log_updated As Pointer
   is_composing_received As Pointer
   dtmf_received As Pointer
   refer_received As Pointer
   call_encryption_changed As Pointer
   transfer_state_changed As Pointer
   buddy_info_updated As Pointer
   call_stats_updated As Pointer
   info_received As Pointer
   subscription_state_changed As Pointer
   notify_received As Pointer
   configuring_status As Pointer
   display_status As Pointer
   display_message As Pointer
   display_warning As Pointer
   display_url As Pointer
   show As Pointer
End Struct

Extern linphone_core_new(vtable As LinphoneCoreVTable, config_path As String, factory_config_path As String, userdata As Pointer) As Pointer
Weiter dann in der SUB: gambas code
...
Dim lpct As New LinphoneCoreVTable
...
LC = linphone_core_new(lpct, cPath, fPath, uData)
Und siehe da, kein Absturz mehr.
Was ich jetzt mit LC bzw. mit VarPtr(LC) machen kann (sind beides Pointer), sofern es sich um die richtigen Werte handelt, muss ich noch sehen.

Danke auf jeden Fall für eure Unterstützung.
gg

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast