Forum Liberty Basic France

Débutant » Problème avec LOF(#...) et les fichiers vides
Le 10/10/2012 à 09h37

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Bonjour à tous, j'aurais deux questions:
Si on rempli un fichier de: "" ou de zéros, est-il considéré comme vide ? et:
LOF(#...) detecte-il la fin d'un fichier vide ? merci pour les réponses.
____________________
Roro

   
Le 10/10/2012 à 09h54

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
"" c'est rien du tout, donc tu proposes de remplir un fichier avec rien du tout !?
je n'ai pas vérifié mais à mon avis, si le format est lisible par JB, LOF() renverra zéro puis c'est tout !
Zéro est une valeur, donc si tu le remplis de "0" le fichier ne sera pas vide.
LOF() renvoi le nombre de bytes contenu dans le fichier ouvert avec OPEN.



Edité par cassiope01 Le 10/10/2012 à 09h56
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 10/10/2012 à 14h57

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
J'ai cru comprendre que le nombre de bytes c'est: EOF et que LOF c'est la fin du fichier.
De toutes façons, je ne m'en suis pas sorti.. :s Alors je reste avec mon P...n de compteur.
ça va, ça avance bien, malgrés quelques frayeurs.... Je prend du métier ( je me trimballe une quinzaine de sauvegardes.. :heink )
Tiens une question: je vois que les paramètres passés aux sub changent assez systématiquement de nom
ex: call tintin bx,by...et à l'arrivée: sub tintin sx,ty...ou pire...
Si je garde le mème nom à l'arrivée qu'au départ, quel est le risque ? si il y en a un.. :p
____________________
Roro

   
Le 10/10/2012 à 15h58

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
C'est l'inverse. EOF = End Of File, LOF = Lenght Of File.

Aucun. Tu dois simplement respecter le type ($ si c'est une chaine de caractères) et utiliser ce même nom que tu as écris après SUB nomSub etc, à l'intérieur de la SUB, où tu ne peux pas non plus modifier son contenu. Si tu voulais le faire, tu devras utiliser une autre synthaxe (SUB nomSub byref nomVariable, byref nomVar$). Je n'ai jamais bien compris l'intérêt d'ailleurs ! autant utiliser une variable globale à ce moment là...!



Edité par cassiope01 Le 10/10/2012 à 16h00
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 10/10/2012 à 16h49

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Tous les langages ont des redondances. Moi, c'est les whiles , les loop et les select case, que j'ai du mal à différencier des if then. Au niveau de l'économie de lignes, ce n'est pas si évident.
Un bon tuto donnerait des cas précis où l'un ne peut remplacer l'autre.
PS: Pas étonnant que je m'en sortais pas avec les EOF et les LOF. :lol
____________________
Roro

   
Le 10/10/2012 à 19h05

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
C'est pas tant une question d'économie de lignes (donc de KiloOctets), mais plutôt d'écrire juste ce qu'il faut pour atteindre le but et pas plus ! une question d'efficacité quoi !

De plus, JB n'étant pas spécialement rapide, autant ne pas lui donner de travail supplémentaire inutile !!

Par exemple une suite de if ... then ... endif pour tester la valeur d'une variable pour exécuter quelque chose exécutera TOUS les if ... écris même si la valeur a été trouvée par l'un d'eux.
Dans ce cas, "Select Case" éxécute les conditions écrites dans les "case" et sort dès que l'un d'entre eux a trouvé.
Résultat : économie de temps d'exécution de JB, surtout si les if ... sont à l'intérieur d'une boucle !

Dans un langage que j'utilisais il y a longtemps, il existait if ... elseif ... elseif ... else ... endif, ce qui équivalait à SELECT CASE etc ( qui existait aussi d'ailleurs ;) )
En JB, il n'y a que 2 possibilités pour le if : if ... else ... end if ce qui oblige à réfléchir un peu plus à leur utilisation... avant de les répeter ou les imbriquer à l'infini...!

Tu veux voir des boucles en tout genre et quelques if ?

Attend jusqu'au bout ;)

Code VB :
' http://justbasic.conforums.com/index.cgi?board=games&num=1130670178&action=display&start=15
nomainwin
 
eps=75         'no of elippse
stp=720         'no of step round elipse
nos =40        'no of stars
nsf = 200     'no of stars in background
dim starDist(nos) : dim starDir(nos)
dim starSize(nos)
dim starDist1(nos) : dim starDir1(nos)
dim starSize1(nos)
dim pointx(eps,stp) : dim pointy(eps,stp)
dim size(eps)
dim sfield(3,nsf)
 
'get centre of the ellipses
centreX = DisplayWidth/2
centreY = DisplayHeight/2 - 14
centreZ = sqr(centreX*centreX+centreY*centreY)
a = DisplayWidth*60/eps/94 : b = DisplayHeight*60/eps/94
 
'find x, y and size on all distances and directions
n=1
n1=eps^(1/eps)
'print n1
while circle < eps
    circle = circle + 1
    n=n*n1
    radiusA = a*n+5 : radiusB = b*n
    size(circle) = int(0.2*n+0.9)
    for i = 0 to stp' step .5
        pointx(circle,i) = int(centreX + radiusA*cos(i*360/stp))
        pointy(circle,i) = int(centreY + radiusA*sin(i*360/stp))
    next i
wend
 
WindowWidth = DisplayWidth : WindowHeight = DisplayHeight
open "Stars" for graphics_nsb_fs as #main
#main, "trapclose [quit]"
#main, "down; fill black; color yellow"
 
print #main, "down"
print #main, "home"
print #main, "size 2"
x=WindowWidth*.62 :t=1.01 :t1=t
do
    x=x-1
    z= t mod 360
    for n = 0 to 119
        c1=127*sin((z+n*3)mod 360/57.29577951*4)+127
        c2=127*sin((z+120+n*3)mod 360/57.29577951*4)+127
        c3=127*sin((z+240+n*3)mod 360/57.29577951*4)+127
        print #main, "color ";c1;" ";c2;" ";c3
        print #main, "pie ";x*2;" ";x*2;" ";n*3;" ";3
    next n
    scan
    t=t*t1
loop while x>1
for i=0 to nos
    starDist1(i)=eps
next i
 
#main "rule xor"
while 1 'run forever
scan 'means of exiting
#main "color blue"
for i = 1 to nos
    if starDist1(i) = eps then 'if this star is not on its way
        if rnd(1) > 0.95 then 'then it's 5% chance it will start right now
            starDir1(i) = int(rnd(1)*stp)'select random direction
            starDist1(i) = eps-1'start at rnd ellipse
            starSize1(i)=rndg1(15)
        end if
    else
        starDist1(i) = starDist1(i) - 1 'move to the next concentric ellipse
        if starDist1(i) < 1 then
            #main, "size "; size(starDist1(i)+1)*starSize1(i)
            #main, "set "; pointx(starDist1(i)+1, starDir1(i)); " "; pointy(starDist1(i)+1, starDir1(i))'(m)
            starDist1(i) = eps 'star is "behind" the screen
        end if
    end if
next i
for i = 1 to nos 'drawing loop
    if starDist1(i) < eps then 'set size and look up x and y in the arrays
        if starDist1(i) < eps -1 then
            #main, "size "; size(starDist1(i)+1)*starSize1(i)
            #main, "set "; pointx(starDist1(i)+1, starDir1(i)); " "; pointy(starDist1(i)+1, starDir1(i))'(m)
        end if
        #main, "size "; size(starDist1(i))*starSize1(i)
        #main, "set "; pointx(starDist1(i), starDir1(i)); " "; pointy(starDist1(i), starDir1(i))
    end if
next i
 
#main "color red"
for i = 1 to nos
    if starDist(i) = 0 then 'if this star is not on its way
        if rnd(1) > 0.95 then 'then it's 5% chance it will start right now
            starDir(i) = int(rnd(1)*stp)'select random direction
            starDist(i) = 1'start at rnd ellipse
            starSize(i)=rndg1(15)
        end if
    else
        starDist(i) = starDist(i) + 1 'move to the next concentric ellipse
        if starDist(i) > eps then
            #main, "size "; size(starDist(i)-1)*starSize(i)
            #main, "set "; pointx(starDist(i)-1, starDir(i)); " "; pointy(starDist(i)-1, starDir(i))'(m)
            starDist(i) = 0 'star is "behind" the screen
        end if
    end if
next i
for i = 1 to nos 'drawing loop
    if starDist(i) > 0 then 'set size and look up x and y in the arrays
        #main, "size "; size(starDist(i)-1)*starSize(i)
        #main, "set "; pointx(starDist(i)-1, starDir(i)); " "; pointy(starDist(i)-1, starDir(i))'(m)
        #main, "size "; size(starDist(i))*starSize(i)
        #main, "set "; pointx(starDist(i), starDir(i)); " "; pointy(starDist(i), starDir(i))
    end if
next i
#main, "discard"            '(m) reclaim memory
'timer 10 ,[jump] 'activate these lines to create timer delay
'    wait
' [jump]
'    timer 0
wend
 
[quit]
    close #main
end
 
function rndg1(dstd1) 'simplyfied gauss rnd no
    mean = 0
    x=0
    for n=1 to 12
        x=x+rnd(0)
    next n
    'scan
    rndg1 = dstd1 * (x - 6) + mean
    rndg1 = abs( rndg1 )
end function
 


ça vient du forum justbasic auteur DAVEG.



Edité par cassiope01 Le 10/10/2012 à 19h12
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 10/10/2012 à 21h05

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Citation:
exécutera TOUS les if ... écris même si la valeur a été trouvée

ça je suis pas sur. Je vais tester.
à part ça ,j'ai un problème curieux:
Une sub qui s'execute dans certains cas et pas dans un cas précis.
Le truc est en plein chantier, mais pas loin d'etre fini .je vais le mettre en zip avec un fichier texte pour t'exposer le problème avec une description de l'organisation du code ( pour s'y retrouver facilement)
l'aide sera aussi en fichier texte dans le dossier ( pour le fonctionnement )
Je le commente.
Mais je vais d'abord aller revoir le post du jeu de dames, car ça à l'air d'etre le meme problème.......à+
..............Résolu......Moralité: quand on transfère dans un tableau un contenu plus court que celui qui est déja présent, il faut vider le tableau avant de le remplir....La sub n'y était pour rien.



Edité par Roland Le 10/10/2012 à 22h28
____________________
Roro

   
Le 12/10/2012 à 03h19

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Je n'avais pas eu le temps de regarder le code de Daveg.
C'est franchement impressionnant, et ça fait réver à de merveilleux possibles.
____________________
Roro

   
Débutant » Problème avec LOF(#...) et les fichiers vides  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie