Ir ao conteúdo

Posts recomendados

Postado

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
Postado
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
Postado

@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
Postado
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.

 

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!