| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > динмические типы |
| Автор: stalkerok 11.12.2008, 11:11 | ||||
| Добрый день! как в Delphi передать тип данных в процедуре, например: есть несколько типов
Как в процедуре передать тип?
|
| Автор: MetalFan 11.12.2008, 13:19 |
| вижу несколько вариантов: 1. Простой - Написать 3 перегруженных процедуры, каждая из которых работает со своим типом. 2. Более сложный - усложнить структуру. ввести поле "тип данных" и поле-указатель на сами данные, а в процедуре уже разбираться, что пришло. 3. Отказаться от записей и процедур и перейти на ООП. |
| Автор: bems 11.12.2008, 13:34 |
| 4. Перейти на D2009 и использовать дженерики |
| Автор: MetalFan 11.12.2008, 13:42 |
а с дженериками как бы решение выглядело? я просто еще "не перешел" и "не использовал" ))) |
| Автор: stalkerok 11.12.2008, 14:19 |
| bems я на 2009, да действительно как бы это выглядело? |
| Автор: bems 11.12.2008, 15:28 | ||||||
| ну это зависит от того, что именно нужно ))) например что-то такое
Глобальные переменные тут только потому что у топикстартера это процедура с одним параметром (типом). А вообще можно и что-то такое
ну и ниже в коде как-то так:
|
| Автор: stalkerok 12.12.2008, 00:45 | ||||||
| разбирался... так и не получается... я хочу написать процедуру сохранения масивов в файл с разными типами типы
а вот процедура
и затем просто вызывать её
|
| Автор: stalkerok 12.12.2008, 12:55 |
| Может поможет кто. |
| Автор: elvis79 12.12.2008, 15:19 | ||||
| Array -- это массив записей (array of DotRec, array of LinkRec, array of NameGridRec) Если я правильно понял, то я б организовал через TObjectList. А также создал предка с виртуальными методами и от него породил бы DotRec, LinkRec и NameGridRec. Реализация методов была в каждом предке своя
Реализация
если заинтересует пиши, помогу |
| Автор: stalkerok 14.12.2008, 20:57 |
| elvis79 Спасибо! Насколько я понял всё равно придётся писать для каждого типа данных свою процедуру и эти процедуры будут одинаковые(в моём случае с сохранением массива в файл) а отличаться будут в процедурах только тип используемых переменных, а если типов данных 10 то писать 10 одинаковых процедур? Но если использовать дженерики, там только написать одну процедуру, при вызове которой передавать тип данных? заранее Спасибо! |
| Автор: NewDima 15.12.2008, 08:03 | ||||||||
ну и сумбур
звать так:
такой процедуре корми что захочешь, Но мой тебе совет, не используй эти функции:
большие структуры будут долго писаться (пишутся то по байтам), используй CreateFile, WriteFile
как вишь, никакого цикла, скорость большая, но есть ограничение записываемого буфера. использование даже изменять не надо |
| Автор: MetalFan 15.12.2008, 11:41 |
почему? обоснуй! |
| Автор: NewDima 15.12.2008, 16:11 |
| я дальше код привел, еще раз вставить?=) найди пять различий а вообще, гибкость и расширенные возможности |
| Автор: MetalFan 16.12.2008, 13:39 |
| NewDima, не вижу преимущества в приведенном коде. кто виноват, что ты объявил типизированный файл в первом варианте? |
| Автор: NewDima 16.12.2008, 15:41 | ||
с типизацией файла начал топикстартер.
рады? Я сторонник WinAPI и его гибкости; |
| Автор: stalkerok 16.12.2008, 20:40 |
| NewDima СПАСИБО!!! то что надо! а как же читать из такого файла? может Поможете дописать эту функцию? и для чего нужен Randomize;? |
| Автор: stalkerok 17.12.2008, 01:38 | ||
Пробовал так:
но не получается... |
| Автор: NewDima 17.12.2008, 07:42 | ||
| лови Добавлено через 5 минут и 32 секунды
|
| Автор: stalkerok 17.12.2008, 11:22 | ||||||
| NewDima Спасибо! только не пойму почему то не правильно работает. например сохранил массив длиной 4, а затем при загрузке этого массива его длина = 3876... причем файл всего 4 байта...
вызываю
а если сохранять массив из типа:
вообще вылетает с ошибкой... |
| Автор: MetalFan 17.12.2008, 11:43 |
| читай про статические и динамические массивы. в твоем случае тебе надо передать указатель не на переменную-массив, а на первый элемент массива в эти функции так же неплохо сохранить длину массива, например, в начале файла. |
| Автор: stalkerok 17.12.2008, 12:42 |
| MetalFan не понял это как подскажите пожалуйста. |
| Автор: NewDima 17.12.2008, 15:32 | ||||
не
Добавлено @ 15:39 да, как сказал MetalFan, читай теорию и в следующий раз, если хочешь чему-то научиться, то лучше спрашивай не "как?", а "вот так правильно?" и приводи свои додумки, а мы объясним, что правильно и не правильно и почему. Иначе все, что тебе здесь говорят ты забудешь через неделю |
| Автор: stalkerok 17.12.2008, 16:05 | ||||||||
Спасибо Вам, но так и не получается, хотя сделал всё как Вы подсказали:
использование
но, например при сохранении:
загружается
Возможно файл сохраняется не полностью? ведь например вышеприведённый файл занимает 4байта, не мало? |
| Автор: NewDima 17.12.2008, 16:48 | ||||
кидай свой код в аттаче, посмотрю, скажу, что неправильно Добавлено через 8 минут и 4 секунды ой -йой сразу твой код не глянул. Я тебе так скажу: учи основы! и заодно узнай, сколько байт в целом числе, потом поймешь, сколько весит твоя структура, а потом умножишь на размер массива и поймешь, сколько он на самом деле места занимает. Нет слов, одни эмоции никому вот это не показывай:
|
| Автор: stalkerok 17.12.2008, 17:27 |
| NewDima СПАСИБО! |
| Автор: NewDima 17.12.2008, 17:37 |
| пометь тему решеной, так принято |