Page 1 sur 1

Conversion tableau de char c vers purebasic

Publié : lun. 27/août/2018 10:47
par kwandjeen
Bonjour, petite question à Fred, Grom etc
Je suis entrain d'adapter la librairie SAP RFC c++ vers PB pour la conversion des variables char j'ai dû faire de la sorte :

Code : Tout sélectionner

Version c :
char variable[24+1]

;Ligne suivante ne fonctionne pas avec PB
dim variable.c(24+1)

;J'ai du faire par une structure
structure _char
  var.c[24+1]
endstructure

variable._char

lors de l'appel de la dll ça ne plante plus et pour la lecture par contre il faut passer par un peeks

peeks(@variable\var[0] , 24+1)
Donc petites questions :
1) Ai-je fait de la bonne manière ?
2) Pourquoi le dim ne fonctionne pas comme un tableau de char en c ?

3) question bonus, je crois que la connection SAP RFC en anonyme n'est pas possible mais si quelqu'un connait une astuce pour récupérer des infos SAP avec une transaction qui ne demande pas de connection en webgui sap je suis preneur ;)

Re: Conversion tableau de char c vers purebasic

Publié : lun. 27/août/2018 12:48
par Marc56
Version c :
char variable[24+1]
Un tableau de char en C c'est une chaine de caractères (type AZT), donc pas la même chose qu'un tableau de caractères en Basic

char variable[24+1] = une chaine 24 caractères (maxi) + Chr(0)

char variable[24+1] en C <=> Define variable${25} en PB (car on utiliserait aussi le 0x0)

Donc si tu veux envoyer une chaine de type C (tableau de char) à un programme ou dll, il suffit d'ajouter un Chr(0) à la fin de la chaine PB
;Ligne suivante ne fonctionne pas avec PB
dim variable.c(24+1)
Dans cet exemple, si, mais peut être pas dans ton contexte ?

Code : Tout sélectionner

Dim variable.c(24+1)

For i = 1 To 25
    Debug "" + i + " " + Chr(i+64) 
Next
:?:
Ou alors j'ai mal compris où était le problème.

Re: Conversion tableau de char c vers purebasic

Publié : lun. 27/août/2018 19:52
par kwandjeen
J'ai peut être pas saisi ton explication donc ma réponse sera peut être à côté ^^

En fait en passant par une structure si j'envoi ma variable dans une fonction de la dll ça passe

exemple : RfcOpenConnection(rfcHandle, variable, errorInfo)

donc cette ligne fonctionne si je passe par une structure ce qui donne peeks(variable\var[0], longueur défini) pour pouvoir lire le contenu.

Mais si j'envoi une variable de type string ou un dim variable.c(24+1) cela fait planter la dll.

En c -> char variable[24+1] c'est bien la définition d'un tableau de char donc pourquoi le tableau de pb ne fonctionne pas de base et si je le mets dans une structure ça fonctionne ?

PS : Merci Marc56 :)

Re: Conversion tableau de char c vers purebasic

Publié : lun. 27/août/2018 21:15
par G-Rom
Bonjour.
Le type "char" va de -128 a 127. le type char en PB de 0 a 255.

y a pas de raison pour que cela ne fonctionne pas.

Code : Tout sélectionner

dim Tableau.a(24+1)
MaFonctionDLL( @Tableau() )
Pour la lecture, tu n'as pas le choix. PB utilise un mécanisme interne pour les strings qui n'ont rien à voir avec un brut tableau de char en C.

Re: Conversion tableau de char c vers purebasic

Publié : lun. 27/août/2018 21:23
par G-Rom
Marc56 a écrit :
Version c :
char variable[24+1]
Un tableau de char en C c'est une chaine de caractères (type AZT), donc pas la même chose qu'un tableau de caractères en Basic
les tableaux dim en PB sont des simples zone contigüe en mémoire, comme en C.
ici, l'exemple n'est pas top, PB utilise maintenant des word en place des char pour les caractères, mais ca marche quand meme en faisant un x2 sur la copie de mémoire :

Code : Tout sélectionner

Dim MonString.a(32)
Test.s = "Ceci est un test !"
CopyMemory(@Test,@MonString(0),Len(Test)*2)
Debug PeekS(@MonString(0))

Re: Conversion tableau de char c vers purebasic

Publié : lun. 27/août/2018 22:52
par Demivec
Des tailles différentes:

Code : Tout sélectionner

;Ligne suivante ne fonctionne pas avec PB
dim variable.c(24+1) ; =26 caractères

;J'ai du faire par une structure
structure _char
  var.c[24+1]  ; =25 caractères
endstructure

Re: Conversion tableau de char c vers purebasic

Publié : mar. 28/août/2018 6:37
par Ollivier
A moins de convertir du ASCII en Unicode, tu n'es pas obligé de suivre le C++ à la lettre près. SAP retournera un pointeur :

Code : Tout sélectionner

Define *Text.String
*Text = *PointeurSAP (avec char variable[nn] le pointeur c'est "variable")
Debug *Text\S
Si ça affiche des caractères asiatiques, c'est que le SAP est en ASCII, et qu'il faur convertir. Dans ce cas, soit tu utilises une API Windows pour convertir l'ASCII en Unicode, soit tu veux être multi-plateforme et/ou tes clients sont dans la même "région" que toi et tu te fais un tableau de conversion de la page 437 (j'avoue ne pas avoir de suite le temps de retrouver ce tableau que j'ai posté en Automne 2015 dans un long débat avec Backup).

Re: Conversion tableau de char c vers purebasic

Publié : mar. 28/août/2018 7:00
par Ollivier
Et si la DLL SAP plante en lecture de chaîne, alors un tampon à taille fixe est préférable.

Code : Tout sélectionner

;***************************************************************************
Structure SapStr
 C.S{51} ; je considère que PB a lu de l'unicode sinon c'est 25
EndStructure

Re: Conversion tableau de char c vers purebasic

Publié : mar. 28/août/2018 10:11
par kwandjeen
Wahou !!
Je vois que j'ai pas assez poussé mes essais avec les strings et autres.
Merci pour vos réponses je teste tout ça vendredi car là je suis en congé :) et je vous tient au courant.

Encore merci d'éclairer ma pauvre lanterne ;)

Re: Conversion tableau de char c vers purebasic

Publié : ven. 31/août/2018 1:37
par Ollivier
Rôh j'ai... Oh j'ai... Oh j'ai trouvé, Yvonne... J'ai retrouvé mon code... Je devrais être payé !!! :mrgreen:
J'ai galéré ! Je priais, je priais ("pourvu que je ne l'ai pas garé dans la défunte section Hors sujet... Pourvu qu'il n'a pas été atomisé par notre maladroit de compétition ! ")

Bon, trêve de modestie :
Et c'est par là ! ! !
Le mélange d'auto-satisfaction du ressenti de la prise de tête qui s'achève, désolé, c'est orgasmique...

Bon ben tiens-nous au jus Kwandjeen si t'as des doutes.

Re: Conversion tableau de char c vers purebasic

Publié : ven. 31/août/2018 14:28
par kwandjeen
Bon ben pour info tous les paramètres inclus dans une structure doivent être déclaré .c[longueur] pour que la dll ne plante pas.

Pour des variables isolées effectivement avec des pointeurs et autres cela fonctionne.

Merci à la communauté pour l'aide :D

Re: Conversion tableau de char c vers purebasic

Publié : ven. 31/août/2018 21:25
par Ollivier
Il y a "ne pas planter" et "fonctionner".
T'arrives à te connecter?
Si oui, arrives-tu à exécuter 2 fonctions successivement ?
Ça reste une mécanique : tant que ce n'est pas au poil près, ça coince. Mais une fois les types bien considérés, c'est bon.

Re: Conversion tableau de char c vers purebasic

Publié : dim. 02/sept./2018 19:43
par kwandjeen
Quand je dis "planté" c'est la fenêtre avec "le programme c'est arrêté etc".

Sinon avec les tableau à la C (en passant par les structures) ça fonctionne. Je me connecte, je peux interroger l'état du serveur etc mais pour certaines fonctions je me retrouve coincé car il faut avoir des droits RFC que je n'ai pas.

J'ai donc changé mon fusil d'épaule et passe par un truc de bourrin. Je génère les events pour afficher la transaction et enregistrer le résultat.
C'est moche et bloque l'utilisation de l'ordi le temps de faire toutes les extractions mais je ne trouve rien d'autre sans être bloqué par des droits ou autres.

PS : Je mettrai les codes pour ceux qui peuvent jouer avec SAP

Re: Conversion tableau de char c vers purebasic

Publié : dim. 02/sept./2018 20:29
par Ollivier
Tant que c'est légal ! Tu peux pas demander les droits par hasard ?