Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/10/2007, à 00:17

aganim07

Questions sur la P.O.O. (C++ et JAVA)

Hello !

J'ai une question d'ordre général sur les pointeurs en langage C++.
Tout d'abord, sachez que je suis en train d'apprendre ce langage...

Voici ce que j'ai compris des pointeurs :

Contrairement au passage par valeur, le pointeur ne contient pas une donnée mais l'adresse de cette donnée.

Déclaration d'un pointeur sur un float par exemple :
float* pointor;

Affectation de la cible du pointeur (variable float pointée) :
pointor = &a; (si a est un float) OU BIEN DIRECTEMENT pointor = &3.0;

Appel de la variable float pointée : *pointor;

Jusque là, est-ce que j'ai bon ??

Maintenant ma question concerne les pointeurs de type char* :

Si je tape  : char* pointor="bière";
Là j'ai défini un pointeur sur char appelé pointor.
Mais le pointeur appelé pointor ne peut pas être égal à quelque chose ?? Il ne peut pas contenir le mot bière puisqu'il contient l'adresse d'une variable et non pas la variable elle-même ?

Alors ça veut dire quoi cette syntaxe ? char* pointor="bière";
A la rigueur je comprendrais qu'on tape ceci :
char* pointor;
pointor =&"bière";

Sinon je comprends pas...

D'avance merci !!

PS : Si qqn peut m'expliquer ce qu'est un template au passage ? D'avance merci smile

Dernière modification par aganim07 (Le 09/11/2007, à 15:58)

Hors ligne

#2 Le 29/10/2007, à 03:12

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

Alors, déjà pointeur en Anglais se dit pointer wink

char *pointer = "biere" définit un pointeur vers un char. Dans son état initial, il pointe vers 'b' : *pointer == 'b'

De même, on a :
*(b+1) == 'i'
*(b+2) == 'e' (la lettre è ne rentre pas dans un char, donc ce n'est pas bon pour l'exemple)
*(b+3) == 'r'
*(b+4) == 'e'
*(b+5) == '\0' (le caractère nul)

Il ne faut pas aller plus loin, b+5 est la limite de l'espace alloué pour cette chaîne de caractères.

Tu peux aussi accéder aux différents caractères comme ceci :
b[0] == 'b'
b[1] == 'i'
...
b[5] == '\0'

À propos des templates, c'est très simple mais la syntaxe peut paraître étrange au début.
Imagine que tu veuilles écrire une fonction max(a, b) qui renvoie la plus grande valeur parmi ses arguments (a ou b).
Il faudrait écrire une fonction pour les int :

int max(int a, int b) { return (a > b ? a : b); }

Une fonction pour les char :

int max(char a, char b) { return (a > b ? a : b); }

Une fonction pour une classe quelconque :

int max(Taille a, Taille  b) { return (a > b ? a : b); }

...et ainsi de suite pour chaque type que tu veux comparer. Comme ça peut être long d'écrire 50 fois la même chose, et que tout bon programmeur qui se respecte tente de réutiliser au maximum son code, il vaut mieux utiliser les templates.

template <typename T> T max(T a, T b) { return (a > b ? a : b); }

Je pense que cet exemple parle de lui-même : il suffit de remplacer le type des variables par T, qui est un "nom de type" (typename). Puis il reste à indiquer au compilateur que la fonction est un template et qu'elle dépend du type T.

Maintenant, il suffit d'appeler max(var1, var2) pour n'importe quelles variables var1 et var2 (de même type).
Parfois il est nécessaire de préciser le nom de type, l'appel de fonction devient alors max<int>(var1, var2), max<char>(var1, var2)... Mais ça ne devrait pas âtre nécessaire dans ce cas.

On peut faire la même chose avec des classes. Au lieu d'écrire :

class a
{
public:
     a(int val)
      : m(val)
      {}

      int fonction(int a, int b)
      {
            return a + b + m;
      }

private:
     int m;
};

et

class b
{
public:
     b(char val)
      : m(val)
      {}

      char fonction(char a, char b)
      {
            return a + b + m;
      }

private:
     char m;
};

Il suffit d'écrire :

template <typename T>
class c
{
public:
     c(T char)
      : m(val)
      {}

      T fonction(T a, T b)
      {
            return a + b + m;
      }

private:
     T m;
};

Et de la déclarer comme c<int>, c<char>, etc...

Dernière modification par Link31 (Le 29/10/2007, à 03:13)

Hors ligne

#3 Le 29/10/2007, à 08:37

robrob

Re : Questions sur la P.O.O. (C++ et JAVA)

aganim07 a écrit :

Affectation de la cible du pointeur (variable float pointée) :
pointor = &a; (si a est un float) OU BIEN DIRECTEMENT pointor = &3.0;

Attention pointor = &a, affecte à pointor l'adresse mémoire de a et non la valeur en elle même.

Pour affecter la valeur de a, il faut faire *pointor =a; Mais pour pouvoir affecter la valeur, il faut que pointor pointe sur un espace mémoire permettant de stocker un float (ce qui n'est pas le cas par defaut). On peut, par exemple, reserver la mémoire nécessaire avec new:

float *pointor;        // declare un pointeur sur un float, pointor pointe sur n'importe quoi
pointor = new float;   // reserve l'espace pour stocker un float, pointor pointe sur un float non initialise
*pointor = 3.0f;       // affecte 3.0, pointor pointe alors sur la valeur 3.0
pointor[0] = 3.0f;     // idem au dessus mais ecrit differement
delete pointor;        // libere la memoire, pointor pointe a nouveau sur n'importe quoi

Hors ligne

#4 Le 29/10/2007, à 21:37

themulot

Re : Questions sur la P.O.O. (C++ et JAVA)

si tu apprends le c++ regarde les references car c'est plus simple et que pour commencer ca suffit

Hors ligne

#5 Le 30/10/2007, à 22:08

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Bon ben j'arrive pas bien à comprendre encore...

Je relis encore et encore vos réponses mais ça rentre pas... hmm

Hors ligne

#6 Le 30/10/2007, à 22:21

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

char *p = "biere";

*p n'est pas égal à "biere". "biere" n'est pas un char, alors que *p est un char (p quant à lui est un char*).

*p est égal au début de "biere", au premier morceau de "biere" de la taille d'un char, c'est-à-dire 'b'.

Si tu écrivais char *p = (char*)variable (quel que soit le type de variable), alors *p serait égal au premier morceau de variable de la taille d'un char, c'est-à-dire au premier octet de variable.

RAM: ...[2][8][f][b][i][e][r][e][0][e][f]...
                          /|\        /|\    /|\
                           |           |       |
                           p        p+3   p+5

*p == p[0] == 'b'
*(p+3) == p[3] == 'r'
*(p+5) == p[5] == '\0' == 0

Dernière modification par Link31 (Le 30/10/2007, à 22:26)

Hors ligne

#7 Le 30/10/2007, à 22:52

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Ok. En fait si je comprends bien ça marche un peu comme un tableau...

pointeur[0]='b';
pointeur[1]=1;
etc...

Par contre pourquoi mettre deux signes == ? yikes

Sinon j'ai le droit de taper float* pointer=3.0; ???
Ou c'est seulement faisable avec les char* ??
Si oui, je ne saisis toujours pas la différence entre :

CECI >>
float* pointer;
pointer =& 3.0;

ET CELA >>
float* pointer=3.0;

Comme de toute façon on parle de pointeur là, on ne peut pas stocker autre chose qu'une adresse dans pointer... Alors ça me parait aberrant par définition d'écrire qu'un pointeur est égal à un floatant, un int, un booléen, un char etc... Si c'est un pointeur il est égal à une adresse, pas au contenu de l'adresse. Non ?

Désolé de vous embêter avec mes questions à la con... sad

PS : Le type T dont tu parles dans les templates, c'est un type qui existe déjà ou c'est un nom que tu as balancé comme ça comme tu aurais pu dire type E ou type bidule ??

Dernière modification par aganim07 (Le 30/10/2007, à 22:58)

Hors ligne

#8 Le 30/10/2007, à 23:07

robrob

Re : Questions sur la P.O.O. (C++ et JAVA)

aganim07 a écrit :

Ok. En fait si je comprends bien ça marche un peu comme un tableau...

Je dirai même plus, une chaine de caractère est un tableau, tableau de la longueur de la chaine + 1 (+1 pour le caractère de fin de chaîne, le caractère '\0');

"biere" est identique à ce tableau {'b','i','e','r','e','\0'}.

En fait,  écrire que char *pointer="biere" revient à faire 3 choses:
- déclarer un pointeur sur des char
- créer en mémoire le tableau de 6 char {'b','i','e','r','e','\0'}
- mettre la valeur du pointeur sur le premier élément du tableau, le caractère 'b'

aganim07 a écrit :

]Sinon j'ai le droit de taper float* pointer=3.0; ???

Oui tu as le droit, mais ça fera pas ce que tu veux.
En effet, pointer est une adresse mémoire.

float *pointer=3.0;

est similaire à:

float *pointer;
pointer=3.0;

Donc ce faisant, tu indique donc que l'adresse mémoire vaut 3.0 (qui sera converti par le compilo par 3, modulo un warning).

Pour faire ce que tu veux, il faudrait écrire:

float *pointer={3.0};

Dernière modification par robrob (Le 30/10/2007, à 23:12)

Hors ligne

#9 Le 30/10/2007, à 23:16

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

robrob a écrit :
aganim07 a écrit :

Ok. En fait si je comprends bien ça marche un peu comme un tableau...

Je dirai même plus, une chaine de caractère est un tableau, tableau de la longueur de la chaine + 1 (+1 pour le caractère de fin de chaîne, le caractère '\0');

"biere" est identique à ce tableau {'b','i','e','r','e','\0'}.

En fait,  écrire que char *pointer="biere" revient à faire 3 choses:
- déclarer un pointeur sur des char
- créer en mémoire le tableau de 6 char {'b','i','e','r','e','\0'}
- mettre la valeur du pointeur sur le premier élément du tableau, le caractère 'b'

aganim07 a écrit :

]Sinon j'ai le droit de taper float* pointer=3.0; ???

Oui tu as le droit, mais ça fera pas ce que tu veux.
En effet, pointer est une adresse mémoire.

float *pointer=3.0;

est similaire à:

float *pointer;
pointer=3.0;

Donc ce faisant, tu indique donc que l'adresse mémoire vaut 3.0 (qui sera converti par le compilo par 3, modulo un warning).

Pour faire ce que tu veux, il faudrait écrire:

float *pointer={3.0};

Donc quand c des chiffres, on tape : float* pointer={3.0};
Et quand c des caractères : char* pointer="machinchose";

? big_smile

Hors ligne

#10 Le 30/10/2007, à 23:16

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

aganim07 a écrit :

Par contre pourquoi mettre deux signes == ?

Parce qu'un seul = dans une comparaison c'est le mal.

aganim07 a écrit :

Sinon j'ai le droit de taper float* pointer=3.0; ???
Ou c'est seulement faisable avec les char* ??

Seulement avec les chaînes de caractère "..." déclarées dans le code (cas particulier, le compilateur les transforme en const char* et les range dans un coin de l'exécutable).

aganim07 a écrit :

CECI >>
float* pointer;
pointer =& 3.0;

Ne fais pas ça, utilise plutôt :
float valeur = 3.0;
float* pointer;
pointer = &valeur;

et tout ira bien (il faut bien que le 3.0 soit stocké quelque part... si ça fonctionnait en faisant ça avec les char* c'est probablement parce qu'une chaîne de caractères "..." déclarée dans le code est traitée de façon spéciale par le compilateur).

aganim07 a écrit :

ET CELA >>
float* pointer=3.0;

Ça ne marchera pas, un float* a la taille d'un pointeur (la même taille qu'un int) et tu ne peux pas y mettre 3.0.

aganim07 a écrit :

Comme de toute façon on parle de pointeur là, on ne peut pas stocker autre chose qu'une adresse dans pointer... Alors ça me parait aberrant par définition d'écrire qu'un pointeur est égal à un floatant, un int, un booléen, un char etc...
Si c'est un pointeur il est égal à une adresse, pas au contenu de l'adresse. Non ?

Pour être exact tu peux y mettre un int ou d'autres choses similaires de même taille. Mais si ce int ne correspond pas à une adresse valide, tu es foutu wink
Avant de t'intéresser à ce genre de hacks, tu devrais te contenter de récupérer l'adresse de variables avec &.

aganim07 a écrit :

PS : Le type T dont tu parles dans les templates, c'est un type qui existe déjà ou c'est un nom que tu as balancé comme ça comme tu aurais pu dire type E ou type bidule ??

Mets le nom que tu veux.

robrob a écrit :

Pour faire ce que tu veux, il faudrait écrire:

float *pointer={3.0};

Ça ne passe pas sous GCC 4.1.2...

Dernière modification par Link31 (Le 30/10/2007, à 23:18)

Hors ligne

#11 Le 30/10/2007, à 23:28

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Bon ok je commence à y voir plus clair. Donc j'ai le sentiment que char* c'est quand même assez spécial comme pointeur. Cette histoire de pointeur sur une lettre qu'on déplace par indentation etc...

En tout cas merci pour votre aide smile

Hors ligne

#12 Le 30/10/2007, à 23:40

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Link31 a écrit :

char *p = "biere";

*p n'est pas égal à "biere". "biere" n'est pas un char, alors que *p est un char (p quant à lui est un char*).

*p est égal au début de "biere", au premier morceau de "biere" de la taille d'un char, c'est-à-dire 'b'.

Si tu écrivais char *p = (char*)variable (quel que soit le type de variable), alors *p serait égal au premier morceau de variable de la taille d'un char, c'est-à-dire au premier octet de variable.

RAM: ...[2][8][f][b][i][e][r][e][0][e][f]...
                          /|\        /|\    /|\
                           |           |       |
                           p        p+3   p+5

*p == p[0] == 'b'
*(p+3) == p[3] == 'r'
*(p+5) == p[5] == '\0' == 0

Ohhhh je viens enfin de comprendre !!!
Déjà il n'y a pas de string que des char donc on fonctionne caractère par caractère.

Ensuite quand on écrit : char* p="kronembourg";

Soit on lit :
*p est un caractère qui contient "k" par défaut.
Car *p c'est la commande pour lire la cible d'un pointeur.

Soit on lit :
p est un pointeur sur caractère cad un char* qui pointe sur "k".

Dernière modification par aganim07 (Le 30/10/2007, à 23:40)

Hors ligne

#13 Le 30/10/2007, à 23:49

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

C'est bien ça. Et quand tu demandes à une fonction de t'"afficher" p, elle parcourt la mémoire depuis le premier caractère pointé par p jusqu'à rencontrer un caractère nul '\0'. C'est pourquoi ce caractère supplémentaire est si important (s'il est manquant, la fonction ne s'arrête jamais et plante le programme).

Pour généraliser :
Il faut savoir que lorsque tu écris *(p+3) ou p[3], tu accèdes au 3ème morceau de la taille de *p de la variable pointée par p.
Donc si *p est un char, p[3] accède au 3ème char de la variable pointée, donc à la troisième lettre.
Si au lieu d'avoir une chaîne de caractères (tableau de char), tu avais un tableau de float et un pointeur float*, tu pourrais faire de même pour accéder au 3ème morceau du tableau, donc au 3ème float.
C'est ce que l'on appelle l'arithmétique des pointeurs.

Un dernier détail :
Avec une chaîne de caractères (tableau de char) de X lettres pointé par char *p tu peux accéder à p[X] parce que le compilateur rajoute automatiquement un caractère '\0' à la fin. C'est une exception.
À moins que le compilateur ne rajoute ainsi des choses à la fin d'un tableau, le dernier élément d'un tableau pointé par p est toujours p[X-1]. Donc la dernière valeur valide dans la plupart des cas est *(p+X-1) (je rappelle que ça commence à *(p+0)).

Hors ligne

#14 Le 31/10/2007, à 00:02

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Link31 a écrit :

C'est bien ça. Et quand tu demandes à une fonction de t'"afficher" p, elle parcourt la mémoire depuis le premier caractère pointé par p jusqu'à rencontrer un caractère nul '\0'. C'est pourquoi ce caractère supplémentaire est si important (s'il est manquant, la fonction ne s'arrête jamais et plante le programme).

Pour généraliser :
Il faut savoir que lorsque tu écris *(p+3) ou p[3], tu accèdes au 3ème morceau de la taille de *p de la variable pointée par p.
Donc si *p est un char, p[3] accède au 3ème char de la variable pointée, donc à la troisième lettre.
Si au lieu d'avoir une chaîne de caractères (tableau de char), tu avais un tableau de float et un pointeur float*, tu pourrais faire de même pour accéder au 3ème morceau du tableau, donc au 3ème float.
C'est ce que l'on appelle l'arithmétique des pointeurs.

Un dernier détail :
Avec une chaîne de caractères (tableau de char) de X lettres pointé par char *p tu peux accéder à p[X] parce que le compilateur rajoute automatiquement un caractère '\0' à la fin. C'est une exception.
À moins que le compilateur ne rajoute ainsi des choses à la fin d'un tableau, le dernier élément d'un tableau pointé par p est toujours p[X-1]. Donc la dernière valeur valide dans la plupart des cas est *(p+X-1) (je rappelle que ça commence à *(p+0)).

Et c'est pour ça qu'en C/C++ un tableau de taille N est numéroté de 0 à N-1 !! Il y a bien N cases puisqu'on part de 0 mais le décalage est fait pour rappeler qu'en N il y a ce machin /0 !! big_smile:D:D

Z'êtes des génies les gars smile

Hors ligne

#15 Le 31/10/2007, à 00:10

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Hop ! Je reposte ici pour vous dire un peu ou j'en suis dans mon apprentissage du C++.
Je voudrais que vous me disiez, si selon vous, il me reste encore bcp de choses à apprendre.

Liste de ce que je connais bien :
Types simples,
Tabeaux 1D et 2D statiques ou dynamiques (avec calloc et malloc),
Structures conditionnelles (if {} else, while, do while, for, switch),
Structures,
Listes chainées,
Pointeurs (grace à vous big_smile)

Liste de ce que je connais mal :
Classes avec les histoires de public, private, friend etc...

Liste de ce que je ne maitrise pas encore :
Héritage de classe,
Template,
Les histoires de frameworks... en C++ un framework c'est quoi ? Visual C++ ? Borland ?

Hors ligne

#16 Le 31/10/2007, à 17:53

scholi

Re : Questions sur la P.O.O. (C++ et JAVA)

ben tout dépend de ce que tu veux faire... Tu peux très bien faire de programme sans jamais utiliser de class, mais du coup mieux vaut faire du C pour avoir une excuse de ne pas utiliser les classes wink

Non je plaisante, mais les classes sont tellement pratique, qu'une fois maitrisée, tu vas les utiliser à tout bout de champ. Bon ça sert à rien de te faire un cours, lis tes bouquins et si t'as des questions, poste les là.

sinon pour en revenir aux pointeur, pour assigner directement une valeur (là où tu essayais de faire float* p=3.0 ) tu peux faire:

float* p=new float;
*p=3.0;

sinon si tu fais des tableaux je te conseil d'utiliser malloc, calloc et realloc au lieu de new (en tout cas si tu dois les dimensionner). Et n'oublie pas de libérer la mémoire avec delete ou free.

Dernière modification par scholi (Le 31/10/2007, à 17:56)


S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.

Hors ligne

#17 Le 01/11/2007, à 15:59

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Merci encore pour votre aide smile

J'ai une question supplémentaire mais sans rapport avec les pointeurs.
Quelle est la différence entre cout et puts pour afficher du texte ?
D'ailleurs j'imagine qu'il y a une sorte d'équivalent de cin comme puts qui doit s'appeler catch ou quelque chose dans ce genre. Perso j'utilise cout et cin, parfois printf et scanf. Mais puts sert à quoi ?

Merci smile

Hors ligne

#18 Le 01/11/2007, à 16:11

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

C'est un miracle, ma première structure fonctionne !!

// Projet.cpp

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;

struct vecteur {
       double x1;
       double y1;
       double x2;
       double y2;
       };

int main(int argc, char* argv[]) {
    
    float lenght;
    vecteur zozo;
    
    zozo.x1 = 3.0;
    zozo.y1 = 5.0;
    zozo.x2 = 12.0;
    zozo.y2 = 15.0;
    
    lenght = sqrt(pow(zozo.x2-zozo.x1,2) + pow(zozo.y2-zozo.y1,2));
    
    cout << "Je rentre dans le main" << endl;
    cout << "Longueur du vecteur = " << lenght << endl;
    
    system("PAUSE");
    return 0;
    
    }

Hors ligne

#19 Le 01/11/2007, à 16:14

Link31

Re : Questions sur la P.O.O. (C++ et JAVA)

aganim07 a écrit :

Mais puts sert à quoi ?

puts, c'est une relique des temps anciens (temps anciens=langage C). Tu ne devrais jamais avoir besoin de l'utiliser en C++. De même pour printf et scanf, avantageusement remplacés par cout et cin (même si parfois un formatage avec printf peut être plus court à écrire).

system("PAUSE");

Ça marche sous Linux ça ?

Hors ligne

#20 Le 01/11/2007, à 16:16

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Link31 a écrit :
aganim07 a écrit :

Mais puts sert à quoi ?

puts, c'est une relique des temps anciens (temps anciens=langage C). Tu ne devrais jamais avoir besoin de l'utiliser en C++. De même pour printf et scanf, avantageusement remplacés par cout et cin (même si parfois un formatage avec printf peut être plus court à écrire).

system("PAUSE");

Ça marche sous Linux ça ?

Ok ! Merci smile

Je suis sous Dev-cpp là. Donc sous Win XP. Comme je vais devoir programmer sous Windows mais que j'ai toujours tout fait en ligne de commande depuis le bash, bah je m'entraine à utiliser un IDE win32 big_smile

edit : J'ajouterai que, à part avec dev-cpp, je n'ai jamais rien réussi à compiler sous Windows XP.

J'ai essayé Visual C++ et il faut complètement changer le code source pour y arriver. Par exemple using namespace std; bah ça passe pas avec Visual C++. Jamais réussi à compiler donc...

Et le fameux Code:Blocks a l'air aussi emmerdant. Y a pas une ligne que tu peux écrire de manière standard. Il fo toujours t'adapter à l'IDE. Pour moi c un non-sens... Peut-être que Borland est mieux mais je l'ai jamais essayé.

Dernière modification par aganim07 (Le 01/11/2007, à 16:20)

Hors ligne

#21 Le 01/11/2007, à 16:21

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Maintenant je vais essayer de coder une classe puis de faire un héritage.
Je vous tiens au courant. De toute façon je vais y passer l'après-midi !!

Dernière modification par aganim07 (Le 01/11/2007, à 16:21)

Hors ligne

#22 Le 01/11/2007, à 16:44

$Gaël$

Re : Questions sur la P.O.O. (C++ et JAVA)

Link31 a écrit :
system("PAUSE");

Ça marche sous Linux ça ?

euh, c'est pas du linux ??
parce que je suis obligé de faire system("pause") sous linux pour remplacer les getch() ou while(!kbhit()) ...

--edit :

Borland est très bien compilateur + debugger intégrés mais payant et sous windows (à moins que wine..??), il rajoute des principes à la programmation objet (par exemple les propriétés qui encapsulent getter+setter). Il possède son API et ses classes. Il permet de faire des choses très puissantes.

Pour garder un goût de linux sous windows, il existe mingw32 :

mingw.org a écrit :

MinGW: A collection of freely available and freely distributable Windows specific header files and import libraries combined with GNU toolsets that allow one to produce native Windows programs that do not rely on any 3rd-party C runtime DLLs.

En gros ca permet de faire des gcc, g++ ou make sous windows en ligne de commande ^^

En embrayant sur mingw, je me permets de conseiller Qt

pour les interfaces graphiques (notamment) et une API, en les citant :

Qt-fr a écrit :

Qt est un framework C++ permettant de développer des applications graphiques multi-plateformes en se basant sur l'approche suivante : Ecrire une fois, compiler n'importe où.

Et qui dispose d'une communauté TRES active et qui répond très rapidement aux problèmes sur le c++ ou qt  que l'on peut se poser.

Dernière modification par $Gaël$ (Le 01/11/2007, à 17:07)


Ubuntu is an ancient african word meaning : "I can't configure Debian".

Hors ligne

#23 Le 01/11/2007, à 18:36

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

Mon programme plante à l'exécution... Je galère, je galère.

J'ai codé une classe et un tableau de cette instance de classe. Chaque instance es un membre du forum. Les membres de la classe sont des caractéristiques propres à chaque membre.

Et encore j'ai pas fait d'héritage yikes

// classe.cpp


/*=== Header ===*/

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
#define SIZE 5

using namespace std;


/*=== Classe ubuntero ===*/

class ubuntero {
      public:
              char pseudo[24];
              char email [24];
              int  age;
      };


/*=== Fonction remplissage ===*/

void remplissage(ubuntero nouveau_membre[]){
     
     int i, j;
     char* yes_or_no;
     i = 0;
     
     // Remplissage
     
     do {
        cout << "Tapez votre pseudo : ";
        cin >> nouveau_membre[i].pseudo;
        cout << "Tapez votre email : ";
        cin >> nouveau_membre[i].email;
        cout << "Tapez votre âge : ";
        cin >> nouveau_membre[i].age;
        cout << "Créez un nouveau membre ? (y/n)" << endl;
        cin >> yes_or_no;
        i++;
     }
     while(*yes_or_no == 'y' && i < SIZE);

    // Affichage
    
    for(j=0 ; j<i ; j++) {
            cout << "Votre pseudo est : " << nouveau_membre[j].pseudo << endl;
            cout << "Votre email est : "  << nouveau_membre[j].email  << endl;
            cout << "Votre age est : "    << nouveau_membre[j].age    << endl;
    }
}


/*=== Fonction main ===*/

int main(int argc, char* argv[]) {
    
    cout << "Je rentre dans le main" << endl;
    
    ubuntero nouveau_membre[SIZE];   // INSTANCE de la classe ubuntero (nbre d'instances = SIZE)
    
    remplissage(nouveau_membre);
    
    system("PAUSE");
    return 0;    
}

Je sèche... Apparement j'ai un segmentation fault.
Pourtant je ne vois nul part un pb de dépassement de taille de tableau.

Dernière modification par aganim07 (Le 01/11/2007, à 18:52)

Hors ligne

#24 Le 01/11/2007, à 19:05

telliam

Re : Questions sur la P.O.O. (C++ et JAVA)

il plante a quel moment?
es tu sur de ne pas rentrer des chaines de caractères supérieur à 24?


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#25 Le 01/11/2007, à 19:06

aganim07

Re : Questions sur la P.O.O. (C++ et JAVA)

telliam a écrit :

il plante a quel moment?
es tu sur de ne pas rentrer des chaines de caractères supérieur à 24?

Yep !

Il plante au moment de dire y ou n pour continuer à créer des nouveaux membres.

Hors ligne