Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 809

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Координаты точек хранятся в массиве APnt:array [1..maxpnt,1..2] of integer;
Задаются координаты следующим образом:
Pnt:=Pnt+1;
APnt[Pnt,1]:=X;
APnt[Pnt,2]:=Y;
Мне необходимо реализовать сохранение координат в файл, и загрузку координат из файла... Если с загрузкой еще можно повозиться, то с сохранением я вообще не соображаю.
Край сройно нужно. На всякий случай цепляю файл.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Ozz Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Ozz (статус: Посетитель)
Вопрос отправлен: 18 мая 2009, 18:39
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Вот, набросал тебе пример. Это не руководство к действию, т.е. не надо тупо копипастить к себе в код, а разобраться в концепции. Это просто пример.

const
  maxpnt = 100; // для примера
 
type
  TPointArray = array [1..maxpnt, 1..2] of integer;
 
function LoadPointArray(var PA: TPointArray; const FileName: string): Boolean;
var
  Index: Integer;
  FS: TFileStream;
  IntBuf: Integer;
begin
  try
    FS:= TFileStream.Create(FileName, fmOpenRead);
    try
      for Index:= 0 to maxpnt - 1 do
        begin
          FS.ReadBuffer(IntBuf, 4); // Чтение Х
          PA[Index, 1]:= IntBuf;
          FS.ReadBuffer(IntBuf, 4); // Чтение Y
          PA[Index, 2]:= IntBuf;
        end;
    finally
      FS.Free();
    end;
    Result:= True;
  except
    Result:= False;
  end;
end;
 
function SavePointArray(const PA: TPointArray; const FileName: string): Boolean;
var
  Index: Integer;
  FS: TFileStream;
begin
  try
    FS:= TFileStream.Create(FileName, fmOpenWrite);
    try
      for Index:= 0 to maxpnt - 1 do
        begin
          FS.WriteBuffer(PA[Index, 1], 4); // Запись Х
          FS.WriteBuffer(PA[Index, 2], 4); // Запись Y
        end;
    finally
      FS.Free();
    end;
    Result:= True;
  except
    Result:= False;
  end;
end;

Ахтунг! Не отлаживал, писал на коленке!

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 18 мая 2009, 19:07
Оценка за ответ: 2

Комментарий к оценке: Не плохо, но сложновата реализация.

Мини-форум вопроса

Всего сообщений: 13; последнее сообщение — 19 мая 2009, 12:08; участников в обсуждении: 4.
Вадим К

Вадим К (статус: Академик), 18 мая 2009, 19:01 [#1]:

А как Вы собрались делать загрузку, если сохранить не можете?
Для начала надо определиться, как именно хочеться сохранять. Может применить наиболее простой метод - просто все точки одним скопом. То есть, одна точка - 2 строки в файле.
А в первой строке можно записать общее кол-во строк, хотя и не обязательно. Если применить TStringList, то вообще просто может получиться.
ну где то так
sl:=TStringList.Create;
for i:= 0 to length(APnt)-1 do begin
sl.Add(inttostr(APnt[i,1]);
sl.Add(inttostr(APnt[i,2]);
end;
sl.SaveToFile('file.txt');
sl.free;
Галочка "подтверждения прочтения" - вселенское зло.
Ozz

Ozz (статус: Посетитель), 18 мая 2009, 19:26 [#2]:

Вадим, выручил, благодарю... (хоть в этом вопросе не послали чего качать...)
Вадим К

Вадим К (статус: Академик), 18 мая 2009, 19:34 [#3]:

здесь не нужно было ничего качать. Можно было и через обычную работу с файлами написать (через AssingFile и так далее), но это по настроению.
to min@y™. Надо было хотя бы кол-во точек записывать, а то в противном случае получается плохая реализация.
А вот за то, что размер integer поставлен как 4, надо назказывать. Кто сказал, что он будет 4 байта. Вот в паскале он был 2 байта. а в 64битной делфи, которая должна по идеи появиться - должен быть 8 байт...
Галочка "подтверждения прочтения" - вселенское зло.
Ozz

Ozz (статус: Посетитель), 18 мая 2009, 19:50 [#4]:

Нда, я что-то не понял, я теперь загрузить в этот массив не могу по методу Вадима... тоже нужно содавать StringList?
Паровоз

Паровоз (статус: 10-ый класс), 18 мая 2009, 19:53 [#5]:

Напрашиваются два комментария:
1) для автора вопроса: "Не плохо, но сложновата реализация."
Удивительная по своему безобразию оценка - если "не плохо", то почему же оценка "плохо"?

2) для min@y™:
Вот так и оказывают помощь двоечникам - они Вас используют, а ставят два.
Вадим К

Вадим К (статус: Академик), 18 мая 2009, 19:59 [#6]:

у min@y™ задумка хорошая, но не до конца реализована, далеко не до конца. Реализацию надо выбирать по уровню того, кто срашивает. Да, я мог написать с красивым сохранением в базу и так дальше, но тут этого не надо.
to Ozz.
Загрузка примитивна.
sl:=TStringList.Create;
sl.LoadFromFile('file');
n := sl.count div 2;
SetLength(APnt, n);
for i:= 0 to n - 1 do
  begin
    APnt[i,1] := StrToInt(sl[i*2]);
    APnt[i,2] := StrToInt(sl[i*2+1]);
  end;
sl.free;
В коде вообще то не помешало пару проверочек. размеры массива и так дальше. Но это потом, по желанию.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 18 мая 2009, 20:10 [#7]:

2 Ozz:
Считаю оценку НЕСПРАВЕДЛИВОЙ и требую объяснений!
Я написал, что это не есть готовый код.
Больше я на твои вопросы отвечать не буду. Потратил целых 10 минут своей жизни (а она у меня одна) на написание ответа, а что получил? Лучше бы вообще оценку не ставил.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ozz

Ozz (статус: Посетитель), 18 мая 2009, 20:32 [#8]:

Паравоз, никто никого не использует, тут каждый сам вызвался помогать, ну не понял я предложенного ответа, мне не сложно, я могу и пять поставить, но получится что не за что... Лично я сужу помогло или не помогло...
min@y™ ну извини, я твой код и сверху вниз и снизу вверх пересмотрел, стартовать стартует, и свои значения, и свои параметры наставил, но я его потом даже вызвать эти события не смог (признаю, видимо я совсем тупой). Хочешь, в оправдание в репу дам тебе плюсом?
Вадим, извини что совсем туплю, я одним глазом уже сплю, а завтра сдавать... Проблема в SetLength(APnt,n), неверное задание параметров, всевозможные варианты переставил, не фурычит, а без него выдает только одну точку, и то в левом верхнем углу, которой не должно быть по идеи.
min@y™

min@y™ (статус: Доктор наук), 18 мая 2009, 20:40 [#9]:

А я предупреждал, что код нерабочий. Это пример использования TFileStream для загрузки/сохранения подобных данных. Остальное надо было придумать, поставив свои мозги в положение "ВКЛ".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Паровоз

Паровоз (статус: 10-ый класс), 18 мая 2009, 23:38 [#10]:

To Ozz:
Ну так два зачем же ставить, если сам охарактеризовал ответ как "Не плохо, но сложновата реализация"? Это никак не два потому что два - это плохо.
Ozz

Ozz (статус: Посетитель), 19 мая 2009, 11:12 [#11]:

Вадим, так и не понял почему в твоем коде ошибку выдает, но он помог додуматься до другого метода... так что вопрос исчерпан, спасибо всем (и извините за оценки)!
var
f : TextFile;
x,y : integer;
begin
AssignFile(f,'file.txt');
reset(f);
While not Eof(f) do
begin
Pnt:=Pnt+1;
ReadLn(f,x);
ReadLn(f,y);
APnt[Pnt,1]:=x;
APnt[Pnt,2]:=y;
end;
Вадим К

Вадим К (статус: Академик), 19 мая 2009, 11:32 [#12]:

Во первых - если возникает ошибка - пишем какая, я иногда проявляю дар телепатии, но пока не регулярно, голова не выдерживает...
Во вторых, вообще то "Ваш", а не "Твой", но это так, между прочим.
Галочка "подтверждения прочтения" - вселенское зло.
Ozz

Ozz (статус: Посетитель), 19 мая 2009, 12:08 [#13]:

Я часто писал Ваш, но порой когда сильно загруженый не услеживаю за этим...

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:27
Выполнено за 0.03 сек.