OVH Cloud OVH Cloud

Problème de lecture - écriture en vbA

20 réponses
Avatar
Patrice Henrio
J'ai créé un type utilisateur dont voici le descriptif

Public Type PointPlan
X As Single
Y As Single
End Type


Public Type tDonnées
Nom As Integer 'son nom
PremièreZone As Long 'la première zone dans la liste des zones
NbZones As Byte 'le nombre de zones (en général 1)
Intérieur As Long 'la couleur du territoire
Frontière As Long 'la couleur de la frontière
Style As Byte 'le style de remplissage et de frontière
Premier_Roi As Long 'le numéro du premier roi dans la liste des rois
Nombre_Roi As Byte 'le nombre de rois suivants dans cette liste
Date_Début As Integer 'la date du début de la période considérée
Date_Fin As Integer 'la date de la fin de cette même période
Centre As PointPlan 'le point de la carte à partir duquel on affiche
les infos
'(nom du territoire et roi régnant).
Région As Byte 'Nom de la super-région correspondant. Une super
région est
'un ensemble de territoires ayant des points
communs culturels.
'C'est la super-région que l'on retrouve dans le
WB.
AfficheInfo As Byte 'la valeur à partir de laquelle les infos
s'affichent

End Type

Public Type tPays
Données As tDonnées
'les trois champs suivants ne servent que pour la lecture du tableau Pays
du programme
IndexRoi As Long
IndexRgn As Long
Valide As Boolean
End Type

Lorsque j'écris le tableau avec la procédure suivante :

Private Sub CmdBtnEntrerLesPays_Click()
Dim Feuille As String, REGION As String, Ligne As Integer, Pays As
tPays, ENR As Long
If MsgBox("Avez-vous pensé à sauver les centres ?", vbYesNo) = vbYes
Then
Feuille = "Pays"
REGION = "$A:$P"
Ligne = 3
ENR = 1
Open CHEMIN & "PAYS.DAT" For Binary As #1
With Worksheets(Feuille).Range(REGION)
While .Cells(Ligne, 3) <> ""
Pays.Données.Nom = CInt(.Cells(Ligne, 3))
Pays.Données.PremièreZone = CLng(.Cells(Ligne, 4))
Pays.Données.NbZones = CByte(.Cells(Ligne, 5))
Pays.Données.Intérieur = CLng(.Cells(Ligne, 6))
Pays.Données.Frontière = CLng(.Cells(Ligne, 7))
Pays.Données.Style = CByte(.Cells(Ligne, 8))
Pays.Données.Premier_Roi = CLng(.Cells(Ligne, 9))
Pays.Données.Nombre_Roi = CByte(.Cells(Ligne, 10))
Pays.Données.Date_Début = CInt(.Cells(Ligne, 11))
Pays.Données.Date_Fin = CInt(.Cells(Ligne, 12))
Pays.Données.Centre.X = CSng(.Cells(Ligne, 13))
Pays.Données.Centre.Y = CSng(.Cells(Ligne, 14))
Pays.Données.Région = CByte(.Cells(Ligne, 15))
Pays.Données.AfficheInfo = CByte(.Cells(Ligne, 16))
Pays.IndexRgn = CLng(0)
Pays.IndexRoi = CLng(0)
Pays.Valide = True
Put #1, ENR, Pays
ENR = ENR + 1
Ligne = Ligne + 1
Wend
End With
Close
End If
End Sub

Avec comme première ligne de valeurs 0,58,1 ...

Et que je la relis avec cette procédure,

Private Sub CmdBtnModifierLesCentres_Click()
Dim Feuille As String, REGION As String, Ligne As Integer, Pays As
tPays, col As Integer, rep As Integer
Dim I As Integer, L As Long, B As Byte, S As Single, BO As Boolean, ENR
As Long
Feuille = "Pays"
REGION = "$A:$P"
Ligne = 3
ENR = 1
Close
Open CHEMIN & "PAYS.DAT" For Binary As #1 'Len = Len(Pays)
With Worksheets(Feuille).Range(REGION)
While Not EOF(1)
'Get #1, , I
'Close
'Exit Sub
Get #1, ENR, Pays
If Pays.Données.Nom <> CInt(.Cells(Ligne, 3)) Then
rep = MsgBox("erreur sur le nom, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.PremièreZone <> CLng(.Cells(Ligne, 4)) Then
rep = MsgBox("erreur sur la première zone, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.NbZones <> CByte(.Cells(Ligne, 5)) Then
rep = MsgBox("erreur sur le nombre de zone, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Intérieur <> CLng(.Cells(Ligne, 6)) Then
rep = MsgBox("erreur sur l'intérieur, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Frontière <> CLng(.Cells(Ligne, 7)) Then
rep = MsgBox("erreur sur la frontière, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Style <> CByte(.Cells(Ligne, 8)) Then
rep = MsgBox("erreur sur le style, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Premier_Roi <> CLng(.Cells(Ligne, 9)) Then
rep = MsgBox("erreur sur le premier roi, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Nombre_Roi <> CByte(.Cells(Ligne, 10)) Then
rep = MsgBox("erreur sur le nombre de rois, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Date_Début <> CInt(.Cells(Ligne, 11)) Then
rep = MsgBox("erreur sur le début, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Date_Fin <> CInt(.Cells(Ligne, 12)) Then
rep = MsgBox("erreur sur la fin, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Centre.X <> CSng(.Cells(Ligne, 13)) Then
rep = MsgBox("erreur sur l'abscisse du centre, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Centre.Y <> CSng(.Cells(Ligne, 14)) Then
rep = MsgBox("erreur sur l'ordonnée du centre, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Région <> CByte(.Cells(Ligne, 15)) Then
rep = MsgBox("erreur sur la région, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.AfficheInfo <> CByte(.Cells(Ligne, 16)) Then
rep = MsgBox("erreur sur l'affichage, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If

'If Pays.Données.Nom = .Cells(Ligne, 3) Then
' .Cells(Ligne, 13) = Pays.Données.Centre.X
' .Cells(Ligne, 14) = Pays.Données.Centre.Y
' .Cells(Ligne, 16) = Pays.Données.AfficheInfo
'End If
Ligne = Ligne + 1
ENR = ENR + 1
Wend
End With
Close

End Sub

Mon premier enregistrement commence par 18176 au lieu de 0
Je tourne là dessus depuis plusieurs jours et rien n'y fait.
Help me !!!!

10 réponses

1 2
Avatar
pas-de-spam>Wanadoo.fr
Patrice Henrio a écrit :
OK ça expliquerait effectivement mes problèmes de relecture.

Il faut que je potasse tout ça.

"parci" a écrit dans le message de news:


On Thu, 16 Jun 2005 22:18:43 +0200, "Patrice Henrio"
wrote:


Je ne comprends pas pourquoi mais ton idée marche.



En fait, ça marche parce que LenB retourne la taille en mémoire de la
structure, et que cette taille est ici toujours supérieure à la taille
de l'enregistrement écrit par Put en mode Random. Pour une structure
(donc un Variant), comme ici, Put écrit un descripteur (sur 2 octets)
suivis des données (suivant leurs tailles réelles).

Donc, tu peux plutôt écrire :

Open CHEMIN & "PAYS.DAT" For Random Access Write As #1 Len >>Len(Pays) + 2

Open CHEMIN & "PAYS.DAT" For Random Access Read As #1 Len = Len(Pays)
+ 2









Bonjour,
Si je puis me permettre:
C'est la même chose pour les tableaux, si on veut l'adresse du premier
element il faut utiliser Adressof(montableau(0)).

A+

Christophe
Avatar
Patrice Henrio
Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu d'être
puisque j'écris et je lis en séquentiel.

J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce qui est
lu et écris.

En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le
passage à VB pur a échoué.

Comme je lis et j'écris en fait un tableau de type utilisateur dans lequel
un des champs est lui-même un type utilisateur, ça doit faire des n½uds.
Je tiens le groupe au courant de mes découvertes dans ce domaine.

En tout cas merci à tous ceux qui se sont penchés sur la question.

"Fred" a écrit dans le message de news:
ek$
Dans le message:%23E7n1$,
Patrice Henrio écrit:
J'ai créé un type utilisateur dont voici le descriptif

Public Type PointPlan
X As Single
Y As Single
End Type


Public Type tDonnées
Nom As Integer 'son nom
PremièreZone As Long 'la première zone dans la liste des zones
NbZones As Byte 'le nombre de zones (en général 1)
Intérieur As Long 'la couleur du territoire
Frontière As Long 'la couleur de la frontière
Style As Byte 'le style de remplissage et de frontière
Premier_Roi As Long 'le numéro du premier roi dans la liste
des rois Nombre_Roi As Byte 'le nombre de rois suivants dans
cette liste Date_Début As Integer 'la date du début de la
période considérée Date_Fin As Integer 'la date de la fin de
cette même période Centre As PointPlan 'le point de la carte à
partir duquel on
affiche les infos
'(nom du territoire et roi régnant).
Région As Byte 'Nom de la super-région correspondant. Une
super région est
'un ensemble de territoires ayant des
points communs culturels.
'C'est la super-région que l'on retrouve
dans le WB.
AfficheInfo As Byte 'la valeur à partir de laquelle les infos
s'affichent

End Type

Public Type tPays
Données As tDonnées
'les trois champs suivants ne servent que pour la lecture du tableau
Pays du programme
IndexRoi As Long
IndexRgn As Long
Valide As Boolean
End Type

Lorsque j'écris le tableau avec la procédure suivante :

Private Sub CmdBtnEntrerLesPays_Click()
Dim Feuille As String, REGION As String, Ligne As Integer, Pays As
tPays, ENR As Long
If MsgBox("Avez-vous pensé à sauver les centres ?", vbYesNo) >> vbYes Then
Feuille = "Pays"
REGION = "$A:$P"
Ligne = 3
ENR = 1
Open CHEMIN & "PAYS.DAT" For Binary As #1
With Worksheets(Feuille).Range(REGION)
While .Cells(Ligne, 3) <> ""
Pays.Données.Nom = CInt(.Cells(Ligne, 3))
Pays.Données.PremièreZone = CLng(.Cells(Ligne, 4))
Pays.Données.NbZones = CByte(.Cells(Ligne, 5))
Pays.Données.Intérieur = CLng(.Cells(Ligne, 6))
Pays.Données.Frontière = CLng(.Cells(Ligne, 7))
Pays.Données.Style = CByte(.Cells(Ligne, 8))
Pays.Données.Premier_Roi = CLng(.Cells(Ligne, 9))
Pays.Données.Nombre_Roi = CByte(.Cells(Ligne, 10))
Pays.Données.Date_Début = CInt(.Cells(Ligne, 11))
Pays.Données.Date_Fin = CInt(.Cells(Ligne, 12))
Pays.Données.Centre.X = CSng(.Cells(Ligne, 13))
Pays.Données.Centre.Y = CSng(.Cells(Ligne, 14))
Pays.Données.Région = CByte(.Cells(Ligne, 15))
Pays.Données.AfficheInfo = CByte(.Cells(Ligne, 16))
Pays.IndexRgn = CLng(0)
Pays.IndexRoi = CLng(0)
Pays.Valide = True
Put #1, ENR, Pays
ENR = ENR + 1
Ligne = Ligne + 1
Wend
End With
Close
End If
End Sub

Avec comme première ligne de valeurs 0,58,1 ...

Et que je la relis avec cette procédure,

Private Sub CmdBtnModifierLesCentres_Click()
Dim Feuille As String, REGION As String, Ligne As Integer, Pays As
tPays, col As Integer, rep As Integer
Dim I As Integer, L As Long, B As Byte, S As Single, BO As
Boolean, ENR As Long
Feuille = "Pays"
REGION = "$A:$P"
Ligne = 3
ENR = 1
Close
Open CHEMIN & "PAYS.DAT" For Binary As #1 'Len = Len(Pays)
With Worksheets(Feuille).Range(REGION)
While Not EOF(1)
'Get #1, , I
'Close
'Exit Sub
Get #1, ENR, Pays
If Pays.Données.Nom <> CInt(.Cells(Ligne, 3)) Then
rep = MsgBox("erreur sur le nom, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.PremièreZone <> CLng(.Cells(Ligne, 4)) Then
rep = MsgBox("erreur sur la première zone, ligne "
& Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.NbZones <> CByte(.Cells(Ligne, 5)) Then
rep = MsgBox("erreur sur le nombre de zone, ligne
" & Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Intérieur <> CLng(.Cells(Ligne, 6)) Then
rep = MsgBox("erreur sur l'intérieur, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Frontière <> CLng(.Cells(Ligne, 7)) Then
rep = MsgBox("erreur sur la frontière, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Style <> CByte(.Cells(Ligne, 8)) Then
rep = MsgBox("erreur sur le style, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Premier_Roi <> CLng(.Cells(Ligne, 9)) Then
rep = MsgBox("erreur sur le premier roi, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Nombre_Roi <> CByte(.Cells(Ligne, 10)) Then
rep = MsgBox("erreur sur le nombre de rois, ligne
" & Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Date_Début <> CInt(.Cells(Ligne, 11)) Then
rep = MsgBox("erreur sur le début, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Date_Fin <> CInt(.Cells(Ligne, 12)) Then
rep = MsgBox("erreur sur la fin, ligne " & Ligne,
vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Centre.X <> CSng(.Cells(Ligne, 13)) Then
rep = MsgBox("erreur sur l'abscisse du centre,
ligne " & Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Centre.Y <> CSng(.Cells(Ligne, 14)) Then
rep = MsgBox("erreur sur l'ordonnée du centre,
ligne " & Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.Région <> CByte(.Cells(Ligne, 15)) Then
rep = MsgBox("erreur sur la région, ligne " &
Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If
If Pays.Données.AfficheInfo <> CByte(.Cells(Ligne, 16))
Then rep = MsgBox("erreur sur l'affichage, ligne "
& Ligne, vbOKCancel)
If rep = vbCancel Then
Close
Exit Sub
End If
End If

'If Pays.Données.Nom = .Cells(Ligne, 3) Then
' .Cells(Ligne, 13) = Pays.Données.Centre.X
' .Cells(Ligne, 14) = Pays.Données.Centre.Y
' .Cells(Ligne, 16) = Pays.Données.AfficheInfo
'End If
Ligne = Ligne + 1
ENR = ENR + 1
Wend
End With
Close

End Sub

Mon premier enregistrement commence par 18176 au lieu de 0
Je tourne là dessus depuis plusieurs jours et rien n'y fait.
Help me !!!!



Bonjour,
Par curiosité j'ai testé ta macro pour confirmer ce que je pensais à
propos du mode d'adressage du get et du put en mode binaire.
Elle fonctionne très bien avec les modifs suivantes :

Soit :
Put #1,,Pays
Get #1,,Pays

Soit, si tu veux faire de l'accès aléatoire
Put #1, ENR, Pays
Get #1, ENR, Pays
avec dans ce cas
ENR = ENR + Len(Pays) '45 : la taille du type
ou
ENR = Len(Pays) * (numPays-1) + 1

Un autre détail :
while lof(1)<>loc(1)
cela évite de lire un enregistrement de trop.

Pour ce qui est de résoudre le même problème avec des random, je n'ai
jamais essayé avec autre chose que du texte (pas de valeurs binaire).

--
Fred



Avatar
Patrice Henrio
Peux-tu détailler le problème avec adressof(montableau(0))

En effet en VB j'utilisais justement des types utilisateurs et des tableaux
pour les lire en une fois dans un fichier

Ainsi j'utilise sans problème les deux fonctions suivantes

Public Function TableauDePoints(ByVal Nom As String) As tPointPlan()
'lit un tableau du type utilisateur tPointPlan
Dim P As tPointPlan, T() As tPointPlan
Open Chemin & Nom & ".PTS" For Binary As #1
ReDim T(1 To LOF(1) / Len(P))
Get 1, , T
Close #1
TableauDePoints = T
Erase T
End Function

Public Function TableauDeLong(ByVal Nom As String) As Long()
'lit un tableau de Long
Dim P As Long, T() As Long
Open Chemin + Nom + ".NBP" For Binary As #1
ReDim T(1 To LOF(1) / Len(P))
Get 1, , T
Close #1
TableauDeLong = T
Erase T
End Function


"pas-de-spam>Wanadoo.fr Wanadoo.fr >" <"pas-de-spam> a écrit dans le message
de news: 42b2e913$0$11716$
Patrice Henrio a écrit :
OK ça expliquerait effectivement mes problèmes de relecture.

Il faut que je potasse tout ça.

"parci" a écrit dans le message de news:


On Thu, 16 Jun 2005 22:18:43 +0200, "Patrice Henrio"
wrote:


Je ne comprends pas pourquoi mais ton idée marche.



En fait, ça marche parce que LenB retourne la taille en mémoire de la
structure, et que cette taille est ici toujours supérieure à la taille
de l'enregistrement écrit par Put en mode Random. Pour une structure
(donc un Variant), comme ici, Put écrit un descripteur (sur 2 octets)
suivis des données (suivant leurs tailles réelles).

Donc, tu peux plutôt écrire :

Open CHEMIN & "PAYS.DAT" For Random Access Write As #1 Len >>>Len(Pays) + 2

Open CHEMIN & "PAYS.DAT" For Random Access Read As #1 Len = Len(Pays)
+ 2









Bonjour,
Si je puis me permettre:
C'est la même chose pour les tableaux, si on veut l'adresse du premier
element il faut utiliser Adressof(montableau(0)).

A+

Christophe


Avatar
Fred
Dans son message
Patrice Henrio nous dit :

Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu
d'être puisque j'écris et je lis en séquentiel.



Oui, ta seconde écriture écrase toute la première à l'exception du
premier octet.
Ce qui fait que le poids faible de ton deuxième nom, écrase le poids
fort du premier.
Ta deuxième ligne ne commencerais pas par 71 par hasard ? (dans ton
premier jeu de test)
Et je suppose que ton fichier résultant n'a pas une taille multiple de
45 ? C'est un premier indice pour se rendre compte du problème. A
priori, il doit faire (44 + le nombre de lignes écrites) octets. Au lieu
de 45 * le nombre de lignes écrites.

Tu peux quand même garder ta variable ENR, mais en l'incrémentant par
pas de 45.

J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce
qui est lu et écris.



Un petit éditeur hexadécimal est très bien pour cela.

En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le
passage à VB pur a échoué.

Comme je lis et j'écris en fait un tableau de type utilisateur dans
lequel un des champs est lui-même un type utilisateur, ça doit faire
des n½uds. Je tiens le groupe au courant de mes découvertes dans ce
domaine.
En tout cas merci à tous ceux qui se sont penchés sur la question.





--
Fred
Avatar
Patrice Henrio
Tout juste Sherlock
En effet mon deuxième enregistrement commence 71
Bravo pour la déduction qui démontre la maîtrise du sujet.

En tout cas merci.

Je continue mes investigations.

"Fred" a écrit dans le message de news:

Dans son message
Patrice Henrio nous dit :

Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu
d'être puisque j'écris et je lis en séquentiel.



Oui, ta seconde écriture écrase toute la première à l'exception du premier
octet.
Ce qui fait que le poids faible de ton deuxième nom, écrase le poids fort
du premier.
Ta deuxième ligne ne commencerais pas par 71 par hasard ? (dans ton
premier jeu de test)
Et je suppose que ton fichier résultant n'a pas une taille multiple de 45
? C'est un premier indice pour se rendre compte du problème. A priori, il
doit faire (44 + le nombre de lignes écrites) octets. Au lieu de 45 * le
nombre de lignes écrites.

Tu peux quand même garder ta variable ENR, mais en l'incrémentant par pas
de 45.

J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce
qui est lu et écris.



Un petit éditeur hexadécimal est très bien pour cela.

En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le
passage à VB pur a échoué.

Comme je lis et j'écris en fait un tableau de type utilisateur dans
lequel un des champs est lui-même un type utilisateur, ça doit faire
des n½uds. Je tiens le groupe au courant de mes découvertes dans ce
domaine.
En tout cas merci à tous ceux qui se sont penchés sur la question.





--
Fred




Avatar
Patrice Henrio
Grâce à vos remarques judicieuses aux uns et aux autres, j'ai pu régler mon
problème et tout roule maintenant.
De plus j'ai appris des choses sur Binary et Random, len et lenB.

Quelqu'un a-t'il testé la rapidité de lecture ou l'écriture d'un tableau en
une fois au lieu d'une boucle, j'ai l'impression que la lecture du tableau
d'un coup est plus rapide, c'est ce que je fais dans la fonction suivante

Open Chemin & "P.DAT" For Binary As #1
Put #1, , Pays
Close

Open Chemin & "P.DAT" For Binary As #1
NbPays = LOF(1) / Len(P)
ReDim Pays(1 To NbPays)
Get #1, , Pays
Close

A quels problèmes inconnus à ce jour vais-je être confrontés.



"Patrice Henrio" a écrit dans le message de
news: %
Tout juste Sherlock
En effet mon deuxième enregistrement commence 71
Bravo pour la déduction qui démontre la maîtrise du sujet.

En tout cas merci.

Je continue mes investigations.

"Fred" a écrit dans le message de news:

Dans son message
Patrice Henrio nous dit :

Dons mon problème viendrait d'un ENR=ENR+1 qui de plus n'a pas lieu
d'être puisque j'écris et je lis en séquentiel.



Oui, ta seconde écriture écrase toute la première à l'exception du
premier octet.
Ce qui fait que le poids faible de ton deuxième nom, écrase le poids fort
du premier.
Ta deuxième ligne ne commencerais pas par 71 par hasard ? (dans ton
premier jeu de test)
Et je suppose que ton fichier résultant n'a pas une taille multiple de 45
? C'est un premier indice pour se rendre compte du problème. A priori, il
doit faire (44 + le nombre de lignes écrites) octets. Au lieu de 45 * le
nombre de lignes écrites.

Tu peux quand même garder ta variable ENR, mais en l'incrémentant par pas
de 45.

J'ai décidé de m'attaquer sérieusement au problème en vérifiant ce
qui est lu et écris.



Un petit éditeur hexadécimal est très bien pour cela.

En effet hier soir j'ai réussi à le faire fonctionner sous vbA mais le
passage à VB pur a échoué.

Comme je lis et j'écris en fait un tableau de type utilisateur dans
lequel un des champs est lui-même un type utilisateur, ça doit faire
des n½uds. Je tiens le groupe au courant de mes découvertes dans ce
domaine.
En tout cas merci à tous ceux qui se sont penchés sur la question.





--
Fred








Avatar
Fred
Dans son message
Patrice Henrio nous dit :

[...]
Quelqu'un a-t'il testé la rapidité de lecture ou l'écriture d'un
tableau en une fois au lieu d'une boucle, j'ai l'impression que la
lecture du tableau d'un coup est plus rapide, c'est ce que je fais
dans la fonction suivante



Oui, j'ai testé cela en faisant une copie de fichier octet par octet ou
par blocs.
La différence est très significative sur de gros fichiers.

--
Fred
Avatar
Patrice Henrio
Bien reçu
merci

"Fred" a écrit dans le message de news:

Dans son message
Patrice Henrio nous dit :

[...]
Quelqu'un a-t'il testé la rapidité de lecture ou l'écriture d'un
tableau en une fois au lieu d'une boucle, j'ai l'impression que la
lecture du tableau d'un coup est plus rapide, c'est ce que je fais
dans la fonction suivante



Oui, j'ai testé cela en faisant une copie de fichier octet par octet ou
par blocs.
La différence est très significative sur de gros fichiers.

--
Fred




Avatar
parci
On Fri, 17 Jun 2005 17:34:57 +0200, "pas-de-spam>Wanadoo.fr"
<"pas-de-spam>Wanadoo.fr"> wrote:

Bonjour,
Si je puis me permettre:
C'est la même chose pour les tableaux, si on veut l'adresse du premier
element il faut utiliser Adressof(montableau(0)).



VarPtr(montableau(0)).

Mais est-ce utile ici, je ne pense pas.
Avatar
pas-de-spam>Wanadoo.fr
parci a écrit :

On Fri, 17 Jun 2005 17:34:57 +0200, "pas-de-spam>Wanadoo.fr"
<"pas-de-spam>Wanadoo.fr"> wrote:


Bonjour,
Si je puis me permettre:
C'est la même chose pour les tableaux, si on veut l'adresse du premier
element il faut utiliser Adressof(montableau(0)).




VarPtr(montableau(0)).

Mais est-ce utile ici, je ne pense pas.


Oui VarPtr,

Non ici c'est pas utile mais c'était juste pour souligner que ce
problème de représentation en mèmoire d'une variable et de son contenu
est plus fréquent qu'il n'y parait.

Christophe
1 2