Форум программистов, компьютерный форум CyberForum.ru

не работает qsort - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
11.03.2012, 17:18     не работает qsort #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include  <math.h>
#include <iomanip>
#include <string.h>
using namespace std;
 
struct MARSH
{
    char nac_punkt[100];
    char konec_punkt[100];
    int   nomer;
    int   dlina;
}*p1[50];
int comp(const void* a, const void* b)
{
    const  MARSH* k = (const  MARSH*)a;
    const  MARSH* m = (const  MARSH*)b;
    int s = ((k ->dlina) - (m ->dlina));
       
    return s;
}
void  main(void)
{
    FILE *f1;
    setlocale(LC_ALL,"Russian");
    if((f1=fopen("2.dat", "rb+"))==NULL) {
        printf("Ошибка при открытии файла.\n");
        exit(1);
    }
 
 
    for(int i=0;i<5;i++)
    {
        MARSH *pmarh=new MARSH[i+1];
 
        if (pmarh != NULL) cout << "Память успешно выделена" << endl; 
        else cout << "Ошибка выделения памяти" << endl; 
        fread(&pmarh[i],sizeof(MARSH),1,f1);
        p1[i]=&pmarh[i];
        cout<<i+1<<"-aя запись"<<endl;
        cout<<"начальный пункт  "<<pmarh[i].nac_punkt<<endl;
        cout<<"название конечного пункта  "<<pmarh[i].konec_punkt<<endl;
        cout<<"длина  "<<pmarh[i].dlina<<endl;
        cout<<"номер   "<<pmarh[i].nomer<<endl; 
    }
    cout<<"Сортировка"<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    qsort(p1, 5, sizeof(p1[0]), comp);
    for(int i=0;i<5;i++)
    {      
        cout<<i+1<<"-aя запись"<<endl;
        cout<<"начальный пункт  "<<p1[i]->nac_punkt<<endl;
        cout<<"название конечного пункта  "<<p1[i]->konec_punkt<<endl;
        cout<<"длина  "<<p1[i]->dlina<<endl;
        cout<<"номер   "<<p1[i]->nomer<<endl    
    }
    fclose(f1);
    system("PAUSE");
}
не работает qsort нужным образом тоесть не сортирует

Добавлено через 14 минут
посмотрите пожалуйста код почему qsort не хочет сортировать
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2012, 17:18     не работает qsort
Посмотрите здесь:

C++ qsort
qsort C++ C++
C++ Qsort
C++ не работает qsort
C++ qsort
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.03.2012, 17:25     не работает qsort #2
qsort(p1, 5, sizeof(p1[0]), comp);
В первом параметре вы передаете MARSH**, а надо MARSH*.
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
11.03.2012, 17:26  [ТС]     не работает qsort #3
а как исправить это?
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
11.03.2012, 17:29     не работает qsort #4
Цитата Сообщение от sergeu90 Посмотреть сообщение
MARSH *pmarh=new MARSH[i+1];
В цикле каждый раз выделяется память. Это так задумано?
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.03.2012, 17:30     не работает qsort #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct MARSH
{
  char nac_punkt[100];
  char konec_punkt[100];
  int   nomer;
  int   dlina;
}p1[50];
...
for(int i=0;i<5;i++)
        {
 
          fread(&p1[i],sizeof(MARSH),1,f1);
                        
                  cout<<i+1<<"-aя запись"<<endl;
                        cout<<"начальный пункт  "<<p1[i].nac_punkt<<endl;
                    cout<<"название конечного пункта  "<<p1[i].konec_punkt<<endl;
                        cout<<"длина  "<<p1[i].dlina<<endl;
                        cout<<"номер   "<<p1[i].nomer<<endl;
}
и далее в том же духе
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
11.03.2012, 17:36  [ТС]     не работает qsort #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for(int i=0;i<5;i++)
       {
           if (p1[i]->dlina<p1[i+1]->dlina)
           {
               MARSH *p2;
             p2=p1[i];
            p1[i]=p1[i+1];
            p1[i+1]=p2;
 
 
           }
 
}
пробывал так все равно

Добавлено через 1 минуту
мне через массив указателей надо сделать по заданию
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.03.2012, 17:41     не работает qsort #7
Невнимательно посмотрел.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for(int i=0;i<5;i++)
 
       {
                  p1[i]=new MARSH;
 
                   if (p1[i]!= NULL) cout << "Память успешно выделена" << endl; 
   else cout << "Ошибка выделения памяти" << endl; 
 
          fread(p1[i],sizeof(MARSH),1,f1);
                       
                  cout<<i+1<<"-aя запись"<<endl;
                        cout<<"начальный пункт  "<<p1[i]->nac_punkt<<endl;
                    cout<<"название конечного пункта  "<<p1[i]->konec_punkt<<endl;
                        cout<<"длина  "<<p1[i]->dlina<<endl;
                        cout<<"номер   "<<p1[i]->nomer<<endl;
         
}
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
11.03.2012, 18:01  [ТС]     не работает qsort #8
сделал наконецто своим методом кому надо возьмите
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <iostream>
#include  <math.h>
#include <iomanip>
#include <string.h>
using namespace std;
 
 
 
 
struct MARSH
{
  char nac_punkt[100];
  char konec_punkt[100];
  int   nomer;
  int   dlina;
}*p1[50];
 
 
int comp(const void* a, const void* b)
{
        const  MARSH* k = (const  MARSH*)a;
        const  MARSH* m = (const  MARSH*)b;
        int s = ((k ->dlina) - (m ->dlina));
        
        return s;
}
 
void  main(void)
{
 
     FILE *f1;
    setlocale(LC_ALL,"Russian");
if((f1=fopen("2.dat", "rb+"))==NULL) {
    printf("Ошибка при открытии файла.\n");
    exit(1);
  }
 
 
for(int i=0;i<5;i++)
 
       {
           MARSH *pmarh=new MARSH[i+1];
            //p1[i]=new MARSH;
           if (pmarh != NULL) cout << "Память успешно выделена" << endl; 
   else cout << "Ошибка выделения памяти" << endl; 
 
          fread(&pmarh[i],sizeof(MARSH),1,f1);
            p1[i]=&pmarh[i];
          cout<<i+1<<"-aя запись"<<endl;
            cout<<"начальный пункт  "<<pmarh[i].nac_punkt<<endl;
            cout<<"название конечного пункта  "<<pmarh[i].konec_punkt<<endl;
            cout<<"длина  "<<pmarh[i].dlina<<endl;
            cout<<"номер   "<<pmarh[i].nomer<<endl;
    
    
}
cout<<"Сортировка"<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
 
 for(int i = 0; i < 5 - 1; ++i) 
    {            
        for(int j = 0; j < 5 - 1; ++j) 
        {     
            if (p1[j+1]->dlina>p1[j]->dlina)
            {
           MARSH *p2;
             p2=p1[j+1];
            p1[j+1]=p1[j];
            p1[j]=p2;
            }
        }
    }
 
//qsort(p1, 5, sizeof(p1[0]), comp);
 
 
 
 
 
 
for(int i=0;i<5;i++)
 
       {
           
          cout<<i+1<<"-aя запись"<<endl;
            cout<<"начальный пункт  "<<p1[i]->nac_punkt<<endl;
            cout<<"название конечного пункта  "<<p1[i]->konec_punkt<<endl;
            cout<<"длина  "<<p1[i]->dlina<<endl;
            cout<<"номер   "<<p1[i]->nomer<<endl;
    
    
}
 
 
 
 
 
 
 
 
 
 
 
    
 
       fclose(f1);
    system("PAUSE");
 
}
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.03.2012, 18:07     не работает qsort #9
Цитата Сообщение от sergeu90 Посмотреть сообщение
MARSH *pmarh=new MARSH[i+1];
Помедитируйте над этой строкой. 2 вам поставят.
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
11.03.2012, 18:13     не работает qsort #10
Цитата Сообщение от sergeu90 Посмотреть сообщение
//qsort(p1, 5, sizeof(p1[0]), comp);

Не по теме:

Что-то новенькое. Чтобы решить проблему нужно поставить в комментарии?!
Вот это да!..

sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
11.03.2012, 18:16  [ТС]     не работает qsort #11
ну это вы уже преувеличили я сделал просто по другому сортировку пузырьком
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
11.03.2012, 18:18     не работает qsort #12
sergeu90, у вас еще в первом цикле творится непонятно что "MARSH *pmarh=new MARSH[i+1];"

Не по теме:

Ну ладно. Решили так решили. Хозяин барин.

sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
11.03.2012, 18:36  [ТС]     не работает qsort #13
почему непонятно выделяю память
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.03.2012, 18:39     не работает qsort #14
sergeu90, зачем вы создаете массив, если вам нужен только один элемент?
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
11.03.2012, 18:46     не работает qsort #15
Цитата Сообщение от sergeu90 Посмотреть сообщение
почему непонятно выделяю память
Смотри, в 1-м цикле у тебя при i = 0 происходит
C++
1
new MARSH[1];
т.е. в памяти 1 объект
ты к нему обратился &pmarh[0] пока все нормально.

но затем у тебя посходит в следующей итерации
C++
1
new MARSH[2];
т.е. 2 объекта и заметь предыдущие данные остались в памяти
а при i = 1 у тебя работает только одни объект, остальное выделенное не используется.
и так далее каждый раз выделяется все больше неиспользуемой памяти, непонятно зачем?

вынеси за цикл
C++
1
MARSH *pmarh=new MARSH[i+1];
и замени на
C++
1
MARSH *pmarh=new MARSH;
а в цикле обращайся к одному объекту pmarh
или еще лучше используй только p1[i]
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.03.2012, 18:49     не работает qsort #16
Xind, выносить как раз не надо, иначе в p1 будут все одинаковые элементы = последнему считанному.
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
11.03.2012, 18:53  [ТС]     не работает qsort #17
спасибо учту

Добавлено через 1 минуту
MARSH *pmarh=new MARSH если так то повреждениче кучи ошибка
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.03.2012, 18:55     не работает qsort #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(int i=0;i<5;i++)
    {
        MARSH *pmarh=new MARCH;
 
        if (pmarh != NULL) cout << "Память успешно выделена" << endl; 
        else cout << "Ошибка выделения памяти" << endl; 
        fread(pmarh,sizeof(MARSH),1,f1);
        p1[i]=pmarh;
        cout<<i+1<<"-aя запись"<<endl;
        cout<<"начальный пункт  "<<pmarh->nac_punkt<<endl;
        cout<<"название конечного пункта  "<<pmarh->konec_punkt<<endl;
        cout<<"длина  "<<pmarh->dlina<<endl;
        cout<<"номер   "<<pmarh->nomer<<endl; 
    }
sergeu90
27 / 28 / 3
Регистрация: 17.10.2009
Сообщений: 739
11.03.2012, 19:00  [ТС]     не работает qsort #19
а вот хочу освободить память в конце так оно не возможно только если в цикле освобождать а я хочу после цикла освободитть
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2012, 19:21     не работает qsort
Еще ссылки по теме:

qsort C++
qsort объясните как работает C++
C++ qsort

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
11.03.2012, 19:21     не работает qsort #20
В самом конце.
C++
1
2
3
4
for(int i=0;i<5;i++)
{
  delete p1[i];
}
Yandex
Объявления
11.03.2012, 19:21     не работает qsort
Ответ Создать тему
Опции темы

Текущее время: 04:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru