C++ jednoduchy kód, nelze přeložit
Ahoj,
mám úplně jednoduchý kód v C++.
mám strukturu, která má vlastnost jako string a tu chci porovnat (abecedně seřadit)
a to pomocí funkce qsort.
Pokud porovnávám pole struktur podle vlastnosti Int, tak kód funguje.
Pokud ovšem použiji porovnání pro string (pole charů), tak to nejde.
Přitom to dělám podle návodu na netu.
Kód je v příloze (soubor).
díky
Potíž je na řádku 49:
int compareByName(void *a, void *b)
{
const struct tClovek *pa = (const tClovek *)a;
const struct tClovek *pb = (const tClovek *)b;
int diff = strcmp(pa->jmeno, pb->jmeno); // tyto identifikátory nezná. proč ?
}
Jaký máš typ chyby?
Jaký máš překladač?
Kde překládáš?
Hlavně že vy hvězdičkáři tady šikanujete lidi a zamykáte vlákna a pak děláte to samé.
Napsal bych ti, ať si raději jdeš hrát na písek - jak to máte vy hvězdičkáři vy zvyku, ale nejsem hvězdičkář.
Dodej info a možná poradím (pokud budu vědět).
Co je #include "pch.h"?
Jako ty bys mi s tímhle chováním dokázal poradit, jo?
Překladač je (konzolová app) v MS VS 2017 a chyba: Použití nedefinovaného typu compareByName::tClovek (50. řádek)
Na hvězdičky mám taky určitý názor, ale nebudu ho tady prezentovat, bylo by to od věci.
Děkuji za reakci.
Sem jsem se již dostal.
Nicméně nyní to zase hlásí chybu na řádku, kde je fce volána:
(řádek 75)
qsort(zaznamy, 3, sizeof(tClovek), compareByName); // Argument typu "int (*)(void *a, void *b)" je nekompatibilní s parametrem typu "_CoreCrtNonSecureSearchSortCompareFunction". 75
Takže pořád to dokáže pozlobit.
Určitě sis upravil i ty "const void"?
Díky
Pár poznámok: miešaš C s C++ - vyber si jedno z toho a používaj to, čo si si vybral.
- Includuješ štandardné hlavičkové súbory, ktoré majú príponu .h súčasne s takými, ktoré ju nemajú. Súbory s .h sú ok pre C, ale ak chceš mať program v C++, uprednostni radšej cstdlib, string a cstdio (alebo ešte lepšie, použi C++ prístup, ktorý tieto knižnice nepotrebuje). Ak chceš robiť v C, tak nepoužívaj iostream a namiesto cout použi printf.
- Deklaruješ char[] pre reťazce - ok pre C, string pre C++.
- Compare funkcie s parametrom void* - V C nepotrebuješ pretypovať premenné typu void*, C to robí implicitne. V C++ máš niekoľko možností pretypovania (static_cast, const_cast, reinterpret_cast, dynamic_cast). C-štýl pretypovania funguje aj v C++, ale je menej bezpečný (s C++-štýlom sa počas kompilácie robí aj typová kontrola). Ak chceš písať v C kompilovanom C++ (áno, aj taký štýl existuje), tak sú tie pretypovania ok.
- qsort - Pre C ok, pre C++ si pozri #include <algorithm> a std::sort - bude to typovo bezpečnejšie.
- Iterovanie cez záznamy - Ak by si použil C++ a vektor, mohlo by to vyzerať takto: for (auto &zaznam : zaznamy) { ... }
- compareByName: "if (pa->jmeno < pb->jmeno) diff = -1; else if (pa->jmeno > pb->jmeno) diff = +1; else diff = 0;" sa dá nahradiť "diff = pa->jmeno - pb->jmeno" (komparátor nepotrebuje vrátiť -1/1/0, ale stači mu výsledok <0/>0/=0)
Edit: Ak chceš vyvíjať natívne aplikácie, pozrel by som si na tvojom mieste Rust - pracuje sa s ním oveľa lepšie a vlastnosťami je na tom podobne ako C/C++.