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

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

  1. quporos

    quporos New Member

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

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Спасибо!
     
  3. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Заработало правильно только в таком варианте:
    Код (Text):
    1. char* find(char* substr, char* str)
    2. {
    3.    for(;*str;++str)
    4.    {
    5.       if(*str==*substr)
    6.       {
    7.           char* substr_pos=substr;
    8.           char* str_pos=str;
    9.           for(;[b]*substr_pos==*str_pos && *substr_pos[/b];++substr_pos,++str_pos)
    10.               ;
    11.           if(!*substr_pos)
    12.             return str;
    13.       }
    14.    }
    15.    return 0;
    16. }
    Но у меня еще вопрос... я наверное совсем простых вещей не понимаю, но в третьей строчке есть различие между for(;*str;++str) и for(;*str;str++)? Мне казалось, что префиксный операнд должен сначала увеличивать переменную, и только потом передавать ее в тело цикло, однако отладчик показывает, что она передается в первый раз неизмененной...
     
  4. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Последнее выражение в операторе for всегда выполняется после тела цикла, то есть следующие 2 варианта эквивалентны:

    for ( for-init-statement; condition ; expression ) statement;

    {
    for-init-statement;
    while ( condition ) {
    statement ;
    expression ;
    }
    }

    В твоем случае нет разницы между пред- и пост-инкрементом, но как написано у тебя считается более кашерно.
     
  5. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    "реализовать на СИ простой алгоритм поиска подстроки в строке" очень просто, достаточно вызвать библиотечную функцию strstr. Если интересна именно реализация, и самостоятельно написать проблемно, перво наперво смотрим готовое, например в стадии:
    char * __cdecl strstr (
    const char * str1,
    const char * str2
    )
    {
    char *cp = (char *) str1;
    char *s1, *s2;

    if ( !*str2 )
    return((char *)str1);

    while (*cp)
    {
    s1 = cp;
    s2 = (char *) str2;

    while ( *s1 && *s2 && !(*s1-*s2) )
    s1++, s2++;

    if (!*s2)
    return(cp);

    cp++;
    }

    return(NULL);

    }

    Обрати внимание на const в параметрах функции, привыкай к правильному.
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Пытаюсь декомпилировать одну библиотеку, написанную на C++ и скомпилированную MSVS .NET(7.1).
    Столкнулся со следующей проблемой:
    пишу vector<string> v;, в релиз-версии на выходе получаю (MSVS 2008(9.0)):
    Код (Text):
    1.     push    4               ; unsigned int
    2.     call    ??2@YAPAXI@Z    ; operator new(uint)
    3.     xor     ecx, ecx
    4.     add     esp, 4
    5.     cmp     eax, ecx
    6.     jz      short loc_401041
    7.     lea     edx, [esp+2Ch+v]
    8.     mov     [eax], edx
    9.     jmp     short loc_401043
    10.  
    11. loc_401041:
    12.     xor     eax, eax
    13.  
    14. loc_401043:
    15.     mov     [esp+2Ch+v], eax
    16.     lea     eax, [esp+2Ch+v]
    17.     push    eax
    18.     mov     [esp+30h+v._Myfirst], ecx
    19.     mov     [esp+30h+v._Mylast], ecx
    20.     mov     [esp+30h+v._Myend], ecx
    а должно быть:
    Код (Text):
    1.     xor     ecx, ecx
    2.     mov     [esp+30h+v._Myfirst], ecx
    3.     mov     [esp+30h+v._Mylast], ecx
    4.     mov     [esp+30h+v._Myend], ecx
    Откуда взялось лишнее выделение памяти, и как от него избавиться?
     
  7. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Такс, все, разобрался.
    Путь таков:
    1)
    Код (Text):
    1. template<class _Ty,
    2.     class _Ax>
    3.     class vector
    4.         : [b]public _Vector_val<_Ty, _Ax>[/b]
    2)
    Код (Text):
    1. template<class _Ty,
    2.     class _Alloc>
    3.     class _Vector_val
    4.         : [b]public _CONTAINER_BASE_AUX_ALLOC<_Alloc>[/b]
    3)
    Код (Text):
    1. #if !_HAS_ITERATOR_DEBUGGING && (defined(_DEBUG) || [b]_SECURE_SCL[/b])
    2.     // We have an aux object.
    3.     #define _CONTAINER_BASE_AUX_ALLOC [b]_Container_base_aux_alloc_real[/b]
    4. #else
    5.     // We don't have an aux object.
    6.     #define _CONTAINER_BASE_AUX_ALLOC _Container_base_aux_alloc_empty
    7. #endif
    4)
    Код (Text):
    1.     explicit _Container_base_aux_alloc_real(_Alloc _Al)
    2.         : _Alaux(_Al)
    3.         {
    4.         _Myownedaux = [b]new (_Alaux.allocate(1)) _Aux_cont(this)[/b];
    5.         }
    Все решилось добавлением #define _SECURE_SCL 0 перед включением заголовков.
     
  8. Stampler

    Stampler New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2010
    Сообщения:
    5
    Здравствуйте. посоветуйте пожалуйста как удобно послать POST Http запрос на сервер в котором буду содержаться аргументы (id=111, arg2=blabla) и прикреплен файл.
    WinInet справляется либо с аплоадом файла, либо с передачей аргументов. Делать ито и другое одновременно он отказывается.
    Мб есть уже готовые решения поэтому поводу ? очень нехочется изобретать велосипед.
    Спасибо
     
  9. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Здравствуйте,

    У меня возникла проблема при приведении ADT к наследованному от ADT классу. А именно(смоделированная ситуация):
    "Error 1 error C2440: '=' : cannot convert from 'void (__thiscall Square::* )(void)' to 'void (__thiscall Shape::* )(void)'"

    Исходник тут(небольшой): http://www.everfall.com/paste/id.php?c90gkk9mrpp7

    Спасибо.
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Сделать reinterpret_cast, хотя это изначально порочно. Почему не pFunc = &Shape::GetSum;?
     
  11. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Booster

    А можно поподробней, почему он не может привести Square к Shape? Мне именно это интересно. За решение - спасибо.
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Noga
    Если кратко, то этого тупо нет в стандарте. Если более развёрнуто, то производный класс также является и базовым, а функция производного класса никак не является функцией базового. Это в общем и понятно, так как функция класса это по-сути смещение, а оно не эквивалентно в родственных связях. По-этому reinterpret_cast порочен, где-то оно может работать, а где-то даст фейл, по причине разных смещений.
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Попытка вызвать функцию базового класса, через указатель(смещение) производного. Некорректно.

    Попытка вызвать функцию базового класса, через указатель(смещение) базового. Корректно.
     
  14. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Booster

    Спасибо!
     
  15. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Booster
    Добавлю пять копеек - даже как бы наоборот, функция-член базового класса является функцией-членом производного.
     
  16. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Кстати, в стандарте это есть - 14882:2003 4.11
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ustus
    За некоторыми исключениями конечно. А конкретно о приведении функции производного к функции базового, там всё же по-моему молчёк, что не разрешено, то запрещено.
     
  18. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Booster
    Да ну, не говори ерунды - это же основы type safety, если в таких местах находится прокол - весь комитет делает харакири пока не подпилят стандарт. Но здесь, насколько знаю, ниче не пилили - чуть ли не с 93-го года.
    Для недоверчивых :)
    и сноска там еще:
    - это собственно, о чем и говорилось.
     
  19. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Вообще, конечно, стандарт С++ начинает выглядеть устрашающе... :) а на носу еще и С++0х...
     
  20. voo

    voo New Member

    Публикаций:
    0
    Регистрация:
    3 май 2010
    Сообщения:
    5
    здравствуйте), подскажите пожалуста, как на си через xlib нарисовать точку (с заданным цветом) без разных циклов while XNextEvent... то есть создал скрин, окно и нарисовал. очень надо, буду очень благодарен!)