150

leur IDE = ?
Sinon, oui, QtCreator est intéressant quand tu utilises Qt.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

151

152

Tiens, j'ai un problème de compilation :
turn 0; }
[box=code]#include <iostream>
using namespace std;

class CVector {

    public:

    int x,y;

    CVector (){};

    CVector (int a, int b)
    {
        x = a;
        y = b;
    }

    CVector operator+ (CVector param)
    {
        CVector temp;
        temp.x = x + param.x;
        temp.y = y + param.y;
        return (temp);
    }

    CVector operator+= (CVector param)
    {
        this->x += param.x;
        this->y += param.y;
        return *this;
    }
};


int main ()
{
    CVector a (3,1);
    CVector b (1,2);
    CVector c = (a += b);
    cout << c.x << "," << c.y;
    re
[/code]
Ca, c'est classique.

Quand je sélectionne "Build Target : Debug" dans C::B, il me sort ça :
-------------- Build: Debug in test ---------------

Linking stage skipped (build target has no object files to link)
Nothing to be done.

Nothing to be done.

Pourquoi ? Ca compile très bien en release confus

153

je dirais que t'as ajouté ton fichier dans la target debug uniquement. Dans l'arbre de gauche, droitclique sur le fichier .cpp et vérifie ses propriétés.
-------------- Clean: Debug in tayst ---------------

Cleaned "tayst - Debug"

-------------- Build: Debug in tayst ---------------

Compiling: main.cpp
Linking console executable: bin\Debug\tayst.exe
Output size is 594.80 KB
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings

-------------- Clean: Release in tayst ---------------

Cleaned "tayst - Release"

-------------- Build: Release in tayst ---------------

Compiling: main.cpp
Linking console executable: bin\Release\tayst.exe
Output size is 273.50 KB
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings

contenu de tayst.cbp
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
	<FileVersion major="1" minor="6" />
	<Project>
		<Option title="tayst" />
		<Option pch_mode="2" />
		<Option compiler="gcc" />
		<Build>
			<Target title="Debug">
				<Option output="bin\Debug\tayst" prefix_auto="1" extension_auto="1" />
				<Option object_output="obj\Debug\" />
				<Option type="1" />
				<Option compiler="gcc" />
				<Compiler>
					<Add option="-g" />
				</Compiler>
			</Target>
			<Target title="Release">
				<Option output="bin\Release\tayst" prefix_auto="1" extension_auto="1" />
				<Option object_output="obj\Release\" />
				<Option type="1" />
				<Option compiler="gcc" />
				<Compiler>
					<Add option="-O2" />
				</Compiler>
				<Linker>
					<Add option="-s" />
				</Linker>
			</Target>
		</Build>
		<Compiler>
			<Add option="-Wall" />
			<Add option="-fexceptions" />
		</Compiler>
		<Unit filename="main.cpp" />
		<Extensions>
			<code_completion />
			<envvars />
			<debugger />
			<lib_finder disable_auto="1" />
		</Extensions>
	</Project>
</CodeBlocks_project_file>


edit: bingo, message quand y'a rien à linker:
-------------- Clean: Release in tayst ---------------

Cleaned "tayst - Release"

-------------- Build: Release in tayst ---------------

Linking stage skipped (build target has no object files to link)
Nothing to be done.

154

Bien vu, merci. happy

155

int main ()
{
  try
  {
   throw 20;
  }
  catch (int e)
  {
    cout << "An exception occurred. "
    cout << "Exception Nr. " << e << endl;
  }
}

Mais qu'est-ce que c'est que cette syntaxe de merde, c'est pire que le C c'est pas permis, bonsoir pour tout retenir fou

J'ai presque fini de lire les tutos commencés, ya une syntaxe particulière à retenir pour chaque chose qu'on veut faire, sans logique apparente. Ca doit pas être évident de lire des sources au début sick

156

Bof, pour le try la syntaxe me paraît tout à fait normale. Qu’est-ce qui te déplaît ?
Sinon, oui, le C++ est un langage très complexe, il y a des tas et des tas de subtilités, c’est aussi ça qui fait qu’il est très puissant, mais du coup c’est un casse-tête pour tout retenir.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

157

Ben le catch est en fait un fonction en plein milieu d'une autre, ils auraient pas pu prévoir un truc plus usuel ?
Où est-ce qu'il y a un autre exemple syntaxique qui m'oblige à écrire une fonction en plein milieu d'une autre sans que je puisse m'y prendre autrement ?

158

Une fonction ?
Non c'est un bloc comme un autre. Les fonctions imbriquées sont d'ailleurs (et hélas sad ) interdites en C++.
A chaque fois que tu met des accolades { } ça définit un niveau d'imbrication, mais pas nécessairement une fonction.

Quand tu éxécutes ton code, si une exception se produit, qu'elle peut être interceptée par ton code, dans ta fonction, alors elle est interceptée, par ton code, dans ta fonction, c'est à dire par la structure try-catch [dans ton code, dans ta fonction], qui a permis d'intercepter cette exception particulière.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

159

Pour le coup je pense que tu n'as pas bien compris l'intérêt Folco ^^
Le try catch ça te permet d'exécuter du code sans te soucier des cas exceptionnels (erreurs). Tu exécutes ton code normalement et s'il y a une erreur, il est interrompu, et le code du catch correspondant est exécuté.
C'est plus simple que checker toutes les valeurs de retour des différentes fonctions (fopen par exemple) pour savoir si tu peux continuer, ou faire un setjmp en C tongue
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

160

GoldenCrystal (./158) :
Une fonction ?

  catch (int e)
  {
    cout << "An exception occurred. "
    cout << "Exception Nr. " << e << endl;
  }
}

Ben ça, ça ressemble à une fonction qui peut être écrite en-dehors de toute autre, non ?


Brunni -> Ah mais je n'en nie absolument pas l'intérêt, je dis simplement que la syntaxe me plait pas, c'est tout. smile
Et oui je fais des setjmp pour les erreurs en C, ça m'obilge à avoir une variable globale cry

161

folco, que penses tu de:

if(condition) {
} else {
}

? grin

162

Folco (./160) :
GoldenCrystal (./158) :
Une fonction ?

  catch (int e)
  {
    cout << "An exception occurred. "
    cout << "Exception Nr. " << e << endl;
  }
}
Ben ça, ça ressemble à une fonction[/pre]
Si jamais c'est le paramètre entre parenthèses qui te fait croire à une fonction, ça n'a pas grand chose à voir: (c'est pas non plus 100% différent fonctionnellement mais ne t'attarde pas là dessus ! tongue)
1. Il n'y en au plus qu'un seul.
2. Ça sert de filtre pour le type d'exception: tu peux avoir plusieurs catch pour un [seul] try, qui interceptent des types différents.
qui peut être écrite en-dehors de toute autre, non ?
Le bloc catch que tu as écrit n'est il pas justement lié au bloc try (que tu ne sembles pas considérer comme une fonction ? trifus) que tu as écrit au paravant ?
Comment pourrais tu honnêtement les séparer ?
try // Je sais que quelque chose de mauvais pourrait se passer là
{
    Approcher(); // J'essaye de m'approcher d'un truc
}
catch (ErreurOdeur& e) // Si jamais ça pue
{
    Reculer(); // Je recule avant que mon nez ne souffre trop
    cout << "Ça pue le " << e.odeur << endl;
}
catch (TropPres& e) // Si jamais je suis déjà trop près
{
    cout << "Distance " << e.distance << " m" << endl;
}
Tu vois bien que c'est complètement lié là ? tongue

Sinon justement, le langage a été fait pour éviter d'avoir syntaxes différentes, c'est pour ça que tout les éléments syntaxiques se ressemblent les uns les autres. Si tu regardes bien il n'y a pas vraiment tant de sortes de structures différentes que ça.
(Et c'est personnel, mais j'ai jamais pu blairer la boucle for qui elle est vraiment bâtarde par rapport au reste, mais bon...)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

163

Oui, merci bien à tous les deux pour cet angle de vue, j'avais pas abordé ça comme ça. grin

164

Ah merde, je viens de tester un truc :

typedef int MonInt;

et une classe :

class Maclasse
{
...
Maclasse(MonInt) { ...}
...
};

Maclasse(MonInt) est donc un constructeur surchargé, mais il acceptera qu'on lui refile un MonInt ou un int. J'aurais préféré qu'il n'accepte qu'un MonInt. Pas grave.



ps :
Pensez-vous que ce soit une bonne habitude d'utiliser une syntaxe de type fonctionnelle genre :
b = (int) a;
au lieu de
b = int (a);
?

165

moi je déteste la seconde, je veux pas l'utiliser et je préfère les casts

le second truc est chelou, en fait ça veut dire que tu appelles le constructeur de int en lui filant le paramètre a (IIUC) alors que le premier est un bon vieux cast comme en C.

166

Pareil ^^
D'ailleurs le constructeur de int n'accepte-t-il pas que des int ? confus

Pour le typedef, c'est le comportement normal, les valeurs sont compatibles entre elles. Sinon il faudrait créer ton propre type (donc classe/structure/union) mais il faut que ce soit vraiment justifié (i.e. que tu apportes vraiment quelque chose en faisant ça, genre une méthode ou des opérateurs surchargés particuliers, etc...)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

167

moi je te conseille au contraire de ne jamais utiliser les casts type c "(int)" et toujours les casts c++, c'est à dire les casts qui ressemblent à des constructeurs "int(c)", ou les casts c++ "static_cast<MaClasseA*>(pMonObjetB)"
le cast C est merdique niveau parenthèses et priorités donc pour les types de bases je l'utilise jamais et pour les classes, il est trop général et il vaut mieux utiliser les casts dédiés prévus par le c++ "static_cast", "const_cast", etc.
avatar

168

encore faut il comprendre leur fonctionnement et leurs différences, parce qu'entre

-static_cast
-reinterpret_cast
-dynamic_cast
-const_cast

moi je perds la boule juste pour un pointeur qui change de type.

169

bah, c'est surtout le static_cast qui sert dans 99% des cas, les autres c'est souvent pour des trucs très très particuliers et tu peux vraiment vivre sans
avatar

170

Ok pour les casts, je vois que j'ai le choix et de quoi y réfléchir à mon aise hehe
GoldenCrystal (./166) :
Pour le typedef, c'est le comportement normal, les valeurs sont compatibles entre elles. Sinon il faudrait créer ton propre type (donc classe/structure/union) mais il faut que ce soit vraiment justifié (i.e. que tu apportes vraiment quelque chose en faisant ça, genre une méthode ou des opérateurs surchargés particuliers, etc...)

Je me demandais si ça pouvait arriver qu'on veuille appeler deux constructeurs de même signatures, mais faisant des choses différentes. Donc avoir par exemple deux constructeurs Maclasse(int), et que l'on puisse choisir entre eux.

171

Folco (./170) :
Je me demandais si ça pouvait arriver qu'on veuille appeler deux constructeurs de même signatures, mais faisant des choses différentes. Donc avoir par exemple deux constructeurs Maclasse(int), et que l'on puisse choisir entre eux.
Moué... Je vois où tu veux en venir... Mais malgré ça, il n'y a aucun exemple qui me vienne en tête où tu ne pourrais pas t'en tirer honorablement (et peut-être plus clairement/proprement) sans ce genre de bidouilles.
Après le typedef, est encore une fois un héritage du C. Si le C++ avait été développé de rien je pense que le typedef n'existerait même pas...
Quand à la limite de signature = nom complet de methode + type des paramètres / valeur de retour, c'est pour moitié une limitation technique, pour moitié une limitation du langage qui t'évite d'avoir du code encore plus complexe (on aurait pu prendre en compte le nom des paramètres... ce qui aurait par ailleurs rendu plus complexe la compatibilité avec le code C, et le code C++ que tu aurais du écrire pour tirer parti de la fonctionalité)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

172

GoldenCrystal (./171) :
signature = nom complet de methode + type des paramètres / valeur de retour

Je croyais que seuls nom + types de paramètres caractérisaient la signature ?

Sinon ok, c'est peut-être même pas la peine que je me pose la question.
Finalement, qu'est-ce qu'un typedef a de plus qu'un "#define MonInt int" ?

173

Le #define est géré par le préprocesseur, et le typedef est vu par le compilateur comme un type différent en tant que tel.
D'autre part, leur domaines d'applications sont différents, celui du #define est plus vaste et recouvre partiellement celui du typedef, mais pas entièrement.
Par exemple il n'y a pas d'équivalent direct à "typedef int tab[5];" avec #define.
En fait, c'est une manière formelle de dire au compilateur que tu veux telle ou telle équivalence de [nom de] type, ce qui permettra éventuellement de générer des warning ou erreurs utiles/intelligentes là ou le préprocesseur ne fait que du remplacement de texte bête et méchant sans se soucier aucunement de la validité du code ou de la signification de ce que tu lui fait faire.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

174

Effectivement, avec une utilisation plus complexe, c'est vrai. smile

175

GoldenCrystal (./166) :
Pareil ^^
D'ailleurs le constructeur de int n'accepte-t-il pas que des int ? confus

Non, pour les types primitifs ça revient exactement au même qu'un cast. Sauf que si ton type a un nom composé (comme unsigned short) bah tu ne peux te servir que du premier. Alors autant rester cohérent et n'utiliser que le cast, même si la syntaxe est vraiment moche et vicieuse dans des cas comme (objet*)truc->qqch ^^
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

176

Dans Code::Blocks, j'ai voulu ajouter une abréviation, de celles qu'on peut compléter avec Ctrl-J, pour avoir une parenthèse fermante quand j'en tape une ouvrante, et avoir le curseur qui se place au milieu du bloc (comme le fait bien TIGCC IDE). C'est dans Options -> Abbreviations.

J'ai donc créé le Keyword '{', avec ce code :
{
	|
}

Le curseur devrait donc prendre la place du pipe une fois que j'ai tapé '{' + Ctrl-J, le tout indenté correctement.

Mais ça ne marche pas. Une idée ? A moins qu'il y ait une option (que je n'ai pas trouvée) pour obtenir ce comportement, déjà implémentée ?

Ca semble être le keyword '{' qui n'est pas pris en compte, si je mets un truc genre 'bb', ça marche, mais je préfèrerais avec '{'.

177

utilise une nightly build (fleche forums) de c::b au lieu de la release sur la page d'accueil, ce feature est déja implémenté.

chaque nightly build est plus stable que la release.

c'est des fans de l'éternelle beta.


limite tu peux utiliser leur svn head, il est pas dur à compiler et vraiment stable.

178

Ah, merci beaucoup pour l'info. En effet, je mise avant tout sur la stabilité, c'est très important pour moi ! Merci bien. smile

ps -> le dernier nighty build ne semble avoir été fait que pour Win. J'imagine qu'ils ne package pas pour les distros habituelles dans ce cas ? Faut se taper la compilation depuis le SVN alors.

179

YYYYYEEEEEESSSSSSSSSSS j'ai mon bouquin !!! boing

180

Brunni (./175) :
GoldenCrystal (./166) :
Pareil ^^
D'ailleurs le constructeur de int n'accepte-t-il pas que des int ? confus
Non, pour les types primitifs ça revient exactement au même qu'un cast. Sauf que si ton type a un nom composé (comme unsigned short) bah tu ne peux te servir que du premier.
Et avec un typedef ?
(J'ai la flemme de tester moi même)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes