IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Langage
        Faut-il apprendre le C avant le C++ ?
        A quoi sert l'opérateur '?:' ? Comment s'en servir ?
        Qu'est ce que NULL ?
        Quelle est la différence entre delete et delete[]
        Pourquoi la syntaxe TYPE ptr** = new TYPE*[taille*sizeof(TYPE)] est-elle erronée ?
        Que signifie __fastcall ?
        Quel est l'équivalent du Assigned(OnEvent) de Delphi avec C++Builder ?
        Comment résoudre l'erreur Windows : 'violation d'accès à l'adresse XXXXXXXX'
4.1. Types de données (23)
                Quand et comment utiliser les énumérations ?
        4.1.1. Nombres (8)
                        Comment convertir un entier (int) en chaîne (AnsiString) ?
                        Comment changer le caractère décimal par défaut ?
                        Comment utiliser des grands nombres ?
                        Comment obtenir un entier à partir d'un réel ?
                        Comment formater l'affichage d'un réel ?
                        Comment arrondir un réel ?
                        Comment obtenir la valeur décimale d'un entier à partir d'une représentation hexadécimale ?
                        Comment afficher un nombre / hexadecimal en 'chaîne de bits'
        4.1.2. Chaînes de caractères (14)
                        Comment insérer des guillemets dans une chaîne ?
                        Comment faire pour convertir une chaîne en majuscules ?
                        Comment faire pour convertir une chaîne en minuscules ?
                        Comment convertir une chaîne AnsiString en une chaîne C, tableau de caractères à zéro terminal ?
                        Comment transformer une chaîne DOS en chaîne Windows ?
                        Comment convertir une chaîne (AnsiString) en entier (int) ?
                        Comment charger le contenu d'un fichier texte ?
                        Comment obtenir la représentation hexadécimale d'une AnsiString ?
                        Comment obtenir une AnsiString à partir de sa représentation hexadécimale ?
                        Comment connaître la longueur d'une chaîne de caractères ?
                        Comment accéder à un caractère d'une chaîne en connaissant sa position ?
                        Comment déterminer la position d'une occurrence à l'intérieur d'une chaîne ?
                        Comment remplacer une occurrence dans une chaîne par une autre valeur ?
                        Comment faire un switch avec des AnsiString ?
4.2. Assembleur (4)
                Est-il intéressant pour les performances d'écrire des parties de programme en assembleur ?
                Comment écrire des parties d'un programme en assembleur ?
                Pourquoi obtiens-je le message 'Redémarrage de la compilation en utilisant l'assembleur' ?
                Quelle est la différence entre asm, _asm et __asm ?
4.3. Compilation et édition de liens (11)
                Comment créer un exécutable indépendant ?
                Comment réduire la taille d'un exécutable ?
                Quels fichiers peut-on déployer avec une application créée dans C++Builder ?
                Comment résoudre les erreurs de type 'paquets d'importation manquant' ?
                Comment faire pour masquer quelques messages d'avertissement lors de la compilation ?
                Comment effectuer une compilation en ligne de commande avec le compilateur de C++Builder ?
        4.3.1. Comment résoudre l'erreur... (5)
                        [Lieur Erreur] Unresolved external 'UneFonction()' referenced from XXX.OBJ ?
                        [Lieur Erreur] Unresolved external '__fastcall TForm1::UnGestionnaireDEvenement(...)' referenced from XXX.OBJ ?
                        [Lieur Erreur fatale] Fatal: Could not open XXX.exe (program still running?) ?
                        [Lieur Erreur] Unresolved external '__fastcall TXXX::MaMethode(...)' referenced from XXX.OBJ ?
                        [Lieur Erreur fatale] Fatal : Unable to open file 'XXX.LIB' ou 'XXX.BPI' ?



Faut-il apprendre le C avant le C++ ?
Créé le 01/09/2004[haut]
auteur : Geronimo
C'est une question beaucoup débattue. Voici ce que dit Bjarne Stroustrup, le créateur du C++, dans son livre Le Langage C++ :

"La connaissance du C n'est pas un préalable à l'apprentissage du C++. La programmation en C encourage de nombreuses techniques et astuces qui deviennent inutiles en C++, du fait des caractéristiques du langage.
[...]
Mieux vous connaîtrez le langage C, plus il vous semblera difficile d'éviter de faire du C++ dans un style emprunté au C ; si vous tombez dans le piège, vous perdrez au passage les avantages que le C++ aurait pu vous apporter."

lien : fr Acheter le livre de Bjarne Stroustrup

A quoi sert l'opérateur "?:" ? Comment s'en servir ?
Créé le 01/09/2004[haut]
auteur : Geronimo
L'opérateur ? : retourne une valeur en fonction d'une condition. Il se présente selon la structure suivante : condition?expression1: expression2expression1 est retourné si condition est vraie et expression2 si condition s'avère être fausse. Cette syntaxe concise est très pratique, et permet d'éviter des blocs conditionnels if lourds :

int c;
//...
if (a < b)
      c += a;
else
      c += b;
Ce code peut être remplacé par le suivant :

int c;
c += a < b ? a : b;
On voit qu'on évite des lignes de code inutiles et que la lisibilité n'en est pas amoindrie, à condition toutefois de réserver cette syntaxe aux tests simples. Il peut en effet devenir fastidieux de lire un code construit uniquement autour de cet opérateur (surtout si plusieurs de ceux-ci sont imbriqués). A utiliser à bon escient donc...


Qu'est ce que NULL ?
Créé le 01/09/2004[haut]
auteurs : Geronimo, Greybird
NULL est une rémanence du C. NULL est une macro (souvent #define NULL (void*)0 ou #define NULL 0) utilisée pour le pointeur 0 (pointeur qui ne fait référence à aucun objet).

Les macros ne permettent pas un contrôle de type efficace, bien au contraire. Bjarne Stroustrup, créateur du C++, qualifie NULL d'horrible. Utilisez donc 0 en C++ plutôt que NULL. Si vous souhaitez utiliser NULL, il est conseillé de le définir par :

const int NULL = 0;
A noter que dans C++ Builder, NULL est défini ainsi :

#define NULL 0
La seule différence avec la solution préconisée est que la macro peut-être redéfinie dans le code. Cela générera néanmoins un avertissement. Vous pouvez donc utiliser NULL dans C++ Builder sans arrière-pensées.

lien : fr Acheter le livre de Bjarne Stroustrup

Quelle est la différence entre delete et delete[]
Créé le 01/09/2004[haut]
auteur : Geronimo
Si jamais vous avez alloué un tableau de pointeurs avec new[], utilisez alors delete[] pour libérer la mémoire utilisée par ce tableau. L'utilisation du simple delete ne libérerait pas la mémoire correctement. Dans cet exemple, nous supposons que nous disposons d'une classe TEtoile. On cherche a créer un tableau de X étoiles.

class TForm1 : public TForm
{
    //...
    public:
    TEtoile **Etoiles;
    void ConstruitEtoiles(const int nbetoiles);
    void LibereEtoiles();
    //...
};

// Fonction à appeler pour construire nbetoiles TEtoile
void ConstruitEtoiles(const int nbetoiles)
{
    Etoiles=new Etoile*[nbetoiles];
    for (int i=0; i < nbetoiles; i++)
        Etoiles[i]=new Etoile;
}

// Fonction à appeler pour supprimer toutes les étoiles
void LibereEtoiles()
{
    for (int i=0; i < nbetoiles; i++)
        delete Etoiles[i];
    delete[] Etoiles;
}
Cet exemple permet de créer un tableau de nbetoiles pointeurs sur des TEtoile. L'instruction Etoiles = new Etoile*[nbetoiles]; permet de construire le tableau de pointeurs. Il faut ensuite allouer la mémoire nécessaire à chaque TEtoile, ce que fait la boucle for. La méthode LibereEtoiles fait la démarche inverse : elle libère tous les TEtoile, puis la mémoire utilisée par le tableau à l'aide de delete[].


Pourquoi la syntaxe TYPE ptr** = new TYPE*[taille*sizeof(TYPE)] est-elle erronée ?
Créé le 01/09/2004[haut]
auteur : Geronimo
L'opérateur new du C++ est beaucoup plus performant que l'instruction malloc du C. Lorsque vous utilisez cette syntaxe :

TYPE ptr** = new TYPE*[taille*sizeof(TYPE)]; // <-- FAUX
Par exemple,

// Pour constuire dynamiquement un tableau de 100 entiers
int ptr** = new int*[100*sizeof(int)]; // <-- FAUX
vous construisez non pas un tableau de 100 "lignes", mais un tableau de 100 lignes multipliées par la taille d'un entier. En fait, l'opérateur new connaît la taille des éléments du tableau grâce au type du constructeur :

TYPE ptr** = new TYPE*[taille]; // <-- CORRECT
Ici, c'est le TYPE suivant le new qui détermine la taille des éléments du tableau. La taille détermine le nombre d'éléments du tableau.

Bien sûr, n'oubliez pas de faire un delete[] pour libérer le tableau ensuite.

lien : faq Quelle est la différence entre delete et delete[]

Que signifie __fastcall ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Si le nom d'une méthode est précédé de __fastcall, cela signifie que les trois premiers paramètres de la méthode seront placés dans des registres du processeurs (eax, edx et ecx), si leur taille le permet. Cela permet d'accélérer le traitement de certaines méthodes. Evitez de l'utiliser pour des méthodes récursives car les registres devraient être vidés à chaque nouvel appel de la méthode, et donc cette directive perdrait de son intérêt. Selon l'aide, "toutes les méthodes membres d'une classe fiche doivent utiliser la convention __fastcall."


Quel est l'équivalent du Assigned(OnEvent) de Delphi avec C++Builder ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Avec Delphi, pour tester si un gestionnaire d'évènements est assigné, on peut utiliser la syntaxe suivante :

If (Assigned(OnEvent)) Then
    OnEvent(Self);
Avec C++Builder, la syntaxe équivalente est la suivante :

if (Objet->OnEvent != NULL)
      Objet->OnEvent();

Comment résoudre l'erreur Windows : "violation d'accès à l'adresse XXXXXXXX"
Créé le 01/09/2004[haut]
auteur : Geronimo
Qui n'a jamais rencontré cette erreur ? Elle signifie que vous tentez d'accéder à de la mémoire sur laquelle vous n'avez pas de droits.

Le cas classique est la libération de mémoire déjà libérée.

  TForm1 *Form  = new TForm1(this);
  delete Form;
  delete Form;
Pour éviter cette erreur, assignez NULL à vos pointeurs dès leur déclaration, et après chaque delete. Ainsi, il n'y aura aucun risque, car delete NULL ne fait rien.

Cette erreur peut aussi arriver si un new échoue. Là encore, l'affectation de NULL résout le problème.

  TForm1 *Form = NULL;
  Form = new TForm1(this);
  // Si l'allocation avec new échoue, il n'y aura aucun problème  
  delete Form;
Enfin, cette erreur peut arriver si vous essayez d'accéder à une zone mémoire non allouée. Le cas typique est celui de la déclaration du pointeur sans new :

  TEdit *Edit;
  Edit->Parent = this; // Erreur : aucun appel à l'opérateur new n'a été fait !
On voit ici que l'attribution de NULL aux pointeurs permet de limiter les risques, mais cela ne doit pas être une solution à vos problèmes : il faut chercher pourquoi le pointeur est déréférencé plusieurs fois et l'éviter le plus possible, il faut chercher pourquoi la création d'un objet échoue, et enfin, il faut veiller à bien allouer la mémoire nécessaire avant d'utiliser un objet.



Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.