Форум: "Потрепаться";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];
ВнизВНИМАНИЕ !!! Обнаружена ошибка в модуле Windows !!! Найти похожие ветки
← →
SPeller (2002-05-05 16:50) [0]Мастера и все остальные !!!!!!
Только что обнаружил ошибку в модуле Windows.pas Delphi6 SP2 в объявлении функции GetDiskFreeSpaceEx. Объявление следующее:
function GetDiskFreeSpaceEx(lpDirectoryName: PChar; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes ; lpTotalNumberOfFreeBytes: PLargeInteger): BOOL; stdcall;
Увидели в чём косяк ? Вместо точки с запятой должна быть запятая! Из-за вот этого косяка постоянно вылазит ошибка "Invalid pointer operation". Так что учтите!
← →
Набережных С. (2002-05-05 18:33) [1]С чего ты взял, что это ошибка? Насколько я могу судить, здесь все правильно. Последний параметр может быть nil, второй и третий - нет. И, кстати, в D5 она объявлена так-же.
← →
Mystic (2002-05-05 18:55) [2]Объявлена правильно, только нужно передавать адрес переменной, а не саму переменную.
А вот то, что VirtualFreeEx возвращает не Bool, а Pointer, это глюк, но не смертельный.
← →
SPeller (2002-05-05 19:09) [3]Но ведь в справке по ВинАПИ ВСЕ три параметра описаны как LARGEINTEGER. Вот мой глючивший кусок кода :
procedure GetDiskSpaceInfo(SpaceFree,SpaceAll:pdouble;D:pchar);
var n1,n2,n3:plargeinteger;
begin
new(n1);new(n2);new(n3);
spacefree^:=0;
spaceall^:=0;
n1^:=0;n2^:=0;n3^:=0;
getdiskfreespaceex(d,n1,n2,n3);
spacefree^:=round(n3^/107374182.4)/10;
spaceall^:=round(n2^/107374182.4)/10;
dispose(n1);dispose(n2);dispose(n3);
end;
Со старым объявлением процедура НИКАК не хотела работать. После изменения всё стало ништяк.
← →
SPeller (2002-05-05 19:27) [4]BOOL GetDiskFreeSpaceEx(
LPCTSTR lpDirectoryName, // pointer to directory name on disk of interest
PULARGE_INTEGER lpFreeBytesAvailableToCaller, // pointer to variable to receive free bytes on disk available to the caller
PULARGE_INTEGER lpTotalNumberOfBytes, // pointer to variable to receive number of bytes on disk
PULARGE_INTEGER lpTotalNumberOfFreeBytes // pointer to variable to receive free bytes on disk
);
>Объявлена правильно, только нужно передавать адрес переменной, а не саму переменную.
Знали бы вы как я извращался чтобы передать ИМЕННО адрес. Способов наверно 20 извращённых до дальше некуда перебрал. Оно бы хоть намёк дало, что правильно работает. Каждый раз Invalid Pointer Operation был единственным результатом её работы. Правда не сразу при вызове, а через несколько строк после, иногда даже при выходе из процедуры.
Да и что кроме этого LARGEINTEGER ещё можно передать ей чтобы получить результат?? Другой тип то в любом случае никто передавать не будет (разве что совместимые по размеру и представлению чисел, Int64 например).
← →
Набережных С. (2002-05-05 19:58) [5]Извращаться тут особо нечего, нужно было передавать так:
getdiskfreespaceex(d,n1^,n2^,n3);
Можно, конечно, определить и по-твоему, сути дела это не меняет.
Просто в Delphi принято в таких случаях использовать var, хотя, повторюсь, это не принципиально.
> SPeller © (05.05.02 19:09)
Да ну, какой там глюк, так, мелкое неудобство.
← →
Набережных С. (2002-05-05 20:03) [6]"Обшибочка" :)
Вместо
> SPeller © (05.05.02 19:09)
должно быть
> Mystic © (05.05.02 18:55)
Извиняюсь!
← →
SPeller (2002-05-06 12:13) [7]Во блин маразмом народ страдает, все три параметра описаны одинаково, а в Днльфях для геморрою по-другому.
2Набережных С. (05.05.02 19:58)
getdiskfreespaceex(d,n1^,n2^,n3);
Почему n1^ ? На сколько я помню, такая запися передаёт значение, на которое ссылается указатель. Зачем мы здесь передаём значение вместо указателя на него ??
← →
troits (2002-05-06 12:21) [8]Вот еще ошибка !!!
MSDN:
DWORD DeviceCapabilities(
LPCTSTR pDevice, // printer name
LPCTSTR pPort, // port name
WORD fwCapability, // device capability
LPTSTR pOutput, // output buffer
CONST DEVMODE *pDevMode // device data buffer
);
Delphi 5.0 Windows.pas
function DeviceCapabilities(
pDriverName, //!!!!!!!!!!!!!!!!!!!!!!!!!!!
pDeviceName,
pPort: PChar;
iIndex: Integer;
pOutput: PChar;
DevMode: PDeviceMode): Integer; stdcall;
← →
Набережных С. (2002-05-06 20:35) [9]
> SPeller © (06.05.02 12:13)
Ты правильно помнишь, но пока не понимаешь смысла модификаторов параметров var, const и out. Параметры, объявленные с ними, всегда передаются по ссылке, т.е. компилятор сам подставит адрес той переменной, которую ты передал в качестве параметра. Перечитай повнимательней хелп, посмотри примеры вызовов в исходниках, попробуй приведенную мной редакцию. Если останутся вопросы - милости просим. В одном ты прав - вопрос действительно элементарный. Но ничего:
"Все мы когда-нибудь учились - чему-нибудь и как-нибудь...":)
← →
Digitman (2002-05-07 09:46) [10]>SPeller
Маленький экскурс в "дебри" компилятора Делфи
Модификаторы ^ и @ предназначены для перекрытия действий компилятора по-умолчанию для случаев, когда формальные параметры проц-ры/ф-ции объявлены как передаваемые по ссылке переменные с использованием спецификаторов VAR, CONST и OUT.
При генерации кода передачи факт.параметров (при наличии в объявлении спецификаторов VAR, CONST и OUT) компилятор по-умолчанию формирует код, передающий расчитанные им фактические лин.адреса переменных, имена которых указаны в кач-ве факт.параметров вызова. Т.е., по-умолчанию достаточно просто указать имена переменных, содержимое которых будеть использовано в кач-ве факт.параметра (или для возврата рез-та), и компилятор сам расчитает лин.адреса этих переменных, передав в проц-ру/ф-цию ИМЕННО эти адреса (какого бы типа не были сами переменные - важно их местоположение в памяти, а не их тип и тек.значения).
Когда факт.параметром, например, является переменная указ.типа и ее значение д.б. передано в вызываемую проц-ру и интерпретировано ей именно как указатель на что-то, при объявлении такого форм.параметра с любым из вышеуказ.спецификаторов следует выполнить РАЗЫМЕНОВАНИЕ ( ^) параметрической переменной, фактически перекрывающее действие компилятора по-умолчанию, а именно - заставляющее его сгенерировать код, передающий не адрес указанной переменной, а ее значение; иначе параметрическим буфером будет выступать сама переменная, а не то, на что она указывает (передача значения переменной указ.типа как адреса чего-то там в памяти, собственно, и требуется по логике в дан.случае).
Иллюстрация к примеру :
type
PMyType = ^TMyType;
TMyType = packed array[..] of ...;
//все эти процедуры, к примеру, ожидают передачи адреса начала массива, объявленного как TMyType, дабы, получив этот адрес, поработать с содержимым массива и, возможно, вернуть через него же результат (в случае с VAR и OUT)
procedure MyProc1(const Value);
procedure MyProc2(var Value);
procedure MyProc3(out Value);
procedure MyProc4(var Value: TMyType);
procedure MyProc5(Value: PMyType);
var
PointerToVariableOfMyType : PMyType;
StaticVariableOfMyType: TMyType;
...
//выделение памяти под массив,
//в PointerToVariableOfMyType - адрес первого байта буфера, содержащего массив
New(PointerToVariableOfMyType);
//или тоже самое , но в статике :
PointerToVariableOfMyType := @StaticVariableOfMyType;
...
//данные вызовы эквивалентны по реализации логики и генерируемому компилятором коду, выбор - на любой вкус :
MyProc1(PointerToVariableOfMyType^); //верно
MyProc1(StaticVariableOfMyType); //верно
MyProc2(PointerToVariableOfMyType^); //верно
MyProc2(StaticVariableOfMyType); //верно
MyProc3(PointerToVariableOfMyType^); //верно
MyProc3(StaticVariableOfMyType); //верно
MyProc4(PointerToVariableOfMyType^); //верно
MyProc4(StaticVariableOfMyType); //верно
MyProc5(PointerToVariableOfMyType); //верно
MyProc5(@StaticVariableOfMyType); //верно
//а вот это - неверно и скомпилировано не будет по одной из 3-х причин :
// - ожидается переменнвя, а передается некий указатель
// - передается констанное выражение там, где ожидается некий указатель
// - несовместимые типы : указатель на "что-то" и само "что-то"
MyProc1(PointerToVariableOfMyType); //неверно
MyProc1(@StaticVariableOfMyType); //неверно
MyProc2(PointerToVariableOfMyType); //неверно
MyProc2(@StaticVariableOfMyType); //неверно
MyProc3(PointerToVariableOfMyType); //неверно
MyProc3(@StaticVariableOfMyType); //неверно
MyProc4(PointerToVariableOfMyType); //неверно
MyProc4(@StaticVariableOfMyType); //неверно
MyProc5(PointerToVariableOfMyType^); //неверно
MyProc5(StaticVariableOfMyType); //неверно
← →
Johnmen (2002-05-07 10:09) [11]>Digitman © (07.05.02 09:46)
Да Вы, батенька, просто лектор (или учитель ?) из Института Повышения Квалификации Программеров !!!
Что Вы, крутой и важный, здесь делаете с такими талантами преподавания ?
← →
Digitman (2002-05-07 11:06) [12]>Johnmen
Видите ли, достопочтеннейший сударь, здесь я как бы делюсь собственными знаниями и навыками с людьми, которые, imho, в сем действительно, нуждаются, демонстрируя неподдельный и серьезный интерес к теме, в коей я что-либо понимаю не самым худшим образом.
И кто-то когда-то здесь, искренне надеюсь, тем же (не самым худшим) образом поделится со мной, когда в этом буду нуждаться я. И - уверяю Вас, уважаемый - нуждаться буду, скорее всего, не в Ваших неуместных и насквозь пропитанных нескрываемым сарказмом комментариях, а в грамотных и профессионально аргументированных доводах в отношении реально интересующих меня (и не только меня) тем :)
← →
Johnmen (2002-05-07 11:13) [13]>Digitman © (07.05.02 11:06)
То, что Вы <<как бы делюсь собственными знаниями и навыками с людьми>> весьма радует ! (без сарказма)
А то, что Вы позволяете себе менторский нравоучительный тон, огорчает (отсюда сарказм)
← →
Digitman (2002-05-07 11:32) [14]>Johnmen
Да как Вам будет угодно, сударь !) Никоим образом не смею упрекать Вас в отсутствии изобретательности Вашей мысли, равно как и сколь либо заметно ущемлять Ваше безусловное право "награждать" привычные мне способы изложения собстенных мыслей разнообразными эпитетами. Правда, не совсем понятно, где и при чем здесь "нравоучения" какие бы то ни было ... Ну, Вам виднее, наверно )...
← →
Johnmen (2002-05-07 11:48) [15]>Digitman © (07.05.02 11:32)
Да ладно...Принцип эха мне знаком...
Не заводись, я не со зла...
И предпочитаю на ты...
← →
Digitman (2002-05-07 12:01) [16]>Johnmen
Ок, нет проблем, на "ты" и мне привычней)
Да я и не завожусь вовсе : просто - крою твоей же "картой", ну люблю я это дело иной раз, что ж поделать .... ))))
Так что, Евгений, давай с тобой бросим сей базар беспредметный, хорошо ? Он даже для "Потрепаться" не годится, imho))))))
← →
SPeller (2002-05-07 12:01) [17]2Digitman © (07.05.02 09:46)
Никогда не понимал и испытывал некую неприязнь к справочникам, отрывок из которого вы мне написали. Пробел в моих знания был совсем небольшой, и его надо было простенько так, легонько заделать. А вы пытаетесь просунуть в это маленькое отверстие такое огромное количество материала. Как пятилетнему ребёнку (и то он не понял бы). РАЗЖЁВЫВАТЬ мне не надо, свои зубы есть. Я всё понял после слов Набережных С. а дальше просто выразил своё недоумение по поводу сабжа. Я конечно уважаю ваши знания и как-то обидеть вас или ещё чего не хочу, я знаю что раз уж вы не поленились написать столько, то это о плохом не говорит, а наоборот характеризует вас с лучшей стороны. Но... не к месту просто ваши старания оказались, уж извините...
← →
Johnmen (2002-05-07 12:23) [18]>Digitman © (07.05.02 12:01) : Ok !
← →
Digitman (2002-05-07 12:27) [19]Ну, не надо так не надо) ... вот проблема-то : скомкай да выбрось в мусор).. Считай, что не обращался я к тебе персонально, а просто посчитал нелишним дать более развернутую, общую картину ... поскольку дня не проходит, чтобы кто-нибудь где-нибудь в форуме не задавал схожие по сути вопросы с разыменованием и косвенной адресацией.
Только вот - с чего ты взял , что я что-то там "разжевывал", да еще и цитировал справочник какой-то там ?
← →
IronHawk (2002-05-07 12:37) [20]
> Digitman ©
Отличное пояснение!
Вы б в моих ветках так высказывались :-).
to ALL
Не обижайте Digitman-а, он хороший :-), просто у него стиль и имидж такие.
← →
Digitman (2002-05-07 12:46) [21]>IronHawk
Я и в твоих - было дело - высказывался) .. когда ты более-менее зримые проблемы поднимал ... а не клоунаду устраивал, как в последнее время ... Только вот тебе ж "код тупой" подавай) ... А где я тебе его возьму-то ? У меня что, запасы "тупого кода" на сто лет вперед да на дивизию <IronHawk>"ов ?)... Ты, кстати, когда код "очистки переменных совсем" продемонстрируешь-то ? Обещал ведь всенепременно да клятвенно, как, мол, будет время) ... На треп-то вот ты находишь его, время, а любопытство общественности никак не удовлетворишь) ... Сподобься уж, пожалуйста - приведи сей гениальный алгоритм хоть в каком бы то ни было виде - интересно ж все таки) ...
← →
IronHawk (2002-05-07 13:00) [22]
> Digitman © (07.05.02 12:46)
> >IronHawk
>
> Я и в твоих - было дело - высказывался) .. когда ты более-менее
> зримые проблемы поднимал ... а не клоунаду устраивал, как
> в последнее время ... Только вот тебе ж "код тупой" подавай)
> ... А где я тебе его возьму-то ? У меня что, запасы "тупого
> кода" на сто лет вперед да на дивизию <IronHawk>"ов ?)...
> Ты, кстати, когда код "очистки переменных совсем" продемонстрируешь-то
> ? Обещал ведь всенепременно да клятвенно, как, мол, будет
> время) ... На треп-то вот ты находишь его, время, а любопытство
> общественности никак не удовлетворишь) ... Сподобься уж,
> пожалуйста - приведи сей гениальный алгоритм хоть в каком
> бы то ни было виде - интересно ж все таки) ...
Уталить сие желане можно, и оно обязательно в кратчайшие сроки будет удовлетворено, просто дело не в ней ...
Дам, дам я код!
← →
SPeller (2002-05-07 13:00) [23]2Digitman
Да ладно, всё ништяк
← →
Подонок (2002-05-07 13:03) [24]Ждем-с...
← →
MBo (2002-05-07 13:11) [25]>Johnmen
>Speller
Лично мне было небезынтересно прочитать "экскурс", вызвавший споры. Хотя предмет мне хорошо известен, знакомство с точкой зрения опытного человека никогда не помешает - это порой позволяет увидеть какие-то тонкости, на которые не обращал внимания. А тон "экскурса" вполне нормальный, никакого менторства явно не было.
← →
fnatali (2002-05-07 13:18) [26]SPeller © (07.05.02 12:01)
>2Digitman © (07.05.02 09:46)
> Но... не к месту просто ваши старания оказались, уж извините...
А мне очень нравится, как Digitman объясняет, я специально захожу почитать, если в ветке есть его сообщения, даже если тема мне, в общем, и не интересна. Стильно написано.
← →
SPeller (2002-05-07 13:25) [27]MBo © (07.05.02 13:11)
Ну вот я и говорю - всё нормально. Просто вам меня не понять. У меня свой способ восприятия информации извне (может покажусь вам странным). Позволяет воспринимать не роясь при этом в море макулатуры и хелпов. Поэтому слушать или читать то что уже знаю просто-напросто утомляет меня. Ну примерно если бы вам объясняли что 2*2=4 при этом показывали на пальцах, на палочках, объясняли пол часа, что 2*2=4 а не 5 и не 3 и не 8. Этому не учатся, это от природы дано. (( Ну ваще прям куда бы деться.. гений хренов ::))
← →
SPeller (2002-05-07 13:29) [28]2 fnatali
Да я и не спорю
← →
Digitman (2002-05-07 13:43) [29]>SPeller
Ты уж извини меня, но я не согласен с тобой) ... Этому именно учатся ! И "гений" там чей-то какой-то, или "интуиция" или еще чего-нить из той же оперы - ну совершенно ни при чем, уверяю тебя) ... Иначе - как изволишь понимать понимать то, что, глядючи раз за разом на "Invalid pointer operation", после явно многократных (так ведь ?) "слепых" эксперементов с синтасисом и логикой вызова, т.е. сообщение компилятора об ошибке, явно говорящем именно о твоей собственной ошибке в передаче параметров, ты-таки пошел искать эти самые "2х2=4" сразу в борландовских прототипах из Windows.pas, да еще и предлагаешь другим "учитывать" то, в чем ты не захотел разобраться досконально, игнорируя учебники и справочники ? Да, и "великий Борланд" частенько ошибается, я не спорю, но ... В данном случае уж действительно получается, что "Этому не учатся, это от природы дано"(...
← →
MBo (2002-05-07 13:45) [30]>SPeller
Отчасти могу понять - например, одни и те же книги (скажем, по программированию) у разных людей вызывают разные, в зависимости от особенностей восприятия, чувства. Одним нравится, как описано именно здесь, а других раздражает. Ну да ладно, лирика...
← →
IronHawk (2002-05-07 13:55) [31]Литературной теме можно посвятить отдельную ветку :-) !
Что скажите ?
← →
SPeller (2002-05-07 14:31) [32]2Digitman © (07.05.02 13:43)
Я ж говорил не поймёте! Каждый человек уникален. И вы и я. У каждого свои способности, своё восприятие мира, свои взгляды на жизнь, свои подарки и "подарки" от природы. Я не без недостатков и вы тоже. Идеальных людей нет.
---------------------------------------------------------------------------
ты-таки пошел искать эти самые "2х2=4" сразу в борландовских прототипах из Windows.pas, да еще и предлагаешь другим "учитывать"
Во-первых я обнаружил это случайно, во вторых просматривая не раз хелп видел, что там все параметры одинаково, поэтому и ожидал увидеть тоже самое в Дельфёвском модуле. Плюс к этому изменил описание и всё заработало. Естественно первой идеей было то, что это ошибка Борландовцев. Но слава богу переубедили меня. С кем не бывает, людям свойственно ошибаться.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.06.10;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.006 c