Ir ao conteúdo
  • Cadastre-se

C como identificar o tipo de uma variáveL durante a execusão do programa


devair1010

Posts recomendados

olá , pessoal , alguém saberia como identificar o tipo de uma variável enquanto o programa estiver rodando ,  como nesse exemplo :

int a;
char tipo[30];
scanf("%d",&a);
tipo = função_que_detecta_o_tipo();
printf("o tipodessa variáveL a eh %s\n\n",tipo);

já vi alguma coisa desse tipo no python e no javascript , mas no c / c++ ainda não encontrei nada a respeito ,  agradeço muito , alguma ajuda , obrigado .

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

4 horas atrás, devair1010 disse:

já vi alguma coisa desse tipo no python e no javascript , mas no c / c++ ainda não encontrei nada a respeito ,  agradeço muito , alguma ajuda

 

Essa é uma frase perigosa: :D c/c++ sugere que sejam alternativas. Mas não são. São linguagens muito diferentes. C++ não é C. C não é C++. Apenas C++ começou com C 40 anos atrás.

 

Em C não existe algo assim, até onde eu sei.

 

Em C++ o que se espera em geral é que a linguagem quando possível identifique o tipo da variável, estilo javascript. Identificar o tipo a partir da variável é uma necessidade mais rara. O compilador precisa disso porque podem existir muitas funções com o mesmo nome --- overloading --- mas o programa em geral não.

 

Mas a informação que quer está disponível no header typeinfo...

 

Veja um exemplo
 

#include <iostream>
#include <typeinfo>

using namespace std;

int f(int);

int main(void)
{
    int i{};
    double d{};
    char c{};

    string str {};
    struct tst { };
    class uma_classe { };
    

    
    cout << "int "     << typeid(i).name() << endl;
    cout << "double "  << typeid(d).name() << endl;
    cout << "char "    << typeid(c).name() << endl;

    cout << "struct "  << typeid(tst).name() << endl;
    cout << "string "  << typeid(str).name() << endl;
    cout << "classe "  << typeid(uma_classe).name() << endl;
    cout << "funcao "  << typeid(f).name() << endl;

    pair<int,double> valor{1,2.340f};
    auto [a,b] = valor;
    cout << "tipo de a = " << typeid(a).name() <<
        " valor = " << a << endl;
    cout << "tipo de b = " << typeid(b).name() <<
        " valor = " << b << endl;

    return 0;
}

int f(int v)
{
    return 8;
}

 

Isso mostra, com gcc

 

PS C:\src\ifdef> g++ -o tst -std=c++17 tst.cpp
PS C:\src\ifdef> ./tst
int i
double d
char c
struct Z4mainE3tst
string NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
classe Z4mainE10uma_classe
funcao FiiE
tipo de a = i valor = 1
tipo de b = d valor = 2.34
PS C:\src\ifdef> 

 

Ou

 

int int
double double
char char
struct struct `int __cdecl main(void)'::`2'::tst
string class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
classe class `int __cdecl main(void)'::`2'::uma_classe
funcao int __cdecl(int)
tipo de a = int valor = 1
tipo de b = double valor = 2.34

 

Com o compilador da Microsoft, que capricha um pouco mais ;) 

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

@arfneto@arfneto       muito obrigado ,   esse código funcionou como eu quero ,  só que ali no final aquele auto deu um erro

1656946412_tipodevariavel.thumb.jpg.7c2e93b1319a569fc5cec287ce99f3b0.jpg

 

e não consegui resolver , pois o compilador diz que não encontrou o stdc++17 ,  mas aqui é no visual studio 2019 ,  e deveria ter esse aí , e então removendo essa parte , funcionou e mostrou o tipo das variáveis , sim , e outra coisa , por que precisa dessas chaves depois dos nomes das variáveis ? ,  e na hora de escrever não observei essa questão de c++ ter funções que em c não tem , e eu queria era na linguagem  c  ,  imagino que tenha algum modo , pois lá a quarenta anos atrás ,  o compilador sabia o tipo da variável , para adicionar o valor certo para elas ,  mas assim mesmo já vai ajudar muito  ,    valeu  ,        obrigado  ,

     @Simon Viegas     olá ,   eu não tenho nenhuma utilidade muito importante , não ,  estou querendo fazer um menu que se mova enquanto o programa está rodando , e nele uma função que pega o que o usuário digitar no teclado e adicione o que for digitado na variável do modo certo , para que o programa não fique parado nas funções scanf , fgets , gets ,  getchar , getche , getc , fgetc , e assim tal função substituiria essas aí , e o programa estaria o tempo todo se movendo , e com isso o menu também , pois não ficaria parado enquanto essas funções estivessem esperando clicar enter , sendo que a função retornaria uma string , que pode conter qualquer tipo de caractere , e verificando o tipo da variável , adicionaria os dados nela , pois se ela for do tipo inteiro , usando a função atoi converteria a string em int ,   ou atof  em float ,   e seria mais para estudo e aprendizado  mesmo ,     muito obrigado pelo interesse ,  creio que haja outros meios de se fazer ,  mas como ainda não sei , então imaginei que possa ser assim  , desculpe pelo texto muito longo . .

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, devair1010 disse:

não consegui resolver , pois o compilador diz que não encontrou o stdc++17 ,  mas aqui é no visual studio 2019 ,  e deveria ter esse aí , e então removendo essa parte , funcionou e mostrou o tipo das variáveis , sim , e outra coisa , por que precisa dessas chaves depois dos nomes das variáveis ?

 

Não entendo o que está tentando fazer. Porque não postou a mensagem desse compilador? Que compilador é esse? Se quer usar essa opção use o Developer Prompt. Está misturando as coisas... 

 

  1. No exemplo que deixei tem até a linha de compilação, com o g++. É outro compilador.
  2. Visual Studio não é um compilador. 
  3. Se quer compilar como eu mostrei deve usar 

    image.png.49b7228fb9ff77f6483b1a5dfa9c2dc8.png

 

 

 

 

 

 

 

 

 

 

 

Tools | Command Line | Developer Command Prompt

 

e aí vai abrir uma console com as variáveis todas configuradas e poderá compilar o programa normalmente...

 

O compilador CL, claro. Leu o manual? Viu a ajuda? As opções são diferentes no CL:
 


C:\src\ifdef>dir tst*.*
 O volume na unidade C não tem nome.
 O Número de Série do Volume é 7E52-1BF2

 Pasta de C:\src\ifdef

09/12/2020  11:02               899 tst.cpp
               1 arquivo(s)            899 bytes
               0 pasta(s)   86.562.738.176 bytes disponíveis

C:\src\ifdef>cl /std:c++17 /EHsc tst.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.27.29112 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

tst.cpp
Microsoft (R) Incremental Linker Version 14.27.29112.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:tst.exe
tst.obj

C:\src\ifdef>dir tst*.*
 O volume na unidade C não tem nome.
 O Número de Série do Volume é 7E52-1BF2

 Pasta de C:\src\ifdef

09/12/2020  11:02               899 tst.cpp
10/12/2020  23:51           253.440 tst.exe
10/12/2020  23:51           155.008 tst.obj
               3 arquivo(s)        409.347 bytes
               0 pasta(s)   86.561.218.560 bytes disponíveis

C:\src\ifdef>
                                                                                                                        
                           

 

 

Se vai usar dentro do Visual Studio as opções ficam em outro lugar:

 

image.png.364c1547f2d2a6e7e94e9212812297fe.png

 

 

nas propriedades do projeto, claro. Basta usar o botão direito do mouse.

 

1 hora atrás, devair1010 disse:

chaves depois dos nomes das variáveis ?

 

Uma convenção de inicializar todas as variáveis. As chaves indicam zero.

 

1 hora atrás, devair1010 disse:

queria era na linguagem  c  ,  imagino que tenha algum modo , pois lá a quarenta anos atrás ,  o compilador sabia o tipo da variável , para adicionar o valor certo para elas ,  mas assim mesmo já vai ajudar muito  ,    valeu  ,        obrigado  ,

 

O compilador sabe, mas ele não precisa dizer para o programa. E em C não diz.

 

Em C++ pode ser preciso mas é outro mundo:

  • Em C++ tem overloading e funções virtuais então pode ser preciso saber qual das funções de mesmo nome estamos falando. 
  • Em C++ tem templates então pode escrever declarações onde os tipos são baseados em parâmetros. E então pode precisar declarar uma variável com o tipo de outra, sem saber qual é na hora. Algo como 
    char a = 'a';
    decltype(a) b = 0;
  • tem os trailing return types, que não sei como fala em português, onde pode precisar
    template <typename A, typename B>
    auto funcao(A a, B b) -> decltype(a * b){ return (a * b); }

    e assim o retorno de funcao() vai depender dos tipos de a e b

  • tem um caso similar com funções lambda

  • e deve ter outros que não conheço ou não me lembro agora

1 hora atrás, devair1010 disse:

eu não tenho nenhuma utilidade muito importante , não ,  estou querendo fazer um menu que se mova enquanto o programa está rodando , e nele uma função que pega o que o usuário digitar no teclado e adicione o que for digitado na variável do modo certo

 

eu já mostrei uma maneira de fazer isso em Windows, em C e C++ com exemplos. E expliquei como fazer no Mac/Linux, naqueles programas dinâmicos de menu sem leitura. Veja nas coisas que eu postei. Nã me lembro agora.

 

Mas o comum é

  • verificar o buffer do teclado e nao usar nenhuma função de leitura. Ou
  • desligar echo e line input e ler um caracter por vez e tratar como nos anos 70 no Unix. Ler sem echo ecoar quando ok e a leitura retorna na hora.

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!