Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вопрос про сортировку и использование дат


Автор: Exister 9.4.2007, 13:58
Чтоб не создавать 2 темы задам оба вопроса тут:
1)есть однонаправленная списковая структура с 3 полями
Код

struct EL{int key;
              struct sklad dan; 
              struct EL *next;
             };


нужно упорядочить ее по dan.tovar т.е. по названию получается
написал вот такой код, компилятор ошибок не выдает,но при запусе этой ф-ции прога вылетает, пишет память не может быть "read". Кто видит ошибку? 
Код

void Base::sortByName_kg(){int kk=1;
                           sklad tmp;
                           int tmpp; 
                           while(kk){kk=0;
                                     for(ref_kg=head_kg; ref_kg!=NULL; ref_kg=ref_kg->next)
                                       {if(strcmp(ref_kg->dan.tovar, ref_kg->next->dan.tovar)<0)
                                          {tmp=ref_kg->dan;
                                           tmpp=ref_kg->key;
                                           ref_kg->dan=ref_kg->next->dan;
                                           ref_kg->key=ref_kg->next->key;
                                           ref_kg->next->dan=tmp;
                                           ref_kg->next->key=tmpp;
                                           kk=1;
                                           } 
                                       }   
                                    }
                           saveToFile_kg(); return;    
                          }

2)Нужно проверять не истек ли срок годности товара т.е. для товара вводятся дата поступления и срок годности и сравнить эт с сегодняшней датой. Как это сделать?
Буду очень благодарен за помощь, а то сдача курсовой на носу, а я с этим застопорился.

Автор: JAnty 9.4.2007, 14:34
Цитата(Exister @  9.4.2007,  13:58 Найти цитируемый пост)
for(ref_kg=head_kg; ref_kg!=NULL; ref_kg=ref_kg->next)


Есть подозрения на бесконечность цикла, next меняут значение???
И потом:

Код

int kk=0;
while(kk){kk=0;
     /*eсли условие верно то*/ kk=1;    
};// вывод: цикл опять безконечен.

Ищи ошибку сообщениями:
int _tmp_;
 printf("%d",_tmp_);
тоесть:

Код

void Base::sortByName_kg(){int kk=1, _tmp_; 
                           sklad tmp;
                           int tmpp; 
                           while(kk){kk=0;
                                     for(ref_kg=head_kg; ref_kg!=NULL; ref_kg=ref_kg->next)
                                       {if(strcmp(ref_kg->dan.tovar, ref_kg->next->dan.tovar)<0)
                                          {tmp=ref_kg->dan;
                                           tmpp=ref_kg->key;
                                           ref_kg->dan=ref_kg->next->dan;
                                           ref_kg->key=ref_kg->next->key;
                                           ref_kg->next->dan=tmp;
                                           ref_kg->next->key=tmpp;
                                           kk=1;
                                           }// end if; 
                                     printf("%d",_tmp_++);
                                       }// next ref_kg;    
                                    }//end while;
        saveToFile_kg(); return;    
}


Автор: The Thing 9.4.2007, 14:46
Сравнивай текущую дату с указанной датой

Код

//0  F > L
//1  F < L
//2  F = L
function SravnData(Fd, Fm, Fy, Ld, Lm, Ly:Integer): Integer;
begin
  if Fy > Ly then begin
      SravnData := 0;
  end
  else if Fy < Ly then begin
    SravnData := 1;
  end
  else if Fy = Ly then begin
    if Fm > Lm then begin
        SravnData := 0;
    end
    else if Fm < Lm then begin
      SravnData := 1;
    end
    else if Fm = Lm then begin
      if Fd > Ld then begin
          SravnData := 0;
      end
      else if Fd < Ld then begin
        SravnData := 1;
      end
      else if Fd = Ld then begin
        SravnData := 2;
      end;
    end;
  end;
end;



Автор: Vyacheslav 9.4.2007, 14:48
Где гарантия что в 
Код

if(strcmp(ref_kg->dan.tovar, ref_kg->next->dan.tovar

ref_kg->next  не равно NULL;

Автор: The Thing 9.4.2007, 14:53
Переписал на Си... но не проверял. Потыкай ее.. помоему я уже находил в ней какую-то ошибку в последних двух условиях...
Код

//0  F > L
//1  F < L
//2  F = L
int SravnData(int Fd, int Fm, int Fy, int Ld, int Lm, int Ly)
{
  if(Fy > Ly) SravnData = 0;
  else if(Fy < Ly) SravnData = 1;
  else if(Fy = Ly)
  {
     if(Fm > Lm) SravnData = 0;
     else if(Fm < Lm) SravnData = 1;
     else if(Fm == Lm){
       if(Fd > Ld) SravnData = 0;
       else if(Fd < Ld) SravnData = 1;
       else if(Fd == Ld) SravnData = 2;
     }
  }
}


Добавлено через 4 минуты и 19 секунд
На счет первого вопроса: у тебя как-то неаккуратно написан код (на мой взгляд..) - разбираться даже не хочется. Лучше всего возьми базу из 2-4 элементов и проверь в режиме отладки. Сам все найдешь...

Добавлено через 7 минут и 32 секунды
Цитата(Vyacheslav @ 9.4.2007,  14:48)
Где гарантия что в 
Код

if(strcmp(ref_kg->dan.tovar, ref_kg->next->dan.tovar

ref_kg->next  не равно NULL;

Нет, а она и не нужна...
неужели не может быть строки нулевой длины?
если вторая часть отлична от нулуля, то выдаст != 0 smile

Автор: Exister 9.4.2007, 16:10
добавил сообщения, выходит что
Код

for(ref_kg=head_kg; ref_kg!=NULL; ref_kg=ref_kg->next)

выполняется 1 раз т.е. после первого выполнения IF сразу вылетает.

Автор: Vyacheslav 9.4.2007, 17:22
Цитата(The Thing @  9.4.2007,  14:53 Найти цитируемый пост)
Нет, а она и не нужна...
неужели не может быть строки нулевой длины?
если вторая часть отлична от нулуля, то выдаст != 0  

Ээ. Вы поняли, что Вы написали? При входе в цикл мы знаем что ref_kg не равно NULL
Но никто не гаранитирует, что ref_kg - последний в списке и  ref_kg->next == NULL. А мы пытаемся получить ref_kg->next->dan.tovar. То есть NULL->dan.tovar. Что при такой попытке мы получим smile ?


Автор: Exister 9.4.2007, 18:49
The Thing, большое спасибо за подсказку с датами, все отлично работает.
Осталось только упорядочить. Кто-нибудь может с этим помочь? 

Автор: Arks 10.4.2007, 08:20
1) Что такое ref_kg - лучше бы её локальной сделать. Иначе можешь где-нибудь испортить и потом долго думать из-за чего так странно прога себя ведет.
2) Проверь правильно ли строится список
3) if(ref_kg->next && strcmp(ref_kg->dan.tovar, ref_kg->next->dan.tovar)<0)
   либо
    if(ref_kg!=NULL)
       for(ref_kg=head_kg; ref_kg->next!=NULL; ref_kg=ref_kg->next)

Автор: The Thing 10.4.2007, 10:05
Цитата(Vyacheslav @ 9.4.2007,  17:22)
Цитата(The Thing @  9.4.2007,  14:53 Найти цитируемый пост)
Нет, а она и не нужна...
неужели не может быть строки нулевой длины?
если вторая часть отлична от нулуля, то выдаст != 0  

Ээ. Вы поняли, что Вы написали? При входе в цикл мы знаем что ref_kg не равно NULL
Но никто не гаранитирует, что ref_kg - последний в списке и  ref_kg->next == NULL. А мы пытаемся получить ref_kg->next->dan.tovar. То есть NULL->dan.tovar. Что при такой попытке мы получим smile ?

А, в этом смысле.. Да. Я полностью солидарен. Я думал имелось ввиду про strcmp, где вместо строки будет послан NULL. (плохо посмотрел код)
Извиняюсь

Добавлено через 4 минуты и 7 секунд
кстати, скорее всего именно в этом и есть ошибка!

возможно следует исправить строку
Код

for(ref_kg=head_kg; ref_kg!=NULL; ref_kg=ref_kg->next)


на что-нибудь вроде этого:
Код

...
if(head_kg->next){ //если больше одного в списке
   for(ref_kg=head_kg; ref_kg->next!=NULL; ref_kg=ref_kg->next)
   ...
}


возможно не совсем корректно.. сильно не вдавался в смысл написанного, но идея думаю понятна

Автор: Exister 10.4.2007, 19:37
Всем спасибо за помощь, все сделал, все работает!

Автор: Arks 10.4.2007, 20:01
Пометь вопрос как решённый. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)