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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2014, 10:32   #1
wertyBSD
 
Регистрация: 11.10.2014
Сообщений: 6
Печаль Сортировка структуры

Второй день бьюсь с сортировкой структур, покажу код, входные и выходные данные:
Код:
struct TZap{
                char Name[30];
                char Stamp[30];
                        char Date[30];
                        bool Repair;
     } Zap;
Код:
int cmp2(const void* p1, const void* p2)
{
   return strcmp(((TZap*)p1)->Stamp, ((TZap*)p2)->Stamp);
}
void __fastcall TFormMain::Button6Click(TObject *Sender)
{
        TZap st, *mas_Z;
        Fz = fopen(File_Zap.c_str(),"rb");
        int D_f = fileno(Fz);               // Находим дескриптор файла
        int len = filelength(D_f);          // Находим размер файла
        int i, j, kol;
        kol = len/size;                 //Количество записей в файле
        mas_Z = new TZap[kol];
        // Считываем записи из файла в динамический массив
        for (i=0; i < kol; i++)
            fread((mas_Z+i), size, 1, Fz);
        fclose(Fz);
        Memo1->Lines->Add("Сортированные сведения");
        qsort(mas_Z, kol, sizeof(mas_Z), cmp2);
        for(int j=0; j<kol; j++)
        {
                       String s = (const char*) mas_Z[j].Name;
                        if( s==ComboBox2->Text.c_str())
                Out(mas_Z[j],Memo1);
        }
}
входные и выходные данные:

Цитата:
--------- Все сведения ---------
Телевизор соник 28.09.2014 Починили
Ноутбук ДелЪ 28.09.2014 Починили
Телевизор 122 28.09.2014 Починили
Телевизор 28.09.2014 Не починили
28.09.2014 Не починили
Телевизор 28.09.2014 Починили
28.09.2014 Не починили
Телевизор 444 02.09.2014 Починили
Радиоприёмник Verty 28.09.2014 Починили
Видеомагнитафон Hitacha 30.09.2014 Не починили
Телевизор New1 28.09.2014 Починили
Радиоприёмник New2 28.09.2014 Починили
Телевизор New3 28.09.2014 Не починили
Сортированные сведения
Телевизор New3 28.09.2014 Не починили
Телевизор New3 28.09.2014 Не починили
Телевизор New3 28.09.2014 Не починили
Телевизор New3 28.09.2014 Не починили
Телевизор New3 28.09.2014 Не починили
Телевизор New3 28.09.2014 Не починили
сортирую в примере по полю телевизор
wertyBSD вне форума Ответить с цитированием
Старый 11.10.2014, 12:28   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А как сортирует?
Отладку пробовал проводить?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.10.2014, 13:14   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

sizeof(mas_Z) - это размер самого указателя байта 4 или там 8...
аргумент qsort требует указать размер самого елемент, sizeof(Zap)
Откуда берется size - в коде такого не видно.
waleri вне форума Ответить с цитированием
Старый 11.10.2014, 14:11   #4
wertyBSD
 
Регистрация: 11.10.2014
Сообщений: 6
По умолчанию

помогли с проверкой кода, такой код работает, сказали что ошибка в выводе:

Код:
#include <cstring>
#include <algorithm>
#include <time.h>
#include <cstdio>

using namespace std;

static const char alphanum[] =
"abcdefghijklmnopqrstuvwxyz";

const int stringLength = sizeof(alphanum) - 1;
const int size = 10;

char* genRandom()
{
  char str[10];

    for(int i=0; i<10;++i)
    str[i]=alphanum[rand() % stringLength];
    

    return str;
}

struct TZap{
                char Name[30];
                char Stamp[30];
                char Date[30];
                bool Repair;
     } ;

int cmp(const void *lvalue, const void *rvalue){
  return strcmp(((TZap*)lvalue)->Name,((TZap*)rvalue)->Name);//==1?true:false;
}

int main()
{
  srand(time(NULL));

  TZap *array = new TZap[size];
  char date[] = "1.1.2014";

  for(int i=0;i<size;++i){
      strcpy(array[i].Date,date);
      strcpy(array[i].Name,genRandom());
      strcpy(array[i].Stamp,genRandom());
      array[i].Repair=i/2;
    }

for(int i=0; i< size;++i)
      puts(array[i].Name);
      puts("----------------");
  std::qsort(array,size,sizeof(TZap),cmp);

  for(int i=0; i< size;++i)
      puts(array[i].Name);

    return 0;
}
вывод у меня простой

Код:
void Out(TZap z, TMemo *Memo1)
{
String s;
s = (const char*)Zap.Name;
        s = s + " " + (const char*)Zap.Stamp;
        s = s + " " + (const char*)Zap.Date;
        if(Zap.Repair==true)
        {
             s = s + " Починили";
             }
        else
                s = s + " Не починили";
     Memo1->Lines->Add(s);
}
консольный вариант запускал на http://www.compileonline.com/compile_cpp_online.php

формовый вариант делаю в C++ Builder 6
wertyBSD вне форума Ответить с цитированием
Старый 11.10.2014, 14:32   #5
wertyBSD
 
Регистрация: 11.10.2014
Сообщений: 6
По умолчанию

оказывается 2 косяка, вывод поправил

теперь выводит так:

Цитата:
--------- Все сведения ---------
Телевизор соник 28.09.2014 Починили
Ноутбук ДелЪ 28.09.2014 Починили
Телевизор 122 28.09.2014 Починили
Телевизор 28.09.2014 Не починили
28.09.2014 Не починили
Телевизор 28.09.2014 Починили
28.09.2014 Не починили
Телевизор 444 02.09.2014 Починили
Радиоприёмник Verty 28.09.2014 Починили
Видеомагнитафон Hitacha 30.09.2014 Не починили
Телевизор New1 28.09.2014 Починили
Радиоприёмник New2 28.09.2014 Починили
Телевизор New3 28.09.2014 Не починили
Телевизор 1111 28.09.2014 Починили
Сортированные сведения
Телевизор 122 28.09.2014 Починили
Телевизор 28.09.2014 Не починили
Телевизор 28.09.2014 Починили
Телевизор 444 02.09.2014 Починили
Телевизор New1 28.09.2014 Починили
Телевизор New3 28.09.2014 Не починили
Телевизор 1111 28.09.2014 Починили
как я понимаю должено быть так:
Телевизор 1111 28.09.2014 Починили
Телевизор 122 28.09.2014 Починили
Телевизор 28.09.2014 Не починили
Телевизор 28.09.2014 Починили
Телевизор 444 02.09.2014 Починили
Телевизор New1 28.09.2014 Починили
Телевизор New3 28.09.2014 Не починили
wertyBSD вне форума Ответить с цитированием
Старый 11.10.2014, 14:55   #6
wertyBSD
 
Регистрация: 11.10.2014
Сообщений: 6
По умолчанию

по поводу откуда берётся size, она инициализируется при запуске
int size = sizeof(TZap);
wertyBSD вне форума Ответить с цитированием
Старый 11.10.2014, 15:00   #7
wertyBSD
 
Регистрация: 11.10.2014
Сообщений: 6
По умолчанию

В дэбаге посмотрел, заместо марки изделия появляется слово "леник"
У меня уже взрыв мозга
wertyBSD вне форума Ответить с цитированием
Старый 11.10.2014, 16:43   #8
wertyBSD
 
Регистрация: 11.10.2014
Сообщений: 6
По умолчанию

последний не рабочий код:

Код:
void __fastcall TFormMain::Button6Click(TObject *Sender)
{
        TZap *mas_Z;
        Fz = fopen(File_Zap.c_str(),"rb");
        int D_f = fileno(Fz);				// Находим дескриптор файла
        int len = filelength(D_f);			// Находим размер файла
        int i, j, kol;
        kol = len/size;					//Количество записей в файле
        mas_Z = new TZap[kol];

        // Считываем записи из файла в динамический массив
        for (i=0; i < kol; i++)
			fread((mas_Z+i), size, 1, Fz);
        fclose(Fz);
        Memo1->Lines->Add("Сортированные сведения");
        qsort(mas_Z, kol, sizeof(mas_Z), cmp2);
        for(int j=0; j<kol; j++)
        {
                       String s = (const char*) mas_Z[j].Name;
                        if( s==ComboBox2->Text.c_str())
                Out(mas_Z[j],Memo1);
        }
}

    int cmp2(const void* p1, const void* p2) 
{
      return strcmp( ((TZap*)p1)->Stamp, ((TZap*)p2)->Stamp ) > 0;
}
void Out(TZap z, TMemo *Memo1)
{
String s;
s = (const char*)z.Name;
        s = s + " " + (const char*)z.Stamp;
        s = s + " " + (const char*)z.Date;
        if(z.Repair)
        {
             s = s + " Починили";
             }
        else
                s = s + " Не починили";
     Memo1->Lines->Add(s);
}
wertyBSD вне форума Ответить с цитированием
Старый 13.10.2014, 01:19   #9
Zenon
Пользователь
 
Регистрация: 03.07.2014
Сообщений: 32
По умолчанию

для qsort cmp2 должна возвращать -1, 0 или +1, а у вас - 0 или 1 (как требуется в std::sort, а не qsort)

короче, уберите > 0 в конце этой функции
Zenon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка Структуры Chainik! Общие вопросы C/C++ 7 29.09.2013 21:05
[C]. Сортировка структуры M_Asja Помощь студентам 0 20.01.2013 21:02
Сортировка структуры Proger_1 Win Api 2 04.12.2012 20:45
сортировка структуры Си jana89 Общие вопросы C/C++ 5 27.11.2011 20:48
сортировка структуры vo_sa Общие вопросы C/C++ 1 25.06.2009 14:16