OVH Cloud OVH Cloud

Equivalence de types

4 réponses
Avatar
jean saint jalmes
Bonjour,

comment déclarer les types char** et char* du C en VB ?

Merci par avance, Jean

4 réponses

Avatar
david
salut,

il n'existe pas de pointeur accessible en VB.

Par contre, le type char*, correspondant à une chaîne de caratères
se défini par
dim s as String.
Le type char* comme tableau d'octets se fait avec
dim tb(debut To fin) as Byte
début et fin définissent respectivement, le premier et dernier indice
du tableau

Pour les char**, s'il s'agit d'un tableau de chaîne de caractères,
fait :
dim tb(debut to fin) as String
s'il s'agit d'un tableau à 2 dimensions d'octets fait,
dim tb(debut1 to fin1, debut2 to fin2) as Byte

Voila, jespère avoir été assez clair (encore une chose, les indices
de tableau se notent entre parenthèses et pas entre crochets comme en
C). Si tu veux des tableaux dynamiques (même à X dimensions), ne
déclarent pas leur taille avec le dim et fait :
redim tb(debut to fin)
dans ton code lorsque tu en a besoin (erase tb() pour libérer la
mémoire).
Si tu veux garder les anciennes valeurs, ajoute preserve entre le redim
et ton identifiant de tableau.

A+, david
Avatar
X
Bonjour,

En complément, j'ai une préférence pour cette écriture:

Dim tabelau (10, 20) As String
tableau (i, j) = ...

Dim x As String * 2
= chaine type string de 2 octet (même vide :o)
Mais je "crois" avoir lu que "*x" est empilé, et qu'à trop en mettre sans
dépiler, on peut avoir une débordement de stake...
--------------
Ah le C, y a bien longtemps, x** n'est-ce pas x = pointeur de pointeur ???
Je ne suis plus certain...
Bref, en VB, à part pour les fichiers, c'est bien rare d'utiliser des
pointeurs :o)





"jean saint jalmes" a écrit dans
le message de news:
| Bonjour,
|
| comment déclarer les types char** et char* du C en VB ?
|
| Merci par avance, Jean
Avatar
jean saint jalmes
Merci David mais j'ai probablement mal formulé ma question.

Je sais que char* est un pointeur sur une chaîne de caractère en C.
Par contre, je ne sais pas ce que signifie le type char** en C.

Ces 2 types apparaissent dans le prototypage des fonctions d'une API que je
dois intégrer dans mon application VB et je n'ai malheureusement pas accès
aux fichiers .h de l'API.

Exemples en C:

const char* api_getversion(void);

int api_initialize(const char* version, char** Description);

que j'ai traduits en VB :

private declare function api_getversion lib "xxx" () as string

private declare function api_initialize lib "xxx" (byval version as
string,byref Description as string) as long

Private sub Test

dim Version as string * 255
dim Description as string
dim Result as long

version = api_getversion
Result = api_initialize(version,Description)
End sub

l'instruction version=api_getversion fonctionne bien mais l'appel à
"api_initialize" renvoie une erreur VB (Convention d'appel de DLL incorrecte).

J'ai lu que la traduction de "char* version" devrait plutôt être "byref
version as string" mais dans ce cas, quelle est la traduction de char** ?????

Merci pour votre aide, Jean
Avatar
Jacques93
Bonjour jean saint jalmes,
jean saint jalmes a écrit :
Bonjour,

comment déclarer les types char** et char* du C en VB ?

Merci par avance, Jean



Pas le plus simple pour un vendredi soir ... ;-)

VB stocke les chaines de caractère au format BSTR (Unicode avec en-tête).
C/C++ au format LPSTR (Ansi) ou LPWSTR (Unicode mais sans en-tête). Avec
le passage d'une seule chaine de caractère, VB gère ça de manière
automatique :

si l'api en C/C++ est déclarée :

WINAPI api_en_c (char *param)

en VB :

Private Declare Function api_en_c Lib "xxx" _
(ByVal param As String) As Long

et l'appel se fait avec :

Dim Prm as String
Dim l as long

Prm = Space (256)
l = api_en_c (Prm)

VB s'occupe des conversions nécessaires dans la plupart des cas, à
condition d'appeler la bonne version d'API (api_en_cA (Ansi) ou
api_en_cW (Unicode)


Dans le cas de tableaux de chaines, qui est le cas de

WINAPI api_en_c (char **param)

l'api attend un pointeur sur un tableau de pointeur, et la c'est selon...
On peut utiliser par exemple :

Private Declare api_en_c Lib "xxx" (ByVal Description As Long) As Long

Dim Description() As String
Dim i As Integer, dim l as long

ReDim Description(0 To 5) ' à adapter
For i = LBound(Description) To UBound(Description)
Description(i) = Space(256)
Next i
l = api_en_c (VarPtr(Description(0)))
For i = LBound(Description) To UBound(Description)
Description(i) = StrConv(Description(i), vbUnicode)
MsgBox Description(i)
Next i

Plus d'information ici :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnw32dev/html/ora_apiprog6_topic1.asp

--
Cordialement,

Jacques.