Ir ao conteúdo
  • Cadastre-se

C Ponteiros "com char e short"


jpaulofsa

Posts recomendados

#include <stdio.h>
#include <stdlib.h>

void soma(short* a, short* b) 
{
	*a = x;
	*b = y;
	}	
	
int main(void)

{
	char x, y; //2 variáveis do tipo char
	printf("Informe um numero entre -32767 e 32767\n");
	scanf("%c", &*x);
	printf("Informe outro numero entre -32767 e 32767\n");
	scanf("\n%c", &*y);
	a = x;
	b = y;
	short soma = a + b;
	printf("Primeiro numero eh: %hi\n", x);
	printf("Segundo numero eh: %hi\n", y);
	printf("A soma dos numeros eh: %hi\n", soma);
	system ("pause");
	return 0;
}

Boa Noite!

 

Preciso criar um programa que recebe dois números inteiros (short) que possam ser armazenados por variáveis (char) e transfiram seus valores para variáveis do tipo short e some os valores desses dois números, salvando o resultado também em uma variável do tipo short. Penso que isso deve ser feito através de ponteiros, mas já quebrei a cabeça e não saio do lugar. Algum colega conseguiria ajudar-me!?

Link para o comentário
Compartilhar em outros sites

#include<stdio.h>
#include<stdlib.h>

int main(){
    char* vetor = (char*)malloc(10);
    int n = 25232;

    //guardar um int em um vetor
    vetor[0] = *((char*)(&n) + 0);
    vetor[1] = *((char*)(&n) + 1);
    vetor[2] = *((char*)(&n) + 2);
    vetor[3] = *((char*)(&n) + 3);


    //devolver o vetor para um int
    int x = *(int*)vetor;//
    printf("%d\n", x);

    //usar o array como se fosse um int
    int *p = (int*)vetor;
    printf("%d\n", *p);

    free(vetor);
    return 0;
}

Algo assim?

 

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

 Primeiro, uma variável do tipo char só suporta 1 byte, um short suporta 2 bytes, então se você jogasse 2 bytes

 em uma variável do tipo char, 1 byte seria escrito em endereço desconhecido.. mas se mesmo assim você quiser

 fazer isso, você faz assim :

    char* a = new char();

    scanf_s("%d", a);
    
    // 'força' o compilador a interpretar o endereço retornado pela 
    // variável 'a' como sendo do tipo short
    short* c = reinterpret_cast<short*>(a);
      
    cout << *c << endl;

não analisei a função scanf internamente, mas provavelmente ela guarda o input do usuário em uma variável do tamanho

do formato passado e joga o input no endereço apontado pelo ponteiro sem verificar o tipo do ponteiro.. mas como foi dito antes, neste caso, será jogado 4 bytes dentro de uma variável (que está no heap) que suporta 1 byte, 3 bytes serão escritos em endereços desconhecidos..

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

 

12 horas atrás, jpaulofsa disse:

... Penso que isso deve ser feito através de ponteiros ...

Sim, também acho. 

3 horas atrás, vangodp disse:

Por isso deve ser um vetor e não um simples char

Ou então somente com sorte não travará o programa.

 

12 horas atrás, jpaulofsa disse:

Preciso criar um programa que recebe dois números inteiros (short) que possam ser armazenados por variáveis (char)

Existem muitas garantias de que o modificador short tem efeito na variável inteira de 32bits reduzindo-a para 16 bits. Entretanto só por segurança quando declarar os vetor de char (1 byte por 1) fazei assim com sizeof:

Exemplo:

// Exemplo de uso de cast entre tipos: char[] to short
#include <stdio.h>
int main() {
    short sValor, *sPonto;
    char cVetor[sizeof(short)];

    sValor= 32000;
    sPonto= &sValor;
  
    //<!> cast entre ponteiros deve ser
    *((short*)cVetor)= *sPonto;// sempre explicitado.

    printf("cVetor[] tem %d bytes.\n",sizeof(cVetor));
    printf("sValor tem %d bytes.\n\n",sizeof(sValor));

    printf("cVetor[] tem %hd no valor.\n",*((short*)cVetor));//<!>cast sempre...
    printf("sValor tem %hd no valor.\n\n",*sPonto);
    return 0;
    }

 

 

adicionado 22 minutos depois

Com base em tudo o seu programa terá seguinte formato +/-:

Programa:

#include <stdio.h>
#include <stdlib.h>

short soma_fn(short* a, short* b)
{
    return(*a + *b);
}

int main(void)
{
	char x[sizeof(short)]; //1 variáveis do tipo char
	char y[sizeof(short)]; //2 variáveis do tipo char

	printf("Informe um numero entre -32767 e 32767\n");
	scanf("%hi",(short*)x);
	printf("Informe outro numero entre -32767 e 32767\n");
	scanf("%hi",(short*)y);
	short soma= soma_fn((short*)x,(short*)y);

	printf("Primeiro numero eh: %hi\n",*((short*)x) );
	printf("Segundo numero eh: %hi\n", *((short*)y) );
	printf("A soma dos numeros eh: %hi\n",soma );
	system ("pause");

	return 0;
}

:thumbsup:

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

Muito Obrigado a todos.

adicionado 8 minutos depois

@Mauro Britivaldo e aos demais colegas, quer dizer que o comando sizeof força a variável armazenar bytes por passagem de parâmetros mesmo de capacidades diferentes? tipo: char só suporta 1 byte e short suporta 2 bytes, com o comando sizeof o ponteiro entres esses dois tipos é possível? foi que ocorreu no código

 

Obs.: O programa estava com outro probleminha que percebi depois, mas foi resolvido, a variável soma também era do tipo short e quando a soma dava mais que o valor suportado pelo tipo short, o programa apresentava erro, conseguir resolver declarando soma como int.

adicionado 8 minutos depois

@Mauro Britivaldo e aos demais colegas, quer dizer que o comando sizeof força a variável armazenar bytes por passagem de parâmetros mesmo de capacidades diferentes? tipo: char só suporta 1 byte e short suporta 2 bytes, com o comando sizeof o ponteiro entres esses dois tipos é possível? foi que ocorreu no código

 

Obs.: O programa estava com outro probleminha que percebi depois, mas foi resolvido, a variável soma também era do tipo short e quando a soma dava mais que o valor suportado pelo tipo short, o programa apresentava erro, conseguir resolver declarando soma como int.

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

1 hora atrás, jpaulofsa disse:

e aos demais colegas, quer dizer que o comando sizeof força a variável armazenar bytes por passagem de parâmetros mesmo de capacidades diferentes? tipo: char só suporta 1 byte e short suporta 2 bytes, com o comando sizeof o ponteiro entres esses dois tipos é possível? foi que ocorreu no código

O que o operador sizeof faz é medir em bytes o tamanho de uma variáveis short e retorna esse tamanho para o vetor de char, com 100% de garantia que o vetor char terá a grandeza para uma variável short. 

 

O operador sizeof retorna sempre o tanho das coisas em bytes.

 

  • Curtir 1
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...