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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2009, 00:20   #1
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию Получение младшего и старшего байта числа.

Всем привет. Возникла проблема, подскажите.
Есть ini файл в котором хранятся координаты точек, вот пример содержимого ini файла:
Цитата:
[General]
Count=3 //Количество точек
[Координаты]
Point1=7517
Point2=3789
Point3=1517
В программе я читаю эти значения в массив Points. Но что бы получить координату Х и Y точки, я использую функции получения старшего и младшего байта числа. При этом младшие байты числа заношу в один массив, старшие в другой (masLo и masHi соответственно). Но проблема в том что функции Hi и Lo не получают и не заносят младший и старший байты чисел в соответственные массивы.
Вопрос - как получить младший и старший байты чисел, которые хранятся в этом ini файле и записать их в соответственные массивы?
Вот как я пробовал, но оно не работает:
Код:
  count:= f.ReadInteger('General','Count',count); //Читаю количество точек
  SetLength(Points,count);
  for i:=0 to count-1 do
  Points[i]:= f.ReadInteger('Координаты','Point'+IntToStr(i+1),CountPoint); //Записую в массив значения координат точек (Point1=7517 , Point2=3789 , Point3=1517)
//До этого момента все работает, а вот теперь не работает
  SetLength(masLo,count);
  for i:=0 to count-1 do
  begin
  masLo[i]:=Lo(Points[count]); //Пытаюсь получить младший и 
  masHi[i]:=Hi(Points[count]);  //старший байт чисел из файла и записать их в массивы
  end;
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 16.04.2009 в 00:23.
spamer вне форума Ответить с цитированием
Старый 16.04.2009, 06:55   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не подтверждаю!
Код:
  i := 7517;
  Label1.Caption :=
    'Ст.байт=' + IntToStr(Hi(i)) +
    ' мл.байт='+IntToStr(Lo(i));
7517 = $1D5D
старший байт:  $1D = 29
младший байт: $5D = 93
похоже у Вас проблема в другом...
Кстати, не думаю, что проблема в этом, но всё же: Какой тип у массива Points ??
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.04.2009, 14:17   #3
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Массив Points имеет тип integer.

P.S.А как бы вы посоветовали получить младший и старший байты чисел, которые хранятся в этом ini файле и записать их в соответственные массивы?
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 16.04.2009, 14:48   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у меня такой вопрос, а что должно получится?
то есть как именно получается число Поинт?
например: для этой точки Point1=7517
какие Х и У получатся?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.04.2009, 22:26   #5
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Ну по идее как я понимаю, то для пользователя это будут следующие координаты: X=75 и Y=17. А уже в программе я буду преобразовывать эти координаты к внутренним.

P.S. Этот способ мене посоветовал мой преподаватель по программированию.

Но, может есть у вас какие то идеи как считать координаты X и Y точек из ini файла и уже применять их для opengl(работаю с этой библиотекой)????
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 16.04.2009 в 22:29.
spamer вне форума Ответить с цитированием
Старый 16.04.2009, 22:39   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Код:
  count:= f.ReadInteger('General','Count',count);
  SetLength(Points,count);
  for i:=0 to count-1 do
    Points[i]:= f.ReadInteger('Координаты','Point'+IntToStr(i+1),CountPoint);
  
  SetLength(masLo,count);
  // не забываем выставлять размер второму массиву
  SetLength(masHi,count);
  
  for i:=0 to count-1 do
  begin
    masLo[i]:=Lo(Points[i]); //здесь не путаемся с порядками
    masHi[i]:=Hi(Points[i]);  //и здесь тоже
  end;
ну и Serge_Bliznykov показал результат работы фунок...
честно говоря, непонятно - что мешает хранить координаты в чистом виде?
Код:
[General]
Count=3
[Координаты]
X1=75
Y1=17 
X2=37
Y2=89
X3=15
Y3=17
и потом считывать их без доп.обработки

Последний раз редактировалось soleil@mmc; 16.04.2009 в 22:41.
soleil@mmc вне форума Ответить с цитированием
Старый 16.04.2009, 22:56   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если получается 75 и 17 то байты тебе конечно же не то выдадут
там разряды десятичного числа надо получать тогда с помощью div
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.04.2009, 02:05   #8
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

И все-таки идея с вариантной записью мне ближе...
Код:
....
type TMyInt = record
case integer of
    0: (i: integer);
    1: (a: byte; b: byte; c: byte; d: byte);
end;
...

var
   n: TMyInt;
....
n.i := Points[i];
Теперь в n.a мы имеем старший байт, а в n.d - младший. Но имей ввиду, что между ними есть еще пара байт, т.к. Points у тебя объявлен как integer. Может все-таки стоит его объявить как WORD?
Баламут вне форума Ответить с цитированием
Старый 17.04.2009, 10:36   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Баламут, да ТС совсем не нужны старший и младший байты!!!! ему нужны числа из десятичной записи числа!!
т.е. ему из числа 7517 нужно получить x=75 и y=17

spamer, Вы меня, конечно, извините, но Вы с Вашим преподавателем фигню придумали!!!
выделить из 7517 отдельно 75 и отдельно 17 абсолютно не сложно (либо в цикле через div 10 и mod 10, как предложил Пепел Феникса, либо, банальное:
x := StrToInt(Copy(Trim(IntToStr(Points[i]),1,2));
y := StrToInt(Copy(Trim(IntToStr(Points[i]),3,2)); )

Но Вы, наверное, догадываетесь, что координаты бывают не только двухзначные?!
Так вот, расскажите мне, какие, по Вашему (и по мнению Вашего преподавателя) должны быть координаты если:
Point = 5 (x=0 y=5 или x=5 y=0 ??)
Point = 12145 (x=12 y = 145 или x=121 y = 45
Point = 111111 (варианты??)

таким образом, целое число по предложенному Вами алгоритму нельзя однозначно перевести в координаты x и y). точка.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.04.2009, 14:37   #10
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Цитата:
spamer, Вы меня, конечно, извините, но Вы с Вашим преподавателем фигню придумали!!!
Я не спорю. Просто он сказал, что надо из ini файла считать координаты точек и предложил считывать младший и старший байты чисел. Мене сразу эта идея не понравилась.

Вот думаю может по другому это как то сделать. А конкретно хочу попробовать как предложил soleil@mmc:
Цитата:
хранить координаты в чистом виде
Код:
CountPoint:= f.ReadInteger('Количество точек','Count',CountPoint);  //Читаю количество точек
  SetLength(masX,CountPoint);
  SetLength(masY,CountPoint);

  for i:=0 to CountPoint-1 do
  begin
    //Читаю координаты X точек в массив masX
    masX[i]:=f.ReadFloat('Координаты X','X'+IntToStr(i+1),CountPoint); 
    //Читаю координаты Y точек в массив masY 
    masY[i]:=f.ReadFloat('Координаты Y','Y'+IntToStr(i+1),CountPoint);
  end;


  //Передаю координаты в метод движения фигуры
  for i:=0 to CountPoint-1 do
  begin
    MyClass.Paint(masX[i], masY[i]);
    Sleep(1000);
  end;
Вот так сделал. Народ, если можете - подскажите, мой код правильно реализован??? Он то вроде работает, но все же, что вы скажите - нормально реализован или как то переделать???


Содержимое ini файла :
[Количество точек]
Count=3
[Координаты X]
X1=-0,3
X2=-0,5
X3=0,0
[Координаты Y]
Y1=0,0
Y2=0,0
Y3=-0,5
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 17.04.2009 в 14:39.
spamer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Когда отправляю tStream, теряю 4 байта. Altera Работа с сетью в Delphi 3 19.03.2009 19:05
взятие старшего и младшего байта Djaconda Общие вопросы Delphi 2 29.09.2008 09:25
Вывод байта в двоичном пердставлении (С++) trollik Помощь студентам 6 01.09.2008 23:55
Обрезать у файлов первые 24 байта и переименовать в соответствии со списком. Hell'ena Общие вопросы Delphi 13 12.07.2008 20:48
Visual basic. В группе студентов определить старшего по возрасту Николай969 Помощь студентам 4 11.01.2008 17:50