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

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

  1. dotzen

    dotzen New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2008
    Сообщения:
    10
    Спасибо varnie помог решыть проблему.
     
  2. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Я тут шизею потихоньку от Си.
    Мне нужно сравнить два символа в строке с нужным значением.
    Код (Text):
    1. На асме:
    2. char b[] = "caption";
    3.  
    4. lea eax, b
    5. .if word ptr [eax], 'ac'
    6. ...
    7.  
    8. На Си:
    9.  
    10. if (*(WORD*)&b[0] == (WORD)'ac')
    11. { ...
    Я блин ничего не путаю? Тут легко ошибиться забыв поставить какой-нибудь значек. Может проще можно?

    PS. Это к вопросу о том, что сложнее для понимания, Си или асм.
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Это можно заменить на такое:
    Код (Text):
    1. if ('ac' == *(WORD*)b)
    2. или С++
    3. if ('ac' == (WORD&)b[0])
    Придерживаюсь правила константы помещать слева от ==

    Именно так, Си сложнее, а С++ и подавно.
     
  4. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Booster
    Спасибо! (WORD&)b[0] это для меня в новинку.
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Aspire
    это элементарное привидение в ссылку на тип
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Aspire
    Может проще можно?
    Я бы даже сказал необходимо проще
    Код (Text):
    1. if ('c' == b[0] && 'a' == b[1])
    ps как себя поведет 'ca' и 'ac' с учетом big/little-endian?
     
  7. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    может лучше тогда strncmp(b, "ac", 2)?
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хахах щас пойдут еще извращенные варианты с подсчетом контрольной суммы и т.п.)
     
  9. xROM

    xROM New Member

    Публикаций:
    0
    Регистрация:
    30 сен 2008
    Сообщения:
    21
    для IOCCC как раз самое то)
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    nobodyzzz
    Для двух символов точно нет.
    Afaik strncmp не инлайнится - дополнительные расходы на вызов, + компилятор сгенерирует константную строку. Даже если инлайнится выигрыш маловероятен.

    ps со скольких символов использовать strncmp обсуждать не готов.
     
  11. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Десять лет как устарело. Компилятор сгенерирует предупреждение на "=" в условии (не говоря уже о Lint etc).

    if (*(WORD*)b == (*WORD*)"ac")

    Не уверен, что все компиляторы пропустят такой "литерал" - 'ac'.
     
  12. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    gazlan Я конечно могу ошибаться, но помоему "ac" - это строка закончивающаяся нулем, в отличие от 'ac'

    [add] И еще...вроде как, константы не приводятся, поэтому нах там (*WORD*)"ac" ?
     
  13. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    "ac" - это указатель на строчку. ты этот указатель приводишь к указателю на ворд. Поэтому при сравнениии будут учитываться только первые два байта, неважно чем саканчивается нулем или еще чем.
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    gazlan
    В чём это устарело? В том, что для выявления этого в VC нужно включить 4 левел варнингов? Генерация ошибки по-твоему хуже?

    if (*(WORD*)b == *(WORD*)"ca")
    if (*(WORD*)&b[0] == *(WORD*)"ca")
     
  15. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Спасибо всем за разъяснения. У меня теперь следующая проблемка. Как мне скомпилить cpp файл с моим файлом ресурсов, который я сделал в стороннем (не в VC) редакторе ресурсов?
    Попробовал его конвертировать с помоью cvtres - он не может.
    Собираю obj файл с помощью масмовского rc.exe и дальше линкую оба файла с помощью link.exe из пакета VC, экзешник создается, а секции ресурсов - нет.

    В общем, я понимаю, что это - изврат.

    Еще раз вопрос: Есть cpp файл который собирается без стандартной библиотеки, есть файл ресурсов собранный с помощью стороннего редактора, мне нужно собрать два файла в один рабочий ехе.

    Может есть пример?
     
  16. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Aspire
    Код (Text):
    1. cl.exe ... /c source.c
    2. rc.exe /n /v resource.rc
    3. cvtres.exe /nologo /machine:ix86 /out:"resource.cvt" resource.res
    4. link.exe ... source.obj resource.cvt
    вместо многоточия ключики для компилятора и редактора связей.
    rc.exe cvtres.exe в аттаче, если не хватит dll'ек пиши.
     
  17. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    q_q
    МегаСенкс!
     
  18. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    To All. Посмотрите, плиз, проффесиональным взглядом. Переписываю с масма на Си (изучаю предмет, т.с).
    Что-то не правильно компилиться, либо я где-то накосячил. Скорее всего второе.
    срр файл:
    http://www.everfall.com/paste/id.php?xxvulyu2vpjh
    rc файл:
    http://www.everfall.com/paste/id.php?b4ywj3v8sypn
    на всякий случай resource.h:
    http://www.everfall.com/paste/id.php?ae5t3w6avnhe

    Обработку событий и еще много чего, я убрал умышленно, дабы не засорять сорец ненужной информацией.
    Компилю без стд библиотеки.
    Бинарник прикреплен.

    Проблема в том, что окно не отображается, RegisterClassEx возвращет не ноль, но GetLastError говрит что ERROR_FILE_NOT_FOUND, после этого CreateDialogParam возвращает ноль с ERROR_INVALID_MENU_HANDLE.

    [add] ENTRY/main
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Aspire
    > срр файл
    Окно отобразится если сделать так
    Код (Text):
    1. 123. //    DefWindowProcA(hwnd, msg, wParam, lParam);
    2. 124. //    return 0;
    3.     return DefWindowProcA(hwnd, msg, wParam, lParam);
    4. 125. }
    правда, не уверен что это правильное решение. Обычно, DefWindowProc принято звать, если оконную процедуру не интересует сообщение, раумеется есть исключения.

    ps
    > rc файл
    Почему кирилица?
    Код (Text):
    1. 2. #define Онлайн 1001
     
  20. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    q_q
    Не хватает слов, чтобы выразить свое признание. Еще раз спасибо. Впредь, постараюсь быть внимательней.
    Окно отображается и даже реагирует на сообщения, только с небольшой поправкой.
    Тут вылезла одна "фича". Например, кнопка "exit" у меня в файле ресурсов имеет ID 100070, если перевести в хекс, то получится 0х186Е6 и именно это значение сравнивается с нижним _словом_ wParama, которое на самом деле оказывается 0х86Е6. Масм как-то сам отбрасывал старшие биты, здесь пришлось самому уменьшить Id.
    Учусь дальше, спасибо.