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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2013, 11:53   #1
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

в общем в названии темы все сказано, есть динамический массив структур, загружаю с помощью fread, как мне правильно выделить память? знаю что malloc, но как его использовать?

вот пишу

Код:
void Load(TPhoneBook *PB)
{
	FILE *fp;
	int i;

	if((fp=fopen(FileName, "r"))==NULL) 
	{
		printf("Ошибка при открытии файла.");
		return;
	}
	
	i = 1;
	PB = //видимо тут надо выделить память под первый элемент, а в цикле увеличивать i, 
            //и выделять под следующий, потом грузить, так себе это представляю
	while (fread(PB[i].N, sizeof(char),1,fp)>i)
	{
		
	}
	fclose(fp);
}
сделал так: PB = (TPhoneBook *)malloc(sizeof(TPhoneBook));
а сколько это ему памяти выделило? на 1 элемент? как выделять память на нужно количество элементов массива?

п.с. а все просек: PB = (TPhoneBook *)malloc(i * sizeof(TPhoneBook));

да кстати: fatal error C1083: Не удается открыть файл include: alloc.h: No such file or directory
это как? оО объявлен: #include <alloc.h> почему он его не находит? у меня Visual C++ 2008 Express скачана с офф сайта Microsoft

Последний раз редактировалось Stilet; 19.05.2013 в 09:00.
NewLamer&Programer вне форума Ответить с цитированием
Старый 18.05.2013, 12:16   #2
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

а все разобрался, нужен был только stdlib.h, кстати проверьте пожалуйста все ли правильно?

Код:
void Load(TPhoneBook *PB)
{
	FILE *fp;
	int i;

	if((fp=fopen(FileName, "r"))==NULL) 
	{
		printf("Ошибка при открытии файла.");
		return;
	}
	
	i = 1;
	PB = (TPhoneBook *)malloc(i * sizeof(TPhoneBook));
	while (fread(PB[i].N, sizeof(char),1,fp)>i)
	{
		fread(PB[i].N, sizeof(char), 1, fp);
		fread(PB[i].Family, sizeof(char), 1, fp);
		fread(PB[i].Name, sizeof(char), 1, fp);
		fread(PB[i].Patronymic, sizeof(char), 1, fp);
		fread(PB[i].Phone.Home, sizeof(char), 1, fp);
		fread(PB[i].Phone.Work, sizeof(char), 1, fp);
		fread(PB[i].Phone.Mobile, sizeof(char), 1, fp);
		fread(PB[i].Address.Country, sizeof(char), 1, fp);
		fread(PB[i].Address.City, sizeof(char), 1, fp);
		fread(PB[i].Address.Street, sizeof(char), 1, fp);
		fread(PB[i].Address.N_Home, sizeof(char), 1, fp);
		fread(PB[i].Address.N_Apartment, sizeof(char), 1, fp);
		fread(PB[i].Email, sizeof(char), 1, fp);
		i++;
		PB = (TPhoneBook *)malloc(i * sizeof(TPhoneBook));
	}
	fclose(fp);

}
да и еще вот так наверное будет выглядеть Add

Код:
void Add(PhoneBook EPB, TPhoneBook *PB, int *COUNT)
{
	PB = (TPhoneBook *)malloc(COUNT * sizeof(TPhoneBook));
	PB[COUNT] = EPB;
	COUNT++;
}
вот если что начинал, просто новую тему создал, до сих не напишу никак :D времени не было, а теперь обнаружил, что надо было динамический массив, вот переделываю...

http://programmersforum.ru/showthread.php?t=234486
http://programmersforum.ru/showthread.php?t=234597

ой ща капец вообще ошибок выдало помогите уже кто нибудь пожалуйста !

1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\interview, add, delete, change.cpp(42) : error C2296: *: недопустимо, левый операнд имеет тип "int *"
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\interview, add, delete, change.cpp(43) : error C2107: недопустимый индекс, косвенное обращение не разрешено
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\interview, add, delete, change.cpp(50) : error C2446: <: нет преобразования 'int *' в 'int'
1> Не существует контекста, в котором такое преобразование возможно
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\interview, add, delete, change.cpp(50) : error C2040: <: "int" отличается по уровням косвенного обращения от "int *"
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\interview, add, delete, change.cpp(53) : error C2296: *: недопустимо, левый операнд имеет тип "int *"
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\save, load.cpp(11) : error C2065: COUNT: необъявленный идентификатор
1>d:\институт\программирование\курс овая работа за 1 курс 2 семестр\kr_2s\kr_2s\save, load.cpp(93) : error C2440: =: невозможно преобразовать 'int' в 'int *'
1> Для преобразования из целого типа в указатель требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции

АП ЕПТА !!! ну где все, мне сдавать скоро

Последний раз редактировалось Stilet; 19.05.2013 в 09:02.
NewLamer&Programer вне форума Ответить с цитированием
Старый 19.05.2013, 08:59   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
interview, add, delete, change.cpp
Зачетное имя файла...
Цитата:
где все
На евровиденьи.
Цитата:
недопустимо, левый операнд имеет тип "int *"
Телепатировать прикажешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.05.2013, 09:45   #4
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Телепатировать прикажешь?
достаточно глянуть код могу сказать только что ошибки возникают как раз в этих функциях
NewLamer&Programer вне форума Ответить с цитированием
Старый 19.05.2013, 13:55   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
достаточно глянуть код
Ясно. Не буду отвлекать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.05.2013, 15:42   #6
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ясно. Не буду отвлекать.
блин ну помогите что вы в самом деле что вам надо то скажите я вообще не понимаю...
NewLamer&Programer вне форума Ответить с цитированием
Старый 19.05.2013, 16:10   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,318
По умолчанию

Код:
void
Load(TPhoneBook **PB, long *len)
{
    FILE *fp;
    if((fp = fopen(FileName, "rb")) == NULL) 
    {
        printf("Ошибка при открытии файла.");
        return;
    }
    fseek(fp, 0, SEEK_END);
    *len = ftell(fp) / sizeof(TPhoneBook);
    rewind(fp);
    *PB = (TPhoneBook *) malloc(*len * sizeof(TPhoneBook));
    fread(*PB, sizeof(TPhoneBook), *len, fp);
    fclose(fp);
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 19.05.2013 в 16:16.
BDA на форуме Ответить с цитированием
Старый 19.05.2013, 17:00   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
что вам надо то скажите
Код нужно смотреть и анализировать. Ты сказал что то что ты выложил хватит, я понял что этого мало для анализа, но хозяин-барин, поэтому и не спорю.
К примеру:
Цитата:
change.cpp(42) : error C2296: *
Ну и где я вижу что на 42 строке?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.05.2013, 10:58   #9
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

BDA, а можете если не сложно прокоментировать?
1. что за новый параметр?
2. почему открываем на "rb", а не "r"?
3. зачем перевод указателя в конец он же и так в конце вроде при открытии?
4. вот эта строка совсем не понятна: "*len = ftell(fp) / sizeof(TPhoneBook);"
5. что за rewind и зачем она?
7. да кстати тоже подумал о том что можно наверное считывать всю структуру, а не по пунктам, это хорошо
8. еще не сталкивался с формой записи **PB, зачем это?
9. и кстати куда вы дели цикл??? там же массив структур, а не один экземпляр

Stilet, ладно, попробую уточнить...

Код:
void Add(TPhoneBook EPB, TPhoneBook *PB, int *COUNT)
{
	COUNT++;
	PB = (TPhoneBook *)malloc(COUNT * sizeof(TPhoneBook)); 
//error C2296: *: недопустимо, левый операнд имеет тип "int *"

	PB[COUNT] = EPB; 
//error C2107: недопустимый индекс, косвенное обращение не разрешено
}

void Delete(TPhoneBook *PB, int N, int *COUNT)
{
	int i;
	for (i = N; i < COUNT; i++) //error C2446: <: нет преобразования 'int
 *' в 'int';  error C2040: <: "int" отличается по уровням косвенного
 обращения от "int *"
		PB[i] = PB[i+1];
	COUNT--;
	PB = (TPhoneBook *)malloc(COUNT * sizeof(TPhoneBook));
 //error C2296: *: недопустимо, левый операнд имеет тип "int *"
}

void Load(TPhoneBook *PB, int *COUNT)
{
	FILE *fp;
	int i;

	if((fp=fopen(FileName, "r"))==NULL) 
	{
		printf("Ошибка при открытии файла.");
		return;
	}
	
	i = 0;

	while (fread(PB[i].N, sizeof(char),1,fp)>i)
	{
		i++;
		PB = (TPhoneBook *)malloc(i * sizeof(TPhoneBook));
		fread(PB[i].N, sizeof(char), 1, fp);
		fread(PB[i].Family, sizeof(char), 1, fp);
		fread(PB[i].Name, sizeof(char), 1, fp);
		fread(PB[i].Patronymic, sizeof(char), 1, fp);
		fread(PB[i].Phone.Home, sizeof(char), 1, fp);
		fread(PB[i].Phone.Work, sizeof(char), 1, fp);
		fread(PB[i].Phone.Mobile, sizeof(char), 1, fp);
		fread(PB[i].Address.Country, sizeof(char), 1, fp);
		fread(PB[i].Address.City, sizeof(char), 1, fp);
		fread(PB[i].Address.Street, sizeof(char), 1, fp);
		fread(PB[i].Address.N_Home, sizeof(char), 1, fp);
		fread(PB[i].Address.N_Apartment, sizeof(char), 1, fp);
		fread(PB[i].Email, sizeof(char), 1, fp);
	}
	COUNT = i; //error C2440: =: невозможно преобразовать 'int' в 'int *'
	fclose(fp);

}
да кстати для упрощения:
Код:
void SetLength(TPhoneBook *PB, int Count)
{
	PB = (TPhoneBook *)malloc(Count * sizeof(TPhoneBook));
}
как думаете проканает?

Последний раз редактировалось Stilet; 21.05.2013 в 23:05.
NewLamer&Programer вне форума Ответить с цитированием
Старый 20.05.2013, 11:35   #10
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

Ради одной строки "безусловно" стоит писать функцию SetLength(TPhoneBook *, int), которую компилятор, с большой вероятностью, сделает inline и развернет в код без переходов.
tools вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка из файла динамического массива структур Astronomy Общие вопросы C/C++ 1 27.12.2011 21:32
запись и загрузка с бинарного файла массива структур zetaBiT Общие вопросы C/C++ 14 28.08.2011 23:24
Сохранение и загрузка динамического массива. SkAndrew Общие вопросы Delphi 0 05.05.2010 15:54
Заполнение массива структур данными из файла Brutallus Общие вопросы C/C++ 0 26.11.2009 19:01