Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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č ?
}

Předmět Autor Datum
Jaký máš typ chyby? Jaký máš překladač? Kde překládáš? Hlavně že vy hvězdičkáři tady šikanujete l…
Trablgeng 21.02.2019 14:29
Trablgeng
:-):-):-) Jako ty bys mi s tímhle chováním dokázal poradit, jo? :-D Překladač je (konzolová app) v…
Flash_Gordon 21.02.2019 14:37
Flash_Gordon
int compareByName(const void *a, const void *b) { const tClovek *pa = (const tClovek *)a; const tClo…
Wikan 21.02.2019 14:46
Wikan
Děkuji za reakci. Sem jsem se již dostal. Nicméně nyní to zase hlásí chybu na řádku, kde je fce vo…
Flash_Gordon 21.02.2019 14:50
Flash_Gordon
Určitě sis upravil i ty "const void"?
Wikan 21.02.2019 14:52
Wikan
:beer: Díky
Flash_Gordon 21.02.2019 14:59
Flash_Gordon
Pár poznámok: miešaš C s C++ - vyber si jedno z toho a používaj to, čo si si vybral. - Includuješ š… poslední
moose 21.02.2019 19:33
moose

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"?

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.

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++.

Zpět do poradny Odpovědět na původní otázku Nahoru