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

C++ | Question clarifiée

techslash
techslash
Niveau 8
17 octobre 2004 à 21:55:42

Je me rends compte que mon autre topic ´Encore une question tech.´ est presque disparu. Je m´y suis étendu en clarification et il est maintenant trop long à lire. Alors je repars un topic avec uniquement la question qui me concerne:

---

J´aimerais savoir si ce processus est propre ( je résume grossièrement ici celui que j´utilise dans mon dll)...

J´ai un pointeur dans un objet

ex.:

struct MonObjet
{
GLubyte *MonPointeur

MonObjet();
~MonObjet();
void FreePtr();

}InstanceDeMonObjet;

J´ai un constructeur qui initialise le contenu de mon objet...

MonObjet::MonObjet()
{
MonPointeur = NULL;
}

J´ai un destructeur qui efface le pointeur seulement s´il n´est plus NULL... Hors, c´est un destructeur donc, normalement, une fois qu´il est lancé, pour InstanceDeMonObjet, InstanceDeMonObjet n´existe plus.

MonObjet::~MonObjet()
{

if(MonPointeur ! = NULL)
{
delete[] MonPointeur;
}

}

J´ai une fonction qui efface le pointeur sans pour autant détruire InstanceDeMonObjet.

void MonObjet::FreePtr()
{

if(MonPointeur ! = NULL)
{
delete[] MonPointeur;
}

}

J´ai une fonction - hors de l´objet - qui alloue dynamiquement MonPointeur à la grosseur " taille".

MonPointeur = new GLubyte[taille];

--

Ainsi, ma question est, si je lance

InstanceDeMonObjet.FreePtr();

est-ce que InstanceDeMonObjet va amener une opération très louche s´il repasse par la procédure qui fait

MonPointeur = new GLubyte[taille];

ou est-ce qu´il est légal de resizer un pointeur après effacement ?

Si c´est " illégal", comment pourrais-je faire pour libérer l´espace mémoire occupée par MonPointeur ( parce que, dans mon dll, c´est une image, information RGB/RGBA, qui va la-dedans, inutile de conserver ça après qu´OpenGL en fasse sa copie - question de sauver de l´espace) sans pour autant que l´objet face un truc louche si le pointeur repasse dans un resize ? Devrais-je redéclarer le pointeur après l´avoir deleter ?

Quelque chose du genre...
if(MonPointeur ! = NULL)
{
delete[] MonPointeur;
GLubyte *MonPointeur = NULL;
}

J´ai essayé de faire un resize ( sans redéclarer comme dans l´exemple précédent) sur un pointeur après un delete[] et ça n´a pas planter... mais je cherche la propreté ici !

Merci beaucoup !

MathieuN7
MathieuN7
Niveau 10
17 octobre 2004 à 22:05:06

Salut, désolé je ne peux pas t´aider pour ton problème; en revanche je me demandais si ton code serait correct si on se tenait à une programmation en C?
Car tu utilises le mot clé struct, qui n´est techniquement pas une classe, mais tu t´en sers comme tel, ce qui m´amène à penser qu´en C on peut utiliser des sortes de pseudos classes? :doute:

techslash
techslash
Niveau 8
17 octobre 2004 à 22:17:51

Heum... je ne connais pas les rigueurs du C comparativement à celle du C++. Je n´ai jamais fait de C pur, j´ai toujours travaillé dans un compilo de C++.

Je sais cependant que C ne gère pas la programmation orientée objet.

Hors, pour autant que je sache, une struct c´est comme une classe, la différence étant que, par défaut, les données qu´une struct contient sont public et non pas private. En gros, c´est de la programmation objet. Résultat, je ne crois pas que mon code fonctionne en C, non.

LGV
LGV
Niveau 28
18 octobre 2004 à 02:11:23

en C++, struct et class sont du meme ordre, il n´y a que le niveau d´acces par défaut des membres qui change ( public pour struct, private pour class). Ce code ne peut PAS compiler en C.

TechSlash : avais tu lu ma réponse sur ton post précédent ?

techslash
techslash
Niveau 8
18 octobre 2004 à 02:19:37

LGV, yep, j´ai bien lu ta réponse :) ( merci d´ailleurs). J´ai corrigé mon pojet par rapport à ce que tu m´as dis. Le problème, vois-tu, c´est que j´ai une structure qui contient ma texture dans une variable ( tableau/pointeur) ainsi que quelques autres variables qui renferment des informations encore utiles après le point où je peux vider le tableau/pointeur qui contient la texture - parce que OGL en fait sa copie -.

Alors je me dis que j´ai un objet dans lequel le tableau qui contenait des bytes de la texture est deleté. Jusque là tout beigne, ton explication m´a permis de corriger ma réallocation avec new GLubyte[0].

Mais j´aimerais pouvoir ensuite faire repasser ma structure dans la fonction qui attribue à la variable de texture le contenu RGB d´une image. Autrement dit, je veux vider un tableau qui est allouer dynamiquement et pouvoir le remplir plus tard et tout ça proprement. Ça ta réponse en le couvrait pas.

D´où ma longue " nouvelle" question qui, en gros, dit

si je delete[] un tableau alloué dynamiquement, est-ce que je peux faire un new[] dessus plus tard sans que ça soit louche.

LGV
LGV
Niveau 28
18 octobre 2004 à 02:22:11

tiens ben je viens de répondre sur l´autre en fait :D cf. ton premier topic

MathieuN7
MathieuN7
Niveau 10
18 octobre 2004 à 20:37:53

ok merci bien lgv :)
Donc même en C, on ne compile pas de struct?
Et est-ce que je peux compiler un . cpp, afin de donner un . o, et linker ce . o avec mes autres . o issus de . c, utilisant une classe définie dans le . o issu du . cpp? ( va y avoir des schémas de dessinés là :rire: )

kufa
kufa
Niveau 9
18 octobre 2004 à 20:52:45

Non, enfin techniquement c´est possible, mais c haut niveau. Le contraire est par contre plus simple:

toto.h:

void test();

toto.c->[compilo c]->toto.o

titi.hpp:

extern " C" {

  1. include " toto.h"

};

titi.cpp->[compilo c++]->titi.o

titi.o|toto.o->linker->prog

LGV
LGV
Niveau 28
18 octobre 2004 à 23:46:55

haut niveau ? un coup de précompilo pour remplacer tous les public/protected/private par rien du tout, et je vais te le faire compiler moi ton code ; ) LOOOOL ( et encore...)
mais c´est ça qu´est marrant : feinte ici, feinte là, feinte par là-bas, feinte dans le coin, etc. On n´en finit pas :D

MathieuN7
MathieuN7
Niveau 10
19 octobre 2004 à 12:49:29

Oki! ben merci bien à tous, c´est assez intéressant du coup puisque je peux utiliser du cpp tout en restant avec un code en C pur, excepté la classe!

MathieuN7
MathieuN7
Niveau 10
26 octobre 2004 à 01:57:59

mais, euh... je comprends pas trop comment je dois faire...
J´ai le prototype de ma classe dans gn.h, sa définition dans gn.cpp; j´ai compilé gn.cpp en gn.o, dans test.c j´inclus gn.h, et je tape:

  1. include " gn.h"

int main()
{
gn fstNombre(-224);
gn scndNombre(23);
(fstNombre + scndNombre).affiche();

return 0;
}

Mais j´ai plein d´erreurs??? Pourquoi? :doute:

LGV
LGV
Niveau 28
26 octobre 2004 à 02:30:23

t´aurais pas la bonne idée de nous donner les erreurs par hasard ? . ..

MathieuN7
MathieuN7
Niveau 10
26 octobre 2004 à 02:36:02

hum... non jlaurai pas eue tout seul :rire:

In file included from test.c:1:
gn.h:13: parse error before " gn"
gn.h:14: syntax error before ´{´ token
gn.h:18: parse error before ´:´ token
gn.h:20: warning: data definition has no type or storage class
gn.h:21: parse error before ´&´ token
gn.h:21: warning: data definition has no type or storage class
gn.h:23: parse error before ´;´ token
gn.h:24: warning: data definition has no type or storage class
gn.h:25: parse error before " operator"
gn.h:28: parse error before ´}´ token
test.c: In function `main´:
test.c:5: parse error before " fstNombre"
test.c:7: `fstNombre´ undeclared ( first use in this function)
test.c:7: ( Each undeclared identifier is reported only once
test.c:7: for each function it appears in.)
test.c:7: `scndNombre´ undeclared ( first use in this function)
test.c:10:2: warning: no newline at end of file

LGV
LGV
Niveau 28
26 octobre 2004 à 02:39:36

déjà ton gn.h est foireux visiblement ; pastes le code sur un site dédie et file un lien... Celui qui passera le prochain te fileras p-e un coup de main

MathieuN7
MathieuN7
Niveau 10
26 octobre 2004 à 02:47:41

ben là j´ai un souci: j´arrive plus à compiler mon . cpp :rire:
J´ai touché à qqch, mais je sais plus quoi...

pour le . h
http://walljv.free.fr/index.php?to=view&id=49

et le . cpp:
http://walljv.free.fr/index.php?to=view&id=50

Je sais que le code est dégueu lol, vous me le dites tout le temps, mais j´arrive pas à faire qqch de propre... :snif:

LGV
LGV
Niveau 28
26 octobre 2004 à 03:07:12

je n´ai pas le temps de tester sur le moment, mais qq conseils :

utilises des fonctions templates plutot que tes macros

pour les macros, parentheses les opérandes ( ça peut etre des expressions, et l´évaluation peut donner un mauvais resultat)

t´a un ; qui traine ligne 9 du . h

dans le . cpp , c´est la fete des magic numbers... fait des static const pour clarifier

oublie les alloc et les free, t´es en C++ il me semble

plein d´autres trucs, mais déjà améliorer ça, ça serait bien :)

MathieuN7
MathieuN7
Niveau 10
26 octobre 2004 à 03:09:23

comment ça la fete des magic numbers? :)
Et static const c´est quoi? parce que je connais const, mais static...

MathieuN7
MathieuN7
Niveau 10
26 octobre 2004 à 03:09:24

comment ça la fete des magic numbers? :)
Et static const c´est quoi? parce que je connais const, mais static...

LGV
LGV
Niveau 28
26 octobre 2004 à 03:13:38

magic number = nombre sans contexte aucun dont on a du mal à comprendre la signification... a regarder ton code, c´est la fete, 45, 38, 22, etc. ça ne veut rien dire si on ne comprend pas la logique de l´utilisation

alors que si tu mets des noms dessus, c´est plus clair ; exemple, si au lieu de mettre en brut 65 dans un algo qui traite des caractères, je définies une constante avec un nom explicite ( s_nAsciiA) on comprend tout de suite ce que c´est.

pour le static, je te renvoi à ton bouquin favori. Tu pourrais avoir :

static const int gn::s_nomDeMaConstante = 45;

et ça serait BCP plus clair dans le code

MathieuN7
MathieuN7
Niveau 10
26 octobre 2004 à 03:27:21

j´ai pas de bouquin, ms merci de ta réponse :)

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