Страницы: Пред. 1 2 3 4 5 6 7 След.
RSS
Возможности разработки взаимодействия с БД (выбор инструментов), Javascript ИЛИ VBScript
 
благодарю... даже равно можно перегрузить... ничего себе..  :(
===
а про С - после прочтения  книги - Техника оптимизации программ. Эффективное использование памяти - Касперски К.
Цитата
bedvit написал: Си-строки самые быстрые.
возникает вопрос? по фрагменту книги (картинкой)  :qstn:
как же так?

может всё-таки BSTR выгоднее?
Код
BSTR (Basic STRing). Этот тип представляет из себя строку, в начале которой указана ее длина

или в написании кода на С есть какие-то ходы конями кроме постоянного измерения sizeof?
Изменено: JeyCi - 13.08.2019 16:33:28
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Зачем вам постоянно измерять длину строки? ее вы и так знаете, если создали, или получили длину извне, в самом крайнем случает один раз определили вначале кода. C-строки я могу менять прямо на месте, BSTR- неизменяемы. Однажды, создав строку, мы больше не можем ее изменить (честным способом). Особенности строк в .NET
Это разговор безпредметный. Алгоритм и инструменты определяются под задачу. К примеру в библиотеке СОМ, я могу пользоваться только BSTR, технология это четко регламентирует. Внутри кода - чем угодно, но опять это определяется эффективностью.
«Бритва Оккама» или «Принцип Калашникова»?
 
ok... спасибо за нюансы [значит BSTR - это ссылочный тип]... просто подумываю о парсинге json'ов (для загрузки потом в бд)... в принципе в Ultimate++ парсится без проблем - там какая-то библиотека для json есть... но, конечно, над архитектурой ещё подумать надо... а над быстродействием думаю всегда 8)
p.s.
хотя, конечно, если потом разные json ещё и join'ить надо -- то всё-таки для этих целей, наверно, лучше C# с его LINQ'ом... имхо...
спасибо, что помогаете копать вглубь проблемы и инструментов...
p.p.s
а в string C++ - с изменениями строк проблем нет? - мы ведь сами: если хотим - то используем указатель (значит можем и изменить то, куда указывает), если хотим - используем ссылку (тут, наверно, менять объект на который ссылаемся сложнее?)... хотя да - можно нарваться и на непредвиденности при неправильной передаче ссылки в функцию - вроде отметила это несколькими постами выше...
N.B.
BSTR - ! отдельная история [и можно обратить внимание на др линки отсюда]... и здесь... и здесь... и здесь
Изменено: JeyCi - 16.09.2019 09:21:23
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
а в string C++ - с изменениями строк проблем нет?
std::string? Это класс-обертка над С-строками. Там много методов и свойств. Можно работать и напрямую, хотя класс говорит о том, что работать с std::string нужно через свойства и методы. Это проще и почти также эффективно.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
JeyCi написал: в string C++ - с изменениями строк проблем нет?
как-то так - Строки С++
Изменено: JeyCi - 14.08.2019 08:35:07
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
char Array и строка из файла - кодом как-то так... (хотя т.к. нет входящих параметров - то можно main и void объявить)... незакомментированные коды работают...
Скрытый текст

а для модификаций, например, объекта класса std::vector использовать различные функции-члены класса(контейнера)... или для некоторых контейнеров смотреть алгоритмы, реализованные в stl библиотеке...
p.s.
Цитата
bedvit написал: хотя класс говорит о том, что работать с std::string нужно через свойства и методы
- а это уже на перспективу :) - спасибо за предупреждение...  ещё не забыть добавить строки выделения динамич. памяти в куче (new, delete) - в конструкторе - new, деструкторе - delete...
p.p.s.
references здесь можно посмотреть какие-то, а то не во всех ide в help'e можно найти... или cppreference.com
Изменено: JeyCi - 16.08.2019 06:58:52
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал: библ std - использовать различные функции-члены класса(контейнера)... или для некоторых контейнеров смотреть алгоритмы, реализованные в stl библиотеке...
- это смотрю, чтобы реализовать изменения в переменной, сортировку и иные действия с контейнером...
НО Всё-таки оставлю пару линков, для обозначения проблемы... памяти...
Урок №79. Строки C-style
есть массивы, размер которых можно изменять (std::vector)
есть пример vector.resize(sz)
стоит отметить:
например, используя строку в C-style, aka массив символов, - при вставке нового слова получаем нехватку  :excl:  выделенной памяти, и надобность выделить ещё; насколько понимаю доп память выделяется в хвост массива, а вставляем, например в середину - вопрос Как сдвинуть - хотя если используем vector, как контейнер, то проблем с вставкой не должно быть - всё сдвигается само, как надо...  :qstn: но проблема дополнительного выделения памяти полагаю остаётся требующей решения - наверно, как-то так?? :
Добавление памяти динамическому массиву  ... и здесь он же...
?? или если понадобиться доп. выделенение памяти для др. случаев...
или в С - realloc? - хотя не совсем?...
и ещё вариант добавления памяти - с перекладкой в новый массив - не думаю, что это лучший вариант... имхо
p.s.
висяки и утечки памяти
p.p.s
хотя на безрыбье - и Урок №206. Вставка символов и строк в std::string
Изменено: JeyCi - 16.08.2019 16:49:10
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
значит всё-таки realloc - и именно на размер в байтах:
Функция realloc
std::realloc
realloc
примеры:
Код
// http://www.c-cpp.ru/content/realloc
char *p;
 p = (char *) malloc(17);
 p = (char *) realloc (p,18);

=========== или др пример

a=malloc(1000*sizeof(struct));
b=realloc(a, 2000*sizeof(struct));
p.s.
не забывая, что vector - это по сути динамический массив, который можно изменять... в отличие от array - массив, который просто так не изменить (только создать новый)...
p.p.s.
:excl: а ещё лучше new[] - создающий массив объектов, каждый из которых создаётся конструктором...
Изменено: JeyCi - 23.08.2019 17:12:14
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
p.s. (в совокупности с предыдущим постом)
Borland - резервирование памяти при неизвестном размере файла
Borland - Определение перечня файлов в каталогах
так, наверно, и можно прочитать все файлы в папке - каждый раз увеличивая размер выделяемой памяти под взятие в буфер данных из каждого файла... имхо... скорость ещё не проверяла... линки для истории
p.s.
хотя брать из сети json'ы и парсить их всё равно на std и stl C++ никак - надо искать доп. библы...
или проще, возможно, делать http-запросы через C# и парсить с помощью JSON.NET в нём же (С#)...
(хотя не очень люблю чужие библиотеки, которые ещё и update'ятся не собой)
Изменено: JeyCi - 21.08.2019 12:44:42
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
всё-таки спасибо to bedvit !!! теперь с лёгкостью читаются Документация и Спецификация по языку, как и примеры на форумах... осталось изучать и применять...
Изменено: JeyCi - 19.08.2019 08:40:39
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
p.s.
Borland, как RAD среда, конечно, имеет VCL (для разработки Windows приложений, для разработки кросс-платформенных приложений нужны библы CLX - ещё и под linux чтобы работало приложение)... aka визуальные компоненты - что очень удобно... как впрочем и WPF в VS...
но с Build этапом есть неудобства (а может пока незнакомство - и следовательно пока ещё неумение выстраивать правильную архитектуру проекта приложения для последующего построения)... просто всё создаётся и работает в среде (OS), где установлен Borland (значит в системе есть все нужные библы)... на чистой системе не работает - просит библы - сами по себе они не устанавливаются (или устанавливаются криво), только в составе с Borland... пока что так...
--> чтобы создать installer - нужна др софтина - InstallShield Express... но можно и Inno Setup... - для сложных проектов...
--> или можно попробовать для более  простых
Цитата
Отключите в настройках проекта:
•Project->Options->Linker->Use dynamic RTL
•Project->Options->Packages->Build with runtime packages
Изменено: JeyCi - 21.08.2019 12:40:34
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал: правильную архитектуру проекта
здесь
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
bedvit написал: Это не секрет.Вот код.
к #118:
наверно, по-тиху начинаю понимать - по сути вы выложили Класс, и надо просто написать ? интерфейс IUnknown (aka  таблица виртуальных методов) для взаимодействия с приложением... - чтобы скомпилировать рабочий COM... IDispatch уже есть (для передачи параметров)
P.S.
что в принципе вы уже и реализовали... там по линку на cyber... - спасибо!.. чтобы сортировать на стороне клиента - т.е. кода (пример),берущего RS из Access - самое то (чтоб не тормозил Access'ный Order By)... а на сервере и родная Order By вроде справляется с сортировкой с приемлемой скоростью... только задать индексацию полей правильно... имхо
Изменено: JeyCi - 25.08.2019 11:01:28
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
P.S.
Цитата
pharmaprofi написал: В моем примере это web приложение asp. серверная часть написана на C# и там лежит логика работы с базой. Вероятно, что эта часть может быть написана на любом языке, но для работы нужен web сервер, на котором будет работать это приложения. (для .net это IIS).Выглядит это примерно так: клиентская часть jquery
помню когда-то устанавливала какую-то VS - и installer просил много птиц проставить - а я тогда ещё не знала, что надо, а что нет... думала, чего забыла - например IIS... переустанавливать всёёё было жалко времени (и казалось, что места на диске С не хватает - ещё и partition C: изменять)... Вспомнила!!! - я тогда ставила что-то другое (то ли vs2005 то ли vs2008)... - где было много птиц... потом в итоге установила vs2010 и прошло много времени - забыла... знакомясь с примером от pharmaprofi из #23 - думала, что IIS у меня птицей не был проставлен - смотрела проект руками... всё оказалось намного проще в vs2010, которая уже стоит, - там всего-то ставишь птицу на разработке web-приложений в придачу к c#, например, - и ставится/добавляется всё что надо... без безумного количества незнакомых птиц...  8)  вспомнила - легче стало...
===
pharmaprofi, ещё раз спасибо за ваш пример ещё тогда - уже полистала книгу про ajax и NET... если придётся с сервером в web - буду знать, с чего начинать...
Изменено: JeyCi - 10.09.2019 18:50:27
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал: уже полистала книгу про ajax и NET...
т.е. по факту стало очевидно, что
Ajax - для взаимодействия (запросов к данным) в рамках 1-го сервера!.. путём js-функций Calling И Callback для запуска WebMethod'a, созданного в Web-Service'е на web-сервере...
xmlHttpRequest - для запросов с другого (клиентского) сервера... т.е. даже если создадм свой web-сервер, то взять данные от своих партнёров (с их сервера) можно только таким макаром... (ajax и ASP.NET тут не помощники)... имхо
Изменено: JeyCi - 11.09.2019 08:48:16
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал: правильную архитектуру проекта
1) c архитектурой COM - начала отсюда - How To Do COM In C++Builder 5
2) подробности для диспетчеризации (передачи параметров) - Интерфейс IDispatch...
(и содержание сайта пройтись по линкам) - т.к. Дисп-интерфейс когда сделала - настроилось ок позднее связывание... вообще после 0172-0182 разделов - Архитектура, которую выстраивает ATL, проясняется... (особенно 177 - чтобы понять откуда может выпасть ошибка "cannot create instance of abstract class CComObject.." -кстати в header'e _TLB моя функция и стала virtual, как сделала DispInterface и внесла правки в header моегоИнтерфейса) - и тут ещё раз вспомнила о Наследовании... и остаётся только писать логику в своём интерфейсе (который, как уже было сказано здесь, будучи виртуальным, переопределяется в QueryInterface() для взаимодействия с клиентом... насколько помню  :oops: внесла изменения лишь (1) в COM_MAP header'a реализации своего тестового интерфейса и (2) в класс class ATL_NO_VTABLE TmyVBAImpl добавила public IDispatchImpl<ImyVBA, &IID_ImyVBA, &LIBID_myEntry> руками и (3) в TypeLibrary конструкторе в мойИнтерфейс поставила dual, oleautomation - и то, наверно, потому, что делала COMobject, а наверно нужен был Automation object - чтобы сама IDE настраивала все внутренности, как надо...имхо... и вышла в VBA Офиса...... др. изменений в пары файлов _ATL, _TLB не понадобилось (в них, кстати основное в header'ах), только реализация в _Impl (т.е. сам свой интерфейс)
3) ActiveX по шагам- начиная с Шаг 19 - Функции API, работающие с вариантами
4) здесь можно взять всю книгу - Роджерсон Д. - Основы COM - 2000_pdf
5) Интересности по COM_doc
===
в Borland'е на BSTR всё работает (при передаче VARIANT, потом SafeArray, потом в <BSTR>вектор для обработки массива и обратно в тот же VARIANT* для вывода на клиент)... простенький тест для std::sort 1x array'я тестировала...
подробности VisualC++ есть по линкам (2)... - что-то по Архитектуре подобно для VisualStudio (т.е. разнообразие "модулей-файлов")... т.е. лучше понимать все внутренности...
но на Borland'e достаточно легко делается COM простенький - с первого взгляда... правда отсутствие (в 6-й версии) обёрток для BSTR и VARIANT (которые даёт Microsoft в своих продуктах) - пока ещё сильно вынуждает подумать, как выкручиваться...
===
и разобраться с VARIANT массивом с разными типами данных в полях остаётся... точнее, как их маршаллировать...
хотя наш VBA-шный Variant - это и их std::vector-ный Variant может быть, по логике...
тогда для 1х массива (по мотивам кода от bedvit)
Borland - простенькая сортировка так

и в комментах здесь - о лексикографическом сравнении std::string И сравнении с-строк (N.B. сравнение указателей)...
===
так можно расковырять внутренности COM (даже на старом добром Borland'е, линк был выше на него)...
и Автоматизировать иные задачи при работе с БД (не имея нужного/желаемого функционала, например, на сервере или в Access)... замечательный пример (уже откомпилированный) был рассмотрен в соседней ветке... правда создавался на VisualStudio от Microsoft (поэтому и wrraper Classes для BSTR & VARIANT там по коду были задействованы)... - хочется лишь отметить нюансы выбора обёртки...
===
вот такие стартовые пункты для знакомства с COM - кому хочется автоматизировать ещё многое, что не автоматизировано в их софте... смотрела С++, но логика COM, наверно, универсальна - хоть С++ ложи в основу сервера, хоть С#, хоть что ещё... имхо
Изменено: JeyCi - 21.10.2019 18:48:15 (линк на SafeArray microsoft.support)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
СОМ - тема довольно не простая, как мне показалась вначале, но путь осилит идущий... если вы решили заняться СОМ - тема очень интересная и довольно востребована. СОМ используется довольно широко.
Уже и сортировку написали, плюсую. Вместо std::sort можно использовать вариант побыстрее - concurrency::parallel_buffered_sort, заголовочный файл не забудьте #include <ppl.h>
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, благодарю - всё вашими стараниями и подсказками...  
8) поставили меня на лыжи (у нас ещё первый снег не выпал)...
главное - начало уже положено!..
(отрезюмировала свои ошибки, с которыми встретилась на старте... а как эти нюансы разрулишь и поймёшь - остаётся только реализацию своего интерфейса писать)... и, конечно же, дальше шлифовать своё понимание, ошибки и опыт...
:) ещё предстоит знакомство с VisualStudio... но теперь, понимая, основные нюансы COM'а и памяти C++ (с ваших подсказок) - уже есть, куда двигаться и справку и форумы и иную инфо читать более осознанно...
thanks a lot
p.s.
в 6-м Borland'е concurrency::parallel_buffered_sort вроде нет ещё (или библу надо найти и подключить - но там есть нюансы по совместимости библиотек от Microsoft и написанных на Borland - буду ковырять)... на смену ему (Borland Builder) вроде пришёл RAD Studio...  но попробую в свободное время поковырять VisualStudio (раз уж поставила)
Изменено: JeyCi - 26.10.2019 18:47:55
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал: ?? или если понадобиться доп. выделенение памяти для др. случаев...
Цитата
JeyCi написал: значит всё-таки realloc - и именно на размер в байтах:
и отмечу [теперь уже перефразирую] нюанс Памяти меня мучавший ещё тогда... на всякий случай - нюанс для DLL... с учётом того, что Память выделяет вызывающая сторона (обсуждение здесь)
- вот и выход (в книге Гетца Программирование для MS Office. Полное руководство... 1999, Киев 765с. - в сети не нашла - линка не оставлю):
Цитата
Поскольку функция DLL из, в качестве примера, почти любая Windows API функция принимает LPSTR-строку, которую нельзя изменить по размеру (но можно лишь модифицировать) - следовательно, строка должна быть достаточно длинной для того, чтобы в ней поместились возвращаемые данные. Это означает, что вы должны заполнить строку достаточным количеством символов, чтобы создать буфер для заполнения функцией DLL. Обычно буфер создаётся с помощью функции Space$.DLL не должна записывать данные за пределы строки, поскольку это приведёт к ошибке общей защиты памяти. Функции DLL, модифицирующие строки, обычно требуют задания второго аргумента, который указывает, сколько места выделено для строки.
- вот тут, наверно, и приходит на помощь - BSTR... (где сначала указан размер строки в 1-ых 4х байтах, и лишь потом сама строка, при этом читается лишь сама строка)...
понятное дело, что мы можем написать аргумент [in] и/или [out], вводимые нами в наши функции наших DLL (не Windows API) - любого удобного нам типа данных...
Цитата
- рекомендации для строк в COM - BSTR...
НО проблему памяти всё равно надо как-то разруливать на входе... и описанный вариант - для ситуации, когда выходной string по размеру больше входного string'a (т.е. BSTR'а) - кажется единственным логически самым правильным... пока альтернатив не вижу более достойных...
хотя выделить достаточное количество Space$'ов, чтобы всегда хватило при любых ! обстоятельствах (размерах выходной строки) - тоже фиксировано разработчиком... и в реал. жизни может не хватить 1 байта на очень длинной выходной строке (не вмещающейся в отведённый лимит Space$'ов)... мелочь, а неприятно будет...
==
? или всё-таки в случае с BSTR - выход как раз и заключается в том, что вводим строку ПО ССЫЛКЕ и в качестве BSTR ... и ? при выводе новой (более длинной) строки из функции DLL'я - ложим результат опять в этот указатель, если параметр [in, out] или в новый указатель, если параметр только выходной [out] -- и как раз в самом BSTR в начале и указан нужный размер...
НО вопрос остаётся - КТО во втором случае очищает память ?? - не может ли здесь появиться мест потенциальных утечек ?? или нехватки памяти ?? и какими механизмами это регулируется ??
или BSTR'а достаточно ??... и не надо извращений с Space$'ами (как для LPSTR-строк в качестве параметров) ?
Изменено: JeyCi - 23.10.2019 14:27:48
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
когда выходной string по размеру больше входного string'a (т.е. BSTR'а) - кажется единственным логически самым правильным... пока альтернатив не вижу более достойных...
нужно передавать по указателю.
Цитата
JeyCi написал:
НО вопрос остаётся - КТО во втором случае очищает память ??
Выделение и освобождение памяти для BSTR
Цитата
При создании BSTRи передаче их между объектами COM необходимо соблюдать осторожность при обработке используемой ими памяти, чтобы избежать утечек памяти. Когда элемент BSTR остается в интерфейсе, необходимо освободить его память по завершении. Однако, когда BSTR передается из интерфейса, принимающий объект отвечает за управление памятью.
Или использовать _bstr_t - это класс-оболочка, который работает как интеллектуальный указатель, поэтому он освобождает выделенную память при уничтожении переменной или выходе из нее. _bstr_t также имеет подсчет ссылок, который увеличивается каждый раз, когда вы передаете переменную _bstr_t по значению (избегая ненужной копии) и уменьшаетесь, когда он больше не используется. Всякий раз, когда все ссылки уничтожаются, выделенная память для строки освобождается.
Альтернативой BSTR является CComBSTR. Он также управляет памятью для BSTR, но не имеет подсчета ссылок.
«Бритва Оккама» или «Принцип Калашникова»?
 
ознакомилась, но (коммент последнего примера)
Цитата
// The client is now responsible for freeing pbstr.
сразу возник вопрос - разве VBA умеет освобождать память?...
хотя и ответ вспомнился  :oops: -
освобождает, как только удаляется переменная или объект...
===
вот она - народная мудрость -
Цитата
всегда обнуляйте переменные !!!
bedvit, спасибо  :)
Изменено: JeyCi - 23.10.2019 12:23:00
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
bedvit написал: CComBSTR. Он также управляет памятью для BSTR, но не имеет подсчета ссылок.
если не секрет? - там где вы нашли утечки при работе с VARIANT - это, может, было связано с тем что CComVariant тоже не считает ссылки ?? значит искать в IDE, как вы описывали...
Изменено: JeyCi - 23.10.2019 12:31:05
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
сразу возник вопрос - разве VBA умеет освобождать память?...
умеет, но не программистом. Тип данных String сам управляет памятью. Вы же на VBA не выделяете вручную память для строки? Соответственно и удалять руками не нужно :)
Да были утечки. Сейчас без утечек код выглядит так:
Скрытый текст

Можете сравнить с предыдущим, посмотреть отличия (с CComBSTR перешел на _bstr_t ).
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, спасибо вам !!!  :excl:  ещё раз... прямо целым кодом...
вот видела, что надо быть осторожными при работе с BSTR
===
Цитата
bedvit написал: Тип данных String сам управляет памятью
- значит вот почему регламентировано использовать конструктор и деструктор для него...
===
Цитата
bedvit написал:
Или использовать _bstr_t - это класс-оболочка, который работает как интеллектуальный указатель, поэтому он освобождает выделенную память при уничтожении переменной или выходе из нее.
по smart pointers - тоже видела ++  в п.4 моего #136...
Цитата
Самое замечательное в примерах со смарт-указателями - то, что нам не нужно помнить о вызовах Release - когда поток управления выходит из области действия smart-указателя, деструктор последнего автоматически вызывает Release...
даже какие-то -- есть по бесконтрольному использованию смарт-указателей (в сети можно найти)... но обёртка bstr_t всё-таки делалась мелкомягкими - значит толкОво...
Цитата
bedvit написал: (с CComBSTR перешел на _bstr_t ).
- это из-за природы обёртки или ради творческого интереса ??
обязательно почитаю, сравню, изучу...  :idea:
в Borland'e без оболочек (wrapper classes) ещё не совсем уверенно пишу тестово... мало ли какие баги потом повылазят... но в принципе всё приходит с опытом... и баги тоже  :)
Изменено: JeyCi - 23.10.2019 14:09:13
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
- это из-за природы обёртки или ради творческого интереса ??
Мне больше понравился механизм управление памятью.
Цитата
bedvit написал:
в Borland'e без оболочек (wrapper classes) ещё не совсем уверенно пишу тестово...
можно писать и без оболочек. Ручками выделяя и освобождая, где нужно, память.
Изменено: bedvit - 23.10.2019 15:26:57
«Бритва Оккама» или «Принцип Калашникова»?
 
ok... буду изучать дальше
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
не могу пройти мимо - оставлю пару линков:
Почему чтение строк из stdin происходит намного медленнее на C++, чем Python?
Почему расщепление строки медленнее на C++, чем на Python?
---
насколько заметно беглым взглядом - всё как всегда - зависит от алгоритма... может и не стоит делать такие категоричные заявления, как названия этих статей?... но если у кого есть такие радикальные впечатления из личного опыта - интересно было бы услышать отзыв... может и Python стоит завернуть в COM?... например для парсинга json когда-нибудь  8) ... хотя есть соотв библа и в C++ (в RAD Studio)... всё-таки компилируемый язык всегда лучше, чем интерпретируемый... имхо
---
:oops: решила оставить этот пост для раздумий о вечном...
p.s.
Пишем изящный парсер (JSON файлов) на Питоне - в комментах интереснее...
Python и Excel: примеры работы с win32com.client - сам Excel и может быть COM'ом... т.е. им можно пользоваться из Python... вместо того, чтобы Python'ом из Excel... а для загрузки json'ов по линкам из книги и парсинга Python'ом   8)  так и без разницы откуда куда... и результат записывать или в книгу или в txt/csv... а оттуда и экспорт в Access или на Server проще... (чем из json)...
Интеграция MS Excel и Python - а можно и Python'ом из Excel (- access to Python scripts from Excel VBA)...
[вобщем чуть что - Америку изобретать не надо]...
p.p.s.
и для старта - Python. Урок 14. Классы и объекты
p.p.p.s.
повторюсь - всё равно компилируемый язык лучше интерпретируемого... (т.к. последний работает на чужих библах, которые могут отживать свой век, а первый на своём родном машинном коде - после компиляции)... имхо
Изменено: JeyCi - 27.10.2019 17:31:23
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
Почему чтение строк из stdin происходит намного медленнее на C++, чем Python? Почему расщепление строки медленнее на C++, чем на Python?
По-моему, это очередная борьба со здравым смыслом. Отсутствие комментариев, тоже не добавляет объективности. Обычно такие статьи не рассматриваю как серьезные.
Цитата
JeyCi написал:
Интеграция MS Excel и Python  - а можно и Python'ом из Excel
- интересная возможность. Так же интересны плюсы/минусы данного подхода.
Изменено: bedvit - 28.10.2019 14:43:19
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал: Обычно такие статьи не рассматриваю как серьезные.
bedvit спасибо за впечатления... обычно на первых порах сложно различать рекламные статьи и практико-ориентированные... всегда важно услышать впечатления людей компетентных...
но плюсами Python'a заметила
import asyncio - версии от 3,5
import aiohttp
import json
- модули... которые могут облегчить подгрузку и парсинг json'ов из сети для дальнейшей записи в БД... на досуге попробую, а то PowerQuery (возможно ввиду своей функциональной рекурсивной природы) скоростью на больших объёмах и скромном железе не впечатляет... если не дорасту до COM'а на C++ для этих целей... то на скорую руку можно и Python'а попробовать... тоже интересный совет встретился в статье по асинхронности -
Цитата
Если вы не пишете фреймворк или библиотеку, вам никогда не нужно трогать API низкого уровня.
в той же статье - о многопоточности у Python'a - есть нюансы
Цитата
Потоки Python являются параллельными (concurrent) – несколько последовательностей машинного кода выполняются в перекрывающихся временных рамках. Но в реальности они не параллельны – выполнение не происходит одновременно на нескольких физических ядрах.
Основными недостатками потоков Python являются безопасность памяти (memory safety) и состояние гонки (race conditions). Все дочерние потоки родительского процесса работают в одном и том же пространстве общей памяти. Без дополнительных средств защиты один поток может перезаписать общее значение в памяти, и другие потоки об этом не узнают.
в связи с этим, честно говоря - слово concurrent(concurrency) нАчало настораживать
Цитата
bedvit написал: Вместо std::sort можно использовать вариант побыстрее - concurrency::parallel_buffered_sort, заголовочный файл не забудьте #include  
но надеюсь, в С++ это слово не приобретает такой грустный скрытый подтекст?..  :qstn:
p.s.
в любом случае, своя библиотека всегда ближе к делу, чем чужие... хотя пишутся они в любом случае на чужих (надо ведь на чём-то писать)... - просто очередное доказательство важности изучения документации и спецификации по языку вместо бездумного его использования...  :D а самое интересное наступает - когда "ещё не задокументировали", а язык уже в полном ходу у разработчика...  :oops: поэтому всегда с осторожностью отношусь к новым release'ам...
p.p.s
хотя уже и JavaScript API для Office 2016 есть (но как говорят - он "inmature" пока)... поэтому пока не рискну с головой ударяться в тестирование его скорости (например, для парсинга json) по сравнению с PQ... по сути ведь и JS дружит с JSON... время однако... а так понравился С++ пока - только вычищать память учусь (думаю, вычистить от того std::vector в моём коде выше или std сама его удаляет при выходе из COM??..  :qstn:
8) при знакомстве с низкоуровневым языком - хочется чистить всё  :excl:  ... (всё-таки уровень С++ ниже уровня С#)
Изменено: JeyCi - 28.10.2019 18:53:59
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
всегда важно услышать впечатления людей компетентных...
в языке Python я не компетентен, просто статьи "в одни ворота" всегда настораживают (без комментариев специалистов с разных сторон).
Цитата
JeyCi написал:
race conditions
это плохо.
Цитата
JeyCi написал:
С++ это слово не приобретает такой грустный скрытый подтекст
в С++ все ответственность на программисте, язык позволяет почти все.
Реализовав мультипоточное вычисление с общими глобальными переменными, нужно позаботится о синхронизации потоков и потокобезопасности этих переменных. Есть разные инструменты - Критические секции, Взаимоисключения(Объекты-взаимоисключения (мьютексы, mutex - от MUTual EXclusion)), События, Семафоры, использование атомарных переменных С++ и функций и т.д.
Я пользовался Критическими секциями
Код
CRITICAL_SECTION cs;//объявляем
EnterCriticalSection(&cs);//открываем
LeaveCriticalSection(&cs);//закрываем

concurrency::parallel_buffered_sort - это просто метод сортировки нужного массива, массив вы сами создаете и управляете памятью тоже сами (вручную или автоматически - контейнеры стандартной библиотеки  std::).  
std::vector сам управляет памятью.
Здесь есть важное правило, если вы выделяете память: NEW (malloc), вы должны ее и освободить: delete (free), если не передаете по указателю за пределы библиотеки. В таком случае освободить память должна вызывающая сторона (пользователь вашей библиотеки). Это должно быть явно прописано в спецификации.
Изменено: bedvit - 28.10.2019 21:31:14
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: Пред. 1 2 3 4 5 6 7 След.
Наверх