|
Dernière réponse | |
---|---|
Sujet : [Newbie] Passage par adresse d'un tableau de structure | |
nrv_from_cnr | A 30 mois près pour moi :sarcastic: J'ai fait ça pas propre, et now je me rend compte que je vais avoir un peu de débugage en fait ;-) Merci à vous 2 pour ces discutions très instructives ! A+, Nrv :-) |
Aperçu |
---|
Vue Rapide de la discussion |
---|
nrv_from_cnr | A 30 mois près pour moi :sarcastic: J'ai fait ça pas propre, et now je me rend compte que je vais avoir un peu de débugage en fait ;-) Merci à vous 2 pour ces discutions très instructives ! A+, Nrv :-) |
deathsharp | :sol: |
Alload | A 30 secondes près :D |
Alload | Pour allouer de la mémoire:
_ malloc c'est en C. _ en C++ tu utilises new ou new[]. |
deathsharp | malloc -> pas bien en c++ :non: utilise new a la place et delete |
nrv_from_cnr | deathsharp : ta solution me plais ! Pas besoin de recorriger les 10 000 occurences dans mon Pg ;) Par contre, pour changer, je suis trop fort en C++ :pt1cable: Mais si je définit "appels" dans la classe OnPaint, j'y aurai accès ailleurs, dans les autres fonctions ?! Quand à la fonction qui alloue de la mémoire (malloc ? je sais plus moi Argh !) :eek2: Nrv :hap: |
Alload | Ben l'initialisation du vecteur semble pas avoir d'erreur pourtant. |
nrv_from_cnr | C'est clair que ça à l'air puissant !
Un Pb toutefois : ça a pas l'air de marcher ... un #include "vector.h" Ok ; En global : vector <Building*> appels ; //juste après déclaration de la structure Building Message d'erreur : "missing storage-class or type specifiers" :heink: Nrv ;-) |
deathsharp | g vue un OnPaint qq part... donc tu utilise MFC ( :o )
tu pourrais tres bien mettre
dans la definition de la classe, init a NULL dans le constructeur et puis faire une fonction qui alloue de la memoire. ( et bien deallocation dans destructeur ) [edtdd]--Message édité par deathsharp--[/edtdd] |
Alload | Ben tu pourrais faire ça, ça prendra pas trop de mémoire en trop. Mais si c'est pour l'école, ça va pas le faire devant le prof :D
Sinon, moi j'aime bien les vecteurs, c'est extrèmement pratique je trouve. |
nrv_from_cnr | Remarque j'aurai pu faire un truc dégeu :
initialiser un tableau en global, de taille [la taille maxi admissible, càd 55] :sol: Mais là, c'est vous 2 qui allaient faire un infarctus :lol: A+, Nrv ;) [edtdd]--Message édité par nrv_from_cnr--[/edtdd] |
nrv_from_cnr | Bon ben ... ch'uis un peu obligé de passer en vector alors :-)
c'est ça :heink: Ok initialisation globale alors ... Et ... même syntaxe pour pour les tableaux, dans les passages par adresse :crazy: Y perd pas le Nord le Nrv :pt1cable: |
deathsharp | mais tu peux tres bien garder ton tableau... :) ( jsuis pas un grand fana de la STL ) |
Alload | Après tu peux utiliser des fonctions membres du vecteur:
resize, erase, etc... qui sont très pratiques. |
Alload | Si tu veux utiliser un tableau dynamique, tu peux utiliser les vecteurs déclaré dans vector.h.
Si tu connais pas: _ déclarer ton vecteur: vector<building*> appels _ ajouter un membre: appels.push_back(new building) _ accéder à un membre: appels[i]->E ou appels[i]->I Un vecteur est vierge lorsque que tu l'initialises. |
nrv_from_cnr | Hé hé ...
C'est là que ça deviens rigolo (tu vas adorer , si j'ai bien compris ;) ) ... Le tableau n'est pas de taille fixe : c'est l'utilisateur qui choisi sa taille, par l'intermédiaire d'une autre boite de dialogue ; elle est initialisée de la sorte : building* appels = new Builing[Taille]; Avec "Taille" choisie par l'utilisateur donc ;-) Donc si j'ai bien compris, un tableau devant être de taille fixée, ... ??? Nrv ;-) |
Alload | Oui c'est normal, parce que tu initialises localement ton tableau, et donc tu ne peux y accèder dans une autre fonction (OnPaint).
Initialise le globalement ou simplement dans la fonction WinMain(). [edtdd]--Message édité par Alload--[/edtdd] |
deathsharp | ben la poste c pareil :( je crois que au lieu d'echanger mes francs v aller me trouver un maillot de hokey des Blackhawks :D [edtdd]--Message édité par deathsharp--[/edtdd] |
nrv_from_cnr | AAARGHH !
Non c'est pas possible ! J'ai une autre mer _ _ , mais plus petite celle là ... Dans mon App MFC Dialog Based, je déclare dans le "OnInitDialog()" mon tableau de struct ; j'y ai pas accès dans le OnPaint() ! C'est normal docteur ? A+, Nrv ;-) |
nrv_from_cnr | Moi c'est plutôt la queue à la Poste qui me tue !
Surtout qd on commence derrière les portes coulissantes :ouch: ;-) Nrv |
deathsharp | :sol: en generale jsuis pas patient sauf dans ce ke j'aime bien: style la prog par contre la queue a la banque en ce moment... :fou: |
nrv_from_cnr | PROGRAMME INTEGRALEMENT DEBUGGE ! ! ! ! En plus d'être le Dieu de la Patience deathsharp, tu es mon Dieu à moi ! ! A+ Nrv :) :) :) :) |
nrv_from_cnr | Belle philosophie, qui m'arrange en plus !
N'empêche c'est vraiment sympa ! Si tu m'as aidé : oui, j'ai appris plein de choses sur ce topic :) See ya et merci encore ! A+, Nrv :ange: |
deathsharp | juste fait gaffe avec ++ et -- si tu veux retrouver le debut apres...
tu fais une copie du pointeur a la limit |
Alload | Cool alors :) Je savais pas. Merci.
Au fait, t'es en quelle classe nrv_from_cnr pour avoir à faire un sujet comme celui-ci? |
deathsharp | sauf erreur oui |
Alload | deathsharp > si on a un pointeur vers un tableau de données, on peut se rendre à chaque élément du tableau en utilisant pointeur++, pointeur--, etc... ? |
deathsharp | tu remplace le machin par tab
tab c l'address du tableau. tu peux la repasser et sa pointera tjrs sur le tableau. par contre ne la modifie pas dans Gestion avec ++ par ex sinon ca va pointer sur un autre element que le premier. j'espere t'avoir aider :) et pi t'inquete pas t'embete pas: si tu m'embeterrai je t'aurai pas repondu :p et puis j'aime bien rendre service quand c demander gentillement hesite pas |
nrv_from_cnr | Avant tout, merci bcp pour ton implication. Ca fait vraiment plaisir de voir que l'on peut être aidé ! Cela dit c'est encore un peu différent ; je m'explique. Si je reprends ton formalisme, ce que je cherche à faire c'est appeler gestion_disp() à partir de Gestion(). void Gestion( unsigned int count, building tab[] ) { for( int i=0; i<count; i++ ) { tab[i].E = i; tab[i].I = i*2; } Gestion_disp(size, [???] ); } Et ce que je ne n'arrive pas à trouver, c'est que mettre à la place de " [???] " pour que l'on ai un passage par adresse de "tab" appartenant à Gestion(), dans Gestion_disp(). En effet, ma fonction "Gestion_disp()" (si je puis dire) agis et modifie "tab" ; il ne s'agirai pas, une fois "gestion_disp" quittée et de retour dans "gestion()", qu'aucune des modifs apportées ne soient sauvegardées ! Merci encore pour le temps que tu as pris pour me rendre service ... Une dernière question donc ;-) : je met quoi à la place de [???] ? D'avance merci et j'arrête de t'embêter ... C'est déjà abusé je trouve ... A+, Nrv ;-) |
deathsharp |
[edtdd]--Message édité par deathsharp--[/edtdd] |
nrv_from_cnr | Ce que je veux faire ... ça fait un rien compliqué à expliquer, c'est dans le cadre d'un projet d'info à rendre ... lundi.
Je ne peux t'expliquer le tout dans son ensemble, tu t'en doutes ; cela dit, à un moment donnée, je suis obligé de découper mes fonctions en morceaux (trop grosses, pas à mes yeux mais à ceux du prof). Aussi, je doit "sous traiter" certaines actions à des sous-fonctions, etc. Dans le cas courant, il me manque la syntaxe qui va bien pour faire : [Main()] building appels[25] gestion(&appels); [Gestion.cpp] gestion2(building* appels[]); Cette syntaxe est fausse : le deuxième passage par adresse est buggé jusqu'à l'os ;-) j'arrive pas à voir comment faire ... Voili voilà, en espérant ne pas avoir trop éludé ta question ... Ce qui est sûr, c'est que je n'ai pas le choix ;-) A+, Nrv ;-) [edtdd]--Message édité par nrv_from_cnr--[/edtdd] |
Alload | Tu pourrais expliquer exactement ce que tu veux faire, parce que je comprends pas ce qu'est ta fonction Gestion2(). |
nrv_from_cnr | Up !
Nrv ;-) |
nrv_from_cnr | Ca a l'air de passer comme ci-dessus.
Par contre, je veux now plus compliqué :-) : Maintenant que j'ai mon "appels[25]", je veux l'appeler de Gestion : Gestion(&appels); Qui alors cascade le traitement : [Dans Gestion.cpp] : appels[12]->I = 5 ; Gestion2(Building* appels); J'ai le droit de cascader les passages par adresse comme ça ? A+, Nrv ;-) |
nrv_from_cnr | Question stupide de ma part que la précédente ; à l'appel, ça donne quoi je voulais dire ;-) qq c du genre : Gestion(int entier, &appels); ?? A+, Nrv ;-) |
nrv_from_cnr | Merci bcp pour les réponses !
Et dans la déclaration de ma fonction Gestion(...), je marque quoi à la place des "..." ? Merci d'avance ! J'essaye ça tout de suite ... A+, Nrv ;-) |
Ventilo | Peut-être que ce qu'il voulait dire, c'est qu'il veut passer son tableau en argument...
int Gestion(building *bob) { for (int i =0; i<=25;i++) { bob++; bob->asdasdasd } return 0; } chuis pas sur... |
Alload | Pour écrire dans la tableau c'est pareil:
pointeur[x]->E = cequetuveux; pointeur[x]->I = cequetuceux; |
Alload | Pour utiliser ton tableau dans ta fonction Gestion() et pour accéder aux variables, voilà comment il faut faire:
int Gestion(building* pointeur) { //Par exemple int e, i; e = pointeur[x]->E; i = pointeur[x]->I; return 0; } |
nrv_from_cnr | Coucou !
S'il vous plais ne me prenez pas pour plus fort que je ne suis : je suis assez mauvais en C++, je commence ... J'ai la structure suivante : struct building{ int E; int I; } Je créée ensuite un tableau de cette structure : building appels[25]. Dans une fonction "Gestion(...)", je veux avoir accès en lecture-écriture à ce tableau ; quelle syntaxe écrire dans la déclaration de Gestion(...) ? A l'appel, qu'écrire ? Put... ça me gonfle de bloquer sur des trucs aussi bateau ... Svp aidez moi ça va pas vous prendre longtemps ;-) A+, Nrv ;-) [edtdd]--Message édité par nrv_from_cnr--[/edtdd] |