Maou Posted July 20, 2016 at 01:27 AM Report #597726 Posted July 20, 2016 at 01:27 AM Olá a todos, estou com um grande problema, fiz uma tabela ascii e esta dando sigsegv run time erro 217. aqui esta o código que gera o erro. {código parcial da tabela ascii} uses Crt,SysUtils; const S:array[0..32] of string=('Caractere Nulo-NUL', 'Come'+#135+'o De Cabe'+#135+'alho De Transmiss'+#198+'o-SOH', 'Come'+#135+'o Do Texto-STX', 'Fim Do Texto-ETX', 'Fim De Transmiss'+#198+'o-EOT', 'Interroga-ENQ', 'Confirma'+#135#198+'o-ACK', 'Sinal Sonoro-BEL', 'Volta Um Caractere-BS', 'Tabula'+#135#198+'o Horizontal-HT', 'Pr'+#162+'xima Linha-LF', 'Tabula'+#135#198+'o Vertical-VT', 'Pr'+#162+'xima Pagina-FF', 'Inicio Da Linha-CR', 'Shift-Out -SO', 'Shift-In -SI', 'Data Link Escape-DLE', 'Controle De Dispositivo-D1', 'Controle Dispositivo-D2', 'Controle De Dispositivo-D3', 'Controle De Dispositivo-D4', 'Negativa De Confirma'+#135#198+'o-NAK', 'Synchronous Idle-SYN', 'Fim De Bloco De Transmiss'+#198+'o-ETB', 'Cancela-CAN', 'Fim De Meio De Transmiss'+#198+'o-EM', 'Substitui-SUB', 'Escape-ESC', 'Separador De Arquivo-FS', 'Separador De Grupo-GS', 'Separador De Registro-RS', 'Separador De Unidade-US', 'Espa'+#135+'o Em Branco-SPC'); var I,L:integer; procedure Blocos(ST,SB,SH,SD:string); var I:integer; //Ultilizada Em Loops Guard:string; begin For I:=Length(ST) to 38 do begin ST:=ST+' '; end; Guard:=#124+ST; For I:=Length(SB) to 8 do begin SB:=SB+' '; end; Guard:=Guard+#124+SB; For I:=Length(SH) to 10 do begin SH:=SH+' '; end; Guard:=Guard+#124+SH; For I:=Length(SD) to 14 do begin SD:=SD+' '; end; Guard:=Guard+#124+SD+#124; writeln(Guard); end; begin L:=22; for I:=0 to 255 do begin if I IN [0..32] then Blocos(S[i],IntToStr(I),'','') else Blocos(Chr(I),IntToStr(I),'',''); if I>=L then begin readkey; L:=L+22; ClrScr; end; end; readkey; end. Na interação 33 do laço for o if executa o mesmo código. no GDB acusa erro de segmento mais as variáveis estão ok, quando eu verifiquei. compilei sem os símbolos do debug, o programa funcionou, mais deu isso ai. https://i.postimg.cc/2S6bMfBw/gzUxCyh.jpg alguém tem alguma ideia do que possa ser.
thoga31 Posted July 22, 2016 at 05:48 PM Report #597775 Posted July 22, 2016 at 05:48 PM (edited) Boa tarde. Após análise da explicação que forneceste acerca da tua dúvida - a quel foi, tenho de referir, algo criptográfica -, entendi qual o teu problema. De uma forma mais simples: No ciclo for do bloco principal, a informação é escrita conforme esperado até I=32. Contudo, quando I>=32, o programa não funciona como seria expectável. Em vez de escrever os caracteres ASCII (chr(I)), o programa escreve aquele lixo todo por motivos para já desconhecidos. Não sabendo qual o compilador que estás a utilizar, só te posso dizer que eu, ao usar o Free Pascal 3.0.0 i386-win, obtive exactamente o que pretendias. O teu código não tem erros. Cumprimentos. Edited July 22, 2016 at 05:48 PM by thoga31 Knowledge is free!
Maou Posted July 23, 2016 at 12:53 AM Author Report #597779 Posted July 23, 2016 at 12:53 AM (edited) Obrigado thoga31, por me responder. eu acabei descobrindo o que era, depois de muito puxar cabelo (Nota Sou careca) 🙂 resolvi testar no meu outro computador e Ta Dá funcionou e por incrível que pareça o problema era hardware é não software como eu pensava, vou tentar explicar o que aconteceu. no gdb o erro acontecia antes da interação 33, já no onlydebug acontecia durante a interação 33 chequei linha a linha do for no onlydebug e estava passado um valor errado para EAX com MOVZX o valor e esse FFFFh ai era repassado para o segmento EDI, depois disso vinha o erro. agora sobre o hardware e um. pentium 4 ht Northwood 2.80GHz memoria ddr 1Gb hd ide samsung de 80Gb montei essa lata, pra aprender a programar mais ela já esta no final da sua vida, desde quando começou isso tem dado muitas telas azul da morte. flw. Edited July 23, 2016 at 12:56 AM by Maou
pwseo Posted July 23, 2016 at 03:08 PM Report #597781 Posted July 23, 2016 at 03:08 PM Maou, Há múltiplas sugestões que podem ser feitas ao teu programa, mas talvez uma das mais interessantes e rápidas de implementar seja removeres o código que tenta paginar o output do programa. No Windows (SO que estás a utilizar), existe um comando chamado more que pagina o output de outros programas por ti, e fá-lo de forma bastante melhor que a que estás a utilizar no teu código. Experimenta: C:\> cd Pasta_onde_tens_o_programa C:\Pasta_onde_tens_o_programa\> ascii.exe | more Mais tarde coloco aqui outras sugestões também elas muito pertinentes... EDIT: aqui fica uma versão do teu programa mas mais amigo do terminal e dos olhos (são duas execuções, a primeira mostra as primeiras 5 linhas, e a segunda mostra as últimas 5 linhas):
Maou Posted July 23, 2016 at 06:56 PM Author Report #597784 Posted July 23, 2016 at 06:56 PM Oi pwseo, meu programa era pra min treinar conversões de base e arquivos, essa parte que coloquei lá encima era 84 das 532 linhas do programa. eu dividi ele em varias seções, tipo assim caracteres alfabéticos, números, caracteres especiais e a ultima parte era rolar a tabela de 0 a 255. gostei da dica de passagem de parâmetro vou tentar aqui.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now