If nombre de commande

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
venom
Messages : 3138
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: If nombre de commande

Message par venom »

Et bin dit donc ça en fait des If et Endif tout ça :lol:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: If nombre de commande

Message par Huitbit »

Hé les p'tits loups !

Il doit bien y avoir un moyen de diminuer tout ça : la logique combinatoire (algèbre de Boole)
(une petite introduction : http://www.commentcamarche.net/contents ... intro.php3 ; http://fr.wikipedia.org/wiki/Table_de_Karnaugh).

Qu'en pensent les électroniciens ?

Hasta la vista !
Elevé au MSX !
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: If nombre de commande

Message par Ollivier »

@Huitbit

Je pense que les tableaux de Karnaugh sont une bonne illustration logique. Seul souci, c'est que ça se travaille en code gray. Résultat, c'est une norme de plus à apprendre pour Beauregard (A moins qu'il la connaisse et là, paf dans le mil).

@Dobro

Je me demande si c'est ce que tu lis qui te désole ou bien, si ce n'est pas plutôt l'abruti qui a écrit ça, t'ayant écrit en privé un message d'au revoir sur un coup de tête il y a quelques semaines alors que t'y était personnellement pour rien! Tu m'en vois désolé... ça fait partie des couilles absurdes dans le pâté...

Pour le côté technique de la chose, je n'ai fait que mettre en pratique quelque chose à partir des données que j'ai lu ici-même. Et d'ailleurs Papipp a, me semble-t-il admirablement confirmé le calcul (à ce propos, ce n'est pas la première fois qu'il est en train d'assurer). Par l'absurde, je réponds par l'absurde tout simplement.

Maintenant, si tu as moultes "If" qui s'enchaînent à n'en plus finir, voici une solution:

Code : Tout sélectionner

VariableTemp = #False
If Condition
    If Condition
        If Condition
            Etc...
            VariableTemp = #True
            
            Etc...
        EndIf
    EndIf
EndIf
If VariableTemp
    VariableTemp = #False
    If Condition
        If Condition
            Etc...
            VariableTemp = #True

            Etc...
        EndIf
    EndIf
EndIf

If VariableTemp
    ; Ensemble des conditions vraies
EndIf
Bref, ça ne mange pas de pain...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: If nombre de commande

Message par Backup »

ho oui des soluces, ils y en a :) heureusement

mais la simple idée de savoir qu'on est limité par le nombre de IF, moi ça me stress :lol:

avant que Fred ne le dise, je dormais mieux :lol:
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: If nombre de commande

Message par Ollivier »

Aussi stressant qu'un jour la Terre sera entièrement vaporisé par notre Soleil devenu une Bossa Nova: terrible, mais purement théorique...

Au passage, pour les gros chiffres, une technique simple et approximative. ( /!\ Peut-être que je me répète...)

Partant du principe que 2^10 = 1024 ~= 1000 ~= 10^3, on peut en déduire que
2^n ~= 10^Int(3n / 10)

Ex : 2^50 ~= 10^Int(3*50 / 10) ~= 10^15
Donc, littéralement, 2 puissance 50 est environ égal à 1 millions de milliards.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: If nombre de commande

Message par Octavius »

Le nombre d'imbrication limite n'est pas de 128, j'ai fait le test avec le code suivant :

Code : Tout sélectionner

max=100
CreateFile(0,"imb.pb")
WriteStringN(0,"max="+Str(max))
For i=0 To max
  WriteStringN(0,"If 1")
Next i
WriteStringN(0,"Debug max")
For i=0 To max
  WriteStringN(0,"EndIf")
Next i
De 1 à 100 imbrications j'obtiens le message normal attendu du débogueur (0 <= max <= 99).
A partir de 101 imbrications (max=100) je n'obtiens plus le message du débogueur, le programme est donc bogué.
A partir de 109 imbrications (max=108) j'obtiens une erreur du compilateur qui ne répond plus du tout.

La limite est donc de 100.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: If nombre de commande

Message par Ollivier »

mille millions de milliards de milliards de mille...
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: If nombre de commande

Message par Huitbit »

(Wikipédia)
Utilisation des tables de Karnaugh
Les tables/tableaux de Karnaugh sont surtout utilisé(e)s en électronique. En effet, la simplification de l'expression algébrique booléenne permet d'économiser des opérateurs logiques (portes logiques) et donc des circuits. Elle engendre aussi une économie de temps de conception et de fonds, tout en augmentant la fiabilité de l'ensemble.

En programmation, l'utilisation des tables de Karnaugh permet de réduire les séquences de conditions de test complexes en les regroupant en des conditions non intuitives au premier abord, mais qui réduisent la complexité effective du code (volume du source), ainsi que son temps d'exécution en réduisant le nombre des évaluations nécessaires.
Ca vaut quand même le coup non ? Surtout qu'il existe des logiciels qui font la simplification automatiquement, ce n'est peut être pas la peine de mettre les mains dans le cambouis :roll: , il suffit de faire des tableaux de vérité qui répondent aux attentes du programme.

Je n'ai jamais utilisé Karnaugh (si un jour j'en ai besoin, je pense que je m'en servirai) mais juste avec l'algèbre de Boole (qui ne demande pas de gros efforts :mrgreen: ), on peut réduire nettement le nombre de tests !

Hasta la vista !
Elevé au MSX !
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: If nombre de commande

Message par djes »

<MODE sarcasme ON>
Vous êtes tous des idiots :lol:. Ca fait des heures que ce pauvre Beauregard essaye de vous dire que son problème n'est pas l'imbrication de tests de conditions, mais le nombre de ceux-ci dans un code. Autrement dit, pas des

Code : Tout sélectionner

IF test1 THEN
  IF test2 THEN
    (...)
  ENDIF
ENDIF
mais de simples

Code : Tout sélectionner

IF test1 THEN
ENDIF
IF test2 THEN
ENDIF
<MODE sarcasme OFF>
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: If nombre de commande

Message par Backup »

djes a écrit :<MODE sarcasme ON>
Vous êtes tous des idiots :lol:. Ca fait des heures que ce pauvre Beauregard essaye de vous dire que son problème n'est pas l'imbrication de tests de conditions, mais le nombre de ceux-ci dans un code. Autrement dit, pas des

Code : Tout sélectionner

IF test1 THEN
  IF test2 THEN
    (...)
  ENDIF
ENDIF
mais de simples

Code : Tout sélectionner

IF test1 THEN
ENDIF
IF test2 THEN
ENDIF
<MODE sarcasme OFF>
ha ?

et pourquoi crois tu qu'on ne le sait pas ? 8O
on a lu ce qu'il a ecrit , mais rien n'empeche de rebondir sur autre chose , d'autan
que Fred lui a répondu !
que seul la limite est pour les if imbriqués , nous on le sait parceque nous on a tout lu

alors que toi tu tire des conclusion a la hate, sans avoir compris qu'on ne c'est pas arreté pour autant, dans la discussion soulevé, on l'a meme fait évoluer :)

je poserai alors une question

c'est qui l'idiot ?

:lol:
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: If nombre de commande

Message par djes »

Dobro a écrit :
djes a écrit :<MODE sarcasme ON>
Vous êtes tous des idiots :lol:. Ca fait des heures que ce pauvre Beauregard essaye de vous dire que son problème n'est pas l'imbrication de tests de conditions, mais le nombre de ceux-ci dans un code. Autrement dit, pas des

Code : Tout sélectionner

IF test1 THEN
  IF test2 THEN
    (...)
  ENDIF
ENDIF
mais de simples

Code : Tout sélectionner

IF test1 THEN
ENDIF
IF test2 THEN
ENDIF
<MODE sarcasme OFF>
ha ?

et pourquoi crois tu qu'on ne le sait pas ? 8O
on a lu ce qu'il a ecrit , mais rien n'empeche de rebondir sur autre chose , d'autan
que Fred lui a répondu !
que seul la limite est pour les if imbriqués , nous on le sait parceque nous on a tout lu

alors que toi tu tire des conclusion a la hate, sans avoir compris qu'on ne c'est pas arreté pour autant, dans la discussion soulevé, on l'a meme fait évoluer :)

je poserai alors une question

c'est qui l'idiot ?

:lol:
C'est moi...........
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: If nombre de commande

Message par beauregard »

n'est stupide que la stupidité, hum.

Mais comme dis plus haut, le problème que j'ai découvert avec pb concerne le nombre de conditions, et non l'imbrication... Fred va assurément se pencher la dessus. Mais je comprend l'intérêt suscité par l'imbrication, un sujet intéressant, donc cela ne me dérange pas qu'il soit évoqué ici.
Dobro a écrit :mais la simple idée de savoir qu'on est limité par le nombre de IF, moi ça me stress :lol:
je partage ce stress. J'ai mis quand même du temps à cerner le problème. Je pensais dans un premier temps que le problème venait du côté du nombre de commandes en général, puis du nombre de caractère, je me suis même méfié de clipsprite...
Je n'ai jamais utilisé Karnaugh (si un jour j'en ai besoin, je pense que je m'en servirai) mais juste avec l'algèbre de Boole (qui ne demande pas de gros efforts :mrgreen: ), on peut réduire nettement le nombre de tests !
Salut Huitbit, n'hésite pas à laissé sur ce forum une photo du paradis, ici le ciel est de nouveau gris. Toute la difficulté avec une théorie, c'est la mise en pratique.
Un exemple, avec l'animation du vaisseau de l'intro du jeu Vers l'infini(16 images sur 4 rangées) :

Code : Tout sélectionner

If ishipintro<5:ClipSprite(#shipb, ishipintro*64, 64, 64, 48):EndIf
If ishipintro>4 And ishipintro<10:ClipSprite(#shipb, (ishipintro-5)*64, 112, 64, 48):EndIf
If ishipintro>9 And ishipintro<15:ClipSprite(#shipb, (ishipintro-10)*64, 160, 64, 48):EndIf
If ishipintro=15:ClipSprite(#shipb, 0, 208, 64, 48):EndIf
DisplayTransparentSprite( #shipb , 400-32, 410) 
4 conditions toute simple donc...
En sachant que pour un jeu les images n'ont pas toutes la même taille, ni le même nombre d'étape d'animation, je ne vois pas comment ce brave Karnaugh pourra m'aider, hum :?:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: If nombre de commande

Message par Backup »

en fait ce qui est interressant , serai de savoir pourquoi tu te pose la question du nombre de if !

je dis ça parce que par exemple, avec Japbe j'avais de gros probleme de listing et de rafraichissement,
alors que j'atteignais les 6000 lignes de code....

je veux dire que tu as peut etre un symptome qui t'amene a penser que le nombre de IF importes
alors qu'il s'agit d'un bête problème de buffer dans l'editeur...... :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: If nombre de commande

Message par comtois »

beauregard a écrit :Un exemple, avec l'animation du vaisseau de l'intro du jeu Vers l'infini(16 images sur 4 rangées) :

Code : Tout sélectionner

If ishipintro<5:ClipSprite(#shipb, ishipintro*64, 64, 64, 48):EndIf
If ishipintro>4 And ishipintro<10:ClipSprite(#shipb, (ishipintro-5)*64, 112, 64, 48):EndIf
If ishipintro>9 And ishipintro<15:ClipSprite(#shipb, (ishipintro-10)*64, 160, 64, 48):EndIf
If ishipintro=15:ClipSprite(#shipb, 0, 208, 64, 48):EndIf
DisplayTransparentSprite( #shipb , 400-32, 410) 
4 conditions toute simple donc...
En sachant que pour un jeu les images n'ont pas toutes la même taille, ni le même nombre d'étape d'animation, je ne vois pas comment ce brave Karnaugh pourra m'aider, hum :?:
ben tu peux l'écrire de deux façons différentes :

Code : Tout sélectionner

If ishipintro<5
  ClipSprite(#shipb, ishipintro*64, 64, 64, 48)
ElseIf ishipintro>4 And ishipintro<10
  ClipSprite(#shipb, (ishipintro-5)*64, 112, 64, 48)
ElseIf ishipintro>9 And ishipintro<15
  ClipSprite(#shipb, (ishipintro-10)*64, 160, 64, 48)
ElseIf ishipintro=15
  ClipSprite(#shipb, 0, 208, 64, 48)
EndIf

Select ishipintro
  Case 0 To 4
    ClipSprite(#shipb, ishipintro*64, 64, 64, 48)
  Case 5 To 9
    ClipSprite(#shipb, (ishipintro-5)*64, 112, 64, 48)
  Case 10 To 14
    ClipSprite(#shipb, (ishipintro-10)*64, 160, 64, 48)
  Case 15
    ClipSprite(#shipb, 0, 208, 64, 48)
EndSelect
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: If nombre de commande

Message par djes »

D'accord avec Comtois, ton code serait beaucoup plus clean avec des "select case" ; et puis cette histoire de clipsprite peut se data-ifier ; là c'est un boulot de fou! Tu n'as pas fait un petit éditeur pour sélectionner les images? Tu pourrais ainsi créer un fichier de données de découpes...

Pour le fun, je me suis amusé à faire un source bourré de "IF"; j'ai atteint ma limite mémoire de compilation à environ 400000 lignes. Donc pas de limitation à cause des IF, mais à cause de l'assembleur.
Répondre