powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Вопрос по объявлению переменной
25 сообщений из 27, страница 1 из 2
Вопрос по объявлению переменной
    #32688897
Фотография Mix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется тип данных (структура).
Имею массив из 4 элементов этого самого типа.
Я могу создать переменную (одну!), с типом этого самого массива?

То есть сделать нечто вроде вот:

My_structura str[4] //объявляю массив

str[4] as newVariable //объявляю эту самую переменную (не знаю как сделать это:) )

myFunction(newVariable) //использую переменную в функци, а именно заполняю её данными.


Просьба сильно не пинать:)
И спасибо за ответ!
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32688932
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mix str[4] as newVariable //объявляю эту самую переменную (не знаю как сделать это:) )
Сделать структуру My_super_structura , с полем str[4] типа My_structura
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32688985
gal20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если просто передать массив в функцию - это положение не спасет ?
Типа function integer my_func (string ar_col[]).
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32689078
Фотография Mix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В тои то и дело, что массив я запихивал, но безуспешно.

Создание новой структуры не помогает, ибо наверно ф-я ждёт переменной типа my_structura и матерится на переменную другого типа. Это я тоже попробовал :) It's no use...:(

Дело в том, что в другой программе нужная мне ф-я используется именно каким-то таким хитрым образом (написана прога на дельфях), что вместо 1-й переменной одним махом передаётся 4 причём нужного типа!

Вот и думаю, есть ли альтернатива на PB...
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32689107
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MixДело в том, что в другой программе нужная мне ф-я используется именно каким-то таким хитрым образом (написана прога на дельфях), что вместо 1-й переменной одним махом передаётся 4 причём нужного типа!
А нормально объяснить что нужно слабо?
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32689129
Q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Q
Гость
Локшин МаркА нормально объяснить что нужно слабо?
Марк прав. Медиумы и экстрасенсы посещают другой форум.
2Mix
В крайнем случае приведите прототип той впечалившей вас функции на дельфях... ...И обращение к ней.
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32689261
Фотография Mix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую вот так:

имеется код на Дельфи:

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 ?
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32689318
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От 0 до 4 - это 5. var - это означает по ссылке. Можно передавать как массив.
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32689434
gal20
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркОт 0 до 4 - это 5. var - это означает по ссылке. Можно передавать как массив.
That's it !
И если не получится, то обратить внимание на выравнивание значений (byte,integer,long и т.д.)
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32689451
Q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Q
Гость
Пара вопросов:
1) как вы описали ф-цию на pb?
2)Что конкретно означает следующая фраза. авторВ тои то и дело, что массив я запихивал, но безуспешно.
ИМНО, я-бы начал решение проблемы со следующего: Создал fake функцию с тем-же прототипом, печатающую дамп переданных параметров. Если шаманство с массивом стуктур не прокатит (а это возможно), ИМНО придётся передавать blob (укладывать побайтово ручками) или писать переходничок на тех-же дельфях. На какой версии билдера ваяете? Ну и естественно есть смысл подождать "наше всё", Филиппа. Не даром у него контора "Delphi Technology" называется, он должОн знать как передать PB структуру в Delphi packed record... ...Может быть.
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32689598
Фотография Mix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, по поводу переменных, ссылки и пр. я в курсе. Приводил только для примера.

Как это делал я:

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 ....."
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32689625
Q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Q
Гость
Ну до настоящих проблем вы ещё не добрались. Поправте прототип и вперед...
Вы передаёте массив а ожидаете одну структуру.
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32689705
Фотография Mix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попытался поправить - безрезультатно.

Может напишите синтаксис, а то я вдруг не то что-то натворил :)
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32690002
gerss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, для начала по объявлению:
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])

Попробуй так, ИМХО, должно прокатить...
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32690198
Фотография Mix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каким образом в структуре чётко указать размер переменной?

И вызов идёт только во так:

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".
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32690234
Q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Q
Гость
Замечания 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)
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32690247
gerss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MIx
Каким образом в структуре чётко указать размер переменной?


А таким, что не испоьзовать параметров с неопределенной длиной, например string. String устроен таким образом, что всегда неявно идет по ссылке, а не по значению и может быть переменной длины. Если же указать char[n], то размер этого поля будет точно n байт.

Таким образом, смотришь объявление record в Delphi, находишь размер всех полей и создаешь структуру PB, подбирая типы полей по размеру (в байтах), соответственно со структурой в delphi. Примеры:

byte -> byte (или char)
int -> long (да-да, в Delphi int - 32 разряда)

ну и так далее. Все массивы - однозначно в массивы, то есть char[n] -> char[n], и ни в коем случае не строка.
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32690450
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mix...
Если будет ek_casStatus(sts[5]), то вываливается ошибка "Type of actual parameter cannot be ancestor of format reference parameter type".Не путайте теплое с мягким - sts[5] - это пятый элемент массива, а надо передать массив, т.е. именно так
Код: plaintext
ek_casStatus(sts[])
или так
Код: plaintext
ek_casStatus(sts)
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32691208
Фотография Mix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to PL99:

Я понимаю это. Пытался и таким образом: на этапе компиляции ошибок-то не возникало, но в самой программе вываливалась: "Bad runtime reference error ....."

to Q:
Пересобрать dll увы не в моих силах. Она предоставлена разработчиком железки, которую собсно и надо подключить.
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32691266
gerss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, можно попробовать написать dll на том же Delphi; в ней создать функцию, которая будет принимать необходимые параметры в формате, более понятном PB, чем массив структур, выполнять необходимые действия и выдавать обратно в программу на PB только нужные данные опять-таки в формате, понятном PB.

ИМХО, при использовании структур внешних функций, многое в них для конкретной задачи оказывается ненужным, поэтому промежуточная dll сильно облегчает жизнь.
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32691322
Фотография Mix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеем:
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[]) - та же фигня.
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32691346
Q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Q
Гость
2Mix

Мне кажется, вы начинаете подбираться к сути (с помощью комьюнити). Судя по всему, вы нарвались на проблемы с выравниванием. Идея gerrs (написать thunk на дельфях) имхо оптимальна по цене - качеству... Альтернативой является побайтовое укладывание данных ручками в blob c соблюдением всех правил принимающей стороны. Но это только в крайнем случае. Других вариантов для pb я не знаю (нет у него утверждения #pragma). С удовольствием бы узнал...
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32691495
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
QМне кажется, вы начинаете подбираться к сути (с помощью комьюнити). Судя по всему, вы нарвались на проблемы с выравниванием.
Никаких проблем с выравниванием здесь быть не должно. packed как раз предотвращает выравнивание.
2Mix
Читаем внимательно - Bad runtime function reference - PB не может вообще вызвать эту функцию. Попробуйте поставить BreakPoint на вызов этой вашей lib_function и посмотрите, доходит ли до него дело. Может быть библиотека не там где надо лежит, точно ли эта функция так называется?
Почему у вас написано
Код: plaintext
function GetCassettesStatus (var CasStatus : TCassetteStatuses) : Cardinal; stdcall; external 'lib.dll';
а здесь
Код: plaintext
FUNCTION long ek_casStatus (ref cas_status casSTS[ 5 ]) LIBRARY "lib.dll" alias for "lib_function" 
???
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32691498
Фотография Mix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТЛЯ!!!!
А ведь всё банально:)

Уважаемые господа.
Приношу свои глубокие извинения.
Ошибка была вот в чём:

При описании библиотеки разработчиком железки была допущена ошибка в названии функции. Понятно, что вызвать её я и не мог (ошибка bad runtime FUNCTION error REFERENCE явно указывала на то, что ошибка идёт при ВЫЗОВЕ функции, а не на этапе передачи переменных).

Обнаружить ошибку смог только анализируя остатки кода проги на Дельфях (реально, только остатки:) ) и там-то я и заметил ошибку.

Большое спасибо всем, кто откликнулся на тред: узнал немало интересной информации.

И ещё раз прошу извинить меня.

PS: поломку телефизора надо всё-таки искать от розетки...
...
Рейтинг: 0 / 0
Вопрос по объявлению переменной
    #32691658
Q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Q
Гость
Да... Двойка.
При ошибках передачи данных никаких сообщений не было-бы.. Элементарно - Dr. Watson. И на эту ошибку сам сколько раз нарывался...

2 Марк Локшин.
О выравнивании... Мне почему-то казазось, что Win32 требует выравнивания по словам (4 байта), я не прав? PB передаёт API структуры без проблем... Исходя из этого я ожидал проблем с packed. Какое (какие) из преведенных соображений неверно (неверны)?
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Вопрос по объявлению переменной
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]