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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2011, 23:36   #1
andrei100
 
Регистрация: 26.09.2011
Сообщений: 4
По умолчанию массив структур в функции

учусь пользоваться структурами и функциями
Код:
struct spiski
{
	char *names;
	float chisls;
	float autos;
};
int strimr(char *s)
{
	int i=strlen(s);
	if(!i)
	return 0;
	i--;
	while ((i>=0)&(s[i]==' ')) i--;
	s[++i]=0;
	return i;
}
void scopy(char *d, char *s)
{
	while (*s)
	*d++=*s++;
	*d=0;
}
int input(char *fname,spiski *&s,int &n)
{
	FILE *f;
	if(fopen_s(&f,fname,"r")) 
	return 0;
	n=0;
	printf_s("%d",n);
	if (fscanf_s(f,"%*[ \t\n]")!=EOF)
	while(fscanf_s(f,"%*[^\n]\n")!=EOF) n++;
        s=(spiski*)malloc(sizeof(spiski*)*n);
	rewind(f);
	char buf[10];
	fscanf_s(f,"%*[ \t\n]");
	for (int i=0;i<n;i++)
	{
	fscanf_s(f,"%9[^\0]",buf,10);
	s[i].names=(char*)malloc(strimr(buf)+1);
	scopy(s[i].names,buf);
	fscanf_s(f,"%f%f\n",&s[i].chisls,&s[i].autos);
	}
	fclose(f);
	return 0;
}
void output(spiski *s, int n)
{
	for (int i=0;i<n;i++)
	printf_s("%-9s%6.0f%6.0f\n",s[i].names,s[i].chisls,s[i].autos);
}

void freenames(spiski *s, int n)
{
	for (int i=0;i<n;i++)
	free(s[i].names);
	free(s);
}
void main()
{
	spiski *s;
	setlocale(LC_CTYPE,"Russian");
	system("cls");
	char text[_MAX_PATH];
	int n,i;
        printf_s("Ввкдите имя файла:");
	scanf_s("%s",text,_MAX_PATH);
	input(text,s,n); 
       _getch();
       output(s,n);
       freenames(s,n);
}
После выполнения пишет в выводе :
HEAP[vcxz.exe]: Invalid Address specified to RtlValidateHeap( 00340000, 003470E8 )
ОС Windows инициировала точку останова в vcxz.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в vcxz.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит vcxz.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки

Последний раз редактировалось andrei100; 25.11.2011 в 23:46.
andrei100 вне форума Ответить с цитированием
Старый 26.11.2011, 16:56   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Вам не следует пользоваться нестандартными функциями типа fopen_s . Таких функций ни в стандарте С++, ни в стандарте С нет. Я предполагаю, что это функция MS VC++, но лучше не идти на поводу MS и не пользоваться его нестандартными функциями. Тем более для открытия файла нет необходимости заменять стандартную функцию fopen чем-то иным.
Так как я не знаю прототипа используемой вами функции, то вызывает сомнение ее вызов

fopen_s(&f,fname,"r");

Первым параметром является указатель на указатель?
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив структур Mehanizator Помощь студентам 5 24.08.2011 19:20
Массив структур.......на С. MARTINS Фриланс 8 07.06.2011 21:11
Массив структур, как возвращаемое значение функции BadProgrammer Общие вопросы C/C++ 1 08.11.2010 17:49
массив структур klykovka Общие вопросы C/C++ 4 19.04.2010 16:17
Массив структур velvetdust Общие вопросы C/C++ 0 21.03.2009 13:18