temp: String [Length(hl5)];

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

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

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

temp: String [Length(hl5)];

Сообщение RENXFIL »

Преобразование десятичного значения в шестнадцатеричное, система 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)];

Ошибка останавливается между ] и ;
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

А если:

Код: Выделить всё

const hl5 = '0123456789ABCDEF';

var
temp: String[Length(hl5)];     
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

Жесть какая, а что типизированные константы уже не работают?

Код: Выделить всё

const
  hex_digits: String = '0123456789ABCDEF';
Аватара пользователя
RENXFIL
новенький
Сообщения: 16
Зарегистрирован: 23.09.2011 16:47:57
Откуда: Я и сам не знаю.

Сообщение RENXFIL »

xfil01.JPG
:(
Не работат.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

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

Но а если по делу, а почему должно работать? Если Вы так ничего и не переделали???
У Вас же на скрине черным по белому написано, ожидалось =, а найдена точка с запятой....
Вы пытаетесь в разделе Константы, использовать двоеточие??? по этому я предложил вам разнезсти эти два обьявления в разные области Константы и переменные, либо делайте как предложил PDA.
Аватара пользователя
RENXFIL
новенький
Сообщения: 16
Зарегистрирован: 23.09.2011 16:47:57
Откуда: Я и сам не знаю.

Сообщение RENXFIL »

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

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

А что вы имели под словом "жесть какая"
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

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

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

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

Подход к решению. Константу в переменную, переменную в массив... (Утка в зайце, заяц в шоке.)
Аватара пользователя
RENXFIL
новенький
Сообщения: 16
Зарегистрирован: 23.09.2011 16:47:57
Откуда: Я и сам не знаю.

Сообщение RENXFIL »

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

А не скажете для чего тут if KeyPressed then Halt; , в двух местах даже.
Чёта, гонял, гонял, прогу и так и сяк, не фига не понял, по ходу лишняя она
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

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

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

Скорее всего действие этой строчки незаметно потому, что циклы, которые её содержат, успевают прокрутиться полностью прежде чем вы успеваете нажать клавишу.
Ответить