Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2010, 20:03   #1
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
По умолчанию Проблемы с процедурой

Здравствуйте, возникла проблема с написанием процедуры...
В идеале она должна делать следующее:
есть один массив байтов.
Берутся по два байта из 1го массива, переводятся в короткое вещественное и записывается во 2й и 3й массив по очереди.
(т.е. в одной процедуре должно получиться два новых массива).
В итоге после вызова процедур получаются нулевые новые массивы.. Где накосячил?

Код:
procedure ReadDat(Arr:array of byte;Arr_Size:longint;Arr_K:array of smallint;Arr_M:array of smallint);
var
i,j:longint;
ekg,emg:smallint;
begin
i:=1;
j:=1;
  while i<=Arr_Size do begin
  emg:=Arr[i]+Arr[i+1]*256;
  ekg:=Arr[i+2]+(Arr[i+3]*256);
  Arr_M[j]:=emg;
  Arr_K[j]:=ekg;
  inc(i,4);
  j:=j+1;
  end;
end;
Код:
var
  S_Path,P_Path,F_Path:       string;
  S_File,P_File,F_File:       file;
  S_Size,P_Size,F_Size:       longint;
  S_Arr,P_Arr,F_Arr:          array of byte;
Код:
    SetLength(S_Arr_EKG,(S_Size div 4)+1);
    SetLength(S_Arr_EMG,(S_Size div 4)+1);
    SetLength(P_Arr_EKG,(P_Size div 4)+1);
    SetLength(P_Arr_EMG,(P_Size div 4)+1);
    SetLength(F_Arr_EKG,(F_Size div 4)+1);
    SetLength(F_Arr_EMG,(F_Size div 4)+1);
    //
    ReadDat(S_Arr, S_Size, S_Arr_EKG, S_Arr_EMG);
    ReadDat(P_Arr, P_Size, P_Arr_EKG, P_Arr_EMG);
    ReadDat(F_Arr, F_Size, F_Arr_EKG, F_Arr_EMG);
Nigadyai вне форума Ответить с цитированием
Старый 03.06.2010, 20:41   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ну, во-первых, раз массивы динамические, что начинать нужно не с 1-ого, а с 0-ого элемента
Код:
i := 0;
j := 0;
Во-вторых, вы уверенны, что S_Arr, P_Arr и F_Arr не являются нулевыми до вызова процедур.
И как получаются S_Size, P_Size, F_Arr. Может они равны 0.

Последний раз редактировалось Sibedir; 03.06.2010 в 20:47.
Sibedir вне форума Ответить с цитированием
Старый 03.06.2010, 20:52   #3
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
По умолчанию

Arr - не динамический, поэтому i должно быть = 1.
Если и поставить j=0, то результат останется тем же...
Я думаю, что проблема кроется где-то в описании параметров процедуры и в том, как я ее вызываю..
Nigadyai вне форума Ответить с цитированием
Старый 03.06.2010, 20:57   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Arr:array of byte
и
Цитата:
S_Arr,P_Arr,F_Arr: array of byte;
Это динамические массивы
Sibedir вне форума Ответить с цитированием
Старый 03.06.2010, 21:00   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Сдетайте так

Код:
type
  TArrB = array of Byte;
  TArrI = array of smallint;
Код:
procedure ReadDat(Arr:TArrB;Arr_Size:longint;Arr_K, Arr_M:TArrI);
var
i,j:longint;
ekg,emg:smallint;
begin
i:=0;
j:=0;
  while i<=Arr_Size do begin
  emg:=Arr[i]+Arr[i+1]*256;
  ekg:=Arr[i+2]+(Arr[i+3]*256);
  Arr_M[j]:=emg;
  Arr_K[j]:=ekg;
  inc(i,4);
  j:=j+1;
  end;
end;
Код:
var
  S_Path,P_Path,F_Path:       string;
  S_File,P_File,F_File:       file;
  S_Size,P_Size,F_Size:       longint;
  S_Arr,P_Arr,F_Arr:          TArrB;

    SetLength(S_Arr_EKG,(S_Size div 4)+1);
    SetLength(S_Arr_EMG,(S_Size div 4)+1);
    SetLength(P_Arr_EKG,(P_Size div 4)+1);
    SetLength(P_Arr_EMG,(P_Size div 4)+1);
    SetLength(F_Arr_EKG,(F_Size div 4)+1);
    SetLength(F_Arr_EMG,(F_Size div 4)+1);
    //
    ReadDat(S_Arr, S_Size, S_Arr_EKG, S_Arr_EMG);
    ReadDat(P_Arr, P_Size, P_Arr_EKG, P_Arr_EMG);
    ReadDat(F_Arr, F_Size, F_Arr_EKG, F_Arr_EMG);
Sibedir вне форума Ответить с цитированием
Старый 03.06.2010, 21:43   #6
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
По умолчанию

i,j оставил как есть, типы объявил - рисует как надо))) спасибо!
Nigadyai вне форума Ответить с цитированием
Старый 03.06.2010, 21:45   #7
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
i,j оставил как есть
Зачем? Это же не правильно.
Sibedir вне форума Ответить с цитированием
Старый 04.06.2010, 00:48   #8
Nigadyai
Пользователь
 
Регистрация: 11.03.2010
Сообщений: 37
По умолчанию

Код:
  // обработка файла
    assignfile(S_File,S_Path);
    reset(S_File,1);
    S_Size:=FileSize(S_File);
    SetLength(S_Arr,S_Size);
    BlockRead(S_File,S_Arr[0],S_Size);
    closefile(S_File);
    //
После "считывания" байт из файла в массив, нумерация пошла именно с единицы.
[мл.байт][ст.байт][мл.байт][ст.байт][мл.байт][ст.байт]
Nigadyai вне форума Ответить с цитированием
Старый 04.06.2010, 00:58   #9
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Странно. Мне кажется, что у вас сбивка произошла на этапе записи в файл, а не чтения.
Sibedir вне форума Ответить с цитированием
Старый 04.06.2010, 01:11   #10
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Кстати, может есть смысл сразу считать по слову, а не по байту
Код:
type
  TArrI = array of Smallint;
var
  S_File: file;
  S_Size: Integer;
  S_Path: String;
  S_Arr: TArrI;
Код:
    AssignFile (S_File, S_Path);
    Reset (S_File, 2);
    S_Size := FileSize (S_File) div 2;
    SetLength (S_Arr, S_Size);
    BlockRead (S_File, S_Arr[0], S_Size);
    CloseFile (S_File);
Посмотрите еще вот это. Может пригодится
Код:
type
  TWordRec = packed record
    case Integer of
      0: (Lo, Hi: Byte);
      1: (Word: Word);
  end;
var
  b1, b2: Byte;
  wr: TWordRec;
  w: Word;
Код:
  wr.Lo := b1;
  wr.Hi := b2;
  w := wr.Word;
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблемы с рекурсивной процедурой Xsires Паскаль, Turbo Pascal, PascalABC.NET 0 03.06.2010 00:40
Подскажите с процедурой KARUSHEV Помощь студентам 6 04.10.2009 20:37
Паскаль. Программа с процедурой. rooman90 Паскаль, Turbo Pascal, PascalABC.NET 0 07.05.2009 18:32
Задачка с процедурой Katenka Паскаль, Turbo Pascal, PascalABC.NET 5 15.12.2008 13:53
Помогите с процедурой... Arkuz Помощь студентам 10 15.05.2008 08:56