# Débutant en C++ ayant besoin d'aide



## r e m y (11 Octobre 2014)

Je débute en C++ et je fais donc des exercices de programmation basique

Dans l'un d'eux je dois gérer des comptes bancaires.
J'ai des problèmes avec une variable que j'ai nommée "titulaire" mais que Xcode me demande d'initialiser explicitement (quand je veux lui affecter la valeur c qui est le nom enregistré pour un compte donné)







Le message d'erreur semble explicite (il veut que j'initialise titulaire), mais je ne comprends pas pourquoi, ni ce que je dois faire pour ça...

Toute idée, ou piste serait la bienvenue pour m'aider à avancer.

Un grand merci d'avance


----------



## ntx (12 Octobre 2014)

L'erreur se trouve sans doute dans ta classe "Client". Il doit manquer un constructeur par défaut qui est appelé lors que tu initialises ton objet "Compte". Normalement il peut être généré automatiquement par le compilateur, mais il vaut mieux souvent le définir explicitement.


----------



## r e m y (12 Octobre 2014)

Ben pour ce qui est de client.h, j'ai ça:

#ifndef Banque_client_h
#define Banque_client_h
#include <string>
#include<vector>
#include "personne.h"
class Compte;
using namespace std;


class Client: public Personne
{
private:
    vector<Compte*> compte;
public:
    Client(string n);
    ~Client();
    void add_compte(Compte * c);
    vector<int> get_comptes();
};


#endif


----------



## ntx (12 Octobre 2014)

Ajoute un constructeur par défaut sans paramètre. De même si la classe est un peu complexe, il faut aussi prévoir de définir un constructeur de copie : 

Client(const Client& src)    

PS : pour la compréhension du code, des noms plus explicites que n ou s sont les bien venus 
PS 2 : ne pas oublier les "const" dans les définitions des fonctions, ce n'est pas optionnel ...


----------



## r e m y (12 Octobre 2014)

Ok merci, je fais ça de suite

Effectivement, je reconnais que je devrais utiliser des noms plus explicites.

Dans les premiers exercices, je m'en sortais sans mais là, même si ca reste basique, ça commence à se compliquer un peu et même pour moi, ça m'aiderait...



---------- Nouveau message ajouté à 22h33 ---------- Le message précédent a été envoyé à 21h17 ----------

Ca fonctionne enfin!

Un simple Client() ajouté et hop, plus d'erreur.

Merci de ton aide

Par contre maintenant j'ai un souci lors de la compilation et j'ai l'impression, d'après mes recherche Google, que c'est un problème lié à Os X 10.9:

J'obtiens les erreurs suivantes:

Undefined symbols for architecture x86_64:
  "Client::Client()", referenced from:
      Compte::Compte(int, Client) in compte.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)


Bizarrement, même si je demande une compilation pour architecture 32 bits seulement (i386), j'ai toujours la première erreur (not found for x86_64)

Quant à la deuxième erreur, j'ai trouvé des fils de discussion qui en parle mais je ne comprends absolument pas ce qu'il faut faire pour passer outre ....

Il me semble qu'il faudrait changer de compileur par défaut:






Mais quand je clique sur "Default Compiler LLVM 6.0", je n'ai pas le choix d'un autre compileur et je ne sais pas comment ajouter celui que les fils de discussion que j'ai trouvé mentionne gcc (ou g++)


----------



## ntx (13 Octobre 2014)

Compile en 64 bits, oublie le 32.

Vérifie tes réglages, apparemment l'erreur indique que ton fichier Client a été compilé en 32 bits. Tu dois inclure un header qui tire une vieille librairie C qui est encore en  32 bits. Utilise bien les includes standards C++ (sans le .h dans le nom).

Tout doit compiler avec LLVM, pas de raison d'en utiliser un autre.


----------



## r e m y (13 Octobre 2014)

Merci de tes conseils.
Je regarde ça ce soir et je te dirai si je trouve ce qui coince
(pourtant je pense n'avoir inclus que des choses tout à fait standards... mais comme je m'appuie sur des cours un peu vieux, il est possible qu'ils fassent référence à des vieilles librairies C)


----------



## r e m y (13 Octobre 2014)

Bon ben... c'est encore moi.

J'ai regardé mon client.cpp et je ne vois pas ce qui pourrait appeler une bibliothèque ancienne


```
#include "client.h"
#include "personne.h"
#include"compte.h"
#include <vector>
#include <string>
using namespace std;


Client::Client(string n):Personne(n)
{
  
}

Client::~Client(){}

void Client::add_compte(Compte* c)
{
    compte.push_back(c);
    
}


vector<int> Client::get_comptes()
{
    vector<int> x;
    int i;
   
    for(i=0;i<compte.size();i++)
    {
        
        x.push_back(compte[i]->get_numero());
    }
    
    return x;
}
```


---------- Nouveau message ajouté à 21h20 ---------- Le message précédent a été envoyé à 20h12 ----------

Je viens de reprendre mon projet Xcode sur un autre Mac (avec Xcode 5 sur MountainLion) et .... il fonctionne!

Il y aurait donc bien un problème lié à Mavericks et Xcode 6 (avec le compilateur LLVM)

C'est bizarre non?


----------



## bayeto (22 Octobre 2014)

r e m y a dit:


> Je débute en C++ et je fais donc des exercices de programmation basique
> 
> Dans l'un d'eux je dois gérer des comptes bancaires.
> J'ai des problèmes avec une variable que j'ai nommée "titulaire" mais que Xcode me demande d'initialiser explicitement (quand je veux lui affecter la valeur c qui est le nom enregistré pour un compte donné)
> ...



Salut ! Le post date un peu mais...
Je trouve que le message d'erreur du compilateur assez explicite: il réclame l'initialisation de titulaire

```
Compte::Compte(int num,Client c) : titulaire(c) {
  numero=num;
  solde=0;
}
```

On peut même faire:

```
Compte::Compte(int num,Client c) : titulaire(c),numero(num),solde(0) {}
```


Pour ton pb avec Client, l'éditeur de liens dit qu'il manque Client::Client(), on le voit pas définit dans Client.cpp ? Est-il inline dans Client.h ?


----------



## r e m y (22 Octobre 2014)

Merci de tes remarques.
Je vais regarder ce soir en rentrant à la maison

L'initialisation de titulaire, j'avais trouvé une solution grâce à ntx

Par contre il me reste les 2 erreurs lors de la compilation (du moins quand je compile avec XCode 6 sur mon MacBook Pro tournant sous Mavericks, car sur un autre MacBook Pro sous Mountain Lion et XCode 5, la compilation se fait sans erreur)

Je vais tout de même voir si l'ajout d'un Client::Client() dans Client.cpp permet de compiler.

Je reviens dans la soirée te donner le résultat

Merci!


----------



## r e m y (23 Octobre 2014)

Bon ben... même résultat en ayant ajouté Client::Client(); dans mon client.cpp

Tant pis


----------



## ntx (23 Octobre 2014)

Tu as bien déclaré ton constructeur Client() dans le header

```
Client();
```
ET défini de le cpp ? 

```
Client::Client()
{
}
```

PS : tu peux aussi mettre la définition directement dans le header :

```
Client() {}
```


----------



## r e m y (24 Octobre 2014)

Bon j'ai vérifié et corrigé mais maintenant...






Je suis donc allé regarder cette fois dans personne.h et personne.cpp
J'ai trouvé la dernière erreur et maintenant... CA FONCTIONNE!

Merci de l'aide


----------



## r e m y (31 Octobre 2014)

Je continue mon "auto-formation"

Là je suis sur un projet développé en utilisant Qt (avec des library spécifiques de Qt)

j'ai un souci de debuggage car lors de la compilation je n'ai qu'un message d'erreur sans indication de ce qui cause le problème

Qt me renvoie simplement le message d'erreur du compilateur
undefined symbol for architecture x86_64
linker command failed with exit code 1 (use -v to see invocation)


C'est un peu vague et je ne sais pas où chercher l'erreur. Je voudrais bien activer le mode verbose du compilateur comme suggéré par le message (use -v to see invocation), mais je ne sais pas comment faire.
Déjà sous XCode j'avais cherché sans succès (lorsque j'étais confronté au même message dans mon projet précédent)

Est-ce possible de passer ce paramètre -v quand on lance la compilation et comment?

Merci encore pour ceux qui voudront bien m'apporter leur aide précieuse.


----------



## ntx (31 Octobre 2014)

Cette erreur vient d'un bout de code qui a été compilé en 32 bits au milieu d'une application 64 bits. Ce code provient en général d'une librairie externe que tu as utilisée dans ton projet.


----------



## r e m y (31 Octobre 2014)

Ben je ne pense pas... mais je vais encore regarder.
(et dans mon premier projet, sur lequel tu m'as bien aidé, cette erreur se produisait en raison de variables mal initialisées.)

Tu ne sais pas comment demander au compilateur de travailler en mode verbose (en passant quelque part ce paramètre -v)?

Ca permettrait de savoir exactement à quel endroit ça coince, je pense.


----------



## r e m y (1 Novembre 2014)

J'ai trouvé l'erreur... C'est un bug de Qt

Dans le dossier dans lequel il crée le programme compilé (là où il crée les fichier .o et l'application), il restait un fichier "makefile" qui normalement est supprimé en fin de compilation.
J'ai poubellisé ce "makefile" et la compilation s'est bien déroulée sans aucune erreur


----------



## r e m y (1 Novembre 2014)

gbeze a dit:


> MAÎTRE , MARABOUT, SPIRITUEL , GRAND VOYANT
> Tout effet a une cause - Toute cause a une solution.
> par ses résultats, il a acquis une réputation mondiale - Pas de déception - résultats 100% garantis Il possède des dons surnaturels, maîtrise une force spirituelle exceptionnelle Il résout tous les problèmes une fois pour toute, même les cas les plus désespérés : Contre la sorcellerie,Contre la malchance,Portefeuille magique,Pour se faire aimer,Contre divorce,Provocation de divorce,Retour de l'amour conjugal,Gain Facile,Contre poison,Impuissance total,Contre affectations non désirées,Pour occuper une place en société,Développement de sexe,Ménopause Précoce,Épilepsie,Drépanocytose,Discussion de femme, de l'homme,Discussion du terrain,Battement de coeur,Ulcères,Pour rendre moins difficile une situation,Protection contre ennemis,Contre la faiblesse d'une grossesse,Contre tétanos,La stérilité féminine et masculin,Pour sauver une personne,Pour éviter de faire des enfants mort,Pour attirer la clientèle,Pour engrosser facilement,Pour empêcher une femme de sortir,Pour être sorcier,Pour soigné la folie,Recette pour faire un garçon,Contre gaspillage,Contre le divorce,Pour reprendre sa femme ou son mari,Pour être patron au travail,Pour avoir beaucoup de travail,Pour bien garder son entreprise, Pour aller a un concours et réussir
> Travail rapide et double efficacité .
> ...



Mais bon sang, mais c"est bien sûr!

C'est exactement ce dont j'ai besoin pour mes petits programmes qui me donnent tant de fil à retordre... (le dernier avatar étant un petit jeu du Pendu qui fonctionne quand je lance la compilation depuis Qt mais qui plante quand je lance directement l'application compilée)


----------



## bayeto (2 Novembre 2014)

Peut-être un problème avec le chemin des lib Qt, s'il n'est pas installé dans les dossiers du système. Dans le terminal:
monpromptalanoix$ DYLD_LIBRARY_PATH=/chemin/vers/lib/Qt ./mon_prog


----------



## r e m y (2 Novembre 2014)

QT étant dans mon dossier utilisateur, et mon programme s'appelant PenduQT, il faut que je saisisse:

DYLD_LYBRARY_PATH=/Users/remy/Qt/5.3/clang_64/lib ./PenduQT

C'est ça?

Quel est l'objectif? Intégrer les library QT dans mon programme?


----------



## bayeto (2 Novembre 2014)

Oui c'est pour dire au chargeur de lib où il doit chercher.


----------



## r e m y (3 Novembre 2014)

ok merci, je vais tester ça et je te dirai si ça résout les problèmes de plantage de mon application compilée


----------



## r e m y (3 Novembre 2014)

Le Terminal me renvoie une erreur:

PenduQt.app: is a directory


J'ai recommencé en ouvrant le package de l'app pour aller désigner PenduQT qui se trouve dans le sous-dossier /Contents/MacOS

Cette fois, l'application se lance mais plante toujours et dans le Terminal je vois que la commande saisie renvoie:
0
Floating point exception: 8


----------



## bayeto (3 Novembre 2014)

Tu as un division dans ton code? On dirait un plantage avec division par zéro.


----------



## r e m y (4 Novembre 2014)

C'est bien ce qui figure  dans le crash.log... mais je n'ai aucune division dans mon code!

Je pensais plutôt au fait qu'il ne trouvait pas une library et qu'une fonction se trouve remplacée par un (NULL) quelque part. J'avais espoir que ta piste résolve ça

(d'autant que lorsque je lance le programme depuis Qt en lancant la compilation, tout se passe bien)

Je vais continuer à chercher sur Google, car j'ai trouvé des tas de discussions avec des cas similaires (liés à l'usage de library de Qt), mais pas encore trouvé de solution qui fonctionne à tous les coups


----------



## bayeto (4 Novembre 2014)

Comme ton programme est une appli .app tu peux utilser open pour le lancer. Et essaye de avec un:
DYLD_FRAMEWORK_PATH=/Users/remy/Qt/5.3/clang_64/lib open PenduQT.app
Dans le terminal.


----------



## r e m y (4 Novembre 2014)

Ca marche!

Merci


----------

