IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Erreur de Segmentation non localisée


Sujet :

C

  1. #21
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Mais si tu en viens à décrire ce que tu veux au milieu de ta fonction, c'est que tu a foiré quelque part, parce que la partie que tu commente de la sorte aurait sans doute largement justifié de se retrouver dans une fonction "séparée".
    Pas d'accord
    Prenons un exemple concret: une fonction Python qui vérifie si les informations saisies sont valides. Il s'agit de la saisie d'un livre (gestion de librairie) qui ira en bdd. Mais bien entendu il ne faut pas saisir plusieurs fois le même article

    Voici ma fonction
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    # Booléen objet valide
    def isValid(
    		self):						# Instance objet
     
    	# Récupération infos saisies
    	saisie=self.getSaisie(
    		"codebarre",
    		"libelle",
    		"pa_ht",
    		"pv_ttc",
    		"date_parution",
    	)
     
    	# Si la zone de saisie codebarre est invalide
    	if len(saisie["codebarre"]) < 13:
    		# Objet invalide
    		return False
     
    	# Si la zone de saisie libellé est vide
    	if not saisie["libelle"]:
    		# Objet invalide
    		return False
     
    	# Si le prix vente à 0
    	if saisie["pv_ttc"] == 0:
    		# Objet invalide
    		return False
     
    	# Si le prix vente < prix achat
    	if saisie["pv_ttc"] < saisie["pa_ht"]:
    		# Objet invalide
    		return False
     
    	# Si la date de parution est supérieure à la date du jour
    	if saisie["date_parution"] >= datetime.date.today():
    		# Objet invalide
    		return False
     
    	# Si le codebarre déjà présent en bdd
    	if self._ihm["bdd"].count(
    		"produit.produit",
    		where="(%s, %s)=(%s, true) %s" % (
    			cBdd.setIFS("codebarre"),
    			cBdd.setIFS("actif"),
    			cBdd.quoted_string(saisie["codebarre"]),
    			"and %s!=%d" % (
    				cBdd.setIFS("id_produit"),
    				self._ihm["module"]._model._id_item,
    			) if not self._ihm["module"]._fl_new else ""
    		),
    		#debug=True,
    	) != 0:
    		# Objet invalide
    		return False
    	# if
     
    	# Objet valide
    	return True
    # isValid()
    Je ne dis pas que certains commentaires sont un peu redondants mais bon, je pense que c'est plus "rafraichissant" de lire ce genre de code que ce genre-là

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    # Booléen objet valide
    # Cette fonction vérifiera si les informations saisies sont valides selon les critères de gestion d'un livre
    # Cartouche en début de fonction qui sera le seul et unique commentaire
    def isValid(
    		self):
     
    	saisie=self.getSaisie(
    		"codebarre",
    		"libelle",
    		"pa_ht",
    		"pv_ttc",
    		"date_parution",
    	)
     
    	return len(saisie["codebarre"]) < 13 and saisie["libelle"] and saisie["pv_ttc"] > 0 and saisie["pv_ttc"] >= saisie["pa_ht"] and saisie["date_parution"] < datetime.date.today() and self._ihm["bdd"].count(
    		"produit.produit",
    		where="(%s, %s)=(%s, true) %s" % (
    			cBdd.setIFS("codebarre"),
    			cBdd.setIFS("actif"),
    			cBdd.quoted_string(saisie["codebarre"]),
    			"and %s!=%d" % (
    				cBdd.setIFS("id_produit"),
    				self._ihm["module"]._model._id_item,
    			) if not self._ihm["module"]._fl_new else ""
    		), 
    	) == 0
    Je ne dis pas qu'un tel code n'est pas lisible mais il ne faut pas négliger côté "ouf la journée a été dure et je suis heureux de pouvoir décompresser un peu en lisant un code où tout est bien détaillé sans avoir besoin de le décortiquer"
    Et pensons ausis évolutivité. Demain un nouveau critère => je rajoute 2 lignes if nouveau_critère pas ok: return False sans avoir à l'insérer dans ce if fonctionnel mais un peu indigeste...


    Citation Envoyé par koala01 Voir le message
    Mais, à ce moment là, tu as une condition parfaite utilisable pour ta boucle qui est -- en principe -- destinée à se répéter longtemps : tant que je n'ai pas intercepté le signal de fin du programme
    Pas possible. Sur Linux une interception de signal se passe dans une fonction dédiée avec signature imposée (elle reçoit un int qui est le signal ayant provoqué son appel et retourne rien)
    Pour simplifier, un programme qui trappe un signal se programmera ainsi
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    void fonction_trap(int sig) {
    	... (traitement de tout ce qu'il faut faire quand la fonction est appelée)...
    }
     
    int main() {
    	// Je décide de trapper le signal SIGINT ainsi que d'autres et les affecter à la fonction
    	signal(SIGINT, fonction_trap);
    	signal(SIGTRUC, fonction_trap);
    	signal(SIGCHOSE, fonction_trap);
     
    	// Ok, ma gestion de signaux est prête - Maintenant je programme mon traitement
    	while (...) {
    		...
    		...
    		...
    	}
    }
    Et à moi de me démerder pour que "fonction_trap()" puisse influer sur le déroulement du traitement si elle est invoquée. Donc éventuellement au travers d'une comm interne (pipe ou autre)...

    Citation Envoyé par koala01 Voir le message
    S'il n'y a que cela pour te faire plaisir ...
    En fait c'est que tu te plantes qui me ferait plaisir mais j'y arrive pas

    Citation Envoyé par koala01 Voir le message
    Si tu as une série de tests qui peuvent confirmer le bon fonctionnement de ton programme, je te proposerais bien de les faire tourner pour t'assurer de l'innocuité des modifications apportées
    Pas besoin, je vois bien que ça fait la même chose et question syntaxe c'est bon. Mais toute la boucle est déroulée (tous les tests sont faits) parfois pour rien...

    Citation Envoyé par koala01 Voir le message
    Maintenant, cela vient peut être du fait que j'ai eu un prof d'algo qui nous a présenté le flowchart que le temps de nous montrer le plat de spagetti que cela devient dés qu'il y a deux boucles imbriquées, puis qui nous a incité à utiliser le nassi-shneiderman (en nous menaçant de nous jeter par la fenêtre si on utilisait goto)
    T'as pas eu à faire du Warnier alors. Avec (en simplifiant) un truc de ce style...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (expression) {
    	truc si vrai;
    }
    autre_truc
    qui devient chez-lui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    10 if expression
    20 then truc si vrai
    30 else goto 40
    40 autre_truc
    Remarque ça suit une certaine logique. Parce que le else étant pré-posiitonné, rajouter plus tard une instruction si le test est faux est facilement possible (et il a créé cette méthode pour des langages qui ne connaissaient pas les boucles).

    Citation Envoyé par koala01 Voir le message
    Mais le fait est que rien dans mon expérience ne m'a jamais laissé face à la nécessité absolue d'avoir recours à un goto, ou à un break|continue pour sortir d'une boucle
    Et que penses-tu du shell qui offre le "break n" et "continue n" permettant de quitter (ou continuer) une boucle se situant "n" niveaux au dessus de celle où on se trouve ?
    Toutefois je n'ai utilisé qu'une fois le "continue 2". C'est un programme pour convertir une méthode PyQt4 (QString("%1 %2").arg(x, y) en méthode PyQt5 où la QString a disparu remplacée par la string Python ("{0} {1}.format(x, y)).
    Donc il me faut remplacer "%9" par {8}, "%8" par {7}, etc (première boucle) et ça sur tous les fichiers demandés (seconde boucle). Mais si un remplacement échoue, alors j'arrête le traitement du fichier (protection) et je passe au fichier suivant (donc ici un continue 2). Bon je n'aurais pas eu cette possibilité j'aurais fait autrement (avec une variable de gestion comme tu le fais si bien) mais puisqu'elle m'était offert...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #22
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    En fait c'est que tu te plantes qui me ferait plaisir mais j'y arrive pas
    Je sais bien

    Malheureusement pour toi, je crains que tu ne cherche en vain un cas qui me ferait me planter, car, de mon point de vue, dés que tu fais un test pour savoir si break|goto|continue dans une boucle, tu définis -- de facto -- ta condition de sortie, fusse-t-elle partielle

    A partir de là, rien ne t'interdira jamais de récupérer le résultat de ce test sous une forme ou une autre de manière à pouvoir l'utiliser "plus tard".
    Pas besoin, je vois bien que ça fait la même chose et question syntaxe c'est bon.
    La syntaxe, c'était le plus facile, car le compilateur m'aurait engueulé si je ne l'avais pas respectée
    Mais toute la boucle est déroulée (tous les tests sont faits) parfois pour rien...
    Sans doute...

    Surtout si tu considère qu'exprimer clairement ta volonté au lecteur -- fusse-t-il bourré, pété ou simplement fatigué -- est inutile

    T'as pas eu à faire du Warnier alors. Avec (en simplifiant) un truc de ce style...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (expression) {
    	truc si vrai;
    }
    autre_truc
    qui devient chez-lui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    10 if expression
    20 then truc si vrai
    30 else goto 40
    40 autre_truc
    Remarque ça suit une certaine logique. Parce que le else étant pré-posiitonné, rajouter plus tard une instruction si le test est faux est facilement possible (et il a créé cette méthode pour des langages qui ne connaissaient pas les boucles).
    Pourrais tu me citer un seul langage depuis COBOL qui ne connait absolument pas les boucles

    Cela fait un bail que je ne l'ai plus patriqué, mais il me semble que même le basic de mon antique amstrad (CPC 464) les connaissait

    Et que penses-tu du shell qui offre le "break n" et "continue n" permettant de quitter (ou continuer) une boucle se situant "n" niveaux au dessus de celle où on se trouve ?
    je ne vais pas trop m'étendre sur le sujet
    Toutefois je n'ai utilisé qu'une fois le "continue 2". C'est un programme pour convertir une méthode PyQt4 (QString("%1 %2").arg(x, y) en méthode PyQt5 où la QString a disparu remplacée par la string Python ("{0} {1}.format(x, y)).
    Donc il me faut remplacer "%9" par {8}, "%8" par {7}, etc (première boucle) et ça sur tous les fichiers demandés (seconde boucle). Mais si un remplacement échoue, alors j'arrête le traitement du fichier (protection) et je passe au fichier suivant (d'où ici le continue 2). Bon je n'aurais pas eu cette possibilité j'aurais fait autrement (avec une variable de gestion comme tu le fais si bien) mais puisqu'elle m'était offert...
    Avec une variable de plus, n'aurais tu pas eu à tout le moins aussi facile à déterminer s'il fallait sortir d'une boucle
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #23
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Pourrais tu me citer un seul langage depuis COBOL qui ne connait absolument pas les boucles
    https://programmation.developpez.com...ar-TypeScript/
    T'en as rêvé, M$ l'a fait


    Citation Envoyé par koala01 Voir le message
    Cela fait un bail que je ne l'ai plus patriqué, mais il me semble que même le basic de mon antique amstrad (CPC 464) les connaissait
    Il connaissait un truc ressemblant à for i in 1 to 10 step n suivi de next i indiquant la fin du corps de boucle

    Citation Envoyé par koala01 Voir le message
    Avec une variable de plus, n'aurais tu pas eu à tout le moins aussi facile à déterminer s'il fallait sortir d'une boucle
    Ben oui. Mais bon, flemme, volonté d'utiliser cette possibilité que je connaissais mais que je n'avais jamais réussi à caser (j'ai greppé tous mes scripts). C'est un peu le "mot compte triple" du scrabble quoi...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #24
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Tu feras sans doute valoir qu'un cluster de disque dur permet, classiquement, de représenter 512 bytes successifs, et je te l'accorde sans problème. Mais ajoute suffisamment souvent quatre caractères à la représentation d'une expression, et ton fichier finira tôt ou tard par nécessiter un cluster de plus lors de l'enregistrement
    Je ne vois pas le délire "j'économise 2 caractères" ou "mon code peut faire 120 colonnes - le 80 colonnes c'est pour les dinosaures" ou encore "mon disque c'est une bande magnétique"

    Est-ce que tu t'es déjà posé la question de ce que cela représente en terme de caractères de remplacer les caractères \t pour autant d'espaces ? (*)

    Réponse : tu exploses la taille de tout tes fichiers (mais la compression est très importante).
    Et dans ce cas ta réflexion c'est n'importe quoi Actuellement le C est le langage compilé qui offre le moins de sucres syntaxiques, et ces sucres syntaxiques sont devenus parti intégrante du langage (on code quasi jamais sans et donc ils sont expressifs)
    Si un programmeur bourré/ fatigué/ .../ "je ne sais pas quoi" ne fait pas la distinction entre a = a + b et a += b qu'il commence par se reposer et ensuite s'il n'y arrive pas qu'il change de langage.

    Parce que j'ai beau réfléchir mais un sucre syntaxique est avant tout une simplification du code (et donc implicitement, il doit être expressif et il a moins de code). Tu peux trouver des sucres syntaxiques qui sont mauvais en terme d'expression, il doit en exister.
    Le problème des sucres syntaxiques, c'est qu'ils sont prévus pour un seul cas (ils ne sont pas flexibles)


    * : Et pourquoi on le fait ? parce qu'on considère son code comme de l'ASCII Art, parce que certains affichages gèrent mieux les espaces que la tabulation (avec une police à chasse fixe contrairement à developpez.net), ...


    Citation Envoyé par koala01 Voir le message
    Malheureusement pour toi, je crains que tu ne cherche en vain un cas qui me ferait me planter, car, de mon point de vue, dés que tu fais un test pour savoir si break|goto|continue dans une boucle, tu définis -- de facto -- ta condition de sortie, fusse-t-elle partielle
    Perdu dans les cas asynchrones ou multhreadés

    Exemple de Microsoft :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
     
    #define BUFFER_SIZE 10
    #define PRODUCER_SLEEP_TIME_MS 500
    #define CONSUMER_SLEEP_TIME_MS 2000
     
    LONG Buffer[BUFFER_SIZE];
    LONG LastItemProduced;
    ULONG QueueSize;
    ULONG QueueStartOffset;
     
    ULONG TotalItemsProduced;
    ULONG TotalItemsConsumed;
     
    CONDITION_VARIABLE BufferNotEmpty;
    CONDITION_VARIABLE BufferNotFull;
    CRITICAL_SECTION   BufferLock;
     
    BOOL StopRequested;
     
    DWORD WINAPI ProducerThreadProc (PVOID p)
    {
        ULONG ProducerId = (ULONG)(ULONG_PTR)p;
     
        while (true)
        {
            // Produce a new item.
     
            Sleep (rand() % PRODUCER_SLEEP_TIME_MS);
     
            ULONG Item = InterlockedIncrement (&LastItemProduced);
     
            EnterCriticalSection (&BufferLock);
     
            while (QueueSize == BUFFER_SIZE && StopRequested == FALSE)
            {
                // Buffer is full - sleep so consumers can get items.
                SleepConditionVariableCS (&BufferNotFull, &BufferLock, INFINITE);
            }
     
            if (StopRequested == TRUE)
            {
                LeaveCriticalSection (&BufferLock);
                break;
            }
     
            // Insert the item at the end of the queue and increment size.
     
            Buffer[(QueueStartOffset + QueueSize) % BUFFER_SIZE] = Item;
            QueueSize++;
            TotalItemsProduced++;
     
            printf ("Producer %u: item %2d, queue size %2u\r\n", ProducerId, Item, QueueSize);
     
            LeaveCriticalSection (&BufferLock);
     
            // If a consumer is waiting, wake it.
     
            WakeConditionVariable (&BufferNotEmpty);
        }
     
        printf ("Producer %u exiting\r\n", ProducerId);
        return 0;
    }
     
    DWORD WINAPI ConsumerThreadProc (PVOID p)
    {
        ULONG ConsumerId = (ULONG)(ULONG_PTR)p;
     
        while (true)
        {
            EnterCriticalSection (&BufferLock);
     
            while (QueueSize == 0 && StopRequested == FALSE)
            {
                // Buffer is empty - sleep so producers can create items.
                SleepConditionVariableCS (&BufferNotEmpty, &BufferLock, INFINITE);
            }
     
            if (StopRequested == TRUE && QueueSize == 0)
            {
                LeaveCriticalSection (&BufferLock);
                break;
            }
     
            // Consume the first available item.
     
            LONG Item = Buffer[QueueStartOffset];
     
            QueueSize--;
            QueueStartOffset++;
            TotalItemsConsumed++;
     
            if (QueueStartOffset == BUFFER_SIZE)
            {
                QueueStartOffset = 0;
            }
     
            printf ("Consumer %u: item %2d, queue size %2u\r\n", 
                ConsumerId, Item, QueueSize);
     
            LeaveCriticalSection (&BufferLock);
     
            // If a producer is waiting, wake it.
     
            WakeConditionVariable (&BufferNotFull);
     
            // Simulate processing of the item.
     
            Sleep (rand() % CONSUMER_SLEEP_TIME_MS);
        }
     
        printf ("Consumer %u exiting\r\n", ConsumerId);
        return 0;
    }
     
    int main ( void )
    {
        InitializeConditionVariable (&BufferNotEmpty);
        InitializeConditionVariable (&BufferNotFull);
     
        InitializeCriticalSection (&BufferLock);
     
        DWORD id;
        HANDLE hProducer1 = CreateThread (NULL, 0, ProducerThreadProc, (PVOID)1, 0, &id);
        HANDLE hConsumer1 = CreateThread (NULL, 0, ConsumerThreadProc, (PVOID)1, 0, &id);
        HANDLE hConsumer2 = CreateThread (NULL, 0, ConsumerThreadProc, (PVOID)2, 0, &id);
     
        puts ("Press enter to stop...");
        getchar();
     
        EnterCriticalSection (&BufferLock);
        StopRequested = TRUE;
        LeaveCriticalSection (&BufferLock);
     
        WakeAllConditionVariable (&BufferNotFull);
        WakeAllConditionVariable (&BufferNotEmpty);
     
        WaitForSingleObject (hProducer1, INFINITE);
        WaitForSingleObject (hConsumer1, INFINITE);
        WaitForSingleObject (hConsumer2, INFINITE);
     
        printf ("TotalItemsProduced: %u, TotalItemsConsumed: %u\r\n", 
            TotalItemsProduced, TotalItemsConsumed);
        return 0;
    }

  5. #25
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par foetus Voir le message
    Je ne vois pas le délire "j'économise 2 caractères" ou "mon code peut faire 120 colonnes - le 80 colonnes c'est pour les dinosaures" ou encore "mon disque c'est une bande magnétique"
    Il semblerait que tu m'aie compris totalement de travers.

    Personnellement, je me fous pas mal si un code qui a nécessité 240 caractères aurait tout aussi bien pu être écrit en 180! Au contraire, à logique et comportement similaire, je militerais plutôt pour la version à 240, uniquement parce que cette version a "d'avantage de chances" d'être correctement comprise par la personne qui le lit alors qu'elle n'y apporte pas forcément toute l'attention requise.

    Est-ce que tu t'es déjà posé la question de ce que cela représente en terme de caractères de remplacer les caractères \t pour autant d'espaces ? (*)
    Personnellement, je me fous, justement parce que la première chose que j'ai dite, c'est que l'on n'est plus dans les années soixante, époque à laquelle le moindre byte coutait la moitié d'un bras
    Si un programmeur bourré/ fatigué/ .../ "je ne sais pas quoi" ne fait pas la distinction entre a = a + b et a += b qu'il commence par se reposer et ensuite s'il n'y arrive pas qu'il change de langage.
    Je suis tout à fait d'accord avec toi.

    Et, si tu relis correctement mes interventions, je n'ai jamais dit que je trouvais la syntaxe a += b moins bonne que l'autre! J'ai juste fait la comparaison du nombre de caractères que cela nécessitait sur le support d'enregistrement.

    Et, si je l'ai fait, ce n'est pas -- loin de là -- parce que j'estime que cela a une importance quelconque, mais parce que je sais qu'on trouve, encore à l'heure actuelle, des développeurs qui militent en faveur d'un code le plus compact possible.

    Mais, encore une fois : je fais, au contraire, partie des gens qui militent pour l'expressivité qui est très souvent antinomique de la compacité.
    Parce que j'ai beau réfléchir mais un sucre syntaxique est avant tout une simplification du code (et donc implicitement, il doit être expressif et il a moins de code). Tu peux trouver des sucres syntaxiques qui sont mauvais en terme d'expression, il doit en exister.
    Sans doute

    Mais, encore une fois, le problème n'est pas là! Le problème est que, à l'époque, Richie et Thompson avaient d'excellentes raisons de proposer ces sucres syntaxiques -- encore une fois, parce que le moindre byte coutait la moitié d'un bras -- et que l'on continue à les utiliser "par habitude" alors que ces sucres syntaxiques ont désormais perdu une bonne partie de leur raison d'être jutement parce qu'on te jette désormais les Gb à la figure.
    Perdu dans les cas asynchrones ou multhreadés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
     
    #define BUFFER_SIZE 10
    #define PRODUCER_SLEEP_TIME_MS 500
    #define CONSUMER_SLEEP_TIME_MS 2000
     
    LONG Buffer[BUFFER_SIZE];
    LONG LastItemProduced;
    ULONG QueueSize;
    ULONG QueueStartOffset;
     
    ULONG TotalItemsProduced;
    ULONG TotalItemsConsumed;
     
    CONDITION_VARIABLE BufferNotEmpty;
    CONDITION_VARIABLE BufferNotFull;
    CRITICAL_SECTION   BufferLock;
     
    BOOL StopRequested;
     
    DWORD WINAPI ProducerThreadProc (PVOID p)
    {
        ULONG ProducerId = (ULONG)(ULONG_PTR)p;
     
        while (true)
        {
            // Produce a new item.
     
            Sleep (rand() % PRODUCER_SLEEP_TIME_MS);
     
            ULONG Item = InterlockedIncrement (&LastItemProduced);
     
            EnterCriticalSection (&BufferLock);
     
            while (QueueSize == BUFFER_SIZE && StopRequested == FALSE)
            {
                // Buffer is full - sleep so consumers can get items.
                SleepConditionVariableCS (&BufferNotFull, &BufferLock, INFINITE);
            }
     
            if (StopRequested == TRUE)
            {
                LeaveCriticalSection (&BufferLock);
                break;
            }
     
            // Insert the item at the end of the queue and increment size.
     
            Buffer[(QueueStartOffset + QueueSize) % BUFFER_SIZE] = Item;
            QueueSize++;
            TotalItemsProduced++;
     
            printf ("Producer %u: item %2d, queue size %2u\r\n", ProducerId, Item, QueueSize);
     
            LeaveCriticalSection (&BufferLock);
     
            // If a consumer is waiting, wake it.
     
            WakeConditionVariable (&BufferNotEmpty);
        }
     
        printf ("Producer %u exiting\r\n", ProducerId);
        return 0;
    }
     
    DWORD WINAPI ConsumerThreadProc (PVOID p)
    {
        ULONG ConsumerId = (ULONG)(ULONG_PTR)p;
     
        while (true)
        {
            EnterCriticalSection (&BufferLock);
     
            while (QueueSize == 0 && StopRequested == FALSE)
            {
                // Buffer is empty - sleep so producers can create items.
                SleepConditionVariableCS (&BufferNotEmpty, &BufferLock, INFINITE);
            }
     
            if (StopRequested == TRUE && QueueSize == 0)
            {
                LeaveCriticalSection (&BufferLock);
                break;
            }
     
            // Consume the first available item.
     
            LONG Item = Buffer[QueueStartOffset];
     
            QueueSize--;
            QueueStartOffset++;
            TotalItemsConsumed++;
     
            if (QueueStartOffset == BUFFER_SIZE)
            {
                QueueStartOffset = 0;
            }
     
            printf ("Consumer %u: item %2d, queue size %2u\r\n", 
                ConsumerId, Item, QueueSize);
     
            LeaveCriticalSection (&BufferLock);
     
            // If a producer is waiting, wake it.
     
            WakeConditionVariable (&BufferNotFull);
     
            // Simulate processing of the item.
     
            Sleep (rand() % CONSUMER_SLEEP_TIME_MS);
        }
     
        printf ("Consumer %u exiting\r\n", ConsumerId);
        return 0;
    }
     
    int main ( void )
    {
        InitializeConditionVariable (&BufferNotEmpty);
        InitializeConditionVariable (&BufferNotFull);
     
        InitializeCriticalSection (&BufferLock);
     
        DWORD id;
        HANDLE hProducer1 = CreateThread (NULL, 0, ProducerThreadProc, (PVOID)1, 0, &id);
        HANDLE hConsumer1 = CreateThread (NULL, 0, ConsumerThreadProc, (PVOID)1, 0, &id);
        HANDLE hConsumer2 = CreateThread (NULL, 0, ConsumerThreadProc, (PVOID)2, 0, &id);
     
        puts ("Press enter to stop...");
        getchar();
     
        EnterCriticalSection (&BufferLock);
        StopRequested = TRUE;
        LeaveCriticalSection (&BufferLock);
     
        WakeAllConditionVariable (&BufferNotFull);
        WakeAllConditionVariable (&BufferNotEmpty);
     
        WaitForSingleObject (hProducer1, INFINITE);
        WaitForSingleObject (hConsumer1, INFINITE);
        WaitForSingleObject (hConsumer2, INFINITE);
     
        printf ("TotalItemsProduced: %u, TotalItemsConsumed: %u\r\n", 
            TotalItemsProduced, TotalItemsConsumed);
        return 0;
    }
    Et même dans le cas de données asynchrone, je ne vois pas où est le problème

    Exemple de Microsoft :
    En même temps, si les exemples donnés par microsoft étaient tous parfait...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #26
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Mais, encore une fois, le problème n'est pas là! Le problème est que, à l'époque, Richie et Thompson avaient d'excellentes raisons de proposer ces sucres syntaxiques -- encore une fois, parce que le moindre byte coutait la moitié d'un bras -- et que l'on continue à les utiliser "par habitude" alors que ces sucres syntaxiques ont désormais perdu une bonne partie de leur raison d'être jutement parce qu'on te jette désormais les Gb à la figure.
    Okay fin du débat

    Tu es bloqué dans les années 70 "sucre syntaxe = gain de place" alors que depuis 10-15 ans c'est une simplification d'un bout code (boucle avec des itérateurs en C++ par exemple) voire une syntaxe à part (l'opérateur flèche => en PHP)


    Citation Envoyé par koala01 Voir le message
    Et même dans le cas de données asynchrone, je ne vois pas où est le problème
    Le booléen de sortie est dans une section critique parce qu'il est partagé entre plusieurs threads


    Citation Envoyé par koala01 Voir le message
    En même temps, si les exemples donnés par microsoft étaient tous parfait...
    Troll pourri parce que sur ce code Microsoft est inattaquable ... notamment parce que c'est du code ultra simple

  7. #27
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par foetus Voir le message
    Tu es bloqué dans les années 70 "sucre syntaxe = gain de place" alors que depuis 10-15 ans c'est une simplification d'un bout code (boucle avec des itérateurs en C++ par exemple)
    Peut-être ...

    Je suis près à accepter ton point de vue d'une "simplification" du code, pour autant que tu m'explique ce que tu entend alors par ce terme .

    Parce que, à mon sens, la syntaxe a += b n'est pas vraiment "plus simple" que la syntaxe a = a + b (en dehors du nombre de caractères nécessaires à sa représentation, s'entend) vu qu'elle va, a priori, à l'encontre de la manière "simple" que l'on a utilisé pour t'apprendre à représenter l'addition depuis les primaires.

    Je suis peut-être bloqué "quelque part", mais, pour ma part, un code "plus simple" est un code susceptible d'être compris par d'avantage de gens. Et il me semble -- à titre personnel -- que le meilleur moyen d'y arriver est sans doute d'utiliser les conventions admises par "la majorité" au lieu de vouloir leur imposer les notre.

    Or, la syntaxe a += b représente justement le genre de convention qu'il faudra expliquer à un moment ou à un autre aux gens pour qu'ils soient en mesure de la comprendre

    Peut-être n'est ce que mon idée de la "simplicité" qui est faussée, et, d'une certaine manière, ce ne serait pas plus étonnant que cela. Mais, dans ce cas, qu'on m'explique

    Le booléen de sortie est dans une section critique parce qu'il est partagé entre plusieurs threads
    En quoi cela devrait il de l'utiliser en lecture seule dans notre condition pour retourner dans la boucle
    Troll pourri parce que sur ce code Microsoft est inattaquable ... notamment parce que c'est du code ultra simple
    Peut-être...

    Mais, dans ce cas, dis moi en quoi le code, à peine modifié pour prendre la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    DWORD WINAPI ConsumerThreadProc (PVOID p)
    {
        ULONG ConsumerId = (ULONG)(ULONG_PTR)p;
     
        while (StopRequested == FALSE && QueueSize != 0)
        {
            EnterCriticalSection (&BufferLock);
     
            while (QueueSize == 0 && StopRequested == FALSE)
            {
                // Buffer is empty - sleep so producers can create items.
                SleepConditionVariableCS (&BufferNotEmpty, &BufferLock, INFINITE);
            }
     
            if (StopRequested == TRUE && QueueSize == 0)
            {
                LeaveCriticalSection (&BufferLock);
            }else{
     
              // Consume the first available item.
     
              LONG Item = Buffer[QueueStartOffset];
     
              QueueSize--;
              QueueStartOffset++;
              TotalItemsConsumed++;
     
              if (QueueStartOffset == BUFFER_SIZE)
              {
                  QueueStartOffset = 0;
              }
     
              printf ("Consumer %u: item %2d, queue size %2u\r\n", 
                  ConsumerId, Item, QueueSize);
     
              LeaveCriticalSection (&BufferLock);
     
              // If a producer is waiting, wake it.
     
              WakeConditionVariable (&BufferNotFull);
     
              // Simulate processing of the item.
     
              Sleep (rand() % CONSUMER_SLEEP_TIME_MS);
            }
        }
     
        printf ("Consumer %u exiting\r\n", ConsumerId);
        return 0;
    }
    aurait été incorrect ou "moins simple", sachant qu'il est -- à tout le moins -- plus précis dans l'expression des souhaits de l'auteur

    Ne va pas me dire que je ne peux pas utiliser [c]StopRequested[c] et QueueSize dans ma condition, parce que ces deux valeurs étaient déjà testées dans le code d'origine
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #28
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Ne va pas me dire que je ne peux pas utiliser StopRequested et QueueSize dans ma condition, parce que ces deux valeurs étaient déjà testées dans le code d'origine
    Et bim, tu passes pour un rigolo
    Pour un rigolo et un gros troll, suite a ton "Microsoft c'est caca", parce que tu ne connais pas les condition variables de Microsoft (<- ou bien tu n'as pas pris 5 minutes pour vérifier)

    Merci et fin du débat une deuxième fois

    Le booléen StopRequested est lu par les threads fils et modifier par le thread parent. Mais à chaque lecture et à chaque écriture, la section critique BufferLock protège l'action.
    Mais toi, tu fais un test while (StopRequested == FALSE /*...*/) { sans protection



    Citation Envoyé par koala01 Voir le message
    Et il me semble -- à titre personnel -- que le meilleur moyen d'y arriver est sans doute d'utiliser les conventions admises par "la majorité" au lieu de vouloir leur imposer les notre.
    Je te retourne ta remarque " il me semble -- à titre PROFESSIONNEL -- que le meilleur moyen d'y arriver est sans doute d'utiliser les conventions admises par "la majorité" au lieu de vouloir leur imposer les notre."

    Parce que si tu codes ton C en mode Javaifié pour que le premier péquin moyen puisse te comprendre, moi en 8 ans d'expérience, j'en ai vu du code C et C++ passé - et j'ai appris à le lire : du beau du pas beau, de l'efficace, du compact, ...
    Et je te dis, les sucres syntaxiques en C ne sont pas le problème (déjà parce qu'il en existe très très peu).
    Au contraire, des trucs style décalage de bits <</ >> pour faire des multiplications/ divisions par puissance de 2

    Si a += b n'a pas de sens mathématique, pour moi c'est plus simple parce qu'on compacte 2 opérations élémentaires : une auto-addition et une affectation.
    Mais je te comprends le PHP a banni ces opérateurs simplifiés parce que trop dangereux : cela va dans ton sens ... PHP veut toucher la majorité des développeurs.

  9. #29
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    Et pourquoi on le fait ? parce qu'on considère son code comme de l'ASCII Art, parce que certains affichages gèrent mieux les espaces que la tabulation (avec une police à chasse fixe contrairement à developpez.net), ...
    J'espère que tu seras d'accord pour dire qu'un programme bien proprement écrit (aéré, tabulé) c'est un programme qu'on lit plus facilement non ? Je suis tombé vendredi sur un script bash (écrit par un collègue) tout écrit à gauche de l'écran ben heureusement que je n'ai pas à le reprendre.
    Accessoirement il semble que je sois le seul à préférer des tabulations aux espaces. Pourtant je trouve plus facile d'aligner 2 lignes par une tabulation que d'aligner 2 lignes par 4 espaces. Quand les lignes se suivent ça va encore mais si un sous-bloc vient s'interposer au milieu alors réaligner la ligne qui est après le bloc avec celle qui est avant ça le fait moins bien. Et avec un .vimrc bien configuré, ça présente aussi bien.

    Citation Envoyé par foetus Voir le message
    Tu es bloqué dans les années 70 "sucre syntaxe = gain de place"
    Perso je préfère aussi le a+=b mais je n'arrive pas à dire pourquoi. Bien évidemment je me fous de l'espace pris par mes sources (je ne dis pas que je suis pêté de To mais je ne pense pas que ça joue beaucoup). Je pense que c'est parce que l'instruction est devenue tellement naturelle au fil des années (50 ans que le C existe quand-même) et qu'elle est maintenant exportée de partout (sauf en php apparemment, ça j'en sais rien ça fait des milliards d'années que j'ai pas codé en php)...

    Citation Envoyé par foetus Voir le message
    alors que depuis 10-15 ans c'est une simplification d'un bout code (boucle avec des itérateurs en C++ par exemple) voire une syntaxe à part (l'opérateur flèche => en PHP)
    Euh... en quoi une nouvelle syntaxe créée pour de (relativement) nouveaux concepts (ici les tableaux associatifs) sont de la simplification ?

    Citation Envoyé par koala01 Voir le message
    Et, si je l'ai fait, ce n'est pas -- loin de là -- parce que j'estime que cela a une importance quelconque, mais parce que je sais qu'on trouve, encore à l'heure actuelle, des développeurs qui militent en faveur d'un code le plus compact possible.
    T'es sûr que c'est ça la raison ? Je veux dire ça existe encore ces gens là ? Ca fait pourtant longtemps qu'on sait qu'écrire compact n'aura aucune incidence sur le compilé. Je ne dis pas que je n'écris pas parfois des trucs de ce style for (i=0, c=s; *c != '\0'; c++, i++); avec "i" qui évolue en parallèle dans la boucle plutôt qu'en dehors mais ce n'est pas pour "être le plus compact possible" (sinon j'aurais supprimé != '\0') mais juste parce que (peut-être bizarrement) je trouve ce genre de boucle plus facile à relire qu'une boucle de ce style for (c=s; *c != '\0'; c++) i++; (pourtant pas tellement différente dans son écriture et, si on veille bien à initialiser "i", produisant le même résultat). Le fait de lier "i" et "c" dans le corps montre (de mon point de vue) à tout le monde une intéraction forte entre ces variables. Et si demain le code évolue et que je n'ai plus besoin de compter ma string, je n'ai qu'une ligne à effacer.

    Citation Envoyé par foetus Voir le message
    et un gros troll, suite a ton "Microsoft c'est caca"
    Pourtant c'est la vérité (pas qu'il est un troll mais plutôt ton qualificatif de M$).
    Bon, sans déconner, c'est vrai que je n'aime pas la politique de M$ (toujours à vouloir contrôler nos ordis "soi disant" pour notre bien alors qu'en réalité c'est pour nous inciter à leur acheter toujours plus de trucs) donc fatalement moi aussi dès que je vois un code M$ ça me hérisse...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #30
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    J'espère que tu seras d'accord pour dire qu'un programme bien proprement écrit (aéré, tabulé) c'est un programme qu'on lit plus facilement non ? Je suis tombé vendredi sur un script bash (écrit par un collègue) tout écrit à gauche de l'écran ben heureusement que je n'ai pas à le reprendre.
    Accessoirement il semble que je sois le seul à préférer des tabulations aux espaces. Pourtant je trouve plus facile d'aligner 2 lignes par une tabulation que d'aligner 2 lignes par 4 espaces. Quand les lignes se suivent ça va encore mais si un sous-bloc vient s'interposer au milieu alors réaligner la ligne qui est après le bloc avec celle qui est avant ça le fait moins bien. Et avec un .vimrc bien configuré, ça présente aussi bien.
    Je suis d'accord avec toi : un code aéré avec une indentation sans erreur (<- moi j'affiche les caractères invisibles espace/ tabulation pour en être sûr)
    Mais tu peux tomber sur un nazi qui veut que son code soit figé en mettant que des espaces (et aucune tabulation) (<- mais comme je le disait la taille du code explose)

    Moi c'est moite-moite : des tabulations pour l'indentation (la gauche du code) et des espaces pour caler le code (des tests sur plusieurs lignes, aligner les "=" dans une même colonne pour les membres d'une structure, ...)
    Ainsi, on a l'avantage des tabulations : chacun peut avoir son indentation (2, 4 ou 8 espaces)
    Mon commentaire était aussi pour dire que son code n'est plus affiché que dans un IDE, mais aussi dans une interface Web (interface de versioning) ou autre. Cela peut poser problème sur l'affichage : choix de la police en particulier et souvent des choix de "coding style" un peu bizarre de prime abord justement pour palier certains "manquements" de tous ces affichages.


    Citation Envoyé par Sve@r Voir le message
    Perso je préfère aussi le a+=b mais je n'arrive pas à dire pourquoi.
    Moi aussi je n'y arrivait pas mais je pense que c'est parce que ce sont des opérations élémentaires et qu'on n'a pas besoin de s'épancher. Les sucres syntaxiques rappellent les 2 opérations et c'est le principal


    Citation Envoyé par Sve@r Voir le message
    Euh... en quoi une nouvelle syntaxe créée pour de (relativement) nouveaux concepts (ici les tableaux associatifs) sont de la simplification ?
    Regarde les exemples : pour la construction d'un tableau ou le parcours de la collection, on est réduit au minimum : pas de variables locales (pour stocker les itérateurs) pas de compteur ou de sentinelle pour arrêter la boucle, ...

    Tu peux comparer aussi avec le "Range-based for loop" du C++
    Et comme il y a moins de code, c'est plus facile à lire.


    Citation Envoyé par Sve@r Voir le message
    Ca fait pourtant longtemps qu'on sait qu'écrire compact n'aura aucune incidence sur le compilé.
    C'est surtout qu'à l'époque le nombre de lignes affiché était faible. Maintenant avec les écrans 4K on peut afficher à peu près 80 - 120 lignes (au doigt mouillé).

    J'ai connu ce type de code : plusieurs lignes de code sur une ligne "fichier". Ainsi on pouvait voir 30 - 40 lignes au lieu de 20 - 25.
    Mais c'est vrai qu'il faut s'y habituer ... ou pas


    Citation Envoyé par Sve@r Voir le message
    Pourtant c'est la vérité (pas qu'il est un troll mais plutôt ton qualificatif de M$).
    Je voulais un exemple avec une sortie protégée avec une section critique/ mutex. C'est l'exemple qui m'est venu à l'esprit.
    Mais @koala01 a raison : on peut remplacer la boucle infinie par une boucle normale. Il faut juste utiliser un booléen local (booléen qui est utilisé dans le test de la boucle) et qui est modifié à l'endroit du break.

  11. #31
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    a += b n'est pas nécessairement un sucre syntaxique: Selon le processeur, ça peut, au niveau assembleur, être directement une seule instruction, y compris quand a est en RAM et non dans un registre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [Flex4] erreur non localisée
    Par execrable dans le forum Flex
    Réponses: 1
    Dernier message: 27/04/2011, 11h46
  2. FOP + erreurs non localisées
    Par yozine dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 07/09/2009, 11h05
  3. Erreur de segmentation non trouvée
    Par Bladelight dans le forum OpenCV
    Réponses: 6
    Dernier message: 31/08/2009, 13h40
  4. erreurs de segmentation non détectée
    Par Benoit_T dans le forum Langage
    Réponses: 5
    Dernier message: 21/07/2009, 14h47
  5. Erreur non localisée
    Par nezdeboeuf62 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 24/01/2008, 22h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo