На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> sizeof , Может я чего-то не допонимаю?
    Тут либо я глючу, либо...

    В общем я создаю массив:
    ExpandedWrap disabled
       
      double* result = new double[maxSize];

    , причем maxSize равно 730 (проверял), а sizeof result почему-то выдает мне 4 <_< , и при заполнении массива, все итемы с индексом более четырех имеют неопределенное значение...
    У меня вместо графика сплошные обои из синих и красных линий.... :huh:
    Кто-нибудь помогите!.. пока меня в дурку не увезли... :blink:
      result у тебя - _указатель_ на double. А указатель на современных машинах - именно 4 байта.

      Добавлено в :
      А что касается глюка
      Цитата
      все итемы с индексом более четырех имеют неопределенное значение
      то показывай, как ты там с этим массивом работаешь...
        sizeof(result) = 4, т.к. result обьявлен как double*, т.е. указатель на double.
        sizeof(*result) будет зависеть от представления double, но тоже не даст определить размер динамического массива.
        Советую использовать std::vector<double>, либо передавать maxSize непосредственно.
        При использовании double* result = new double[maxSize], result[0..maxSize-1] или result+0..maxSize-1 будет в пределах массива.
          Цитата reporter @ 28.01.04, 22:08
          А что касается глюка
          Цитата
          все итемы с индексом более четырех имеют неопределенное значение
          то показывай, как ты там с этим массивом работаешь...

          Ну как, в разных циклах добавляю значения, примерно таким методом:
          ExpandedWrap disabled
             
            void CResult::SetResult(int index, double value)
            {
                 result[index] = value;
            }

          Если приводить полностью пример, то там черт ногу сломит (много рассчетов)...

          Цитата

          При использовании double* result = new double[maxSize], result[0..maxSize-1] или result+0..maxSize-1 будет в пределах массива.

          А здесь я ничего не понял...

          Добавлено в :
          Получаю результат примерно так:
          ExpandedWrap disabled
             
            double CResult::GetResult(int index)
            {
                 return result[index];
            }
          - казалось бы проще некуда...
          В другом месте я так же поступаю с int-ом, и все нормально работает...
            Простенький пример:
            ExpandedWrap disabled
               
              enum {maxSize = 730};
              #define MAKE_RESULT(nSeed)  ((nSeed)*2.0)
               
              int main(int argc, char* argv[])
              {
                double *lpdResult = new double[maxSize];
               
                //set values
                for (int nIndex=0; nIndex < maxSize; ++nIndex)
                  lpdResult[nIndex] = MAKE_RESULT(nIndex);
               
                //change one to have "wrong" value
                lpdResult[100] = 100;
               
                //read values
                for (nIndex=0; nIndex < maxSize; ++nIndex)
                {
                  if (lpdResult[nIndex] != MAKE_RESULT(nIndex))
                    printf("WOW! It's %f at %d instead of %f\n", *(lpdResult+nIndex), nIndex, MAKE_RESULT(nIndex));
                }
               
                delete[] lpdResult;
               
                return 0;
              }


            Всё работает как и ожидалось.

            А вот твои:
            ExpandedWrap disabled
               
              double CResult::GetResult(int index){ return result[index]; }
              void CResult::SetResult(int index, double value){ result[index] = value; }

            наводят на размышления о правильности работы с классом. result, надеюсь, переменная класса?
            Ещё раз советую использовать std::vector<double>, тем более, что используется класс.
              fatalist,
              Для такого массива надо использовать другую формулу для вычисления выделенной под него памяти
              ExpandedWrap disabled
                 
                sizeof(double)*maxSize

              А если ты делаешь sizeof переменной, которая указывает в начало массива, то конечно он тебе вернет размер указателя.
                Цитата DGP @ 28.01.04, 22:57
                наводят на размышления о правильности работы с классом. result, надеюсь, переменная класса?

                Да, конечно переменная класса...
                У меня есть еще класс, там так же используется int* m_result = new int[size]; - и все нормально работает...

                Добавлено в :
                Цитата DarkKo @ 29.01.04, 05:49
                fatalist,
                Для такого массива надо использовать другую формулу для вычисления выделенной под него памяти
                ExpandedWrap disabled
                   
                  sizeof(double)*maxSize

                А если ты делаешь sizeof переменной, которая указывает в начало массива, то конечно он тебе вернет размер указателя.

                Да, я уже понял, что был не прав...

                Добавлено в :
                Короче я сделал по другому: взял CArray<double, double> B)

                Спасибо всем за помощь! :lol:
                Сообщение отредактировано: fatalist -
                  Цитата
                  DGP, 28.01.04, 19:57
                  Ещё раз советую использовать std::vector<double>, тем более, что используется класс


                  Для простых типов реккомендуется std::valarray<>.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0368 ]   [ 16 queries used ]   [ Generated: 3.05.24, 05:50 GMT ]