AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 Banque d'exemples C++

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Banque d'exemples C++   Lun 30 Juil 2012 - 22:41

Bonjour.

GM c'est bien beau mais il ne faut pas avoir peur de se lancer dans des langages plus complexes et puissants.
Je crée donc ce sujet pour y déposer une banque d'exemple C++, comme j'avais fait pour GM avec GMscr.
Il est recommandé d'avoir lu quelques cours de C/C++ avant, sous peine d'avoir un peu de mal a tout suivre.

http://www.host-a.net/u/onilink_/CppScr.7z
(révision 2)

Contient a ce jour:

Chapitre 1 (en console)
 ex1.cpp : code de base
 ex2.cpp : brève présentation d'iostream
 ex3.cpp : variables
 ex4.cpp : variables en mémoire
 ex5.cpp : pointeurs
 ex6.cpp : tableaux
 ex7.cpp : fonctions
 ex8.cpp : surcharge des fonctions

Divers tris:
Code:
#include <cstdio>
#include <cstdlib>
#include <ctime>

int COUNT;
#define foreach  for(int i=0; i<COUNT; i++)

void remplisAlea(int *tab)
{
    foreach
        tab[i] = (rand()%200)-100;
}

void copyTab(int *t1, int *t2)
{
    foreach
        t1[i] = t2[i];
}

void printTab(int *t)
{
    foreach
        printf("%d, ", t[i]);
    printf("\n");
}

void swap(int &x, int &y) {
    int t=x;
    x=y; y=t;
}

// O(n²)
void triabulles(int *T)
{
    bool change;
    do
    {
        change = false;
        for(int i=1; i<COUNT; i++)
        {
            if(T[i] < T[i-1]) {
                swap(T[i], T[i-1]);
                change = true;
            }
        }
    } while (change);
}

// O(n²)
void triabullesOpti(int *T)
{
    int max = COUNT;
    while(max > 0)
    {
        int temp = 0;
        for(int i=1; i<max; i++)
        {
            if(T[i] < T[i-1]) {
                swap(T[i], T[i-1]);
                temp = i+1;
            }
        }
        max = temp;
    }
}

// O(n²)
void triCocktail(int *T)
{
    bool change;
    bool inverse = true;
   
    do
    {
        inverse = !inverse;
        change = false;
       
        if(inverse)
        {
            for(int i=COUNT-1; i>1; i--)
            {
                if(T[i] < T[i-1]) {
                    swap(T[i], T[i-1]);
                    change = true;
                }
            }
        }
        else
        {
            for(int i=1; i<COUNT; i++)
            {
                if(T[i] < T[i-1]) {
                    swap(T[i], T[i-1]);
                    change = true;
                }
            }
        }
    } while (change);
}

// O(n²)
void triCocktailOpti(int *T)
{
    int min=1, max=COUNT;
    bool inverse = true;
   
    while(max > 0 && min < COUNT)
    {
        inverse = !inverse;
       
        if(inverse)
        {
            int temp = COUNT;
            for(int i=max-1; i>min; i--)
            {
                if(T[i] < T[i-1]) {
                    swap(T[i], T[i-1]);
                    temp = i-1;
                }
            }
            min = temp;
        }
        else
        {
            int temp = 0;
            for(int i=min; i<max; i++)
            {
                if(T[i] < T[i-1]) {
                    swap(T[i], T[i-1]);
                    temp = i+1;
                }
            }
            max = temp;
        }
    }
}

// O(n²)
void triInsertion(int *T)
{
    for(int i=1; i<COUNT; i++)
    {
        int x = T[i], j = i;
        while(j>0 && T[j-1]>x)
        {
            T[j] = T[j-1];
            j--;
        }
        T[j] = x;
    }
}

// O(n log(n))
void triapeigne(int *T)
{
    int intervalle = COUNT;
    bool change = false;
   
    while(intervalle > 1 || change)
    {
        intervalle = int(intervalle / 1.3f);
        if(intervalle < 1)
            intervalle = 1;
       
        change = false;
        int i=0;
        while(i < COUNT - intervalle)
        {
            if(T[i] > T[i + intervalle]) {
                swap(T[i], T[i + intervalle]);
                change = true;
            }
            i++;
        }
    }
}

void tamiser(int *T, int noeud, int n)
{
    int k = noeud, j = 2*k;
    while(j <= n)
    {
        if(j < n && T[j] < T[j+1])
            j++;
           
        if(T[k] < T[j])
        {
            swap(T[k], T[j]);
            k = j;
            j = 2*k;
        }
        else
            break;
    }
}
// O(n log(n))
void triParTas(int *T)
{
    for(int i = COUNT / 2; i >= 0; i--)
        tamiser(T, i, COUNT-1);
       
    for(int i = COUNT-1; i >= 1; i--)
    {
        swap(T[i], T[0]);
        tamiser(T, 0, i-1);
    }
}

// O(n log(n))
void triRapide(int *T, int deb, int fin)
{
    int gauche = deb-1;
    int droite = fin+1;
    int pivot = T[deb];
   
    if(deb < fin)
    {
        for(;;)
        {
            do droite--; while(T[droite] > pivot);
            do gauche++; while(T[gauche] < pivot);
           
            if(gauche < droite)
                swap(T[gauche], T[droite]);
            else
                break;
        }
        triRapide(T, deb, droite);
        triRapide(T, droite+1, fin);
    }
}
void triRapide(int *T)
{
    triRapide(T, 0, COUNT-1);
}
   
void fusion(int *T, int *A, int *B, int deb, int mil, int fin)
{
    for(int i=0; i<=mil-deb; i++)
        A[i] = T[deb+i];
    for(int i=0; i<=fin-mil-1; i++)
        B[i] = T[mil+1+i];
   
    int iA=0, iB=0, iT=deb;
    while(iA<=mil-deb && iB<=fin-mil-1)
    {
        if(A[iA] < B[iB])
            T[iT++] = A[iA++];
        else
            T[iT++] = B[iB++];
    }
    while(iA<=mil-deb)
        T[iT++] = A[iA++];
    while(iB<=fin-mil-1)
        T[iT++] = B[iB++];
}
// O(n log(n))
void triFusion(int *T, int *A, int *B, int deb, int fin)
{
    if(deb < fin)
    {
        int mil = (deb + fin)/2;
        triFusion(T, A, B, deb, mil);
        triFusion(T, A, B, mil+1, fin);
        fusion(T, A, B, deb, mil, fin);
    }
}
void triFusion(int *T)
{
    int *A = new int[COUNT/2+1];
    int *B = new int[COUNT/2+1];
    triFusion(T, A, B, 0, COUNT-1);
    delete[] A;
    delete[] B;
}


int compare(const void * x, const void * y) {
    return ( *(int*)x - *(int*)y );
}
void triStd(int *T) {
    qsort(T, COUNT, sizeof(int), compare);
}

void tri(int *T, int *tab, void (*f) (int *))
{
    f(T);
    printTab(T);
    copyTab(T, tab);
}

void perfs(int *T, int *tab, const char *str, void (*f) (int *))
{
    clock_t start = clock();
    f(T);
    printf("%s: %f\n", str, ((float)clock() - start) / CLOCKS_PER_SEC);
    copyTab(T, tab);
}

int main()
{
    srand(time(NULL));
   
    COUNT = 15;
    int *tab = new int[COUNT];
    int *T  = new int[COUNT];
    remplisAlea(tab);
    copyTab(T, tab);
   
    printTab(tab);
    tri(T, tab, triabulles);
    tri(T, tab, triabullesOpti);
    tri(T, tab, triapeigne);
    tri(T, tab, triInsertion);
    tri(T, tab, triParTas);
    tri(T, tab, triRapide);
    tri(T, tab, triStd);
    tri(T, tab, triFusion);
   
    qsort(T, COUNT, sizeof(int), compare);
    printTab(T);
    copyTab(T, tab);
   
    delete[] tab;
    delete[] T;
   
   
    // Performances
    COUNT = 10000;
    tab = new int[COUNT];
    T  = new int[COUNT];
    remplisAlea(tab);
    copyTab(T, tab);
   
    printf("\nTris sur %d elements.\n", COUNT);
    perfs(T, tab, "Tri a Bulles", triabulles);
    perfs(T, tab, "Tri a Bulles Opti", triabullesOpti);
    perfs(T, tab, "Tri Cocktail", triCocktail);
    perfs(T, tab, "Tri Cocktail Opti", triCocktailOpti);
    perfs(T, tab, "Tri a Peigne", triapeigne);
   
    delete[] tab;
    delete[] T;
   
   
    COUNT *= 1000;
    tab = new int[COUNT];
    T  = new int[COUNT];
    remplisAlea(tab);
    copyTab(T, tab);
   
    printf("\nTris sur %d elements.\n", COUNT);
    perfs(T, tab, "Tri a Peigne", triapeigne);
    perfs(T, tab, "Tri par Tas", triParTas);
    perfs(T, tab, "Tri Rapide", triRapide);
    perfs(T, tab, "Tri Rapide libstd", triStd);
    perfs(T, tab, "Tri Fusion", triFusion);
   
    delete[] tab;
    delete[] T;

    return 0;
}

Et bien d'autres exemples a venir Smile

N'hésitez pas a remettre en cause l'ordre des exemples, et a m'indiquer si j'ai fait un oubli, ou si j'explique mal quelque chose.
De plus vous pouvez poster des questions relative au langage C++ dans ce topic.

_________________
                 


Dernière édition par onilink_ le Mer 9 Jan 2013 - 15:22, édité 3 fois
Revenir en haut Aller en bas
Craki
Utilisateur confirmé: Rang ****
avatar

Messages : 1469
Localisation : Dans l’univers de métamatière

MessageSujet: Re: Banque d'exemples C++   Mar 31 Juil 2012 - 0:58

Je trouve le passage sur iostream assez incomplet. Rien sur les input ni sur leur sécurisation. Oups!

_________________
Revenir en haut Aller en bas
D-z
Utilisateur confirmé: Rang *****
avatar

Messages : 1609
Localisation : Montpellier

MessageSujet: Re: Banque d'exemples C++   Mar 31 Juil 2012 - 1:47

Ouh le foutoir +_+

Tu devrais détailler les différents concepts, parce que là même en ayant fait du Java c'est un peu la ramade, alors j'imagine pas quelqu'un qui ne connaisse que GM. En particulier les subtilités des pointeurs et références (à part la syntaxe c'est la même chose non ? ._.), et un petit paragraphe sur les opérateurs de flux, parce que si tu n'as jamais vu ces trucs (ce qui est plus que probable si tu n'as jamais touché au C++), la seule réaction c'est "WTF?"...

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: Banque d'exemples C++   Mar 31 Juil 2012 - 9:34

Bah c'est une espèce de synthèse avec des exemples, donc vaux mieux avoir lu des cours avant.
Mais je vais quand même modifier si ça vous perturbe x)

Dire que j'avais pas envie justement de refaire un cour magistral de C++ Oups!

_________________
                 
Revenir en haut Aller en bas
SPLN
Utilisateur confirmé: Rang ***
avatar

Messages : 588
Localisation : Sur son ordinateur *vous vois* arrêtez de me regarder comme ça
Projet Actuel : En quête de projet(s)!
Mes projets:
SP Lecteur Multimedia (Stand by)
S-Portable Graphics (demo1.8 is out! demo2.0 is planned)
SSB RPG (Stand by)

MessageSujet: Re: Banque d'exemples C++   Mar 31 Juil 2012 - 9:41

Il me semble que sur developpez, il y avait un livre anglais traduit en fr pour comment bien débuter en c++. En tout cas ça m'avait bien aidé =vP. Après ça reste une bonne initiative. Et pourquoi pas dans un avenir proche (ou pas) mettre des exemples des équivalents des fonctions GM : manipulation de fichier, gestion des flux video/audio, online, etc...

_________________
SP Lecteur Multimedia
I am an in the GM Quiz!
Revenir en haut Aller en bas
http://sp-lecteur-multimedia.skyrock.com/
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: Banque d'exemples C++   Mar 31 Juil 2012 - 9:47

SPLN a écrit:
Il me semble que sur developpez, il y avait un livre anglais traduit en fr pour comment bien débuter en c++. En tout cas ça m'avait bien aidé =vP. Après ça reste une bonne initiative. Et pourquoi pas dans un avenir proche (ou pas) mettre des exemples des équivalents des fonctions GM : manipulation de fichier, gestion des flux video/audio, online, etc...

C'était le but oui, mais bon je pensais mettre les concepts de base avant pour ceux qui ont oubliés des trucs x)

Craki a écrit:
Je trouve le passage sur iostream assez incomplet. Rien sur les input ni sur leur sécurisation. Oups!

La par contre c'est problématique, me faut des variables pour ça et j'en parle après ... x)


Edit:
@Deezee
Tu comprend mieux la? T'as une idée de comment faire pour que ce soit moins le bazar? x)

_________________
                 
Revenir en haut Aller en bas
glcraft
Utilisateur confirmé: Rang *****
avatar

Messages : 1698
Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P
Projet Actuel : Jeu de survie avancé
||--------

MessageSujet: Re: Banque d'exemples C++   Mar 31 Juil 2012 - 11:25

en fait, le truc compliqué c'est qu'il faut inclure des librairie tierce pour le fenetrage, le dessin, l'audio. or, dans le cas d'opengl pour le dessin, on a pas toujours la librairie et on ne sait pas toujours comment l'installer
Revenir en haut Aller en bas
http://gameblog49.skyblog.com/
D-z
Utilisateur confirmé: Rang *****
avatar

Messages : 1609
Localisation : Montpellier

MessageSujet: Re: Banque d'exemples C++   Mar 31 Juil 2012 - 12:48

Dat's kewl

En fait si tu vois ça comme une annexe à un quelconque cours, pas de problème, mais ton premier post laissait entendre que cette collection pouvait constituer une transition de GM au C++... Ce qui rendrait blancs pas mal de GMusers o/

Question : en C++, si je veux faire l'équivalent d'une référence Java, je fais :
Code:
class MaClasse {
    MonMembre& refMembre;
}
?

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: Banque d'exemples C++   Mar 31 Juil 2012 - 13:17

Alors bonne question mrgreen2
Ça fait quoi une référence java?

Si c'est comme en C++ et que tu veux avoir une référence comme attribut dans une classe, euh je crois pas que ce soit possible, j'ai toujours vu des pointeurs dans ce cas.


Sinon ouai bah pour les cours y en a déjà plein le net, je vais pas réinventer la roue :p

_________________
                 
Revenir en haut Aller en bas
D-z
Utilisateur confirmé: Rang *****
avatar

Messages : 1609
Localisation : Montpellier

MessageSujet: Re: Banque d'exemples C++   Mar 31 Juil 2012 - 13:37

En Java, tu fais :
Code:
public class MaClasse {
private MaClasseMembre monMembre;
}
et à partir de là tu peux faire pointer monMembre vers n'importe quelle instance de MaClasseMembre. Par exemple, tu peux faire une interface (classe virtuelle) Arme et déclarer un attribut monArme de type Arme pour pouvoir y affecter n'importe quelle instance héritant de Arme.
Quand on fait un print() on voit que monMembre contient une adresse mémoire, donc effectivement ce serait logiquement un pointeur.

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
arthuro
Utilisateur confirmé: Rang ****
avatar

Messages : 1337
Localisation : Grenoble / Méribel
Projet Actuel : CBNA

MessageSujet: Re: Banque d'exemples C++   Mar 31 Juil 2012 - 13:37

Onilink a écrit:

Si c'est comme en C++ et que tu veux avoir une référence comme attribut dans une classe, euh je crois pas que ce soit possible, j'ai toujours vu des pointeurs dans ce cas.

En faite tu peux et c'est bien pratique.
Seulement, il y a un truc à savoir. Il faut toujours qu'une référence soit associé à un objet. La seule manière de la faire c'est d'utiliser une liste d'initialisation dans le créateur/instancieur de l'objet

Ex:

Code:

class MaClasse
{
    public:
    MonMembre& refMembre;
    MaClasse(MonMembre& Obj);
}

MaClasse::MaClasse(MonMembre& Obj) : refMembre(Obj)        // <----- Ici l'initialisation de la référence
{
   
}

_________________

D'autres jeux :
In The Cube
In the cube 2


Dernière édition par arthuro le Mar 31 Juil 2012 - 13:41, édité 1 fois
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: Banque d'exemples C++   Mar 31 Juil 2012 - 13:41

Ah ben oui, pas con :b
Bon a savoir ça happy1

_________________
                 
Revenir en haut Aller en bas
daminetreg
Administrateur
avatar

Messages : 16994
Localisation : Siege du CBNA!
Projet Actuel : Site Web du CBNA, version beta :

MessageSujet: Re: Banque d'exemples C++   Mer 10 Oct 2012 - 21:01

Pour l'équivalent de la référence java, je propose d'utiliser un pointeur, mais the smart one, qui s'assurera que lorsque la référence n'est plus utilisée l'élement pointé sera supprimé. Comme cela se passe en java, les éléments non référencés sont automatiquement supprimés. Un gros avantage sur java cependant, c'est que java a un thread (garbage collector) qui vérifie ce qui n'est pas utilisé et ce qui l'est, avec les smart pointers en c++, c'est simplement un petit compteur qui est décrémenté au fur et à mesure que des objets ne sont plus référencés, qui résulte en leur destruction lorsque le compteur est égal à 0. Cela ne coûte absolument rien en matière de performances.

Ne vous cassez surtout pas les dents en utilisant des pointeurs à l'ancienne, c'est jamais une bonne idée Smile parce que vous oublierez presque toujours de les désallouer.

Comme la dit arthuro en C++ une référence n'équivaut pas à une référence Java : en effet en java une référence peut être null ce qui n'est pas le cas en C++, causant des NullPointerException si on l'utilise dans ce cas, ce qui fait que les pointeurs sont l'équivalent de la référence java.

L'avantage d'utiliser des références c++ à la place de pointeurs est justement de détecter des erreurs pendant la compilation : puisqu'elle ne doit jamais être nulle le compilateur empêche la compilation si la référence n'est pas initialisée.

Mais comme il faut parfois pointer des éléments qui n'existent pas encore, voici un exemple de l'équivalent des références java en C++ à l'aide de smart pointers:

Code:

#include <iostream>

#include <boost/cstdint.hpp>
#include <boost/make_shared.hpp>
#include <boost/typeof/typeof.hpp> // Pour BOOST_AUTO

struct Position {
    Position(int32_t x, int32_t y) : x(x), y(y) {}
    virtual ~Position() {
        std::cout << *this << " est détruit." << std::endl;
    }

    int32_t x;
    int32_t y;

    friend std::ostream& operator<<(std::ostream &os, const Position &pos) {
      os << "Position x,y :" << pos.x << "," << pos.y << " ";
      return os;
    }
};

class Pixel {
    public:
        Pixel() {};
        virtual ~Pixel() {
            std::cout << "Le pixel est détruit" << std::endl;
        };

        void draw() {
            if (m_pos.get() != NULL) { // Etant donné qu'il est possible à que ce soit NULL il faut le vérifier
               
                // Les shared_ptr fonctionnent comme de vrais pointeur avec plus de fonctionnalité:
                // pour le déréférencer et avoir l'objet pointé il suffit de fair *m_pos, et donc le raccourci : -> pour accèder à un membre fonctionne également.
                std::cout << "drawPoint(" << m_pos->x << "," << m_pos->y << ")" << std::endl;
            }
        }

        void pos(boost::shared_ptr<Position> pos) {
            m_pos = pos;
        }

        boost::shared_ptr<Position> pos() const {
          return m_pos;
        }

  private:
      boost::shared_ptr<Position> m_pos;
};

int main(int argc, char **argv) {
 
    {
        BOOST_AUTO(monPixel, boost::make_shared<Pixel>()); // Simplement pour m'évitier d'écrire: boost::shared_ptr<Pixel> monPixel(new Pixel());

        {
            BOOST_AUTO(maPosition, boost::make_shared<Position>(0,0)); // Simplement pour m'évitier d'écrire: boost::shared_ptr<Position> maPosition(new Position(0,0));

            std::cout << "Entrez la position x :" << std::endl;
            std::cin >> maPosition->x;
            std::cout << "Entrez la position y :" << std::endl;
            std::cin >> maPosition->y;


            std::cout << "Une position particulière : " << *maPosition << std::endl;
           
            monPixel->pos(maPosition);
        }

        monPixel->draw();
        // Ici maPosition continue à exister puisque monPixel a un shared_ptr vers ce dernier.
    }

    // Ici monPixel est supprimé puisque personne ne le référence plus, comme c'est le cas en java avec le garbage collector, sauf qu'avec les smart ptr c'est du reference counting, ça veut dire qu'un objet ne sera pas gardé un certain temps avant d'être jeté de la mémoire, et qu'il n'y a pas de thread supplémentaire qui gère la mémoire, c'est juste beau : quand le compte d'utilisateur du shared_ptr est à 0 c'est viré de la mémoire.

    // En conséquence l'objet référencé par monPixel, càd maPosition, est également supprimé de la mémoire, étant donné que plus personne n'a de référence.

  return 0;
}

Et comme on peut compiler du C++ vers du javascript, voilà le résultat de l'exécution: http://www.lecbna.org/sys_lecbna/examples/referencesLikeInJava.html (4mb environ pour le js généré)

_________________
Mon CV : fr - de - en
Le CBNA Tous Ensemble! Réalisons!
Revenir en haut Aller en bas
http://lecbna.org/
daminetreg
Administrateur
avatar

Messages : 16994
Localisation : Siege du CBNA!
Projet Actuel : Site Web du CBNA, version beta :

MessageSujet: Re: Banque d'exemples C++   Mer 17 Oct 2012 - 13:08

Je double post, car dans le post précédent je répondais spécifiquement à quelqu'un et là je souhaite réagir aux exemples C++.

Pour l'explication sur les différent types de nombre entier et flottants, je pense qu'il serait intéréssant de présenter les int8_t, uint32_t etc... assurant la taille des int et rendant les programmes portables peu importe l'architecture non ?

_________________
Mon CV : fr - de - en
Le CBNA Tous Ensemble! Réalisons!
Revenir en haut Aller en bas
http://lecbna.org/
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: Banque d'exemples C++   Mer 17 Oct 2012 - 13:30

En effet, je vais l'ajouter dès que je peut :p

_________________
                 
Revenir en haut Aller en bas
daminetreg
Administrateur
avatar

Messages : 16994
Localisation : Siege du CBNA!
Projet Actuel : Site Web du CBNA, version beta :

MessageSujet: Re: Banque d'exemples C++   Mer 17 Oct 2012 - 15:10

Proposition pour l'exo 6, récupérer la taille d'un tableau à l'ancienne en C++ :
Code:

template <typename T, std::size_t N>
std::size_t size(T(&)[N]) { return N; }

Mais à préférer:
Code:


// C++03
boost::array<int, 6> arr;
arr.size();

// C++11
std::array<int,6> arr,
arr.size();

_________________
Mon CV : fr - de - en
Le CBNA Tous Ensemble! Réalisons!
Revenir en haut Aller en bas
http://lecbna.org/
Termite
Utilisateur confirmé: Rang ****
avatar

Messages : 1005
Localisation : Dans ta charpente !
Projet Actuel : RayEngine 5.0

MessageSujet: Re: Banque d'exemples C++   Mer 17 Oct 2012 - 21:24

daminetreg a écrit:
Je double post, car dans le post précédent je répondais spécifiquement à quelqu'un et là je souhaite réagir aux exemples C++.

Pour l'explication sur les différent types de nombre entier et flottants, je pense qu'il serait intéréssant de présenter les int8_t, uint32_t etc... assurant la taille des int et rendant les programmes portables peu importe l'architecture non ?
Justement je me posais des questions par rapport à ça.
Supposé que mon PC est en little endian, si j'écris par exemple la valeur 16 signée sur un int dans un fichier, je me retrouve avec ça :

10 00 00 00

Si je relis (avec un programme compilé sur mon PC) cette valeur alors que le PC est en big endian, je me retrouverais avec 0x00000010 ou avec 0x10000000 ?
Bref, en somme est-ce que les std::ifstream et std::ofstream font la conversion lors de l'écriture/lecture ?

_________________
Because these are not the words of God, the same God that burnt the knowing.
Revenir en haut Aller en bas
Morwenn
Très bonne participation
avatar

Messages : 151
Projet Actuel : Icare

MessageSujet: Re: Banque d'exemples C++   Jeu 18 Oct 2012 - 22:15

Juste pour ajouter une précision quant aux entiers de taille fixe, il ne faut pas oublier qu'ils sont optionnels dans la norme. Si on est sur une architecture où un char fait 9 bits (et ça existe !), alors ces types risquent de ne pas exister. Par contre, tous les types du style int_least8_t ou int_fast8_t sont obligatoires à partir des normes C99/C++11.

_________________

Dur Dabla, pour qui voudrait écouter un brin de metal celtique.
Revenir en haut Aller en bas
Gab666
Modérateur 'Zut'
avatar

Messages : 5339
Localisation : **I move away from the mic to breathe in

MessageSujet: Re: Banque d'exemples C++   Mar 18 Déc 2012 - 18:42

C'est un post-it donc je me permet de raviver le vieux thread vu que ça ne le bumpera pas.

Termite a écrit:
daminetreg a écrit:
Je double post, car dans le post précédent je répondais spécifiquement à quelqu'un et là je souhaite réagir aux exemples C++.

Pour l'explication sur les différent types de nombre entier et flottants, je pense qu'il serait intéréssant de présenter les int8_t, uint32_t etc... assurant la taille des int et rendant les programmes portables peu importe l'architecture non ?
Justement je me posais des questions par rapport à ça.
Supposé que mon PC est en little endian, si j'écris par exemple la valeur 16 signée sur un int dans un fichier, je me retrouve avec ça :

10 00 00 00

Si je relis (avec un programme compilé sur mon PC) cette valeur alors que le PC est en big endian, je me retrouverais avec 0x00000010 ou avec 0x10000000 ?
Bref, en somme est-ce que les std::ifstream et std::ofstream font la conversion lors de l'écriture/lecture ?

Si tu changes d'architecture tu dois recompiler ton programme(sinon il risque de ne pas fonctionner), donc à supposer que la machine A en little endian compile le programme, génère un fichier. Ensuite, la machine B en big endian recompile le programme et le reroule en lisant le fichier généré par la machine A. Alors il va stocker la valeur 0x10000000 et l'utiliser comme si elle était en big endian(ce qui n'est probablement pas le comportement que tu veux). Cependant, si la machine B se génère un fichier et l'utilise, le fichier aura le bon encodage pour la machine.

C'est pour cette raison que dans la plupart des protocoles réseau et dans plusieurs formats de fichiers, on encode les valeurs en big endian et on fait les conversions par la suite.

Pour répondre à la question ifstream et ofstream(comme toutes les fonctions/classes de I/O standard en C ou en C++) ne feront pas de conversion automatiquement et mettrons byte pour byte ce qu'il y a dans le fichier en mémoire.

Si tu veux régler ce problème tu peux wrapper ifstream et ofstream et utiliser des fonctions de conversion dépendantes de l'architecture (voir htonl/htons et ntohl/ntohs) pour ensuite tout encoder en big endian ou little endian(à ton choix).

_________________
PIS MANIAC PREND DES BAINS !
Revenir en haut Aller en bas
http://www.dermanium-online.webou.net/
Contenu sponsorisé




MessageSujet: Re: Banque d'exemples C++   

Revenir en haut Aller en bas
 
Banque d'exemples C++
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Rue de la Banque: «Dialogue amorcé», selon le DAL
» banque solidaire?
» Vent de panique chez les clients de la banque Northern Rock
» La Banque alimentaire 13 (Bouches-du-Rhône) risque la cessation de paiement !!!!
» Collecte 2012 ... Banque Alimentaire des Bouches du Rhône

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Programmation-
Sauter vers: