Instruction REDIM et dll

cs_captain_riri Messages postés 5 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 6 novembre 2009 - 4 nov. 2009 à 03:52
cs_captain_riri Messages postés 5 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 6 novembre 2009 - 6 nov. 2009 à 16:48
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

jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
4 nov. 2009 à 07:23
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.
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
4 nov. 2009 à 08:28
Pardon : pas User32, mais Kernel32 (bien sûr)...
Tu as bien compris qu'une dll est une librairie et non une fonction ?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 nov. 2009 à 11:54
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)
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
4 nov. 2009 à 12:46
Bonjour, Jack,

On peut... mais en agissant sur ce qui est en mémoire... et ce n'est pas simple ....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_captain_riri Messages postés 5 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 6 novembre 2009
4 nov. 2009 à 15:30
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 !
0
cs_captain_riri Messages postés 5 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 6 novembre 2009
4 nov. 2009 à 15:47
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 ?
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
4 nov. 2009 à 15:55
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 !
0
cs_captain_riri Messages postés 5 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 6 novembre 2009
4 nov. 2009 à 17:34
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
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 nov. 2009 à 13:02
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)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 nov. 2009 à 17:27
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)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 nov. 2009 à 17:29
Oups : la dernière ligne : C'est Tablo2(1012) qui doit être affiché pour vérification, pas Tablo1
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 nov. 2009 à 18:58
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.
0
cs_captain_riri Messages postés 5 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 6 novembre 2009
6 nov. 2009 à 16:48
Merci beaucoup, je vais tester tout ça, je te tiendrai au courant !
0
Rejoignez-nous