Instruction REDIM et dll

Signaler
Messages postés
5
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
6 novembre 2009
-
Messages postés
5
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
6 novembre 2009
-
Bonjour ! je développe des logiciels sous windev, mais pour une de mes procédures, j'ai besoin d'utiliser l'instruction REDIM... qui n'a bien sur pas d'équivalent sous windev.

Sauriez-vous dans quelle assembly ou dans quelle dll je pourrai trouver cette fonction ?

J'ai fouiné partout sur le net mais je n'ai trouvé aucun renseignement là dessus


Merci

13 réponses

Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Bonjour,
Dans quelle dll ? ===>> User32
Mis:
1) je doute fort que ta question soit bien posée
2) Rien ne sera "direct". Il te faudra travailler en mémoire.
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Pardon : pas User32, mais Kernel32 (bien sûr)...
Tu as bien compris qu'une dll est une librairie et non une fonction ?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Salut
Si ton logiciel n'a pas cette fonctionnalité, tu ne peux donc pas gérer les tableaux dimensionnés dynamiquement.
Avant de parler de l'instruction ReDim, il faut pouvoir déclarer le tableau correctement, et je ne pense pas non plus que tu puisses déclarer comme cela :
Dim monTableau() As String
De toute façon, ReDim est une fonction propre au VB et n'apparait pas dans une DLL

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Bonjour, Jack,

On peut... mais en agissant sur ce qui est en mémoire... et ce n'est pas simple ....
Messages postés
5
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
6 novembre 2009

Bonjour, et merci pour vous réponses.

Et bien effectivement, à 4h du mat' on ne formule pas bien les choses
Jack, mon tableau dynamique est très bien instancié, et qui plus est, dans une structure. En fait, ce n'est pas un problème de programmeur, mais un problème d'IDE.

Redim est une instruction du langage de Vb, et malheureusement je ne peux le charger nulle part afin de l'utiliser en windev, ça serait trop beau.

Je crois qu'une des solution que j'ai serait de passer par un exe externe codé en vb qui recevrait mon tableau dynamique en paramètre et qui pourrait utiliser l'instruction redim, et renvoyer à sa fermeture les nouvelles données à mon programme.

Mais là, j'avoue que je sèche... mes cours de Vb sont très loins à présent, du coup je ne sais pas trop comment m'y prendre En plus, et pour corser le tout, le tableau dynamique fait partie d'une structure, mais elle peut être décrite aussi en Vb.

Je vais essayer de coder un petit quelque chose en vb, mais sans grande conviction, mais si vous avez des idées sur mes soucis, n'hésitez pas, toute aide sera la bienvenue !
Messages postés
5
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
6 novembre 2009

En fait, en windev je peux charger une assembly, ce qui me permettrait (avec un peu de chance) d'éviter de passer par un exe complémentaire. Dans mon cas, vous pensez que ça peut être possible ?
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Si finalement ta question (ton avant-denier message) est : "comment écrire en Windev pour récupérer le résultat d'un exe VB", ce n'est pas sous le présent thème (VB.NET et VB 2005), que ta question devrait être posée.
Et ce n'est pas non plus le présent thème celui adéquat pour "charger une assemby" en Windev !
Messages postés
5
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
6 novembre 2009

Non non ce n'est pas ce que je demande.
Je demandais juste si c'était possible d'écrire une assembly contenant l'instruction redim en fait.

Pour ce qui est de windev in n'y a pas de soucis, c'est en Vb que je patauge
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Non, je vois mal comment un EXE externe pourrait avoir une influence sur des variables appartenant à l'hôte.
De toute façon, comme je le disais, je suppose que tu ne peux pas déclarer un tableau avec des parenthèses vides (voir ci-dessus), donc impossible de faire un ReDim sur un tableau dimensionné nativement.
La seule solution est le transfert des données d'un tableau vers un autre, avec une boucle.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Bon, maintenant, puisqu'il s'agit de Single (*), tu peux jongler avec les tableaux en mémoire, mais ce ne sera pas un ReDim mais un transfert de tableaux :
(*) ne fonctionnerait pas pour les String à longueur variable
Exemple :

    Dim Tablo1(0 To 2000) As Single
    Dim Tablo2(0 To 4000) As Single
    Dim r As Long
    Dim pTablo1 As Long
    Dim pTablo2 As Long
    Dim Longueur As Long
    
    Randomize
    ' Remplissage aléatoire du Tablo1
    For r = LBound(Tablo1) To UBound(Tablo1)
        Tablo1(r) = Rnd() * 1000
        If r 1012 Then Debug.Print "Mémoire 1012 du Tablo1 "; Tablo1(1012)
    Next r
    ' Longueur en bytes des données du tableau le plus petit
    ' Tablo1 par défaut
    Longueur = (UBound(Tablo1) - LBound(Tablo1) + 1) * 4    ' 4 bytes par Single
    If ((UBound(Tablo2) - LBound(Tablo2) + 1) * 4) < Longueur Then
        ' Si Tablo2 est plus petit
        Longueur = (UBound(Tablo2) - LBound(Tablo2) + 1) * 4
    End If
    pTablo1 = VarPtr(Tablo1(LBound(Tablo1)))    ' adresse mémoire 1er élément
    pTablo2 = VarPtr(Tablo2(LBound(Tablo2)))
    ' Transfert les données de Tablo1 vers les _
                    premières données de Tablo2
    CopyMemory ByVal pTablo2, _
               ByVal pTablo1, _
               Longueur
    ' Résultat : les Tablo1 a été copié dans Tablo2
    Debug.Print "Mémoire 1012 du Tablo2 = "; Tablo1(1012)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Oups : la dernière ligne : C'est Tablo2(1012) qui doit être affiché pour vérification, pas Tablo1
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
PS : J'ai oublié de te prévenir : Si tu adaptes ce code, SAUVEGARDE TON TRAVAIL AVANT DE LANCER CES COMMANDES

car un mauvais paramétrage peut entrainer un CRASH de l'éditeur.
Messages postés
5
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
6 novembre 2009

Merci beaucoup, je vais tester tout ça, je te tiendrai au courant !