Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.214.155] |
|
Сообщ.
#1
,
|
|
|
RAD 2009 C++ попал на странно-непонятное поведение, добавляю переменную в хедер класса (int,bool) в Private секцию и вся программа либо валится с экземпшеном либо работает, но как будто все переменные не инициализированы конструктором (все остальные). Переставил переменную на несколько строк выше, ошибка пропала. Добавил еще одну переменную так же выше - снова ошибки.
Подскажите пожалуйста кто-нибудь сталкивался с таким поведением? Project TestRegress.exe raised exception class EAccessViolation with message 'Access violation at address 00D23E5D in module 'BORLNDMM.DLL'. Write of address 00000001'. |
Сообщ.
#2
,
|
|
|
Код давай "до" и "после".
|
Сообщ.
#3
,
|
|
|
Есть вероятность неправильного обращения с памятью в каком-то другом месте, а введение нового поля просто выявило эту проблему.
|
Сообщ.
#4
,
|
|
|
Добрый день, весь код довольно длинный и использует сторонний компонент teechart. Пытался локализовать проблему дабы уменьшить код, но не тут то было, ошибка появляется/пропадает в ответ на совершенно разные изменения кода, точнее уже не ошибка а проблема инициализации переменных класса.
Например, есть Unit1 и есть класс TSysRgrss, в хедере класса объявлены переменные, в конструкторе инициализация некоторых из них. При создании его экземпляра (одинаково для статич/динамич) в Unit1 public переменным присваиваются значения. Так вот при добавлении новых переменных в хедер класса или при комменте/раскомменте частей кода в разных местах проекта получаю непредсказуемые данные в переменных. Так для Step может быть 100 из конструктора, 20 от позднего присвоения или что угодно другое. Вот пример остановки после присвоения значения, Step содержит 1, хотя конструктор присваивает 100, а из Edit идет 20. http://imagehost.cc/image/Z5ZKF Edit содержит 20. http://imagehost.cc/image/Z5y6f Добавлено Хедер класса выглядит так #ifndef TSysRgrssH #define TSysRgrssH #include <Classes.hpp> #include "Unit1.h" //--------------------------------------------------------------------------- class TSysRgrss { private: bool Data; bool Trade; int StepCounter; double LastPrice; int jump; //double FcstAim; //double FcstDrdn; //bool FcstUp; //double y[40000]; int n; //double y2[40000]; //double y3[40000]; int z3; int n3; //double y4[1000]; int n4; struct logic { bool opbuy; bool opsell; bool clbuy; bool clsell; int opdev; int cldev; } LnLogic[3][3][3]; struct DiapArr { int Points; int MainCalcPnt; double a; double b; double stdev; double m; int trend; bool broken; bool ok; bool hitmid; } Diap1; int PrevLength; bool BuyGranted; bool SellGranted; double OpenDev; double CloseDev; double Lastbx; double LastChange; int lstdrctn; int lstchng; int lstaclr; int PrevLastPivot; int lstchng2; //--------------------------------------------------------------------------- struct PtArr { int n; bool lasthi; double pr[20]; int tick[20]; //TDateTime dt[20]; double disp[20]; } HL; //--------------------------------------------------------------------------- public: __fastcall TSysRgrss(); __fastcall ~TSysRgrss(); struct vsedata { int p; //TDateTime t[600000]; double pr[50000]; //double bid[600000]; //double ask[600000]; } vse[1]; void __fastcall NewTick(double price, int point, bool show); void __fastcall GotTrade(bool buy, double price, int id, int amount, int instr); void __fastcall RangeData(vsedata *v, double DiapMin, double DiapMax, double offset, int& pivots, int& length, double& width, double brakeratio, bool& broken, double& moveup, double& movedown, int tk, bool show); void __fastcall RangePointsSearch(vsedata *v, double DiapMin, double DiapMax, double offset, int& pivots, int& length, double& width, double brakeratio, bool& broken, int tk, bool show); int Step; int RegLength; int Compression; double Angle; double OldOrderOff; double Breakout; double MinStDev; double Stop; double MaxSize; double Size; }; #endif Конструктор //--------------------------------------------------------------------------- #pragma hdrstop #include "TSysRgrss.h" #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) __fastcall TSysRgrss::TSysRgrss() // конструктор { //инициализация Step=100; Data=false; Trade=false; vse[0].p=0; Order=0; Position=0; StepCounter=0; LastPrice=0; LastChange=0; Lastbx=0; PrevLength=200; jump=0; HL.n = 0; RegLength=200; Compression=1; //Step=100; OldOrderOff=40; Stop=30; MaxSize=1; Size=1; } __fastcall TSysRgrss::~TSysRgrss() // деструктор { // } |
Сообщ.
#5
,
|
|
|
Возможно дело в выравнивании
|
Сообщ.
#6
,
|
|
|
Возможно дело в последовательности вызовов класса где определенна переменная?
Цитата secondd @ Вот пример остановки после присвоения значения, Step содержит 1, хотя конструктор присваивает 100, а из Edit идет 20. Это не показатель, там может быть любой "мусор". |