Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/56: Рейтинг темы: голосов - 56, средняя оценка - 4.54
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443

Быстрый старт в изучении C++ для относительно опытных программистов Basic

18.04.2020, 16:11. Показов 14868. Ответов 253

Студворк — интернет-сервис помощи студентам
В этой ветке предлагаю обсуждать сходства и различия между C++ и Visual Basic.
Ну хотя бы для упрощения процесса изучения параллельного (дополнительного) языка для тех, кто уже относительно неплохо знаком с Visual Basic.
Ну просто как-то "не вкусно" начинать изучение совсем уж с нуля, когда, в принципе, уже и без того много знаешь (циклы, ветвления, указатели, видимость переменных ... ).

На самом деле, начал сейчас просмортр на ютубе курса по C++. Дядька очень толково и понятно всё объясняет, явно есть у него талант хорошего преподавателя.

Самые первые отличия, которые бросились в глаза, это:
- комменты обозначают двумя косыми чертами вместо апострофа,
- в конце каждой строки точка с запятой,
- все процедуры, функции, "тела" циклов ... в фигурных скобках,
- вложенные циклы можно описывать одной строкой,
- если переменная объявлена, но ей не присвоено значение, то она содержит случайный "мусор" из памяти, а не как у нас в бейсике, где сразу получает значение ноль или пустую строку,
- массивы с квадратными скобками вместо круглых,
- область видимости переменных ограничена фигурными скобками и причём неважно функция это, цикл или "тело" функции IF, а не как у нас область видимости переменных ограничена только функциями и процедурами.

Ветка открытая, пишите кто хочет.
Особенно приветствуются советы опытных специалистов, уже овладевших несколькими языками.
Ну уж им-то гораздо виднее, в чём сходство и различие разных языков.

Сказать по правде, лично мне сейчас C++ и его младший брат нужны, главным образом, для удобства изучения материалов MSDN.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.04.2020, 16:11
Ответы с готовыми решениями:

предложение для опытных программистов
добрый день уважаемые госпда программисты - необходима помощь по выполнению лабораторных по предмету Операционные Системы. Ищу человека...

Быстрый старт и софт для Modicon TM251MESE (Schneider Electric)
Так сложилась ситуация, что в скором времени предстоит познакомиться с ПЛК TM251MESE от Sneider Electric. Начал интересоваться как...

Книги или справочники для опытных(или проффесиональных) программистов!
Пожалуйста, Подскажите книги или справочники для опытных и проффесиональных программистов! Особенно хотелось бы найти: 1) полный...

253
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.04.2020, 14:16
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Не сумел оценить тормоза на 7-ке, при первом же запуске с картой ORD10.SCN
Ну вот и баг, даже смотреть не пришлось

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Он работает с *.MAP картами Dune 2000 с одним тайлсетом BloxBgbs (он исп в большинстве карт).
Другого не заявлено, только с картами, не со сценариями. А ты что из старкрафта первого сценарий
открыть захотел? Так у них свой редактор официальный есть, кошернейший. Для 2k официальных не было.
Был кастрированный shai hulud, в целом неплохой, но отображение спайса там не соответствует,
редактировать спайс - боль. И тайлсетов в комплекте не было(ну знаешь все эти заморочки с правами).
Попробуй распаковать карту Open Battle из архива прям в папку с экзешником, если путь не менял
в левом списке - сразу её увидишь в правом.
Так программа не должна вылетать вот так, а должна выдавать сообщение о том что такие карты не поддерживаются. У меня нет карт чтобы посмотреть где вылетает. Уверен что вылет как-раз из-за того где что-то куда-то не туда пишется.
Pro_grammer, скинь пожалуйста карту в личку.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
28.04.2020, 14:26
Цитата Сообщение от The trick Посмотреть сообщение
Так программа не должна вылетать вот так, а должна выдавать сообщение о том что такие карты не поддерживаются.
Ну и некий уровень здравомыслия у пользователя всё таки должен быть. Другие карты всё равно не отредактируются
в этом редакторе. Это как крестовой отвёрткой пытаться закрутить винт для плоской отвёртки. Зачем?
Упадёт прога или выдаст "неверная карта" в данном контексте не имеет вообще никакой разницы.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.04.2020, 14:52
Цитата Сообщение от locm Посмотреть сообщение
Вы умышлено изменили условия.
Задача была отследить запись за пределами буфера. Тот код что я выложил, это выполняет?
Данные записываются мимо буфера в моем примере? Среда отслеживает?

Цитата Сообщение от locm Посмотреть сообщение
Зачем ломать систему защиты, тем более что это не так просто? Ведь проверка выполняется сразу после вызова WinAPI. Речь о защите а не о взломе систем защиты.
А зачем приводить "тепличные" тесты? Данный инструмент никак не проверяет запись за пределы буфера, за исключением 4 байт за буфером, это я и показал.

Цитата Сообщение от locm Посмотреть сообщение
Допустим что VB задачу по другому решить не получится. Что будете делать? Отвечать необязательно. Я видел много вашего кода на VB где используется WinAPI. Видимо в этот момент про безопасное программирование не думаете.
Ну а о чем я писал тебе? Ты читаешь вообще мои посты? Прочти внимательней пожалуйста.

Цитата Сообщение от locm Посмотреть сообщение
Я приводил код который это обнаруживает, а вы его умышлено исказили и написали что не работает.
А я привел пример где это не обнаруживается, но ты не привел пример где используя концепцию безопасного программирования можно также стрельнуть себе в ногу. Я писал - работа с сырой памятью и указателями небезопасна, ты мне приводишь пример теста где инструмент отслеживает запись за пределы, я как контрпример привожу условия в которых он не отслеживает. В чем проблема?

Цитата Сообщение от locm Посмотреть сообщение
Что мешало вам его привести?
А зачем мне его приводить? Меня кто-то просил? Это ты изъявил намерение предоставить задачу которую я на VB6 с его концепциями должен решить. Я описал пару вариантов концепции как заменить указатели в коде на ссылки.

Цитата Сообщение от locm Посмотреть сообщение
Я привожу примеры который встречаются в реальном коде, а вы их искажаете до маловероятных случаев.
Нет, я всего лишь показываю что работа с памятью на этом уровне небезопасна, попробуй такое же провернуть в VB6 с его концепцией. Заметь, обсуждаем мы всего лишь один простейший семпл работы с памятью! Таких семплов как и вариантов кода может быть огромное количество.

Цитата Сообщение от locm Посмотреть сообщение
Приветите пример на VB с GetModuleFileName с обнаружением записи за пределами буфера.
Только не нужно писать что это небезопасно. Представьте что по другому задачу не решить.
Решить. Аналогом твоего кода если придерживаться концепции безопасности VB6 будет вызов App.Path, который безопасен. Мне не нужна небезопасная GetModuleFileName если я придерживаюсь этой концепции.

Цитата Сообщение от locm Посмотреть сообщение
Утопия! За это приходится платить.
Почему думаете современные приложения тормознутые и раздутые?
Платить приходится, не спорю, но не нужно сгущать краски, как я написал вас (нас) никто не заставляет придерживаться этой концепции, второй момент это то что это не настолько ударяет про производительности как ты вероятно думаешь. Технологии разрабатываются и придумываются для того чтобы ими пользовались и они будут приносить плоды.

Цитата Сообщение от locm Посмотреть сообщение
В VB или в управляемом коде?
Повторюсь не все возможно сделать на этом уровне. Мне часто приходится работать на низком уровне для взаимодействия с микроконтроллерами и на этом уровне управляемый код не самое лучшее решение.
Про дотнет я ничего не говорю, я не люблю его и почти никогда не использую, но в нем та же система безопасности (мб даже лучше) как и в VB6. Благо VB6 позволяет спуститься на уровень ниже. То что не лучшее решение в плане производительности я не спорю (самый лучший уровень по производительности вероятно доступен из ассемблера), но задачу решить все также можно.

Добавлено через 8 минут
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Ну и некий уровень здравомыслия у пользователя всё таки должен быть. Другие карты всё равно не отредактируются в этом редакторе. Это как крестовой отвёрткой пытаться закрутить винт для плоской отвёртки. Зачем?
Упадёт прога или выдаст "неверная карта" в данном контексте не имеет вообще никакой разницы.
Я не согласен с этим. Если ты пару постов назад говорил что твоя прога не имеет критических багов и тут сразу он вылетает - ну это несерьезно. Как раз тесты для этого и делают. Как же ты тестировал модули (как ты писал) если они могут убить приложение? Мало ли что юзер подсунет? Вон какой-нибудь хакер выложит такую скомпроментированную карту а люди ее скачают и побегут открывать в твоем редакторе и поймают трояна.
Я ни в коем случае не говорю о навыках и т.п. я и сам такие баги допускаю, просто смотри на это через призму безопасного программирования о котором я говорю здесь.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
28.04.2020, 15:02
Если ты пару постов назад говорил что твоя прога не имеет критических багов и тут сразу он вылетает - ну это несерьезно.
Это не баг вообще. Подкладывая заведомо некорректные данные редактор не обязан их обсчитывать,
как и крестовая отвертка не обязана закручивать болты для плоской.
Эту проверку не так сложно добавить, в ней абсолютно ноль смысла для конечного пользователя,
редактор для одного единственного формата, пользователь кидая в редактор кривой файл всё равно
ничего не получит. Это не отловленный баг, это придирка на ровном месте, и без того ясно
что редактор не откроет другие файлы.

Загрузи нормальную карту и тогда уже ищи баг.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.04.2020, 15:11
Quiet Snow, закинь неправильный файл в любое нормальное приложение, получишь предупреждение о неверном формате. Странно что мне приходится говорить о таких очевидных вещах. Можешь не считать это багом - дело твое. Я, как и большинство программистов, считаю что падение приложения, тем более зависящее от входных данных, и есть баг.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,018
Записей в блоге: 7
28.04.2020, 15:26
Цитата Сообщение от The trick Посмотреть сообщение
Данные записываются мимо буфера в моем примере?
Да.
Данные записываются изначально за пределами буфера.
Цитата Сообщение от The trick Посмотреть сообщение
Среда отслеживает?
Среда должна постоянно отслеживать всю физическую память процесса? Представляете какие будут накладные расходы?

Цитата Сообщение от The trick Посмотреть сообщение
А зачем приводить "тепличные" тесты?
Где тест тепличный? В примере памяти выделено меньше чем нужно. Запись за пределами буфера отлавливается.

Цитата Сообщение от The trick Посмотреть сообщение
Данный инструмент никак не проверяет запись за пределы буфера, за исключением 4 байт за буфером, это я и показал.
Его задача зафиксировать линейную запись за пределами буфера. Со своей задачей инструмент справляется.

Цитата Сообщение от The trick Посмотреть сообщение
Ну а о чем я писал тебе? Ты читаешь вообще мои посты? Прочти внимательней пожалуйста.
Там только слова и ни строчки кода.

Цитата Сообщение от The trick Посмотреть сообщение
ты не привел пример где используя концепцию безопасного программирования можно также стрельнуть себе в ногу.
Вам это лучше знать. Наверняка знаете как, но молчите.

Цитата Сообщение от The trick Посмотреть сообщение
Я писал - работа с сырой памятью и указателями небезопасна, ты мне приводишь пример теста где инструмент отслеживает запись за пределы, я как контрпример привожу условия в которых он не отслеживает.
Вы изменяете изначальные условия. Условия были таковы: Выделяем память и передаем указать на нее API функции которая запишет больше чем доступно памяти. Вы передали указатель с нулевого адреса?

Цитата Сообщение от The trick Посмотреть сообщение
А зачем мне его приводить? Меня кто-то просил?
А проявить инициативу? Или не приводите потому что выяснится что ваше безопасное программирование не такое уж и безопасное?
Но даже когда я вас попросил это сделать вы не привели.

Цитата Сообщение от The trick Посмотреть сообщение
Я описал пару вариантов концепции как заменить указатели в коде на ссылки.
Ну так приветите пример использования ссылки с функцией GetModuleFileName. Что сложного в этой простой задаче?

Цитата Сообщение от The trick Посмотреть сообщение
попробуй такое же провернуть в VB6 с его концепцией.
Вы лучше знаете VB. Логично если вы покажите как безопасно работать с GetModuleFileName и другими подобными функциями. Или предлагаете в VB полностью отказаться от WinAPI?

Цитата Сообщение от The trick Посмотреть сообщение
Аналогом твоего кода если придерживаться концепции безопасности VB6 будет вызов App.Path, который безопасен.
Ну и в PB есть функция ProgramFilename() которая вернет строку, но речь не об этом. Функция GetModuleFileName была выбрана потому что принимает указатель. Ее можно заменить на другую скажем GetSystemDirectory.

Цитата Сообщение от The trick Посмотреть сообщение
никто не заставляет придерживаться этой концепции
Вы усердно пытаетесь убедить что нужно непременно придерживаться безопасного программирования иначе будет много багов. Все зависит от программиста и стиля написания кода. Использование указателей вовсе не означает что в программе будет много ошибок.

The trick, если так хотите тестировать приложения, можете это потестить. MultiHash - программа вычисляющая хеши файлов
Код небольшой, около 600 строк, но зато присутствуют такие "вкусности" как работа с памятью, многопоточность и т. д.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
28.04.2020, 16:00
Цитата Сообщение от The trick Посмотреть сообщение
Quiet Snow, закинь неправильный файл в любое нормальное приложение, получишь предупреждение о неверном формате.
Да сделать эту проверку не сложно, просто конкретно в этом редакторе нет в ней смысла никакого.
Файл всё равно открывается только один раз, после идёт выход из редактора. Потери данных никакой нет.
А пока нормальный файл не дашь - дальше хода не будет(как и в любой проге).
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.04.2020, 16:46
Цитата Сообщение от locm Посмотреть сообщение
Да.
Данные записываются изначально за пределами буфера.
Ну и? Какая разница? Если я получаю к примеру в процедуре переменную смещения которая пишет в буфер.

Цитата Сообщение от locm Посмотреть сообщение
Среда должна постоянно отслеживать всю физическую память процесса? Представляете какие будут накладные расходы?
Вот именно. А в VB6 не нужно это отслеживать, без таких колоссальных расходов.

Цитата Сообщение от locm Посмотреть сообщение
Где тест тепличный? В примере памяти выделено меньше чем нужно. Запись за пределами буфера отлавливается.
Тест тепличный, поскольку проверяется условие перезаписи только того места где инструмент отслеживает, а именно 4 байта за буфером. Перед буфером, и за пределами этого буфера, а также контент записываемый в буфер интсрумент не проверяет.

Цитата Сообщение от locm Посмотреть сообщение
Его задача зафиксировать линейную запись за пределами буфера. Со своей задачей инструмент справляется.
Нет, не справляется. Я привел пример где линейная запись производится, а инструмент не отлавливает.

Цитата Сообщение от locm Посмотреть сообщение
Там только слова и ни строчки кода.
А какой код там должен быть? Какой нужно код я написал.

Цитата Сообщение от locm Посмотреть сообщение
Вам это лучше знать. Наверняка знаете как, но молчите.
Не знаю.

Цитата Сообщение от locm Посмотреть сообщение
Вы изменяете изначальные условия. Условия были таковы: Выделяем память и передаем указать на нее API функции которая запишет больше чем доступно памяти. Вы передали указатель с нулевого адреса?
Нет. Я говорил что работа с памятью напрямую небезопасна и привел пример. Ты же приводишь "тепличный" тест, в котором запись выполняется именно так как удобно тебе (линейная запись с начала буфера и перезаписью содержимого которое инструмент отслеживает значением которое отличается от отслеживаемого). В реальности запись может происходить вообще по разному.

Цитата Сообщение от locm Посмотреть сообщение
А проявить инициативу? Или не приводите потому что выяснится что ваше безопасное программирование не такое уж и безопасное? Но даже когда я вас попросил это сделать вы не привели.
Чем оно небезопасное? Зачем мне приводить какие-то доводы в том что оно безопасно, это ты должен например ткнуть мне - вот тут к примеру если придерживаться этого принципа можно "выстрелить в ногу", а не я.
Ты мне сказал привести, я привел. Ты о чем? Я описал как следует придерживаться концепции - оборачивать логику в объект и работать с ним. Ну если тебе прямо "разжевать" нужно то вот к примеру 2 ситуации как они решаются в C и как их можно решить безопасно в VB6:
Безопасный указатель на тип данных:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct tSomeStruct {
    int x;
    int y;
    int z;
};
 
int main() {
    struct tSomeStruct t, *p, *p2;
 
    p = &t;
    p2 = &t;
 
    p->x = 5; p->y = 6; p->z = 7;   // Присваиваем через указатель p
 
    printf("%i, %i, %i", p2->x, p2->y, p2->z);  // Читаем через указатель p2
 
}
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
' CSomeClass
Public X As Long
Public Y As Long
Public Z As Long
 
' Usage
Sub Main()
    Dim p As CSomeClass, p2 As CSomeClass
    
    Set p = New CSomeClass
    Set p2 = p
    
    p.X = 5: p.Y = 6: p.Z = 7 ' // Присваиваем через указатель p
    
    Debug.Print p2.X, p2.Y, p2.Z  ' // Читаем через указатель p2
    
End Sub
Безопасный указатель на функцию:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int foo(int a) {
    return a + 10;
}
 
int bar(int a) {
    return a + 20;
}
 
int main() {
    int (*pfn)(int);
 
    pfn = foo;
    
    printf("%i ", pfn(10));
 
    pfn = bar;
 
    printf("%i", pfn(20));
 
}
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
' IMyCaller интерфейс
Public Function pfn(ByVal lValue As Long) As Long
 
End Function
 
' Cfoo
Implements IMyCaller
 
Private Function IMyCaller_pfn(ByVal lValue As Long) As Long
    IMyCaller_pfn = lValue + 10
End Function
 
' Cbar
Option Explicit
 
Implements IMyCaller
 
Private Function IMyCaller_pfn(ByVal lValue As Long) As Long
    IMyCaller_pfn = lValue + 20
End Function
 
' Usage 
Sub Main()
    Dim pfn As IMyCaller
    
    Set pfn = New Cfoo
    
    Debug.Print pfn.pfn(10); " ";
    
    Set pfn = New Cbar
    
    Debug.Print pfn.pfn(20)
    
End Sub
Цитата Сообщение от locm Посмотреть сообщение
Ну так приветите пример использования ссылки с функцией GetModuleFileName. Что сложного в этой простой задаче?
Я уже устал объяснять. Читай посты внимательно. Мне не нужно использовать небезопасную GetModuleFileName. Если мне нужно получить имя своего файла я использую безопасную App.Path. Что сложного?

Цитата Сообщение от locm Посмотреть сообщение
Вы лучше знаете VB. Логично если вы покажите как безопасно работать с GetModuleFileName и другими подобными функциями. Или предлагаете в VB полностью отказаться от WinAPI?
Никак, с небезопасными функциями нельзя работать безопасно. С безопасными функциями можно работать безопасно! неужели так трудно понять? Причем тут вообще отказываться от WinAPI? В общем ты вообще не понимаешь о чем я веду речь иначе зачем такое говорить, когда я неоднократно уже писал об этом?

Цитата Сообщение от locm Посмотреть сообщение
Ну и в PB есть функция ProgramFilename() которая вернет строку, но речь не об этом. Функция GetModuleFileName была выбрана потому что принимает указатель. Ее можно заменить на другую скажем GetSystemDirectory.
Я не знаю как еще объяснить. Ты говоришь мне как используя концепцию безопасности VB6 вызвать эту функцию? Да никак! Эта функция и другие подобные ей небезопасны поэтому с ними нельзя работать напрямую придерживаясь концепции безопасного программирования. Для решения подобных задач есть безопасные аналоги, типа App.Path, FileSystemObject, и т.п.

Цитата Сообщение от locm Посмотреть сообщение
Вы усердно пытаетесь убедить что нужно непременно придерживаться безопасного программирования иначе будет много багов. Все зависит от программиста и стиля написания кода. Использование указателей вовсе не означает что в программе будет много ошибок.
Нет, я сказал что любую задачу можно решить придерживаясь концепции безопасного программирования как в VB6 (инкапсуляция всех сущностей в объекты и работа с ними). Указатели в сыром виде опасны, также как и сырая работа с памятью, потоками, что я неоднократно продемонстрировал. Про баги я ничего подобного не говорил. Я вообще-то и сам пишу часто код с нарушением этой концепции, используя небезопасные API, доступ к памяти и т.п.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
28.04.2020, 18:30
Цитата Сообщение от Quiet Snow Посмотреть сообщение
просто конкретно в этом редакторе нет в ней смысла никакого.
Ну как оказалось есть. Я ведь чисто от незнания, искренне думал, что все Дюны в плане карт совместимы.
А ты, как разработчик, зная, что это не так не позаботился о том, чтобы предупредить меня нужным сообщением, что я не прав, и позволил мне уронить программу. Понятно, что вреда нет ни какого, но впечатление теряется, как в том старом еврейском анекдоте. Вот теперь сам подумай, кого бы ты, будучи простым юзером этой программы стал бы считать виновным за то, что программа упала? Ведь входной фильтр файл пропустил, и игра Дюна и файл карта, в чем вина юзера?
Без обид, но ситуация даже не патовая, а матовая, особенно на фоне заявлений о тщательном и всестороннем тестировании.
А если файл был бы от нужной версии, но просто испорчен при перезаписи или ещё каким зловредом? Думаю финал был бы тот же. Нет контроля правильности файла и контроля версии. Это обычно проверяется в первую очередь в серьёзных программах.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,018
Записей в блоге: 7
28.04.2020, 19:31
Цитата Сообщение от The trick Посмотреть сообщение
А в VB6 не нужно это отслеживать, без таких колоссальных расходов.
Не работая с памятью отслеживать не нужно. Но речь не об этом же.

Цитата Сообщение от The trick Посмотреть сообщение
Безопасный указатель на тип данных:
Это примитивщина! Во многих программах вашего блога используется память и WinAPI.
Вот к примеру https://www.cyberforum.ru/blog... g5639.html
Для работы с изображениями написали dll в которой полно небезопасного кода.
Вот кусочек кода отсюда https://www.cyberforum.ru/blog... g3511.html
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
' // Initialize playback. The first parameter is a pointer to data of the raw mp3 file.
' // Second parameter is a size of this file in bytes.
' // Last parameter indicates that need to copy this file in the internal buffer.
Public Function Initialize(ByVal lpData As Long, ByVal szData As Long, Optional ByVal blCopy As Boolean) As Boolean
    Dim status  As Boolean
    Dim info    As Mp3Info
    Dim ret     As Long
    Dim index   As Long
    
    If Not init Then Exit Function
    
    status = Mp3GetInfo(lpData, szData, info)
    If Not status Then Exit Function
    
    If hWave Then ClearAll
    
    If blCopy Then
        
        ReDim buffer(info.szDataSize - 1)
        memcpy buffer(0), ByVal info.lpFrameOffset, info.szDataSize
        info.lpFrameOffset = VarPtr(buffer(0))
        
    End If
    
    ret = waveOutOpen(hWave, WAVE_MAPPER, info.format, hWnd, 0, CALLBACK_WINDOW)
    If ret Then hWave = 0:  Exit Function
 
    fileInfo = info
    curPosition = 0
    Me.Pan = mPan
    Me.Volume = mVolume
    
    loaded = True
    playing = False
    
End Function
 
Private Function Mp3GetInfo(ByVal lpData As Long, ByVal szData As Long, info As Mp3Info) As Boolean
    Dim hdr(9)  As Byte
    Dim size    As Long
    
    If szData >= 128 Then
        ' Skip ID3V1 tag
        memcpy hdr(0), ByVal lpData + szData - 128, 3
        
        If hdr(0) = &H54 And hdr(1) = &H41 And hdr(2) = &H47 Then
            
            szData = szData - 128
            
        End If
        
    End If
    
    ' Skip ID3V2 tags from beginning
    memcpy hdr(0), ByVal lpData, 10
    
    If hdr(0) = &H49 And hdr(1) = &H44 And hdr(2) = &H33 Then
        
        ' footer present
        If hdr(5) And &H10 Then
            szData = szData - 10
        End If
    
        size = hdr(6) * &H200000
        size = size Or (hdr(7) * &H4000&)
        size = size Or (hdr(8) * &H80&)
        size = size Or hdr(9)
        size = size + 10
        
        lpData = lpData + size
        szData = szData - size
            
    Else
        ' Skip ID3V2 tags from end
        memcpy hdr(0), ByVal lpData + szData - 10, 10
        
        If hdr(2) = &H49 And hdr(1) = &H44 And hdr(0) = &H33 Then
            
            szData = szData - 10
            
            size = hdr(6) * &H200000
            size = size Or (hdr(7) * &H4000&)
            size = size Or (hdr(8) * &H80&)
            size = size Or hdr(9)
            size = size + 10
        
            szData = szData - size
            
        End If
        
    End If
    
    If szData < 4 Then Exit Function
    
    info.framesCount = 0
    'Scan headers
    Do
        ' Find a frame sync
        Do
        
            GetMem4 ByVal lpData, hdr(0)
            
            If hdr(0) = &HFF And (hdr(1) And &HE0) = &HE0 Then
                Dim vers    As Long
                Dim layer   As Long
                Dim bitrate As Long
                Dim smprate As Long
                Dim padding As Long
                Dim channel As Long
                               
                vers = (hdr(1) And &H18) \ 8
                If vers = 1 Then Exit Function
    
                layer = (hdr(1) And &H6) \ 2
                If layer <> 1 Then Exit Function ' Only Layer 3
    
                If vers = 3 Then
                    bitrate = constants.bitrate(0, (hdr(2) And &HF0) \ &H10)
                Else
                    bitrate = constants.bitrate(1, (hdr(2) And &HF0) \ &H10)
                End If
 
                If vers = 3 Then
                    smprate = constants.smprate(0, (hdr(2) And &HC) \ &H4)
                ElseIf vers = 2 Then
                    smprate = constants.smprate(1, (hdr(2) And &HC) \ &H4)
                Else
                    smprate = constants.smprate(2, (hdr(2) And &HC) \ &H4)
                End If
                
                padding = (hdr(2) And &H2) \ 2
                channel = -(((hdr(3) And &HC0) \ 64) <> 3) + 1
                
                If vers = 3 Then
                    size = Int(144000 * bitrate / smprate) + padding
                Else
                    size = Int(72000 * bitrate / smprate) + padding
                End If
                
                With info
                    If .framesCount = 0 Then
 
                        With .format
                            .wFormatTag = WAVE_FORMAT_MPEGLAYER3
                            .cbSize = MPEGLAYER3_WFX_EXTRA_BYTES
                            .nChannels = channel
                            .nAvgBytesPerSec = bitrate * 128
                            .wBitsPerSample = 0
                            .nBlockAlign = 1
                            .nSamplesPerSec = smprate
                            .nFramesPerBlock = 1
                            .nCodecDelay = 0
                            .fdwFlags = MPEGLAYER3_FLAG_PADDING_OFF
                            .wID = MPEGLAYER3_ID_MPEG
                            .nBlockSize = size
                        End With
                                        
                        .lpFrameOffset = lpData
                        .szDataSize = szData
                        
                        If vers = 3 Then
                            .samplesPerFrame = 1152
                        Else
                            .samplesPerFrame = 576
                        End If
                        
                        ReDim .frameOffset(511)
                    
                    Else
                        
                        If UBound(.frameOffset) = info.framesCount Then
                            ReDim Preserve .frameOffset(UBound(.frameOffset) + 512)
                        End If
                        
                    End If
                    
                    .frameOffset(info.framesCount).offset = lpData - .lpFrameOffset
                    .frameOffset(info.framesCount).bitrate = bitrate
                    
                End With
                
                lpData = lpData + size
                szData = szData - size
                
                Exit Do
                
            End If
            
            lpData = lpData + 1
            szData = szData - 1
            
        Loop While szData >= 4
        
        info.framesCount = info.framesCount + 1
        
    Loop While szData >= 4
 
    Mp3GetInfo = True
    
End Function
Код безопасен?
Что будет если в lpData окажется кривой указатель и/или в szData неправильный размер.
Замечу нет элементарной проверки lpData на 0.
Поэтому не нужно писать что весь код на VB безопасен.

Цитата Сообщение от The trick Посмотреть сообщение
уже устал объяснять. Читай посты внимательно. Мне не нужно использовать небезопасную GetModuleFileName.
Не важно GetModuleFileName или др. функция. Вы их часто используете в своих проекта. А они ведь небезопасны!

Цитата Сообщение от The trick Посмотреть сообщение
Никак, с небезопасными функциями нельзя работать безопасно.
Вот о чем и я. В зависимости от ситуации пишется соответствующий код. И не стоит отказываться от проекта только лишь потому что в нем часть небезопасного кода. Я пишу как раз об этом. Не всегда возможно написать код так чтобы он весь был безопасным.

Цитата Сообщение от The trick Посмотреть сообщение
Нет, я сказал что любую задачу можно решить придерживаясь концепции безопасного программирования как в VB6 (инкапсуляция всех сущностей в объекты и работа с ними).
Тогда почему в ваших проектах полно небезопасного кода? Ведь вы сами пишите что любую задачу можно решить придерживаясь концепции безопасного программирования как в VB6. Что-то не сходятся ваши слова и реализация кода.

Цитата Сообщение от The trick Посмотреть сообщение
Указатели в сыром виде опасны, также как и сырая работа с памятью, потоками, что я неоднократно продемонстрировал.
Так как бы никто и не спорит, но разве стоит отказываться от проекта если он не может полностью состоять из безопасного кода?

Цитата Сообщение от The trick Посмотреть сообщение
Я вообще-то и сам пишу часто код с нарушением этой концепции, используя небезопасные API, доступ к памяти и т.п.
Вы же утверждаете что любую задачу можно решить придерживаясь концепции безопасного программирования как в VB6. Тогда вопрос, зачем пишите небезопасный код если на VB (с ваших слов) весь код может быть безопасным?
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.04.2020, 20:58
Цитата Сообщение от locm Посмотреть сообщение
Не работая с памятью отслеживать не нужно. Но речь не об этом же.
А о чем же? Я и говорю если не работать с памятью напрямую то и не выстрелить в ногу себе!

Цитата Сообщение от locm Посмотреть сообщение
Это примитивщина! Во многих программах вашего блога используется память и WinAPI.
Вот к примеру https://www.cyberforum.ru/blog... g5639.html
Для работы с изображениями написали dll в которой полно небезопасного кода.
Вот кусочек кода отсюда https://www.cyberforum.ru/blog... g3511.html
Я уже написал по поводу этого! Я не буду повторять, читай дискуссию.

Цитата Сообщение от locm Посмотреть сообщение
Код безопасен?
Что будет если в lpData окажется кривой указатель и/или в szData неправильный размер.
Замечу нет элементарной проверки lpData на 0.
Поэтому не нужно писать что весь код на VB безопасен.
Никто такого не писал, не нужно что-то от себя придумывать. О своем коде я также уже писал. Можешь еще хоть сто раз писать об этом, я просто yне буду на это вопрос отвечать больше. Я писал о том что следуя концепции безопасного программирования VB6 нельзя выстрелить себе в ногу, также что можно заменить всю логику работы с указателями как в C на ссылки как в VB6. Про работу с небезопасным WinAPI уже ты от себя добавил. Зачем в очередной раз приводить код работы с WinAPI и говорить - "вот тут ты с памятью работаешь, а вот тут у тебя указатель", я не понимаю.

Цитата Сообщение от locm Посмотреть сообщение
Не важно GetModuleFileName или др. функция. Вы их часто используете в своих проекта. А они ведь небезопасны!
И что? Я уже написал по поводу того как я пишу программы и как я следую концепции безопасного программирования. Зачем писать опять мне что я использую WinAPI?

Цитата Сообщение от locm Посмотреть сообщение
Вот о чем и я. В зависимости от ситуации пишется соответствующий код. И не стоит отказываться от проекта только лишь потому что в нем часть небезопасного кода. Я пишу как раз об этом. Не всегда возможно написать код так чтобы он весь был безопасным.
Блин, где такое было написано чтобы отказываться от проекта? Я наоборот писал что VB6 позволяет "спуститься вниз" на уровень и работать с небезопасным API, но всю ответственность на себя нужно брать также как и в других языках. Блин, ну неоднократно писал уже это. Что ты мне пытаешься доказать я не пойму, но не понимание или игнорирование того что я писал меня лично озадачивает.

Цитата Сообщение от locm Посмотреть сообщение
Тогда почему в ваших проектах полно небезопасного кода?
Я уже писал почему.

Цитата Сообщение от locm Посмотреть сообщение
Ведь вы сами пишите что любую задачу можно решить придерживаясь концепции безопасного программирования как в VB6. Что-то не сходятся ваши слова и реализация кода.
Ну смотри, я выше привел полные безопасные аналоги указателей в VB6 в сравнении с C. С чем ты несогласен? Я не говорю о взаимодействии с небезопасным WinAPI, а говорю о предметной области. Там где нам нужны указатели в C, мы заменяем на ссылки в VB6 как я описал выше - в чем проблема? Только не нужно опять писать про API, я уже разжевал что они в большинстве своем небезопасны и с ними нельзя использовать концепцию безопасного программирования. Их можно обернуть в безопасные объекты, которые будут предоставляться средой, системой, библиотекой (к примеру информацию о системе можно безопасно получить через WMI, информацию о файловой системе через FSO и т.д.)

Цитата Сообщение от locm Посмотреть сообщение
Так как бы никто и не спорит, но разве стоит отказываться от проекта если он не может полностью состоять из безопасного кода?
А что ты тогда пытаешься мне доказать? Я сказал что небезопасно, ты мне кучу примеров для чего демонстрировал? Я только всего-лишь говорил о небезопасности работы с памятью (ну и потоках, указателях). Если ты не спорил, то что это было тогда? Второй момент что никто и не заставляет отказываться от проекта! Если у тебя нет возможности придерживаться концепции - пожалуйста, никто не запрещает, только следи за всем сам.

Цитата Сообщение от locm Посмотреть сообщение
Вы же утверждаете что любую задачу можно решить придерживаясь концепции безопасного программирования как в VB6. Тогда вопрос, зачем пишите небезопасный код если на VB (с ваших слов) весь код может быть безопасным?
Цитата Сообщение от The trick Посмотреть сообщение
Во-первых, я использую это в большей степени при работе с WinAPI, потому что он в большинстве своем не поддерживает такую концепцию. Если ты внимательно читал, то где можно я конечно же придерживаюсь концепцией безопасного программирования, к примеру вместо получения сырых указателей на объекты, я использую непосредственно ссылки и компилятор сам следит за жизнью объектов, бываю конечно исключения, но они скорее всего связаны со смешиванием безопасного кода и WinAPI, а также в некоторых случаях с производительностью.
Во-вторых, я не являюсь программистом с которого возможно нужно брать пример. Есть куча безопасных аналогов того как можно сделать вещи которые делаю я придерживаясь концепции безопасного программирования VB6. Я просто почти не использую дополнительные библиотеки (в проекта в своем блоге) которые специально предназначены для этого и которые многократно ускоряют разработку приложений на VB6. К примеру vbRichClient5, VBCorLib библиотеки содержат огромное количество готовых вещей и тебе при использовании их возможно ни разу не придется обратиться к WinAPI.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,018
Записей в блоге: 7
28.04.2020, 21:10
Цитата Сообщение от The trick Посмотреть сообщение
Я и говорю если не работать с памятью напрямую то и не выстрелить в ногу себе!
Верно, только зачастую приходится работать.

Цитата Сообщение от The trick Посмотреть сообщение
Ну смотри, я выше привел полные безопасные аналоги указателей в VB6 в сравнении с C.
Почему не в сравнении с объектами C++? Ведь тема про C++.

Цитата Сообщение от The trick Посмотреть сообщение
С чем ты несогласен?
С тем что сравниваете ООП ЯП с процедурным. Сравниваете VB с C++.
Цитата Сообщение от The trick Посмотреть сообщение
Никто такого не писал, не нужно что-то от себя придумывать.
А это кто написал?
Цитата Сообщение от The trick Посмотреть сообщение
я сказал что любую задачу можно решить придерживаясь концепции безопасного программирования как в VB6 (инкапсуляция всех сущностей в объекты и работа с ними).
Если это так, то никакие WinAPI, работа с памятью, и другой небезопасный код не нужен.
Но так ли это? Или что под этим подразумевали? Если бы любую задачу можно было решить безопасным кодом, не применяли бы сплошь и рядом WinAPI в VB.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.04.2020, 21:34
Цитата Сообщение от locm Посмотреть сообщение
Верно, только зачастую приходится работать.
Нет. Для этого есть безопасные объекты, типа массивов. Работать необходимо только при взаимодействии с небезопасным кодом, либо же если необходимо оптимизировать, либо в силу других обстоятельств.

Цитата Сообщение от locm Посмотреть сообщение
Почему не в сравнении с объектами C++? Ведь тема про C++.
А причем тут объекты C++? Я говорил про указатели, а не про объекты. Можно поговорить и про объекты, только о чем рассказать?

Цитата Сообщение от locm Посмотреть сообщение
С тем что сравниваете ООП ЯП с процедурным. Сравниваете VB с C++.
А VB6 непроцедурный? Он такой же как и плюсы, позволяет работать как с ООП, так и в процедурном стиле. Просто я пишу про C, потому что плюсы вышли из C и то что касательно сырых указателей в C также касается автоматом и плюсы.

Цитата Сообщение от locm Посмотреть сообщение
А это кто написал?
Ну вообще-то это был ответ на - "Поэтому не нужно писать что весь код на VB безопасен."

Цитата Сообщение от locm Посмотреть сообщение
Если это так, то никакие WinAPI, работа с памятью, и другой небезопасный код не нужен.
Нет, я такого не говорил. Во-первых, помимо небезопасного WinAPI есть много безопасного. Во-вторых, для памяти есть безопасные аналоги - массивы. В-третьих, вместо сырых и небезопасных указателей можно использовать безопасные ссылки (они совместимы с безопасным WinAPI). В-четвертых, небезопасный код не не нужен, поскольку в силу внешних обстоятельств мы вынуждены использовать его.
Смысл указателя в том чтобы на что-то указывать. Ты мне говоришь что указатель указывает на память, о чем я говорю что это небезопасно, в памяти может быть что угодно и это может привести к непредсказуемому поведению. Я же говорю что указатель указывает на объект (объект в данном случае это абстракция, а не COM объект), что безопасно, мы всегда знаем на что он указывает, его нельзя неверно установить и получить undefined behavior. Попробуй подумать немного об этом и понять логику, тогда возможно ты поймешь что я имею в виду. Я не говорю о опытном программисте который не допустит того чтобы в памяти лежало что попало, о том что он проконтролирует границы буферов и т.п. Я говорю о концепции, когда в принципе таких ситуаций быть не может и любую задачу можно решить так.
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
28.04.2020, 21:43  [ТС]
Безопасны указатели или нет, изучать-то их всё равно волей-неволей приходится, потому что в очень многих функциях WINAPI и COM указатели фигурируют. Ну вот хотя бы самая "ходовая" функция SAPI 5.4 (на скриншоте).

C++
1
2
3
4
5
HRESULT Speak(
   LPCWSTR       *pwcs,
   DWORD          dwFlags,
   ULONG         *pulStreamNumber
);
pwcs
[in, string] Pointer to the null-terminated text string ...
И сразу несколько вопросов, связанных с передачей переменных.
Здесь, как я понимаю, просят передать этот параметр в виде указателя на строку, заканчивающуюся нулевым байтом.

А если я просто строковую переменную туда передам (по ссылке) вместо указателя? Это будет равносильно передаче указателя по значению? Вроде бы я так всегда и поступал, и "оно" обычно работало

Очень часто передавал обычную динамическую строку (безо всяких завершающих нулей). И тоже вроде бы работало. Или это как лотерея, - если дальше там где-то в памяти встретятся нули, то дотуда и будет считана эта строка?
А почему мне обычно хочется именно динамической строкой передавать, так это потому что не надо заморачиваться с объявлением размера этой строки.

PureBasic
1
DIM a AS STRINGZ * n
Миниатюры
Быстрый старт в изучении C++ для относительно опытных программистов Basic  
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,018
Записей в блоге: 7
28.04.2020, 21:50
Цитата Сообщение от The trick Посмотреть сообщение
Просто я пишу про C, потому что плюсы вышли из C и то что касательно сырых указателей в C также касается автоматом и плюсы.
C++ гибче в этом плане.

Цитата Сообщение от The trick Посмотреть сообщение
Во-вторых, для памяти есть безопасные аналоги - массивы.
Допустим WinAPI требует указатель. Передали указатель на массив и где гарантия безопасности? А по другому никак, т. к. функции нужен указатель на память.

Цитата Сообщение от The trick Посмотреть сообщение
В-третьих, вместо сырых и небезопасных указателей можно использовать безопасные ссылки (они совместимы с безопасным WinAPI).
Это уже рассматривали. Ссылки не могут быть аналогами указателей. Или приведите пример использования ссылки вместо указателя при работе с WinAPI.
Если вы пишите что одно можно использовать вместо другого, значит они как минимум аналоги.
Приводите код того что имеете в виду чтобы не было недопонимания.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.04.2020, 21:53
Цитата Сообщение от Power_Basic Посмотреть сообщение
И сразу несколько вопросов, связанных с передачей переменных.
Здесь, как я понимаю, просят передать этот параметр в виде указателя на строку, заканчивающуюся нулевым байтом.
Открой F2, там все типы параметров есть:


Цитата Сообщение от Power_Basic Посмотреть сообщение
И сразу несколько вопросов, связанных с передачей переменных.
Здесь, как я понимаю, просят передать этот параметр в виде указателя на строку, заканчивающуюся нулевым байтом.
BSTR строка (это тип строк в VB6) являются строками с нуль терминалом (а не нулевым байтом).

Цитата Сообщение от Power_Basic Посмотреть сообщение
А если я просто строковую переменную туда передам (по ссылке) вместо указателя? Это будет равносильно передаче указателя по значению? Вроде бы я так всегда и поступал, и "оно" обычно работало
Так и нужно, поскольку VB6 определяет тип параметра из библиотеки типов и автоматически конвертирует безопасные типы в соответствующие. LPCWSTR строка может быть передана как BSTR строка без всяких преобразований.

Цитата Сообщение от Power_Basic Посмотреть сообщение
Очень часто передавал обычную динамическую строку (безо всяких завершающих нулей). И тоже вроде бы работало. Или это как лотерея, - если дальше там где-то в памяти встретятся нули, то дотуда и будет считана эта строка?
Нет, все строки в VB6 являются BSTR строками, а они все с нуль терминалом.

Цитата Сообщение от Power_Basic Посмотреть сообщение
А почему мне обычно хочется именно динамической строкой передавать, так это потому что не надо заморачиваться с объявлением размера этой строки.
Так и необязательно делать, просто передавай строки.
1
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
28.04.2020, 22:09
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Без обид, но ситуация даже не патовая, а матовая, особенно на фоне заявлений о тщательном и всестороннем тестировании.
Мужики вы издеваетесь? Я даже карту скинул, для тех, кто не видит различий между 2000-й и другими.
Вы прогу ещё даже не увидели, а уже сделали вывод о багах. Да ни один мод-мейкер никода в жизни не будет
кормить её другими файлами. Это всё равно что купить обычный пылесос, засосать им бензин, он взорвётся
и на фоне этого сделать вывод о некачественной конструкции пылесоса.))) Мол почему не предусмотрели...
Так а никто и не думал что им кто-то будет бензин засасывать, а могут ещё мазут или клей. Но зачем?

Добавлено через 11 минут
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Я ведь чисто от незнания, искренне думал, что все Дюны в плане карт совместимы.
Разумеется нет. Это разные программы, написанные разными людьми в разные годы.
Они к друг другу не имеют никакого отношения ни визуально, ни технически.
Там есть скрин и в заголовке указано для какой конкретно дюны. Перепутать в общем-то сложно,
их всего было 3 штуки(dune 2 [sega\pc], dune 2000[ps1, pc] и emperor[pc]) и визуально они крайне
сильно отличаются.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.04.2020, 22:14
Цитата Сообщение от locm Посмотреть сообщение
C++ гибче в этом плане.
В данном контексте разницы нет никакой.

Цитата Сообщение от locm Посмотреть сообщение
Допустим WinAPI требует указатель. Передали указатель на массив и где гарантия безопасности? А по другому никак, т. к. функции нужен указатель на память.
Безопасное API не требует какой-то там указатель. К примеру IXMLDOMNode::get_baseName принимает указатель на безопасную строку BSTR и мы не получим никакого неопределенного поведения из-за перезаписи буферов или что-то в этом роде, но мы также вернули строку переменной длины. Про небезопасное API я написал уже.

Цитата Сообщение от locm Посмотреть сообщение
Ссылки не могут быть аналогами указателей.
Могут, точнее они и есть аналоги.

Цитата Сообщение от locm Посмотреть сообщение
Если вы пишите что одно можно использовать вместо другого, значит они как минимум аналоги.
Да можно. Выше пример на С я привел, если это не аналог то что это?

Цитата Сообщение от locm Посмотреть сообщение
Или приведите пример использования ссылки вместо указателя при работе с WinAPI.
С безопасным API:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Form_Load()
    Dim cStm    As IStream
    Dim cPic    As IPicture
    
    On Error GoTo err_handler
    
    Set cStm = SHCreateStreamOnFile("C:\Temp\tesst_icon.bmp", STGM_READ Or STGM_SHARE_EXCLUSIVE)
    Set cPic = OleLoadPicture(cStm, 0, 1, IID_IUnknown)
    
    Set Me.Picture = cPic
    
err_handler:
    
End Sub
Вместо сырых указателей (как Long), я использую ссылки с нужными интерфейсами, вместо передачи буферов строк, я передаю строки напрямую.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,018
Записей в блоге: 7
28.04.2020, 22:17
Цитата Сообщение от Power_Basic Посмотреть сообщение
И сразу несколько вопросов, связанных с передачей переменных.
Здесь, как я понимаю, просят передать этот параметр в виде указателя на строку, заканчивающуюся нулевым байтом.
Да, юникодную строку.
Цитата Сообщение от Power_Basic Посмотреть сообщение
А если я просто строковую переменную туда передам (по ссылке) вместо указателя? Это будет равносильно передаче указателя по значению?
Указатель по значению? Как себе это представляете?
Просто передаете указатель на строку.

Цитата Сообщение от Power_Basic Посмотреть сообщение
Очень часто передавал обычную динамическую строку (безо всяких завершающих нулей).
В PowerBasic не нультерменированные строки?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
28.04.2020, 22:21
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Да ни один мод-мейкер никода в жизни не будет
кормить её другими файлами.
Да ладно, "защиту от дурака" ещё ни кто не отменял. Опять же битый файл, испорченный другой кривой программой, что, невозможно такое?
Это как купил бы я архиватор RAR, гружу в него битый архив, а он раз и упал, вместо того, что бы сообщить, что архив битый.
Или Фотошоп, упал бы вместо того, что бы сообщить, что файл испорчен или не поддерживается.
А авторы меня бы лечили, что нормальный юзер ни когда испорченный файл в редактор не загрузит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.04.2020, 22:21

набор опытных C++ программистов
Большой иностранный банк проводит набор опытных C++ программистов для IT-департамента своего московского офиса. Необходимы кандидаты с...

Приглашаю На работу Опытных Программистов
Всем привет . Я ищю Хороших программистов для работы над Онлайн игрой ( в типе neverlands) От вас Требую одно хорошую ...

Нужен совет опытных программистов на C#
Всем добрый день! Я здесь абсолютно новенький! Так что прошу сразу не кидать камнями если задаю вопросы не там где нужно! :) Совсем...

Нужен совет опытных программистов
Задача: Написать систему логирования LS кода, подсчета производительности (как долго исполняется LS код) и учета ошибок. Цель: получить...

Требуется совет опытных программистов
Основы С++ более менее изучены. Что же дальше? Что учить чтоб писать хоть какие то простенькие прикладные программы?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
220
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru