[ Borland C++ Builder ] Partager une variable sous windows (SHM style)

Partager une variable sous windows (SHM style) [ Borland C++ Builder ] - C++ - Programmation

Marsh Posté le 27-04-2004 à 09:40:44    

Bon alors tout d'abord, "Bonjour" :hello:
 
On galère un peu sur un problème très simple avec mon binôme qui j'en suis certain trouvera sa réponse ici.
 
Nous avons une variable déclarée dans un .h.
Nous avons 2 .cpp.
 
Le premier .cpp doit effectuer des calculs sur les variables, le second doit se servir des résultat pour faire un affichage.
 
Le .h est inclus dans les 2 .cpp.  
Je suppose que lorsque je travaille dans un .cpp, la variable existe aussi mais est dupliquée dans le second .cpp donc je me retrouve avec 2 variables de même nom initialisée à la même valeur que dans mon .h et qui ne peuvent communiquer directement entres elles.  
 
J'ai lu rapidement un thread ou on parlait de "extern", ça se rapproche de ce dont j'ai besoin ? Jsuis en stage donc j'ai pas trop le temps de regarder ça ce matin mais si c'est le cas, j'irai consulter mon bouquin sur la question.  
 
Je cherche une piste, pas une solution à mon exo ;) (qui à dit projet :whistle:) .
 
A bientôt.

Reply

Marsh Posté le 27-04-2004 à 09:40:44   

Reply

Marsh Posté le 27-04-2004 à 10:23:58    

Pblm traité X fois. Vite fait :

Code :
  1. int fonction(); // fonction est déclarée mais non définie
  2. int fonction(); // fonction est déclarée une 2° fois, pas de pblm
  3. int a; // a est déclaré _et_ défini
  4. int a; // 2° déclaration (ok) _et_ 2° définition : erreur multiples définitions
  5. extern int b; // b est seulement déclaré
  6. // dans le .c
  7. int b; // définition de b


 
Au passage, ça ressemble + à du C qu'à du C++ ton code.

Reply

Marsh Posté le 27-04-2004 à 10:29:14    

oui, mon pote fait du dév en C principalement pour ses algo et moi c'est la partie c++ pour l'interface graphique.
ca vaut ce que ca vaut [:spamafote]

Reply

Marsh Posté le 27-04-2004 à 10:31:20    

HelloWorld a écrit :

Pblm traité X fois. Vite fait :

Code :
  1. int fonction(); // fonction est déclarée mais non définie
  2. int fonction(); // fonction est déclarée une 2° fois, pas de pblm
  3. int a; // a est déclaré _et_ défini
  4. int a; // 2° déclaration (ok) _et_ 2° définition : erreur multiples définitions
  5. extern int b; // b est seulement déclaré
  6. // dans le .c
  7. int b; // définition de b


 
Au passage, ça ressemble + à du C qu'à du C++ ton code.


 
Donc avec extern, je partage le même "case mémoire" ?
Merci ;)

Reply

Marsh Posté le 27-04-2004 à 10:33:11    

extern veut dire que la variable existe mais qu'elle n'est pas définie à cet endroit là (elle le sera dans un des multiples .cpp, les .h servant alors juste à dire que ce nom de variable existe)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-04-2004 à 10:35:17    

Reply

Marsh Posté le 27-04-2004 à 21:28:29    

Bon alors j'ai testé le extern, ca compile et tout et tou sauf que à l'éxécution, je me retrouve encore avec une violation mémoire :cry:

Code :
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include "PetriUnit2.h"
  5. #include "PetriUnit1.h"
  6. #include "PetriUnit3.h"
  7. //---------------------------------------------------------------------------
  8. #pragma package(smart_init)
  9. #pragma resource "*.dfm"
  10. TForm2 *Form2;
  11. extern int* Marquage;
  12. extern int indice;
  13. //---------------------------------------------------------------------------
  14. __fastcall TForm2::TForm2(TComponent* Owner)
  15.         : TForm(Owner)
  16. {
  17. }
  18. //---------------------------------------------------------------------------
  19. void __fastcall TForm2::ButValidClick(TObject *Sender)
  20. {
  21.         int resultat;
  22.         resultat=BoxMarquage->Text.ToIntDef(-1);
  23.         if ( (resultat<=-1)||(resultat>999) )
  24.         {
  25.                 Form3->Visible=true;
  26.         }
  27.         else
  28.         {
  29.                 Marquage[indice]=resultat;
  30.                 Form1->Memo1->Lines->Add(indice);
  31.         }
  32.         Form2->Visible=false;
  33.         // AJOUTER 'Pindice+1' à la place de form 2
  34. }
  35. //---------------------------------------------------------------------------

Reply

Marsh Posté le 27-04-2004 à 21:31:21    

je précise que indice et le tableau marquage sont complété via  
ceci

Code :
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include <windows.h>
  4. #include <iostream.h>
  5. #pragma hdrstop
  6. #include "PetriUnit1.h"
  7. #include "PetriUnit2.h"
  8. //---------------------------------------------------------------------------
  9. #pragma package(smart_init)
  10. #pragma resource "*.dfm"
  11. //---------------------------------------------------------------------------
  12. fleche lien;
  13. place cercle;
  14. transition trans;
  15. coordonnees cooxy[10];
  16. multipoints multi;
  17. extern int* Marquage;
  18. extern int indice;
  19. //---------------------------------------------------------------------------
  20. .... BLABLABLA ...
  21. void saisirMarquage()
  22. {
  23.         int i,j;
  24.         Marquage=(int*)malloc(sizeof(int)*NBPlace);
  25.         for(i=0;i<NBPlace;i++)
  26.                 Marquage[i]=0;
  27.         for(i=0;i<NBPlace;i++)
  28.         {
  29.                 indice=55;//=i;
  30.                 Form2->Visible=true;
  31.                 Form2->BoxMarquage->Text="1";
  32.                 /*clrscr();
  33.                 printf("\n\nSaisissez le Marquage:\n" );
  34.                 printf("P%d = ",i+1);
  35.                 scanf("%d",&Marquage[i]);*/
  36.         }
  37.        
  38. }

Reply

Marsh Posté le 27-04-2004 à 23:22:51    

Et elles sont déclarées où les deux variables ? pcq si tu mets extern partout mais que tu ne la déclares nulle part ça n'ira pas :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-04-2004 à 23:24:23    

elle est déclarée sans le extern dans le PetriUnit1.h
J'ai une erreur à l'adresse 0000 la mémoire ne peut être read ou un truc du genre.
 
Ca sent l'alloc foireuse :whistle:


Message édité par jeoff le 27-04-2004 à 23:25:26
Reply

Marsh Posté le 27-04-2004 à 23:24:23   

Reply

Marsh Posté le 27-04-2004 à 23:24:44    

Et ça plante sur quelle ligne ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-04-2004 à 23:26:31    

Marquage[indice]=resultat;  
 
dans la Form2
 
En gros le dernier quote, c'est ma fonction qui demande pour chaque place d'ouvrir une fenêtre dans laquelle saisir le marquage pour la place.
 
La je viens de me rendre compte que mon binome et moi on est des tâches car y a rien pour arrêter la boucle le temps de la saisie utilisateur.
 
On peut faire comment pour attendre le retour de la saisie utilisateur ? :D


Message édité par jeoff le 27-04-2004 à 23:30:16
Reply

Marsh Posté le 27-04-2004 à 23:29:08    

T'as vérifié que indice avait une valeur correcte et que Marquage était bien alloué à ce moment là ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-04-2004 à 23:32:08    

Ben j'ai le (GROS GIGA) doute justement, à cause de ce que je viens d'éditer plus haut :whistle:

Reply

Marsh Posté le 27-04-2004 à 23:44:07    

"On peut faire comment pour attendre le retour de la saisie utilisateur ?"
 
La prog Windows c'est pas du séquentiel avec printf et scanf
c'est de l'événementiel.
la suite du traitement doit être lancée lors d'un clic ou d'une pression de touche.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-04-2004 à 23:51:34    

Bon alors je reviens de winxp et bon, ben ca passe toujours pas avec un forcage d'indice du tableau marquage à 0.
Si je met la variable indice à 3 par exemple, et que je fait un affichage dans form2 de sa valeur, j'obtiens 0 :'( y a problème non ...
 
Pour  Marquage[indice]=resultat;  
L'erreur exacte c'est, erreur d'écriture à l'adresse 0000...
 
Est-ce que ça pose un problème que le malloc soit fait dans form1 uniquement ?


Message édité par jeoff le 27-04-2004 à 23:52:31
Reply

Marsh Posté le 27-04-2004 à 23:53:25    

non, mais vu l'erreur je suppose que Marquage vaut NULL


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-04-2004 à 23:55:43    

Au lieu de faire Form2.visible ce que tu peux faire c'est Form2.ShowModal(), comme ça le déroulement du soft est bloqué tant que l'utilisateur ne referme pas la Form2 (bouton OK par ex).
Et ensuite tu continues à la suite de ça en récupérant la valeur entrée (et Form2 ne fait aucun traitement). Ou alors tu mets les traitements dans Form2 comme actuellement mais au moins Form1 attendra que Form2 soit refermée.
 
Parce que là dans ta boucle tu rends NBPlaces-fois de suite Form2 visible, ce qui est strictement inutile...


Message édité par antp le 27-04-2004 à 23:57:11

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-04-2004 à 23:56:01    

ben c'est ce que je pense aussi mais pourquoi NULL, j'arrive pas à trouver la réponse.
 
Je pense pas avoir fait de grosse conneries, maintenant, moi et les malloc, c'est pas toujours ça alors de manière générale, les pointeurs je m'en méfie :D

Reply

Marsh Posté le 27-04-2004 à 23:58:06    

Bah déjà là t'as un mélange de C et de C++
malloc ça n'existe plus.
En C++ on aurait fait :
 
Marquage = new int[NBPlace];  
 
et
 
delete[] Marquage;
 
pour le libérer.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-04-2004 à 23:58:11    

antp a écrit :

Au lieu de faire Form2.visible ce que tu peux faire c'est Form2.ShowModal(), comme ça le déroulement du soft est bloqué tant que l'utilisateur ne referme pas la Form2 (bouton OK par ex).
Et ensuite tu continues à la suite de ça en récupérant la valeur entrée (et Form2 ne fait aucun traitement).


 
quand tu dit refermer, c'est visible=false ou c'est autre chose niveau proprieté de la fenêtre?  
 
Sinon je suis d'accord avec ton idée mais dans ce cas, j'ai l'impression de tourner en rond dans le sens ou il faut bien que je partage une variable au moins entre les 2 Tform non ?

Reply

Marsh Posté le 27-04-2004 à 23:59:08    

Dans Builder, Fermer = Close = Hide = Visible à False = assigner qqchose à ModalResult.
Tout ça est équivalent (le dernier n'est vrai que si la fenêtre est affichée par ShowModal)
 
Le partage de variable ne pose pas de problème a priori...


Message édité par antp le 27-04-2004 à 23:59:47

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 28-04-2004 à 00:00:16    

antp a écrit :

Bah déjà là t'as un mélange de C et de C++
malloc ça n'existe plus.
En C++ on aurait fait :
 
Marquage = new int[NBPlace];  
 
et
 
delete[] Marquage;
 
pour le libérer.


 
Oui, ça vient du fait que mon binome devait bosser sur les algo et comme on savait pas comment debug, il a fait ça en C avec printf scanf le temps que j'élabore une interface graphique.
 
On peux toujours revenir dessus et réessayer :).

Reply

Marsh Posté le 28-04-2004 à 00:01:34    

antp a écrit :

Dans Builder, Fermer = Close = Hide = Visible à False = assigner qqchose à ModalResult.
Tout ça est équivalent (le dernier n'est vrai que si la fenêtre est affichée par ShowModal)
 
Le partage de variable ne pose pas de problème a priori...


ok, merci.
 
Je vais essayer de faire quelque chose avec ça ce soir, si tu me voit upper demain, c'est que j'ai pas réussi ;).

Reply

Marsh Posté le 28-04-2004 à 00:53:45    

Oui bon c'est déjà demain alors je met mon code.
 
Comment ça je suis lourd ? :o
 

Code :
  1. void saisirMarquage()
  2. {
  3.         int i,j;
  4.         Marquage=new int[NBPlace];
  5.         for(i=0;i<NBPlace;i++)
  6.                 Marquage[i]=0;
  7.         for(i=0;i<NBPlace;i++)
  8.         {
  9.                 indice=i;
  10.                 Form2->BoxMarquage->Text="1";
  11.                 Marquage[indice]=Form2->ShowModal();
  12.                 if (Marquage[indice]==-1) /*nécéssité de indice à la place de i?, hein binôme pourquoi ?*/
  13.                 {
  14.                         i--;
  15.                 }
  16.         }
  17.        
  18. }


 

Code :
  1. void __fastcall TForm2::ButValidClick(TObject *Sender)
  2. {
  3.         int resultat;
  4.         resultat=BoxMarquage->Text.ToIntDef(-1);
  5.         if ( (resultat<=-1)||(resultat>999) )
  6.         {
  7.                 Form3->ShowModal(); //blocage fenêtre tant que message d'erreur non validé par l'utilisateur
  8.                 ModalResult=-1;
  9.         }
  10.         else
  11.         {
  12.                 ModalResult=resultat;
  13.                 Form1->Memo1->Lines->Add(resultat);
  14.         }
  15.         Form2->Visible=false;
  16.         // AJOUTER 'Pindice+1' à la place de form 2
  17. }


 

Code :
  1. void __fastcall TForm3::Button1Click(TObject *Sender)
  2. {
  3.         ModalResult=-1;
  4.         Form3->Visible=false;
  5. }


 
Comment elle était bien bonne ton idée du ShowModal()/ModalResult antp ;).
 
Donc tout fonctionne au poil, un grand merci à toi maître [:plat00n].
Peut être à demain pour de nouvelles aventures [:mad_overclocker] ;).

Reply

Marsh Posté le 28-04-2004 à 10:38:15    

Note que pour la valeur de ModalResult on utilise plutôt mrOk, mrCancel et compagnie ;)
Tu peux attribuer ces valeurs à la propriété ModalResult d'un bouton qui n'a pas de OnClick. Lors de son click il attribuera au ModalResult de la form son propre ModalResult. C'est pratique pour les boutons "Annuler" qui n'ont en général pas de traitement à faire (et quand on referme la fenêtre avec le bouton "X" en haut à droite, ça renvoie mrCancel aussi il me semble).
Si tu as appeler la Form avec ShowModal, l'attribution d'une valeur à ModalResult provoquera la fermeture de la fenêtre, pas besoin de mettre Visible à False ;)


Message édité par antp le 28-04-2004 à 10:39:46

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 30-04-2004 à 10:46:55    

ok merci ;) je garde ça dans un coin . Je risque de m'en servir souvent maintenant que je sais à peu près m'en servir.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed