Problème utilisation fichier DLL

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Noos88
Messages : 59
Inscription : lun. 14/juin/2010 19:16
Localisation : Belrupt (Vosges)

Re: Problème utilisation fichier DLL

Message par Noos88 »

Alors si je comprend bien, je ne peut pas créer le code pour cette procédure "cnc_prgdir"

Code : Tout sélectionner

#include <stdio.h>
#include <string.h>
#include "apilib.h"
#define BUFSIZE 256
/* start/end specify program number range. */
short example( short start, short end )
{
char buf[BUFSIZE] ;
short ret, idx ;
memset( buf, '\x00', BUFSIZE ) ;
ret = cnc_rdprogdir( 0, 0, start, end, BUFSIZE-1,
(struct prgdir *)(&buf) ) ;
if ( ret ) {
printf( "ERROR: %d\n", ret ) ;
return ( ret ) ;
}
for ( idx = 0 ; idx < strlen( buf ) ; idx++ ) {
if ( buf[idx] == 'O' ) putchar( '\n' ) ;
putchar( buf[idx] ) ;
}
putchar( '\n' ) ;
car 'char buf [BUFSIZE]' ne peut être créer avec PurBasic ?
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Problème utilisation fichier DLL

Message par Mesa »

Je pense que si, en utilisant une string plutôt qu'un tableau de caractères.
char buf[BUFSIZE] => buf.s{BUFSIZE}
et on poke dans l'adresse de buf qui est @buf.

Il faut juste se rappeller que PB 5.6x travaille toujours en unicode.
Du coup, quand on lui donne de l'ascii, ou que l'on veut créer de l'ascii, il faut le prévenir, en utilisant les fonctions ASCII(), PEEKS et POKES avec l'interrupteur #PB_Ascii.

Merci pour la lib ;)

M.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Problème utilisation fichier DLL

Message par djes »

Je ne vous suis pas les gars, car depuis plusieurs posts on a résolu le problème par l'utilisation du type ASCII .a :!: :?:
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Problème utilisation fichier DLL

Message par Ollivier »

noos88 a écrit :car 'char buf [BUFSIZE]' ne peut être créer avec PurBasic ?
Au lieu de zéro possibilités de le créer, tu en as quatre:

1) La méthode du tableau dynamique

Code : Tout sélectionner

Dim buf.A(BUFSIZE - 1)
Ici, c'est un tableau dynamique : sa taille peut être modifiée.

2) La méthode du tableau statique. La source est ici. J'ai fait une macro nommée "tiret" : libre à toi de la renommer comme tu veux ou de ne pas l'utiliser :

Code : Tout sélectionner

;***************************************************************************************************************************************************************************************
Macro _ (StructureName, FieldType, FieldQuantity)
      Structure StructureName#MacroExpandedCount
            n.FieldType[FieldQuantity]
      EndStructure
      Define *StructureName.StructureName#MacroExpandedCount = AllocateMemory(SizeOf(StructureName#MacroExpandedCount) )
EndMacro
Dans ce 2nd cas,

Code : Tout sélectionner

char buf [BUFSIZE]
peut, grâce à la macro, être traduit par :

Code : Tout sélectionner

_ (buf, A, BUFSIZE)
Dans ce second cas, le tableau est statique (pas de changement de taille possible. L'équivalent sans la macro, c'est ça :

Code : Tout sélectionner

Structure buf
      n.A[256]
EndStructure
*buf.buf = AllocateMemory(256)
3) Ce qui nous amène à une 3ème méthode

Code : Tout sélectionner

Structure buf
      n.S{256}
EndStructure

*buf.buf = AllocateMemory(256)
4) Si tu te tâtes entre la 2ème et la 3ème méthode, tu peux faire un hybride :

Code : Tout sélectionner

Structure buf
     StructureUnion
         n.A[256]
         u.S{256}
      EndStructureUnion
EndStructure

*buf.buf = AllocateMemory(256)

Pour ces 4 méthodes, on peut voir l'adresse du buffer:

Code : Tout sélectionner

Debug @buf(0)          ; meth 1
Debug *buf          ; meth 2, 3 et 4
on peut lire une valeur indépendemment:

Code : Tout sélectionner

Debug buf(i)  ; meth 1
Debug *buf\n[i] ; meth 2 et 4
Debug *buf\u{i} ; meth 3 et 4
Debug PeekA(*buf + i)  ; meth 5
Et on peut obtenir l'adresse de chaque valeur:

Code : Tout sélectionner

Debug @buf(i)  ; meth 1
Debug @*buf\n[i] ; meth 2 et 4
Debug @*buf\u{i} ; meth 3 et 4
Debug *buf + i ; meth 5
Rems :
- pour 4 méthodes dégustées, une 5ème offerte
- i est un index qui va de 0 à (BUFSIZE - 1)
- n et u sont des noms choisis au pif
- je considère que BUFSIZE c'est 256, et on peut éviter de répéter 256 dans une définition de structure avec la méta-commande SizeOf(buf)
- on peut se permettre d'utiliser x méthodes car tu traites des octets (char). La macro permet de faire pareil avec les autres types (word, dword, qword, etc...) sans se soucier des tailles d'allocation en mémoire selon le type.
Dernière modification par Ollivier le mer. 20/sept./2017 10:56, modifié 2 fois.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Problème utilisation fichier DLL

Message par Mesa »

Juste pour le sport, je me hasarde à traduire ta procedure:

Code : Tout sélectionner

; #include <stdio.h>
; #include <string.h>
; #include "apilib.h"
#BUFSIZE = 256; #define BUFSIZE 256
;/* start/End specify program number range. */

; char = .b ; Attention en c  le type char permet de stocker des nombres compris entre -128 et 127
; unsigned char  = .a
; short = .w   
; unsigned short = .u   
; long = .l

;   typedef struct prgdir {
;     char    prg_data[MAX_PBUF] ;   /* Directory data. */
;   } PRGDIR ;                      (MAX_PBUF : maximum character number to read)
Structure prgdir
  Array prg_data.b(#BUFSIZE)
  ;si on est sûre  qu'il n'y aura pas de nombres négatifs, on prend:
  ;Array prg_data.a(#BUFSIZE)
EndStructure

Procedure.w example(Sstart.w, Eend.w );short example( short start, short End )
                                      ; {
  Protected buf.s{#BUFSIZE}           ; char buf[BUFSIZE] ;
  Protected.w RET, idx                ; short RET, idx ;
  
  ;la boucle ci-dessous est inutile car la string est dèjà initialisée à 0
  ; memset( buf, '\x00', BUFSIZE ) ;
  For i = 0 To #BUFSIZE -1
    PokeB(@buf + i,0)
  Next i
  ;   ShowMemoryViewer(@buf,#BUFSIZE)
  
  
  ;Si je comprends bien (je déteste le C, que je ne maîtrise pas du tout), une structure est initialisée (?) à l'adresse de buf ?
  ;Si c'est le cas, alors buf, ne sert à rien, il faut initialiser la structure comme ça:
  
  
  *buff.prgdir = AllocateStructure(prgdir)
  
  ;ATTENTION, il faut déclarer la fonction cnc_rdprogdir avant de l'utiliser avec la lib ou la dll
    RET = cnc_rdprogdir( 0, 0, Sstart, Eend, #BUFSIZE-1, *buff); RET = cnc_rdprogdir( 0, 0, start, End, BUFSIZE-1, (struct prgdir *)(&buf) ) ;
  ; J'ai un doute, c'est peutêtre RET = cnc_rdprogdir( 0, 0, Sstart, Eend, #BUFSIZE-1, *buff.prgdir)
  
  If RET; If ( RET ) {
    MessageRequester("ERROR", "Error "+Str(RET)); printf( "ERROR: %d\n", RET ) ;
    ProcedureReturn RET                         ; Return ( RET ) ;
  EndIf                                         ; }
  
  Taille_de_buff= SizeOf(*buff)
  ; si ça ne marche pas, on prend
  ;Taille_de_*buff=SizeOf(prgdir), sinon on prend 256 (?)
  OpenConsole()
  For idx = 0 To Taille_de_buff-1; For ( idx = 0 ; idx < strlen( buf ) ; idx++ ) {
    If PeekB(*buff+ idx)='O'  ; If ( buf[idx] == 'O' ) 
      PrintN("")              ;putchar( '\n' ) 
    EndIf                     ;
    Print(PeekS(*buff+ idx,1,#PB_Ascii  )); putchar( buf[idx] ) ;<= à améliorer !
  Next                                    ; }
  PrintN("")                              ; putchar( '\n' ) ;
  CloseConsole()
EndProcedure



M.
Avatar de l’utilisateur
Noos88
Messages : 59
Inscription : lun. 14/juin/2010 19:16
Localisation : Belrupt (Vosges)

Re: Problème utilisation fichier DLL

Message par Noos88 »

Bonjour tous le monde, pour remercier tous ceux qui mon aider pour ce projet je met un lien du logiciel pour les intéressées:
Logiciel:
https://drive.google.com/open?id=0BxTkO ... GVPdm1CNVk
Image:
https://drive.google.com/file/d/0BxTkO6 ... sp=sharing
Répondre