Ir ao conteúdo
  • Cadastre-se

C++ ao converter setbit em long- ERRO: a expressão deve possuir tipo de classe


kleberaugus

Posts recomendados

Estou tentando converter um set bit para long para depois converte-lo em inteiro, mas nesse código:

std::bitset<9> binario2(std::string(binario));
            
            unsigned long value = binario2.to_ulong();

na expressão de baixo o "binario2" fica sublinhado de vermelho e escreve que a expressão deve possuir um tipo de classe, no início declarei #define <bitset>

Link para o comentário
Compartilhar em outros sites

image.png.ce18e282329669bff34d19022a1ca101.png

 

Talvez você não tenha lido direito a documentação... O que está tentando fazer?

 

Eu nunca tinha visto um bitset<9> Onde arrumou esse número? Nada eficiente... Em geral você tenta 8,16,32,64 ou um número enorme mesmo, tipo 1000 deles, em situações em que a lógica justifica um painel enorme de bits on/off.

 

Como declarou binário? o que é? 

 

Vou te mostrar um programa que define um bitset de 9 bits e tenta acessar 10 bits pra você ver a mecânica disso. E também dos bits sem e com sinal para 1 2 e 4 bytes.

 

long e int são a mesma coisa em windows 32 bits.

 

Saida

Spoiler

uint4 2147483648
uint2 32768
uint1 128
int4 -2147483648
int4 hex 0x80000000
int2 -32768
int2 hex 0x8000
int1 -128

Tamanho em bytes
char 1
short 2
int 4
long 4
long long 8


b i t s e t
nove_bits tem 0 bits '1'

 

Tentando ligar bit 0
nove_bits tem 1 bits '1'
bits em string 000000001
bits em long long 1

 

Tentando ligar bit 1
nove_bits tem 2 bits '1'
bits em string 000000011
bits em long long 3

 

Tentando ligar bit 2
nove_bits tem 3 bits '1'
bits em string 000000111
bits em long long 7

 

Tentando ligar bit 3
nove_bits tem 4 bits '1'
bits em string 000001111
bits em long long 15

 

Tentando ligar bit 4
nove_bits tem 5 bits '1'
bits em string 000011111
bits em long long 31

 

Tentando ligar bit 5
nove_bits tem 6 bits '1'
bits em string 000111111
bits em long long 63

 

Tentando ligar bit 6
nove_bits tem 7 bits '1'
bits em string 001111111
bits em long long 127

 

Tentando ligar bit 7
nove_bits tem 8 bits '1'
bits em string 011111111
bits em long long 255

 

Tentando ligar bit 8
nove_bits tem 9 bits '1'
bits em string 111111111
bits em long long 511

 

Tentando ligar bit 9
Deu erro 'invalid bitset position' no bit 9

 

 

E o programa

#include <bitset>
#include <iomanip>
#include <iostream>
#include <string>

	using namespace std;
	int main(int argc, char** argv)
	{
		unsigned int int4bytes = 0x80'00'00'00;
		cout << "uint4 " << int4bytes << endl;

		unsigned int int2bytes = 0x80'00;
		cout << "uint2 " << int2bytes << endl;

		unsigned char int1byte = 0x80;
		cout << "uint1 " << (int)int1byte << endl;

		// agora com sinal
		int   sint4bytes = int4bytes;
		short sint2bytes = int2bytes;
		int8_t sint1byte = int1byte;
 // 4
		cout << "int4 " << sint4bytes << endl;
		cout << "int4 hex 0x" << std::hex << sint4bytes << endl;
// 2
		cout << "int2 " << std::dec << sint2bytes << endl;
		cout << "int2 hex 0x" << std::hex 
			<< sint2bytes << std::dec << endl;
		
// 1
		printf("int1 %d\n", sint1byte);

		cout << "\nTamanho em bytes" << endl;
		cout << "char " << sizeof(char) << endl;
		cout << "short " << sizeof(short) << endl;
		cout << "int " << sizeof(int) << endl;
		cout << "long " << sizeof(long) << endl;
		cout << "long long " << sizeof(long long) << endl;

		cout << "\n\nb i t s e t" << endl;;
		std::bitset<9> nove_bits(std::string("000000000"));
		cout << "nove_bits tem " << nove_bits.count() 
			<< " bits '1'" << endl;

		for (int i = 0; i < 10; i += 1)
		{
			try
			{
				cout << "\nTentando ligar bit " << i << endl;
				nove_bits.set(i);
				cout << "nove_bits tem " << nove_bits.count()
					<< " bits '1'" << endl;
				cout << "bits em string "
					<< nove_bits.to_string() << endl;
				cout << "bits em long long "
					<< nove_bits.to_ullong() << endl;
			}
			catch (std::out_of_range& e)
			{
				cout << 
					"Deu erro '" <<
					e.what() << "' no bit " << i << endl;
			};
		};
	};

	// fim

 

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

@arfneto

2 horas atrás, arfneto disse:

Eu nunca tinha visto um bitset<9> Onde arrumou esse número?

Eu já conversei com você sobre isso, é que estou lendo uma stream e iostream( ou ifstream não lembro, não estou no pc agora) não aceita unsigned char, aí vem char de 9 bits, o nono bit sendo o sinal.

adicionado 1 minuto depois

Por mim eu gravaria com unsigned char, mas não aceita.

adicionado 8 minutos depois

A minha dúvida é: se eu leio 9 bits para cada inteiro que vem da stream, quando eu mando um inteiro pro buffer ser gravado esse inteiro é gravado com 9 bits, certo?

Link para o comentário
Compartilhar em outros sites

3 minutos atrás, kleberaugus disse:

Eu já conversei com você sobre isso, é que estou lendo uma stream e iostream( ou ifstream não lembro, não estou no pc agora) não aceita unsigned char, aí vem char de 9 bits, o nono bit sendo o sinal.

 

Eu sei. 

 

Apenas entenda que o espaço é alocado sempre em múltiplos de 8 então ver um bitset<9> não é normal. Ainda que vá usar só nove, em geral se declara 16 ou 32 que é um int afinal. Mais eficiente e talvez vá alocar de todo modo os 32. MAs ao menos 16...

 

7 minutos atrás, kleberaugus disse:

stream e iostream( ou ifstream não lembro, não estou no pc agora) não aceita unsigned char

 

Foi você que concluiu isso, mas não é verdade. Eu até te mostrei a tela com o protótipo de read(). É só um endereço. Aceita qualquer coisa. Qualquer coisa.

Use unsigned. E pesquise o que quer fazer porque pode te ajudar. Se quer usar algo em termos de sequencias de bits deveria ler sobre os algoritmos RLE. Claro que você pode chegar a algo similar ou melhor, mas não vai te fazer mal ver ANTES o que se usa desde os anos 70...

adicionado 0 minutos depois

rode o programa que te enviei e vai entender o que está errado em seu código original

Link para o comentário
Compartilhar em outros sites

Obrigado, quando estiver em casa vou ver isso.

adicionado 16 minutos depois

t@arfneto

49 minutos atrás, arfneto disse:

Ainda que vá usar só nove, em geral se declara 16 ou 32 que é um int afinal. Mais eficiente e talvez vá alocar de todo modo os 32. MAs ao menos 16...

 

Só agora entendi a lógica da coisa, o importante é ser int para gravar, mas porque eu me daria o trabalho de colocar mais zeros se de qualquer forma vai ser convertido para int? Pra mim isso seria trabalho inútil, mas eu entendi (só agora) o que você quis dizer

adicionado 28 minutos depois

Mas talvez esteja havendo uma divergencia de informações, esses bits estão em uma string, talvez você esteja falando de modificar um int diretamente.

Link para o comentário
Compartilhar em outros sites

33 minutos atrás, kleberaugus disse:

Só agora entendi a lógica da coisa, o importante é ser int para gravar, mas porque eu me daria o trabalho de colocar mais zeros se de qualquer forma vai ser convertido para int

 

não.
você pode ter um bitset de milhares de bits. É uma abstração. Só que tem que ser alocado em alguma unidade e a menor é bit e assim um bitset<9> é algo raro de se ver :) Eu nunca tinha visto. 

 

E você não precisa disso.

 

Mais um bonus: esse programa abre um arquivo que você passa na linha de comando. Se o programa em sua maquina for x.c você usa 

    x teste.txt

e ele

  • procura e abre na pasta um arquivo "teste.txt"
  • le em um unsigned char[]
  • mostra cada byte dele em uma linha, em decimal hexa e em texto
  • cria o bitset<8> dele a partir de cada byte unsigned char.
  • mostra quantos bits estão "set"
  • converte os bits pra string e mostra na tela
  • Até o fim do arquivo

Para o arquivo teste.txt com uma linha só 
 

image.png.9447a349306ae53d284ef07d66d4d19c.png

 

Vai mostrar isso
 

Citação


Valor lido em hex 41 em decimal 65 = 'A'
        ==> tem 2 bits '1'. Bit a bit: [01000001]

Valor lido em hex 42 em decimal 66 = 'B'
        ==> tem 2 bits '1'. Bit a bit: [01000010]

Valor lido em hex 43 em decimal 67 = 'C'
        ==> tem 3 bits '1'. Bit a bit: [01000011]

Valor lido em hex 44 em decimal 68 = 'D'
        ==> tem 2 bits '1'. Bit a bit: [01000100]

Valor lido em hex a em decimal 10
        ==> tem 2 bits '1'. Bit a bit: [00001010]

 


RODE esse programa e vai entender melhor isso.

 

Entenda que com C++ e essa classe bitset você já pode ler seu arquivo inteiro direto em bits, sem intermediários. Ou em blocos de bitset<X> com X bem grande.

 

C++ praticamente não tem comparação em termos de facilidade para criar abstrações, o que o criador da linguagem sempre classifica como "abstrações de custo zero".

 

#define _CRT_SECURE_NO_WARNINGS
#include <bitset>
#include <ctype.h>
#include <fstream>
#include <iomanip>
#include <iostream>

using namespace std;

int main(int argc, char** argv)
{
	if (argc < 2) return -1;
	ifstream en{ argv[1] };
	if( !en )return -1;
	unsigned char buffer[256];
	do
	{
		en.read((char*)buffer, 1);
		if (en.gcount() == 1)
		{
			cout <<
				"\nValor lido em hex " << hex << (int) buffer[0] << 
				" em decimal " << dec << (int) buffer[0];
			if (isprint(buffer[0]))
				cout << " = '" << buffer[0] << "'" << endl;
			else
				cout << endl;
			bitset<8> oito_bits(buffer[0]);
			cout << "\t==> tem " << oito_bits.count() <<
				" bits '1'. Bit a bit: [";
			cout << oito_bits.to_string() << "]" << endl;
		};
	} while (!en.fail());
	en.close();
	return 0;
};

Acho que assim vai entender que está errado nessa lance de read() aceitar ou não algo, como te expliquei DUAS vezes já

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

 

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!