Página 1 de 1

Erro "Processor Stack Fault"

Enviado: 14 Jul 2006 20:34
por Glauco Cruz Costa
:| Estou com um problema na função abaixo. Quando eu pressiono f5, para pesquisar, após preencher o campo crondalfa, a prinpípio dá certo. Mas, ao se repetir o procedimento várias vezes, ocorre o erro: Undecoverable error 650: Processor Stack Fault.
Já pesquisei sobre o erro. Isso se dá pelo fato de estar-se chamando a função inn repeditas vezes. E o programa não está suportando.
Há como deixar o programa como está, mas dando algum jeito de não dar esse erro mais?
Ou qual outra solução simples posso usar?
Eu chamo a procedure INN para que ela reinicie e mostre os dados escolhidos pelo usuário para que ele possa trabalhar. Toda hora sai da INN e volta chamando-a...
Obrigado.

Abaixo, algumas partes do programa:
MATRI = SPACE(7) // REPLICATE(".",7) //SPACE(7)
CRO = SPACE(10)
SOBREN = SPACE(15)
SEX = SPACE(1)
TEL = SPACE(9) //"....-...."
NOM = SPACE(34)
DATN = CTOD(" / / ")
END = SPACE(34)
U = SPACE(2)
PA = SPACE(34)
MA = SPACE(34)
OBS = SPACE(59)
OBS2 = SPACE(72)
DATAH = DATE()
INN()








// CADASTRO
PROCEDURE INN
DO WHILE .T.

//READINSERT(.T.)
SET DELIMITERS ON // PARA ATIVAR O DE BAIXO
SET DELIMITERS TO "[]" // PARA ESCOLHER A MASCARA DO GET
// SET INTENSITY OFF // PARA TIRAR O BRANCO DOS GETS
#INCLUDE "SETCURS.CH" // PARA FUNCIONAR SETCURSOR()
SETCURSOR(SC_INSERT) // SC_INSERT FICA CURSOR PELA METADE. SC_SPECIAL1 FICA CURSOR CHEIO
CLS

SET KEY 28 TO IN()
SET KEY -1 TO IM()
SET KEY -2 TO AL()
SET KEY -3 TO EX()
SET KEY -4 TO PE()
SET KEY -7 TO LI()
SET KEY -41 TO SA()
@ 00,00 TO 24,79
@ 02,30 SAY "CADASTRO DE PACIENTES"

@ 05,31 SAY "INIC.: [..........]"
// @ 05,53 SAY "[P]"
@ 05,61 SAY "DATA:" + DTOC(DATAH)
@ 07,03 SAY "SOBRENOME: [...............]"
@ 07,35 SAY "SEXO: [.]"
@ 07,45 SAY "(M/F)"
@ 07,53 SAY "TELEFONE..: [....-....]"
@ 09,03 SAY "NOME.....: [..................................]"
@ 09,53 SAY "DATA NASC.: [ / / ]"
@ 15,03 SAY "ENDERECO.: [..................................]"
@ 15,53 SAY "UF: [..]"
@ 11,03 SAY "FILIACAO.: [..................................]"
@ 11,53 SAY "(PAI)"
@ 13,14 SAY "[..................................]"
@ 13,53 SAY "(MAE)"
@ 17,03 SAY "OBSERVACOES: [...........................................................]"
@ 19,03 SAY "[........................................................................]"
@ 23,02 SAY "F1-INCLUI F2-IMPRIME F3-ALTERA F4-EXCLUI F5-PESQUISA F8-LIMPA F12-SAI"
@ 05,03 SAY "MATRICULA: [.......]"
@ 05,14 GET MATRI PICT "@!"
READEXIT(.T.) // PARA PODER SAIR DO GET COM SETA, COMO SE FOSSE ENTER
READ
/* IF LASTKEY() = -9
RETURN
ENDIF */
GO TOP
LOCATE FOR MATRICULA = MATRI
IF FOUND()
MATRI = MATRICULA
CRO = CRONDALFA
SEX = SEXO
TEL = TELEFONE
NOM = NOME
SOBREN = SOBRENOME
DATN = CTOD(DATA)
END = ENDERECO
U = UF
PA = PAI
MA = MAE
OBS = OBSERV1
OBS2 = OBSERV2
@ 05,67 SAY " "
DATAH = CTOD(DATAHOJE)
ENDIF
DO WHILE .T.
SAVE SCREEN TO INCLU
/* IF LASTKEY() = -9
RETURN
ENDIF */
IF LASTKEY() = -7
EXIT
ENDIF
@ 00,00 TO 24,79
@ 02,30 SAY "CADASTRO DE PACIENTES"
@ 05,14 GET MATRI PICT "@!"
@ 05,38 GET CRO PICT "@!" // WHEN VER()
// @ 05,54 GET CAR PICT "@!"
@ 05,66 SAY DATAH
/* IF DATAH = SPACE(10) // !EMPT(DATAH)
@ 05,61 SAY "DATA: " + DATAHOJE
ELSE
@ 05,61 SAY "DATA: " + DTOC(DATE())
ENDIF
*/
@ 07,14 GET SOBREN PICT "@!" // valid testGet( SOBREN )
@ 07,41 GET SEX PICT "@!" VALID SEX $ "MF. "
@ 07,45 SAY "(M/F)"
@ 07,65 GET TEL PICT "9999-9999"
@ 09,14 GET NOM PICT "@!" // valid testGet( NOM )
@ 09,65 GET DATN
@ 11,14 GET PA PICT "@!" // valid testGet( PA )
@ 11,53 SAY "(PAI)"
@ 13,14 GET MA PICT "@!" // valid testGet( MA )
@ 13,53 SAY "(MAE)"
@ 15,14 GET END PICT "@!"
@ 15,57 GET U PICT "@!" // valid testGet( U )
@ 17,16 GET OBS PICT "@!"
@ 19,03 GET OBS2 PICT "@!"
@ 23,02 SAY "F1-INCLUI F2-IMPRIME F3-ALTERA F4-EXCLUI F5-PESQUISA F8-LIMPA F12-SAI"
KEYBOARD CHR(13)
READ
ENDDO

ENDDO




//FUNCOES PARA AS PESQUISAS
FUNCTION PESQ5
// SETCOLOR("N/W")
IF LASTKEY() = 13
MATRI = MATRICULA
KEYBOARD CHR(23) // + CHR(23) + CHR(23)+ CHR(23)+ CHR(23)+ CHR(23)+ CHR(23)+ CHR(23)+ CHR(23)+

CHR(23)+ CHR(23) + CHR(23) + CHR(23) // CHR(5) + // KEYBOARD - COMO UM PRESSIONAR UMA TECLA
SET FILTER TO
INN()
RETURN(0)
ENDIF
IF LASTKEY() = 27
RESTORE SCREEN FROM INCLU
SET FILTER TO
RETURN(0)
ENDIF

FUNCTION PESQ9
// SETCOLOR("N/W")
IF LASTKEY() = 13
MATRI = MATRICULA
KEYBOARD CHR(23) + CHR(23) + CHR(23)+ CHR(23) + CHR(23) // + CHR(23)+ CHR(23)+ CHR(23)+ CHR(23)+

CHR(23)+ CHR(23) + CHR(23) + CHR(23) // CHR(5) + // KEYBOARD - COMO UM PRESSIONAR UMA TECLA
SET FILTER TO
INN()
RETURN(0)
ENDIF
IF LASTKEY() = 27
RESTORE SCREEN FROM INCLU
SET FILTER TO
RETURN(0)
ENDIF

FUNCTION PESQ7
// SETCOLOR("N/W")
IF LASTKEY() = 13
MATRI = MATRICULA
KEYBOARD CHR(23) + CHR(23) + CHR(23)+ CHR(23) + CHR(23) + CHR(23)+ CHR(23) // + CHR(23)+

CHR(23)+ CHR(23)+ CHR(23) + CHR(23) + CHR(23) // CHR(5) + // KEYBOARD - COMO UM PRESSIONAR

UMA TECLA
SET FILTER TO
INN()
RETURN(0)
ENDIF
IF LASTKEY() = 27
RESTORE SCREEN FROM INCLU
SET FILTER TO
RETURN(0)
ENDIF





// PESQUISAR

PROCEDURE PE
SAVE SCREEN TO INCLU
IF ROW() = 5 // A FUNCAO ROW() FORNECE O NR. DA LINHA NA QUAL ESTA POSICIONADO O CURSOR NA TELA.
IF EMPT(CRO)
@ 21,05 SAY "*** CRONDALFA VAZIO ***"
INKEY(1)
@ 21,05 SAY " "
RESTORE SCREEN FROM INCLU
RETURN
ENDIF
GO TOP
LOCATE FOR CRONDALFA = CRO
IF .NOT. FOUND()
RESTORE SCREEN FROM INCLU
KEYBOARD CHR(19) + CHR(19) + CHR(19)+ CHR(19)+ CHR(19)+ CHR(19)+ CHR(19)+ CHR(19)+ CHR(19)+

CHR(19) // CHR(5) + // KEYBOARD - COMO UM PRESSIONAR UMA TECLA
RETURN
ELSE
PRIVATE V1[3]
V1[01] = "MATRICULA"
V1[02] = "NOME"
V1[03] = "DATA"
SET FILTER TO CRONDALFA = CRO
DBGOTOP()
@ 09,04 CLEAR TO 21,71
@ 09,04 TO 21,71
DBEDIT(10,05,20,70,V1,"PESQ5")
ENDIF
ENDIF

Enviado: 17 Jul 2006 12:01
por Dudu_XBase
Bom dia.
Poste seu lnk.

Enviado: 17 Jul 2006 23:31
por Glauco Cruz Costa
Dudu_XBase escreveu:Bom dia.
Poste seu lnk.
;) O que seria o lnk?

Enviado: 18 Jul 2006 09:05
por Dudu_XBase
bom dia.
Vc usa blinker ?
Lnk é um arquivo de linkedição usado por ele.

Enviado: 18 Jul 2006 10:52
por Glauco Cruz Costa
Dudu_XBase escreveu:bom dia.
Vc usa blinker ?
Lnk é um arquivo de linkedição usado por ele.
NÃO. EU USO O COMPILADOR DO CLIPPER: CLIPPER + RTLINK.

Enviado: 18 Jul 2006 19:27
por Dudu_XBase
Use o blinker.
Faça pesquisas no fórum.

Enviado: 19 Jul 2006 09:41
por clauber
entre me contato com meu e-mail que mandarei os arquivos necessarios ! !!

clauberromao@oi.com.br
clauberromao@yahoo.com.br

Re: Erro "Processor Stack Fault"

Enviado: 20 Jul 2006 12:45
por Glauco Cruz Costa
Obrigado a todos pelas respostas. Mas, gostaria de tentar resolver isso na própria programação.
O que está acontecendo é o seguinte:
Uma PROCEDURE possui uma SET KEY para se pressionar uma tecla f5 e se chamar outra procedure. Dentro dessa outra procedure, há um chamamento de uma função. E, após esse chamamento, há um chamamento para a procedure inicial.
Aí, após umas cinco vezes apertando f5, vem o tal erroUNRECOVERABLE ERROR 650: PROCESSOR STACK FAULT.
Já tentei modificar de várias maneiras o meu programa, mas não consegui. Gostaria de saber alguém pode dar-me uma outra solução.

Enviado: 22 Jul 2006 11:25
por Dudu_XBase
Já sofri com esse erro há 10 anos atrás. A única solução que me ajudou na época foi o blinker compilando a app em modo extendido.
Na época cansei de martelar a cabeça procurando falha no código e /ou tentando usar outros artificios.
Qdo tive esse problema distribui as funções em outros prgs pois tenho prgs com mais de 13 mil linhas, levei quase um mês apanhando...

Tem essa possível solução tente adicionar no Rtlink o parametro:

/STACK:15000

RTLINK FI PROGRAMA /STACK:15000

Vc pode tentar ajustar esse valor o máximo é 65000.
Poste o bat ou o forma que vc usa para linkar sua app...

Enviado: 27 Jul 2006 18:18
por Glauco Cruz Costa
Não resolveu o problema, mas retardou bastante o aparecimento do erro. De qualquer forma, fico esperando alguém que possa ter uma solução definitiva. Obrigado. ;)

Enviado: 29 Jul 2006 20:28
por Augusto
Parceiro...
Vc pede ajuda, recebe mais não aceita...
Escute quem entende... quem tem mais experiência e estrada que vc... Afinal... não é esse o seu objetivo aqui no fórum ??
Deixe o RTLINK de lado... Use o CLIPPER 5.3 / BLINKER 6 ou 7... e seu problema estará resolvido...
Vai por mim...

blinker

Enviado: 29 Jul 2006 20:50
por Josmar dos Santos
Ola Clauco..siga as dicas dos colegas, eu particularmente usava o rtlink...mas os amigos daqui me ensinaram a usar o blinker e te garanto que vc não irá se arrepender..um abraço!
Josmar
:))

Enviado: 07 Ago 2006 11:30
por Eliane
Usava o BLINKER 4-1 e menu sistema em clipper 52e, com o debug (CLD.LIB). Muitas vezes quando estava depurando o programa e usava a tecla F6 para ver os arquivos do sistema, aparecia este erro. Há poucos dias passamos para o BLINKER 7. Por enquanto, o erro não apareceu. Mas não sei a versão era o problema.

Enviado: 14 Ago 2006 18:40
por salmen
Ola Glauco..

Sugiro 2 solucoes:

1) Toda funcao chamada por uma set key, deve desativar todas set key na entrada inclusive a que a chamou...

Func Digitacao()

AbreSetKeys()
...
.... Em Algum ponto pressiona-se uma das teclas funcoes.
...
FechaSetKeys()

return nil

Function AbreSetKeys()
Set key -1 to inclui()
Set key -2 to exclui()
Return nil

Function FechaSetKeys()
Set key -1 to
Set key -2 to
return nil

Function inclui()
FechaSetKeys() // isto evita que a pilha de modulo chamados estoure
o faz ocasionar o erro. Imagina o usuario teclando F2+F3+F2+F3 seguidamente....

... comandos
... comandos
... + comandos
if preciso sair aqui
AbreSetKeys()
return nil
end

... comandos
... comandos
... + comandos

AbreSetKeys()
Return nil

Function exclui()
FechaSetKeys() // idem

... comandos
... comandos
... + comandos
if preciso sair aqui
AbreSetKeys()
return nil
end

... comandos
... comandos
... + comandos

AbreSetKeys()
Return nil

2) Ou ser for uma chamada simples:

Func Pessoas()

set key -2 consulta_nome()

...
.... Em Algum ponto pressiona-se a tecla funcao.
...

Set key -2 to
return nil

Function consulta_nome()

if procname(1) == "CONSULTA_NOME"
return nil
end

... comandos
... comandos
... + comandos

Return nil

Ou seja, se o controle programa ja estiver dentro da funcao consulta_nome e dentro da funcao for teclado a tecla set key correspondente ao -2 esta estara registrado no procname(1) entao retornara.
o perigo deste metodo é que se dentro desta funcao consulta_name()
tiver uma outra set key e o usuario ativar e dentro da nova funcao
ativada ele ativar o tecla funcao CONSULTA_NOME esta nao tera no
procname(1) o nome "CONSULTA_NOME" o que podera causar o erro se novamente for pressionado repetidas vezes a teclas de chamadas das funcoes mas, mesmo assim ha uma solucao nao muito pratica

Function consulta_nome()
ii = 1
// quando for empty()=.t. é porque a pilha acabou
while !empty(procname(ii))
if procname(ii) == "CONSULTA_NOME"
return nil
end
end

... comandos
... comandos
... + comandos

Return nil

portanto, com estes 2 exemplos... Processor Stack Fault ... por chamada de funcao já era....

Em poucas palavras

Enviado: 14 Ago 2006 21:03
por Pablo César
Caro colega Glauco,

Eu ja tive esse problema também e ainda uso o RTLINK, mas não descarto em usar o BLINKER (mas ora seja por outros motivos).
Acho que assim como o nosso colega "salmen" tentou dizer. Este problema se deve a que você faz uma declarção do SET KEY do F5 para chamar uma função. Mas resulta que você tenta chamar varias vezes e é quando dá pau. Mas eu te diria que desative o SET KEY -4 TO dentro dessa função (a qual foi chamada), pois daí dentro dela não será chamada novamente. Acho que é esse o erro ao final das contas.

Tente e nos diga se funcionou.

:xau