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

Problem z funkcją qsort.

dział ogólny

Problem z funkcją qsort.

Nowy postprzez lukagrom » środa, 7 marca 2018, 14:31

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"?
Avatar użytkownika
lukagrom
Bladawiec
Bladawiec
 
Posty: 37
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: Problem z funkcją qsort.

Nowy postprzez polymorphism » czwartek, 8 marca 2018, 11:33

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));
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
lukagrom
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 29 gości

cron