Документация не является обучающим пособием, поэтому не рассчитана на то чтобы разжёвывать каждое слово. Предполагается, что у человека уже есть знания в этой области, и он лишь хочет уточнить конкретные детали по поводу реализации этого в MQL.
Давайка по порядку.
Что такое документация? Вики говорит, что так. Как можно уточнить деталь если о ней не написано? Вы вообще адекватный человек? По Вашем деталь - это общие фразы? Деталей в вышеприведённой мной цитате нет. Есть некая общая субстанция. А если бы упомянули о конкретно глубже, касательно, членов и элементов-классов, это бы уже была деталь... Надеюсь так понятно? Или нужно разжевать?
Ладно я бывает заработаюсь и могу задать вопрос, который сам решаю спустя некоторое время. Но Вы утверждаете, видимо обдумав то, что не является логичным. Вам же simpleton написал то, чего нет. Уже можно было прочитать и понять что это верно. Тут не вооружённым глазом видно, что всё логично.
Meat:
Понятие структуры идёт ещё со времён динозавров, когда и ООП ещё не было - это просто некие данные, разбитые на отдельные элементы. Да и там по тексту очевидно, что речь идёт о данных. А кому не очевидно - читайте учебники.
А классы и появились, чтоб по дефолту делать некоторые вещи приватными. Это типа как удобство. Сишники такого же мнения. Я интересовался данными вещами, ещё тогда, когда изучал данный вопрос.
Господа "программисты", вы вообще понимаете, что такое viod?
void - пустота. Этот "тип" придуман для функций, которые ничего не возвращают.
В C/C++ есть ещё применения для типа void. Например, void * - указатель на данные любого типа. Такой указатель приводится к указателю любого типа безо всякого предупреждения
stringo: В C/C++ есть ещё применения для типа void. Например, void * - указатель на данные любого типа. Такой указатель приводится к указателю любого типа безо всякого предупреждения
Неправда.
C:
int main(void) {
void *p = &p; /* p - указатель на void */int (*f)(void) = p; /* f - указатель "любого типа", в данном случае - указатель на функцию */return0;
}
Компилятор ругается вполне определённым образом:
$ gcc -pedantic -std=c99 -c try.c
try.c: In function 'main':
try.c:3:19: warning: ISO C forbids initialization between function pointer and 'void *' [-pedantic]
C++:
int main() {
void *p(&p); // p - указатель на voidint *i(p); // i - указатель "любого типа", в данном случае - указатель на intint (*f)()(p); // f - указатель "не менее любого типа", в данном случае - указатель на функциюreturn0;
}
Компилятор также ругается вполне определённым образом в обоих случаях:
$ g++ -pedantic -std=c++11 -c try.cpp
try.cpp: In function 'int main()':
try.cpp:3:10: error: invalid conversion from'void*' to 'int*' [-fpermissive]
try.cpp:4:14: error: invalid conversion from'void*' to 'int (*)()' [-fpermissive]
Кстати, так и не ответили на вопрос, как переменные могут считаться использованными, если для изобретённого вида "использования" (есть инициализация - значит, есть использование) при удалении из любой программы переменных, "использованных" именно таким образом, логическое поведение этой любой программы абсолютно не меняется.
Для данных примеров, кстати, для C:
$ gcc -pedantic -std=c99 -Wall -c try.c
try.c: In function 'main':
try.c:3:19: warning: ISO C forbids initialization between function pointer and 'void *' [-pedantic]
try.c:3:8: warning: unused variable 'f' [-Wunused-variable]
с точки зрения "взрослого" компилятора, переменная f НЕ является использованной, несмотря на то, что она инициализирована.
с точки зрения "взрослого" компилятора, и переменная i, и переменная f, - обе НЕ являются использованными, несмотря на то, что обе инициализированы.
Логика "использованности", по крайней мере, для встроенных типов, очень проста: если значение переменной НЕ прочитано, она НЕ использована. Именно поэтому "взрослый" компилятор считает, что в обоих случаях переменная p ЯВЛЯЕТСЯ использованной.
Про адресное пространство команд и адресное пространство данных не забываем:)
Цитирую stringo: " ... void * - указатель на данные любого типа ... ".
Я в примерах завёл какой-то другой указатель?
А дальше процитировать? Я имею ввиду: "Такой указатель приводится к указателю любого типа". Уже ничего не сказано про данные. Ведь, - верно? Ещё хорошо, что навскидку не пришла в голову мысль об указателях на члены/методы класса, чтобы к ним привести...
Даже если не обращать на это внимания, то для C++ данное утверждение неверно. Зато верно обратное утверждение (применительно к обычным указателям на данные), для обоих языков.
Я старый солдат, я не знаю слов любви и никогда сам не программировал на С.
Просто, маненько понимаю всю эту кухню и не люблю, когда толкование продолжения фразы выдергивается из контекста начала оной фразы.
Не выдёргивается толкование. Сказано, что "void * - указатель на данные любого типа, и он приводится к указателю любого типа". С первой частью фразы всё нормально. А со второй - что такое "указатель любого типа"? Как построить фразу, если действительно нужно было бы утверждать, что некий указатель приводится к указателю не только на данные? Так и построить, как stringo это сделал, ведь - верно?
Документация не является обучающим пособием, поэтому не рассчитана на то чтобы разжёвывать каждое слово. Предполагается, что у человека уже есть знания в этой области, и он лишь хочет уточнить конкретные детали по поводу реализации этого в MQL.
Давайка по порядку.
Что такое документация? Вики говорит, что так. Как можно уточнить деталь если о ней не написано? Вы вообще адекватный человек? По Вашем деталь - это общие фразы? Деталей в вышеприведённой мной цитате нет. Есть некая общая субстанция. А если бы упомянули о конкретно глубже, касательно, членов и элементов-классов, это бы уже была деталь... Надеюсь так понятно? Или нужно разжевать?
Ладно я бывает заработаюсь и могу задать вопрос, который сам решаю спустя некоторое время. Но Вы утверждаете, видимо обдумав то, что не является логичным. Вам же simpleton написал то, чего нет. Уже можно было прочитать и понять что это верно. Тут не вооружённым глазом видно, что всё логично.
Понятие структуры идёт ещё со времён динозавров, когда и ООП ещё не было - это просто некие данные, разбитые на отдельные элементы. Да и там по тексту очевидно, что речь идёт о данных. А кому не очевидно - читайте учебники.
А классы и появились, чтоб по дефолту делать некоторые вещи приватными. Это типа как удобство. Сишники такого же мнения. Я интересовался данными вещами, ещё тогда, когда изучал данный вопрос.
У, как всё запущено...
Господа "программисты", вы вообще понимаете, что такое viod?
void - пустота. Этот "тип" придуман для функций, которые ничего не возвращают.
У, как всё запущено...
Господа "программисты", вы вообще понимаете, что такое viod?
void - пустота. Этот "тип" придуман для функций, которые ничего не возвращают.
В C/C++ есть ещё применения для типа void. Например, void * - указатель на данные любого типа. Такой указатель приводится к указателю любого типа безо всякого предупреждения
Неправда.
C:
Компилятор ругается вполне определённым образом:
C++:
Компилятор также ругается вполне определённым образом в обоих случаях:
Кстати, так и не ответили на вопрос, как переменные могут считаться использованными, если для изобретённого вида "использования" (есть инициализация - значит, есть использование) при удалении из любой программы переменных, "использованных" именно таким образом, логическое поведение этой любой программы абсолютно не меняется.
Для данных примеров, кстати, для C:
с точки зрения "взрослого" компилятора, переменная f НЕ является использованной, несмотря на то, что она инициализирована.
Для C++:
с точки зрения "взрослого" компилятора, и переменная i, и переменная f, - обе НЕ являются использованными, несмотря на то, что обе инициализированы.
Логика "использованности", по крайней мере, для встроенных типов, очень проста: если значение переменной НЕ прочитано, она НЕ использована.
Именно поэтому "взрослый" компилятор считает, что в обоих случаях переменная p ЯВЛЯЕТСЯ использованной.
Указатель на функцию не дружит с указателем на void
Именно эту "небрежность" в формулировке я и подчеркнул. А для C++ это уже даже не "небрежность".
Про адресное пространство команд и адресное пространство данных не забываем:)
Цитирую stringo: " ... void * - указатель на данные любого типа ... ".
Про адресное пространство команд и адресное пространство данных не забываем:)
Цитирую stringo: " ... void * - указатель на данные любого типа ... ".
Я в примерах завёл какой-то другой указатель?
А дальше процитировать? Я имею ввиду: "Такой указатель приводится к указателю любого типа". Уже ничего не сказано про данные. Ведь, - верно? Ещё хорошо, что навскидку не пришла в голову мысль об указателях на члены/методы класса, чтобы к ним привести...
Даже если не обращать на это внимания, то для C++ данное утверждение неверно. Зато верно обратное утверждение (применительно к обычным указателям на данные), для обоих языков.
Я в примерах завёл какой-то другой указатель?
А дальше процитировать? Именно: "Такой указатель приводится к указателю любого типа". Уже ничего не сказано про данные. Ведь, - верно?
Даже если не обращать на это внимания, то для C++ данное утверждение неверно. Зато верно обратное утверждение, для обоих языков.
Я старый солдат, я не знаю слов любви и никогда сам не программировал на С.
Просто, маненько понимаю всю эту кухню и не люблю, когда толкование продолжения фразы выдергивается из контекста начала оной фразы.
Я старый солдат, я не знаю слов любви и никогда сам не программировал на С.
Просто, маненько понимаю всю эту кухню и не люблю, когда толкование продолжения фразы выдергивается из контекста начала оной фразы.
Не выдёргивается толкование. Сказано, что "void * - указатель на данные любого типа, и он приводится к указателю любого типа". С первой частью фразы всё нормально. А со второй - что такое "указатель любого типа"? Как построить фразу, если действительно нужно было бы утверждать, что некий указатель приводится к указателю не только на данные? Так и построить, как stringo это сделал, ведь - верно?