Текущее время: Ср 27 ноя 2024 6:40

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 339 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 12  След.
Автор Сообщение
 Сообщение Вс 20 янв 2008 1:21
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
2 Шаман
Если Бы ты делал на Delphi, то я бы тебе помог, я какое то время назад очень много его потратив, изучал как сохранить данные, теперь могу сделать структуру файла так как хочу.
А на С++ ни "бум бум".

Шаман писал(а):
А.Г.Р. v.3.0
Зачётно получилось. Я даже не подозревал что такое можно сделать в Экселе.

Добавлено спустя 7 минут 32 секунды:

2 Шаман
Описание алгоритма построения гор есть в этой теме?


 Сообщение Пн 21 янв 2008 1:51
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
ВанёХ писал(а):
Прослеживая работу твоего генератора обнаружил что в расчетном листе изначально все клетки пустые. Может я чего то недопонимаю, но думаю лучше изначатьно значение всех ячеек поставить на 0.
Для Ехселя пустая клетка - всё равно что 0. Нет разницы. :roll:
ВанёХ писал(а):
Иногда замена значений идет в уже отредактированной области, т.е. была цепочка гор высотой в 7, стала одна большая гора высотой в 12.
Да, наложения гор друг на друга - обычное явление. Но я не думаю, что это как-то отрицательно сказывается на результате. Но если одна цепь пытается пересечь другую - она принудительно обрывается (введено ещё с v.2.0).
ВанёХ писал(а):
Совет на будующее - пустые пространства между горами заполнять впадинами, пропастями и руслами рек, чтобы вышел настоящий В.М.
Да, в дальнейшем планирую (если лень не пересилит :smile: ) ввести новую опцию - полную рандомизацию рельефа путём сложения полученной карты гор с рандомной картой (такого же размера), но небольшими перепадами высот. Таким образом, плоские участки будут заполнены. Ну а что касается ручейков, рек и даже озёр - есть кой-какие глобальные задумки насчёт их реалистичной постройки на карте (по тому принципу, как это происходит в природе :wink: ), но это будет не скоро, бо проще сделать вулканы, что я и собираюсь реализовать в версии 4.0, которая пока только в задумках и не далее. :smile:
ВанёХ писал(а):
Ты уже и так все сделал, отсалось заменить положительные значения на отрицательные (если конечно Exel поддерживает отрицательные значения).
:smile: Поверь, нет предела совершенству - было бы желание (пока есть :smile: ). А насчёт отрицательных значений - Ехсель может всё (ну, почти... :roll: ), но зачем отрицательные значения? К тому же на 3D-графике это будет выглядеть также. :roll: Хотя, если в дальнейшем за 0 будет принят уровень моря, т.е. отрицательные значения = подводные территории, то возможно. Но как писал выше - это далеко потом. :yes:
ВанёХ писал(а):
Если ты собираешься воплощать АГР в чем то момощнее екселя, следует продумать такую вещь, как автоматический накладыватель текстур.
Неправильная формулировка задачи. :smile: Цель работы моего А.Г.Р. - только составление цифровой карты высот. Синий убогий 3D-график нужен лишь для того, чтобы визуально контролировать результат. Продукт А.Г.Р.-а - та матрица цисел, что появляется в конце на "Расчётном листе". Возможно, вторым продуком будет также ещё одна карта, хранящая данные не о высотах рельефа, а о его особенностях (в этой точке вода, тут вулкан и т.п.). А о текстурах и др. графических фичах - пусть заботятся разработчики, если, конечно, моя работа достигнет такого уровня, чтобы их заинтересовать, но до этого ещё далеко. :oops:
smt005 писал(а):
А на С++ ни "бум бум".
:shock: Ты ж грозился умениями 3D воротить?! :hm:

smt005 писал(а):
Зачётно получилось.
Но всё равно я нашёл, что улучшить. :smile:
Вот А.Г.Р. v.3.1 (646 kb)
-усовершенствован принцип построения вторичных цепей (раньше все вторичные цепи начинались строго перпендикулярно направлению главной цепи (и сливались), но щас изначально расходятся веером с настраиваемыми характеристиками).

smt005 писал(а):
Описание алгоритма построения гор есть в этой теме?
Нет. Он постоянно совершенствуется и расширяется, но могу расписать текущий принцип его работы.
В версии 2.0, А.Г.Р. строил только главные цепи, поэтому получалось примитивно-однообразно. Сейчас же, от каждой горы главной цепи строятся ещё и несколько "побочных".
Это если в общем и в двух словах. :smile: Ну а если интересен сам технический процесс, то это до-о-ольше. Лень писать, так что отмечу только самые важные моменты.
Что касается основы - постройки отдельной горы (модуль 3, "Rounder"):
1) выбирается точка карты - вершина горы с заданной высотой.
2) для всех точек квадрата, центром которого является вершина горы, просчитывается их высота, в результате чего получаются склоны. Это распишу поподробнее.
-берётся каждая точка квадрата, и высчитывается её радиус (расстояние до центра квадрата, т.е. до вершины будущей горы);
[-если радиус точки слишком велик, то высота для неё просто не просчитывается];
-высота точки зависит от её отдалённости от пика горы и высчитывается по особой сверхсекретной меганавороченной суперформуле, в основе которой лежит функция "косинус". :smile: Меганавороченность этой функции определяется кучей всунутых в неё констант (см. настройки), используемых для укрощения косинуса :smile: . Так уж и быть, открою Вам тайную формулу :smile: , если это что-то даст:
[Высота точки] = (Cos((([Радиус] / [Выс.Ц.Точки]) ^ [ОстротаПика]) / [Полог.Склона] * 3.1416) + 1) * ([Выс.Ц.Точки] / 2)

Что касается ведения цепи гор: сначала определяются характеристики цепи:
-количество гор в цепи,
-пологость гор цепи,
-максимальный угол изменения направления распространения цепи после каждой новой горы;
-координаты первой горы,
-начальное направление распространения цепи.
Высоты гор цепи определяются по не очень навороченной синусоиде (это не очень важно).
Сперва ставится первая гора. Вторая гора ставится в зависимости от начального угла распространения цепи, и после этого угол распространения цепи немного меняется (на рандомный угол из определённого в настройках интервала). И так до конца цепи. Получается извилистая цепь.
Отмечу, что "идеальная высота" горы перед тем, как будет поставлена на карту, корректируется рандомом.

Обращу внимание на некоторые хитрости работы А.Г.Р.:
-если цепь натыкается на другую, она принудительно обрывается (иначе выглядит так, что цепи гор подлезают одна под другую; а кто себе представляет, как образуются горы в природе, поймёт, почему так быть не может :tongue: ).
-значение высоты вводится в ячейку только если превышает её текущее значение.

Вообще, если интересно, то лучше загляните в макросы - там я все действия снабдил понятными пояснениями на нашем языке. :smile: Тем более, я уже сам подзабыл многое, с чего начинал :roll: , да и вообще, слишком долго это всё разжёвывать. :tongue: Короче, не парьтесь - я далеко-о-о не один час парился над всем этим, так что в двух словах доступно всё объяснить не смогу. :no: Но если есть конкретный вопрос - пожалуйста. :yes:
Лучше б с С++ помогли, а не военную тайну раскрыть просили. :wink:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пн 21 янв 2008 10:37
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Шаман писал(а):
Ты ж грозился умениями 3D воротить?!
Я делал по примерам, то что в примерах в принципе всё понатно, за исключением инициализации OpenGL. Зная простейшие функции типа "цикл", если, то, иначе" и т.п., чтото большее типа массивов ещё не зная, не говоря уже о сохранении инфы в файлы.

Добавлено спустя 26 минут 50 секунд:

Шаман писал(а):
Лучше б с С++ помогли, а не военную тайну раскрыть просили.
МОД сделаем, то изучение С++ ускорится.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Пн 21 янв 2008 11:44
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
smt005 писал(а):
не говоря уже о сохранении инфы в файлы.
А я знаю один способ - из текстовых окошек сохранить строки в файл:
RichEdit1->Lines->SaveToFile(...)
:twisted:
Чё т Разум тут давно не светился. Он-то наверняка всё знает и молчит! :mrgreen:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пн 21 янв 2008 12:16
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Ыыыы, одна функция тебе не поможет.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Пн 21 янв 2008 14:53
Профиль  
#105d99
Аватара пользователя
Сообщения: 15233
Откуда: Москва, сектор бетонных домов
Зарегистрирован: Пн 20 фев 2006 3:56
Не знаю как у остальных, а я за 20 минут так и не дождался когда этот А.Г.Р. 3.1 мне чего-нето вычислит. Я, конечно, все понимаю, но с такой производительностью его практическая ценность стремится к нулю.
З.Ы. У меня не Microsoft Office, а OpenOffice.org, но я сильно сомневаюсь, что последний работает медленне и хуже.


 Сообщение Пн 21 янв 2008 16:09
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Razum писал(а):
Не знаю как у остальных....
Кстати, хотелось бы узнать. :yes:
З.Ы.: та карта, что уже стоит по-умолчанию, сделана при тех настройках, что тоже стоят по-умолчанию - подвоха нет, если что. :wink:
Razum писал(а):
Не знаю как у остальных, а я за 20 минут так и не дождался когда этот А.Г.Р. 3.1 мне чего-нето вычислит.
1) Ты настройки не менял?
2) А какое у тя железо? :hm: Я просто по своему компу время мерял - так у мну двухшишковый, 2,8 ГГц, (хотя по странной причине грузиццо проц ровно на 50%, так что я в это время в контру рублюсь попутно - на производительности не сказываеццо :mrgreen: ).
Razum писал(а):
Я, конечно, все понимаю, но с такой производительностью его практическая ценность стремится к нулю.
Потому так и стремлюсь на С++ базу сместить - навороченная Ехселевская работа с базой данных (чтение/запись ячеек) всю производительность и сжирает. Сами расчёты-то там несложные, вроде. :roll:
Razum писал(а):
З.Ы. У меня не Microsoft Office, а OpenOffice.org
Первый раз про такое слышу. :hm:
Ну так, Разум, ты чё-нить по С++ можешь подсказать? :roll:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пн 21 янв 2008 21:28
Профиль  
#105d99
Аватара пользователя
Сообщения: 15233
Откуда: Москва, сектор бетонных домов
Зарегистрирован: Пн 20 фев 2006 3:56
Кароче, Шаман, с Си все предельно просто.
Сначала открываешь файл на запись:
#include <stdio.h> //Подключает библиотеку ввода-вывода.
#include <types.h> //Если скажет, что что-то не объявлено, подключи этот заголовочный файл, а то я точно не помню, нужен ли он.
FILE* stream; //Переменная для указателя потока.
FILE* fopen(const char* filename, const char* mode);
Обращаю твое внимание, что это прототип функции, как его юзать я надеюсь ты знаешь.
Функция возвращает указатель на поток, при помощи него работают все нижеприведенные функции. Если открыть не удалось, возвращает NULL.
Ну, я думаю ты понял, что первый аргумент - имя файла, который ты открываешь.
Если ты собираешься писать в файл, mode ставь "wb". Старое содержимое стирается. b - очень важная буковка под виндами, чтоб не происходило тупости, про которую я писал в "задачках, уравнениях..." тут на форуме. Читать - "rb".
После того, как откроешь, юзай функцию
size_t fwrite(const void* bufer, size_t size, size_t nobj, FILE* stream);
Функция возвращает количество объектов, которое удалось записать. Первый аргумент - УКАЗАТЕЛЬ на данные, которые ты собираешься записывать. Второй аргумент - размер объектов(в байтах, размер можно определить функцией sizeof(имя типа)). Третий - количество объектов, которое надо записать. Последний аргумент - указатель на поток. Тот, который возвращает fopen().
Читать - функцией
size_t fread(void* bufer, size_t size, size_t nobj, FILE* stream);
У ней все аналогично.
После того, как начитался/написался, файл во избежание разнообразных артефактов необходимо закрыть функцией.
int fclose(FILE* stream);
Думаю, после этого у тебя не должно возникнуть вопросов по поводу чтения и записи.


Последний раз редактировалось Razum Вт 22 янв 2008 13:02, всего редактировалось 2 раз(а).

 Сообщение Вт 22 янв 2008 11:56
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
2 Razum: спа-а-асиба, о мудрейший! :mrgreen: :yes: Завтра будо с утреца пробовать. :yes: Надеюсь у тя найдёццо минутка свободного времени, если что? :wink: Ты не будешь против, если я тя немного подонимаю, если возникнут вопросы? А ведь стопудофф возникнут... :roll:

Добавлено спустя 11 часов 18 минут 1 секунду:

ОК, Разум. Вот и невнятки появились. :smile: Допустим, есть у мну некое число (float hpt;) и я хочу записать его в stream. Глянь, как я заполнил всё:
---------------------------
*.h:
#include <stdio>
public:
float hpt; //Это то самое число, что нужно будет потом записать
FILE* stream;
---------------------------
*.cpp:
FILE* fopen(const char* stream, const char* wb);
hpt = '4ht6'; //Ну, сложил значение числа из рандомных байтов
size_t fwrite(hpt, 4, 1, stream);
---------------------------
Во время ритуала священной компиляции выдаёт:
[C++ Error] MainForm.cpp(24): E2293 ) expected
Где я натупил? :sad:

З.Ы.: мой А.Г.Р. во время составления карты может по сто раз перезаписывать одну и ту же точку – есть ли соответствующая функция замены байтов в стриме?

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Вт 22 янв 2008 12:41
Профиль  
Механоид 5 поколения
Аватара пользователя
Сообщения: 1260
Откуда: island Syberia
Зарегистрирован: Ср 10 янв 2007 9:14
надо бы слить да посмотреть, думаю вместе можно решить найти проблему

А у тебя просто скобки нету на 24 строке в MainForm.cpp

Добавлено спустя 36 минут 10 секунд:

И еще бы неплохо исходники увидеть

а то ощущение, будто нету ни #include , ни main()

_________________
_=S.A.L.K.E.R.=_
"Кто кого еще порвет" - сказала Тузику грелка, надутая до 10 атмосфер
"У нас большие леса. Они способны без остатка поглотить любое воинское формирование" (с)


 Сообщение Вт 22 янв 2008 13:12
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Razum & PA3UJIb... :hm: Вот блин...
:mrgreen:
PA3UJIb писал(а):
надо бы слить да посмотреть, думаю вместе можно решить найти проблему
Вот так мне больше нравиццо! :mrgreen:
Вот папка с заготовками: ALG (346 kb).
На форму не смотрите - полный фэйк.
PA3UJIb писал(а):
А у тебя просто скобки нету на 24 строке в MainForm.cpp
Не, ну не такой уж я тупой всётки... :roll:
PA3UJIb писал(а):
И еще бы неплохо исходники увидеть, а то ощущение, будто нету ни #include , ни main()
Сцылко сверху. См. всё. :yes:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Вт 22 янв 2008 13:33
Профиль  
#105d99
Аватара пользователя
Сообщения: 15233
Откуда: Москва, сектор бетонных домов
Зарегистрирован: Пн 20 фев 2006 3:56
Ребят, когда пишите пост с сишными кодами, отключайте в сообщении смайлики, хтмль, и прочую требуху, иначе текст искажается. Я там в своем посте выше инклюды поправил.
Шаман, у тебя вот че неправильно.
Пиши лучше консольное приложение под командную строку, потому что я лично гопотняк этот с формами и прочей виндовой требухой сам не знаю, и если ты им сильно увлечешься, я тебе просто помочь не смогу. А судя по тому, как ты используешь функцию fopen(), помощь тебе очень даже понадобится.
Шаман писал(а):
FILE* fopen(const char* stream, const char* wb);

Это ты так функцию вызываешь??? Я вообще удивляюсь, как оно у тебя не ругается на это. Эту функцию надо вызывать, в твоем случае, примерно так:
stream = fopen("c:\\мего-папка\\мего-файл.txt", "wb");
Причем заместо "c:\\мего-папка\\мего-файл.txt" можно использовать переменную - строку.
Шаман писал(а):
size_t fwrite(hpt, 4, 1, stream);

size_t - это имя возвращаемого типа, возвращаемое значение у этой функции необходимо для контроля ошибок. size_t - целочисленный тип, можешь употреблять заместо него обычный int.
В твоем случае надо так.
int ggg //Переменная для хранения возвращаемого значения. Ну, и для других целей можно использовать.
ggg = fwrite(&hpt, 4, 1, stream);
Обрати внимание на первый аргумент. Конструкция &имя_переменной - это означает взять адрес переменной. Выше я писал, что Первый аргумент этой функции - указатель, адрес то-есть, переменной, а не значение. Ты подставил значение.


 Сообщение Вт 22 янв 2008 15:07
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Razum писал(а):
Это ты так функцию вызываешь???
:oops: Я ж пердуперждал, что С++ с его завернутыми гемороями тока недавно увидел... :oops: После человеческого ежу-понятного Васика... :roll: (зато к чертям-тормозного :evil: ).

З.Ы.: блин, всё-то ты знаешь. Откуда? Не поверю, если скажешь, что самоучка. :no: Я инглишь хорошо знаю, но в том мануале, что с С++ идёт, мало что понимаю. :tongue2:

2 Razum: сущай, а нельзя ли для моей цели использовать "array", т.е. обычную матрицу? Я тока не врубился, как её задать, но, думаю, ты в курсе. :wink: Кстати, а почему ты сразу начал "stream" советовать? :hm:
Razum писал(а):
size_t - это имя возвращаемого типа
Это ты чё щас сказал?.. :oops:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Вт 22 янв 2008 15:17
Профиль  
Механоид 5 поколения
Аватара пользователя
Сообщения: 1260
Откуда: island Syberia
Зарегистрирован: Ср 10 янв 2007 9:14
Полагаю, что разговор о А.Г.Р. давно вышед за рамки исходной темы. Так пусть теперь обсуждать мы будем здесь сие творенье.

----------------------------------------------------------------------------

Цитата:
Это ты так функцию вызываешь???

и правда так вызывать функцию не стоит

да и писать программу лучше уж в блокноте каком-нидь, хотя бы в Notepad++, все ж удобнее. Визуальное оформление для консольного приложения можно и потом создать.

Добавлено спустя 1 минуту 3 секунды:

Есть предложение к модераторам совсем выбившиеся посты с тем про ВМ перетащить сюда

Добавлено спустя 35 минут 41 секунду:

Шаман писал(а):
... С++ с его завернутыми гемороями тока недавно увидел... :oops: После человеческого ежу-понятного Васика...

не с форм надо начинать просто

Шаман писал(а):
... Кстати, а почему ты сразу начал "stream" советовать? :hm:
Razum писал(а):
size_t - это имя возвращаемого типа
Это ты чё щас сказал?.. :oops:


ну елки палки... хоть самый простой самоуч по Си найди в сети - тип возвращаемого результат, все функции в Си чего-то да возвращают.

_________________
_=S.A.L.K.E.R.=_
"Кто кого еще порвет" - сказала Тузику грелка, надутая до 10 атмосфер
"У нас большие леса. Они способны без остатка поглотить любое воинское формирование" (с)


 Сообщение Вт 22 янв 2008 15:18
Профиль  
Механоид 5 поколения
Аватара пользователя
Сообщения: 1260
Откуда: island Syberia
Зарегистрирован: Ср 10 янв 2007 9:14
Шаман, Разум го в новую уже тему, не будем развозить тут не по теме

_________________
_=S.A.L.K.E.R.=_
"Кто кого еще порвет" - сказала Тузику грелка, надутая до 10 атмосфер
"У нас большие леса. Они способны без остатка поглотить любое воинское формирование" (с)


 Сообщение Вт 22 янв 2008 15:21
Профиль  
Ограничитель
Аватара пользователя
Сообщения: 7028
Откуда: От верблюда!
Зарегистрирован: Ср 11 май 2005 9:48
PA3UJIb писал(а):
все функции в Си чего-то да возвращают.

Да и не только в Си :smile:

_________________
Земля, Земля - я Юпитер!
Зарисовка в стиле AIM - https://www.youtube.com/watch?v=JiWtIz9g3Uw


 Сообщение Вт 22 янв 2008 15:55
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Ура, функция записи работает: после закрытия проги, в её корневой папке появляется файл указанного названия с четырьмя байтами. Гы! :twisted:
Такой вопрос: на кой, чисто практически, мне нужна переменная "ggg" при ЗАПИСИ? :hm:
2 Razum: описанная тобой функция записи добавляет байты в конец файла. Но:
Шаман писал(а):
мой А.Г.Р. во время составления карты может по сто раз перезаписывать одну и ту же точку – есть ли соответствующая функция замены байтов в стриме?

? :hm:

Добавлено спустя 1 минуту 25 секунд:

PA3UJIb писал(а):
хоть самый простой самоуч по Си найди в сети
Сцылко не дашь? :hm:

Добавлено спустя 1 минуту 17 секунд:

PA3UJIb писал(а):
хоть самый простой самоуч по Си найди в сети
Сцылко не дашь? :hm:
2 PA3UJIb: перед тем, как скопировать текст из Ноутпада в "Быстрый ответ", отрубай опцию "Word wrap", или лучше в Ворде пиши. :yes:

Добавлено спустя 1 минуту 46 секунд:

Кстати, теперь этому здесь самое место:
А.Г.Р. v.3.1 (646 kb)

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Вт 22 янв 2008 16:16
Профиль  
#105d99
Аватара пользователя
Сообщения: 15233
Откуда: Москва, сектор бетонных домов
Зарегистрирован: Пн 20 фев 2006 3:56
Шаман писал(а):
Такой вопрос: на кой, чисто практически, мне нужна переменная "ggg" при ЗАПИСИ?

Я же вроде написал, что для контроля ошибок. Но на данном этапе твоего знания Си, действительно, можно и не использовать. То-есть просто вызываешь функцию без присваивания.
Шаман писал(а):
мой А.Г.Р. во время составления карты может по сто раз перезаписывать одну и ту же точку – есть ли соответствующая функция замены байтов в стриме?

А вото это очень, очень плохо. Либо придумай алгоритм, которому не надо по стор раз одно и то же перезаписывать, либо есть два решения.
Плохое решение:
Используем функцию int fseek(FILE* stream, long offset, int origin);
Чтобы указать конкретную позицию в файле, куда мы хотим читать или писать. Функция возвращает ненулевое число в случае ошибки. Первый аргумент - поток, второй аргумент - смещение относительно точки отсчета (Вроде в байтах, но точно не помню. ), задаваемой третьим аргументом. Третий аргумент может принимать такие значения:
SEEK_CUR - текущий номер байта.
SEEK_SET - начало файла.
SEEK_END - конец файла.
Например, если ты записал какой-то байт, и хочешь его перезаписать, делай так:
fseek (stream, -1L, SEEK_CUR);// Буква L после числовой константы означает, что ее тип надо интерпретировать как long. Я думаю, ты в курсе, что long - целочисленный тип, в нем от 4 до 8 байтов. Точно не помню.
Хорошее решение:
Создаем заранее матрицу нужного размера (допустим, у нас размер 100 на 200) примерно так:
float ar[100][200];
Первое слово - имя типа, элементы которого мы будем помещать в массив. Дальше имя переменной, содержащей массив(на самом деле она содержит указатель, но это на будущее, когда толково разберешься со всей этой ботвой). В нашем случае имя - ar. Дальше длина массива по каждому измерению. В качестве длины должна быть константа. По крайней мере в Си, в Си++ не знаю, можно или нельзя переменную.
Далее проводим с этой матрицей нужные манипуляции, и в конце просто записываем в цикле ее значения в файл.


 Сообщение Вт 22 янв 2008 19:41
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Razum писал(а):
Хорошее решение:
...
Да-а-а!!! Это и есть то, что требовалось!!! :twisted: :twisted: :twisted:
Ну чё ж ты сразу не сказал-то?! Ведь всё гениальное просто! :wink: Спасибо те огромное! :god: Кстати, а ты не подскажешь сцылко на какой-нить хороший самоучитель по С++? А то чё я тут Вам всем голову морочу, ничё совсем не зная... :oops:
Ну сё. Будо пытаццо двигаццо дальше. :twisted:

Добавлено спустя 2 часа 12 минут 49 секунд:

Такой вопрос: в Visual Basic’е, откуда я собираюсь переписывать код в С++, код делится на «module»'и, т.е. такие как бы автономные участки кода, которые можно запускать функцией «Application.Run("…")». Как такое можно провернуть в С++? Есть ли аналог? Я могу, конечно, вместо этих кодо-функцио-замен тупо вписать необходимый участок кода, но это:
1) существенно увеличит размер кода;
2) при введении в код изменений придётся проделывать дополнительную работу по изменении кучи одинаковых участков, что нерационально и багогенно.
Му? :roll:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Вт 22 янв 2008 20:28
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Цитата:
Кстати, а ты не подскажешь сцылко на какой-нить хороший самоучитель по С++?
http://forum.skyriver.ru/viewtopic.php?t=3242
Правда может не для новичков любителей.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Вт 22 янв 2008 20:34
Профиль  
Механоид 5 поколения
Аватара пользователя
Сообщения: 1260
Откуда: island Syberia
Зарегистрирован: Ср 10 янв 2007 9:14
канеш есть
знач формат следующий:
<_> иМя_фУнКцИи(<список формальных парметров>) {<тело функции>}

смотрел код в Экселе - у тебя там процедуры, в Си отсутствует такая штука, но это всегда легко обходится: процедура - это функция, которая ничего не возвращает.
"Но ведь в Си каждая функция что-либо обязана возвращать"
А мы тип возвращаемого ей результата присвоим void.
пример:

void ManyLineBuilder(){
[nbsp]float MainHillN;
[nbsp]MainHillN = MainHillNMin + random(MainHillNDelta)/2;
[nbsp]for(i=0;i<MainHillN;i++)
[nbsp][nbsp]LineBuilder();
}

в таком случае надобность в операторе return отпадает

_________________
_=S.A.L.K.E.R.=_
"Кто кого еще порвет" - сказала Тузику грелка, надутая до 10 атмосфер
"У нас большие леса. Они способны без остатка поглотить любое воинское формирование" (с)


 Сообщение Вт 22 янв 2008 20:37
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Я уже наверно не в теме, слишком много букав понипечатали за последнее время.
Цитата:
придумай алгоритм, которому не надо по стор раз одно и то же перезаписывать
Сделать так, в начале всю "матрицу" сделать со значениями 0 или меньше0 (-1, -2 и т.д.). Потом когда заполняется "ячейка" значениями больше 0, если 0 то значит туда ещё на записывали и можно записывать значение. Если > 0 значит уже была запись и отменить перезаписьл значения.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Вт 22 янв 2008 23:40
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
smt005 писал(а):
Я уже наверно не в теме, слишком много букав понипечатали за последнее время.
Ну, относительно давания мне наставлений по освоению кода С++ - Разумы активно помогают, за что им большое спасибо. :wink: А насчёт 3D-вида полученной карты - помнишь, ты говорил, что можешь с этим как-нить справиццо? :roll: :yes: Тут будь локомотивом ты. :smile: Думаю, уже на 100% определён "формат" цифровой карты - это будет матрица:
float hmap[...][...];
Размеры: думаю, от 1000х1000 (для начала) до 16000х16000 (требуемый размер, т.е. 1 Гиг).
ИМХО, нужно, чтобы на отображение в 3D бралась не вся карта, а лишь её часть. На выбор. К примеру, какой-нить кусок 500х500. Поскольку надобность в 3D - лишь для чернового визуального контроля полученного результата, то никаких наворотов не нужно, даже текстур. Будет, конечно, классно, если ты сможешь замутить возможность вертеть этот кусок карты, чтобы можно было осматривать полученный результат со всех сторон, но это уже "опшинал". Сделай, как сможешь. Кстати, очень важна производительность, т.к. желательно, чтобы отображаемый кусок карты был максимально-большого размера, чтобы иметь наиболее полную, глобальную картину.
Смогёшь? :yes:
-------------------------------------------------------------------------------------
2 PA3UJIb: а конкретнее - в какой лист что писать?
И вот ешо шо: есть в моём Васиковском коде много "глобальных" переменных, которыми пользуются все модули, каждый из них эти переменные может изменять, что влияет и на другие модули, использующие эти переменные. Такой вопрос: нужно ли писать ВСЕ эти переменные в список аргументов "функции"? Это ж о-о-очень много получиццо бороды. :ooo:
Му? :hm:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Ср 23 янв 2008 0:04
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Цитата:
Смогёшь?
Зависит от сроков.
Сейчас даже на мод чтото времени не хватает, не то что на С++.

Добавлено спустя 3 минуты 18 секунд:

http://pmg.org.ru/nehe/index.html

Вот здесь хорошие примеры.

Добавлено спустя 2 минуты 43 секунды:

И можно скачать исходники.

Добавлено спустя 11 минут 30 секунд:

2 Шаман, загляни сюда.

http://pmg.org.ru/basic3d/land.htm

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Ср 23 янв 2008 7:24
Профиль  
Механоид 5 поколения
Аватара пользователя
Сообщения: 1260
Откуда: island Syberia
Зарегистрирован: Ср 10 янв 2007 9:14
Шаман писал(а):
нужно ли писать ВСЕ эти переменные в список аргументов "функции"

конечно же не надо все писать в список аргументов
большая часть их будет глобальными
но вот есть у тебя там такая штука как Rounder, так перед ней ты постоянно выполнял присваивание
правильнее будет сделать так:
[nbsp]обьявляешь функцию
[nbsp]void Rounder(const int r, const int c, const float s, const float h) {
[nbsp][nbsp]int r1, c2;
[nbsp][nbsp]int minr, maxr, minc, maxc;
[nbsp][nbsp]float minmaxrc, radius, i;

[nbsp][nbsp]minmaxrc = 1 + h*(exp((1/ConstPikeS)*ln(s)));
[nbsp][nbsp]if (r-minmaxrc < 1) minr = 1 - r; else minr = 0 - minmaxrc;
[nbsp][nbsp]if (r+minmaxrc > 254) maxr = 254 - r; else maxr = minmaxrc;
[nbsp][nbsp]if (c-minmaxrc < 1) minc = 1 - c; else minc = 0 - minmaxrc;
[nbsp][nbsp]if (c+minmaxrc > 254) maxc = 254 - r; else maxc = minmaxrc;

[nbsp][nbsp]for (r1=minr; r1<maxr; r1++)
[nbsp][nbsp][nbsp]for (c2=minc; c2<maxc; c2++) {
[nbsp][nbsp][nbsp][nbsp]radius = (r1*r1 + c2*c2)*(r1*r1 + c2*c2);
[nbsp][nbsp][nbsp][nbsp]if (radius > (h*(exp((1/ConstPikeS)*ln(s)))))
[nbsp][nbsp][nbsp][nbsp][nbsp]i = 0;
[nbsp][nbsp][nbsp][nbsp]else
[nbsp][nbsp][nbsp][nbsp][nbsp]i = h/2*(cos(Pi/s*(exp(ConstPikeS*ln(radius/h)))) + 1)
[nbsp][nbsp]}
}

[nbsp]потом просто там где надо использовать пишешь:
[nbsp]Rounder(rmainint, cmainint, smain, hmain);

и оно будет работать...

P.S.
...по идее
P.P.S.
Razum, надеюсь, меня поправит если что :roll:

_________________
_=S.A.L.K.E.R.=_
"Кто кого еще порвет" - сказала Тузику грелка, надутая до 10 атмосфер
"У нас большие леса. Они способны без остатка поглотить любое воинское формирование" (с)


 Сообщение Ср 23 янв 2008 11:29
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
2 PA3UJIb: тест-прогон твоего метода провалилсё: изменённые функциЕЙ переменные видятся таковыми только в пределах этой функции, а весь остальной код воспринимает эти переменные так, будто они не были изменены функцией.
Ну, вот, смотри, как я проверял:
-------------------------
*.h:
public:
int a; //Объявляю первую переменную
int b; //Объявляю вторую переменную
-------------------------
*.cpp:
void Rounder(a, b){
a = a * 2;
b = b * 3;
}

---Событие "инициализация"---
a = 1; //Присваиваю переменной "а" начальное значение "1"
b = 1; //Присваиваю переменной "b" начальное значение "1"

---Событие "нажатие единственной тестовой кнопки на форме"---
Rounder(a, b) //По идее, после запуска этой "функции", значения переменных "а" и "b" должны были стать 2 и 3, соответственно
Label1->Caption = IntToStr(a); //отображает значение переменной "а"
Label2->Caption = IntToStr(b); //отображает значение переменной "b"
}
-------------------------
Но в результате, сколько я кнопку не тыкал, на обоих Лабелях отображались первоначально-заданные значения этих двух переменных, т.е. "1" и "1". Так что: :tongue2:
:sad:
З.Ы.: Сущ, а ты прежде чем этот способ предложить, сам его потестал? У тя получилось? :hm:
З.З.Ы.: чтоб понятнее было, что требуется: вызванная "функция", или процесс (не знаю, как надо обозвать это явление :smile: ) не должна ничего возвращать - она должна при своей работе лишь иизменить уже имеющиеся в коде переменные и всё. Т.е. должна быть просто участком кода, который прогоняется много раз "по заказам" из любого места основного кода. Вот, что, ИМХО, представляет из себя макросы Васика, и что требуется мене для рациональной адаптации его кода под С++. :yes:


 Сообщение Ср 23 янв 2008 11:54
Профиль  
Механоид 5 поколения
Аватара пользователя
Сообщения: 1260
Откуда: island Syberia
Зарегистрирован: Ср 10 янв 2007 9:14
если надо чтобы значения переменных менялось после выполения функции, то в обьявлении функции надо заменить const на var

_________________
_=S.A.L.K.E.R.=_
"Кто кого еще порвет" - сказала Тузику грелка, надутая до 10 атмосфер
"У нас большие леса. Они способны без остатка поглотить любое воинское формирование" (с)


 Сообщение Ср 23 янв 2008 12:14
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Ребят, мне кажеццо, что в С++ аналог ботвы с модулями должон выглядеть примерно так:

---какое-то название, заголовок, или ешо шо-то---(тут чё-нить)
{
...
код
...
}

А чтоб запустить код, аттачнутый к этой бороде с названием, наверное, есть соответствующая функция, к примеру, возможно, Run("---название вышеописанной ботвы---").
Есть что-нить подобное, а? :sad:

Добавлено спустя 1 минуту 45 секунд:

PA3UJIb писал(а):
5:24
PA3UJIb писал(а):
9:54
[offtop] :shock: А спишь ты когда? Завязал? :laugh: [/offtop]

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Ср 23 янв 2008 12:22
Профиль  
Механоид 5 поколения
Аватара пользователя
Сообщения: 1260
Откуда: island Syberia
Зарегистрирован: Ср 10 янв 2007 9:14
так-с...
закончил переписывать алгоритм из VB в блокнотеГ, ща попробуем-с его переиначить на Си.
Не факт что получиться сразу :)

[offtop]я сплю ночью, только вот ночь с этой стороны земного шара немного в другое время[/offtop]

_________________
_=S.A.L.K.E.R.=_
"Кто кого еще порвет" - сказала Тузику грелка, надутая до 10 атмосфер
"У нас большие леса. Они способны без остатка поглотить любое воинское формирование" (с)


 Сообщение Ср 23 янв 2008 12:49
Профиль  
#105d99
Аватара пользователя
Сообщения: 15233
Откуда: Москва, сектор бетонных домов
Зарегистрирован: Пн 20 фев 2006 3:56
Цитата:
void Rounder(const int r, const int c, const float s, const float h)

Ну ясен пень, что переменные не изменятся, ведь все переменные в Си передаются по значению.
Про var я не знаю, это в паскале, помню было, в Си такого нет, может, если тока в С++. А вот если заместо переменной передавать ее адрес, то все точно получится. То-есть заместо
const int r, например, пишем int * r. А потом заместо обращения r пишем *r. А передаем в функцию переменные, добавляя &.
В Си аналог с модулями есть, и делается примерно так.
Пишешь модуль, весь его код разбиваешь на функции, внешние для этого модуля переменные объявляются с ключевым словом extern, переменные, которые будут использоваться в других модулях объявляешь с ключевым словом public.
Можешь написать заголовочные файлы для каждого модуля с прототипами функций.
НО ЛУЧШЕ ВСЕГО, в нашем случае, НЕ ВЫПЕНДРИВАТЬСЯ, а писать все в одном модуле, и БЕЗ ФОРМ, а под командную строку!


Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 339 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 12  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB