Page 2 sur 2

Re: Problème utilisation fichier DLL

Publié : mer. 20/sept./2017 7:57
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 ?

Re: Problème utilisation fichier DLL

Publié : mer. 20/sept./2017 8:33
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.

Re: Problème utilisation fichier DLL

Publié : mer. 20/sept./2017 8:38
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 :!: :?:

Re: Problème utilisation fichier DLL

Publié : mer. 20/sept./2017 10:22
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.

Re: Problème utilisation fichier DLL

Publié : mer. 20/sept./2017 10:51
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.

Re: Problème utilisation fichier DLL

Publié : sam. 30/sept./2017 15:36
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