Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Добавление в массив массива элементов


Автор: Actionman 17.12.2012, 17:16
Отредактировал!

Как реализовать такую функцию:

Имею несолько массивов с элементами
массив_А - с известным числом элементов, например a[]  = {a, b, c};
массив_Б - в нем колличество элементов может меняться от 0 до 1400 (указатель на буффер с n - элементами),  пусть  b[] = {1, 2, 3...};
массив_С - тоже, что и б, только другой буффер c[] = {а, б, в...};

Необходимо как то упрощенно расположить в массив Z с заранее неизвестным число элементов  элементы массивов A, Б и С. Получится чтото вроде: z[] = {a, b, c, 1, 2, 3.., а, б, в...}; с чем я и буду дальше плясать)

Заранее благодарю!

Автор: baldina 17.12.2012, 17:37
размер массива А, конечно, позволяет хранить содержимое трех массивов?
тогда просто скопируйте в конец сначала элементы из В, потом из С.

Автор: volatile 17.12.2012, 17:46
Actionman
Ну и в чем проблема-то?


Автор: Actionman 17.12.2012, 18:37
Цитата(volatile @ 17.12.2012,  17:46)
Actionman
Ну и в чем проблема-то?

отредактировал

Автор: feodorv 17.12.2012, 19:22
Цитата(Actionman @  17.12.2012,  19:37 Найти цитируемый пост)
отредактировал

Проблема, с которой Вы столкнулись, всё ещё не ясна.

Цитата(Actionman @  17.12.2012,  18:16 Найти цитируемый пост)
Необходимо как то упрощенно расположить в массив Z с заранее неизвестным число элементов  элементы массивов A, Б и С.

Ровно также Вы можете заказать память необходимого размера и последовательно поместить в неё содержимое массивов A, Б и С.

Может быть, массив Z как-то синхронно должен меняться с изменением одного из массивов A, Б и С? Или ещё что...

Автор: Actionman 17.12.2012, 19:44
у меня есть пакет данных - фрейм, в нем есть пара констант,  поле data и поле checksum. Data - массив, размер которого мб различным, от него зависит и контрольная сумма пакета, которую  надо  считать, не по кускам конечно же в циклах ,а  значит нужно точно знать размер . Data  может иметь размер от 1 до 1400 байт, разумеется не целесообразно делать фрейм-массив таких размеров и слать нули. Вот я и не могу организовать правильно этот фрейм.

Добавлено через 39 секунд
Цитата(feodorv @ 17.12.2012,  19:22)
Цитата(Actionman @  17.12.2012,  19:37 Найти цитируемый пост)
отредактировал

Проблема, с которой Вы столкнулись, всё ещё не ясна.

Цитата(Actionman @  17.12.2012,  18:16 Найти цитируемый пост)
Необходимо как то упрощенно расположить в массив Z с заранее неизвестным число элементов  элементы массивов A, Б и С.

Ровно также Вы можете заказать память необходимого размера и последовательно поместить в неё содержимое массивов A, Б и С.

Может быть, массив Z как-то синхронно должен меняться с изменением одного из массивов A, Б и С? Или ещё что...

да так и получается, что должен синхронно меняться.

Автор: feodorv 17.12.2012, 20:22
Цитата(Actionman @  17.12.2012,  20:44 Найти цитируемый пост)
у меня есть пакет данных - фрейм

Какого максимального размера? Почему для сборки фрейма применяются 2 буфера по 1400 байт?


Цитата(Actionman @  17.12.2012,  20:44 Найти цитируемый пост)
поле checksum

Это поле действительно для всего фрейма, или только для буфера размером 1400 байт?


Цитата(Actionman @  17.12.2012,  20:44 Найти цитируемый пост)
Data  может иметь размер от 1 до 1400 байт, разумеется не целесообразно делать фрейм-массив таких размеров и слать нули.

Конечно, нет. Но ведь можно в фрейме выделить 2 байта на хранение длины этого фрейма. И уже потом отталкиваться от значения, находящегося в этих двух байтах. Это, кстати, совершенно обычная практика.

Автор: math64 18.12.2012, 08:02
С некоторыми упрощениями, примерно так:
Код

typedef unsigned short crc_t;
#pragma pack(push,1)
struct message {
word len;
byte data[1];
};
#pragma pack(pop)
void sendMessage(word len, byte* data) {
  word size = sizeof(message)-1+len+sizeof(crc_t);
  message* m = (message*)new byte[size];
  m->len = len;
  memcpy(m->data, data, len);
  *(crc_t*)&m->data[len] = crc(m->data, len);
  sendBytes ((byte*)m, size);
  delete[] (byte*)m;
}

void receiveMessage() {
  word len;
  receiveBytes ((byte*)&len, sizeof(len));
  word size = sizeof(message)-1+len+sizeof(crc_t);
  message* m = (message*)new byte[size];
  m->len = len;
  receiveBytes (m->data, len + sizeof(crc_t));
  if (*(crc_t*)&m->data[len] == crc(m->data, len))
    processMessage (m);
  delete[] (byte*)m;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)