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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2012, 22:35   #1
Hacker)))
Новичок
Джуниор
 
Регистрация: 08.03.2012
Сообщений: 2
По умолчанию Проблема с динамической памятью в си

Проблема доступа к елементам динамического массива. Есть файл структур. Его можно редактировать, дописывать и удалять структуры.Нужно вывести стрктуры в порядке возростания или убывание стоимости. Для сортировки выделяю с динамической памяти массив размером в файл. Сортировка работает нормально и выводятся отсортированые данные, но если запустить процедуру сортировки после дописывания записей в конец файла то выводятся такие данные как на скришоте. Подскажите в чём проблема.
процедура сортировки:
Код:
int sort()
{
  f=fopen("rezult.dat","rb");
  if(f==NULL) puts("fail zapisey ne nayden");else
    if(filelength(fileno(f))==0) printf("baza dannuh pusta");
    else
    {
      printf("%i",filelength(fileno(f)));
      getch();
      fclose(f);
      f=fopen("rezult.dat","rb");
      tov *mas;
      for (i=9;i<=17;i++)
      {
	gotoxy(21,i);
	printf("--------------------------------------------");
	i++;
      }
      for (i=10;i<17;i++)
      {
	gotoxy(64,i);
	printf("|");
	gotoxy(21,i);
	printf("|");
      }
      gotoxy(24,10);
      printf("Zdelayte vubor");
      gotoxy(22,12);
      printf("1 - vuvesti u poryadke vozrostaniya chenu");
      gotoxy(22,14);
      printf("2 - vuvesti u poradke ubuvaniya chenu");
      gotoxy(22,16);
      printf("Esc - vuyti v glavnoe menu");
      do
      {
	us=getch();
	if(us==27){fclose(f); return 0;}
      }
      while((us!='1')&&(us!='2'));
      clrscr();
      j=filelength(fileno(f))/sizeof(z);

      mas=(tov*)calloc(j,sizeof(tov));
      for(i=0;i<j;i++)
      {
	fread(&z,sizeof(z),1,f);
	mas[i]=z;
	if((mas[i].date.day>=10)&&(mas[i].date.mon>=10))
	 printf("%-5i%-18s%-18s%-10.2f%-7i%i.%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year)    ;
	 else if ((mas[i].date.day<10)&&(z.date.mon<10))
	      printf("%-5i%-18s%-18s%-10.2f%-7i0%i.0%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year)    ;
	      else if(mas[i].date.day<10) printf("%-5i%-18s%-18s%-10.2f%-7i0%i.%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year)    ;
		   else printf("%-5i%-18s%-18s%-10.2f%-7i%i.0%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year)    ;



      }
      getch();
      fclose(f);
      int  left=0,right=j-1;
      printf("\n");
      while(left<right)
      {
	for(i=left;i<=right;i++)
	{
	  if (mas[i].price>mas[i+1].price)
	  {
	     z=mas[i];
	     mas[i]=mas[i+1];
	     mas[i+1]=z;
	  }

	}
	for(i=right;i>left;i--)
	{
	  if (mas[i].price<mas[i-1].price)
	  {
	     z=mas[i];
	     mas[i]=mas[i-1];
	     mas[i-1]=z;

	  }
	}

	left++;
      }
      
      if(us=='1')
      for(i=0;i<j;i++)
      {
	if((mas[i].date.day>=10)&&(mas[i].date.mon>=10))
	 printf("%-5i%-18s%-18s%-10.2f%-7i%i.%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year)    ;
	 else if ((mas[i].date.day<10)&&(z.date.mon<10))
	      printf("%-5i%-18s%-18s%-10.2f%-7i0%i.0%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year)    ;
	      else if(mas[i].date.day<10) printf("%-5i%-18s%-18s%-10.2f%-7i0%i.%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year)    ;
		   else printf("%-5i%-18s%-18s%-10.2f%-7i%i.0%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year)    ;
      }
      else
      for(i=j-1;i>=0;i--)
      {

	if((mas[i].date.day>=10)&&(mas[i].date.mon>=10))
	 printf("%-5i%-18s%-18s%-10.2f%-7i%i.%i.%i\n", j-i,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year)    ;
	 else if ((mas[i].date.day<10)&&(z.date.mon<10))
	      printf("%-5i%-18s%-18s%-10.2f%-7i0%i.0%i.%i\n", j-i,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year)    ;
	      else if(mas[i].date.day<10) printf("%-5i%-18s%-18s%-10.2f%-7i0%i.%i.%i\n", j-i,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year)    ;
		   else printf("%-5i%-18s%-18s%-10.2f%-7i%i.0%i.%i\n", j-i,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year)    ;
      }

      free(mas);

    }

  getch();
  return 0;
}
(mas[i].date.mon
Изображения
Тип файла: jpg 43443444.JPG (42.9 Кб, 53 просмотров)
Hacker))) вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. Работа с динамической памятью. McFrey Помощь студентам 1 06.04.2012 16:56
Списки (Си). Проблема с динамической памятью. hak555 Помощь студентам 0 18.12.2011 21:20
ошибка в работе с динамической памятью thrashkid Общие вопросы C/C++ 8 30.06.2011 00:48
Работа с ListBox и Edit и динамической памятью Serebah Помощь студентам 5 19.11.2010 13:41
Помогите пожалуйста с динамической памятью и указателями Riddick2013 Помощь студентам 1 19.12.2007 14:41