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 :

[Optimisation C++] Calcul code altitude


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut [Optimisation C++] Calcul code altitude
    Bonjour à tous,

    Je viens de faire un bout de code calculant les codes de Gray utilisés en aviation (infos sur le codage de Gray ici, infos sur le codage "Mode C" (altitude) ici et les différents codes obtenus ici).
    Peu importe si vous ne comprenez pas le but, seule m'intéresse ici la manière dont il est obtenu.
    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
    unsigned short Code_Mask = 0x0FFF;
    unsigned short tab[1280];
     
    unsigned short i=0;
    unsigned short j=0;
    // Parcours des 2^12 valeurs possibles pour les codes, mais on ajoute dans le tableau seulement les valeurs autorisées
    while(i<4096)
    {
    	// Calcul du code de Gray à partir du code binaire
    	unsigned short N = i;
    	unsigned short N2 = (i << 1) & Code_Mask;
    	unsigned short Gray = (N ^ N2) >> 1;
     
    	bool D1 = (Gray & 0x0800);		// D1 = 1?
    	unsigned short c = (Gray & 0x0007);							
    	if((c != 0) && (c != 5) && (c != 7) && !D1)	// Valeurs interdites de C + D1 doit toujours être 0
    	{
                    // On obtient alors DABC
    		tab[j] = Gray & 0x07FF;
    		if(j<1280)
    			j++;
    		else 
    			break;
    	}
    	i++;
    }
     
    // Inversion des poids des bits 1 et 4 de chaque digit
    for(unsigned int k=0; k<1280;k++)
    {
    	bool C4 = tab[k] & 0x0001; 
    	bool C1 = tab[k] & 0x0004;
    	if(C4)
    		tab[k] |= 0x0004;
    	else
    		tab[k] &= 0x0FFB;
    	if(C1)
    		tab[k] |= 0x0001;
    	else
    		tab[k] &= 0x0FFE;
     
    	bool B4 = tab[k] & 0x0008; 
    	bool B1 = tab[k] & 0x0020;
    	if(B4)
    		tab[k] |= 0x0020;
    	else
    		tab[k] &= 0x0FDF;
    	if(B1)
    		tab[k] |= 0x0008;
    	else
    		tab[k] &= 0x0FF7;
     
    	bool A4 = tab[k] & 0x0040; 
    	bool A1 = tab[k] & 0x0100;
    	if(A4)
    		tab[k] |= 0x0100;
    	else
    		tab[k] &= 0x0EFF;
    	if(A1)
    		tab[k] |= 0x0040;
    	else
    		tab[k] &= 0x0FBF;
     
    	// Rappel : D1 doit être 0
    	bool D4 = tab[k] & 0x0200;
    	if(D4)
    		tab[k] |= 0x0800;
    	else
    		tab[k] &= 0x07FF;
     
    	tab[k] &= 0x0DFF;
     
    }
     
    // Association de l'altitude au code correspondant
    // Note : tPair est une paire de deux paires de int pour les digits (A,B) et (C,D) du code d'altitude
    std::map<int,tPair> mapCode; 
    int altitude = -1200;				// -1200 est la première valeur d'altitude, puis évolue de 100 en 100
    for(unsigned int p=0; p<1280;p++)
    {
    	int A = (tab[p] & 0x01C0) >> 6;
    	int B = (tab[p] & 0x0038) >> 3;
    	int C = (tab[p] & 0x0007);
    	int D = (tab[p] & 0x0E00) >> 9;
     
    	mapCode.insert(std::make_pair(altitude,std::make_pair(std::make_pair(A,B),std::make_pair(C,D))));
    	altitude += 100;
    }
    N'étant pas une star du C++, je cherche à optimiser ce bout de code. Donc n'hésitez pas à vous déchaîner si vous voyez des choses qui vous choquent carrément ou qui pourraient être améliorées.
    Je suis toute ouïe, en vous remerciant d'avance

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Pourquoi est ce que tu cherches à optimiser ton code ?
    * Parce qu'il n'est pas assez rapide ?
    * Parce qu'il n'est pas assez concis ?

    Si ton problème est uniquement un problème de concision, je ne pense pas qu'il faille y toucher car tu risque de le rendre incompréhensible.

    Dans l'état actuel, il est parfaitement lisible (même si je ne comprends pas ce que tu y fais car ce sont des données que je ne comprends pas pas)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut.
    Pourquoi utiliser une map??? un vector sera plus rapide
    pour faire une pair de pair?? une structure sera sûrement plus simple à gérer

  4. #4
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par ram_0000
    Pourquoi est ce que tu cherches à optimiser ton code ?
    * Parce qu'il n'est pas assez rapide ?
    * Parce qu'il n'est pas assez concis ?
    J'ai fait ça en un jet un peu à la va-vite. Je n'ai pas de problèmes de rapidité, c'est juste que je pense qu'il doit y avoir moyen de ne pas perdre de temps inutile sur certaines actions (comme les boucles par exemple), mais je vois pas trop comment m'y prendre.
    Citation Envoyé par Mongaulois Voir le message
    Pourquoi utiliser une map??? un vector sera plus rapide
    pour faire une pair de pair?? une structure sera sûrement plus simple à gérer
    J'utilise une map pour accéder directement aux valeurs A, B, C et D en rentrant l'altitude en paramètre. Si j'utilise un vecteur, je perds cet accès direct non?
    Mais plutôt qu'une paire de paires pour stocker A, B, C et D, je suis d'accord, une structure devrait mieux faire l'affaire. Je vais faire ça.
    d'ores et déjà pour ces commentaires!

  5. #5
    Membre expérimenté Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Par défaut
    Le truc atroce au milieu avec des |= et des &= doit etre possible en genre 3 lignes avec un temporaire, des masques et des decalages.

    J'irai jeter un coup d'oeil ce soir, si j'ai le temps.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par spoutspout Voir le message
    J'utilise une map pour accéder directement aux valeurs A, B, C et D en rentrant l'altitude en paramètre. Si j'utilise un vecteur, je perds cet accès direct non?
    Non et rechercher l'altitude la plus proche est coûteuse.
    vu que tu as un min et un pas, un vector est plus adapter.
    en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    gray convertAltitudeToGray(float altitude);
    {
    int id =(altitude - min)/pas +.5;
    return vect[id];
    }

  7. #7
    Membre expérimenté Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Par défaut
    Ok, j'avais tort.

    4 lignes, pas 3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    unsigned short l_temp = tab[k] & 0x0492;
    l_temp |= ( tab[k] & 0x0249 ) << 2;
    l_temp |= ( tab[k] & 0x0124 ) >> 2;
    tab[k] = l_temp;

  8. #8
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Hey!! C'est pas du tout mal vos idées! C'est exactement le genre de simplifications que je recherchais.
    Merci à Mongaulois pour le stockage et merci à Kujara pour les masques

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Optimisation de mon code ActionScript
    Par amnesias dans le forum Flash
    Réponses: 9
    Dernier message: 01/04/2007, 22h04
  2. Optimisation d'un code !
    Par leserapheen dans le forum Pascal
    Réponses: 20
    Dernier message: 09/03/2007, 14h00
  3. Optimiser un calcul avec parcours de recordset
    Par hugo69 dans le forum Access
    Réponses: 28
    Dernier message: 12/06/2006, 10h37
  4. [MMX] Optimisation d'un code C++ -> plus lent
    Par Laurent Gomila dans le forum x86 32-bits / 64-bits
    Réponses: 12
    Dernier message: 17/05/2006, 18h47
  5. [Optimisation][Fonction]calcul du nombre de jours ...
    Par m-mas dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 26/10/2005, 14h39

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