Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование массива 
:(
    Опции темы
jey7
Дата 7.1.2010, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 7.1.2010

Репутация: нет
Всего: нет



Стоит такая задача есть динамический масссив

struct reader{

......
......
.....
}

int size=10;
reader *arr=new reader[size];
Теперь мне надо передать в функцию массив и дописать в него еще элементы, значит нужно и увеличить его (значит я так понимаю скопировать старый в новый который будет больше)

функция

void add (reader *arr, int size){

???

}

Это сообщение отредактировал(а) jey7 - 7.1.2010, 13:48
PM MAIL   Вверх
zim22
Дата 7.1.2010, 14:36 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(jey7 @  7.1.2010,  12:43 Найти цитируемый пост)
Теперь мне надо передать в функцию массив и дописать в него еще элементы,

используй std::vector. всё-равно у тебя с++.


--------------------
PM MAIL   Вверх
jey7
Дата 7.1.2010, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 7.1.2010

Репутация: нет
Всего: нет



Цитата(zim22 @ 7.1.2010,  14:36)
используй std::vector. всё-равно у тебя с++.




Да мы не проходили vector, все должно быть на структурах и операторе new

PM MAIL   Вверх
Metalex
Дата 7.1.2010, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



а ты сам пройди)


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
djamshud
Дата 7.1.2010, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Раз уж вектор низя, то: создавать массив через malloc, изменять размер realloc-ом, копировать - memcpy. Это все в случае, если в структуре reader простые данные.

Добавлено через 54 секунды
Metalex, нас, помнится, тоже сначала учили работать без stl;).


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
jey7
Дата 7.1.2010, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 7.1.2010

Репутация: нет
Всего: нет



Цитата(djamshud @ 7.1.2010,  14:48)
 если в структуре reader простые данные.


struct {

char Name[15];
char Surname[15];
char Patronymic[15];
float Datebirthday;
int Passport;
int Id;
int Number;
library List[5];}
PM MAIL   Вверх
djamshud
Дата 7.1.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



library - ?


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
jey7
Дата 7.1.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 7.1.2010

Репутация: нет
Всего: нет



Цитата(djamshud @ 7.1.2010,  14:53)
library - ?

libruary это вторая структура ( в которой находятся книги), читатель (reader) должен хранить в себе список книг которые у него на руках.
PM MAIL   Вверх
djamshud
Дата 7.1.2010, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



jey7, если library тоже простая, то можно смело делать так, как я писал. Под простотой я подразумевал отсутствие указателей на смежные поля. Вообще правильно это называется "плоский тип".


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
jey7
Дата 7.1.2010, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 7.1.2010

Репутация: нет
Всего: нет



Цитата(djamshud @ 7.1.2010,  14:48)
Рсоздавать массив через malloc, изменять размер realloc-ом, копировать - memcpy. Это все в случае, если в структуре reader простые данные.


такое тоже мы не проходили, подскажите как правильно:
создание
reader *arr = (reader *)malloc(sizeof(reader));// а где задать размер массива?
или :

arr2=(reader*)malloc(sizeof(reader)*size_2);

изменение
arr2=(reader*)realloc(arr2, sizeof(reader)*size_2);

если realloc увеличивает , тогда мне не нужно копирование? (если старые значения сохран в массиве)


Просто мне надо например уже в заполненный массив читателей, добавить нового. (значит нужно просто увеличить размерность, с сохранение старых значений)
PM MAIL   Вверх
djamshud
Дата 7.1.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Про malloc: если size_2 - это размер массива в штуках, то да. Обращение к структурам - как к в "обычном" массиве, т.е. arr2[i] - обращение к i-ому читателю.

Про realloc: все правильно, вторым параметром указывается новый размер блока памяти в байтах, т.е. sizeof(reader)*size_2, где size_2 - новый размер массива в штуках. При увеличении вручную копировать ничего не нужно. Также realloc-ом можно и уменьшить массив, если потребуется.

>Просто мне надо например уже в заполненный массив читателей, добавить нового.

Да, тут просто realloc. А memcpy и memmove испоьзуйте, если вам потребуется скопировать массивы куда-нибудь или к концу одного дописать другой или что-то еще в этом духе.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
jey7
Дата 7.1.2010, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 7.1.2010

Репутация: нет
Всего: нет



Цитата

arr2=(reader*)malloc(sizeof(reader)*size_2);


компилятор ругается на arr2? он не понимает что arr2 относится к reader. error C2065: 'arr2' : undeclared identifier.

Я что то пропустил?
приходится дописывать reader * arr2=(reader*)malloc(sizeof(reader)*size_2); - это правильно

Это сообщение отредактировал(а) jey7 - 7.1.2010, 16:00
PM MAIL   Вверх
djamshud
Дата 7.1.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



struct reader *arr2=...;

Добавлено через 1 минуту и 17 секунд
Т.е. вы пропустили объявление переменной.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
jey7
Дата 7.1.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 7.1.2010

Репутация: нет
Всего: нет



да все работает, класс  smile .



Еще вопрос по теме, подскажите как мне в reader быть с library List[5];

заполнение у меня работает с помощью strcpy (arr2[i].Patronymic,patronymic);
как мне заполнить reader который обращается к library.?

strcpy (arr2[i].List.Name,????)(library уже хранит в себе книги, у нее массив arr использ.)

Это сообщение отредактировал(а) jey7 - 7.1.2010, 20:14
PM MAIL   Вверх
bsa
Дата 10.1.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



jey7, для подобных целей используются, обычно, (двусвязные) списки, а не массивы. Так как операции добавления удаления в них очень дешевые (в отличие от массивов), а плата - 2 дополнительных указателя на каждый элемент списка. В случае с книгами, то их лучше хранить в отдельном списке, который находится вне объекта читателя. А в объекте читателя уже должен находиться список указателей на книги... Список, конечно, сделать сложней, чем массив, зато работать будет быстрей да и указателями на его элементы можно пользоваться спокойно без опасения, что они "одичают" (станут невалидными).
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0550 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.