Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
733 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°709348
jeoff
Posté le 27-04-2004 à 09:40:44  profilanswer
 

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.

mood
Publicité
Posté le 27-04-2004 à 09:40:44  profilanswer
 

n°709387
HelloWorld
Salut tout le monde!
Posté le 27-04-2004 à 10:23:58  profilanswer
 

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.

n°709392
jeoff
Posté le 27-04-2004 à 10:29:14  profilanswer
 

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]

n°709395
jeoff
Posté le 27-04-2004 à 10:31:20  profilanswer
 

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 ;)

n°709398
antp
Super Administrateur
Champion des excuses bidons
Posté le 27-04-2004 à 10:33:11  profilanswer
 

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
n°709405
jeoff
Posté le 27-04-2004 à 10:35:17  profilanswer
 
n°710265
jeoff
Posté le 27-04-2004 à 21:28:29  profilanswer
 

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. //---------------------------------------------------------------------------

n°710268
jeoff
Posté le 27-04-2004 à 21:31:21  profilanswer
 

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. }

n°710322
antp
Super Administrateur
Champion des excuses bidons
Posté le 27-04-2004 à 23:22:51  profilanswer
 

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
n°710323
jeoff
Posté le 27-04-2004 à 23:24:23  profilanswer
 

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
mood
Publicité
Posté le 27-04-2004 à 23:24:23  profilanswer
 

n°710324
antp
Super Administrateur
Champion des excuses bidons
Posté le 27-04-2004 à 23:24:44  profilanswer
 

Et ça plante sur quelle ligne ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°710325
jeoff
Posté le 27-04-2004 à 23:26:31  profilanswer
 

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
n°710327
antp
Super Administrateur
Champion des excuses bidons
Posté le 27-04-2004 à 23:29:08  profilanswer
 

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
n°710328
jeoff
Posté le 27-04-2004 à 23:32:08  profilanswer
 

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

n°710334
antp
Super Administrateur
Champion des excuses bidons
Posté le 27-04-2004 à 23:44:07  profilanswer
 

"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
n°710337
jeoff
Posté le 27-04-2004 à 23:51:34  profilanswer
 

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
n°710339
antp
Super Administrateur
Champion des excuses bidons
Posté le 27-04-2004 à 23:53:25  profilanswer
 

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°710340
antp
Super Administrateur
Champion des excuses bidons
Posté le 27-04-2004 à 23:55:43  profilanswer
 

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
n°710341
jeoff
Posté le 27-04-2004 à 23:56:01  profilanswer
 

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

n°710343
antp
Super Administrateur
Champion des excuses bidons
Posté le 27-04-2004 à 23:58:06  profilanswer
 

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
n°710344
jeoff
Posté le 27-04-2004 à 23:58:11  profilanswer
 

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 ?

n°710345
antp
Super Administrateur
Champion des excuses bidons
Posté le 27-04-2004 à 23:59:08  profilanswer
 

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
n°710346
jeoff
Posté le 28-04-2004 à 00:00:16  profilanswer
 

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 :).

n°710347
jeoff
Posté le 28-04-2004 à 00:01:34  profilanswer
 

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 ;).

n°710362
jeoff
Posté le 28-04-2004 à 00:53:45  profilanswer
 

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] ;).

n°710507
antp
Super Administrateur
Champion des excuses bidons
Posté le 28-04-2004 à 10:38:15  profilanswer
 

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
n°712647
jeoff
Posté le 30-04-2004 à 10:46:55  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[Borland c++ builder 5] problème liste de suivisservice windows n'arrive pas à récupérer variable d'environnement :(
Windows, Linux et pourquoi pas mac ..Impossible de réccupéré une variable... [Resolu]
Compilation avec builder !Feuilles de style : CSS
Récupérer login windows d'un client [Apache => Windows && PHP4.2.0)[php] Tordu : Afficher le SUM de plusieurs DECODE passés en variable ?
Plus de sujets relatifs à : [ Borland C++ Builder ] Partager une variable sous windows (SHM style)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR