SlideShare une entreprise Scribd logo
1  sur  20
Télécharger pour lire hors ligne
ELT048 - SOE



  Ponteiros de função

       Rodrigo Almeida
Universidade Federal de Itajubá
Revisão
●   Ponteiros
●   Struct
●   Buffer circular
●   Ponteiro para void
Exercício
●   Implementar um buffer circular
●   Utilizar um vetor de 10 posições
●   Cada elemento do vetor é uma estrutura com
    duas variáveis
    ●   char tipo
    ●   void* ptr
●   Criar uma função para adicionar novos elementos
    e uma para retirar os mais antigos.
    ●   Add(char tipo, void* var);
    ●   Remove(void);
Exercício
//definição da estrutura
typedef struct {
    char tipo;
    void* ptr;
}process;

//definição do buffer circular
#define BUFFERSIZE 10
process buffer[BUFFERSIZE];

//definição dos “ponteiros” de acesso
int ini, fim;
Exercício
//função de adição de “process” no buffer
void addProc(char ntipo, void* val){

    //checagem de espaço disponível
    if ( ((ini+1)%BUFFERSIZE) < fim){
      //Atualização da posição atual
      buffer[i].tipo = ntipo;
      buffer[i].ptr = val;
      //incremento da posição
      ini = (ini+1)%(BUFFERSIZE);
    }

}
Exercício
//função de remoção de um “process” do buffer
void removeProc (void){

    //checagem se existe alguem pra retirar
    if ( ((fim+1)%BUFFERSIZE) <= ini){
      //incremento da posição
      fim = (fim+1)%(BUFFERSIZE);
    }

}
Exercício
#include “stdio.h”
void main (void){
  int a=5;
  addProc('i', 5);
  addProc('i', a);
  addProc('e', &a);
  removeProc();
  removeProc();
  removeProc();
}
Problema
●   Como executar uma função que não é
    conhecida em tempo de compilação?
    ●   Conhecer o endereço da função em tempo de
        execução.
    ●   Empilhar corretamente os parâmetros que a
        função necessita
    ●   Realizar uma chamada de função para esse
        endereço
●   Onde isso é importante?
Solução
●   Criar rotinas em assembly que recebem o
    endereço da função, empilham todas as
    variáveis corretas e façam uma chamada
    de função para o endereço (JSR)


    ou

●   Utilizar ponteiros de função em C
Ponteiros de Função
●   Armazenam o endereço do início de uma função.
●   A manipulação do valor obedece todas as regras
    de manipulação de ponteiros.
    ●   A única exceção é na chamada da função
        apontada.
●   Apresenta uma declaração complexa.
●   É necessário indicar a assinatura da função: a
    quantidade e tipos dos parâmetros.
    ●   É comum utilizar um typedef para simplificar a
        criação dos ponteiros.
Definição de ponteiros de função
//definindo um tipo de ponteiro de função que
//   não recebe nenhum parâmetro
//   não retorna nenhum valor
typedef void (*pointerTest)(void);
//definição do ponteiro foo via typedef
pointerTest foo;

//definição do ponteiro bar sem typedef
void (*bar)(void);
Definição de ponteiros de função
//funções
void func1 (void){
  printf("Primeira Função")
}
void func2 (void){
  printf("Segunda Função")
}
//criando um ponteiro para função
pointerTest foo;

foo = func1; //Nota: Sem parênteses
(*foo)(); //chamando a função 1

foo = func2; //Nota: Sem parênteses
(*foo)(); //chamando a função 2
Engine de processamento
●   O principal uso de um ponteiro de função é
    permitir que o programa rode uma função
    arbitrária não conhecida em tempo de
    compilação com uma menor complexidade.
         ●   menor complexidade = sem apelar para asm.
●   Isto permite ao programador desenvolver
    “engines” de processamento.
●   As “engines” realizam uma série de
    preparações/checagens/testes antes de
    executar as funções.
Engine de processamento
●   Objetivo:
    ●   Fazer uma engine
        de um processador
        gráfico
    ●   Utilização de um
        switch com
        passagem de
        parâmetro para a
        seleção da
        funcionalidade
Engine de processamento
image Blur(image nImg){}
image Sharpen(image nImg){}

image imgEngine(image nImg, int opt){
  image temp;
  //checagem de consistência da imagem
  switch(opt){
    case 1:
      temp = Sharpen(nImg);
      break;
    case 2:
      temp = Blur(nImg);
      break;
  }
  return temp;
}
Engine de processamento
●   Utilização de
    ponteiros de função
    para seleção da
    função
●   Criação de um tipo
    via typedef para
    simplificar o código
Engine de processamento
image Blur(image nImg){}

image Sharpen(image nImg){}

typedef image (*ptrFunc)(image nImg);

//image editor engine
image imgEngine(ptrFunc function, image nImg){
   image temp;
   //checagem de consistência da imagem
   temp = (*function)(nImg);
   return temp;
}
Engine de processamento
●   Vantagens               ●   Desvantagens
    ●   Novas funções não       ●   Ponteiros de função
        alteram a engine            são mais complexos
    ●   O teste do código           para se trabalhar
        da engine só                (pelo menos no
        precisa ser feito           começo)
        uma vez                 ●   Nem todos os
    ●   Pode mudar as               compiladores para
        opções                      embarcados
        dinâmicamente               funcionam bem com
                                    ponteiros de função
                                    (Harvard x Von
                                    Neuman)
Exercicio
●   Modifique a estrutura apresentada
    anteriormente para incluir também um
    ponteiro de função.
●   Crie uma função que executa o ponteiro de
    função armazenado na “primeira” posição
    do buffer circular.
●   Crie um main que adicione 3 elementos no
    buffer e execute cada um deles na ordem
    que foram inseridos.
    ●   Add(x3), exec, remove, exec, remove, exec, remove
//código antigo
typedef struct {
    char* NomeDoProcesso;
    int Prioridade;
}process;
#define BUFFERSIZE 10
process buffer1[BUFFERSIZE];
int ini, fim;
void addProc (char *nome, int prio){
  if ( ((ini+1)%BUFFERSIZE) < fim){
    buffer[i].Prioridade = prio;
    buffer[i].NomeDoProcesso = nome;
    ini = (ini+1)%(BUFFERSIZE);
  }
}
void removeProc (void){
  if ( ((fim+1)%BUFFERSIZE) <= ini){
    fim = (fim+1)%(BUFFERSIZE);
  }
}

Contenu connexe

Tendances

Introdução à linguagem c
Introdução à linguagem cIntrodução à linguagem c
Introdução à linguagem cRafael_Lima87
 
Linguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e FunçõesLinguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e FunçõesElaine Cecília Gatto
 
Linguagem C 03 Estruturas De Decisao
Linguagem C 03 Estruturas De DecisaoLinguagem C 03 Estruturas De Decisao
Linguagem C 03 Estruturas De DecisaoRegis Magalhães
 
Linguagem c wellington telles - aula 08
Linguagem c   wellington telles - aula 08Linguagem c   wellington telles - aula 08
Linguagem c wellington telles - aula 08profwtelles
 
Alocação dinâmica em C
Alocação dinâmica em CAlocação dinâmica em C
Alocação dinâmica em CBruno Oliveira
 
Linguagem C 01 Primeiros Passos
Linguagem C 01 Primeiros PassosLinguagem C 01 Primeiros Passos
Linguagem C 01 Primeiros PassosRegis Magalhães
 
Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05thomasdacosta
 
Light Talk sobre JavaScript Funcional
Light Talk sobre JavaScript FuncionalLight Talk sobre JavaScript Funcional
Light Talk sobre JavaScript FuncionalEmanuel Gonçalves
 
Paradigmas de Linguagens de Programacao - Aula #3
Paradigmas de Linguagens de Programacao - Aula #3Paradigmas de Linguagens de Programacao - Aula #3
Paradigmas de Linguagens de Programacao - Aula #3Ismar Silveira
 
Revisão sobre ponteiros em C
Revisão sobre ponteiros em CRevisão sobre ponteiros em C
Revisão sobre ponteiros em CPablo Silva
 
Linguagem C 05 Vetores E Matrizes
Linguagem C 05 Vetores E MatrizesLinguagem C 05 Vetores E Matrizes
Linguagem C 05 Vetores E MatrizesRegis Magalhães
 
Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3Elaine Cecília Gatto
 
Aula5 introducao c
Aula5 introducao cAula5 introducao c
Aula5 introducao cprofwtelles
 

Tendances (19)

Introdução à linguagem c
Introdução à linguagem cIntrodução à linguagem c
Introdução à linguagem c
 
Aula17
Aula17Aula17
Aula17
 
C++ Funções
 C++ Funções C++ Funções
C++ Funções
 
Linguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e FunçõesLinguagem C - Vetores, Matrizes e Funções
Linguagem C - Vetores, Matrizes e Funções
 
Linguagem C 03 Estruturas De Decisao
Linguagem C 03 Estruturas De DecisaoLinguagem C 03 Estruturas De Decisao
Linguagem C 03 Estruturas De Decisao
 
Linguagem c wellington telles - aula 08
Linguagem c   wellington telles - aula 08Linguagem c   wellington telles - aula 08
Linguagem c wellington telles - aula 08
 
Linguagem C 10 Arquivos
Linguagem C 10 ArquivosLinguagem C 10 Arquivos
Linguagem C 10 Arquivos
 
Linguagem C - Estruturas
Linguagem C - EstruturasLinguagem C - Estruturas
Linguagem C - Estruturas
 
Alocação dinâmica em C
Alocação dinâmica em CAlocação dinâmica em C
Alocação dinâmica em C
 
Linguagem C 01 Primeiros Passos
Linguagem C 01 Primeiros PassosLinguagem C 01 Primeiros Passos
Linguagem C 01 Primeiros Passos
 
Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05
 
Light Talk sobre JavaScript Funcional
Light Talk sobre JavaScript FuncionalLight Talk sobre JavaScript Funcional
Light Talk sobre JavaScript Funcional
 
Paradigmas de Linguagens de Programacao - Aula #3
Paradigmas de Linguagens de Programacao - Aula #3Paradigmas de Linguagens de Programacao - Aula #3
Paradigmas de Linguagens de Programacao - Aula #3
 
Revisão sobre ponteiros em C
Revisão sobre ponteiros em CRevisão sobre ponteiros em C
Revisão sobre ponteiros em C
 
Ling c
Ling cLing c
Ling c
 
Linguagem C 05 Vetores E Matrizes
Linguagem C 05 Vetores E MatrizesLinguagem C 05 Vetores E Matrizes
Linguagem C 05 Vetores E Matrizes
 
Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3Vetores, Matrizes e Strings em C Parte 3
Vetores, Matrizes e Strings em C Parte 3
 
Aula5 introducao c
Aula5 introducao cAula5 introducao c
Aula5 introducao c
 
Aula5 introducao c
Aula5 introducao cAula5 introducao c
Aula5 introducao c
 

Similaire à Ponteiros de Função

Definição de processos
Definição de processosDefinição de processos
Definição de processosRodrigo Almeida
 
RevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptxRevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptxClaudia Ferlin
 
Resumo linguagem c para microcontroladores PIC usando MikroC
Resumo linguagem c para microcontroladores PIC usando MikroCResumo linguagem c para microcontroladores PIC usando MikroC
Resumo linguagem c para microcontroladores PIC usando MikroCFabio Souza
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturadadiogoa21
 
Kernel com requisitos temporais
Kernel com requisitos temporaisKernel com requisitos temporais
Kernel com requisitos temporaisRodrigo Almeida
 
Desenvolvimento de drivers para sistemas embarcados
Desenvolvimento de drivers para sistemas embarcadosDesenvolvimento de drivers para sistemas embarcados
Desenvolvimento de drivers para sistemas embarcadosRodrigo Almeida
 
Mini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaMini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaDeivid Martins
 
Conceitos de ponteiros struct e buffers
Conceitos de ponteiros struct e buffersConceitos de ponteiros struct e buffers
Conceitos de ponteiros struct e buffersRodrigo Almeida
 
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...iMasters
 
Funções inline e Recursivas
Funções inline e RecursivasFunções inline e Recursivas
Funções inline e RecursivasKadzuwa Kuyeri
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - SubalgoritmosCarlos Santos
 
Webinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosWebinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosEmbarcados
 
LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08Carlos Santos
 

Similaire à Ponteiros de Função (20)

Definição de processos
Definição de processosDefinição de processos
Definição de processos
 
Kernel cooperativo
Kernel cooperativoKernel cooperativo
Kernel cooperativo
 
RevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptxRevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptx
 
Resumo linguagem c para microcontroladores PIC usando MikroC
Resumo linguagem c para microcontroladores PIC usando MikroCResumo linguagem c para microcontroladores PIC usando MikroC
Resumo linguagem c para microcontroladores PIC usando MikroC
 
Resumo Linguagem C
Resumo Linguagem CResumo Linguagem C
Resumo Linguagem C
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturada
 
Kernel com requisitos temporais
Kernel com requisitos temporaisKernel com requisitos temporais
Kernel com requisitos temporais
 
Introducao Google GO
Introducao Google GOIntroducao Google GO
Introducao Google GO
 
Desenvolvimento de drivers para sistemas embarcados
Desenvolvimento de drivers para sistemas embarcadosDesenvolvimento de drivers para sistemas embarcados
Desenvolvimento de drivers para sistemas embarcados
 
Sobrecarga operadores
Sobrecarga operadoresSobrecarga operadores
Sobrecarga operadores
 
M2ti - Python Brasil
M2ti - Python BrasilM2ti - Python Brasil
M2ti - Python Brasil
 
Mini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaMini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e Distribuída
 
Conceitos de ponteiros struct e buffers
Conceitos de ponteiros struct e buffersConceitos de ponteiros struct e buffers
Conceitos de ponteiros struct e buffers
 
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
 
Funções inline e Recursivas
Funções inline e RecursivasFunções inline e Recursivas
Funções inline e Recursivas
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos
 
Funções em C
Funções em CFunções em C
Funções em C
 
Webinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosWebinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcados
 
LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08LabMM3 - Aula teórica 08
LabMM3 - Aula teórica 08
 
Simulador Funcional
Simulador FuncionalSimulador Funcional
Simulador Funcional
 

Plus de Rodrigo Almeida

Embedded systems design @ defcon 2015
Embedded systems design @ defcon 2015Embedded systems design @ defcon 2015
Embedded systems design @ defcon 2015Rodrigo Almeida
 
Embedded systems development Defcon 19
Embedded systems development Defcon 19Embedded systems development Defcon 19
Embedded systems development Defcon 19Rodrigo Almeida
 
As diferentes engenharias
As diferentes engenhariasAs diferentes engenharias
As diferentes engenhariasRodrigo Almeida
 
Testing de software en instrumentos de pesar de funcionamiento no automatico ...
Testing de software en instrumentos de pesar de funcionamiento no automatico ...Testing de software en instrumentos de pesar de funcionamiento no automatico ...
Testing de software en instrumentos de pesar de funcionamiento no automatico ...Rodrigo Almeida
 
Seguridad de sistemas embebidos para el ámbito regulado - Alejandro Bertello ...
Seguridad de sistemas embebidos para el ámbito regulado - Alejandro Bertello ...Seguridad de sistemas embebidos para el ámbito regulado - Alejandro Bertello ...
Seguridad de sistemas embebidos para el ámbito regulado - Alejandro Bertello ...Rodrigo Almeida
 
Cryptology - Antônio Lacerda
Cryptology - Antônio LacerdaCryptology - Antônio Lacerda
Cryptology - Antônio LacerdaRodrigo Almeida
 
Troca de contexto segura em sistemas operacionais embarcados utilizando de té...
Troca de contexto segura em sistemas operacionais embarcados utilizando de té...Troca de contexto segura em sistemas operacionais embarcados utilizando de té...
Troca de contexto segura em sistemas operacionais embarcados utilizando de té...Rodrigo Almeida
 
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...Rodrigo Almeida
 
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...Rodrigo Almeida
 
Projeto de uma controladora de drivers
Projeto de uma controladora de driversProjeto de uma controladora de drivers
Projeto de uma controladora de driversRodrigo Almeida
 
Introdução aos sistemas operacionais embarcados
Introdução aos sistemas operacionais embarcadosIntrodução aos sistemas operacionais embarcados
Introdução aos sistemas operacionais embarcadosRodrigo Almeida
 
Segurança de sistemas: invasões, engenharia reversa e análise de virus
Segurança de sistemas: invasões, engenharia reversa e análise de virusSegurança de sistemas: invasões, engenharia reversa e análise de virus
Segurança de sistemas: invasões, engenharia reversa e análise de virusRodrigo Almeida
 
Utilizando um Display de LCD
Utilizando um Display de LCDUtilizando um Display de LCD
Utilizando um Display de LCDRodrigo Almeida
 
Leitura de teclas com arranjo matricial
Leitura de teclas com arranjo matricialLeitura de teclas com arranjo matricial
Leitura de teclas com arranjo matricialRodrigo Almeida
 
Display de 7 segmentos multiplexados
Display de 7 segmentos multiplexadosDisplay de 7 segmentos multiplexados
Display de 7 segmentos multiplexadosRodrigo Almeida
 
Acessando os periféricos de um microcontrolador
Acessando os periféricos de um microcontroladorAcessando os periféricos de um microcontrolador
Acessando os periféricos de um microcontroladorRodrigo Almeida
 
Acesso à memória e registros
Acesso à memória e registrosAcesso à memória e registros
Acesso à memória e registrosRodrigo Almeida
 
Revisão de linguagem C para Sistemas Embarcados
Revisão de linguagem C para Sistemas EmbarcadosRevisão de linguagem C para Sistemas Embarcados
Revisão de linguagem C para Sistemas EmbarcadosRodrigo Almeida
 

Plus de Rodrigo Almeida (20)

Embedded systems design @ defcon 2015
Embedded systems design @ defcon 2015Embedded systems design @ defcon 2015
Embedded systems design @ defcon 2015
 
Embedded systems development Defcon 19
Embedded systems development Defcon 19Embedded systems development Defcon 19
Embedded systems development Defcon 19
 
As diferentes engenharias
As diferentes engenhariasAs diferentes engenharias
As diferentes engenharias
 
Testing de software en instrumentos de pesar de funcionamiento no automatico ...
Testing de software en instrumentos de pesar de funcionamiento no automatico ...Testing de software en instrumentos de pesar de funcionamiento no automatico ...
Testing de software en instrumentos de pesar de funcionamiento no automatico ...
 
Seguridad de sistemas embebidos para el ámbito regulado - Alejandro Bertello ...
Seguridad de sistemas embebidos para el ámbito regulado - Alejandro Bertello ...Seguridad de sistemas embebidos para el ámbito regulado - Alejandro Bertello ...
Seguridad de sistemas embebidos para el ámbito regulado - Alejandro Bertello ...
 
Cryptology - Antônio Lacerda
Cryptology - Antônio LacerdaCryptology - Antônio Lacerda
Cryptology - Antônio Lacerda
 
Troca de contexto segura em sistemas operacionais embarcados utilizando de té...
Troca de contexto segura em sistemas operacionais embarcados utilizando de té...Troca de contexto segura em sistemas operacionais embarcados utilizando de té...
Troca de contexto segura em sistemas operacionais embarcados utilizando de té...
 
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
 
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
 
Projeto de uma controladora de drivers
Projeto de uma controladora de driversProjeto de uma controladora de drivers
Projeto de uma controladora de drivers
 
Introdução aos sistemas operacionais embarcados
Introdução aos sistemas operacionais embarcadosIntrodução aos sistemas operacionais embarcados
Introdução aos sistemas operacionais embarcados
 
Segurança de sistemas: invasões, engenharia reversa e análise de virus
Segurança de sistemas: invasões, engenharia reversa e análise de virusSegurança de sistemas: invasões, engenharia reversa e análise de virus
Segurança de sistemas: invasões, engenharia reversa e análise de virus
 
Comunicação serial
Comunicação serialComunicação serial
Comunicação serial
 
Utilizando um Display de LCD
Utilizando um Display de LCDUtilizando um Display de LCD
Utilizando um Display de LCD
 
Leitura de teclas com arranjo matricial
Leitura de teclas com arranjo matricialLeitura de teclas com arranjo matricial
Leitura de teclas com arranjo matricial
 
Display de 7 segmentos multiplexados
Display de 7 segmentos multiplexadosDisplay de 7 segmentos multiplexados
Display de 7 segmentos multiplexados
 
Acessando os periféricos de um microcontrolador
Acessando os periféricos de um microcontroladorAcessando os periféricos de um microcontrolador
Acessando os periféricos de um microcontrolador
 
Acesso à memória e registros
Acesso à memória e registrosAcesso à memória e registros
Acesso à memória e registros
 
Operações com Bits
Operações com BitsOperações com Bits
Operações com Bits
 
Revisão de linguagem C para Sistemas Embarcados
Revisão de linguagem C para Sistemas EmbarcadosRevisão de linguagem C para Sistemas Embarcados
Revisão de linguagem C para Sistemas Embarcados
 

Ponteiros de Função

  • 1. ELT048 - SOE Ponteiros de função Rodrigo Almeida Universidade Federal de Itajubá
  • 2. Revisão ● Ponteiros ● Struct ● Buffer circular ● Ponteiro para void
  • 3. Exercício ● Implementar um buffer circular ● Utilizar um vetor de 10 posições ● Cada elemento do vetor é uma estrutura com duas variáveis ● char tipo ● void* ptr ● Criar uma função para adicionar novos elementos e uma para retirar os mais antigos. ● Add(char tipo, void* var); ● Remove(void);
  • 4. Exercício //definição da estrutura typedef struct { char tipo; void* ptr; }process; //definição do buffer circular #define BUFFERSIZE 10 process buffer[BUFFERSIZE]; //definição dos “ponteiros” de acesso int ini, fim;
  • 5. Exercício //função de adição de “process” no buffer void addProc(char ntipo, void* val){ //checagem de espaço disponível if ( ((ini+1)%BUFFERSIZE) < fim){ //Atualização da posição atual buffer[i].tipo = ntipo; buffer[i].ptr = val; //incremento da posição ini = (ini+1)%(BUFFERSIZE); } }
  • 6. Exercício //função de remoção de um “process” do buffer void removeProc (void){ //checagem se existe alguem pra retirar if ( ((fim+1)%BUFFERSIZE) <= ini){ //incremento da posição fim = (fim+1)%(BUFFERSIZE); } }
  • 7. Exercício #include “stdio.h” void main (void){ int a=5; addProc('i', 5); addProc('i', a); addProc('e', &a); removeProc(); removeProc(); removeProc(); }
  • 8. Problema ● Como executar uma função que não é conhecida em tempo de compilação? ● Conhecer o endereço da função em tempo de execução. ● Empilhar corretamente os parâmetros que a função necessita ● Realizar uma chamada de função para esse endereço ● Onde isso é importante?
  • 9. Solução ● Criar rotinas em assembly que recebem o endereço da função, empilham todas as variáveis corretas e façam uma chamada de função para o endereço (JSR) ou ● Utilizar ponteiros de função em C
  • 10. Ponteiros de Função ● Armazenam o endereço do início de uma função. ● A manipulação do valor obedece todas as regras de manipulação de ponteiros. ● A única exceção é na chamada da função apontada. ● Apresenta uma declaração complexa. ● É necessário indicar a assinatura da função: a quantidade e tipos dos parâmetros. ● É comum utilizar um typedef para simplificar a criação dos ponteiros.
  • 11. Definição de ponteiros de função //definindo um tipo de ponteiro de função que // não recebe nenhum parâmetro // não retorna nenhum valor typedef void (*pointerTest)(void); //definição do ponteiro foo via typedef pointerTest foo; //definição do ponteiro bar sem typedef void (*bar)(void);
  • 12. Definição de ponteiros de função //funções void func1 (void){ printf("Primeira Função") } void func2 (void){ printf("Segunda Função") } //criando um ponteiro para função pointerTest foo; foo = func1; //Nota: Sem parênteses (*foo)(); //chamando a função 1 foo = func2; //Nota: Sem parênteses (*foo)(); //chamando a função 2
  • 13. Engine de processamento ● O principal uso de um ponteiro de função é permitir que o programa rode uma função arbitrária não conhecida em tempo de compilação com uma menor complexidade. ● menor complexidade = sem apelar para asm. ● Isto permite ao programador desenvolver “engines” de processamento. ● As “engines” realizam uma série de preparações/checagens/testes antes de executar as funções.
  • 14. Engine de processamento ● Objetivo: ● Fazer uma engine de um processador gráfico ● Utilização de um switch com passagem de parâmetro para a seleção da funcionalidade
  • 15. Engine de processamento image Blur(image nImg){} image Sharpen(image nImg){} image imgEngine(image nImg, int opt){ image temp; //checagem de consistência da imagem switch(opt){ case 1: temp = Sharpen(nImg); break; case 2: temp = Blur(nImg); break; } return temp; }
  • 16. Engine de processamento ● Utilização de ponteiros de função para seleção da função ● Criação de um tipo via typedef para simplificar o código
  • 17. Engine de processamento image Blur(image nImg){} image Sharpen(image nImg){} typedef image (*ptrFunc)(image nImg); //image editor engine image imgEngine(ptrFunc function, image nImg){ image temp; //checagem de consistência da imagem temp = (*function)(nImg); return temp; }
  • 18. Engine de processamento ● Vantagens ● Desvantagens ● Novas funções não ● Ponteiros de função alteram a engine são mais complexos ● O teste do código para se trabalhar da engine só (pelo menos no precisa ser feito começo) uma vez ● Nem todos os ● Pode mudar as compiladores para opções embarcados dinâmicamente funcionam bem com ponteiros de função (Harvard x Von Neuman)
  • 19. Exercicio ● Modifique a estrutura apresentada anteriormente para incluir também um ponteiro de função. ● Crie uma função que executa o ponteiro de função armazenado na “primeira” posição do buffer circular. ● Crie um main que adicione 3 elementos no buffer e execute cada um deles na ordem que foram inseridos. ● Add(x3), exec, remove, exec, remove, exec, remove
  • 20. //código antigo typedef struct { char* NomeDoProcesso; int Prioridade; }process; #define BUFFERSIZE 10 process buffer1[BUFFERSIZE]; int ini, fim; void addProc (char *nome, int prio){ if ( ((ini+1)%BUFFERSIZE) < fim){ buffer[i].Prioridade = prio; buffer[i].NomeDoProcesso = nome; ini = (ini+1)%(BUFFERSIZE); } } void removeProc (void){ if ( ((fim+1)%BUFFERSIZE) <= ini){ fim = (fim+1)%(BUFFERSIZE); } }