CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

J´aide les personne en C/C++

V-Source
V-Source
Niveau 10
29 juin 2004 à 17:19:35

il y en a peut-être qui s´y intéresse mais qui pense que c´est quelque chose du style rpg maker et ils comprennet rien et abandonnent en un quart d´heure

JeanYvesYves
JeanYvesYves
Niveau 10
29 juin 2004 à 17:21:05

c´est vrai en effet...
mais bon, il y en a, quand ils essaient, y trouve un interet dans la démarche logique, et prennent du plaisir a faire de petits algos. et c´est ça qui met, lentement mais surement, sur la voie de la prog de jeu...

techslash
techslash
Niveau 8
29 juin 2004 à 19:38:24

J´aimerais savoir, en joignant à un programme une librairie statique qui, elle-même, en utilise d´autre ( donc, autrement dit, si je fais une lib static qui comporte un #include < string.h>) est-ce que le programme principal, en utilisant la prèmière librairie statique, se trouve à disposer automatiquement des deux ( logiquement il me semble que oui) ?

Je suis en train d´essayer de wrapper la lecture de . ini dans un objet ( lire un . ini étant un truc plutôt simple pour lequel j´ai déjà quelques fonctions de fait ici et là et ayant besoin de pratique en POO, c´est plutôt parfait :) ) et j´utilise un string pour être 100% positif sur l´absence de buffer overflow. Le hic c´est que je me vois mal distribuer ( j´ai pas vraiment l´intention de distribuer ça mais tant qu´à faire le travail, aussi bien le faire aussi pro que possible) une lib qui force le programme à utiliser string.h... Et je me vois tout aussi mal ajouter à mon programme une classe similaire à string mais fait de mes 10 doigts ( perte de temps).

LGV
LGV
Niveau 28
29 juin 2004 à 20:50:17

ben si tu linkes en static, tu ne distribue rien de plus que l´exe : il contient tout :) ( c´est d´ailleurs l´avantage du static...)
Donc la réponse à ta question est " oui", en faisant en static ton programme récupère toutes les fonctionnalités des librairies ; en pratique tu ne distribues JAMAIS une lib, sauf si tu fournis justement une API par exemple ( des morceaux de code que d´autres utiliseront)
En dynamique la question serait toute autre ; mais tu pourrais par exemple générer une librairie dynamique ( .dll) qui contiennent des bouts de codes externes ; bref y´a pas mal de possibilités ; )

techslash
techslash
Niveau 8
29 juin 2004 à 22:46:37

Heh bien, merci LGV, j´ai décidé de laisser tomber string.h et de faire de l´allocation dynamique. Ça m´a permis de constater un petit problème que j´ignore comment solutionner. Supposons la classe suivante:

class MyClass
{
char *txt;

public:
MyClass(void); / / Constructeur par défaut
MyClass(const char *); / / Constructeur
~MyClass(void); / / Destructeur
};

L´objectif ici étant de faire en sorte qu´il soit possible d´écrire

MyClass XXX = " voici du texte";

Et que " ..." se retrouve dans char *txt

  • Idéalement il faudrait aussi overloader l´opérateur = mais c´est pas important pour le problème ici*

Alors pour qu´il n´y ait aucun buffer overflow, il faut allouer dynamiquement txt mais c´est impossible d´initialiser une variable à l´intérieur de la déclaration d´une classe ( sauf, je pense, pour les membres const static int).

Mon idée était donc de faire... ( je ne préciserai pas ici le constructeur par défaut puisque c´est pas important pour le problème en cour)

MyClass::MyClass(const char *source)
{
char *txt = new char[sizeof(source) + 1];
strcpy(txt , source);
txt[sizeof(source)] = ´\0´;
return;
}

Et, pour le destructeur...

MyClass::~MyClass(void)
{
delete[] txt;
return;
}

Hors, l´allocation dynamique avec new se fait ( à tout le moins le texte se place et j´y ai accès sans plantage ( j´ai testé avec un printf...)) mais le delete[], lui, plante. Qu´est-ce qui se passe ?

LGV
LGV
Niveau 28
29 juin 2004 à 22:54:13

plusieurs possibilités : une première piste rapide avant que je ne repasse plus tard en détail :
sizeof(source) => sizeof(char *) => 4 ( en win32)
ce que tu veux c´est strlen(source), c-a-d le nb de caractères ; le sizeof, c´est la taille du type de données, donc la taille d´un pointeur ( d´où le 4 ^^^^)

à plus tard pour plus d´infos...

LGV
LGV
Niveau 28
29 juin 2004 à 23:25:54

petit complément :

MyClass XXX = " texte";

tout bon compilo effectuera:

MyClass XXX("texte");

1 seul ctor à la place de 2 ctors ( un par défaut, un avec param, et un opérateur d´assignation)

dans tous les cas, écrire la forme canonique est conseillée.

les ctor avec un seul param n´ont pas que des fans : meme si ça permet d´automatiser, on préfère en général les mettre explicit pour eviter de masquer du code qui peut parfois etre couteux

dans ton cas, rajouter un operateur de conversion MyClass => char * peut etre interessant

voilà voilà, de plus je pense que le strcpy copie également le \0 terminal, il ne sert donc à rien de le mettre à la main ( à vérifier)

avec le sizeof corrigé en strlen ça devrait marcher

techslash
techslash
Niveau 8
29 juin 2004 à 23:41:24

Je viens de faire le test avec strlen, ça ne fonctionne pas.

Pseudo supprimé
Pseudo supprimé 29 juin 2004 à 23:44:09

Bonjour à tout les forumeurs d´ici :d) j´ai une question j´ai quelques bases en programmation disons que mon niveau est de 2/10 en programmation pourriez vous me citer un site simple et efficace pour me permettre de comprendre un peu mieux la programmation de manière simplifiée ( pas un site de nOOb quand même :p) )

Merci d´avance

V-Source
V-Source
Niveau 10
29 juin 2004 à 23:49:00

si tu as déjà 2/10 en programmation, je te conseille plutôt de t´orienter vers un bouquin

techslash
techslash
Niveau 8
29 juin 2004 à 23:53:16

> arnaud-le-vrai

Est-ce que ta question est en rapport avec le C++ ( je veux dire, est-ce que tu cherches à comprendre ce langage en particulier) ? Si c´est le cas, je pense que le site de lapintade donne suffisement d´information pour savoir où aller pour commencer ( ça couvre un peu de tout en ce qui concerne faire des jeux en fait):
http://perso.wanadoo.fr/ck/Langages.htm

Si tu cherches à comprendre la programmation au sens général, tu aurais probablement dû partir un nouveau topic... Sinon je suppose que tu devrais te trouver un bouquin et faire des recherches sur le web. Voici un site quand même:
http://fr.wikipedia.org/wiki/Programmation

techslash
techslash
Niveau 8
29 juin 2004 à 23:57:25

En ce qui concerne mon problème j´ai fais quelques petits tests ici et là.

strlen ne change rien à la problématique. Il est vrai que j´étais dans le faux avec mon sizeof sauf que j´assignais le mot " test" ( 4 lettres) à mon char ce qui, à coup de coïncidence, a fait que l´assignation ne plantait pas. Et, d´ailleurs, merci LGV, j´avais pas vu ça venir et ça aurait définitivement planté plus tard.

Hors, présenteent, l´allocation fonctionne, c´est vraiment le delete[] qui plante. Le char dynamique est accessible, utilisable et ne semble pas contenir d´erreur.

En ce qui concerne le = ´\0´, strlen retourne le nombre de caractère en incluant celui de terminaison. Alors je suppose que l´ajouter manuellement est superflu si l´on considère que je fais un strcpy dont la source est un const char * qui contient le caractère de terminaison. Je laisse quand même l´assignation manuelle dans mon code, question d´être bien sûr.

techslash
techslash
Niveau 8
30 juin 2004 à 00:07:25

Whew j´ai mal lu MSDN, strlen EXCLU le caractère de terminaison. Bonne chose que j´ai laissé l´assignation manuelle du ´\0´.

techslash
techslash
Niveau 8
30 juin 2004 à 00:13:19

Dernier message que je poste ici à ce sujet ( à moins que quelqu´un me réponde auquel cas je vais dire merci ou que je trouve la réponse au problème :) ) .

J´ai écris un programme qui illustre le problème:

  1. include < iostream>

using namespace std;

class MyClass
{
char *txt;

public:
MyClass(void);
MyClass(const char *);
~MyClass(void);
};

MyClass::MyClass(void)
{
return;
}

MyClass::MyClass(const char *source)
{
char *txt = new char[strlen(source) + 1];
strcpy(txt , source);
txt[strlen(source)] = ´\0´;

printf("Nombre de lettres: %d\nContenu: %s\n" , strlen(txt) , txt);

return;
}

MyClass::~MyClass(void)
{
delete[] txt;
return;
}

int main(int argc , char *argv[])
{
MyClass XXX("Bonjour bonjour");
system("pause");
return EXIT_SUCCESS;
}

La compilation passe, le programme roule et ça plante à lorsque le destructeur est appellé. C´est du win32 seulement à cause de system("pause"); ( trop paresseux pour trouver quelque chose de plus propre et portable).

LGV
LGV
Niveau 28
30 juin 2004 à 00:16:44

tu pourrais mettre tout ça dans un . cpp et le paster sur www.pastebin.com ? ça nous permettrait de tester rapidement chez nous ; c´est plus facile de voir où ça foire en expérimentant

au passage, la convention C++ veut qu´on ne mette pas les void dans le proto d´une fonction/methode qui n´a pas d´argument, de meme pas de return " vide" . Bon, ça ne change rien, mais ça aide à l´uniformité lorsqu´on mixe son code avec d´autres.

LGV
LGV
Niveau 28
30 juin 2004 à 00:17:14

ah ben cool LOOL

voyons voir ça...

techslash
techslash
Niveau 8
30 juin 2004 à 00:19:52

Va pour la convention... Casteyde du cours en ligne met des void et des return; vide partout alors j´ai suivi cet exemple...

techslash
techslash
Niveau 8
30 juin 2004 à 00:22:54

Bon je suis supposé poster moins mais bhah, voilà le même code que tantôt en version plus claire:

http://webmouton.pingouin.ca/TestOvPOO.cpp

LGV
LGV
Niveau 28
30 juin 2004 à 00:24:17

trouvé ! !

le char * que tu alloue est LOCAL ! ce n´est pas le membre de ta classe, mais une var locale du constructeur

techslash
techslash
Niveau 8
30 juin 2004 à 00:28:38

En effet !

this->txt = new char[strlen(source) + 1];
strcpy(txt , source);
txt[strlen(source)] = ´\0´;

printf("Nombre de lettres: %d\nContenu: %s\n" , strlen(txt) , txt);

return;

Fait en sorte que delete[] txt ne plante pas ! !

Excellent, merci beaucoup !

Est-ce c´est propre comme façon de faire avec le this ?

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware