26

Re: Вопросы по C/C++

Вроде как разобрался:
1. Слеш действительно два раза добавлялся.

2.

char search_str[MAX_PATH+1];
Zer0memory(search_str,MAX_PATH+1);

Если убрать единицу, все норм, видимо не надо обнулять завершающий нуллбайт.

3.

WIN32_FIND_DATAA wfd;
Zer0memory(&wfd,sizeof(WIN32_FIND_DATA));

Структура объявлена как Анси, а я обнуляю юникод-версию (по дефолту в студии юникод).

27

Re: Вопросы по C/C++

Не получается написать функцию , ansi to integer. Запутался с указателями, подскажите, в чем дело?
Нужно всего лишь цифры от 1 до 9 преобразовывать, этого хватит.

На асме все работает:

.data
str1 db "2025",0

.code
start:
movzx ebx,byte ptr str1
and bl,001111b

На Си - ерунда какая-то sad

unsigned int a2i(char *str1)
{
unsigned int i;
__asm
    {
    movzx ebx,byte ptr str1
    and bl,001111b
    mov i,ebx
    }
return i;
}

int APIENTRY WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
char abc[] = "213";
BOOL bOk = a2i(abc);

28

Re: Вопросы по C/C++

mov ebx, str1
movzx ebx, [ebx]

а вообще непонятно, зачем тут ассемблер

29

Re: Вопросы по C/C++

зачем тут ассемблер

Потому что ассемблер - это круто и илитно.

А если серьезно, мне нужен софт без CRT, т.е. встроенные сишные itoa использовать нельзя, а в WinApi аналога не нашел.

30

Re: Вопросы по C/C++

Так посмотрел бы экспорты ntdll, там есть _itoa

31

Re: Вопросы по C/C++

Flisk пишет:

А если серьезно, мне нужен софт без CRT, т.е. встроенные сишные itoa использовать нельзя, а в WinApi аналога не нашел.

Зачем тебе софт без CRT? Особенно учитывая то, что всё это CRT можно вкомпилировать прямо в бинарник.

32

Re: Вопросы по C/C++

Kaimi пишет:

Так посмотрел бы экспорты ntdll, там есть _itoa

Да, спасибо, действительно можно оттуда взять.

dx пишет:

Зачем тебе софт без CRT? Особенно учитывая то, что всё это CRT можно вкомпилировать прямо в бинарник.

Софт без CRT намного меньше весит + вроде как паковать\криптовать его проще.

33

Re: Вопросы по C/C++

Flisk пишет:

Софт без CRT намного меньше весит + вроде как паковать\криптовать его проще.

Меньше весит это да, но ты скажи, зачем тебе софт, который весит на 500 кб меньше, но при этом код в нем написан с ухищрениями и сложностями, только чтобы избавиться от CRT, и еще завязаться на такие не кроссплатформенные вещи, как WinAPI? А паковать и криптовать код с CRT или без одинаково по сложности.

34 Отредактировано Flisk (19-10-2014 16:41:28)

Re: Вопросы по C/C++

Пишу dll. Все работает, но в импорте стоит msvcr90.dll, которого нет на других машинах. Убрал через /NODEFAULTLIB - теперь проект не компилируется вообще, пишет
>LINK : error LNK2001: неразрешенный внешний символ "[email protected]

Хотя такая функция в проекте есть

BOOL WINAPI APIENTRY DllMain( HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved )

Я уже и удалял ее, и менял параметры и свойства проекта (консольный на windows), все равно пишет эту ошибку. Как быть?

В гугле ничего вразумительного не нашел, код

#pragma comment(linker,"/NOENTRY")

никак не помогает. Студия 2008.

Upd. Разобрался. Нужно в свойствах самого проекта (линкер-дополнительно) либо указать точку входа (имя функции этой самой dllmain), либо там же выбрать, что проект без точки входа. Тогда работает.

35

Re: Вопросы по C/C++

Возможно ли в одном проекте использовать С и С++? Т.е. допустим есть
main.c

#include <windows.h>

int main(...)
{

C_plus_plus_function();

return 0;
}

и есть somefile.cpp

#какие-то инклуды
объявление C_plus_plus_function()
....

Т.е. весь мой проект на Си , но кое что в нем реализовать нельзя (работа с СОМ или gdi+). Я хочу [s]скопипастить [/s]реализовать это на плюсах и использовать в проекте. Это реально или я пишу бред?

36

Re: Вопросы по C/C++

Во-первых, комбинировать С и C++ в одном проекте можно. Можно даже еще ассемблер туда же. extern "C" тебе в помощь.

Во-вторых, с COM можно работать и на Си. Можно и с GDI+, но сложнее.

Я бы всё делал на C++, кода было бы меньше, и он вероятно был бы проще.

37

Re: Вопросы по C/C++

dx, спасибо , буду разбираться с extern .
По С++ - сказать честно, мне не хочется учить этот язык. Я и на С то с трудом перешел. Да и, наверное, выучить С++ в моем положении нереально. Как кто-то писал на васме, вместе с изобретением стандартна С++11 нужно изобретать препарат для бессмертия. Я имею ввиду, если учить реально,  а не писать на плюсах в стиле С.

38

Re: Вопросы по C/C++

А что не так с твоим положением? Было бы желание так-то. На самом деле, никто не заставляет учить ВСЕ фичи C++, там достаточно и части, чтобы писать хороший код. А C++11 открывает многие новые возможности и во многом позволяет код даже упростить.

39

Re: Вопросы по C/C++

dx, C++ считается самым сложным языком, со всеми этими миллионом типов строк, адовым ООП (я и на РНР ООП толком не осилил, а там, говорят, он проще в разы), бустом , и так далее. Вряд ли я, со своими слабыми задатками к программированию, смогу его осилить.

По теме - почему-то не получается нормально совместить. Создаю проект в Visual Studio. Файл main.c

#include <stdio.h>
extern int cpp();

int main(int argc, char **argv)
{
printf("This variable is from Cpp %d\n",cpp());
return 0;
}

Для теста создаю еще один С-файл test.c

extern int cpp()
{

return 77;
}

Все работает, все нормально. Переименовываю файл test.c в test.cpp. Компилирую.

error LNK2019: ссылка на неразрешенный внешний символ _cpp в функции _main

40

Re: Вопросы по C/C++

extern "C" int cpp()

41

Re: Вопросы по C/C++

ООП в C++ примерно такое же, как во многих других языках типа C# или Java. В PHP оно действительно проще, но проще оно там во многом потому, что язык нетипизированный. На C++ можно нормально программировать и без использования всех наворотов типа шаблонов или чего-то еще. Эти знания нужны, если ты библиотеку пишешь, которой будут другие люди пользоваться.
Ну и да, на C++ можно написать гораздо меньше кода, чем на C, при чем оба варианта будут делать одно и то же.

А о "мииллионе типов строк"... Это скорее пережитки WinAPI и C, а не C++. Это там всякие BSTR, TCHAR, WCHAR, LPCSTR и т.д. В стандартной библиотеке C++ есть std::string, и этого вполне достаточно.

42

Re: Вопросы по C/C++

dx, спасибо, так все работает smile

По С++ - может со временем все таки начну изучать.  Там есть много привлекательных вещей, вида - автоматическое закрытие хендлов, освобождение ресурсов и т.д. (видел у Рихтера макросы, через деструктор, на Си/Асме такое не сделать), тот же СОМ, ATL и т.д. и т.п.
Хотя, с другой стороны, можно учить C#, который все таки попроще и где не нужно думать о памяти.

43

Re: Вопросы по C/C++

Народ, прошу прощения если влез не по делу, но увидав "добивает эта дурацкая типизация" вспомнил о своём о девичьем и не смог удержаться smile
Дело такое. Я пишу в основном на компилируемых языках со статической типизацией. Типа C/C++, java и т.п. Когда понадобилось сделать довольно объемный проект на javascript, долго и гнусно матерился и сдался на третьей тысяче строк кода. Благо добрые мелкомягкие люди сделали специально для таких как я typescript. На коем проект в конце концов и был написан. С тех пор регулярно срусь в тырнетах с любителями утиной типизации (javascript, python и т.п.). Срусь не от того что люблю это дело, у меня есть занятия и поинтереснее. Просто честно хочу разобраться, какие преимущества даёт утиная типизация перед статической ? На обыкновенном грубом С даже без плюсов я тоже могу работать с произвольными типами данных. Зарезервировал буфер типа void и крути его как угодно. Но в 90% кода это лишне, а статическая типизация помогает очень сильно. Во-первых отлавливая кучу глупых ошибок, скорее даже описок. Во-вторых что не менее важно, подсказывая автокомплиту в IDE, чего ожидать. Утиная типизация не даёт ни того ни другого. Нормальный автокомплит например не работает даже у таких монстров как JetBrains. Тут судя по сайту и форуму собрался народ в равной мере пишущий и на компилируемых языках и на языках с утиной типизацией. Не хочу затевать никакого срача. Просто прошу, может тут кто-нибудь показать мне пример, где утиная типизация имеет неоспоримые преимущества перед статической ? На любом языке, я разберусь. Ещё раз, не хочу ругани, в конце концов каждый из нас не Бог Саваоф и может ошибаться. Я просто хочу разобраться в этом предмете сам.

44

Re: Вопросы по C/C++

Ну и наберусь наглости высказаться про С++ (ох чувствую ща меня тут запинают ногами ! ) smile smile smile
Пишу на нём исключительно как на С с классами. Ну иногда юзаю шаблоны. Но чтобы всякие там умные указатели, библиотеки boost и даже просто перезагрузка операторов - избавь Боже ! Дело тут вот в чём. Я в своё время довольно много писал для встроенных систем. И язык С ценю в первую очередь за прозрачность. Глядя на код, написанный на С, очень легко представить, во что он примерно скомпилится и какие накладные расходы это вызовет. С С++ используемом на полную катушку это уже не так. Там можно легко написать что-то, выглядящее как чтение или запись  одного элемента массива, в результате чего произойдет куча выделений и освобождений памяти, обращений к интернету, вычислений в облачных платформах и т.д. Код теряет главное своё преимущество - прозрачность. Это не страшно, если он выполняется на столе у бухгалтера или у игромана. Но что если этот код управляет коробкой передач автомобиля ? Что случится пока он будет лазить по тырнетам и облакам ? Я конечно утрирую, но думаю мысль ясна.

45 Отредактировано eugenk1 (09-08-2016 07:09:25)

Re: Вопросы по C/C++

Flisk пишет:

dx, спасибо, так все работает smile
Хотя, с другой стороны, можно учить C#, который все таки попроще и где не нужно думать о памяти.

Хе-хе... Почитал всю тему и узнал в Вас себя smile Т.е. человека, привыкшего к асму и переходящего на языки высокого уровня. Сам тем же самым страдал. Ещё в пору ZX-Spectrum. На нем вообще кроме асма было программировать реально не на чем. Не считая тормознутого на всю башню бейсика. А потом появилась PC. Ещё советская ЕС-1840, продаваемая по ликвидации фирмы. И неимоверная круть - Borland Turbo C 2. Ещё без плюсов. И блин тоже никак не мог привыкнуть. Почему компилятор выдаёт предупреждения о несоответствии типов, когда на асме я пишу что хочу и куда захочу ! Что за херня такая sizeof, когда на асме я знаю что вот это байт, вот это слово ! Почему компилятор делает кучу каких-то нафиг никому не нужных манипуляций со стеком, когда на асме я всё напишу лучше и возможно даже потрачу на это меньше времени ! Ну а потом как-то привык... Асм сейчас вижу только для каких-то экзотических архитектур, ну и в IDA, когда что-то крякаю.
Ладно, это призказка что называется. Не хочу лезть с ненужными советами, однако мнение выскажу. По-моему не надо Вам сейчас лезть ни в С# ни даже в С++. Я бы на Вашем месте начал сейчас с того, что хорошо освоился со старым добрым С. Чистым я имею в виду. Без плюсов.  Вам сейчас просто необходимо построить к нему мостик. Т.е. освоиться с тем, что переменная это ячейка памяти, массив это буфер, указатель это индексный регистр и т.п. В конце концов Вы научитесь ясно видеть во что примерно компилится Ваш код на С. И уже после этого можно будет осваивать что-то более абстрактное, такое как С++ или С#. Вобщем то что Вы сейчас испытываете трудности, это скорее Ваше преимущество, а не недостаток. Сейчас как собак нерезаных развелось быдлокодеров, понятия не имеющих во что в конце концов превращаются их неостроумные программульки и что происходит за кулисами. Вы же изначально как мне кажется, пошли правильным путём, начав с асма. В школах и институтах (насколько я знаю) подход совершенно другой. Как мне кажется неправильный.

P.S. Да, из книг. Советую почитайте книгу "Язык С в 21-м веке". Она в тырнетах имеется. Рекомендовать с Вашим уровнем книги для чайников и неуважительно и бесполезно. А эта думаю будет Вам в самый раз.

46

Re: Вопросы по C/C++

По поводу утиной типизации:
У меня она не вызывает отвращения, я на том же JS и PHP писал достаточно массивные скрипты без особых проблем. В wiki, например, указаны некоторые её преимущества (https://ru.wikipedia.org/wiki/%D0%A3%D1 … 0%B8%D1%8F):

Утиная типизация решает такие проблемы иерархической типизации, как:

    невозможность явно указать (путём наследования) на совместимость интерфейса со всеми настоящими и будущими интерфейсами, с которыми он идейно совместим;
    экспоненциальное увеличение числа связей в иерархии типов при хотя бы частичной попытке это сделать.

С другой стороны, есть и минусы, уже упомянутые выше. Вот здесь еще всё хорошо расписано: http://programmers.stackexchange.com/qu … mic-typing

Имхо, дело вкуса. Шаблоны в C++ тоже в какой-то мере "утиные", просто ошибки во время компиляции проверяются.

47

Re: Вопросы по C/C++

По поводу C++:
На C++14 писал много кода под 8-битные AVR, не имел никаких проблем с производительностью или нехваткой места. Конечно, не использовал такие в данном случае overkill-фичи, как виртуальные функции, исключения. Не использовал даже динамическое выделение памяти, и почти всегда классы были статическими. Но в целом код выглядит более прилично и строго, чем на Си, как мне кажется. Код структурирован по классам, можно делать generic-код с использованием шаблонов, использовать такие вещи, как auto, static_assert, constexpr, enum class, пространства имен, перегружать функции и т.д.

В C++ тоже можно предсказать, что будет происходить при вызове той или иной функции, как и в Си, если хорошо знаешь язык. Иногда это даже проще, в Си ведь тоже можно навернуть таких макросов, что потом фиг разберёшься.