Importation de fonctions écrite en C

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Importation de fonctions écrite en C

Message par Guimauve »

Bonjour à tous,

Je bute sur problème avec une fonction écrite en C que j'importe depuis une librairie (libSDL.so) [Je suis sous Linux Ubuntu 9.10 x64]

Code : Tout sélectionner

SDL_SaveBMP(SDL_Surface *surface, const char *file)
J'aimerais savoir ce qu'il faut passer pour le paramètre "const char *file" afin que le nom de fichier puisse être envoyé à la fonction correctement. Pour le moment, une chaîne de caractère directement ou l'adresse d'une chaîne de caractères ne fonctionne pas. Ou alors j'ai mal importé la fonction ?

Code : Tout sélectionner

SDL_SaveBMP(*Surface.SDL_Surface, FileName.s)
Les experts des librairies C, merci à l'avance d'apporter vos lumières sur la question.

A+
Guimauve
Dernière modification par Guimauve le mar. 02/mars/2010 1:13, modifié 2 fois.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Équivalence à "const char *file"

Message par flaith »

Salut Guimauve,

il ressemble à quoi ton import ?
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Équivalence à "const char *file"

Message par Guimauve »

flaith a écrit :Salut Guimauve,

il ressemble à quoi ton import ?
En fait je viens de me rendre compte que "SDL_LoadBMP()" et "SDL_SaveBMP()" ne sont pas des fonctions mais des macros. J'ai donc modifié le fichier Import avec les éléments ci-dessous :

Code : Tout sélectionner

SDL_LoadBMP_RW(*src.SDL_RWops, freesrc.l) 
SDL_SaveBMP_RW(*Surface.SDL_Surface, *dst.SDL_RWops , freedst.l)
SDL_RWFromFile(FileName.s, Mode.s)
Et j'ai reprogrammé les fonction "SDL_LoadBMP()" et "SDL_SaveBMP()".

Code : Tout sélectionner

Procedure.i SDL_LoadBMP(FileName.s)

  *src.SDL_RWops = SDL_RWFromFile(FileName, "rb")
  *Surface.SDL_Surface = SDL_LoadBMP_RW(*src, 1) 
  
  ProcedureReturn *Surface
EndProcedure 

Procedure SDL_SaveBMP(*Surface.SDL_Surface, FileName.s)

  *dst.SDL_RWops = SDL_RWFromFile(FileName, "wb") 
  SDL_SaveBMP_RW(*Surface, *dst, 1)

EndProcedure
Malheureusement, j'ai un message d'erreur du type "Invalid memory access". Et là, je ne suis pas tellement plus avancé.

Voici la dernière version du fichier Import:

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : Importation des Fonctions SDL
; Nom du fichier : General - SDL Import.pb
; Version du fichier : 0.0.2
; Programmation : En cours
; Programmé par : Guimauve
; Date : 14-02-2010
; Mise à jour : 28-02-2010
; Code PureBasic : 4.41
; Plateforme : Linux
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Structure SDL_SysWMinfo

  version.SDL_version
  data_.l

EndStructure 

Structure Point

  x.w
  y.w

EndStructure 

Import "/usr/lib/libSDL.so"

  ; <<<<<<<<<<<<<<<<<<<
  ; <<<<< General <<<<<

  SDL_Init(Flag.l)
  SDL_InitSubSystem(Flag.l)
  SDL_QuitSubSystem(Flag.l)
  SDL_Quit()
  SDL_WasInit(Flag.l)
  SDL_VERSION(*VersionA.SDL_version); --> Useless
  SDL_GetError()
  SDL_ClearError()
  SDL_LoadObject(SO_file.s)
  SDL_Linked_Version()
  ; SDL_SetError (const char *fmt, ...) ; --> À VALIDER
  ; SDL_Error(SDL_errorcode code) ; --> À VALIDER
  ; SDL_LoadFunction(*handle.i, Name.s) ; --> À VALIDER
  ; SDL_UnloadObject(*handle.i) ; --> À VALIDER
  
  ; <<<<<<<<<<<<<<<<<
  ; <<<<< Video <<<<<

  SDL_GetVideoSurface()
  SDL_GetVideoInfo()
  SDL_VideoDriverName(namebuf.s, maxlen.l)
  SDL_ListModes(*Format.SDL_PixelFormat, Flags.l)
  SDL_VideoModeOK(Width.l, Height.l, BitsPerPixel.l, Flags.l)
  SDL_SetVideoMode(Width.l, Height.l, BitsPerPixel.l, Flags.l)
  SDL_UpdateRect(*Screen.SDL_Surface, x.l, y.l, Width.l, Height.l)
  SDL_UpdateRects(*Screen.SDL_Surface, NumRects.l, *Rects.SDL_Rect)
  SDL_Flip(*Screen.SDL_Surface)
  SDL_SetColors(*Surface.SDL_Surface, *colors.SDL_Color, firstcolor.l, ncolors.l)
  SDL_SetPalette(*Surface.SDL_Surface, Flags.l, *colors.SDL_Color, firstcolor.l, ncolors.l)
  SDL_SetGamma(Red_gamma.f, Green_gamma.f, Blue_gamma.f)
  SDL_MapRGB(*Format.SDL_PixelFormat, Red.a, Green.a, Blue.a)
  SDL_MapRGBA(*Format.SDL_PixelFormat, Red.a, Green.a, Blue.a, Alpha.a)
  SDL_GetRGB(Pixel.l, *Format.SDL_PixelFormat, *Red.a, *Green.a, *Blue.a) ; --> À VALIDER
  SDL_GetRGBA(Pixel.l, *Format.SDL_PixelFormat, *Red.a, *Green.a, *Blue.a, *Alpha.a) ; --> À VALIDER
  SDL_CreateRGBSurface(Flags.l, Width.l, Height.l, BitsPerPixel.l, Rmask.l, Gmask.l, Bmask.l, Amask.l)
  SDL_CreateRGBSurfaceFrom(*pixels.i, Width.l, Height.l, Depth.l, Pitch.l, Rmask.l, Gmask.l, Bmask.l, Amask.l) ; --> À VALIDER
  SDL_FreeSurface(*Surface.SDL_Surface)
  SDL_LockSurface(*Surface.SDL_Surface)
  SDL_UnlockSurface(*Surface.SDL_Surface)
  SDL_ConvertSurface(*Source.SDL_Surface, *fmt.SDL_PixelFormat, Flags.l)
  SDL_DisplayFormat(*Surface.SDL_Surface)
  SDL_DisplayFormatAlpha(*Surface.SDL_Surface)
  
  ; SDL_LoadBMP(FileName.s)                         ; ---> NE FONCTIONNE PAS
  ; SDL_SaveBMP(*Surface.SDL_Surface, FileName.s)   ; ---> NE FONCTIONNE PAS
  
  SDL_LoadBMP_RW(*src.SDL_RWops, freesrc.l) 
  SDL_SaveBMP_RW(*Surface.SDL_Surface, *dst.SDL_RWops , freedst.l)
  
  SDL_SetColorKey(*Surface.SDL_Surface, Flag.l, Key.l)
  SDL_SetAlpha(*Surface.SDL_Surface, Flags.l, Alpha.l)
  SDL_SetClipRect(*Surface.SDL_Surface, *Rect.SDL_Rect)
  SDL_GetClipRect(*Surface.SDL_Surface, *Rect.SDL_Rect)
  SDL_BlitSurface(*Source.SDL_Surface, *SourceRect.SDL_Rect, *Dest.SDL_Surface, *DestRect.SDL_Rect)
  SDL_FillRect(*Dest.SDL_Surface, *DestRect.SDL_Rect, Color.l)
  ; SDL_GetGammaRamp(Uint16 *redtable, Uint16 *greentable, Uint16 *bluetable) ; --> À VALIDER
  ; SDL_SetGammaRamp(Uint16 *redtable, Uint16 *greentable, Uint16 *bluetable) ; --> À VALIDER
  
  SDL_GL_LoadLibrary(Path.s)
  SDL_GL_GetProcAddress(Proc.s)
  SDL_GL_GetAttribute(Attribute.l, *Value.l) ; --> À VALIDER
  SDL_GL_SetAttribute(Attribute.l, Value.l) ; --> À VALIDER
  SDL_GL_SwapBuffers()
  
  SDL_CreateYUVOverlay(Width.l, Height.l, Format.l, *Display.SDL_Surface)
  SDL_LockYUVOverlay(*Overlay.SDL_Overlay)
  SDL_UnlockYUVOverlay(*Overlay.SDL_Overlay)
  SDL_DisplayYUVOverlay(*Overlay.SDL_Overlay, *DestRect.SDL_Rect)
  SDL_FreeYUVOverlay(*Overlay.SDL_Overlay)
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< Window management <<<<<
 
  SDL_WM_SetCaption(Title.s, Icon.s)
  SDL_WM_SetIcon(*icon.SDL_Surface, *mask.a)
  SDL_WM_IconifyWindow()
  SDL_WM_ToggleFullScreen(*Surface.SDL_Surface)
  SDL_WM_GrabInput(Mode.b)
  ; SDL_GetWMInfo(*info.SDL_SysWMinfo)
  ; SDL_WM_GetCaption(char **title, char **icon) ; À VALIDER
  
  ; <<<<<<<<<<<<<<<<<<
  ; <<<<< Events <<<<<
  
  SDL_PumpEvents()
  SDL_PeepEvents(*Events.SDL_Event, numevents.l, Action.l, Mask.l)
  SDL_PollEvent(*Event.SDL_Event)
  SDL_WaitEvent(*Event.SDL_Event)
  SDL_PushEvent(*Event.SDL_Event)
  SDL_GetEventFilter()
  SDL_EventState(Type.a, State.l)
  SDL_GetKeyState(*numkeys.l)
  SDL_GetModState()
  SDL_SetModState(Modstate.l)
  SDL_GetKeyName(Key.l)
  SDL_EnableUNICODE(Enable.l)
  SDL_EnableKeyRepeat(Delay.l, Interval.l)
  SDL_GetMouseState(*x.l, *y.l)
  SDL_GetRelativeMouseState(*x.l, *y.l)
  SDL_GetAppState()
  SDL_JoystickEventState(State.l)
  SDL_StartTextInput()
  SDL_StopTextInput()
  SDL_SetTextInputRect(*Rect.SDL_Rect)
  ; SDL_SetEventFilter(SDL_EventFilter filter) ; --> À VALIDER
  
  ; <<<<<<<<<<<<<<<<<
  ; <<<<< Mouse <<<<<
  
  SDL_WarpMouse(x.w, y.w)
  SDL_CreateCursor(*data_.a, *mask.a, w.l, h.l, hot_x.l, hot_y.l) ; À VALIDER
  SDL_FreeCursor(*Cursor.SDL_Cursor)
  SDL_SetCursor(*Cursor.SDL_Cursor)
  SDL_GetCursor()
  SDL_ShowCursor(Toggle.l)

  ; <<<<<<<<<<<<<<<<<<<<
  ; <<<<< Joystick <<<<<
  
  SDL_NumJoysticks()
  SDL_JoystickUpdate()
  SDL_JoystickName(Index.l)
  SDL_JoystickOpen(Index.l)
  SDL_JoystickOpened(Index.l)

  SDL_JoystickIndex(*JoystickA.i)
  SDL_JoystickNumAxes(*JoystickA.i)
  SDL_JoystickNumBalls(*JoystickA.i)
  SDL_JoystickNumHats(*JoystickA.i)
  SDL_JoystickNumButtons(*JoystickA.i)  
  SDL_JoystickClose(*JoystickA.i)

  SDL_JoystickGetAxis(*JoystickA.i, Axis.l)
  SDL_JoystickGetHat(*JoystickA.i, Hat.l)
  SDL_JoystickGetButton(*JoystickA.i, Button.l)
  SDL_JoystickGetBall(*JoystickA.i, Ball.l, *Dx.l, *Dy.l)

  ; <<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< Files (RWops) <<<<<
  
  SDL_RWFromFile(FileName.s, Mode.s)
  ; SDL_RWFromFP(FILE *fp, int autoclose)
  SDL_AllocRW()
  SDL_FreeRW(*Context.SDL_RWops)
  
EndImport 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur EventType <<<<<

Macro SDL_EventType(SDL_EventA)

  SDL_EventA\type
  
EndMacro 

Macro SDL_KeySym(SDL_EventA)

  SDL_EventA\key\keysym\sym
  
EndMacro 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Évènement à propos de la souris <<<<<

Macro SDL_MouseButtonEvent_Button()

  SDL_EventA\button\button
  
EndMacro 

Macro SDL_MouseButtonEvent_State()

  SDL_EventA\button\state

EndMacro 

Macro SDL_MouseButtonEvent_X()

  SDL_EventA\button\x

EndMacro 

Macro SDL_MouseButtonEvent_Y()

  SDL_EventA\button\y

EndMacro 

Macro SDL_MouseButtonEvent_Position(Position)

  Position\x = SDL_MouseButtonEvent_X()
  Position\y = SDL_MouseButtonEvent_Y()
  
EndMacro 

Macro SDL_MouseMotionEvent_State()

  SDL_EventA\Motion\state

EndMacro 

Macro SDL_MouseMotionEvent_X()

  SDL_EventA\Motion\x

EndMacro 

Macro SDL_MouseMotionEvent_Y()

  SDL_EventA\Motion\y

EndMacro 

Macro SDL_MouseMotionEvent_Position(Position)

  Position\x = SDL_MouseMotionEvent_X()
  Position\y = SDL_MouseMotionEvent_Y()
  
EndMacro 

Macro SDL_MouseMotionEvent_XRel()

  SDL_EventA\Motion\xrel

EndMacro 

Macro SDL_MouseMotionEvent_YRel()

  SDL_EventA\Motion\yrel

EndMacro 

Macro SDL_MouseMotionEvent_PositionRel(Position)

  Position\x = SDL_MouseMotionEvent_XRel()
  Position\y = SDL_MouseMotionEvent_YRel()
  
EndMacro 

Procedure.i SDL_LoadBMP(FileName.s)

  *src.SDL_RWops = SDL_RWFromFile(FileName, "rb")
  *Surface.SDL_Surface = SDL_LoadBMP_RW(*src, 1) 
  
  ProcedureReturn *Surface
EndProcedure 

Procedure SDL_SaveBMP(*Surface.SDL_Surface, FileName.s)

  *dst.SDL_RWops = SDL_RWFromFile(FileName, "wb") 
   SDL_SaveBMP_RW(*Surface, *dst, 1)

EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
A+
Guimauve
Répondre