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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [C++] Помогите с массивами...  (Прочитано 20062 раз)
0 Пользователей и 1 Гость смотрят эту тему.
FanatWin
Участник

ru
Offline Offline

WWW
« : 19-07-2009 13:04 » 

Добрый день...
Помогите найти решения (средствами C++Builder 6) в данной ситуации, или скажите, возможно-ли то, что я пытаюсь сделать?
Есть массив «№1», в котором вовремя работы программы появляются новые значения, эти значения (данные) требуется скопировать в массив «№2»  последовательно... т.е. если в первом идет 1,2,3,4, а потом 5,6,7,8,9, то в массиве «№2»  должно появиться 1,2,3,4,5,6,7,8,9...
Только сделать это нужно, не перечитывая все значения по одному, как это делает «for» или «while» Скромно так...

Пробовал через  «memcpy» и «strcpy»... неканает... А черт его знает...
Записан

Dimka
Деятель
Команда клуба

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

« Ответ #1 : 19-07-2009 14:22 » 

Сделать - возможно. Найти - это в Гугл, а не сюда.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #2 : 19-07-2009 15:43 » 

В том-то и дела, что, перед тем как, писать сюда, я "по-гуглел" денёк... Краснею но толком, не чего не нашёл... надеялся на помощь здесь... Скромно так...
То, что возможно это уже радует... значит, я, в верном направлении двигаюсь... уже спасибо... Улыбаюсь
Теперь только, осталось узнать как?
« Последнее редактирование: 19-07-2009 15:46 от FanatWin » Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 19-07-2009 16:46 » 

FanatWin, Я не совсем понял, как ты хочеш, чтоб было скопировано. При этом отвергаеш системные стандартные функции и код с применением for или while?
Можно конечно тебе еше посоветовать ассемблерную связку rep movsb. Но в принципе тоже почти самое делает вызов системных функций. Только обкрнуто в функцию.
« Последнее редактирование: 19-07-2009 16:48 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #4 : 19-07-2009 17:43 » 

Finch
Гм... немного не так, наверное, выразился... Здесь была моя ладья...
Ведь в массиве значения идут по порядку, то есть, как и в строке (в принципе это есть одно и тоже)... Так вот как скопировать из массива «№1» типа Char такую как-бы строку целиком (не посимвольно) и поместить её в другой массив «№2», а потом когда значения изменится в массиве «№1» скопировать ещё раз, и присоединить (не заменить значения, а именно присоединить) к массиву «№2»
При этом можно, конечно же, пользоваться  «for» и «while»...

Вот, наверное, понятнее объяснил... или ещё больше запутал... Здесь была моя ладья...
« Последнее редактирование: 19-07-2009 17:44 от FanatWin » Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 19-07-2009 17:48 » 

Ты хочеш автоматически синхронизировать два массива? Если у тебя будут два массива одинаковы за все время выполнения программы, тогда зачем они нужны двоем?
Самое просто решение. Один настояший массив, второй указатель на первый массив. Ты будеш работать как бы с двумя массивами. Но они будут синхронизированы и без всяких копирований.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #6 : 19-07-2009 17:57 » 

Один динамичный массив временный, в него значения попадают при прочтения отрезка бинарного файла построчно... во-втором массиве, должна скапливаться вся прочтённая инфа, из временного массива... вот такая дребедень...
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 19-07-2009 18:09 » 

А что тебя так не устраивает копирование? Если это два не зависимых массива, то без копирования из одного в другой никуда не деться. Можно конечно читать сразу в два массива из файла, но это уже изврашение.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Джон
просто
Администратор

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

« Ответ #8 : 19-07-2009 18:16 » 

А чем тебе memcpy не подходит? Тебе только нужно чтобы целевой массив был достаточной длины.

Например, у тебя есть массив pchTarget, в который ты всё "добавляешь". В pchTarget уже есть 4 элемента. Массив pchSource, в котором после события Х стало 9 элементов - пять добавились (твой пример). Тогда

memcpy(pchTarget+4, pchSource+4, 5);

pchTarget+4 - адрес начала блока после 4го элемента в целевом массиве
pchSource+4 - адрес начала блока после 4го элемента в массиве-источнике
5 - длина блока
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #9 : 19-07-2009 18:40 » 

А что тебя так не устраивает копирование? Если это два не зависимых массива, то без копирования из одного в другой никуда не деться. Можно конечно читать сразу в два массива из файла, но это уже изврашение.
Гм... вот я как бы и хочу скопировать... но у меня получается только замена инфы уже находящийся в массиве «№2» инфой из массива «№1»...
...либо какая-то каша в массиве «№2»... Здесь была моя ладья...

Код:
#define MAXLINE  1000
byte *GLOBALMASSFILE = 0;

void clean_GLOBALMASSFILE()
{
    delete[] GLOBALMASSFILE;
    GLOBALMASSFILE = 0;
}

long int OpenFileSize(FILE *iFile)
{
    fseek(iFile,sizeof(byte),2);
    long int zFileSize =  ftell(iFile);
    fseek(iFile,0,0);
    return zFileSize;
}
int main(int argc, char* argv[])
{
FILE *fp1;
clean_GLOBALMASSFILE();
long int zFileSize;
int valueString;
char line[MAXLINE], *p;
    if ((fp1 = fopen("Test.dat", "rb")) == NULL)return 1;
      zFileSize = OpenFileSize(fp1); //размер файла
      GLOBALMASSFILE  = new byte[zFileSize];

    while ((p = fgets(line, MAXLINE, fp1)) != NULL) {

    // Вот как здесь скопировать... не чего не получается
             GLOBALMASSFILE = p;


    }
        return 0;
}
Записан

Джон
просто
Администратор

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

« Ответ #10 : 19-07-2009 18:47 » 

А как ты копировал? Я ж тебе вроде всё написал, как надо использовать копирование блоков памяти. А у тебя в коде я этого что-то не вижу. Ты же написал что пробовал с memcpy, где оно?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #11 : 19-07-2009 19:05 » 

Курим внимательно мануалы
Код:
p = fgets(line, MAXLINE, fp1)
Если чтение произошло успешно, то p будет ссылаться на массив line.
Вот это
Код:
GLOBALMASSFILE = p;
Это обозначает, что GLOBALMASSFILE будет ссылаться на то место, на которое ссылается p. А так как p у тебя ранее приобрело ссылку на line. Следовательно GLOBALMASSFILE также будет ссылаться на line. При этом теряется ссылка, на выделенный ранее массив. Кстати, а что тебе мешает считать в GLOBALMASSFILE напрямую и сразу весь файл? fread вроде как никто не отменял.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #12 : 19-07-2009 19:35 » 

Код дан не весь это просто уменьшенный отрезок, где всё выкинуто и оставлено только проблемное место...

Джон пробовал делать, как ты говорил
Тестовый файл, такой
12
34
56
78

memcpy(GLOBALMASSFILE+2, p+2, 4);
и так
memcpy(GLOBALMASSFILE, p, 2);
по-разному... не получилось.

мне нужно чтобы в массиве GLOBALMASSFILE были цифры 12345678

Finch, а мне от fread этого какая разница? всё равно я буду читать строку целиком в бинарном файле (плюс в бинарнеке есть текстовые строки, которые я и ищу)
Finch, а как сделать что-бы инфа осталась, спотеряй ссылки???
« Последнее редактирование: 19-07-2009 19:38 от FanatWin » Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #13 : 19-07-2009 19:49 » 

Может быть без потери ссылки?
Действуй примерно как сказал Джон. Хотя у тебя чуть тяжеллый случай. У тебя нельзя узнать размер последнего фрагмента напрямую. Только косвенным путем.
Сейчас накидаю примерную схемку.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #14 : 19-07-2009 20:36 » 

У тебя идет работа со строками.
Код:
int main(int argc, char* argv[])
{
FILE *fp1;
clean_GLOBALMASSFILE();
long int zFileSize;
//int valueString;
char line[MAXLINE];
   if ((fp1 = fopen("Test.dat", "rb")) == NULL)return 1;
   zFileSize = OpenFileSize(fp1); //размер файла
   GLOBALMASSFILE  = new byte[zFileSize];
   
   while (fgets(line, MAXLINE, fp1) != NULL)
   {
      strcat(GLOBALMASSFILE, line);
   }
   fclose(fp1);
   printf("%s\n", GLOBALMASSFILE);
   clean_GLOBALMASSFILE();
   
   return 0;
}
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Джон
просто
Администратор

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

« Ответ #15 : 19-07-2009 20:49 » 

memcpy(GLOBALMASSFILE+2, p+2, 4); -> ОШИБКА! должно быть memcpy(GLOBALMASSFILE+2, p+2, 2);

Смотри, одной формулой ты не отделаешься. Вернее параметром:

12
memcpy(GLOBALMASSFILE, p, 2);
34
memcpy(GLOBALMASSFILE+2, p+2, 2);
56
memcpy(GLOBALMASSFILE+4, p+4, 2);
78
memcpy(GLOBALMASSFILE+6, p+6, 2);
90
memcpy(GLOBALMASSFILE+8, p+8, 2);
...

Можно представить это и так (10 элементов у нас уже в массиве)

добавляем "999"
memcpy(GLOBALMASSFILE+10+3, p+10+3, 3);

добавляем "12345"
memcpy(GLOBALMASSFILE+10+3+5, p+10+3+5, 5);

добавляем "987654321"
memcpy(GLOBALMASSFILE+10+3+5+9, p+10+3+5+9, 9);


Ну я думаю понятно. Для каждой итерации нужно знать размер добавляемого блока и адрес (смещение от начала) последнего элемента.

зы Запарилс с копипастом, теперь вроде правильно
« Последнее редактирование: 19-07-2009 20:54 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #16 : 19-07-2009 20:52 » 

Джон, Он получает в line строку.


Строка не обязательно должна быть равной MAXLINE. Поэтому, чтоб не считать в ручную длину строки. Лучше использовать функции предназначенные для строк.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Джон
просто
Администратор

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

« Ответ #17 : 19-07-2009 20:57 » 

Джон, Он получает в line строку.

Ну и что? Для логики "копирования" из массива p  в массив GLOBALMASSFILE это не имеет никакого значения. Для каждого шага итерации важно знать размер (длину) добавленых данных и смещение в обоих массивах (в общем случае оно не обязательно должно быть одинаковым).
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #18 : 19-07-2009 21:39 » 

Finch
Цитата
Может быть без потери ссылки?
Да именно это я и имел в виду...


Джон memcpy как понял теперь, я не правильно использовал... Краснею

Оба ваши способа мне подходят, именно это я и хотел...  Улыбаюсь
Спасибо вам большое...  с меня "могарыч"


 
Записан

Dimka
Деятель
Команда клуба

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

« Ответ #19 : 20-07-2009 09:09 » 

По-моему вся проблема этой задачи в правильном хранении и смещении указателей по массивам по мере чтения/записи. Применение memcpy тут к делу не относится. Но поскольку посыл был "найти готовое", то я в эту тему влезать не буду - неинтересно.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

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

« Ответ #20 : 20-07-2009 09:31 » 

Я думаю, что проблема была в недостатке опыта в использовании memcpy, ведь автор с самого начала написал, что попробовал (только не уточнил, что именно "не канает") с memcpy. Ну и как это часто бывает: "не получилось - бросил". А выяснить причину не у кого, легче попробовать другой подход: "а вдруг получится". Ну конечно понимание указателей и массивов С++ тоже важный момент.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #21 : 20-07-2009 14:04 » 

Не буду ничего говорить и без меня много сказано, меня больше всего порадовало освобождение памяти из кучи когда мы ее еще не выделили Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #22 : 20-07-2009 16:15 » 

McZim, В принципе это не большая ошибка. Если delete скормить NULL, то он ничего не будет делать. И сразу вернет выполнение.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #23 : 20-07-2009 17:20 » 

Finch, я имею ввиду в данной реализации.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines