Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    632
    Адрес:
    Russia
    MS очень нелегко удалось отвязать мир от дос. Видел опрос в зарубежном программерском журнале 1993 года, мол, под какие ОС вы планируете писать - судя по результатам опроса, 4/5 опрошенных вообще мастдайку как целевую платформу не воспринимали. И это не какой-нибудь замшелый 1990-87 (386 проц вышел в 1985), это год появления процессора Пентиум.

    Вот по вашему вопросу, еще, может пригодится, https://vk.com/wall-123534288_53 https://vk.com/wall-123534288_4

    Те же самые проблемы у MS были с переводом публики на DirectX. Игры win95-only начиная с 1997 стали появляться, а там уже и аппаратное ускоренное 3d подвезли. Собственно, три-дэ + этот ваш интернет и продвинули винду, иначе все сидели бы в досе и в ус не дули.
     
    Последнее редактирование: 11 авг 2018
  2. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    413
    Ладно, я скачал Visual C++ 1.52. Просто как-то потребовалось собрать проект, который под Дос16 ТС++3.1 на VS2010, дак выскочило почти 300 ошибок и лишь через три дня танцев с бубном удалось завершить компиляцию. Хотя мне ДОС16 сам по себе мало интересен, но в таких случаях вполне нужен.
    ЗЫ
    Что ещё, ах да компилятор-транслятор МАСМ, это lcc но пока не разобрался с его командами.
    Да это очень прикольно иметь компилятор который транслирует код в МАСМ, мощь макросов МАСМа и самого С, а ещё лучше С++, только транслятор С++ под win32 я пока не нашёл.
     
  3. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.599
    Адрес:
    г. Санкт-Петербург
    GCC с опцией -S транслирует любой поддерживаемый язык в ассемблерный код.
     
  4. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    413
    А макросы в блоке _asm{...} работают? Работает ли оператор ORG? Мне без него никак. Надо что бы компилятор не обладал как таковым встроенным ассемблером, всё делает внешний ассемблер. Иначе говоря в блоке _asm команды просто игнорируются, ну может только проверка на существования идентификаторов с предупреждением.
     
  5. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.599
    Адрес:
    г. Санкт-Петербург
    А просто прилинковать asm-файл к С++ не хотите? Просто не понимаю вот таких вот замудростей. Если надо писать на асме - так напишите отдельный файл и слинкуйте потом с C++.
     
  6. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    413
    Всё просто, сам проект XRayExtensions на MASM'е, а С/С++ просто синтетический сахар, который должен упростить создания сложного кода, как то так. Можно там бинарник с помощью VS C++ создать, и как-то всё это соединить, на как именно, пока не знаю. По мне проще найти или уже самому создать транслятор С/С++ в МАСМ, а что, МАСМ много чего понимает, структуры, виртуальные функции, локальные переменные, получается в трансляторе надо разобраться с выражениями, остальное просто преобразуется в высокоуровневый код МАСМ по простым алгоритмам.
     
  7. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.550
    Как и чем заменить векторы в чистом Си? Я видел в инете какие-то либы, но это увеличит проект, а мне надо чистый код. Т.е. есть сорц С++ вида
    Код (C++):
    1. vector<uint32_t> valKey;
    2. while (nval != val)
    3. {
    4. ++keys;
    5. uint16_t key = getSomething(buf, 2 + i);
    6. val = getSomething(buf, 4 + i);
    7. nval = getSomething(buf, 8 + i);
    8. valKey.push_back(key + pagesize * page);
    9. valKey.push_back(val + pagesize * page);
    10. ++readkeys;
    11. i += 4;
    12. }
    Нужно создать структуру и выделить память, или как ? Или просто выделить память и писать туда. Что-то мозг кипит с этой ерундой.
     
  8. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.796
    Придумай структуру вида указатель-позиция-размер и сделай пару функций, которые будут ее обслуживать. Аналог push_back при необходимости должен выделять буфер побольше, переносить содержимое предыдущего буфера в него, освобождать память предыдущего буфера, и дописывать данные в новый.
     
  9. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.550
    f13nd, спасибо. Кстати, я слышал, что плохо слишком часто вызывать realloc, чревато чем-то. Лучше выделить сразу большой объем. Стоит так делать или нет?
     
  10. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.796
    С GlobalAlloc с таким сталкивался, не интересовался даже почему. В определенный момент функция перестает выделять память, при том, что предыдущие буфера освобождаются. Обычно размер следующего буфера в 2.5 раза скалирую относительно предыдущего+дописываемых данных, не так часто перевыделяется буфер.
     
    Последнее редактирование: 16 окт 2018
  11. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.550
    Еще такой вопрос. Реально ли собрать бинарник из С++ кода, без CRT или какие там есть стандартные либы? Ну т.е. все эти New, Vector, **_cast - это особенности языка или библиотека?
     
  12. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.599
    Адрес:
    г. Санкт-Петербург
    Реально. Просто недостающие функции придётся самому подсовывать линкеру. В gcc делается при помощи флага -nostdlib.
     
  13. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.550
    SadKo, не совсем понял. ООП - это часть самого языка или часть CRT? Я понимаю, что можно самому скомпилировать и посмотреть асм-листинг, но мб кто-то сталкивался уже с этим. Си без CRT я знаю как и что, а с плюсами опыта раньше не имел. Сейчас есть сорц, я вот в раздумьях - или переписывать на Си, или можно как-то это использовать.
     
  14. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.599
    Адрес:
    г. Санкт-Петербург
    На самом деле, C++ можно использовать без CRT, но это чревато тем, что придётся реализовать самостоятельно:
    - функции статической инициализации, если будете конструировать объекты как глобальные либо статические переменные;
    - new, new[], delete, delete[];
    - функции генерации/отлова и обработки исключений, если будете их использовать;
    - динамическое приведение типа через dynamic_cast<>, если будете использовать RTTI;
    - всякие арифметические мелочи типа сложения, вычитания умножения, деления одного long long на другой long long.
    Ну и нужно учитывать, что у каждого C++ реализация всего этого своя.
    Я когда увлекался написанием ОС на Watcom C++, напилил свои куски для реализации минимального окружения для работы С++:
    https://sourceforge.net/p/xskernel/code/HEAD/tree/xskernel/include/lang/
    Похожее и вам придётся сделать.
     
  15. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.550
    Я ООП вообще не знаю, может и есть объекты в проекте, но это такое, разберемся.
    Вроде как в плюсах их можно переопределить? Видел сорцы , где new объявляли как функцию , вида HeapAlloc..
    Над всем остальным надо думать. Я просто пока не знаю, или переписать на С++ (не зная его), или на Си (опять же, я многих вещей в плюсах сходу не понимаю, этот язык намного строже чем Си).
     
  16. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.599
    Адрес:
    г. Санкт-Петербург
    Вы можете пойти по третьему пути - как я - писать на Си с классами. Отказаться от RTTI, STL и исключений, тогда от RTL потребуется минимум, большинство функций можно тупо как пустые заглушки реализовать.
     
  17. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.550
    SadKo, мне в С++ нравятся неймспейсы. Т.е. чтобы не писать что-то вида file_get_contents, http_upload_filе, можно кодить красивые File::GetContent,HTTP::Get и прочее. ООП я почему-то не люблю, даже в РНР пишу в процедурном стиле.
     
  18. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.599
    Адрес:
    г. Санкт-Петербург
    Неймспейсы - всего лишь синтаксический сахар, RTL им не нужна.
     
  19. d1337spy

    d1337spy New Member

    Публикаций:
    0
    Регистрация:
    12 май 2018
    Сообщения:
    2
    Есть задача! Есть решение но неверное помогите решить!
    Задача.png
    Как умножить число 5 и поместить его в массив char и потом вывести??

    Неверное решение!
    Код (C):
    1.  
    2. #include <iostream>
    3. #include <Windows.h>
    4.  
    5. unsigned long long int text[] = { 'n','u','m','b','e','r','5',' ' };
    6. DWORD meal = 0xDEADBEEF;
    7.  
    8. char new_text[sizeof text];
    9.  
    10. int main()
    11. {
    12.     for (int x = 0; (char)text[x]; x++)
    13.     {
    14.         new_text[x] = text[x];
    15.     }
    16.     snprintf(new_text + 8, sizeof new_text, "%x", meal);
    17.     for (int x = 0; new_text[x]; x++)
    18.     {
    19.         new_text[x] != '5' ? std::cout << new_text[x] : std::cout << ((new_text[x] - 48) * 5);
    20.     }
    21.     std::cin.get();
    22. }
     
  20. ReadMyName

    ReadMyName New Member

    Публикаций:
    0
    Регистрация:
    22 ноя 2018
    Сообщения:
    1
    Так не катит ?
    Код (C):
    1.  
    2. #include <iostream>
    3. #include <Windows.h>
    4. unsigned long long int text[] = { 'n','u','m','b','e','r','5',' ' };
    5. DWORD meal = 0xDEADBEEF;
    6. char new_text[sizeof text+1];
    7. int main()
    8. {
    9. for (int x = 0,  i=0; x < 8; x++)
    10. {
    11.     if (text[x] == '5')
    12.     {
    13.          itoa((text[x] - 48)*(text[x] - 48), &new_text[x], 10);
    14.          i = i + 2;
    15.          continue;
    16.     }
    17.        new_text[i] = text[x];
    18.         i++;
    19. }
    20. snprintf(new_text + 9, sizeof new_text, "%x", meal);
    21. std::cout << new_text << std::endl;;
    22. std::cin.get();
    23. }
    24.  
     
    d1337spy нравится это.