Ir ao conteúdo

sobre operador '.'(ponto) e ponteiros


Cambalinho

Posts recomendados

Postado

desculpem mas qual é o nome do operador '.'(ponto) e o operador '*' dos ponteiros?

outra coisa quando se faz:

class.membro

como posso obter o endereço ou o valor apontado pelo endereço do membro?

(desculpem, mas esta-me a falar alguns termos correctos)

Postado

imagina que tenho 1 variavel dentro de 1 class que precisa de receber o endereço de 1 variavel:

void ReceberEndereco(void *endereco)
{
void *r;
r=endereco;
}

é possivel meter só o nome da variavel e ir buscar o endereço dela?

void ReceberEndereco(void &endereco)
{
void *r;
r=endereco;
}

//uso
int b;
objecto.ReceberEndereco(;

Postado
#include <stdio.h>


void ReceberEndereco(void *ptr)
{
printf("%x\n", ptr);
}

int main()
{
int b;

printf("%x\n", &;


ReceberEndereco(&;

getchar();
return 0;
}

isso eu entendi... mas eu queria desta forma amigo:

#include <stdio.h>


void ReceberEndereco(void *ptr)//o que posso alterar aqui nesta linha?
{
printf("%x\n", ptr);
}

int main()
{
int b;

printf("%x\n", &;


ReceberEndereco(;

getchar();
return 0;
}

(tenho mais 1 duvida, mas depois vemos isso amigo)

Postado

#include <stdio.h>


void ReceberEndereco(int &ptr)//o que posso alterar aqui nesta linha?
{
printf("%p\n", &ptr);
}

int main()
{
int b;

printf("%p\n", &;


ReceberEndereco(;

getchar();
return 0;
}

Compile como C++

:natal:

LNW

Postado
#include <stdio.h>


void ReceberEndereco(int &ptr)//o que posso alterar aqui nesta linha?
{
printf("%p\n", &ptr);
}

int main()
{
int b;

printf("%p\n", &;


ReceberEndereco(;

getchar();
return 0;
}

Compile como C++

:natal:

LNW

boas festas tambem para ti amigo. e para todo o forum :natal:

ve esta alteraçao no codigo, por favor:

int main()
{
int b=200;

//printf("%p\n", &;
void *test;

//ReceberEndereco(;
test=&b;
getchar();
return 0;
}

como posso imprimir o valor de 'b' usando o ponteiro test sem saber mos o tipo de 'b'?

Postado
int main()
{
int b=200;

//printf("%p\n", &;
void *test;

//ReceberEndereco(;
test=&b;
getchar();
return 0;
}

como posso imprimir o valor de 'b' usando o ponteiro test sem saber mos o tipo de 'b'?

Eu acho que não dá.. em algum momento o tipo teria de ser conhecido para depois fazer um casting de void* para int*:

printf("%d\n", *((int*)test));

Boas festas também, Cambalinho. ;)

:natal:

LNW

Postado
como posso imprimir o valor de 'b' usando o ponteiro test sem saber mos o tipo de 'b'?

Template.

Basta criar um tipo genérico de maneira que o tipo de b seja o tipo do pointer.


template<typename [COLOR="blue"]tipo[/COLOR]>
void ReceberEndereco(const [COLOR="blue"]tipo[/COLOR] &
{
[COLOR="blue"]tipo[/COLOR] *b_ptr;
b_ptr = &b;
// continua
}

Postado
Eu acho que não dá.. em algum momento o tipo teria de ser conhecido para depois fazer um casting de void* para int*:

printf("%d\n", *((int*)test));

Boas festas também, Cambalinho. ;)

:natal:

LNW

e que tal imprimi-lo(seja numero\char*\numero) em string?

consegui algo:

printf("%s\n", static_cast<string *>(test));

mas converte o 200 para char lol

como posso alterar isso?

Postado
e que tal imprimi-lo(seja numero\char*\numero) em string?

consegui algo:

printf("%s\n", static_cast<string *>(test));

mas converte o 200 para char lol

como posso alterar isso?

Daria para fazer assim, Cambalinho:

cout << to_string(*(static_cast<int *>(test)));

Já adianto que std::to_string não está disponível no MingW. Rode o código acima no Visual C++.

EDIT

Uma correção: para que a função std::to_string possa ser usada, é necessário especificar o novo padrão ao g++:

$ g++ -std=c++11

:natal:

LNW

Postado
Daria para fazer assim, Cambalinho:

cout << to_string(*(static_cast<int *>(test)));

Já adianto que std::to_string não está disponível no MingW. Rode o código acima no Visual C++.

:natal:

LNW

tenho essa funçao sim senhor ;)

mas nao queria dessa forma :(

esquece o int, como transformo o valor em string?(em vez de imprimir int quero imprimir directamente em string)

(desculpa alguma coisa amigo)

Postado
Usa a std :: ostringstream: http://www.cplusplus.com/reference/sstream/ostringstream/


template <typename data_type>
std::string to_string(const data_type &given_number)
{
std::ostringstream converter;
converter << given_number;
return converter.str();
};

No exemplo acima você converte qualquer coisa para std::string.

desculpa mas nao funciona:

int main()
{
int b=200;

//printf("%p\n", &;
void *test;

//ReceberEndereco(;
test=&b;
std::ostringstream converter;
converter << *test;
getchar();
return 0;
}

eu nao quero saber que tipo é o *test, mas quero que ele imprime em forma de string

Postado

O uso de um objeto do tipo std :: ostringstream deve ser mais ou menos como nesse exemplo:


// ostringstream constructor
#include <iostream> // std::cout, std::ios
#include <sstream> // std::ostringstream

int main () {
std::ostringstream foo; // out
std::ostringstream bar (std::ostringstream::ate); // out|ate

foo.str("Test string");
bar.str("Test string");

foo << 101;
bar << 101;

std::cout << foo.str() << '\n';
std::cout << bar.str() << '\n';
return 0;
}

Daí basta arrumar o teu código da maneira que quiser. Pra mais detalhes: http://www.cplusplus.com/reference/sstream/ostringstream/ostringstream/

Postado
O uso de um objeto do tipo std :: ostringstream deve ser mais ou menos como nesse exemplo:


// ostringstream constructor
#include <iostream> // std::cout, std::ios
#include <sstream> // std::ostringstream

int main () {
std::ostringstream foo; // out
std::ostringstream bar (std::ostringstream::ate); // out|ate

foo.str("Test string");
bar.str("Test string");

foo << 101;
bar << 101;

std::cout << foo.str() << '\n';
std::cout << bar.str() << '\n';
return 0;
}

Daí basta arrumar o teu código da maneira que quiser. Pra mais detalhes: http://www.cplusplus.com/reference/sstream/ostringstream/ostringstream/

desculpa. mas ve este codigo:

int a=1200;
void *b=&a;
cout << string(*;//esta linha esta mal, mas eu estou tentar demonstrar o que preciso

no cout quero imprimir o valor 'a' mas como string("1200")...

(desculpa o meu portugues mas estou a tentar :()

eu sei que tenho:

cout << static_cas<int *>(;

mas em vez do int quero string, para imprimir como string

Postado
desculpa. mas ve este codigo:

int a=1200;
void *b=&a;
cout << string(*;//esta linha esta mal, mas eu estou tentar demonstrar o que preciso

no cout quero imprimir o valor 'a' mas como string("1200")...

(desculpa o meu portugues mas estou a tentar :()

eu sei que tenho:

cout << static_cas<int *>(;

mas em vez do int quero string, para imprimir como string

É simples.

Uso:


cout << string(;

Implementação:


#include <sstream>

template <typename type>
std::string string(const type &
{
std::ostringstream a;
a << b;
return a.std::ostringstream::str();
};

Postado
É simples.

Uso:


cout << string(;

Implementação:


#include <sstream>

template <typename type>
std::string string(const type &
{
std::ostringstream a;
a << b;
return a.std::ostringstream::str();
};

friend ostream& operator <<(ostream &os,const variant2 &obj)
{
os <<string(obj.Vvariant) ;//Vvariant é do tipo void*
return os;
}

e tenho este erro:

- "error: invalid conversion from 'void*' to 'const char*' [-fpermissive]"

outra coisa: posso criar 1 variavel que posso receber o tipo de variavel?

typeid d;//este tipo nao existe, mas é para entenderes o que pretendo
d=typeid(nomevariavel);

porque nao usar o string? porque só recebo 1 ou 2 letras e assim nao posso usar no casting ;)

Postado

void significa "sem tipo". E obviamente o compilador não sabe converter um não-tipo pra um tipo.

O que você deve dar como argumento de string() deve ser algo com tipo: int, double, float, char, ou alguma de suas variações long, long long, short, unsigned etc.

Remova esse ponteiro void*, não se usa isso para armazenar valores. Apenas endereços da memoria.

Postado
void significa "sem tipo". E obviamente o compilador não sabe converter um não-tipo pra um tipo.

O que você deve dar como argumento de string() deve ser algo com tipo: int, double, float, char, ou alguma de suas variações long, long long, short, unsigned etc.

Remova esse ponteiro void*, não se usa isso para armazenar valores. Apenas endereços da memoria.

mas posso criar 1 variavel que possa receber os tipos de variavel?

Postado
mas posso criar 1 variavel que possa receber os tipos de variavel?

Claro. Quando tentar programar de forma genéria, já sabes a solução: template.


template <typename tipo>

e tipo se comporta como quiser: int, double, float, char etc.

Postado
Claro. Quando tentar programar de forma genéria, já sabes a solução: template.


template <typename tipo>

e tipo se comporta como quiser: int, double, float, char etc.

nao resulta nest situaçao:

class variant2
{
private:
void *Vvariant=NULL;
string typ;
public:

template<typename b>
variant2 (b &value)
{
Vvariant=&value ;
typ=typeid(value).name();
}

template<typename b>
variant2 & operator = (b &value)
{
Vvariant=&value ;
typ=typeid(value).name();
}

friend ostream& operator <<(ostream &os,const variant2 &obj)
{
os <<*static_cast<typ>( obj.Vvariant) ;
return os;
}
};

Postado
nao resulta nest situaçao:

class variant2
{
private:
void *Vvariant=NULL;
string typ;
public:

template<typename b>
variant2 (b &value)
{
Vvariant=&value ;
typ=typeid(value).name();
}

template<typename b>
variant2 & operator = (b &value)
{
Vvariant=&value ;
typ=typeid(value).name();
}

friend ostream& operator <<(ostream &os,const variant2 &obj)
{
os <<*static_cast<typ>( obj.Vvariant) ;
return os;
}
};

Nunca vai funcionar, veja o que esta tentando fazer ¬¬.

Já te mostrei neste Topico uma implemetação para Variant, você vai precisar guardar a informação com o tipo do dado em alguma variavel.

Mas implementei um copiazinha da Variant que te mostrei em C++, acho que consegue terminar o restante;

#include <iostream>
#include <string>

using namespace std;

const long CV_EMPTY = 0x0;
const long CV_VOID = 0x1;
const long CV_BOOLEAN = 0x2;
const long CV_CHAR = 0x3;
const long CV_I1 = 0x4;
const long CV_U1 = 0x5;
const long CV_I2 = 0x6;
const long CV_U2 = 0x7;
const long CV_I4 = 0x8;
const long CV_U4 = 0x9;
const long CV_I8 = 0xa;
const long CV_U8 = 0xb;
const long CV_R4 = 0xc;
const long CV_R8 = 0xd;
const long CV_STRING = 0xe;
const long CV_PTR = 0xf;
const long CV_DATETIME = 0x10;
const long CV_TIMESPAN = 0x11;
const long CV_OBJECT = 0x12;
const long CV_DECIMAL = 0x13;
const long CV_ENUM = 0x15;
const long CV_MISSING = 0x16;
const long CV_NULL = 0x17;
const long CV_LAST = 0x18;

class Variant
{
private:
void *m_objref = NULL;
int m_data1;
int m_data2;
long m_flags = 0;

string result;
public:

Variant(bool val) {
m_objref = NULL;
m_flags = CV_BOOLEAN;
m_data1 = (val) ? 1 : 0;
m_data2 = 0;
}

Variant(int val) {
m_objref = NULL;
m_flags = CV_I2;
m_data1 = (int) val;
m_data2 = (int) (((long) val) >> 32);
}

string to_string()
{
switch (m_flags)
{
case CV_BOOLEAN:
result = m_data1 ? "True" : "False";
break;
case CV_I2:
result = std::to_string((int) m_data1);
break;
default:
break;
}
return result;
}
};

int main()
{
Variant b = false;
Variant i = 10;

cout << b.to_string() << endl;
cout << i.to_string() << endl;

getchar();
return 0;
}

Postado
Nunca vai funcionar, veja o que esta tentando fazer ¬¬.

Já te mostrei neste Topico uma implemetação para Variant, você vai precisar guardar a informação com o tipo do dado em alguma variavel.

Mas implementei um copiazinha da Variant que te mostrei em C++, acho que consegue terminar o restante;

#include <iostream>
#include <string>

using namespace std;

const long CV_EMPTY = 0x0;
const long CV_VOID = 0x1;
const long CV_BOOLEAN = 0x2;
const long CV_CHAR = 0x3;
const long CV_I1 = 0x4;
const long CV_U1 = 0x5;
const long CV_I2 = 0x6;
const long CV_U2 = 0x7;
const long CV_I4 = 0x8;
const long CV_U4 = 0x9;
const long CV_I8 = 0xa;
const long CV_U8 = 0xb;
const long CV_R4 = 0xc;
const long CV_R8 = 0xd;
const long CV_STRING = 0xe;
const long CV_PTR = 0xf;
const long CV_DATETIME = 0x10;
const long CV_TIMESPAN = 0x11;
const long CV_OBJECT = 0x12;
const long CV_DECIMAL = 0x13;
const long CV_ENUM = 0x15;
const long CV_MISSING = 0x16;
const long CV_NULL = 0x17;
const long CV_LAST = 0x18;

class Variant
{
private:
void *m_objref = NULL;
int m_data1;
int m_data2;
long m_flags = 0;

string result;
public:

Variant(bool val) {
m_objref = NULL;
m_flags = CV_BOOLEAN;
m_data1 = (val) ? 1 : 0;
m_data2 = 0;
}

Variant(int val) {
m_objref = NULL;
m_flags = CV_I2;
m_data1 = (int) val;
m_data2 = (int) (((long) val) >> 32);
}

string to_string()
{
switch (m_flags)
{
case CV_BOOLEAN:
result = m_data1 ? "True" : "False";
break;
case CV_I2:
result = std::to_string((int) m_data1);
break;
default:
break;
}
return result;
}
};

int main()
{
Variant b = false;
Variant i = 10;

cout << b.to_string() << endl;
cout << i.to_string() << endl;

getchar();
return 0;
}

dessa forma tenho de fazer 1 construtor para cada tipo... mas avalia-me esta por favor:

#include <iostream>
#include <string.h>
#include <typeinfo.h>

using namespace std;

class Variant
{
private:

string result;
public:

Variant()
{
}

template<typename B>
Variant(B val)
{
result=to_string(val);
}

Variant(string val)
{
result=val;
}

Variant(char *val)
{
result=val;
}

Variant(bool val)
{
result=to_string(val);
if (result=="0")
{
result="false";
}
else
{
result="true";
}
}

friend ostream& operator<< (ostream &out, Variant &VResult)
{
out <<VResult.result;
return out;
}

friend istream& operator>> (istream &in, Variant &VResult)
{
getline(in,VResult.result);
return in;
}
};

int main()
{
Variant b = false;
Variant i = 10;

cout <<b << "\n";//prints "false"
cout <<i << "\n";//prints "10"
cin >> i;//read i
cout << i;//prints i
int a=1000;
string v="hello world";
i=a;
cout << "\n" << i;
i=v;
cout << "\n" << i;
getchar();
return 0;
}

só nao consigo com que aceite o endereço da variavel :(

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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!