purebasic.info

PureBasic forum
Текущее время: Вс авг 19, 2018 11:32 am

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




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Не знаю, глюк, не глюк
СообщениеДобавлено: Чт апр 30, 2015 9:24 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Я столкнулся с такой проблемой, когда PB неправильно передает аргументы функциям вызываемых библиотек
Пример: если вы скачали [ur=http://purebasic.info/phpBB3ex/viewtopic.php?p=80288#p80288l]отсюда[/url], то в в файле TestPDF_text есть такой код
Код:
1
2
3
4
5
     *c = AllocateMemory(SizeOf(HPDF_RGBColor))
     HPDF_Page_GetRGBFill(*c, page)    ; ???????????????????????????????????????????????????????????? o_O
  ;  *c = HPDF_Page_GetRGBFill(page)   ; ????????????????????????????????????????????????????????????
    HPDF_Page_BeginText(page)
 


Автор описывает эту функцию так
Цитата:
When HPDF_Page_GetTextRise() succeed, it returns the current value of the text rising. Otherwise it returns 0.
HPDF_Page_GetRGBFill
#include "apdf.h"
typedef struct _HPDF_RGBColor {
HPDF_REAL r;
HPDF_REAL g;
HPDF_REAL b;
} HPDF_RGBColor;
HPDF_RGBColor
HPDF_Page_GetRGBFill (HPDF_Page page);
Description
HPDF_Page_GetRGBFill() returns the current value of the page's filling color. HPDF_Page_GetRGBFill() is valid only when the page's filling color space is HPDF_CS_DEVICE_RGB.
Parameter
page
The handle of a page object.
Returns
When HPDF_Page_GetRGBFill() succeed, it returns the current value of the page's filling color. Otherwise it returns {0, 0, 0}.

Т.е. функция возвращает указатель на заполненную структуру RGB.
НО только не в случае PB. В VisualBasic, в делфях и плюс си это так
А в пурике прототип функции приходиться переделывать, я уж все пробовал

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Чт апр 30, 2015 9:32 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11228
Благодарил (а): 4 раз.
Поблагодарили: 425 раз.
Зачем AllocateMemory? Функция возвращает указатель на память и нет необходимости выделять ее в коде.
Нужно получить указатель на структуру, которую вернула функция?
Код:
1
*c.HPDF_RGBColor = HPDF_Page_BeginText(page)


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Чт апр 30, 2015 9:45 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Петр, вы наверно не поняли меня, или вообще не вьехали в тему
Есть у автора функция
Код:
1
HPDF_Page_GetRGBFill(page) 


Аргументом кладется 1 (одна ОДНА) переменная
В случае с PB это не работает, нужно написать HPDF_Page_GetRGBFill(*c, page) , т.е. две штуки ложим на стек, тогда это работает. Почему?
PPS В случае компиляции в PB не возвращает эта функция никакой указатель (но блин в VB и с++ возвращает блин)

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Чт апр 30, 2015 10:02 pm 
Не в сети
профессор

Зарегистрирован: Пн янв 03, 2011 4:27 pm
Сообщений: 410
Благодарил (а): 5 раз.
Поблагодарили: 17 раз.
Пункты репутации: 0
pablov, пробовал заменить Procedure, Prototype на ProcedureC, PrototypeC?
И оригинальный код не скинешь?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Чт апр 30, 2015 10:37 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
@ZOLO@ писал(а):
pablov, пробовал заменить Procedure, Prototype на ProcedureC, PrototypeC?
И оригинальный код не скинешь?

Попробуй
Оригинальный код лежит тут

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Пт май 01, 2015 12:23 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 571
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
pablov писал(а):
Т.е. функция возвращает указатель на заполненную структуру RGB.
НО только не в случае PB. В VisualBasic, в делфях и плюс си это так
А в пурике прототип функции приходиться переделывать, я уж все пробовал

В данном случае у вас в коде указатель уже известен а значит зачем его возвращать?
По нему только осталось заполнить структуру(переменные они точно флоат?)
А если возвращать указатель то это уже процедура тогда должна память выделять(маловероятно) :roll:
К тому же в библиотеке у функции 2 аргумента.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Пт май 01, 2015 12:44 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Вы Сергейчик, скомпилируйте тот код пощупайте его, а потом уже ....

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Пт май 01, 2015 7:23 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 238
Благодарил (а): 32 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
pablov библиотека написана чем-то ООП-шном видимо, а там первая переменная метода - *this (ссылка на структуру экземпляра класса)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Пт май 01, 2015 2:50 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 571
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
pablov писал(а):
Вы Сергейчик, скомпилируйте тот код пощупайте его, а потом уже ....

Он в dll уже скомпилен из которой вы функцию берёте а там 2 аргумента. :D
Указатель да она возвращает и он=входящему.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Пт май 01, 2015 3:21 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Может я не правильно пытаюсь обьяснить проблему, попробую еще раз
Вот так у автора в help'e описан вызов функции HPDF_Page_GetRGBFill
Код:
1
HPDF_Page_GetRGBFill (HPDF_Page page);


т.е. функции передается ОДИН аргумент
В VB вызов происходит так
Код:
1
2
Dim c               As HPDF_RGBColor
 c = HPDF_Page_GetRGBFill(page)



В с++ так
Код:
1
 HPDF_RGBColor c = HPDF_Page_GetRGBFill (page);


В обоих случаях в функцию передается один аргумент, а в PB нужно передавать два, чтобы правильно работало. Вот я и спрашиваю, почему?

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Пт май 01, 2015 3:31 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 571
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
Пойми сам что у функции в dll 2 аргумента а не один ,берут ли те языки программирования функцию из этой dll или пользуются другой(чем то другим)?
В VB вызов происходит так
Код:
1
2
3
4
 
Dim c  As HPDF_RGBColor
 c = HPDF_Page_GetRGBFill(page)
 


Структура тоже объявлена заранее значит и ссылка на неё тоже должна как то передаться функции.


Последний раз редактировалось Сергейчик Пт май 01, 2015 3:42 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Пт май 01, 2015 3:40 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11228
Благодарил (а): 4 раз.
Поблагодарили: 425 раз.
pablov писал(а):
В обоих случаях в функцию передается один аргумент, а в PB нужно передавать два, чтобы правильно работало. Вот я и спрашиваю, почему?
Поищи инфу о том как в C++ и VB функции возвращают структуры.

Вот что нагуглил. https://dev64.wordpress.com/2012/10/11/ ... rn-in-cpp/
Цитата:
Видно что в функции main() резервируется место в стеке под структуру Object o. А потом, как это не странно ссылка на эту выделенную память передается внутрь функции func().

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Пт май 01, 2015 4:13 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Сергейчик писал(а):
Пойми сам что у функции в dll 2 аргумента а не один

Где это описано, откуда видно что 2 аргумента? Только конкретно, без воды
Петр, очень похоже

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Пт май 01, 2015 4:29 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 571
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
pablov писал(а):
Сергейчик писал(а):
Пойми сам что у функции в dll 2 аргумента а не один

Где это описано, откуда видно что 2 аргумента? Только конкретно, без воды
Петр, очень похоже

Дизассемблером посмотрел IDA Free. :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Не знаю, глюк, не глюк
СообщениеДобавлено: Вс янв 31, 2016 3:34 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 813
Благодарил (а): 21 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Вот что-то тоже не пойму глюк, или не глюк :)

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Procedure.s GetSysDir(dir)
 
  Protected path$, tmp
  path$ = Space(#MAX_PATH)
  SHGetSpecialFolderLocation_(0,dir,@tmp)
  SHGetPathFromIDList_(tmp, @path$)
  ProcedureReturn Trim(path$)
 
EndProcedure
 
sysdir$ = GetSysDir(#CSIDL_SYSTEM)+"\"
 
Debug FileSize(sysdir$+"d3dx9_24.dll")
Debug FileSize("C:\Windows\System32\d3dx9_24.dll")
 
For x = 24 To 26
  Debug sysdir$+"d3dx9_"+Str(x)+".dll   Size: "+FileSize("d3dx9_"+Str(x)+".dll")
Next



Purebasic 5.30 x86

Код:
1
2
3
4
5
6
2222800
2222800
C:\Windows\System32\d3dx9_24.dll   Size: -1
C:\Windows\System32\d3dx9_25.dll   Size: -1
C:\Windows\System32\d3dx9_26.dll   Size: -1
 



Если что, глюк исключительно в дебаге размера, можно переписать разными вариантами и значения будут другими :)
Сам размер считается вроде корректно, даже при удалении из 32-битной директории, считает размер из SysWOW64 (без симлинка), но когда дебажишь, часто показывает всякую хрень :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

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


Кто сейчас на форуме

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


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB