Jump to content

Recommended Posts

Posted

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.

Posted (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 by thoga31

Knowledge is free!

Posted (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 by Maou
Posted

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):

fYRlrR1.png

Posted

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.

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.