Como resolver warning: multi-character? [RESOLVIDO]

1. Como resolver warning: multi-character? [RESOLVIDO]

Pedro
phsmoura

(usa Debian)

Enviado em 31/03/2018 - 13:48h

Estou criando um sistema de arquivos, para isso criei um arquivo com "fopen" e o populei usando "fwrite" com um caractere que será considerado nulo para esse meu sistema de arquivos. Fui na parte alta da tabela ASC II e usei o caractere 'ÿ' que é equivalente a FF em hexadecimal e não é muito utilizado.

Entretanto quando compilo o codigo aparece o seguinte:
main.c: In function ‘formatahd’:
main.c:96:11: warning: multi-character character constant [-Wmultichar]
char c = 'ÿ'; // FF em hexadecimal
^~~~
main.c:96:11: warning: overflow in implicit constant conversion [-Woverflow]

Essa função "formatahd" está desse jeito:
int formatahd(char nome_hd[]){
char c = 'ÿ'; // FF em hexadecimal

strcat(diretorio, nome_hd);

FILE *f_hdv;
f_hdv = fopen(diretorio, "wb");

if (f_hdv == NULL){
strcpy(diretorio, dir_padrao);
return -1;
}

for (i = 0; i < BLK_SIZE * BLK_QTD; i++){
fwrite(&c,sizeof(char),1,f_hdv);
}

fclose(f_hdv);

//retirar depois
f_hdv = fopen(diretorio , "rb");

if (f_hdv == NULL){
return -1;
}

for (i = 0; i < BLK_SIZE * BLK_QTD; i++){
fread(&c,sizeof(char),1,f_hdv);
printf("%c ", c);
}

fclose(f_hdv);
printf("\n");
// ate aqui

strcpy(diretorio, dir_padrao);
return 1;
}

Coloquei um fread ai pra conferir se o que estou escrevendo está certo, porém ao inves de aparecer 'ÿ' aparece '? ' dentro de um losango

Como posso resolver?

O codigo completo está no link abaixo:
https://github.com/phsmoura/Sistema-de-arquivos---SO/blob/master/main.c

Agradeço quem puder ajudar


  


2. Re: Como resolver warning: multi-character?

Paulo
paulo1205

(usa Ubuntu)

Enviado em 31/03/2018 - 14:26h

De fato, o caráter y-com-trema tem o código 255 nos conjuntos de caracteres Unicode, ISO-8859-1 e Windows CP1252. Contudo, no caso do Unicode, que é um conjunto de caracteres com mais de um milhão de caracteres e símbolos, um único byte não é suficiente para representar todos os possíveis caracteres.

Existem múltiplas formas de representação dos símbolos do Unicode, é uma das mais comuns é a codificação UTF-8, que usa um byte para os caracteres de 0 a 127, dois bytes para os de 128 a 4095, três bytes para os de 4096 a 65535, e quatro bytes para os de 65536 em diante.

Tudo indica que você está usando UTF-8 no seu sistema, de modo que aquele y-com-trema se transforma em dois bytes, e, portanto, não pode ser representado com um único char, que tem o tamanho de um byte.

A solução mais simples para você é usar, no seu código, a notação '\xff', em vez de procurar um símbolo gráfico que lhe corresponda. Você também pode dizer “char c=255;”, “char c=-1;”, “char c=~0;” ou outras variações envolvendo valores inteiros no lado direito da atribuição.


3. Re: Como resolver warning: multi-character?

Pedro
phsmoura

(usa Debian)

Enviado em 31/03/2018 - 15:55h

paulo1205 escreveu:
Tudo indica que você está usando UTF-8 no seu sistema, de modo que aquele y-com-trema se transforma em dois bytes, e, portanto, não pode ser representado com um único char, que tem o tamanho de um byte.

A solução mais simples para você é usar, no seu código, a notação '\xff', em vez de procurar um símbolo gráfico que lhe corresponda. Você também pode dizer “char c=255;”, “char c=-1;”, “char c=~0;” ou outras variações envolvendo valores inteiros no lado direito da atribuição.


Opa, obrigado Paulo!

Isso quer dizer que eu teria 2 problemas certo?
Uma seria que mesmo utilizando essas notações a saida padrão ainda me retornaria '?' dentro do losango e outra seria que eu teria que ler 2 bytes pra entender que aquela parte do bloco está vazia. Como vou utilizar uma lista encadeada para os arquivos eu correria o risco de perder blocos quase inteiros por usar 2 bytes pra representar um nulo... Acho que no final das contas vou trocar meu caractere nulo!

Muito obrigado!




4. Re: Como resolver warning: multi-character? [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/04/2018 - 14:57h

O problema é que, apesar do nome, o tipo char do C funciona mais como um tipo numérico destinado a armazenar valores inteiros que caibam em um byte.

O nome char, que é uma abreviação de character (caráter), é fruto de herança de uma época em que as máquinas geralmente usavam um conjunto de caracteres muito reduzido, geralmente o ASCII, com seus sete bits, ou alguma variação dele que usasse também o oitavo bit. Com um conjunto de caracteres pequenos, um byte era plenamente suficiente para representar os caracteres usados pelas máquinas de então, e assim se decidiu que o menor tipo inteiro do C se chamaria char, em vez de byte.

Além disso, a linguagem incluiu também uma forma de expressar os valores de um byte a partir do símbolo correspondente àquele valor na tabela de símbolos do sistema, por meio da notação em que o caráter aparece cercado por apóstrofos. Curiosamente, essa notação de caracteres em C produz um valor que é não do tipo char, mas sim do tipo int (assim, uma expressão como “sizeof 'a'==sizeof(char)” só será verdadeira se “sizeof(char)==sizeof(int)”, o que geralmente não e verdadeiro nos nossos PCs).

Nos sistemas modernos, porém, os conjuntos de caracteres ou símbolos tem muito mais elementos do que os que poderiam caber em um byte. Por outro lado, o tipo char do C continua sendo funcionalmente equivalente a um inteiro que caiba em apenas um byte.

Para representar mais do que 256 símbolos, é óbvio que serão necessários dois ou mais bytes. Uma abordagem para representar todos os possíveis símbolos é considerar que todos os caracteres têm a mesma largura (por exemplo, dois ou quatro bytes de largura). Outra abordagem é usar apenas a quantidade suficiente de bytes para representar o valor de cada valor particular de caracteres, de modo que os caracteres no início da tabela de símbolos ocupam menos espaço do que os caracteres nas partes mais altas da tabela.

Mas independentemente das escolhas feitas quanto à tabela de símbolos e a codificação dos elementos dessa tabela, o tipo char do C continua sendo uma forma de representar bytes. Se você estiver interessado em bytes, você é completamente livre para pensar e trabalhar com eles com base apenas nos seus valores inteiros, independentemente de se existe um correspondente numa tabela de símbolos ou não, ou de qual seja esse eventual caráter correspondente.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts