Ir para o conteúdo
Maou

memoria corrompida

Mensagens Recomendadas

Maou

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

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 por thoga31

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Maou

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 por Maou

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Maou

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 conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.