Dúvidas com compare do qsort em struct

1. Dúvidas com compare do qsort em struct

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 06/02/2022 - 12:05h

Boa Tarde a todos

Gostaria de saber se é possível fazer um compare do qsort para uma struct anônima, sem identificador ou typedef!
Obrigado!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//struct IDDatabase { // Não desejo isso declarado!
struct { // Gostaria que fosse declarado apenas assim!
char Col1[10];
} Database[] = { {"slackware"}, {"debian"}, {"fedora"}};

int Compare(const void *Elemento1, const void *Elemento2) {
//return strcmp(((struct IDDatabase*)Elemento1)->Col1, ((struct IDDatabase*)Elemento2)->Col1); // WORK

Alguma forma de colocar o comando acima pra funcionar sem um identificador ou typedef declarado na struct?
Ou isse é impossível?
}

int main() {
qsort(Database, 3, sizeof Database[0], Compare);

for(int Reg = 0; Reg < 3; Reg++)
printf("%s\n", Database[Reg].Col1);
}



  


2. Re: Dúvidas com compare do qsort em struct

Heitor Costa
Heitor.rj

(usa Slackware)

Enviado em 06/02/2022 - 17:23h

ApprenticeX escreveu: Boa Tarde a todos
Gostaria de saber se é possível fazer um compare do qsort para uma struct anônima, sem identificador ou typedef!
Obrigado!

É possível. Para isso basta você mesmo informar a variável que está usando diretamente! Neste caso informe diretamente a struct que vc usa!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//struct IDDatabase { // Não desejo isso declarado!
struct { // Gostaria que fosse declarado apenas assim!
char Col1[10];
} Database[] = { {"slackware"}, {"debian"}, {"fedora"}};

int Compare(const void *Elemento1, const void *Elemento2) {
//return strcmp(((struct IDDatabase*)Elemento1)->Col1, ((struct IDDatabase*)Elemento2)->Col1); // WORK

//Alguma forma de colocar o comando acima pra funcionar sem um identificador ou typedef declarado na struct?
//Ou isse é impossível?

// É POSSÍVEL!
return strcmp(((struct { char Col1[10]; } *)Elemento1)->Col1, ((struct { char Col1[10]; } *)Elemento2)->Col1);
}

int main() {
qsort(Database, 3, sizeof Database[0], Compare);

for(int Reg = 0; Reg < 3; Reg++)
printf("%s\n", Database[Reg].Col1);
}





3. Re: Dúvidas com compare do qsort em struct

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/02/2022 - 20:16h

Não entendo sua implicância e relutância em atribuir rótulos a suas estruturas.

A sugestão dada, acima, pelo Heitor funciona em C, mas não em C++, pois o C++ não permite definir um tipo de dados novo durante uma conversão de tipos (e as duas conversões definem um tipo novo cada uma, mesmo em C).

Pare com essa implicância com os rótulos. Em C, fica muito mais simples e consistente se você os usar; em C++, você só pode fazer funcionar se os usar.
// Em C
int Compare(const void *p1, const void *p2) {
const struct IDDatabase *const pdb1=p1, *const pdb2=p2;
return strcmp(pdb1->Col1, pdb2->Col1);
}
// Em C++
int Compare(const void *p1, const void *p2) {
return strcmp(static_cast<const IDDatabase *>(p1)->Col1, static_cast<const IDDatabase *>(p2)->Col1);
}



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


4. Re: Dúvidas com compare do qsort em struct

Apprentice X
ApprenticeX

(usa FreeBSD)

Enviado em 06/02/2022 - 23:41h

paulo1205 escreveu:
Não entendo sua implicância e relutância em atribuir rótulos a suas estruturas.

Na verdade não é uma implicância, pode parecer, mas não é!
Eu vejo o rótulo como uma facilidade, tipo um recurso!
Essas minhas perguntas de não utilizar o rótulo é porque quero entender o funcionamento um pouco mais a fundo!
Essa resposta do Heitor.rj me fez enxergar como o Identificador trabalha, embora nem tenha sido isso que eu esperava!
Eu desconfiava que eu teria que explicar pro programa que ele tinha que achar minha struct, mas mesmo a resposta acima, ainda achei complexa e tentarei entender. porque essa conversão não é uma montagem simples: ((struct { char Col1[10]; } *)Elemento1)->Col1

Pois parece que estou transformando Elemento1 em Database[Elemento1]->Col1 parece o mais lógico ainda ficou confuso entender o funcionamento!







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts