Maou 0 Denunciar mensagem Publicado 20 de Julho de 2016 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. http://imgur.com/a/nZe1K alguém tem alguma ideia do que possa ser. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
thoga31 600 Denunciar mensagem Publicado 22 de Julho de 2016 (editado) 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. Editado 22 de Julho de 2016 por thoga31 Knowledge is free! Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Maou 0 Denunciar mensagem Publicado 23 de Julho de 2016 (editado) 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. Editado 23 de Julho de 2016 por Maou Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pwseo 223 Denunciar mensagem Publicado 23 de Julho de 2016 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): Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Maou 0 Denunciar mensagem Publicado 23 de Julho de 2016 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. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Crie uma conta ou ligue-se para comentar
Só membros podem comentar
Criar nova conta
Registe para ter uma conta na nossa comunidade. É fácil!
Registar nova contaEntra
Já tem conta? Inicie sessão aqui.
Entrar Agora