Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4892 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

question de newbie : a quoi sert la fonction break?

n°180987
bb138
La vie est belle ...
Posté le 23-07-2002 à 17:51:34  profilanswer
 

Reprise du message précédent :
Domage... je ferai donc avec un variable...  :sweat:

mood
Publicité
Posté le 23-07-2002 à 17:51:34  profilanswer
 

n°180992
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-07-2002 à 17:56:41  profilanswer
 

BB138 a écrit a écrit :

Par contre pour les pointeurs de fonction ... là je sèche... je sais que ça existe mais je ne sais pas du tout comment m'en servir... (sauf peut-être dans les callback ou je me trompe...)



Un pointeur de fonction peut être utilisé dans le cadre d'interception d'évènements. Ce sont les delegate du C# par exemple.
On créé un handler pour un évènement précis, et on lui rattache un pointeur de fonction, qui pointera sur la fonction à éxecuter quand l'évènement se produira.
Donc, oui, ça peut servir pour les callbacks


---------------
J'ai un string dans l'array (Paris Hilton)
n°180996
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-07-2002 à 17:59:05  profilanswer
 

Les "Events" des objets VCL dans Borland C++Builder


Message édité par antp le 23-07-2002 à 17:59:23

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°181076
freewol
Ceci n'est pas une citation
Posté le 23-07-2002 à 19:22:40  profilanswer
 

euh ... je dis ptet une connerie, mais pour sortir de plusieurs boucle à la fois, y a les exceptions non ?
 
EDIT : Et pour ce qui est des pointeurs de fonctions, ben c au moins obligatoires pour les appels dynamiques de DLL ...


Message édité par freewol le 23-07-2002 à 19:23:42
n°181097
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-07-2002 à 20:03:57  profilanswer
 

j'y pensais même plus aux exceptions :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°181119
LetoII
Le dormeur doit se réveiller
Posté le 23-07-2002 à 21:18:01  profilanswer
 

Ouai, le pb c que ça oblige à mettre un bloc try autour de la boucle => perte de performence


---------------
Le Tyran
n°181120
freewol
Ceci n'est pas une citation
Posté le 23-07-2002 à 21:19:59  profilanswer
 

LetoII a écrit a écrit :

Ouai, le pb c que ça oblige à mettre un bloc try autour de la boucle => perte de performence




 
T'es sur de ça ? Ok pour la théorie, mais ça serait intéressant de voir en pratique ce que ça donne ... Parce que j'en abuse un peu je dois dire, et j'ai jamais fait gaffe que ça pourrait ralentir le prog ... Donc je serai intéressé par des précisions :jap:

n°181121
LetoII
Le dormeur doit se réveiller
Posté le 23-07-2002 à 21:21:35  profilanswer
 

freewol a écrit a écrit :

 
 
T'es sur de ça ? Ok pour la théorie, mais ça serait intéressant de voir en pratique ce que ça donne ... Parce que j'en abuse un peu je dois dire, et j'ai jamais fait gaffe que ça pourrait ralentir le prog ... Donc je serai intéressé par des précisions :jap:




 
D'après ce que je sais lorsque tu met un bloc trail ça rajoute un mécanisme de contrôle qui vérifie chaque instruction donc bon niveau perf c pas ça


---------------
Le Tyran
n°181122
LeGreg
Posté le 23-07-2002 à 21:22:21  profilanswer
 

franchement les exceptions c'est overkill  
pour simplement rediriger le flux du programme!
 
je rappelle qu'il y a tout une ingenierie autour des exceptions
qu'il n'y a pas avec un break ou un simple goto par exemple.
 
De plus, si on a un debugueur qui s'arrete aux exceptions les placer partout dans le programme c'est une tres mauvaise idee (parole de quelqu'un qui debugue beaucoup en delphi..)
 
LeGreg

n°181124
LeGreg
Posté le 23-07-2002 à 21:25:53  profilanswer
 

LetoII a écrit a écrit :

 
D'après ce que je sais lorsque tu met un bloc trail ça rajoute un mécanisme de contrôle qui vérifie chaque instruction donc bon niveau perf c pas ça




 
Rien a voir.. Please verifie tes infos.
 
http://www.codeproject.com/cpp/exceptionhandler.asp
 
LeGreg

mood
Publicité
Posté le 23-07-2002 à 21:25:53  profilanswer
 

n°181126
taureau
Posté le 23-07-2002 à 21:32:11  profilanswer
 

par contre les exceptions c une bonne piste pour protéger des portion sensible d'un programme que l'on ne veut pas faire tracer par des petits malins :)

n°181129
LetoII
Le dormeur doit se réveiller
Posté le 23-07-2002 à 21:34:24  profilanswer
 

legreg a écrit a écrit :

 
 
Rien a voir.. Please verifie tes infos.
 
http://www.codeproject.com/cpp/exceptionhandler.asp
 
LeGreg




 
OK, je me suis mal exprimé et un peu emélé les pinceau ok  :jap:  
N'empéche que le mécanisme de gestion des exceptions alourdis non négligeament un prog et ses perf peuvent s'en ressentir (faut voir aussi ce que fait le prog, pour des petits truc ça va être transparent).


---------------
Le Tyran
n°181135
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-07-2002 à 21:56:53  profilanswer
 

legreg a écrit a écrit :

 
De plus, si on a un debugueur qui s'arrete aux exceptions les placer partout dans le programme c'est une tres mauvaise idee (parole de quelqu'un qui debugue beaucoup en delphi..)




 
heu dans Delphi/Builder dans les options tu peux lui dire que le debuggeur doit pas s'arrêter aux exception :p


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°181136
LeGreg
Posté le 23-07-2002 à 21:59:12  profilanswer
 

ce que je veux dire c'est que c'est bien de faire
la distinction entre les erreurs (catchées par le debugueur)
des bouts de codes mal ficeles qui levent une exception
pour sortir d'une boucle..
 
LeGreg

n°181137
LeGreg
Posté le 23-07-2002 à 22:00:38  profilanswer
 

ce serait un peu comme une alarme incendie
qui se declencherait toutes les 5 minutes
si tu vois ce que je veux dire.
 
LeGreg

n°181138
antp
Super Administrateur
Champion des excuses bidons
Posté le 23-07-2002 à 22:02:05  profilanswer
 

Ouais mais bon moi j'utilise parfois les exceptions pour des situations qui ne sont pas des erreurs... ça ne me choque pas :o
 


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°181150
LetoII
Le dormeur doit se réveiller
Posté le 23-07-2002 à 22:44:14  profilanswer
 

legreg a écrit a écrit :

ce serait un peu comme une alarme incendie
qui se declencherait toutes les 5 minutes
si tu vois ce que je veux dire.
 
LeGreg




 
Je suis assez daccord sur ce point


---------------
Le Tyran
n°181229
Musaran
Cerveaulté
Posté le 24-07-2002 à 01:54:55  profilanswer
 

break et continue font intégralement partie des structures de contrôle, ce ne sont pas de "trucs moches".
 
break quitte une boucle for ou while, ou un bloc switch/case.
->comme un goto juste après l'accolade fermante.
continue mène à la partie "bouclage" d'une boucle for ou while.
->comme un goto juste avant l'accolade fermante.
 
Je les utilises lorsqu'ils sont nécessaires, ni plus ni moins.
Ceci renverse l'ordre des bits d'un char.
Sauriez-vous l'écrire tout aussi simplement, mais sans break ?

Code :
  1. char res=0 ; arg=0xAA ;
  2. for(int nb=0;;){ //forever  
  3.    res |= arg&0x01 ; //copie du bit de poids faible  
  4.    nb++ ;            //compter les bits copiés  
  5.    if(nb==8) break ; //s'arrêter à 8 bits  
  6.    arg >>= 1 ;       //vider vers la droite (préparer le suivant)...  
  7.    res <<= 1 ;       //...pour remplir vers la gauche (préparer la place)  
  8. }


 
Le goto n'est pas aussi simple qu'il y paraît.
Il engendre la libération de variables locales s'il fait quitter un bloc {}, mais seulement de celles crées avant lui.

Code :
  1. { int a;
  2. goto tag ; //libération de a, mais pas de b
  3. int b ;
  4. }
  5. tag:


Il engendre l'allocation/initialisation à 0 des variables dont il fait "sauter la création".

Code :
  1. goto tag ;
  2. int a=5
  3. tag:
  4. //ici a vaut 0!


Bref goto n'est pas propre.
D'ailleurs, c'est un énorme obstacle à l'optimisation pour un compilateur.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°181230
LeGreg
Posté le 24-07-2002 à 02:13:40  profilanswer
 

je ne dirais pas qu'il s'agit d'un enorme obstacle
a l'optimisation mais simplement un obstacle possible dans des cas identifiés dont n'a pas trop a se soucier le programmeur sauf dans des sections critiques.
 
De plus, l'utilisation d'un goto permet d'implanter
facilement les etats de transitions d'un automate
parce que c'est "pain in the ass" avec des switch/case; on passe le plus simplement du monde du modele sur papier au code et cela sans erreur. Mais c'est plus un avis personnel que vous n'etes pas obligés de suivre.  
 
LeGreg

n°181270
darkoli
Le Petit Dinosaure Bleu
Posté le 24-07-2002 à 09:43:18  profilanswer
 

musaran a écrit a écrit :

 
Je les utilises lorsqu'ils sont nécessaires, ni plus ni moins.
Ceci renverse l'ordre des bits d'un char.
Sauriez-vous l'écrire tout aussi simplement, mais sans break ?

Code :
  1. char res=0 ; arg=0xAA ;
  2. for(int nb=0;;){ //forever  
  3.    res |= arg&0x01 ; //copie du bit de poids faible  
  4.    nb++ ;            //compter les bits copiés  
  5.    if(nb==8) break ; //s'arrêter à 8 bits  
  6.    arg >>= 1 ;       //vider vers la droite (préparer le suivant)...  
  7.    res <<= 1 ;       //...pour remplir vers la gauche (préparer la place)  
  8. }






 

Code :
  1. char  res=0;
  2. char  arg=0xAA;
  3. int   nb=0;
  4. res = res | (arg & 1); //copie du bit de poids faible
  5. for (nb=1;nb<8;nb++)
  6. {
  7.   arg = arg >> 1; // vider vers la droite (préparer le suivant)...  
  8.   res = res << 1; // ...pour remplir vers la gauche (préparer la place)
  9.   res = res | (arg & 1); //copie du bit de poids faible
  10. }


 
Comme ça, ça marche très bien. :)


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°182297
Musaran
Cerveaulté
Posté le 25-07-2002 à 02:52:31  profilanswer
 

DarkOli a écrit a écrit :

Comme ça, ça marche très bien. :)


Pas du tout, c'est bogué !
 
Sincèrement, je ne pense pas que l'on puisse écrire mieux cette boucle.
Le test de sortie est au milieu des intructions de la boucle, et pas ailleurs.
 
legreg :
L'essentiel est de savoir ce que l'on fait, comme d'habitude.
Si le goto va à un noeud naturel du programme (début/fin de bloc), alors c'est bien.


Message édité par Musaran le 25-07-2002 à 02:55:51

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°182311
bb138
La vie est belle ...
Posté le 25-07-2002 à 08:47:38  profilanswer
 

Je ne vois vraiment pas où c'est boggé !  :heink:

n°182343
darkoli
Le Petit Dinosaure Bleu
Posté le 25-07-2002 à 09:29:36  profilanswer
 

musaran a écrit a écrit :

Pas du tout, c'est bogué !
 
Sincèrement, je ne pense pas que l'on puisse écrire mieux cette boucle.
Le test de sortie est au milieu des intructions de la boucle, et pas ailleurs.
 
legreg :
L'essentiel est de savoir ce que l'on fait, comme d'habitude.
Si le goto va à un noeud naturel du programme (début/fin de bloc), alors c'est bien.
 




 
Il est où le bug ?
 
De toute façon il n'existe pas une seule manière d'écrire un bout de code, donc il y a pas mal de solution et chacun a aussi sa propre façon d'écrire du code donc le plus important c'est que ce soit lisible pour le plus grand nombre.


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°182348
LetoII
Le dormeur doit se réveiller
Posté le 25-07-2002 à 09:31:57  profilanswer
 

DarkOli a écrit a écrit :

 
 
Il est où le bug ?
 
De toute façon il n'existe pas une seule manière d'écrire un bout de code, donc il y a pas mal de solution et chacun a aussi sa propre façon d'écrire du code donc le plus important c'est que ce soit lisible pour le plus grand nombre.




 
Ouaip


---------------
Le Tyran
n°182400
LeGreg
Posté le 25-07-2002 à 10:16:46  profilanswer
 

l'avantage de l'inversion de bits
c'est que c'est une operation inconditionnelle.
 

Code :
  1. unsigned char arg = 0xAA;
  2. unsigned char res = (arg & 1) << 8
  3.          | ((arg & 2 ) <<7)
  4.          | ((arg & 4 ) <<6)
  5.          | ((arg & 8 ) <<5)
  6.          | ((arg & 16 ) <<4)
  7.          | ((arg & 32 ) <<3)
  8.          | ((arg & 64 ) <<2)
  9.          | ((arg & 128 ) <<1)
  10.          | (arg & 256 );


 
Pour un DWORD, on fait l'appel sur chaque
portion de 8 bits..
 
LeGreg

n°183287
Musaran
Cerveaulté
Posté le 26-07-2002 à 01:04:29  profilanswer
 

DarkOli a écrit a écrit :

Il est où le bug ?
 
De toute façon il n'existe pas une seule manière d'écrire un bout de code, donc il y a pas mal de solution et chacun a aussi sa propre façon d'écrire du code donc le plus important c'est que ce soit lisible pour le plus grand nombre.


Je vais dire diplomatiquement que nos deux versions n'ont pas le même résultat :D . Je vais revérifier.
 
De toutes façons je ne trouve pas propre de doubler une instruction en l'éjectant de la boucle.
Je préfères nettement ma version (on s'en serait douté).
 
legreg
Ma boucle aussi peut être facilement déroulée par l'optimiseur.
Mais ta proposition devrait être encore plus efficace.
 
Il y a un autre moyen de sortir de plusieurs imbrications de boucles.
-Mettre ces boucles dans un fonction à part (inline bien sur).
-sortir avec "return".


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°184115
Musaran
Cerveaulté
Posté le 27-07-2002 à 00:22:39  profilanswer
 

Effectivement, ce n'est pas bogué.
J'ai du gaffer lors d'un copier/coller, désolé...
 
legreg
Maintenat c'est toi qui fait des bogues...
Retourner un DWORD est différent de retourner les octets dont il est fait.
Et tu voulais écrire ça je pense:

Code :
  1. unsigned char res =
  2.   ((arg&0x01) <<7)
  3. | ((arg&0x02) <<5)
  4. | ((arg&0x04) <<3)
  5. | ((arg&0x08) <<1)
  6. | ((arg&0x10) >>1)
  7. | ((arg&0x20) >>3)
  8. | ((arg&0x40) >>5)
  9. | ((arg&0x80) >>7);

Mis en forme générique ça donne ça:

Code :
  1. #include <assert.h>
  2. #include <limits>
  3. //Inversion de l'ordre des bits
  4. //par isolement+déplacement, avec deux boucles pour reconstituer un décalage négatif
  5. //1 décalage, 1 masquage, un ou-affectation par bit
  6. //déroulable possible par le compilateur, parallèlisme possible des opérations
  7. //forme optimale ?
  8. ///!\Attention/!\ Ne marche pas sur les types signés !
  9. template <class T>
  10. T BitReverse(T arg, const int nbits= sizeof(T)*numeric_limits<unsigned char>::digits){
  11. assert(nbits>0) ;
  12. T res(0);
  13. T mask(1) ;
  14. signed int shift= nbits-1 ;
  15. do{
  16.  res|= (arg&mask)<<shift ;
  17.  mask<<= 1 ;
  18.  shift-= 2 ;
  19. }while(shift>0) ;
  20. //<< et >> n'acceptant pas d'opérande de droite négatif, il faut en changer à mi-chemin
  21. shift= -shift ;
  22. do{
  23.  res|= (arg&mask)>>shift ;
  24.  mask<<= 1 ;
  25.  shift+= 2 ;
  26. }while(shift<=nbits-1) ;
  27. return res ;
  28. }

Je pense que c'est la solution la plus rapide (peut être déroulé et mis en ligne par l'optimiseur).
J'ai mis le nombre de bits en argument pour permettre de retourner des quartets par exemple.
Et une valeur par défaut pour pas avoir à s'en soucier.
 
[B]Malheureusement[/B], ta solution comme mon adaptation ne marchent pas avec les types signés, car alors le >> copie le bit de poids fort au lieu de le déplacer.
J'en reviens donc involontairement à ma solution.
 
C'est pas croyable que des choses aussi simples à énoncer soient ausi compliquées à réaliser.
 
 
J'ai un autre cas où le break est indispensable: compter du min au max d'un type.

Code :
  1. #include <limits.h>
  2. for(char var= CHAR_MIN ; ; ){
  3. //instructions avec test
  4. if(var==CHAR_MAX) break ;
  5. ++var ;
  6. }

Bien sûr, un "while(var++ == CHAR_MAX)" pourrait y remédier, mais ça ne marcherait pas avec une opération plus compliquée.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°184136
LeGreg
Posté le 27-07-2002 à 01:41:01  profilanswer
 

Citation :

Et tu voulais écrire ça je pense:

Code :
  1. unsigned char res =
  2.   ((arg&0x01) <<7)
  3. | ((arg&0x02) <<5)
  4. | ((arg&0x04) <<3)
  5. | ((arg&0x08) <<1)
  6. | ((arg&0x10) >>1)
  7. | ((arg&0x20) >>3)
  8. | ((arg&0x40) >>5)
  9. | ((arg&0x80) >>7);



 
Oui bien entendu, je n'ai pas beaucoup reflechi avant d'ecrire ;)
Mais comme je ponds ca en corrigeant mes bugs delphi je suis
a moitié pardonné, non :) ?
 
LeGreg

n°184138
LeGreg
Posté le 27-07-2002 à 01:44:21  profilanswer
 

j'ai une question mais alors vraiment débile:
a quoi cela sert-il d'inverser l'ordre des bits d'un type signé?
 
LeGreg

n°184140
Musaran
Cerveaulté
Posté le 27-07-2002 à 01:57:05  profilanswer
 

A rien.
 
En fait, je n'en connaît pas d'utilisation.
Pour corriger les valeurs reçues d'un truc branché à l'envers ?
Pour des trucs comme la décompression audio/video il faut des machins zarb des fois.
 
Et la rotation de bits, tu sais à quoi elle sert ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°184141
LeGreg
Posté le 27-07-2002 à 02:06:15  profilanswer
 

ben comme c'etait un sujet qui apparemment te tenait a coeur, j'en avais déduit que tu en avais besoin pour un de tes projets.
 
la rotation de bits? ben on en a une des utilisations :D
(calculer l'inverse de l'ordre des bits d'un octet)
Sinon je vois plein d'autres: coder un champ de bits, faire du scrolling bit a bit, diviser/multiplier par des puissances de deux, et j'en passe..
 
LeGreg

n°184638
Musaran
Cerveaulté
Posté le 28-07-2002 à 03:51:42  profilanswer
 

legreg a écrit a écrit :

la rotation de bits? ben on en a une des utilisations :D


?
rotation: décalage, mais le bit éjecté est inséré à l'autre bout.
 
Sinon, je n'en ai pas eu besoin, mais je voulais le faire comme exercice pour voir si j'avais tout compris.
Je n'avais pas tout compris, il y a des pièges horribles !


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Fonction sort pour un recordset ADOfonction JS et les carateres speciaux (non XHTML compliant)
Pitite question !!![ASP] Fonction 'replace', petit probleme
[HTML, JS] Heu, ca sert à quoi le HTML 4.01, à part renvoyer aux CSS2[PHP] Récuperer une variable d'une fonction...
[C] fonction gets() qui ne s'exécute pas dans un switch()Créer une fonction de recherche
[C++ Builder] Quel .h inclure pour la fonction ROUND ?voir le XML question toute conne, pour visualiser ss passer par saxon
Plus de sujets relatifs à : question de newbie : a quoi sert la fonction break?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)