Pergunta

Eu tenho uma função como

void printMe (void *i)
{
    printf("%d", i);
}

onde eu quero passar um ponteiro nulo e imprimi-lo para a tela. O exemplo acima é bom se o i é inteiro, ponto flutuante ou duplo, mas deixa de funcionar, se i é um carvão animal. Não há sobrecarga no C como eu costumo usar em C ++. Então a questão é esta, podemos criar uma função em C que irá imprimir o elemento que é o parâmetro que de, e se sim como isso é possível porque ele totalmente me escapa neste momento.

Foi útil?

Solução

Q1: Então a questão é esta, podemos criar uma função em C que irá imprimir o elemento que é que é parâmetro

A: Não da maneira que quiser. Você terá que passar informações para a função, dizendo que o tipo de dados que você está passando.

Q2:. e se sim como isso é possível porque ele totalmente me escapa neste momento

A: É iludindo você, porque ele não pode ser feito. Não há metadados associados a * vazio que o compilador ou tempo de execução pode usar para descobrir que tipo ele está apontando para. Você precisa se quer

  1. passar uma estrutura que contém um
    ponteiro e informações sobre o que
    o apontador aponta (por exemplo, um enum).
  2. passar um parâmetro extra com informações sobre o que o ponteiro aponta para

Como o código está a única coisa que você pode imprimir aqui é o endereço que eu aponta.

Um ponteiro void aponta para dados brutos, printf assume que você sabe que tipo de dados você está imprimindo, não tem inteligência e não pode "figura it out" para você.

É simples assim.

O que você pode fazer é digitar passar informações para a função, mas depois você acaba com algo muito parecido com printf é auto, onde você passar uma cadeia de formatação contendo informações de tipo sobre os dados nos seguintes argumentos.

Espero que isso ajude.

Também. . . " Não há sobrecarga no C como eu costumo usar em C ++ "

Mesmo em c ++ a sobrecarga acontece em tempo de compilação, e aqui não há nenhuma maneira para o compilador para saber quais os dados serão passados ??para essa função, por isso mesmo que você está acostumado a sobrecarga, ele nunca iria trabalhar com isso (por exemplo, tente a mesma coisa usando printf, mas compilá-lo com o compilador C ++, você terá exatamente os mesmos resultados). Realmente tentar

cout << i;

na função acima, e ele vai te dar o endereço i aponta para, e não o "valor" do i. Você precisaria para lançar i e derference-lo antes que você poderia obtê-lo do valor

cout << *(int*)i;

Assim, para obter o anterior trabalhando em C ++ você precisa ter muita funções sobrecarregadas (ou uma função de modelo, que é realmente a mesma coisa, exceto os rolos de compilador as funções para você), por exemplo funções sobrecarregadas

printMe(int i){...}
printMe(double d){...}
printMe(char c){...}
printMe(char* string){...}

Em c você só precisa dar essas funções nomes específicos

printInt(int i){...}
printDouble(double d){...}
printChar(char c){...}
printString(char* string){...}

Outras dicas

Para começar, você está imprimindo o ponteiro, não o que ele aponta. Para imprimir o conteúdo real, você precisa passar *i para printf, não i.

Se você realmente quer fazer isso, uma solução é:

void printMe (void *p, int typ) {
    switch(typ) {
        case TYP_INT: printf("%d", *((int*)p)); break;
        case TYP_CHR: printf("%c", *((char*)p)); break;
        /* and so on ... */
    }
}

Assim, a pergunta é esta, podemos criar uma função em C que irá imprimir o elemento que é que é parâmetro

Sim, nós podemos. Tal função já faz parte da biblioteca padrão - ele é chamado printf;)

Como não há nenhuma função de tempo de compilação sobrecarga em C, você de alguma forma tem que fornecer o tipo dos argumentos em tempo de execução. A cadeia de formato printf pode ser usado para fazer isso, então não há realmente nenhuma razão para construir a sua própria função wrapper quando já existe uma solução de trabalho.

Se você está tentando imprimir o valor do ponteiro, o uso correto é printf("%p", i);. O 'd' especificador é para números inteiros, e o 'p' é para ponteiros. É sua responsabilidade para obter estes correta, e coisas ruins podem acontecer se você misturá-las.

Eu não sei por que isso seria um fracasso para um char * e não um int *, e é possível que você tem outros problemas que causam isso. Se ele ainda falhar com% p, outra coisa ficou confuso. Veja se você pode instalar algum tipo de software monitor de memória para verificar se balançando ponteiros ou duplo livre () s, porque naquele ponto do dinheiro esperto que você tem em algum lugar de memória corrompido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top