Dúvida Difícil, converter char ou int para const char* em C++ [RESOLVIDO]

1. Dúvida Difícil, converter char ou int para const char* em C++ [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 28/06/2020 - 18:02h

Estou tomando uma verdadeira surra com esses problemas de conversão em C++, Nunca apanhei tanto em minha vida!

Quero converter um valor char para const char* mas recebo intermináveis bloqueios do compilador!
O Código abaixo funciona porque uso sprintf para fazer a conversão. Mas não é assim que eu gostaria de fazer.

O Button usado retorna valores, 0 ou 1, é mais conhecido como CheckBox em outras linguagens.
Sua documentação diz que o comando abaixo retorna um char https://www.fltk.org/doc-1.4/classFl__Button.html#acdee089d984b1aaea066b9b4ef300816
Mas na prática não é o que parece acontecer, pq se eu coloco "c" de char no comando de sprintf não funciona pois retorna um valor completamente louco
Motivo pelo qual converti para decimal
Bt_Fl_Check_Button->copy_label(): 

Meu objetivo é:
Bt_Fl_Check_Button->copy_label(Bt_Fl_Check_Button->value()); // Não funciona claro! 

Source com os meus fracassos nesta conversão:

// PARA COMPILAR: Precisa da Biblioteca FLTK
// g++ Test.cpp -o Test -lfltk -O3 -Wall -pedantic -pedantic-errors -Werror

#include <FL/Fl_Window.H>
#include <FL/Fl_Check_Button.H>

void Bt_Fl_Check_Button_Click(Fl_Check_Button *Bt_Fl_Check_Button, void*) {
char Msg[12];
sprintf(Msg, "%d", Bt_Fl_Check_Button->value());

Bt_Fl_Check_Button->copy_label(Msg);

//----------------------------------------------------------------------------------------------------
// Tenho que trazer o valor char para const char*
//Bt_Fl_Check_Button->copy_label(Bt_Fl_Check_Button->value()); // error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
//Bt_Fl_Check_Button->copy_label(strdup(Bt_Fl_Check_Button->value())); // error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
//Bt_Fl_Check_Button->copy_label(const_cast<const char*>(Bt_Fl_Check_Button->value())); // error: invalid const_cast from type ‘char’ to type ‘const char*’
//Bt_Fl_Check_Button->copy_label((const char)Bt_Fl_Check_Button->value()); // error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]

//----------------------------------------------------------------------------------------------------
//Bt_Fl_Check_Button->copy_label((const char*)Bt_Fl_Check_Button->value()); // error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]

// 2 erros
// error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
// error: cannot convert ‘int*’ to ‘const char*’
//Bt_Fl_Check_Button->copy_label((int*)Bt_Fl_Check_Button->value());

//Bt_Fl_Check_Button->copy_label((int)Bt_Fl_Check_Button->value()); // error: cannot convert ‘int*’ to ‘const char*’

// 2 erros
// error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
// error: invalid conversion from ‘void*’ to ‘const char*’ [-fpermissive]
//Bt_Fl_Check_Button->copy_label((void*)Bt_Fl_Check_Button->value());
//----------------------------------------------------------------------------------------------------

//Bt_Fl_Check_Button->copy_label((const char*)(intptr_t)Bt_Fl_Check_Button->value()); // COMPILA BUT... Segmentation fault | USA #include <stdint.h>
//Bt_Fl_Check_Button->copy_label(reinterpret_cast<const char*>(Bt_Fl_Check_Button->value())); // COMPILA BUT... Segmentation fault
}

int main() {
Fl_Window *FrmMain = new Fl_Window(150, 40);

Fl_Check_Button *Bt_Fl_Check_Button = new Fl_Check_Button(10, 10, 130, 20, "Fl_Check_Button");
Bt_Fl_Check_Button->callback((Fl_Callback*)Bt_Fl_Check_Button_Click);

FrmMain->show();
return Fl::run();
}




  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 30/06/2020 - 05:00h

Você está tentando fazer uma coisa que não faz sentido.

Um valor do tipo char é um valor inteiro que cabe em um byte. Já um valor do tipo char * representa especificamente um endereço de memória que, se for válido no contexto do programa, contém um byte.

Tentar usar um byte inteiro como se fosse um endereço é análogo a querer encaixar a peça quadrada num buraco triangular.

No seu caso específico, é ainda pior porque os valores retornados por Bt_Fl_Check_Button->value() podem valer exatamente 0 (ou '\0') ou 1 (ou '\001'), e nenhum desses dois valores corresponde a um caráter imprimível (o primeiro deles é, inclusive, o valor do byte que marca o final de uma string do C).

Não confunda o valor inteiro 0 com o caráter '0' (cujo valor inteiro, no conjunto de caracteres ASCII, é 48), nem o valor inteiro 1 com o caráter '1' (cujo índice no ASCII é 49).

Se você quer produzir as strings "0" e "1" em resposta ao valor do check box, teria de usar algo na seguinte linha.

static const char *str_values[2]={"0", "1"};
Bt_Fl_Check_Button->copy_label(str_values[Bt_Fl_Check_Button->value()]);


Outra possibilidade seria o seguinte.

Bt_Fl_Check_Button->copy_label(Bt_Fl_Check_Button->value()? "1": "0"); 



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

3. Re: Dúvida Difícil, converter char ou int para const char* em C++ [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 30/06/2020 - 12:25h

paulo1205 escreveu:
Você está tentando fazer uma coisa que não faz sentido.

Um valor do tipo char é um valor inteiro que cabe em um byte. Já um valor do tipo char * representa especificamente um endereço de memória que, se for válido no contexto do programa, contém um byte.

Tentar usar um byte inteiro como se fosse um endereço é análogo a querer encaixar a peça quadrada num buraco triangular.

No seu caso específico, é ainda pior porque os valores retornados por Bt_Fl_Check_Button->value() podem valer exatamente 0 (ou '\0') ou 1 (ou '\001'), e nenhum desses dois valores corresponde a um caráter imprimível (o primeiro deles é, inclusive, o valor do byte que marca o final de uma string do C).

Não confunda o valor inteiro 0 com o caráter '0 (cujo valor inteiro, no conjunto de caracteres ASCII, é 48), nem o valor inteiro 1 com o caráter '1' (cujo índice no ASCII é 49).

Bom saber!

Se você quer produzir as strings "0" e "1" em resposta ao valor do check box, teria de usar algo na seguinte linha.

Outra possibilidade seria o seguinte.
Bt_Fl_Check_Button->copy_label(Bt_Fl_Check_Button->value()? "1": "0"); 

Isso funciona e ainda achei bem interessante o que vc fez, nem imagina que existia algo assim. A parte legal é que entendo o comando e fiquei imaginando as possibilidades com o que dá pra fazer com isso!

Se você quer produzir as strings "0" e "1" em resposta ao valor do check box, teria de usar algo na seguinte linha.
static const char *str_values[2]={"0", "1"};
Bt_Fl_Check_Button->copy_label(str_values[Bt_Fl_Check_Button->value()]);

Paulo a linha acima ela somente compila se eu ignorar -Werror

do contrário produz o seguinte erro:
$ g++ Test.cpp -o Test -lfltk -O3 -Wall -pedantic -pedantic-errors -Werror

Test.cpp: In function ‘void Bt_Fl_Check_Button_Click(Fl_Check_Button*, void*)’:
Test.cpp:189:71: error: array subscript has type ‘char’ [-Werror=char-subscripts]
189 | Bt_Fl_Check_Button->copy_label(str_values[Bt_Fl_Check_Button->value()]);
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~
cc1plus: all warnings being treated as errors

Eu bem que tentei resolver mas está além da minha capacidade! Eu entendi que ela retornaria o valor do const char declarado acima







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts