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

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

  1. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Вобщем даже в релиз конфигурации компилер пихает в импорт MSVCR90.dll, а затем вызывает:

    .text:0040119F call _crt_debugger_hook

    Изза этого падает.
     
  2. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Вобщем решение - /NODEFAULTLIB и убрать ключ /GS
     
  3. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    А ларчик просто открывался, надо отключить проверку переполнения буфера и всё в ажуре.
     
  4. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    TSS
    Пришли к финишу одновременно :)
    Только зачем /NODEFAULTLIB ?
     
  5. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Ну можно именно MSVCR90.dll прописать, это не важно )
     
  6. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    А хотя достаточно убрать ключ /GS.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну вы даете, я думал вы отключили.
    Я обычно в опциях компилера, если мне нужно собрать с ноудефолтлиб, выставляю:
    1) C/C++ -> Code Generation -> Basic Runtime Check: Default
    2) C/C++ -> Code Generation -> Buffer Security Chech: No (/GS-)
    3) Linker -> Input -> Ignore All Default Libraries: Yes (/NODEFAULTLIB)
    4) Linker -> Input -> AdditionalDependencies: ntdll.lib (там есть немного функций из crt)
    5) Linker -> Manifest File -> No (помню какието глюки с этим были)
    6) Linker -> Advanced -> Enter Point: моя-точка-входа
     
  8. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    А что реально даёт /NODEFAULTLIB ?
    Ведь потом ручками все либы подключать надо.
    Не верится что линкер натолько туп, что ссылки на неиспользуемые функции подцепит (у меня не цепляет).
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    MirrorBlack
    С подключенной CRT точка входа меняется на (main/WinMain)CRTStartup, которая выполняет кучу инициализирующих CRT действий, импортируя некоторые функции их кернел32 и тд., отчего размер программы возрастает на несколько десятков килобайт, что в некоторых случаях бывает неприемлимо.
     
  10. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Great
    Но на форуме так же советуют его использовать когда своя точка входа.
    Пример:
    http://www.wasm.ru/forum/viewtopic.php?id=31966
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Да используй как хочешь-)
    Точнее, что лучше подходит для твоих целей. Если переопределить точку входа и оставить црт, то не будут работать функции ввода-вывода (придется вручную вызывать _io_init() из точки входа)
     
  12. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Great
    Четно - не понял.
    В примере выше используется своя точка входа, но не используется /NODEFAULTLIB.
    IDA показывает нормальный код без "излишеств". Никакой CRT даже близко не пахнет.
    Из ключей по умолчанию менял только манифест и /GS.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Что непонятного?)
    Хочешь - ставь свою точку входа, хочешь - не ставь.
    Если ставишь свою - можешь отключить црт. Можешь не отключать.
    Если не ставишь свою - придется не отключать црт или самому определить main/WinMainCRTStartup.
    4 варианта) I + a, I + b, II + a, II + b.

    Чето я вообще не понял, чего непоняно)
     
  14. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Скажите пожалуйста, как использовать namespace в многофайловых программах.
    Например, в файле file1.cpp есть:
    namespace data
    {
    int d1;
    int d2;
    void mb()
    {
    MessageBox(0, L"test", 0, 0);
    }
    }
    Как увидеть эту "красоту" d file2.cpp
    В инете все найденные примеры сводились к тому, что где определил namespace - там и используй.
    Что в file1.h записать - непонятно.
     
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    MirrorBlack
    А без namespace умеешь? namespace можно указывать как в объявлении так и в определении.
     
  16. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    MirrorBlack
    Вообще хороший тон писать не так:
    Код (Text):
    1. // file1.h
    2. #ifndef __file1_h__
    3. #define __file1_h__
    4.  
    5. namespace data
    6. {
    7. extern int d1;
    8. extern int d2;
    9. void mb();
    10. }
    11.  
    12. #endif
    Код (Text):
    1. // file1.cpp
    2. #include "file1.h"
    3.  
    4. int data::d1;
    5. int data::d2;
    6.  
    7. void data::mb()
    8. {
    9.     // ...
    10. }
    где-то так.
     
  17. DoubleOn

    DoubleOn New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2009
    Сообщения:
    62
    Камрады помогите пожалуйста написать прогу задание из павловской С/с++ структурное программирование.Практикум
    Задание такого
    Элемент матрицы называеться локальным минимумом если он строго меньше всех имеюшихся у него соседей.Подсчитать количество локальных минимумов в заданной матрице 10 на 10.Найти сумму элементов выше главное диагонали.

    Сумму элементов выше деагонали я нашел и написал а вот с локальными миниммами никак не могу понять.Может кто сталкивался?:
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    DoubleOn
    Чего тут сложного? Обходишь все элементы, для каждого делаешь проверку обходя его соседей.
     
  19. DoubleOn

    DoubleOn New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2009
    Сообщения:
    62
    Booster
    ну раз спросил совета значит сложно :dntknw:
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    DoubleOn
    Всё равно сложно? ^) Примерно так:
    Код (Text):
    1. int countMin = 0; //количество минимумов.
    2. for (int j=0; j<10; j++)
    3. {
    4.   for (int i=0; i<10; i++)
    5.   {
    6.      int max = 0;
    7.      //находим максимум для соседей.
    8.  
    9.      //первый сосед
    10.      if (matrix[j-1][i]>max)
    11.        max  = matrix[j-1][i];
    12.  
    13.      //второй сосед
    14.      if (matrix[j][i-1]>max)
    15.        max  = matrix[j][i-1];
    16.  
    17.     //остальные соседи.
    18.     .......
    19.  
    20.     //после того как нашли максимум соседей, делаем проверку с текущим элементом.
    21.      if (matrix[j][i]<max)
    22.        countMin++;
    23.   }
    24. }
    Проверку на пограничные элементы не описывал, как и всяческие оптимизации. Если и теперь будет не понятно, то прошу в коммерц. ^)