Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение чисел из файла! 
:(
    Опции темы
Sniper
  Дата 20.9.2003, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



var
VertexCount: Integer;
Vertex: array of TVector;

procedure LoadWorld(Filename: String);
var F: TextFile;
begin
AssignFile(F, Filename);
Reset(F);

while not Eof(F) do
begin
SetLength(Vertex, VertexCount+1);
ReadLn(F, Vertex[VertexCount].X, Vertex[VertexCount].Y, Vertex[VertexCount].Z);
Inc(VertexCount);
end;

CloseFile(F);
end;

Как её изметить, чтобы можно было загружать файл типа... a.k.a по три триагла в строчку!

.....
-4.270096 -2.520900 -6.080324 4.475884 2.932476 -6.080324 4.475884 -2.520900 -6.080324
.....



--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
neutrino
Дата 20.9.2003, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Конкретизируй вопрос для таких недоумков, как я. А то ничего непонятно.

И в твоем случае надо однозначно пользоваться связными списками, а не массивом, которому в каждой итерации надо реаллокацию делать.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Sniper
Дата 20.9.2003, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Смотри: функция выше читает файл типа

.....
-4.270096 -2.520900 -6.080324
4.475884 2.932476 -6.080324
4.475884 -2.520900 -6.080324
.....

А мне нужно, чтобы читала

.....
-4.270096 -2.520900 -6.080324 4.475884 2.932476 -6.080324 4.475884 -2.520900 -6.080324
.....

где .... - это тоже числа


p.s не связанные списки и прочее не надо... у меня всё держится на дин массивах! А то прикручу и нифига работать не будет! %-)


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
stron
Дата 20.9.2003, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Консультант
***


Профиль
Группа: Комодератор
Сообщений: 1654
Регистрация: 17.7.2003
Где: Питер

Репутация: нет
Всего: 36



Либо я чего-то не понял, либо поменяй readln на read (хотя я наверное не понял!!)
А ещё в начале я бы обнулил VertexCount


--------------------
подписи нет
PM ICQ   Вверх
p0s0l
Дата 21.9.2003, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



А лучше было бы если бы файл был бы типизорованным: var F: File of TVector
-> читать в цикле таким образом : Read(f, Vertex[VertexCount])
Можно будет переделать и по 3 вертекса за 1 read, только тогда файл надо делать нетипизированным - но зачем тебе это, объясни?



--------------------
С уважением, г-н Посол.
PM   Вверх
neutrino
Дата 21.9.2003, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Я согласен с господином :p0s0l. В типизированном файле все твои вертексы будут занимать одно и то же количество байт (32 бит с одинарной точностью и 64 с двойной). Так намного удобнее будет с ними работать. Тем блолее, что чтение и запись будет происxодить на порядок быстрее.
На счет массивов: если ты пользуешься функциями :OpenGL (как я понял) для построения "мира", которые как параметр получают массив вертексов, то даже в таком случае быстрее будет считать в список и по нему сделать массив и переписать туда вертексы. Дело в том, что когда ты делаешь каждый раз выделение памяти с сохранением предыдущих данных, то сначала выделяется новый кусок памяти, потом туда переписываются данные из старого массива, и старый массив уничтожается. Ты прикинь сколько раз он обращается к памяти! Это получится (n^2)/2, где n - количество записей. А если ты сделаешь, как я сказал - сначала запишешь в список, а потом в массив - то получится 2n. Конечно, если решить неравенство:

n*n/2<2n |*2
n*n-4n<0
n(n-4)<0
4>n>0

Вот так, значит когда количество вертексов (0~4), то твой способ более эффективен, в остальных случаях - мой. Я думаю, что количество вертексов у тебя, ну никак не меньше 20.



--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
p0s0l
Дата 21.9.2003, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



На счет SetLength - можно где-нибудь хранить кол-во вертексов, и сделать один раз перед циклом setlength, а в цикле убрать...



--------------------
С уважением, г-н Посол.
PM   Вверх
neutrino
Дата 21.9.2003, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Точно! Например, если фаил типизированный, то (скажем по 32 бит на вертекс) делим его размер на 4 и получаем кол-во вертексов. Тогда это решит проблему. Но опять же файл должен быть типизированный...


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
p0s0l
Дата 21.9.2003, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Вернее лучше делить надо на SizeOf(TVertex):
Код
var f : File of TVertex;
begin
 AssignFile(f, 'zzz');
 Reset(f);
 VertexCount := FileSize(f) div SizeOf(TVertex);
 SetLength(Vertex, VertexCount);
 for i := 0 to VertexCount-1 do
   Read(f, Vertex[i]);
 CloseFile(f);
end;




--------------------
С уважением, г-н Посол.
PM   Вверх
Sniper
Дата 21.9.2003, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Хорошо, а как теперь это изьять из vertex? У меня это было так

var
Triangle: array [0..2] of TVector;

for i := 0 to (VertexCount - 1) div 3 do
begin
Triangle[0] := Vertex[i * 3];
Triangle[1] := Vertex[i * 3 + 1];
Triangle[2] := Vertex[i * 3 + 2];
end;

нужно, чтобы так оно и было как сдесь представлено, а то мне придётся очень много кода заново переписывать!!!! %-(


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
neutrino
Дата 21.9.2003, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Чтo-то тут не то... У тебя что массив треугольника (Triangle) все время перезаписывался? Как-то странно у тебя логика построена...
Да и вообще твой цикл можно записать так:

for i := 0 to VertexCount-1 do Triangle[i mod 3] := Vertex[i];

Но смысла в этом цикле мало.
Скажи, что ты пытаешься сделать и в чем твои затруднения. Не боись твой код никому не продадим. wink.gif


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
p0s0l
Дата 21.9.2003, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



И вообще, если будешь делать типизированный файл, и если у тебя мир и модели представлены только треугольниками, то можно писать/читать сразу треугольниками за один Read/Write - тогда var F : File of TTriangle...
А цикл-то и вправду интересный...



--------------------
С уважением, г-н Посол.
PM   Вверх
Sniper
Дата 21.9.2003, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



Ребята! Вы можете просто ответить на вопрос?
Оптимизировать будем позже! %-)


>>А цикл-то и вправду интересный...
потом выводятся треугольники

glBegin(GL_TRIANGLES);
gltexcoord2d(0,0); glVertex3fv(@Triangle[0]);
gltexcoord2d(2,0); glVertex3fv(@Triangle[1]);
gltexcoord2d(0,2); glVertex3fv(@Triangle[2]);
glEnd;



--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
neutrino
Дата 21.9.2003, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Цикл можно оставить без изменений.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Sniper
Дата 21.9.2003, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

Репутация: нет
Всего: 2



neutrino Наконецто вы меня поняли! %-))))


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.