CArray <CPoint,&CPoint>то там совсем левые значения
От: altmenn Германия DLR IPA
Дата: 09.05.03 07:40
Оценка:
Привет, народ!
Проблема у меня — может и глупая, но найти причину не могу уже дня два!
В общем, есть 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>то там совсем левые значения
От: Кирпа В.А. Украина  
Дата: 09.05.03 07:56
Оценка:
Здравствуйте, altmenn, Вы писали:

A>
A>    t = m_ccpaPointArray[lx].x;//вот тут и начинаеться!!!
A>

A>В дебагере я виже какие значения ЗАНОСЯТЬСЯ() в Массив, а когда прихожу к значениям t, то там совсем левые значения вываливают....Прямо не знаю, что может с этим массивом произойти по дороге от одного for до другого!

А что за странная переменная lx (где она инициализирована)

Удалено избыточное цитирование. — ПК
!0xDEAD
Re: CArray <CPoint,&CPoint>то там совсем левые значения
От: Bell Россия  
Дата: 09.05.03 08:03
Оценка:
Здравствуйте, altmenn, Вы писали:

A>
A> if(itemCounter!=0)
A> { 
A>  for(int j =-1;j<=NX;j++)
A>  {
A>    t = m_ccpaPointArray[lx].x;//вот тут и начинаеться!!!
A>  }
A> }
A>}
A>


Что такое lx, и как (и где) эта переменная инициализируется?
Любите книгу — источник знаний (с) М.Горький
Re: CArray <CPoint,&CPoint>то там совсем левые значения
От: Дмитро  
Дата: 09.05.03 08:06
Оценка:
Здравствуйте, altmenn, Вы писали:

A>
A>. . .
A>  for(int j =-1;j<=NX;j++)
A>  {
A>    t = m_ccpaPointArray[ lx ].x;//вот тут и начинаеться!!!
A>  }
A>. . .
A>


Что такое lx?

--
Дмитрий
--
Дмитрий
Re[2]: CArray <CPoint,&CPoint>то там совсем левые значения
От: altmenn Германия DLR IPA
Дата: 09.05.03 08:20
Оценка:
Здравствуйте, Дмитро, Вы писали:

Д>Здравствуйте, altmenn, Вы писали:


A>
A>. . .
A>  for(int j =-1;j<=NX;j++)
A>  {
A>    t = m_ccpaPointArray[ lx ].x;//вот тут и начинаеться!!!
A>  }
A>. . .
A>


Д>Что такое lx?


Д>--

Д>Дмитрий
Sorry — кусок кода вставила...lx = j
!!!
Безвыходных ситуаций не бывает!(Правило Кирхгофа)
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 musor
int 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>то там совсем левые значения
От: Кирпа В.А. Украина  
Дата: 09.05.03 08:25
Оценка:
Здравствуйте, altmenn, Вы писали:

A>Здравствуйте, Дмитро, Вы писали:


Д>Здравствуйте, altmenn, Вы писали:


A>
A>. . .
A>  for(int j =-1;j<=NX;j++)
A>  {
A>    t = m_ccpaPointArray[ lx ].x;//вот тут и начинаеться!!!
A>  }
A>. . .
A>


Д>Что такое lx?


Д>--

Д>Дмитрий
A>Sorry — кусок кода вставила...lx = j
A>!!!

Странно что ASSERT не вылазит при доступе к индексу -1
Наверное Вы нас обманываете что в отладчике смотрите и видите левые координаты
!0xDEAD
Re[3]: CArray <CPoint,&CPoint>то там совсем левые значения
От: Bell Россия  
Дата: 09.05.03 08:30
Оценка:
Здравствуйте, altmenn, Вы писали:

AA>Sorry — кусок кода вставила...lx = j

A>!!!

Во-первых первый индекс отрицательный, во-вторых постарайся привести действительно тот код, на котором происходят ошибки.
Любите книгу — источник знаний (с) М.Горький
Re[4]: CArray <CPoint,&CPoint>то там совсем левые значения
От: altmenn Германия DLR IPA
Дата: 09.05.03 08:50
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, altmenn, Вы писали:


AA>Sorry — кусок кода вставила...lx = j

A>!!!

B>Во-первых первый индекс отрицательный, во-вторых постарайся привести действительно тот код, на котором происходят ошибки.




int ny = nStartwert;
while(nStartwert < m_sNoOfModulesY)
{
 for(int nx = 0; nx < NX; nx++)

 {...
  {
     TempVarX += TempVarX[nx + ny * NX];
     TempVarY += TempVarY[nx + ny * NX];

.....//собираю            
  m_ccpaPointArray.Add(CPoint(tempVarX/2,tempVarY/2));
  }
 }

           my_x = 0;
           st =0;
           if(NX!= 0)
            {
            dSumXY=0;
            dSumXX=0;
            for(int lx = 0; lx < NX; lx++)
            {
                my_x = m_ccpaPointArray[lx].x;                            
            }
                }
.....
nStartwert++;
}

И Еще я не понимаю как записываьться значения в массив — как стек или очередь или вообще как еще...И массив, то двумерный! А если я по нему потом как по одномерному прохожу = что за индексы мне попадаьться? Наверно это было бы везением, если бы они в той самой последовательности выходили...
Безвыходных ситуаций не бывает!(Правило Кирхгофа)
Re[2]: CArray <CPoint,&CPoint>то там совсем левые значения
От: altmenn Германия DLR IPA
Дата: 09.05.03 08:56
Оценка:
Здравствуйте, Вы писали:

А>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 musor
А>int x = pt.x;
А>int y = pt.y;
А>// x i y - imejut nevrazumitel'nye znachenija
А>


Ой! А это мне совсем не нравиться! Думаю, если бы это ьыло так, то никто бы не пользовался Array!
А про F10 мы уже где то слышалиСпасибо огромное!

Удалено избыточное цитирование. -- ПК.
Безвыходных ситуаций не бывает!(Правило Кирхгофа)
Re[5]: CArray <CPoint,&CPoint>то там совсем левые значения
От: Bell Россия  
Дата: 09.05.03 09:51
Оценка: 3 (1)
Здравствуйте, altmenn, Вы писали:

Порбуй так:
A>
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;  // granularity
        else
            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>то там совсем левые значения
От: altmenn Германия DLR IPA
Дата: 09.05.03 13:20
Оценка:
Здравствуйте, Bell, Вы писали:

Как и следовало ожидать, Вы, 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>то там совсем левые значения
От: Bell Россия  
Дата: 09.05.03 13:32
Оценка:
Здравствуйте, altmenn, Вы писали:

A>Как и следовало ожидать, Вы, Bell, оказались ну просто совешенно правы!


A>Кстати, нашла сама
Поздравляю
A>, но решила еще и проголосовать за Bella!!
A>
Спасибо
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.