CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [BCB 6] Globlana struktora nie działa

[BCB 6] Globlana struktora nie działa

dział ogólny

[BCB 6] Globlana struktora nie działa

Nowy postprzez oneiro » poniedziałek, 22 października 2012, 00:03

Witam,

Problem jest prosty - zminne z globalnej struktury nie przekazują parametrów do funkcji (klasy). Są 4 pliki, Unit1.cpp/h raz Unt2.cpp/h

KOD cpp:     UKRYJ  
//Unit1.h
// Globalna zmienna, więc bezpośrednio w pliku nagłówka
struct SParametry
{
double  x_min_real,
        x_max_real,
        y_min_real,
        y_max_real;
};
SParametry Param;
 


Gdzieś w programie (Unit1.cpp) zmienne w strukturze są obliczane, przyjmijmy, że tak:
KOD cpp:     UKRYJ  
//Unit1.Cpp,  gdzieś w jakieś fukcji
Param.x_min_real=1;
Param.x_max=2;
Param.y_min_real=3;
Param.y_max_real=4;
 


Plik nagłowka 2-go Unita
KOD cpp:     UKRYJ  
//Unit2.h
#Include "Unit1.h"
 


A gdzieś w programie jest takie coś - dla Unit2.cpp:
KOD cpp:     UKRYJ  
//Unit2.cpp
TSkala_new :: TSkala_new( int xe0, int ye0,
int eszer, int ewys,
double xr0, double yr0,
double rszer, double rwys)
{
A = (double)eszer / rszer;
B = (double) xe0 - A * (xr0 - rszer / 2.);
C = -(double)ewys / rwys;
D = (double) ye0 - C * (yr0 + rwys / 2.);
E = rszer / (double)eszer;
F = xr0 - rszer / 2. - E * (double)xe0;
G = -rwys / (double)ewys;
H = yr0 + rwys / 2. - G * (double)ye0;
}
int TSkala_new:: daj_ekr_x( double xr)
{
return A * xr + B;
}
int TSkala_new :: daj_ekr_y( double yr)
{
return C * yr + D;
}
double TSkala_new :: daj_real_x( int xe)
{
return E * xe + F;
}
double TSkala_new::daj_real_y( int ye)
{
return G * ye + H;
}
....
....

//Gdzieś w funkcji przycisku
short ramka=10;
Graphics::TBitmap *bmp_nody;
bmp_nody = new Graphics::TBitmap;
bmp_nody->Width      =Image1->Width;
bmp_nody->Height     =Image1->Height;

TSkala_new biegunowa(ramka,ramka,bmp_nody->Width-2*ramka,bmp_nody->Height-2*ramka,(Param.x_max_real+Param.x_min_real)/2,(Param.y_max_real+Param.y_min_real)/2,(Param.x_max_real-Param.x_min_real),Param.y_max_real-Param.y_min_real);

 


I co się dziej - w clasie/funkcji TSkala_new dostaję dzielenie przez 0. Podczas debugowania (F7/F8) jak najadę myszką na wartości "x/y real max/min" to są różne od zera i w dodatku takie, że po dokonaniu obliczeń ostatnie 4 parametry są różne od zera. Ale będąc na ostatniej linii podczas debugowania i dając F7 przechodzę do funkcji TSkala_new i co - ostatnie 4 paraemtry są równe 0 - tak przekazał parametry program - dlaczego?
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB 6] Globlana struktora nie działa

Nowy postprzez polymorphism » poniedziałek, 22 października 2012, 09:46

Dlatego, ponieważ źle definiujesz zmienną globalną Param. W nagłówku musi być tylko deklaracja zmiennej, czyli:
KOD cpp:     UKRYJ  
extern SParametry Param;

a w którymś pliku CPP (unit1.cpp?) daj jej definicję, czyli po prostu:
KOD cpp:     UKRYJ  
#include "Unit1.h"
...

SParametry Param;


Generalnie rzecz biorąc w nagłówkach nie definiuje się zmiennych, i lepiej trzymaj się tego.

p.s. popraw formatowanie kodu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB 6] Globlana struktora nie działa

Nowy postprzez oneiro » poniedziałek, 22 października 2012, 13:56

Czyli w pliku h

KOD cpp:     UKRYJ  
//unit1.h
extern SParametry Param;
 


a w dowolnym pliku (najlepiej unit1.cpp)
KOD cpp:     UKRYJ  
//Unit1.cpp
struct SParametry
{
double  x_min_real,
        x_max_real,
        y_min_real,
        y_max_real;
};
SParametry Param
 
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows 7Firefox

Re: [BCB 6] Globlana struktora nie działa

Nowy postprzez polymorphism » poniedziałek, 22 października 2012, 14:05

Definicja struktury SParametry musi być w nagłówku, ponieważ inne jednostki kompilacji, w których będą odwołania do zmiennej Param, muszą wiedzieć, czym ów SParametry jest.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB 6] Globlana struktora nie działa

Nowy postprzez Cyfrowy Baron » poniedziałek, 22 października 2012, 15:17

oneiro napisał(a):a w dowolnym pliku (najlepiej unit1.cpp)


Nie w dowolnym. Jeżeli deklarujesz strukturę w pliku nagłówkowym Unit1.h to definicja musi być w pliku źródłowym Unit1.cpp, czyli nie dowolnym, ale powiązanym.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB 6] Globlana struktora nie działa

Nowy postprzez oneiro » poniedziałek, 22 października 2012, 19:11

Trochę się zamotałem, ale coś nie zadziałało z Waszymi podpowiedziami. Zadziałało w końcu taka kombinacja:

Plik Unit1.h
KOD cpp:     UKRYJ  
struct SParametry
{
double  x_min_real,
        x_max_real,
        y_min_real,
        y_max_real;
};
extern SParametry Param;
 


Plik Unit1.cpp
KOD cpp:     UKRYJ  
SParametry Param;
 



Teraz w każdym z unitów (a mam ich 4) działa bardzo dobrze.W każdym jest include Unit1.h

Gdybym definicję miał w pliku CPP to musiałbym podlinkować (tj dać include) do pliku Unit1.cpp

Nie mniej wielki dzięki za pomoc, działa :)
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości