Conversion tableau de char c vers purebasic

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Conversion tableau de char c vers purebasic

Message 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 ;)
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Conversion tableau de char c vers purebasic

Message 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.
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: Conversion tableau de char c vers purebasic

Message 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 :)
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Conversion tableau de char c vers purebasic

Message 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.
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Conversion tableau de char c vers purebasic

Message 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))
Demivec
Messages : 90
Inscription : sam. 18/sept./2010 18:13

Re: Conversion tableau de char c vers purebasic

Message 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
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Conversion tableau de char c vers purebasic

Message 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).
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Conversion tableau de char c vers purebasic

Message 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
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: Conversion tableau de char c vers purebasic

Message 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 ;)
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Conversion tableau de char c vers purebasic

Message 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.
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: Conversion tableau de char c vers purebasic

Message 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
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Conversion tableau de char c vers purebasic

Message 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.
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: Conversion tableau de char c vers purebasic

Message 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
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Conversion tableau de char c vers purebasic

Message par Ollivier »

Tant que c'est légal ! Tu peux pas demander les droits par hasard ?
Répondre