Page 1 sur 2
Longueur des chaines : Le retour
Publié : mer. 24/nov./2004 17:20
par Chris
En principe, quand on charge un fichier de plus de 64 Ko en mémoire avec AllocatMemory(), on peut récupérer le contenu du tampon par tranche de 64 Ko avec Valeur$ = PeekS(*Tampon, Longueur).
Je me trompe
Avec le code qui suit, j'ai un MEGA plantage avec redémarrage du PC.
Le fichier que je charge en mémoire est une copie du fichier "APIFunctionListing.txt" qui fait 230 Ko et qui se trouve dans le dossier "Compilers"
Je l'ai renommé, au cas ou...
Code : Tout sélectionner
Fichier.s = "D:\PureBasic\FichierTest.txt"
Size = FileSize(Fichier)
If ReadFile(0,Fichier)
*Buffer = AllocateMemory(Size)
If *Buffer
ReadData(*Buffer, Size)
EndIf
CloseFile(0)
EndIf
a$ = PeekS(*Buffer,50000)
Debug a$
Dans l'exemple, "a$" fait 50 Ko, et donc, est encore dans la limite des 64 Ko.
Il me semble qu'on en avait déjà parlé, mais j'ai pas trouvé ou.
Publié : mer. 24/nov./2004 17:29
par Anonyme2
Publié : mer. 24/nov./2004 17:31
par nico
ça serait pas le debug A$ qui provoque le plantage.
Si ce n'est pas ça, initialise a$: a$=space(50000)

Publié : mer. 24/nov./2004 17:33
par Chris
Exact, mais mon plantage à lieu si je dépasse 32000 octets!
(J'ai pas essayé à l'octet près, il plante à 32767, et je vais pas faire que ça de redémarrer à chaque fois)
On est loin des 64 Ko, il me semble

Publié : mer. 24/nov./2004 17:45
par nico
Rien ne t'oblige à passer par un debug pour faire tes tests, met tes données dans un fichier.
Publié : mer. 24/nov./2004 17:45
par Chris
@Nico
A mon avis, il n'y a pas de raison d'initialiser la valeur de la variable a$ à partir du moment ou on ne dépasse pas le seuil des 64 Ko!
De toute façon, il y a un méchant bug au niveau de debugger ou du compilo, parce que ça ne devrait pas planter aussi violemment!
Publié : mer. 24/nov./2004 18:03
par Anonyme2
Chris,
j'avais pas bien lu ton post.
Essaye de faire ça
a$ = PeekS(*Buffer,size)
Debug a$
car tu essaye de lire dans la mémoire qui n'est pas alloué puisque tu as alloué une taille de size (environ 30 Ko d'après ce que tu dit mais tu essaye de lire au-delà.
Publié : mer. 24/nov./2004 18:04
par nico
Pour moi non plus Chris, puisque je t'ai dit que je pensais que ça venait du debugger, c'était juste une idée au cas où ça ne viendrait pas de là; car pour moi ton code est correct.
Personnellement, je pense que tu fais quand même une utilisation abusive du debugger!

Publié : mer. 24/nov./2004 18:10
par Chris
Size, c'est la taille du fichier. (Il fait 230 Ko)
J'ai bien alloué la mémoire, puisque j'ai fait
*Buffer = AllocateMemory(Size)
j'ai bien alloué 230 Ko de mémoire.
Si je fais a$ = PeekS(*Buffer,size) , je vais essayer de faire rentrer 230 Ko dans une chaine qui ne peut en contenir plus de 64
Publié : mer. 24/nov./2004 18:12
par Anonyme2
Ha bon, j'ai cru que ton fichier faisait 30 Ko

Publié : mer. 24/nov./2004 18:18
par Anonyme2
Je viens de tester ton code avec le même fichier et ça marche sans problème sans plantage
Le fichier fait 235134 octets et a$ s'affiche dans le debbuger sans problème, j'ai été jusqu'à 63000 pour a$.
Alors ????
Publié : mer. 24/nov./2004 18:19
par Chris
Denis a écrit :Ha bon, j'ai cru que ton fichier faisait 30 Ko

Je pensais quand même que mon explication dans le premier post était claire
Surtout que pour tester, il suffit de prendre le fichier, de le renommer pour le cas ou il serait modifié, et de tester sur ce fichier.
N'importe quel fichier de plus de 64 Ko fait l'affaire.
Et windows n'est pas à un plantage près

Publié : mer. 24/nov./2004 18:21
par Chris
Ben pourquoi ça plante chez moi????
J'ai XP + SP2, 256 Mo Ram, PB 3.92
Publié : mer. 24/nov./2004 18:22
par Anonyme2
Je comprend de travers ce soir
MAis bon ton code fonctionne chez moi

Publié : mer. 24/nov./2004 18:23
par nico
Il faut peut être que tu libère la mémoire!
