Привет, народ!
Проблема у меня — может и глупая, но найти причину не могу уже дня два!
В общем, есть CArray
typedef CArray<CPoint, CPoint&> CPOINTARRAY;
Он, в свою очередь — являеться членом класса, ну скажем с именем ClassLine,где используется сделуюшим образом
void ClassLine::function()
{
for(int i = -1;i<=NX, i++)
{
tempVarX +=tempVarX/2;
tempVarY +=tempVarY/2;
itemCounter++;
m_ccpaPointArray.Add(CPoint(tempVarX /2,tempVarY/2));
}
if(itemCounter!=0)
{
for(int j =-1;j<=NX;j++)
{
t = m_ccpaPointArray[lx].x;//вот тут и начинаеться!!!
}
}
}
В дебагере я виже какие значения ЗАНОСЯТЬСЯ() в Массив, а когда прихожу к значениям t, то там совсем левые значения вываливают....Прямо не знаю, что может с этим массивом произойти по дороге от одного for до другого!
Сразу скажу, что точно с этим массивом больше нигде не работаю! Перед работой — обнуляю...
Кароче — хелп!
Безвыходных ситуаций не бывает!(Правило Кирхгофа)
Re: CArray <CPoint,&CPoint>то там совсем левые значения
A> t = m_ccpaPointArray[lx].x;//вот тут и начинаеться!!!
A>
A>В дебагере я виже какие значения ЗАНОСЯТЬСЯ() в Массив, а когда прихожу к значениям t, то там совсем левые значения вываливают....Прямо не знаю, что может с этим массивом произойти по дороге от одного for до другого!
А что за странная переменная lx (где она инициализирована)
Удалено избыточное цитирование. — ПК
!0xDEAD
Re: CArray <CPoint,&CPoint>то там совсем левые значения
Re: CArray <CPoint,&CPoint>то там совсем левые значения
От:
Аноним
Дата:
09.05.03 08:23
Оценка:
Здравствуйте, altmenn, Вы писали:
A>В дебагере я виже какие значения ЗАНОСЯТЬСЯ() в Массив, а когда прихожу к значениям t, то там совсем левые значения вываливают....Прямо не знаю, что может с этим массивом произойти по дороге от одного for до другого! A>Сразу скажу, что точно с этим массивом больше нигде не работаю! Перед работой — обнуляю...
Hmm, eto polnyi kod? Esli polnyi, to ja ne ponimaju chto eto za 'lx' po kotoromu indeksiruetsia massiv. Osobo interesuet vtoroj cikl, radi uproschenija ty nichego nevykinul?
Chto v dannom sluchae nepravil'no ne vizhu, no mogu podelit'sia sobstvennym opytom:
CArray rezerviruet pamiat' dlia sebia blokami(kazetsia po 4 objekta).
CArray<CPoint, CPoint&> MyArr; // V pamiati vydeliaetsia mesto dlia 4 CPoint
MyArr.Add(CPoint(10, 19));
CPoint& pt = MyArr[0];
MyArr.Add(CPoint(++pt.x, ++pt.y); // Ispol'zuja reference na pervyi element massiva dobavliaem novye elementy
MyArr.Add(CPoint(++pt.x, ++pt.y);
MyArr.Add(CPoint(++pt.x, ++pt.y);
MyArr.Add(CPoint(++pt.x, ++pt.y); // Tak kak rezervirovannoj pamiati nehvataet, CArray vydeliaet bol'shij blok
// pamiati, kopiruet tuda starye elementy i udaliaet(delete) staryi blok pamiati.
// Vse, zdes' pt uze ukazyvaet na musorint x = pt.x;
int y = pt.y;
// x i y - imejut nevrazumitel'nye znachenija
Oshibka mozhet byt' sviazana s etim. Sovetuju zakinut' v quick watch pervyi element svoego masiva i prodebuggit' etu funkciju shag za shagom(F10 v VS6.0) i togda naidesh' mesto v kotorom on isportitsia.
Re[3]: CArray <CPoint,&CPoint>то там совсем левые значения
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, altmenn, Вы писали:
AA>Sorry — кусок кода вставила...lx = j A>!!!
B>Во-первых первый индекс отрицательный, во-вторых постарайся привести действительно тот код, на котором происходят ошибки.
И Еще я не понимаю как записываьться значения в массив — как стек или очередь или вообще как еще...И массив, то двумерный! А если я по нему потом как по одномерному прохожу = что за индексы мне попадаьться? Наверно это было бы везением, если бы они в той самой последовательности выходили...
Безвыходных ситуаций не бывает!(Правило Кирхгофа)
Re[2]: CArray <CPoint,&CPoint>то там совсем левые значения
A>int ny = nStartwert;
m_ccpaPointArray.RemoveAll();//Если конечно не требуется хранить результаты предыдущих вызовов
m_ccpaPointArray.SetSize((m_sNoOfModulesY - nStartwert)*NX);//Зарезервировать память, чтобы не было тормозов из-за ностоянных перевыделений
A>while(nStartwert < m_sNoOfModulesY)
A>{
A> for(int nx = 0; nx < NX; nx++)
A> {...
A> {
A> TempVarX += TempVarX[nx + ny * NX];
A> TempVarY += TempVarY[nx + ny * NX];
A>.....//собираю m_ccpaPointArray[nx + (nStartwert - ny)*NX] = CPoint(tempVarX/2,tempVarY/2);//Лучше видно, в какую позицию записывается элемент
A>// m_ccpaPointArray.Add(CPoint(tempVarX/2,tempVarY/2));
A> }
A> }
A> my_x = 0;
A> st =0;
A> if(NX!= 0)
A> {
A> dSumXY=0;
A> dSumXX=0;
A> for(int lx = 0; lx < NX; lx++)
A> {
A> my_x = m_ccpaPointArray[[b]lx + (nStartwert - ny)*NX].x;[/b]
A> }
A> }
A>.....
A>nStartwert++;
A>}
A> A>И Еще я не понимаю как записываьться значения в массив — как стек или очередь или вообще как еще...
CArray::Add добавляет элемент в конец массива. При необходимости размер массива увеличивается. A>И массив, то двумерный!
Массив одномерный, просто происходит "развертка" индекса. A>А если я по нему потом как по одномерному прохожу = что за индексы мне попадаьться? Наверно это было бы везением, если бы они в той самой последовательности выходили...
Нужно производить аналогичную развертку индексов (я именно это и сделал, надеюсь это то, что нужно. Иначе подробнее опиши задачу — что есть, и что нужно получить)
Любите книгу — источник знаний (с) М.Горький
Re[3]: CArray <CPoint,&CPoint>то там совсем левые значения
От:
Аноним
Дата:
09.05.03 13:09
Оценка:
Здравствуйте, altmenn, Вы писали:
A>Ой! А это мне совсем не нравиться! Думаю, если бы это ьыло так, то никто бы не пользовался Array!
A nichego smeshnogo zdes' net. Ty hot' proboval moj primer prognat'? I delo ne v CArray, a v tom chto vozvraschaetsia reference(mog by byt' i pointer, mozhno i kopiju objekta, no eto neeffektivno).
Ty posmotri SetSize(int nNewSize, int nGrowBy) funkciju CArray'ja, uvidesh' tam i takoe:
if (nGrowBy == 0)
{
// heuristically determine growth when nGrowBy == 0
// (this avoids heap fragmentation in many situations)
nGrowBy = m_nSize / 8;
nGrowBy = (nGrowBy < 4) ? 4 : ((nGrowBy > 1024) ? 1024 : nGrowBy);
}
int nNewMax;
if (nNewSize < m_nMaxSize + nGrowBy)
nNewMax = m_nMaxSize + nGrowBy; // granularityelse
nNewMax = nNewSize; // no slush
ASSERT(nNewMax >= m_nMaxSize); // no wrap around#ifdef SIZE_T_MAX
ASSERT(nNewMax <= SIZE_T_MAX/sizeof(TYPE)); // no overflow#endif
TYPE* pNewData = (TYPE*) new BYTE[nNewMax * sizeof(TYPE)];
// copy new data from old
memcpy(pNewData, m_pData, m_nSize * sizeof(TYPE));
// construct remaining elements
ASSERT(nNewSize > m_nSize);
ConstructElements<TYPE>(&pNewData[m_nSize], nNewSize-m_nSize);
// get rid of old stuff (note: no destructors called)delete[] (BYTE*)m_pData;
m_pData = pNewData;
m_nSize = nNewSize;
m_nMaxSize = nNewMax;
Re[6]: CArray <CPoint,&CPoint>то там совсем левые значения
Как и следовало ожидать, Вы, Bell, оказались ну просто совешенно правы!
Вот уж этот резет да ремув!
Кстати, нашла сама, но решила еще и проголосовать за Bella!!
B>Здравствуйте, altmenn, Вы писали:
B>Порбуй так: A>
A>int ny = nStartwert;
B>m_ccpaPointArray.RemoveAll();//Если конечно не требуется хранить результаты предыдущих вызовов
B>m_ccpaPointArray.SetSize((m_sNoOfModulesY - nStartwert)*NX);//Зарезервировать память, чтобы не было тормозов из-за ностоянных перевыделений
A>while(nStartwert < m_sNoOfModulesY)
A>{
A> for(int nx = 0; nx < NX; nx++)
A> {...
A> {
A> TempVarX += TempVarX[nx + ny * NX];
A> TempVarY += TempVarY[nx + ny * NX];
A>.....//собираю
B> m_ccpaPointArray[nx + (nStartwert - ny)*NX] = CPoint(tempVarX/2,tempVarY/2);//Лучше видно, в какую позицию записывается элемент
A>// m_ccpaPointArray.Add(CPoint(tempVarX/2,tempVarY/2));
A> }
A> }
A> my_x = 0;
A> st =0;
A> if(NX!= 0)
A> {
A> dSumXY=0;
A> dSumXX=0;
A> for(int lx = 0; lx < NX; lx++)
A> {
A> my_x = m_ccpaPointArray[[b]lx + (nStartwert - ny)*NX].x;[/b]
A> }
A> }
A>.....
A>nStartwert++;
A>}
A> A>И Еще я не понимаю как записываьться значения в массив — как стек или очередь или вообще как еще... B>CArray::Add добавляет элемент в конец массива. При необходимости размер массива увеличивается. A>И массив, то двумерный! B>Массив одномерный, просто происходит "развертка" индекса. A>А если я по нему потом как по одномерному прохожу = что за индексы мне попадаьться? Наверно это было бы везением, если бы они в той самой последовательности выходили... B>Нужно производить аналогичную развертку индексов (я именно это и сделал, надеюсь это то, что нужно. Иначе подробнее опиши задачу — что есть, и что нужно получить)
Безвыходных ситуаций не бывает!(Правило Кирхгофа)
Re[7]: CArray <CPoint,&CPoint>то там совсем левые значения