| | Banque d'exemples C++ | |
|
+6arthuro glcraft SPLN D-z Craki onilink_ 10 participants | Auteur | Message |
---|
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Banque d'exemples C++ Mar 31 Juil 2012 - 0: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 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 - 16:22, édité 3 fois |
| | | Craki Utilisateur confirmé: Rang ****
Messages : 1496 Localisation : Dans l’univers de métamatière
| Sujet: Re: Banque d'exemples C++ Mar 31 Juil 2012 - 2:58 | |
| Je trouve le passage sur iostream assez incomplet. Rien sur les input ni sur leur sécurisation. _________________ |
| | | D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Banque d'exemples C++ Mar 31 Juil 2012 - 3: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.
|
| | | onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Banque d'exemples C++ Mar 31 Juil 2012 - 11: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++ |
| | | SPLN Utilisateur confirmé: Rang ***
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)
| Sujet: Re: Banque d'exemples C++ Mar 31 Juil 2012 - 11: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... |
| | | onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Banque d'exemples C++ Mar 31 Juil 2012 - 11: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.
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) |
| | | glcraft Utilisateur confirmé: Rang *****
Messages : 1698 Localisation : Entre l'Espagne, l'Italie, la Suisse, L'allemagne et le RU :P Projet Actuel : Jeu de survie avancé
||--------
| Sujet: Re: Banque d'exemples C++ Mar 31 Juil 2012 - 13: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
|
| | | D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Banque d'exemples C++ Mar 31 Juil 2012 - 14: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.
|
| | | onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Banque d'exemples C++ Mar 31 Juil 2012 - 15:17 | |
| Alors bonne question Ç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 |
| | | D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Banque d'exemples C++ Mar 31 Juil 2012 - 15: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.
|
| | | arthuro Utilisateur confirmé: Rang ****
Messages : 1483 Localisation : Paris Projet Actuel : Diagon https://arthursonzogni.com/Diagon
| Sujet: Re: Banque d'exemples C++ Mar 31 Juil 2012 - 15: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 { }
Dernière édition par arthuro le Mar 31 Juil 2012 - 15:41, édité 1 fois |
| | | onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Banque d'exemples C++ Mar 31 Juil 2012 - 15:41 | |
| Ah ben oui, pas con :b Bon a savoir ça |
| | | daminetreg Administrateur
Messages : 16998 Localisation : Siege du CBNA! Projet Actuel : Site Web du CBNA, version beta :
| Sujet: Re: Banque d'exemples C++ Mer 10 Oct 2012 - 23: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 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 Tous Ensemble! Réalisons! |
| | | daminetreg Administrateur
Messages : 16998 Localisation : Siege du CBNA! Projet Actuel : Site Web du CBNA, version beta :
| Sujet: Re: Banque d'exemples C++ Mer 17 Oct 2012 - 15: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 Tous Ensemble! Réalisons! |
| | | onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Banque d'exemples C++ Mer 17 Oct 2012 - 15:30 | |
| En effet, je vais l'ajouter dès que je peut :p |
| | | daminetreg Administrateur
Messages : 16998 Localisation : Siege du CBNA! Projet Actuel : Site Web du CBNA, version beta :
| Sujet: Re: Banque d'exemples C++ Mer 17 Oct 2012 - 17: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 Tous Ensemble! Réalisons! |
| | | Termite Utilisateur confirmé: Rang ****
Messages : 1005 Localisation : Dans ta charpente ! Projet Actuel : RayEngine 5.0
| Sujet: Re: Banque d'exemples C++ Mer 17 Oct 2012 - 23: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.
|
| | | Morwenn Très bonne participation
Messages : 151 Projet Actuel : Icare
| Sujet: Re: Banque d'exemples C++ Ven 19 Oct 2012 - 0: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. |
| | | Gab666 Modérateur 'Zut'
Messages : 5340 Localisation : **I move away from the mic to breathe in
| Sujet: Re: Banque d'exemples C++ Mar 18 Déc 2012 - 19: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 !
|
| | | Contenu sponsorisé
| Sujet: Re: Banque d'exemples C++ | |
| |
| | | | Banque d'exemples C++ | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |