CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z funkcją qsort.
Strona 1 z 1

Problem z funkcją qsort.

Nowy postNapisane: środa, 7 marca 2018, 14:31
przez lukagrom
Testuję sobie różne sposoby sortowania i w końcu natrafiłem na ten wbudowany w bibliotekę
KOD cpp:     UKRYJ  
#include <stdlib.h>
algorytm tj funkcja - qsort. Przekształacając przykład z wyroczni: http://www.cplusplus.com/reference/cstdlib/qsort/ do C++ Builder uzyskuję coś takiego:

KOD cpp:     UKRYJ  
int __fastcall TForm1::compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
        int values[] = { 40, 10, 100, 90, 20, 25 };
        qsort (values, 6, sizeof(int), compare);
       
}

 

Dostaję 2 errory:

[bcc32 Error] m_test_function.cpp(75): E2034 Cannot convert 'int (_fastcall * (_closure )(const void *,const void *))(const void *,const void *)' to 'int (*)(const void *,const void *)'
Full parser context
m_test_function.cpp(73): parsing: void _fastcall TForm1::Button3Click(TObject *)
[bcc32 Error] m_test_function.cpp(75): E2342 Type mismatch in parameter '__fcmp' (wanted 'int (*)(const void *,const void *)', got 'void')
Full parser context
m_test_function.cpp(73): parsing: void _fastcall TForm1::Button3Click(TObject *)

Nadmienię, że podany przykład oczywiście poprawnie kompiluje się w środowisku gcc/g++. Zakładam, że C++ Builder ma jakąś swoją własną definicję funkcji - qsort
PS. Również Visual C++ na tym samym "zastrajkował":
1>c:\users\luk\documents\c_plus\p_testuj4\p_testuj4\Form1.h(105) : error C3867: 'p_testuj4::Form1::compare': function call missing argument list; use '&p_testuj4::Form1::compare' to create a pointer to member

PS2. Czyli wszystko rozbiega się o "pointer"?

Re: Problem z funkcją qsort.

Nowy postNapisane: czwartek, 8 marca 2018, 11:33
przez polymorphism
Dlaczego qsort(), a nie std::sort()?

Czyli wszystko rozbiega się o "pointer"?

"Rozbiega się" o to, że qsort() oczekuje wskaźnika na funkcję, a dostaje wskaźnik na metodę klasy TForm1. To są dwa różne typy wskaźników.

Tak zrób:
KOD cpp:     UKRYJ  
int values[] = { 40, 10, 100, 90, 20, 25 };

std::sort(std::begin(values), std::end(values));