Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с копированием массивов  (Прочитано 9287 раз)
0 Пользователей и 1 Гость смотрят эту тему.
toshik
Гость
« : 20-11-2009 04:18 » 

Добрый день весельчяки! Подскажите, пожалуйста, что я делаю и понимаю не так
Копирую значения из одного массива во временный, чтобы у меня остались старые значения, потом в первоначальный новые копирую и у меня во временном тоже изменяются значения на новые. Почему так происходит? Адреса в памяти массивов совпадают что-ли?
Код:
//файл С
double B[500][6], BH4[500][6];

//файл С++
extern "C" double B[500][6], BH4[500][6];
double tempB[500][6];

void LoadBH4(void);

void LoadH4(void)
{
  memcpy(tempB,B,sizeof(tempB));
  memcpy(B,BH4,sizeof(B));  // значения в tempB тоже меняются на значения BH4 !!!!  :-/
}

Как мне сохранить временно первоначальные значения массива B ? (можно конечно вывести в файл, не спорю, но можно как-нибудь обойтись без этого?)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 20-11-2009 05:43 » 

не знаю, у меня всё нормально копируется, как надо

Код:
typedef double array_x_y [3][2];

array_x_y B  ={{1,2},{3,4},{5,6}} ;
array_x_y BH4={{7,8},{9,10},{11,12}} ;

array_x_y tempB ;


::memmove(tempB, B  , min( sizeof(tempB) , sizeof(B  )) );
::memmove(B    , BH4, min( sizeof(B    ) , sizeof(BH4)) );
« Последнее редактирование: 20-11-2009 05:45 от Алексей1153++ » Записан

toshik
Гость
« Ответ #2 : 20-11-2009 06:31 » 

А у меня и с функцией ::memmove не получается.
Все равно значения BH4 попадают в tempB. Т.е. все три массива одинаковые выходят
Может это от настроек компилятора зависит? у меня стоит Visual C++ Toolkit 2003
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 20-11-2009 06:34 » 

toshik, ты мой код один в один выполнил ?

Как результат смотрел - в консоль выводил или в дебагере ? А то дебагер мог косячно показать у тебя, а то и ты мог не то посмотреть. Распечатай все три массива после выполнения кода и покажи здесь
Записан

toshik
Гость
« Ответ #4 : 20-11-2009 09:09 » 

да, выполнил. Получается.
Не получается в моем листинге, копаться буду, видно где-то перезаписываются значения
Просто читал где-то, что при каком-то копировании массивов происходит копирование указателя на массив, а не значений. Тогда и получаются массивы одинаковыми. Вот и решил может у меня тот случай. Буду копать
Спасибо
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 20-11-2009 09:15 » 

Просто читал где-то, что при каком-то копировании массивов происходит копирование указателя на массив, а не значений.

Это совсем другой случай. Это когда тебе надо скопировать массив указателей. Копирование массива означает создание копий объектов содержащихся в массиве-оригинале.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 20-11-2009 09:16 » 

Указатели вместо массивов копируются, например, при "тонком" копировании объектов класса. Это когда класс содержит поле-указатель, указывающий на массив, а оператор копирования по умолчанию копирует только этот указатель.

В твоём случае, копироваться должны именно массивы. Потому что двумерный статический массив в C++ выделяется одним непрерывным куском (то есть, двумерный он чисто условно), и копируешь ты именно память по указателю. Так что тут должно быть всё ок.
Записан
toshik
Гость
« Ответ #7 : 20-11-2009 11:09 » 

Все, разобрался. У меня копирование происходило в приложении при нажатии определенной клавиши. Когда нажимал на клавишу в цикле while в функции main клавиша срабатывала несколько раз, вот и получалось ,что массив копировался несколько раз.
Вот, к примеру кусок:
Код:
#define _KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code)&0x8000)?1:0)
 
int main()
{
 while(device->run() && driver)
 {
  if (device->isWindowActive())
  {
   ...
   if(_KEYDOWN(VK_F1)) LoadBH4();
   ....
  }
 }
 device->drop();
}

Вот блин, иногда трудно такие ошибки отследить. Просто поставил прерыватель на функцию _KEYDOWN и все начало правильно копироваться. Спасибо всем большое за разъяснения по поводу копирования указателей массивов. Все встало на свои места.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 20-11-2009 11:16 » new

а просто брекпоинт можно было поставить да и всё )
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines