OVH Cloud OVH Cloud

Put #, variable Long ???

4 réponses
Avatar
moi
Je repose ma question, je n'ai toujours pas trouvé de réponses , helas, à ce
probleme

quand j'ecris un Long visiblement il n'est pas correctement ecrit dans le
fichier, il semblerait qu'il soit ecrit en Int dedoublé.....

voila le code.


Dim fname, fichier As String
Dim curoff as Long
Dim i As Integer

curoff = 0 '*** initialise curoff ***
none = 0 '*** offset vide pour fichier vide ***

fname = txtOptionName.Text & ".xnx"

'*** on cree le fichier ***
fichier = App.path & "\" & fname

If FileExists(fichier) Then
rep = MsgBox("Le fichier " & fname & " existe" & vbCrLf &
"Voulez-vous vraiment le remplacer", vbQuestion + vbYesNo, "Remplacer le
fichier")
If rep = vbYes Then
Kill fichier
Else
MsgBox "Compilation annulée", vbInformation + vbOKOnly
Exit Function
End If
End If

'*** bien maintenant on le remplis ***

hFile = FreeFile
Open fichier For Binary As #hFile

'*** ecriture de la signature ***

Put #hFile, , "_XNXXNX_"

'*** reserver la table d'offset ***

offs = repFiles.ListCount + 4

'*** calcul et ecriture des offsets ***
'*** L'offset est égale à :
'*** la taille du fichier concerné
'*** + la taille de la signatue 6 octets
'*** + la taille de tous les offset (4 octets par
offset * offs)
'***
curoff = 8 + (4 * offs)

If repFiles.ListCount > 0 Then
For off = 0 To 0 'repFiles.ListCount - 1

Put #hFile, , curoff
' C'EST ICI QUE CELA NE PRODUIT PAS L'EFFET ATTENDU
curoff = curoff + FileLen(repFiles.List(off))
Next off
End If

'*** offset pour le fichier 0 ***
If txtFichier(0).Text <> "" Then
Put #hFile, , curoff
curoff = curoff + FileLen(txtFichier(0).Text)
Else
Put #hFile, , none
End If

'*** offset pour le fichier 1 ***
If txtFichier(1).Text <> "" Then
Put #hFile, , curoff
curoff = curoff + FileLen(txtFichier(1).Text)
Else
Put #hFile, , none
End If

'*** offset pour le fichier 2 ***
If txtFichier(2).Text <> "" Then
Put #hFile, , curoff
curoff = curoff + FileLen(txtFichier(2).Text)
Else
Put #hFile, , none
End If

'*** offset pour le descriptif ***
If txtFichier(3).Text <> "" Then
Put #hFile, , curoff
curoff = curoff + FileLen(txtFichier(3).Text)
Else
Put #hFile, , none
End If

'*** Fichiers ***
buffer = ""
If repFiles.ListCount > 0 Then
For off = 0 To repFiles.ListCount - 1

buffer = FileRead(repFiles.List(off))

Put #hFile, , buffer

Next off
End If

Close #hFile

Compile = True '*** ok tout c'est bien passe

4 réponses

Avatar
Zoury
Salut Moi!

Dim fname, fichier As String



fname est déclaré As Variant par défaut car tu n'as pas spécifié son type...
Il faut spécifier le type à chaque variable même si elles sont déclarées sur
la même ligne.

curoff = 0 '*** initialise curoff ***
none = 0 '*** offset vide pour fichier vide ***



none n'est pas déclaré. Si tu ne mets pas Option Explicit au tout début de
tes modules, je te conseilles fortement de le faire. Cela force la
déclaration des variables employées, t'évitant des problèmes dûes au fautes
de frappe et plus de faciliter grandement la maintenance du code. Aussi les
variables non déclarées sont des Variants par défaut. Le type Variant est le
plus lent qui soit et devrait être évité si possible.



'*** ecriture de la signature ***
Put #hFile, , "_XNXXNX_"

'*** reserver la table d'offset ***

offs = repFiles.ListCount + 4

'*** calcul et ecriture des offsets ***
'*** L'offset est égale à :
'*** la taille du fichier concerné
'*** + la taille de la signatue 6 octets
'*** + la taille de tous les offset (4 octets par
offset * offs)
'***
curoff = 8 + (4 * offs)



Dans ce bout de code, la signature prend 16 octets et non 6.. Ausii je ne
comprends pas pourquoi offs est égal au nombre de fichiers + 4 dès le départ
et pourquoi curoff égal 8 + (offs * 4)? d'où vient le 8?


'*** Fichiers ***
buffer = ""
If repFiles.ListCount > 0 Then
For off = 0 To repFiles.ListCount - 1

buffer = FileRead(repFiles.List(off))

Put #hFile, , buffer

Next off
End If



dans ce bout de code la variable buffer n'est pas déclaré (As Variant) et
n'est pas utile. ;O)


Que souhaites-tu faire exactement? Peux-tu nous expliquer ton but? Cela nous
permettra de comprendre où se situe ton problème de manière plus exacte.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
moi
Bien visiblement jsuis largué..... la signature prends 16 octets ??????
ce qui signifie qu'un caracteres est codé sur 2 octets donc ?

d'autres part effectivement je n'avais pas fait attention auf fait que
chaque declaration devait avoir son type..... je croyais que

Dim curoff, none as Long declarais les deux en Long (grave erreur)

Bien donc en changeant cette simple ligne cela fonctionne comme je le
souhaite

Le 8 est la taille de la signature en octets, le commentaire taille de la
signature = 6 est erroné


Merci de ton aide...... (c'est penible parfois de buter sur un truc simple
que l'on ne vois pas)




"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
Salut Moi!

> Dim fname, fichier As String

fname est déclaré As Variant par défaut car tu n'as pas spécifié son


type...
Il faut spécifier le type à chaque variable même si elles sont déclarées


sur
la même ligne.

> curoff = 0 '*** initialise curoff ***
> none = 0 '*** offset vide pour fichier vide ***

none n'est pas déclaré. Si tu ne mets pas Option Explicit au tout début de
tes modules, je te conseilles fortement de le faire. Cela force la
déclaration des variables employées, t'évitant des problèmes dûes au


fautes
de frappe et plus de faciliter grandement la maintenance du code. Aussi


les
variables non déclarées sont des Variants par défaut. Le type Variant est


le
plus lent qui soit et devrait être évité si possible.



> '*** ecriture de la signature ***
> Put #hFile, , "_XNXXNX_"
>
> '*** reserver la table d'offset ***
>
> offs = repFiles.ListCount + 4
>
> '*** calcul et ecriture des offsets ***
> '*** L'offset est égale à :
> '*** la taille du fichier concerné
> '*** + la taille de la signatue 6 octets
> '*** + la taille de tous les offset (4 octets par
> offset * offs)
> '***
> curoff = 8 + (4 * offs)

Dans ce bout de code, la signature prend 16 octets et non 6.. Ausii je ne
comprends pas pourquoi offs est égal au nombre de fichiers + 4 dès le


départ
et pourquoi curoff égal 8 + (offs * 4)? d'où vient le 8?


> '*** Fichiers ***
> buffer = ""
> If repFiles.ListCount > 0 Then
> For off = 0 To repFiles.ListCount - 1
>
> buffer = FileRead(repFiles.List(off))
>
> Put #hFile, , buffer
>
> Next off
> End If

dans ce bout de code la variable buffer n'est pas déclaré (As Variant) et
n'est pas utile. ;O)


Que souhaites-tu faire exactement? Peux-tu nous expliquer ton but? Cela


nous
permettra de comprendre où se situe ton problème de manière plus exacte.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous




Avatar
Zoury
> Bien visiblement jsuis largué..... la signature prends 16 octets ??????
ce qui signifie qu'un caracteres est codé sur 2 octets donc ?



j'ai revérifier pour être sûr, dans ton fichier ta signature prend donc bel
et bien 8 octets...

Les chaines VB sont conservées en Unicode en mémoire donc ta chaine prend 16
octets lorsqu'en mémoire. Cependant, VB créer une copie de la chaine en
format ASCII lorsque le temps de lire la valeur est venu et c'est cette
chaine qui est passé inscrite dans le fichier. Tu étais donc correct, désolé
pour la confusion.


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
moi
Merci en tout cas de ton aide...je n'arrivais pas a m'enlever la M...E de
yeux.... ;-)


"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:%
> Bien visiblement jsuis largué..... la signature prends 16 octets ??????
> ce qui signifie qu'un caracteres est codé sur 2 octets donc ?

j'ai revérifier pour être sûr, dans ton fichier ta signature prend donc


bel
et bien 8 octets...

Les chaines VB sont conservées en Unicode en mémoire donc ta chaine prend


16
octets lorsqu'en mémoire. Cependant, VB créer une copie de la chaine en
format ASCII lorsque le temps de lire la valeur est venu et c'est cette
chaine qui est passé inscrite dans le fichier. Tu étais donc correct,


désolé
pour la confusion.


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous