|
|
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Имеется тип данных (структура). Имею массив из 4 элементов этого самого типа. Я могу создать переменную (одну!), с типом этого самого массива? То есть сделать нечто вроде вот: My_structura str[4] //объявляю массив str[4] as newVariable //объявляю эту самую переменную (не знаю как сделать это:) ) myFunction(newVariable) //использую переменную в функци, а именно заполняю её данными. Просьба сильно не пинать:) И спасибо за ответ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 10:08 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Mix str[4] as newVariable //объявляю эту самую переменную (не знаю как сделать это:) ) Сделать структуру My_super_structura , с полем str[4] типа My_structura ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 10:16 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
А если просто передать массив в функцию - это положение не спасет ? Типа function integer my_func (string ar_col[]). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 10:34 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
В тои то и дело, что массив я запихивал, но безуспешно. Создание новой структуры не помогает, ибо наверно ф-я ждёт переменной типа my_structura и матерится на переменную другого типа. Это я тоже попробовал :) It's no use...:( Дело в том, что в другой программе нужная мне ф-я используется именно каким-то таким хитрым образом (написана прога на дельфях), что вместо 1-й переменной одним махом передаётся 4 причём нужного типа! Вот и думаю, есть ли альтернатива на PB... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 10:57 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
MixДело в том, что в другой программе нужная мне ф-я используется именно каким-то таким хитрым образом (написана прога на дельфях), что вместо 1-й переменной одним махом передаётся 4 причём нужного типа! А нормально объяснить что нужно слабо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 11:08 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Локшин МаркА нормально объяснить что нужно слабо? Марк прав. Медиумы и экстрасенсы посещают другой форум. 2Mix В крайнем случае приведите прототип той впечалившей вас функции на дельфях... ...И обращение к ней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 11:17 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Попробую вот так: имеется код на Дельфи: CasStatus = packed record Status : char; CasID : packed array[0..7] of char; CurCode : packed array[0..3] of char; RelDate : Cardinal; Value : Cardinal; Len : Cardinal; Tolerance : Cardinal; CurNumber : Cardinal; NumberInDevice : Cardinal; LowLevel : Cardinal; LastDisp : Cardinal; LastRej : Cardinal; end; TCassetteStatuses = packed array [0..4] of CasStatus; function GetCassettesStatus (var CasStatus : TCassetteStatuses) : Cardinal; stdcall; external 'lib.dll'; CasStatus : TCassetteStatuses; Status := GetCassettesStatus(CasStatus); Как сделать аналогию на PB ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 11:56 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
От 0 до 4 - это 5. var - это означает по ссылке. Можно передавать как массив. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 12:09 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Локшин МаркОт 0 до 4 - это 5. var - это означает по ссылке. Можно передавать как массив. That's it ! И если не получится, то обратить внимание на выравнивание значений (byte,integer,long и т.д.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 12:41 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Пара вопросов: 1) как вы описали ф-цию на pb? 2)Что конкретно означает следующая фраза. авторВ тои то и дело, что массив я запихивал, но безуспешно. ИМНО, я-бы начал решение проблемы со следующего: Создал fake функцию с тем-же прототипом, печатающую дамп переданных параметров. Если шаманство с массивом стуктур не прокатит (а это возможно), ИМНО придётся передавать blob (укладывать побайтово ручками) или писать переходничок на тех-же дельфях. На какой версии билдера ваяете? Ну и естественно есть смысл подождать "наше всё", Филиппа. Не даром у него контора "Delphi Technology" называется, он должОн знать как передать PB структуру в Delphi packed record... ...Может быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 12:45 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Ну, по поводу переменных, ссылки и пр. я в курсе. Приводил только для примера. Как это делал я: global type cas_status from structure string status string cas_id string cur_code long rel_date long value long len long tolerance long cur_number long number_in_device long low_level long last_disp long last_rej end type FUNCTION long ek_casStatus (ref cas_status casSTS) LIBRARY "lib.dll" alias for "lib_function" cas_status sts[5] ek_casStatus(sts[5]) После этого выдаётся ошибка: "Bad runtime function reference at line ....." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 13:35 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Ну до настоящих проблем вы ещё не добрались. Поправте прототип и вперед... Вы передаёте массив а ожидаете одну структуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 13:45 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Попытался поправить - безрезультатно. Может напишите синтаксис, а то я вдруг не то что-то натворил :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 14:16 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Ну, для начала по объявлению: global type cas_status from structure string status //должно быть char string cas_id //Должно быть char[8] string cur_code // Должно быть char[4] long rel_date long value long len long tolerance long cur_number long number_in_device long low_level long last_disp long last_rej end type Packed record в Delphi означает, что все элементы структуры расположены подряд. Поэтому надо соблюдать размеры полей (в байтах). Описание функции: FUNCTION long ek_casStatus (ref cas_status casSTS[5]) LIBRARY "lib.dll" alias for "lib_function" Вызов: cas_status sts[5] ek_casStatus(sts[5]) Попробуй так, ИМХО, должно прокатить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 16:00 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Каким образом в структуре чётко указать размер переменной? И вызов идёт только во так: FUNCTION long ek_casStatus (ref cas_status casSTS[5]) LIBRARY "lib.dll" alias for "lib_function" Вызов: cas_status sts[5] ek_casStatus(sts[]) Если будет ek_casStatus(sts[5]), то вываливается ошибка "Type of actual parameter cannot be ancestor of format reference parameter type". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 17:09 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Замечания gerss по структуре абсолютно справедливы. Object pascal referenceBy default, the values in a structured type are aligned on word or double-word boundaries for faster access. When you declare a structured type, you can include the reserved word packed to implement compressed data storage. For example, type TNumbers = packed array[1..100] of Real; Using packed slows data access and, in the case of a character array, affects type compatibility. В вашей власти пересобрать dll без "packed" если что? Прототип ИМХО надо написать так: FUNCTION long ek_casStatus (ref cas_status casSTS[]) LIBRARY "lib.dll" alias for "lib_function" А вызов так: cas_status sts[5] //some processing ek_casStatus(sts) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 17:28 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
MIx Каким образом в структуре чётко указать размер переменной? А таким, что не испоьзовать параметров с неопределенной длиной, например string. String устроен таким образом, что всегда неявно идет по ссылке, а не по значению и может быть переменной длины. Если же указать char[n], то размер этого поля будет точно n байт. Таким образом, смотришь объявление record в Delphi, находишь размер всех полей и создаешь структуру PB, подбирая типы полей по размеру (в байтах), соответственно со структурой в delphi. Примеры: byte -> byte (или char) int -> long (да-да, в Delphi int - 32 разряда) ну и так далее. Все массивы - однозначно в массивы, то есть char[n] -> char[n], и ни в коем случае не строка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 17:33 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Mix... Если будет ek_casStatus(sts[5]), то вываливается ошибка "Type of actual parameter cannot be ancestor of format reference parameter type".Не путайте теплое с мягким - sts[5] - это пятый элемент массива, а надо передать массив, т.е. именно так Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2004, 20:21 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
to PL99: Я понимаю это. Пытался и таким образом: на этапе компиляции ошибок-то не возникало, но в самой программе вываливалась: "Bad runtime reference error ....." to Q: Пересобрать dll увы не в моих силах. Она предоставлена разработчиком железки, которую собсно и надо подключить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2004, 09:32 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Кстати, можно попробовать написать dll на том же Delphi; в ней создать функцию, которая будет принимать необходимые параметры в формате, более понятном PB, чем массив структур, выполнять необходимые действия и выдавать обратно в программу на PB только нужные данные опять-таки в формате, понятном PB. ИМХО, при использовании структур внешних функций, многое в них для конкретной задачи оказывается ненужным, поэтому промежуточная dll сильно облегчает жизнь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2004, 10:22 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Имеем: global type cas_status from structure character status character cas_id[8] character cur_code[4] long rel_date long value long len long tolerance long cur_number long number_in_device long low_level long last_disp long last_rej end type FUNCTION long ek_casStatus (ref cas_status casSTS[5]) LIBRARY "lib.dll" alias for "lib_function" cas_status sts[5] ek_casStatus(sts) И всё равно вываливается "Bad runtime function reference....." Ставлю вызов ф-и как ek_casStatus(sts[]) - та же фигня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2004, 10:48 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
2Mix Мне кажется, вы начинаете подбираться к сути (с помощью комьюнити). Судя по всему, вы нарвались на проблемы с выравниванием. Идея gerrs (написать thunk на дельфях) имхо оптимальна по цене - качеству... Альтернативой является побайтовое укладывание данных ручками в blob c соблюдением всех правил принимающей стороны. Но это только в крайнем случае. Других вариантов для pb я не знаю (нет у него утверждения #pragma). С удовольствием бы узнал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2004, 10:58 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
QМне кажется, вы начинаете подбираться к сути (с помощью комьюнити). Судя по всему, вы нарвались на проблемы с выравниванием. Никаких проблем с выравниванием здесь быть не должно. packed как раз предотвращает выравнивание. 2Mix Читаем внимательно - Bad runtime function reference - PB не может вообще вызвать эту функцию. Попробуйте поставить BreakPoint на вызов этой вашей lib_function и посмотрите, доходит ли до него дело. Может быть библиотека не там где надо лежит, точно ли эта функция так называется? Почему у вас написано Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2004, 12:00 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
ТЛЯ!!!! А ведь всё банально:) Уважаемые господа. Приношу свои глубокие извинения. Ошибка была вот в чём: При описании библиотеки разработчиком железки была допущена ошибка в названии функции. Понятно, что вызвать её я и не мог (ошибка bad runtime FUNCTION error REFERENCE явно указывала на то, что ошибка идёт при ВЫЗОВЕ функции, а не на этапе передачи переменных). Обнаружить ошибку смог только анализируя остатки кода проги на Дельфях (реально, только остатки:) ) и там-то я и заметил ошибку. Большое спасибо всем, кто откликнулся на тред: узнал немало интересной информации. И ещё раз прошу извинить меня. PS: поломку телефизора надо всё-таки искать от розетки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2004, 12:02 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Да... Двойка. При ошибках передачи данных никаких сообщений не было-бы.. Элементарно - Dr. Watson. И на эту ошибку сам сколько раз нарывался... 2 Марк Локшин. О выравнивании... Мне почему-то казазось, что Win32 требует выравнивания по словам (4 байта), я не прав? PB передаёт API структуры без проблем... Исходя из этого я ожидал проблем с packed. Какое (какие) из преведенных соображений неверно (неверны)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2004, 12:56 |
|
||
|
Вопрос по объявлению переменной
|
|||
|---|---|---|---|
|
#18+
Пояснения: 1) Двойка мне (уже две). 2) Имелся ввиду DOUBLE word. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2004, 13:00 |
|
||
|
|

start [/forum/topic.php?all=1&fid=15&tid=1338889]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 380ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...