Sei sulla pagina 1di 7

PONTEIRO DE MEMRIA

Ponteiro de Memria

Maurcio Mio
Consultor BC
Mauricio.miao@procwork.com.br

/var/www/apps/conversion/current/tmp/scratch_3/111968451.doc
Pg. 1

PONTEIRO DE MEMRIA

DEFINIO..............................................................................................................................................................3
IMPLEMENTAO................................................................................................................................................3
EXEMPLO BSICO................................................................................................................................................4
EXEMPLO DE UTILIZAO...............................................................................................................................4
EXERCCIO..............................................................................................................................................................5

/var/www/apps/conversion/current/tmp/scratch_3/111968451.doc
Pg. 2

PONTEIRO DE MEMRIA

Definio
Ponteiros de memria so estruturas de dados que armazenam endereos de
memria. O valor de um ponteiro uma posio de memria, enquanto que, por
exemplo, a de um inteiro um nmero.

Varivel
Ponteiro

valor
e

Implementao
Pode ser implementado em vrias linguagens de programao:
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 endereo de memria)
Em C a declarao do tipo de dado para o qual o ponteiro aponta
obrigatria.
Pascal ou Delphi
Var nome ^integer
^nome = @var
( @ = & em C)
Por questes de performance recomendvel criar ponteiros com tipo de dado
definido (clusula type) em ABAP.
O tempo de execuo para o ASSIGN em ponteiros tipados de 9 msn
(microsegundo standard) contra 13 msn para ponteiros sem tipo de dado definido.
/var/www/apps/conversion/current/tmp/scratch_3/111968451.doc
Pg. 3

PONTEIRO DE MEMRIA

Exemplo bsico
DATA: variavel(10) type c value bsico.
FIELD-SYMBOLS <ponteiro> type c.
ASSIGN variavel to <ponteiro>.
WRITE: variavel, ponteiro.
OUTPUT: bsico bsico
MOVE exemplo to <ponteiro>.
WRITE: variavel, ponteiro.
OUTPUT: exemplo, exemplo
Aps o comando ASSIGN o ponteiro passa a ter o mesmo valor da variavel
apontada.
Importante observar que no h cpia de dados, o ponteiro internamente possui o
endereo da varivel apontada. Isso permite que qualquer alterao na varivel
reflita no ponteiro e vice-versa.

Exemplo de utilizao
DATA:
contador(01) TYPE n VALUE 1.
variavel1(10) TYPE c VALUE UMA,
variavel2(10) TYPE c VALUE UTILIZAO,
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 UTILIZAO
Os parnteses do comando ASSIGN na varivel a ser apontada, indicam para o
comando considerar o valor da varivel entre parnteses como sendo a varivel a
ser apontada e no a varivel propriamente dita.

/var/www/apps/conversion/current/tmp/scratch_3/111968451.doc
Pg. 4

PONTEIRO DE MEMRIA
Caso o nome da varivel no exista, o ponteiro definido como tipo char de 4
posies.
No exemplo acima, os parnteses fizeram o field-symbol apontar para VARIAVEL1
e em seguida, para VARIAVEL2, que foram contedos da varivel NOME.

Exerccio
Gerar um relatrio com base na transao MM03.
Extrair os dados de consumo da viso de Previso do material, boto Valores de
consumo e imprimi-los de acordo com a seleo do usurio.
Conforme o ms inicial informado, imprimir o consumo do mesmo e dos 2 meses
subsequentes.
Os dados esto na tabela MVER. O valor de consumo de cada ms est nos
campos MVER-GSV01 at 12, onde GSV01 contm o valor de Janeiro, GSV02
contm o valor de Fevereiro e assim sucessivamente.
Exemplos de seleo :
Perodo inicial 01.2000

Sada: Consumo de Janeiro, Fevereiro e Maro

Tela de seleo:
Material
Centro
Perodo inicial

________
_____
______

(MM.AAAA)

Lay-out do relatrio
N material
Ms
Consumo
01
2,00002
0,000
03
1.000,000

/var/www/apps/conversion/current/tmp/scratch_3/111968451.doc
Pg. 5

PONTEIRO DE MEMRIA
Exemplo de Resoluo
REPORT ZCONSUMO.
"- Declarao ---------------------------------------------------------TABLES:
MVER.
"Consumo do material
DATA:
C_ERRO_START(01) TYPE C.
"- Parmetros de seleo ----------------------------------------------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 no encontrados para a seleo'.
MOVE 'X' TO C_ERRO_START.
STOP.
ENDIF.
ENDFORM.
" SELECIONA_CONSUMO
/var/www/apps/conversion/current/tmp/scratch_3/111968451.doc
Pg. 6

PONTEIRO DE MEMRIA
*&---------------------------------------------------------------------*
*&
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

/var/www/apps/conversion/current/tmp/scratch_3/111968451.doc
Pg. 7

Potrebbero piacerti anche