temp: String [Length(hl5)];

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

temp: String [Length(hl5)];

Сообщение RENXFIL » 24.10.2011 17:30:14

Преобразование десятичного значения в шестнадцатеричное, система Free Pascal - Лазаруса.
Код: Выделить всё
program Ren_Dec2hex;
{$mode objfpc}{$H+}
uses crt, dos, renxfiltrus;
const hl5 = '0123456789ABCDEF';
var hold_in, dec_str, hex_str: string;
     hex_digits: array[0..15] of char;
     ch: char;
     k: integer;
procedure initialize;
var j: word;
     const hl5 = '0123456789ABCDEF';
     temp: String [Length(hl5)];
begin
  temp:=hl5;
  for j:=0 to 15 do hex_digits[j] := temp[j+1];
end;
procedure get_decimal(var dec_str: string);
var k: word;
begin
  repeat
    xfiltrlazlaz:='Введите строку десятичных цифр:';
    xfil_ruslazdos;
    writeln(xfiltrlazdos);
    readln(dec_str);
    if dec_str = '' then Halt;
    for k:=Length(dec_str) downto 1 do
     if not (dec_str[k] in ['0'..'9']) then Delete(dec_str, k, 1);
    while (Length(dec_str) > 1) and (dec_str[1] = '0') do Delete(dec_str, 1, 1);
    if Length(dec_str)> 0 then Exit;
    xfiltrlazlaz:='Ошибка при вводе, повтарите';
    xfil_ruslazdos;
    writeln(xfiltrlazdos);
    writeln;
   until false;
  end;
  procedure convert(var dec_str, hex_str: string);
  var remainder: integer;
  procedure divide_by_16;
  var j,k,dividend: word;
      error: integer;
  begin
   remainder:=0;
   for j:=1 to Length(dec_str) do
   begin
    if KeyPressed then halt;
    Val(dec_str[j], k, error);
    dividend:=10*remainder+k;
    remainder:=dividend mod 16;
    dec_str[j]:=hex_digits[dividend div 16];
   end;
   Delete(dec_str,1,1);
  end;
  begin
   hex_str:='';
   while Length(dec_str) > 0 do
   begin
    if KeyPressed then Halt;
    divide_by_16;
    hex_str:=hex_digits[remainder]+hex_str;
   end;
  end;
begin
  initialize;
  repeat
   get_decimal(dec_str);
   hold_in:=dec_str;
   convert(dec_str, hex_str);
   k:=Length(hold_in)-2;
   while k > 1 do
   begin
    Insert(',',hold_in, k);
    Dec(k,3);
   end;
   write(hold_in,' = $');
   while Length(hex_str) mod 4 <> 0 do hex_str:='0'+hex_str;
   k:=Length(hex_str)-3;
   while k > 1 do
   begin
    Insert(' ',hex_str,k);
    Dec(k,4);
   end;
   writeln(hex_str); writeln;
   xfiltrlazlaz:='Для продолжения работы нажмите <Enter>, а для окончания <Esc>';
   xfil_ruslazdos;
   writeln(xfiltrlazdos);
   ch:=readkey;
   if ch:=#27 then Break;
   writeln;
  until false;
end.

Не понимает это место:
Можно ли по другому это место переделать(варианты), выходит с ошибкой Ren_Dec2hex.pas(12,32) Fatal: Syntax error, "=" expected but ";" found
Код: Выделить всё
const hl5 = '0123456789ABCDEF';
     temp: String [Length(hl5)];

Ошибка останавливается между ] и ;
Аватара пользователя
RENXFIL
новенький
 
Сообщения: 16
Зарегистрирован: 23.09.2011 16:47:57
Откуда: Я и сам не знаю.

Re: temp: String [Length(hl5)];

Сообщение Maxizar » 24.10.2011 20:02:51

А если:
Код: Выделить всё
const hl5 = '0123456789ABCDEF';

var
temp: String[Length(hl5)];     
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: temp: String [Length(hl5)];

Сообщение pda » 24.10.2011 20:52:51

Жесть какая, а что типизированные константы уже не работают?
Код: Выделить всё
const
  hex_digits: String = '0123456789ABCDEF';
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: temp: String [Length(hl5)];

Сообщение RENXFIL » 26.10.2011 15:26:04

xfil01.JPG
:(
Не работат.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
RENXFIL
новенький
 
Сообщения: 16
Зарегистрирован: 23.09.2011 16:47:57
Откуда: Я и сам не знаю.

Re: temp: String [Length(hl5)];

Сообщение Maxizar » 26.10.2011 16:48:24

:cry: Печалька.....

Но а если по делу, а почему должно работать? Если Вы так ничего и не переделали???
У Вас же на скрине черным по белому написано, ожидалось =, а найдена точка с запятой....
Вы пытаетесь в разделе Константы, использовать двоеточие??? по этому я предложил вам разнезсти эти два обьявления в разные области Константы и переменные, либо делайте как предложил PDA.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: temp: String [Length(hl5)];

Сообщение RENXFIL » 27.10.2011 12:20:57

Я чёт не пойму, а для чего такое добавление сделали, почему то у меня по книге он во обще отсутствует.
разве const hl5 = '0123456789ABCDEF'; не достаточно?
temp: String [Length(hl5)] = '0123456789ABCDEF';
А так всё работает =) Спосибо)

Я тут посмотрел, тут ходу [Length(hl5)] вообще не нужен.

А что вы имели под словом "жесть какая"
Аватара пользователя
RENXFIL
новенький
 
Сообщения: 16
Зарегистрирован: 23.09.2011 16:47:57
Откуда: Я и сам не знаю.

Re: temp: String [Length(hl5)];

Сообщение pda » 27.10.2011 16:36:31

RENXFIL писал(а):Я тут посмотрел, тут ходу [Length(hl5)] вообще не нужен.

Разумеется, не нужен. Компилятор пока и сам может посчитать длину литерала. :)

RENXFIL писал(а):А что вы имели под словом "жесть какая"

Подход к решению. Константу в переменную, переменную в массив... (Утка в зайце, заяц в шоке.)
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: temp: String [Length(hl5)];

Сообщение RENXFIL » 28.10.2011 12:53:39

(Утка в зайце, заяц в шоке.) :D

А не скажете для чего тут if KeyPressed then Halt; , в двух местах даже.
Чёта, гонял, гонял, прогу и так и сяк, не фига не понял, по ходу лишняя она
Аватара пользователя
RENXFIL
новенький
 
Сообщения: 16
Зарегистрирован: 23.09.2011 16:47:57
Откуда: Я и сам не знаю.

Re: temp: String [Length(hl5)];

Сообщение Odyssey » 28.10.2011 17:46:47

RENXFIL писал(а):if KeyPressed then Halt;

Дословный перевод:
Если нажата клавиша то остановить (выполнение программы)

Скорее всего действие этой строчки незаметно потому, что циклы, которые её содержат, успевают прокрутиться полностью прежде чем вы успеваете нажать клавишу.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 211

Рейтинг@Mail.ru