Вы находитесь на странице: 1из 7

PONTEIRO DE MEMÓRIA

Ponteiro de Memória

Maurício Mião
Consultor BC
Mauricio.miao@procwork.com.br

/conversion/tmp/scratch/414228802.doc Pág. 1
PONTEIRO DE MEMÓRIA

DEFINIÇÃO.......................................................................................................................................................3

IMPLEMENTAÇÃO.........................................................................................................................................3

EXEMPLO BÁSICO..........................................................................................................................................4

EXEMPLO DE UTILIZAÇÃO.........................................................................................................................4

EXERCÍCIO.......................................................................................................................................................5

/conversion/tmp/scratch/414228802.doc Pág. 2
PONTEIRO DE MEMÓRIA

Definição
Ponteiros de memória são estruturas de dados que armazenam endereços de
memória. O valor de um ponteiro é uma posição de memória, enquanto que, por
exemplo, a de um inteiro é um número.

Variável
Ponteiro
valor
e e

Implementação
Pode ser implementado em várias linguagens de programação:

ABAP
FIELD-SYMBOLS <nome> type <tipo>
ASSIGN var to <nome>

C ou C++ Melhor performance


int *nome;
float *nome;
char *nome;
*nome = &var ( & = indica que deve atribuir o endereço de memória)
Em C a declaração do tipo de dado para o qual o ponteiro aponta é
obrigatória.

Pascal ou Delphi
Var nome ^integer
^nome = @var ( @ = & em C)

Por questões de performance é recomendável criar ponteiros com tipo de dado


definido (cláusula type) em ABAP.
O tempo de execução para o ASSIGN em ponteiros tipados é de 9 msn
(microsegundo standard) contra 13 msn para ponteiros sem tipo de dado definido.

/conversion/tmp/scratch/414228802.doc Pág. 3
PONTEIRO DE MEMÓRIA

Exemplo básico
DATA: variavel(10) type c value ‘básico.
FIELD-SYMBOLS <ponteiro> type c.

ASSIGN variavel to <ponteiro>.


WRITE: variavel, ponteiro.

OUTPUT: básico básico

MOVE ‘exemplo’ to <ponteiro>.


WRITE: variavel, ponteiro.

OUTPUT: exemplo, exemplo

Após o comando ASSIGN o ponteiro passa a ter o mesmo valor da variavel


apontada.
Importante observar que não há cópia de dados, o ponteiro internamente possui o
endereço da variável apontada. Isso permite que qualquer alteração na variável
reflita no ponteiro e vice-versa.

Exemplo de utilização
DATA:
contador(01) TYPE n VALUE ‘1’.
variavel1(10) TYPE c VALUE ‘UMA’,
variavel2(10) TYPE c VALUE ‘UTILIZAÇÃO’,
nome(09) TYPE c.
FIELD-SYMBOLS <ponteiro> type c.

DO 2 TIMES.
CONCATENATE ‘variavel’ contador INTO nome.
ASSIGN (nome) TO <ponteiro>.
WRITE <ponteiro>.
ADD 1 TO contador.
ENDDO.

Resultado:
UMA UTILIZAÇÃO

Os parênteses do comando ASSIGN na variável a ser apontada, indicam para o


comando considerar o valor da variável entre parênteses como sendo a variável a
ser apontada e não a variável propriamente dita.

/conversion/tmp/scratch/414228802.doc Pág. 4
PONTEIRO DE MEMÓRIA

Caso o nome da variável não exista, o ponteiro é definido como tipo char de 4
posições.

No exemplo acima, os parênteses fizeram o field-symbol apontar para VARIAVEL1


e em seguida, para VARIAVEL2, que foram conteúdos da variável NOME.

Exercício
Gerar um relatório com base na transação MM03.
Extrair os dados de consumo da visão de Previsão do material, botão Valores de
consumo e imprimi-los de acordo com a seleção do usuário.

Conforme o mês inicial informado, imprimir o consumo do mesmo e dos 2 meses


subsequentes.
Os dados estão na tabela MVER. O valor de consumo de cada mês está nos
campos MVER-GSV01 até 12, onde GSV01 contém o valor de Janeiro, GSV02
contém o valor de Fevereiro e assim sucessivamente.

Exemplos de seleção :
Período inicial 01.2000 Saída: Consumo de Janeiro, Fevereiro e Março

Tela de seleção:

Material ________
Centro _____
Período inicial ______ (MM.AAAA)

Lay-out do relatório

Nº material
Mês Consumo
01 2,000-
02 0,000
03 1.000,000

/conversion/tmp/scratch/414228802.doc Pág. 5
PONTEIRO DE MEMÓRIA

Exemplo de Resolução

REPORT ZCONSUMO.

"- Declaração ----------------------------------------------------------


TABLES:
MVER. "Consumo do material

DATA:
C_ERRO_START(01) TYPE C.

"- Parâmetros de seleção -----------------------------------------------


SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT001.
PARAMETERS P_MATNR LIKE MVER-MATNR OBLIGATORY.
PARAMETERS P_WERKS LIKE MVER-WERKS OBLIGATORY.
PARAMETERS P_INICIO LIKE S013-SPMON OBLIGATORY.
SELECTION-SCREEN END OF BLOCK B1.

"- Eventos--------------------------------------------------------------
START-OF-SELECTION.
PERFORM SELECIONA_CONSUMO.

END-OF-SELECTION.
PERFORM VERIFICA_ERRO_START.
PERFORM IMPRIME_RELATORIO.

"- Forms ---------------------------------------------------------------


*&---------------------------------------------------------------------*
*& Form SELECIONA_CONSUMO
*&---------------------------------------------------------------------*
FORM SELECIONA_CONSUMO.

SELECT *
FROM MVER
UP TO 1 ROWS
WHERE MATNR = P_MATNR AND
WERKS = P_WERKS AND
GJAHR = P_INICIO+0(04).
ENDSELECT.
IF SY-SUBRC <> '0'.
MESSAGE S398(00) WITH 'Dados não encontrados para a seleção'.
MOVE 'X' TO C_ERRO_START.
STOP.
ENDIF.
ENDFORM. " SELECIONA_CONSUMO

/conversion/tmp/scratch/414228802.doc Pág. 6
PONTEIRO DE MEMÓRIA

*&---------------------------------------------------------------------*
*& Form VERIFICA_ERRO_START
*&---------------------------------------------------------------------*
FORM VERIFICA_ERRO_START.

CHECK NOT C_ERRO_START IS INITIAL.


STOP.

ENDFORM. " VERIFICA_ERRO_START


*&---------------------------------------------------------------------*
*& Form IMPRIME_RELATORIO
*&---------------------------------------------------------------------*
FORM IMPRIME_RELATORIO.

DATA:
N_MES(02) TYPE N,
C_NOME_CAMPO(30) TYPE C.
FIELD-SYMBOLS: <PONTEIRO>.

WRITE / P_MATNR.
ULINE.
MOVE P_INICIO+4(02) TO N_MES.
DO 3 TIMES.
CONCATENATE 'MVER-GSV' N_MES INTO C_NOME_CAMPO.
ASSIGN (C_NOME_CAMPO) TO <PONTEIRO>.

WRITE: / N_MES, <PONTEIRO>.


ADD 1 TO N_MES.
ENDDO.

ENDFORM. " IMPRIME_RELATORIO

/conversion/tmp/scratch/414228802.doc Pág. 7

Вам также может понравиться