Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2015, 11:20   #11
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

Я могу вас попросить показать пример на коленке?
makar3000 вне форума Ответить с цитированием
Старый 16.11.2015, 11:35   #12
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Пример чего? Я о том, что не надо решать всю задачу "сделать чтоб массив структур был не фиксированного размера, и сохранялся в файл, и загружался из него, и еще в блекджек играл". Для начала надо решить задачу "как создавать массив не фиксированного размера"

https://ru.wikipedia.org/wiki/%D0%94....D0.B8_C.2B.2B

Я кстати не понял где вы у себя нашли двухмерный массив, вроде все одномерные. Двухмерный это когда элемент массива является массивом.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.11.2015, 12:36   #13
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

Разобрался, но не до конца...
В моем примере я присваиваю переменной (_base) структуру и расширяю ее. А как мне не присваивать к переменной(_base) область видимости которой только внутри функции(createDB). Как мне работать непосредственно с самой структурой (base)?

Код:
typedef struct {
	int id;
	int productID;
	char name[20];
} base;

void createDB()
{
	FILE *fileDB;
	base *_base = (base*)malloc(sizeof(base)); // выделит памяти под 1 структуру
	int i = 0;
	fileDB = fopen(db, "r");
		
	while( ! feof(fileDB) )
	{
		char *pos;
		fscanf(fileDB, "%d|%d|%d|", &_base[i].id, &_base[i].productID);
		fgets(_base[i].name, MAX_NAME, fileDB);
		pos = strrchr(_base[i].name, '\n');
		if(pos)
			*pos = 0;
		i++;
		_base = realloc(_base,sizeof(base)*(i+1));
	}

//	strcpy ( base, _base ); 
	printf("%s", _base[1].name);//it's ok

	fclose(fileDB);
}
makar3000 вне форума Ответить с цитированием
Старый 17.11.2015, 13:08   #14
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что-то не понял вопрос.

base в этом коде (typedef struct {...} base) это просто тип данных, а не глобальная переменная.
Ну как "шаблон" для создания на его основе своего экземпляра такой структуры.

Кстати, обычно когда массив так расширяют, то делают не +1, а *2. Ну и размер в отдельной переменной хранить.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.11.2015, 13:14   #15
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
base в этом коде (typedef struct {...} base) это просто тип данных, а не глобальная переменная.
Т.е мне необходимо создать глобальную переменную и с ней играться уже в любой функции. А как мне ее огласить ? После структуры : database *base ?


Цитата:
Кстати, обычно когда массив так расширяют, то делают не +1, а *2. Ну и размер в отдельной переменной хранить.
Так если я буду счетчик умножать на два то буду получать старые данные в двойном размере. Зачем это делать если я могу получать текущий размер и добавлять кол-во записей на счетчике + 1 ?

Размер, вы имеете ввиду конкретно в данной функции? Огласить его в самом начале и использовать переменную?
makar3000 вне форума Ответить с цитированием
Старый 17.11.2015, 13:28   #16
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Код:
typedef struct {
	int id;
	int productID;
	char name[20];
} DatabaseRecord;

DatabaseRecord *dbRecords = 0;
Не счетчик, а память перевыделять добавляя не по 1 элементу, а в 2 раза больше текущего, потому что выделять 100500 раз память под 1,2,3, ..., 100498, 100499, 100500 элементов гораздо медленнее и т.д. Ну и хранить в двух переменных кол-во заполненных элементов (использовать при выводе и прочем взаимодействии) и под сколько выделено (проверять при добавлении есть ли еще место, перевыделять снова увеличивая в 2 раза если нет).

Тут с несколькими элементами смысла может и не особо много, просто все нормальные универсальные реализации динамических массивов (например vector в С++) примерно так делают.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 17.11.2015 в 16:21.
Alex11223 вне форума Ответить с цитированием
Старый 17.11.2015, 13:45   #17
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

Проблема в том что изначально массив пуст. Эта функция срабатывает в момент подгрузки main, заполняя пустой массив данными, поэтому заранее увеличить массив в два раза я не могу.

А второе вы имеете ввиду что мол лучше сразу указывать кол-во данных в массиве? Это конечно лучше, но я не смогу узнать реальное кол-во данных в нем, если не буду использовать доп. переменную (а мне нельзя этого делать)
makar3000 вне форума Ответить с цитированием
Старый 17.11.2015, 13:47   #18
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

Если вместо _base = realloc(_base,sizeof(base)*(i+1));

буду использовать _base = realloc(_base,sizeof(base)*2);

Память ведь будет каждый раз увеличиваться в два раза чем прежде, по мойму это больше вредит?

Последний раз редактировалось makar3000; 17.11.2015 в 13:49.
makar3000 вне форума Ответить с цитированием
Старый 17.11.2015, 14:46   #19
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык надо не каждый раз перевыделять, а только когда счетчик заполненных элементов (обычно называется size или count) достигнет количества выделенных (обычно называется capacity).

Код:
array = выделить например под 2;
size = 0;
capacity = 2;

ДобавитьЭлемент(data)
{
    if (capacity == size)
    {
        capacity *= 2;
        array = перевыделить под capacity;
    }
    array[size++] = data; // эквивалентно array[size] = data; size++;
}
http://stackoverflow.com/a/3536261/964478
https://www.happybearsoftware.com/im...-dynamic-array
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 17.11.2015 в 14:53.
Alex11223 вне форума Ответить с цитированием
Старый 17.11.2015, 15:25   #20
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

Не понимаю как я могу это использовать в своей задаче...
Что бы создать array мне нужно кол-во данных в файле (строк) их я узнаю при добавлении уже в массив. Мне что сделать два цикла? один который сначала считает, а другой уже заполняет массив?



И такой вопрос, как я понял, sizeof(base)/sizeof(base[0]) не работает с массивами на которые выделена память... Подскажите, как тогда подсчитать кол-во элементов ?
makar3000 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как при указании типа переменной сослаться на файл? fezilk25 Общие вопросы Delphi 1 25.04.2013 23:45
Сохранение формы в файл. КАК? Pavelsss JavaScript, Ajax 6 28.12.2012 15:59
Сохранение структуры в файл Fellics{новичок} Общие вопросы Delphi 20 20.11.2011 20:21
сохранение нескольких излбражений в один файл.. как? IGWI Мультимедиа в Delphi 7 18.11.2008 23:16
Сохранение в файл сложной динамической структуры _Инженер_ Общие вопросы Delphi 24 20.10.2008 09:38