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

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

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    C++ дает гораздо больше способов написать программу неправильно, чем наверно любой другой язык. Поэтому большинство программистов испытывают от этого резкую ональную боль, и считают что C++ не нужен.
     
  2. Mentor

    Mentor New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2010
    Сообщения:
    67
    С++ дает возможности.
    Одним - возможности выстрелить себе в ногу и убить проект.
    Другим - создать удобнейшие абстракции и решить задачу быстро и красиво.
    В общем, каждый решает и выбирает сам и для себя. Не нравится С++ - никто не агитирует и не заставляет, пишите на PHP, там ни память не потечет ни объект неявно копироваться не будет. Но, чёрт возьми, как приятно когда за полчаса создаешь индексированное хранилище в разделяемой памяти и оно потом без сучка и задоринки работает годами
     
  3. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    у кого в С++ все падает тот и на С писать не умеет
    сейчас учу С++ после С и он идет как по накатанной
    потому что глупых ошибок низкоуровневых уже не делаеш
    надо только научится тому что добавил С++ к С
    C++ дает очень много удобств по сравнеию с C
    чего только стоят константные ссылки когда не надо
    специально заводить переменную чтоб передать ее адрес
    перегрузка имен функций конструкторы деструкторы
    и список можно продолжить ...
    мне С нравится и в С++ тоже многое по душе
    на С можно писать сразу в итоге если проект большой то убъеш больше
    времени чем проектирование классов и написание того же проекта на С++
    так еще и безопасней намного почти все управление памятью можно
    свалить на области видимости объектов вместо того чтоб
    устраивать в каждой функции страшный goto err1 goto err2 goto err3
    на C++ в чем то намного легче писать сравните например
    проект с строками типа char* и std::string CString
    с последними работать намного приятнее
    да я знаю что есть g_string_new g_string_free но все скатится
    к тому что в каждой функции будет goto err1 err2 err3
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Mentor
    Нет разницы когда происходит компиляция под процессор, при создании или при запуске. Доступ без посредников? Враперы зло? Не смешите. Существенно большая эффективность при грамотном использовании? Лисп компиляторы генерируют очень эффективный код. Есть задачи где С++ впереди, есть где другие языки. Далеко не всегда необходима максимальная производительность. С++ уступает в производительности и Си и ассемблеру.

    Какие такие, если он сильно уступает в этих самых абстракциях очень многим языкам? Вы наверно не пробовали другие языки. Новый стандарт кое-как исправит ситуацию, но когда он будет пока туманно.
     
  5. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    Ясно. Всем спасибо. Понял что ничего не понял, а точнее со временем придет )). И вразумил, что одни задачи нужно/можно решать на C++, другие тоже можно, но стоит ли(больше времени, сложнее, и т.п.).
     
  6. heed

    heed New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    21
    Можно-ли на C как-то управлять этими манипуляциями в функциях с ebp, esp ?

    Пробую вытащить из libc.lib (от DDK-server_2003) некоторые фрагменты, ida показывает такое
    Код (Text):
    1. public ____mb_cur_max_func
    2.  ____mb_cur_max_func proc near
    3.                 mov     eax, dword ptr ds:___mb_cur_max
    4.                  retn
    5.  ____mb_cur_max_func endp
    пишу такой __mb_cur_max_func.c
    Код (Text):
    1. extern ___mb_cur_max;
    2.  
    3. void ____mb_cur_max_func(void) {
    4.  __asm mov eax, dword ptr ___mb_cur_max;
    5. }
    компилирую строкой cl /c __mb_cur_max_func.c
    получается такое
    Код (Text):
    1. public _____mb_cur_max_func
    2.  _____mb_cur_max_func proc near
    3.   push    ebp
    4.   mov     ebp, esp
    5.   mov     eax, dword ptr ds:____mb_cur_max
    6.   pop     ebp
    7.   retn
    8. _____mb_cur_max_func endp
    Возможно-ли на С вообще как-то такое в функции ?

    upd//
    Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 13.10.4035 for 80x86
    то-же самое с
    char* ____mb_cur_max_func(void) {
    return (char*) ___mb_cur_max;
    }
     
  7. heed

    heed New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    21
    извиняюсь, разобрался :)
    не сразу сообразил попробовать добавлять /O1
    cl /c /O1 __mb_cur_max_func.c
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    можно писать __declspec(naked), и тогда компилятор вообще не будет писать свой код в твою функцию.
     
  9. heed

    heed New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    21
    задача как-раз была обратная.
    собирал perl c msvcrt.lib от 6й версии msvc подсунутой в это-самое ddk в котором была msvcrt от 7й версии.
    сначала запросило __ftol2 выдернул из libc.lib этой 7й версии, проглотило
    потом ext/OPOSIX модуль запросил эту самую _____mb_cur_max_func , даже что-то вроде __imp_____mb_cur_max_func, пришлось пересобирать obj-файлы которые тянули за собой много лишнего, и + из стандартного ctype.h убирать эти самые __declspec(dllimport)
    Код (Text):
    1. //my _CRTIMP extern  <-> extern
    2. extern int __mb_cur_max;
    3. //my _CRTIMP <-> extern
    4. extern int __cdecl ___mb_cur_max_func(void);
    потом Time::Hres::gettimeofday запросило __aulldvrm тоже просто выдернул

    После этого всё м собралось. вернее собирается-то минут за 15, а 'nmake test' уже пол часа чего-то тестит, никак не дотестит :)
    осталось разобраться есть-ли разница собирать-ли эти .obj-файлы в .lib или не собирать.
    и как-то проверить не залинковало-ли их в каждые dll-exe файлы

    //upd может кому понадобится прикрепил obj-файлы (если чего-нибудь не забыл)
     
  10. heed

    heed New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    21
    дотестило, результат странный.
    Код (Text):
    1. Test Summary Report
    2. -------------------
    3. ../dist/IO/t/io_sock.t                                          (Wstat: 0 Tests: 25 Failed: 0)
    4.   Parse errors: Tests out of sequence.  Found (12) but expected (11)
    5.                 Tests out of sequence.  Found (13) but expected (12)
    6.                 Tests out of sequence.  Found (14) but expected (13)
    7.                 Tests out of sequence.  Found (15) but expected (14)
    8.                 Tests out of sequence.  Found (16) but expected (15)
    9. Displayed the first 5 of 16 TAP syntax errors.
    10. Re-run prove with the -p option to see them all.
    11. Files=1807, Tests=357058, 1520 wallclock secs (118.88 usr +  4.36 sys = 123.23 CPU)
    12. Result: FAIL
    13. NMAKE : fatal error U1077: '..\perl.exe' : return code '0x10'
    14. Stop.
    кажется надо разобраться

    upd//
    странные тесты или firewall был виноват, после nmake install запустил снова это nmake test -p уже другой результат
    Код (Text):
    1. All tests successful.
    2. Files=1807, Tests=358110, 1504 wallclock secs (115.83 usr +  4.14 sys = 119.97 CPU)
    3. Result: PASS
    4.         cd ..\win32
    или я чего-то не понял, но пересобирать лениво, буду собирать модули к тому чего есть.
     
  11. heed

    heed New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    21
    Ещё появился вопрос по cl

    Не пойму чего не хватает в коммандной строке

    Код (Text):
    1. Microsoft (R) Program Maintenance Utility Version 9.00.30729.207
    2. Copyright (C) Microsoft Corporation.  All rights reserved.
    3.  
    4.  
    5.         if not exist "_x86_0x0500_RELEASE/" mkdir _x86_0x0500_RELEASE
    6.  
    7.         cl -nologo -c /TC /GS- /Os -Ox -DNDEBUG -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl
    8.        -D_WINNT -D_WIN32_WINNT=0x0500 -D_WIN32_IE=0x0601  -DWINVER=0x0500
    9.        -D_X86_=1 -DWIN32 -D_WIN32
    10.       -W3 /Fa_x86_0x0500_RELEASE\CLSCP.asm
    11.              /Fd_x86_0x0500_RELEASE\CLSCP.pdb
    12.               /Fo_x86_0x0500_RELEASE\CLSCP.obj CLSCP.c
    13. CLSCP.c
    14. .................
    вроде должен создаваться файл.pdb но его почему-то нет

    Код (Text):
    1. J:\_my_src\CLSCP>Tree _x86_0x0500_RELEASE /F
    2. Структура папок тома sl
    3. Серийный номер тома: 00450052 20F5:B832
    4. J:\_MY_SRC\CLSCP\_X86_0X0500_RELEASE
    5.     CLSCP.asm
    6.     CLSCP.obj
    7.     CLSCP.res
    8.  
    9. Подпапки отсутствуют
    что-то кроме /Fd_x86_0x0500_RELEASE\CLSCP.pdb ещё добавляется?
    // извиняюсь просто нет msvc, чтобы заглянуть чего оно там ещё добавляет
     
  12. heed

    heed New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    21
    осознал.
    оказалось это для линкера нужно задавать /PDB:filename

    // Не первый раз за собой замечаю что думать нормально неполучается пока не запостить вопрос и ещё раз не подумать над ним :) Ещё раз извиняюсь. Вопрос можно удалить
     
  13. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Компилятору /Zi, линкеру /DEBUG.
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Кстати да, без /DEBUG может не сгенерить debug directory
     
  15. tid

    tid Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    57
    вопрос по указателям:

    вот такой пример:

    unsigned long *point;
    char *h = "lol"; /*0x004157a8*/
    * (long *) &point = 0x004157a8;
    printf("%s\n", (char *) point); /*на экране lol*/

    если я правильно понимаю, то в строчке:

    * (long *) &point = 0x004157a8;

    мы с начала получаем адрес переменной-указателя point
    потом приводим этот адрес к типу указатель на число типа long
    потом разыменовываем и по адресу указателя записываем в ручную новый адрес. вся фишка в том что бы получить адрес указателя.

    если убрать приведение типов (long *) и оставить только * &point, то компилятор только ругается.
    весь трабл в том что адрес указателя непонятного типа и что разыменовывать не ясно?

    0x004157a8 - посмотрел в отладчике своего MS VC++ 2008 EE
     
  16. tid

    tid Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    57
    короче вроде все тут ясно, но код какой то суровый, это в одной статейке на такую конструкцию наткнулся...
     
  17. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    tid,

    Как-то замудрёно: point = (unsigned long *) 0x4157a8; сработает с тем же эффектом, но выглядит приличнее. А статья, случаем, была не в стиле вредных советов?
     
  18. tid

    tid Member

    Публикаций:
    0
    Регистрация:
    2 дек 2010
    Сообщения:
    57
    baldr
    спасибо! ваш способ более понятен и красив.
    это из хакера декабря 2006.
     
  19. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    Привет.
    Есть двумерный вектор:

    Код (Text):
    1. vector < vector < int > > myVector( 10, 15 );
    Как мне узнать количество строк и столбцов в нем?

    Код (Text):
    1. myVector.size();
    Возвращает только количество строк.
     
  20. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    В каждом из векторов может быть разное количество элементов. Т.е. ваша "матрица" может быть такой:
    Код (Text):
    1. строка1 * * * * *
    2. строка2 * * *
    3. строка3 * * * * * * * * * *
    4. строка4 *
    узнать количество элементов в строке i можно так:
    Код (Text):
    1. myVector[i].size();
    Так как у Вас все строки имеют одинаковое количество элементов, достаточно узнать размер любой из них, например той, что с индексом 0:
    Код (Text):
    1. myVector[0].size();