Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Chamar função pelo seu endereço

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ Chamar função pelo seu endereço

    Olá!
    Uma duvida de C\C++.
    Sabendo que eu tenho uma função do tipo void nome(void), mas, não posso chama-la da forma normal nome(). No entanto, eu tenho o endereço dessa função, o &nome, mas em unsigned int.

    É possível chamar essa função pelo seu endereço?

  • Font Size
    #2
    vc pode usar inline asm para chamar uma func

    DWORD end = 0x666; // aki vai o end
    __asm call end;

    Comment


    • Font Size
      #3
      Postado Originalmente por arkimonde Ver Post
      vc pode usar inline asm para chamar uma func
      KKKKKKKKKKK?????????????????
      Mano que endereço estranho é esse? 0x666? Para quem não sabe o 666 é o número da besta. Cruzes.
      “Finalmente encontrei um inimigo digno de mim e uma jornada em que preciso desenvolver toda a minha coragem, pois temos de combater homens bravos e monstruosas feras.”, Alexandre, o Grande.

      Comment


      • Font Size
        #4
        Postado Originalmente por Rolando Sanches Ver Post
        KKKKKKKKKKK?????????????????
        Mano que endereço estranho é esse? 0x666? Para quem não sabe o 666 é o número da besta. Cruzes.
        isso foi uma coisa que os humanos inventaram 666 numero da besta, pra min não passa de um numero como qualquer outro.

        Comment


        • Font Size
          #5
          Eu também não acho que os números ou cores tenham algum "poder". Estava na brincadeira. Mas apesar de eu não acreditar evito o número 666. Não sei porque, mas não gosto desse número e nem do 999.
          “Finalmente encontrei um inimigo digno de mim e uma jornada em que preciso desenvolver toda a minha coragem, pois temos de combater homens bravos e monstruosas feras.”, Alexandre, o Grande.

          Comment


          • Font Size
            #6
            Para além de usar assembler em linha você pode usar apontadores para funções. São mais fácil de utilizar e são mais versáteis uma vez que para além de chamar a função você pode passa-lo como parâmetro para outras funções ou realizar operações de comparação sobre eles.
            Para declarar um apontador para uma função que não recebe nada e não retorna nada, isto é, com o seguinte cabeçalho:
            Código:
            void funcao(void);
            use a seguinte declaração:
            Código:
            void (*ptr)();
            Nota: os dois parênteses são obrigatórios! Se não vai ocorrer um erro (de lógica). Vamos ver porque isso acontece. Se usássemos a seguinte sintaxe:
            Código:
            void * ptr();
            o compilador iria interpretar ptr como uma função que não recebe parâmetros e retorna um apontador para void. Que é um pouco diferente do que queremos. Já
            Código:
            void * ptr;
            faria com o compilador "pensasse" que ptr é um apontador convencional e teríamos problemas na hora de invocar a função. Por isso não se esqueça de colocar os parênteses correctamente.
            Pronto já declarou o apontador e agora? Simples temos de associa-lo a uma função. Isso é feito colocando o apontador no lado esquerdo de uma
            atribuição e o nome da função, sem parâmetros, no lado direito da mesma atribuição.
            Código:
            ptr=funcao;
            Mas um aviso: CUIDADO COM OS APONTADORES SELVAGENS, pois tornam o programa instável e levam a erros difíceis de resolver. (Para quem não sabe) apontadores selvagens são apontadores que não foram inicializados). Para chamar a função usamos a seguinte sintaxe:
            Código:
            (*ptr)();
            Mais uma vez os parênteses são obrigatórios. Vamos ver como declarar um apontador para uma função que recebe um int:
            Código:
            void xpto(int);
            void (*ptr)(int);
            ptr=xpto;
            (*ptr)(2);
            Os apontadores são genéricos para o tipo de função que apontam. Por exemplo seja ptr um apontador para uma função que recebe um inteiro como parâmetro:
            Código:
            void (*ptr)(int);
            Ptr pode apontar para as seguintes funções:
            Código:
            void xpto(int i);
            void ypto(int k);
            Mas não poderá apontar para as seguintes funções:
            Código:
            void zpto(int x, int y);
            int tpto(int p);
            Por razões obvias.
            Espero ter ajudado (a pesar da demora. Queria rever algumas coisas antes de postar, para não falar asneiras).
            Bibliografia:
            C Completo e Total
            Herbert Schildt
            3º edição
            (aqui no GH existe um tópico com o endereço para download do livro. Na verdade o livro tem apenas um exemplo de como usar apontadores para função, que se encontra na página 128)
            “Finalmente encontrei um inimigo digno de mim e uma jornada em que preciso desenvolver toda a minha coragem, pois temos de combater homens bravos e monstruosas feras.”, Alexandre, o Grande.

            Comment

            X
            Working...
            X