А что, разве в Delphi тоже runtime бывает? Что-то я только с одним ехе сталкивался пока, без dll'ов.
» Вопросы по программированию на C/С++
Exe, рожденные Delphi - как раки. Бывают по пять рублей = ну очень большие, а бывают по три рубля = маленькие. Те, что по пять рублей, им действительно ничего, кроме них самих, не надо. Зато они ну очень большие. Ну очень большие. Зато по пять рублей. А те, что по три - они не будут работать без кучи г... богомерзкого мусора в System32 с расширением bpl. (Это так великая Borland Embarcadero называет свои исключительные dll. Чтобы подчеркнуть их исключительность.) И этого мусора там до дури. Зато сами exe - маленькие.
Ради интереса решил поискать, где мелкие раки зимуют, так как в \system директории 16 бплов.
Нашлись двое- IDA Pro, но она не в щёт, так как все ее бплы она держит у себя, а вот имя второго рака оказалось довольно неожиданным. Это Intel Desktop Utilities, которые когда-то установил, чтобы variable.sys заполучить. И вроде у них самих довольно неплохой компилятор есть...
Из примерно 150 программ (папок в Program Files) только одна рантаймы в систему положила, так что не всё так плохо, как кажется.
Нашлись двое- IDA Pro, но она не в щёт, так как все ее бплы она держит у себя, а вот имя второго рака оказалось довольно неожиданным. Это Intel Desktop Utilities, которые когда-то установил, чтобы variable.sys заполучить. И вроде у них самих довольно неплохой компилятор есть...
Из примерно 150 программ (папок в Program Files) только одна рантаймы в систему положила, так что не всё так плохо, как кажется.
мне, вообще говоря, наплевать, пусть об этом голова болит у мышиных программистов...
все мои дельфийские проги начинаются с директивы appconsole и работают в автономе под всеми маздайками...
все мои дельфийские проги начинаются с директивы appconsole и работают в автономе под всеми маздайками...
ItsJustMe
Цитата:
Скажу больше. - Сомневаюсь что вы это пробовали. В Делфи есть возможность писать свои приложения "гетерогенный" dll-bpl без использования RTL.BPL и вообще всех борлановских библиотек. Там уже не раки не крабы и даже не appconsole. А в шарпе вы свою system.GZip(Который хуже LZ).dll не навояете.
Цитата:
Exe, рожденные Delphi - как раки. Бывают по пять рублей = ну очень большие, а бывают по три рубля = маленькие.
Скажу больше. - Сомневаюсь что вы это пробовали. В Делфи есть возможность писать свои приложения "гетерогенный" dll-bpl без использования RTL.BPL и вообще всех борлановских библиотек. Там уже не раки не крабы и даже не appconsole. А в шарпе вы свою system.GZip(Который хуже LZ).dll не навояете.
Я просто это... Мне "автономно переносимые" понравилось, надо в словаре глянуть, простите.
Добавлено:
Это как, они вообще не переносятся чтоли?
Добавлено:
Если есть автономно переносимые, значит есть автономно не переносимые наверно, надо тоже гуглить.
Добавлено:
Это как, они вообще не переносятся чтоли?
Добавлено:
Если есть автономно переносимые, значит есть автономно не переносимые наверно, надо тоже гуглить.
delover
Цитата:
Это еще что (хотя все это лучше подойдет для темы "не только оно"). А вы знаете, что все приложения на PC являются x64? Только одни "полноценные", а другие "неполноценные". Мне это один гуру на этом форуме открыл.
Цитата:
Честно, закончил свое общение с Embarcadero продуктами на RAD2009. А про bpl заметил еще со времен Delphi 7. Не знаю, сейчас может что и изменилось.
Цитата:
Лично я уже много лет пользую это. Да, вы правы. Своего я не наваяю. Ибо зачем я буду тратить свои силы на то, что за меня уже сделано?
Цитата:
Если есть автономно переносимые, значит есть автономно не переносимые наверно, надо тоже гуглить.
Это еще что (хотя все это лучше подойдет для темы "не только оно"). А вы знаете, что все приложения на PC являются x64? Только одни "полноценные", а другие "неполноценные". Мне это один гуру на этом форуме открыл.
Цитата:
Сомневаюсь что вы это пробовали.
Честно, закончил свое общение с Embarcadero продуктами на RAD2009. А про bpl заметил еще со времен Delphi 7. Не знаю, сейчас может что и изменилось.
Цитата:
А в шарпе вы свою system.GZip(Который хуже LZ).dll не навояете.
Лично я уже много лет пользую это. Да, вы правы. Своего я не наваяю. Ибо зачем я буду тратить свои силы на то, что за меня уже сделано?
1
Цитата:
Лично я уже много лет пользую
Да я тоже за 1 час написал свою обёртку на 32 бит dll (7zip). Подсунуть то её я не могу, а зачем я автономно таскаю это, явно бесполезное детище, мне не понять.
Цитата:
А вы знаете, что все приложения на PC являются x64?
Тут мне сказали что Win95 написан на паскале, я где то в 90-х пробовал пустить этот миф, мня тогда чуть не побили.
delover
Цитата:
Все верно, кроме Win95. Только самые первые версии Виндовс были написаны на паскале.
Цитата:
Тут мне сказали что Win95 написан на паскале
Все верно, кроме Win95. Только самые первые версии Виндовс были написаны на паскале.
Garrett
Забавно что это говорил учитель информатики. Мы выяснили, думаю он заблуждался:
http://forum.mydiv.net/stopic931_3.html
Цитата:
Версию 2.95 я не нагуглил.
Забавно что это говорил учитель информатики. Мы выяснили, думаю он заблуждался:
http://forum.mydiv.net/stopic931_3.html
Цитата:
блин скока говорить,
винда до 2.95 включительно написана на паскале,
конечно с использованием асмы!!
Версию 2.95 я не нагуглил.
интересно. можно в самом микрософте спросить.
гугл в основном говорит NT на C/С++ и masm
Добавлено:
а на какой операционной системе писали Windows NT 4.0(3.1) ? ?
гугл в основном говорит NT на C/С++ и masm
Добавлено:
а на какой операционной системе писали Windows NT 4.0(3.1) ? ?
Я не смог компилировать очередную версию VD.
Может кто подскажет как "побороть" можно, вот ошибки и места, куда ссылается программа: [more=ДАЛЕЕ] 9>Compiling...
9>FilterInstance.cpp
9>.\source\FilterInstance.cpp(1594) : error C2660: 'IVDFilterFrameClientRequest::Start' : function does not take 3 arguments
9>.\source\FilterInstance.cpp(1608) : error C2660: 'IVDFilterFrameClientRequest::Start' : function does not take 3 arguments
9>.\source\FilterInstance.cpp(1673) : error C2660: 'IVDFilterFrameClientRequest::Start' : function does not take 3 arguments
9>.\source\FilterInstance.cpp(1981) : error C2039: 'GetSrcIndex' : is not a member of 'IVDFilterFrameClientRequest'
9> c:\VirtualDub8\VirtualDub110502_eng\src\VirtualDub\h\FilterFrameRequest.h(46) : see declaration of 'IVDFilterFrameClientRequest'
9>FilterFrameRequest.cpp
9>.\source\FilterFrameRequest.cpp(76) : error C2511: 'void VDFilterFrameClientRequest::Start(IVDFilterFrameClient *,uint64,uint32)' : overloaded member function not found in 'VDFilterFrameClientRequest'
9> c:\VirtualDub8\VirtualDub110502_eng\src\VirtualDub\h\FilterFrameRequest.h(79) : see declaration of 'VDFilterFrameClientRequest'
9>.\source\FilterFrameRequest.cpp(121) : error C2039: 'GetSrcIndex' : is not a member of 'VDFilterFrameClientRequest'
9> c:\VirtualDub8\VirtualDub110502_eng\src\VirtualDub\h\FilterFrameRequest.h(79) : see declaration of 'VDFilterFrameClientRequest'
9>.\source\FilterFrameRequest.cpp(122) : error C2065: 'mSrcIndex' : undeclared identifier
9>Generating Code...
9>Build log was saved at
"file://c:\VirtualDub8\VirtualDub110502_eng\obj\Release\VirtualDub\BuildLog.htm"
9>VirtualDub - 7 error(s), 0 warning(s)
========== Build: 8 succeeded, 1 failed, 9 up-to-date, 0 skipped ==========
FilterInstance.cpp строка 1594 (93-95):
srcreq->Start(NULL, 0);
-------------------------
FilterInstance.cpp строка 1608 (07-09):
srcreq->Start(NULL, prefetchInfo.mCookie);
---------------------
FilterInstance.cpp строка 1673 (72-74):
srcreq->Start(NULL, prefetchInfo.mCookie);
-----------------
FilterInstance.cpp строка 1681 (80-83):
bm.mPixmapLayout = mExternalSrcCropped.mPixmapLayout;
bm.BindToFrameBuffer(fb, true);
----------------
FilterFrameRequest.cpp строка 121 (121-124 (на самом деле пустая):
VDFilterFrameRequest::VDFilterFrameRequest()
: mbComplete(false)
================== [/more]
Может кто подскажет как "побороть" можно, вот ошибки и места, куда ссылается программа: [more=ДАЛЕЕ] 9>Compiling...
9>FilterInstance.cpp
9>.\source\FilterInstance.cpp(1594) : error C2660: 'IVDFilterFrameClientRequest::Start' : function does not take 3 arguments
9>.\source\FilterInstance.cpp(1608) : error C2660: 'IVDFilterFrameClientRequest::Start' : function does not take 3 arguments
9>.\source\FilterInstance.cpp(1673) : error C2660: 'IVDFilterFrameClientRequest::Start' : function does not take 3 arguments
9>.\source\FilterInstance.cpp(1981) : error C2039: 'GetSrcIndex' : is not a member of 'IVDFilterFrameClientRequest'
9> c:\VirtualDub8\VirtualDub110502_eng\src\VirtualDub\h\FilterFrameRequest.h(46) : see declaration of 'IVDFilterFrameClientRequest'
9>FilterFrameRequest.cpp
9>.\source\FilterFrameRequest.cpp(76) : error C2511: 'void VDFilterFrameClientRequest::Start(IVDFilterFrameClient *,uint64,uint32)' : overloaded member function not found in 'VDFilterFrameClientRequest'
9> c:\VirtualDub8\VirtualDub110502_eng\src\VirtualDub\h\FilterFrameRequest.h(79) : see declaration of 'VDFilterFrameClientRequest'
9>.\source\FilterFrameRequest.cpp(121) : error C2039: 'GetSrcIndex' : is not a member of 'VDFilterFrameClientRequest'
9> c:\VirtualDub8\VirtualDub110502_eng\src\VirtualDub\h\FilterFrameRequest.h(79) : see declaration of 'VDFilterFrameClientRequest'
9>.\source\FilterFrameRequest.cpp(122) : error C2065: 'mSrcIndex' : undeclared identifier
9>Generating Code...
9>Build log was saved at
"file://c:\VirtualDub8\VirtualDub110502_eng\obj\Release\VirtualDub\BuildLog.htm"
9>VirtualDub - 7 error(s), 0 warning(s)
========== Build: 8 succeeded, 1 failed, 9 up-to-date, 0 skipped ==========
FilterInstance.cpp строка 1594 (93-95):
srcreq->Start(NULL, 0);
-------------------------
FilterInstance.cpp строка 1608 (07-09):
srcreq->Start(NULL, prefetchInfo.mCookie);
---------------------
FilterInstance.cpp строка 1673 (72-74):
srcreq->Start(NULL, prefetchInfo.mCookie);
-----------------
FilterInstance.cpp строка 1681 (80-83):
bm.mPixmapLayout = mExternalSrcCropped.mPixmapLayout;
bm.BindToFrameBuffer(fb, true);
----------------
FilterFrameRequest.cpp строка 121 (121-124 (на самом деле пустая):
VDFilterFrameRequest::VDFilterFrameRequest()
: mbComplete(false)
================== [/more]
С Новым Годом!
Никто не подскажет - есть видео плееры которые открывают проигрываемые файлы таким образом, что их можно перемещать из папки в папку. Каким образом это делается? может не по пути, а типа металлической ссылке или типа того?
Никто не подскажет - есть видео плееры которые открывают проигрываемые файлы таким образом, что их можно перемещать из папки в папку. Каким образом это делается? может не по пути, а типа металлической ссылке или типа того?
С Новым Годом, Бомззз!
Привет народ!
Всех с наступившим.
Помогите плиз решить задачку (извините если она уж совсем убогая, не очень силен в программировании, только начинаю):
Есть несколько одинаковых классов с разными именами, у которых есть одноименные методы. Отличия только в реализации методов, они считают немного по разному для разных классов, то есть в разных классах одни и те же методы вычисляют разные значения от одного и того же исходного значения. Так вот очень хочется каким-то образом обратиться к методу нужного класса. Подскажите пожалуйста как это сделать. Метод статический. Выдержка из кода:
for (int i = 1; i <= Class1.ltFlNum; i++)
{ Class1.findFlPl(i);
str += "кв." + i + " под " + Class1.getSec + " эт " + Class1.getAbFl + " " + Class1.getFlSi + " стор\r\n";
}
Чтобы для десяти классов не лепить этот цикл хотел сделать метод, но передать туда имя нужного класса не могу.
Подскажите плиз как решить эту задачу.
Всех с наступившим.
Помогите плиз решить задачку (извините если она уж совсем убогая, не очень силен в программировании, только начинаю):
Есть несколько одинаковых классов с разными именами, у которых есть одноименные методы. Отличия только в реализации методов, они считают немного по разному для разных классов, то есть в разных классах одни и те же методы вычисляют разные значения от одного и того же исходного значения. Так вот очень хочется каким-то образом обратиться к методу нужного класса. Подскажите пожалуйста как это сделать. Метод статический. Выдержка из кода:
for (int i = 1; i <= Class1.ltFlNum; i++)
{ Class1.findFlPl(i);
str += "кв." + i + " под " + Class1.getSec + " эт " + Class1.getAbFl + " " + Class1.getFlSi + " стор\r\n";
}
Чтобы для десяти классов не лепить этот цикл хотел сделать метод, но передать туда имя нужного класса не могу.
Подскажите плиз как решить эту задачу.
moneybro
Сделать базовый класс, в котором все эти методы виртуальные (пустые), реальные классы унаследовать от него с переопределением виртуальных методов. Функция пусть принимает тип базового класса по ссылке, а передавать туда ссылку на экземпляр реального класса.
Сделать базовый класс, в котором все эти методы виртуальные (пустые), реальные классы унаследовать от него с переопределением виртуальных методов. Функция пусть принимает тип базового класса по ссылке, а передавать туда ссылку на экземпляр реального класса.
Спасибо, panda3.
Действительно надо попробовать так сделать.
Действительно надо попробовать так сделать.
Тут не совсем понятно, что хотел автор. Если у него гетерогенный контейнер (т.е. хранит элементы различного типа), то тогда у него только одна дорога - использовать в том или ином виде виртуальные функции (в базовом классе). Иначе, поскольку в STL нет гетерогенных контейнеров, а значит информация о типе утрачивается при присваивании элементу контейнера, ему придётся придумывать собственный механизм определения типа элемента контейнера (в случае механизма виртуальных функций это сделает за него компилятор).
С другой стороны, если в каждом контейнера хранятся элементы только одно типа (для чего они в общем и предназначены - компромисс ради эффективности), и ему просто нужно создать "по экземпляру под каждый тип".
то ему помогут шаблоны (которые, разумеется, создадут по экземпляру под каждый используемый в программе тип).
Хотя, здесь код выглядит странновато - не видно объявления и определения Сlass1. Слова же "он статический" из такого контекста на позволяет понять, что это - использование (вызов) статического метода (и обращение потом к статическим полям), или же вызов метода экземпляра (где-то выше созданного) с именем Class1 ...
С другой стороны, если в каждом контейнера хранятся элементы только одно типа (для чего они в общем и предназначены - компромисс ради эффективности), и ему просто нужно создать "по экземпляру под каждый тип".
то ему помогут шаблоны (которые, разумеется, создадут по экземпляру под каждый используемый в программе тип).
Хотя, здесь код выглядит странновато - не видно объявления и определения Сlass1. Слова же "он статический" из такого контекста на позволяет понять, что это - использование (вызов) статического метода (и обращение потом к статическим полям), или же вызов метода экземпляра (где-то выше созданного) с именем Class1 ...
BagaBaga, спасибо за ответ. Я только начинаю программировать, поэтому не все было понятно в сказанном Вами. Уверен это все есть в учебниках и в статьях в интернете, поэтому в комментариях наверное нет необходимости. По возможности проштудирую.
Экземпляры классов я не создаю, в моей программе пока в этом нет необходимости, потому как классы созданы для одной сущности, но с разными параметрами, к которым я обращаюсь без создания экземпляра через статические поля и методы.
Экземпляры классов я не создаю, в моей программе пока в этом нет необходимости, потому как классы созданы для одной сущности, но с разными параметрами, к которым я обращаюсь без создания экземпляра через статические поля и методы.
moneybro, по вашему последнему ответу у меня несколько пунктов:
1) Лучше почитать Страуструпа, у него есть "учебник" Programming -- Principles and Practice Using C++ , http://www.stroustrup.com/programming.html . Русский перевод тоже сойдёт. После этого можно (если нужно) будет обратиться к The C++ Programming Language (4th Edition)
2) Для ваше задачи лучше подходит наследование, с вынесением общего интерфейса в базовый класс.
3) Шаблоны вряд ли помогут, хотя их можно (но не нужно) для этого приспособить.
4) То, как вы используете классы, скорее говорит о плохом дизайне. С другой стороны, если вы только учитесь (т.е. это учебная задача), то и шишки будут полезны.
1) Лучше почитать Страуструпа, у него есть "учебник" Programming -- Principles and Practice Using C++ , http://www.stroustrup.com/programming.html . Русский перевод тоже сойдёт. После этого можно (если нужно) будет обратиться к The C++ Programming Language (4th Edition)
2) Для ваше задачи лучше подходит наследование, с вынесением общего интерфейса в базовый класс.
3) Шаблоны вряд ли помогут, хотя их можно (но не нужно) для этого приспособить.
4) То, как вы используете классы, скорее говорит о плохом дизайне. С другой стороны, если вы только учитесь (т.е. это учебная задача), то и шишки будут полезны.
moneybro
Цитата:
Со статическим методом так не получится, т.к. статический метод класса - это практически отдельная функция, не имеющая (почти) никакого отношения к конкретному объекту. Для доступа к данным конкретного объекта из статической функции нужно явно передавать указатель на объект в параметрах статической функции.
Как Вам уже посоветовал panda3 и BagaBaga - лучше использовать полиморфизм и наследование.
Вот пример.
Идея такая: создаёте базовый класс с виртуальными (не статическими) функциями, можно даже чисто виртуальные функции использовать в базовом классе. Создаёте классы-потомки от этого базового класса, в каждом из которых переопределяете виртуальные функции (главное, чтобы возвращаемое значение и список аргументов были одинаковыми у всех виртуальных функций с данным именем). Потом создаёте массив указателей на базовый класс (или используйте контейнеры, но начать я бы вам советовал с обычного массива). Заполняете массив указателей адресами на ваши созданные разношёрстные (разнотипные) объекты, и используйте обычный
Код: [no]for(i=0;i<10;i++){obj[i]->my_functon(int par);}[/no]
Цитата:
Так вот очень хочется каким-то образом обратиться к методу нужного класса. Подскажите пожалуйста как это сделать. Метод статический.
Со статическим методом так не получится, т.к. статический метод класса - это практически отдельная функция, не имеющая (почти) никакого отношения к конкретному объекту. Для доступа к данным конкретного объекта из статической функции нужно явно передавать указатель на объект в параметрах статической функции.
Как Вам уже посоветовал panda3 и BagaBaga - лучше использовать полиморфизм и наследование.
Вот пример.
Идея такая: создаёте базовый класс с виртуальными (не статическими) функциями, можно даже чисто виртуальные функции использовать в базовом классе. Создаёте классы-потомки от этого базового класса, в каждом из которых переопределяете виртуальные функции (главное, чтобы возвращаемое значение и список аргументов были одинаковыми у всех виртуальных функций с данным именем). Потом создаёте массив указателей на базовый класс (или используйте контейнеры, но начать я бы вам советовал с обычного массива). Заполняете массив указателей адресами на ваши созданные разношёрстные (разнотипные) объекты, и используйте обычный
Код: [no]for(i=0;i<10;i++){obj[i]->my_functon(int par);}[/no]
упс, не та тема
http://pastebin.com/UbPdWm1h
Компилирую этот код в DLL, пишет ошибка в строке 40 и вызов функции не работает.
Цитата:
Если компилирую как EXE, немного переделав, то вывод работает. Вроде беру пример из предыдущего рабочего примера.
Компилирую этот код в DLL, пишет ошибка в строке 40 и вызов функции не работает.
Цитата:
\main.cpp|40|warning: suggest parentheses around assignment used as truth value [-Wparentheses]|
||=== Build finished: 0 errors, 1 warnings (0 minutes, 1 seconds) ===|
Если компилирую как EXE, немного переделав, то вывод работает. Вроде беру пример из предыдущего рабочего примера.
AZJIO
Цитата:
Это не ошибка, а предупреждение. Деликатный такой намёк на то, что в операторе if() почему-то прописано присваивание вместо сравнения.
Цитата:
Компилирую этот код в DLL, пишет ошибка в строке 40 и вызов функции не работает.
Это не ошибка, а предупреждение. Деликатный такой намёк на то, что в операторе if() почему-то прописано присваивание вместо сравнения.
Здравствуйте. У меня тут вопрос. Вот код:
Код:
char file_content[100];
ifstream f;
f.open("file.txt");
f.read(file_content, 100);
cout<<file_content;
Код:
char file_content[100];
ifstream f;
f.open("file.txt");
f.read(file_content, 100);
cout<<file_content;
А если перед f.read() добавить memset(file_content, 0, sizeof(file_content)); ?
Или ещё лучше
f.read(file_content, f.sizeOfFile); //или что там ещё у плюсов?
file_content[f.sizeOfFile] = 0;
Или ещё лучше
f.read(file_content, f.sizeOfFile); //или что там ещё у плюсов?
file_content[f.sizeOfFile] = 0;
по-моему, проще сразу:
char file_content[100] = {0};
char file_content[100] = {0};
ne_viens
akaGM
Я не пользуюсь стримами, но по аналогии с stdio разве не надо отводить 1 лишний байт для завершающего нуля? (если читаешь 100, будь любезен выделить 101 байт, поставив 0x00 в конце)
akaGM
Я не пользуюсь стримами, но по аналогии с stdio разве не надо отводить 1 лишний байт для завершающего нуля? (если читаешь 100, будь любезен выделить 101 байт, поставив 0x00 в конце)
Это только в случае, если читаемая строка занимает 100 байтов.
В случаях, когда добавляет абракадабру, строка обычно короче.
В случаях, когда добавляет абракадабру, строка обычно короче.
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
Предыдущая тема: не знаю как назвать тему :-)
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.