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

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

  1. d1337spy

    d1337spy New Member

    Публикаций:
    0
    Регистрация:
    12 май 2018
    Сообщения:
    2
    Катит!
     
  2. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    413
    Возможно уже было. Вопрос?
    Как узнать разрядность и тип целевого процессора в С++? Нужен именно #define, попробовал size_t частично помогло, но sizeof(size_t) не срабатывает в препроцессоре.
    Ещё попробовал так:
    Код (C++):
    1. #ifdef _M_AMD64
    2. #define     __PLATFORM__     64   //разрядность целевого процессора
    3. #define     _I586_           //команда RDTSC доступна
    4. #elif  _M_IX86
    5. #define     __PLATFORM__     32   //разрядность целевого процессора
    6. #define     _I586_           //команда RDTSC доступна
    7. #else
    8. #define     __PLATFORM__     16   //разрядность целевого процессора
    9. #endif
    Работает в VS C++, но не уверен, что, код сработает на всех компиляторах С++, да, нужно чтобы и TurboC иже с ним, тоже работало как надо.
    ЗЫ
    Только что мысль торкнула, псевдо-условная компиляция.
    Код (C++):
    1.  
    2. const int _PLATFORM_ = sizeof(size_t);
    3. ....
    4. if (_PLATFORM_==64){
    5.    код для 64 битного варианта
    6. }else if(_PLATFORM_==32){
    7.    код для 32 битного варианта
    8. }
    Должно работать, если компилятор более или менее оптимизирующий, и догадается удалить мёртвый код. :):umnik2:
     
    Последнее редактирование: 15 мар 2019
  3. Fail

    Fail Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2012
    Сообщения:
    504
    Это штоле, или я не понимаю?:)

    #ifdef _WIN64

    #else

    #endif
     
  4. SadKo

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

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.599
    Адрес:
    г. Санкт-Петербург
    Я в своё время поступил так:
    https://github.com/sadko4u/lsp-plug...38670c2d3a28ab97c419a4754/include/dsp/types.h
    Пример conditional-кода:
    https://github.com/sadko4u/lsp-plug...c419a4754/src/test/utest/dsp/pcomplex/mul.cpp
    --- Сообщение объединено, 15 мар 2019 ---
    Ну и вы перепутали понятие платформы и архитектуры. Платформа - это ОС, под которой запускаете, а архитектура - это ЦП, на котором запускаете.
     
  5. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    413
    Понятно, спасибо!
    Тут ещё проблема, есть ли интринстик __popcnt64 в GCC, _popcnt64 есть, но там прототип не правильный(u8 __popcnt64(u64)), надо u64 __popcnt64(u64), чтобы не делать лишнее преобразования, из-за этого выполняется лишний такт, для меня это много.
     
  6. SadKo

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

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

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    413
    Ассемблер использовать нежелательно, т.к. плохо оптимизируется. Интересно, а сам gcc 8.2 можно поковырять? Если подправить исходники, то проблема отпадёт само собой.
     
  8. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    5.439
    https://github.com/gcc-mirror/gcc ковыряй :)
     
  9. Pitilab

    Pitilab New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2018
    Сообщения:
    5
    Добрый день , занимаюсь самостоятельно изучением си. Добрался до указателей , вроде бы все понятно. Но вот сложение целочисленного с указателем как то не усвоилось. Не понятна мне такая арифметика
     

    Вложения:

    • 1qwWr4Wk_f8.jpg
      1qwWr4Wk_f8.jpg
      Размер файла:
      79,7 КБ
      Просмотров:
      452
  10. Bedolaga

    Bedolaga Member

    Публикаций:
    0
    Регистрация:
    10 июл 2019
    Сообщения:
    131
    Что тут может быть непонятного? Это перемещение указателя с шагом равным размеру типа на который он указывает...
    --- Сообщение объединено, 30 сен 2019 ---
    У тебя на картинке совсем не то о чем ты спрашиваешь...
     
  11. Pitilab

    Pitilab New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2018
    Сообщения:
    5
    как не то ? сложение указателя с целочисленным понятно , шаг размера типа тоже понятно . не понятно ++ и * в одном выражение . понятно что они одного ранга выполняются справо налево . не понятно как (Y) принимает такие значения. которые на картинке
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    4.895
    y = *i++ (сначала применяется разъименование, потом инкремент указателя, поэтому значение берется до того, как указатель передвинули вперед)...
    y = ++*i (сначала применятся разъименование, потом к результату разименование (двойке) применяется инкремент)...
    y = *++i (сначала применяется инкремент указателя, затем разъименование)...
    y = (*i)++ (сначала делается разъименование, значение по указателю увеличивается на единицу (пятерка), но постинкремент возвращает значение до инкремента, то есть четверку)
    y = ++(*i) (сначала делается разъименование, значение по указателю увеличивается на единицу (шестерка), и прединкремент возвращает значение после инкремента, то есть шестурку)
    и да, сишечка такой язык, в котором черт ногу сломит... щас сам минут пять вдуплял, почему тут что...
     
    Pitilab нравится это.
  13. Pitilab

    Pitilab New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2018
    Сообщения:
    5
    спасибо вам хороший человек ! Rel
    Pitilab,
    Правила форума WASM
     
    Последнее редактирование модератором: 1 окт 2019
  14. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    413
    Есть такая структура.
    Код (C):
    1.  
    2. struct Fvector {
    3. public:
    4.    union {
    5.       struct {
    6.          float x,y,z,_;
    7.        };
    8.        __m128 m;
    9.    };
    10. ...
    11.  
    Надо задать константы. Так даёт ошибку.
    Код (C):
    1. static  const  __m128   ABS__m128 = { 0x7FFFFFFFu, 0x7FFFFFFFu, 0x7FFFFFFFu, 0 };
    Как правильно сделать? Надо задать именно dword'ы.
     
    Последнее редактирование: 24 дек 2019
  15. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    4.895
    _mm_set_ps не?
     
  16. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    413
    Проблема именно в static const __m128 ABS__m128 = { 0x7FFFFFFFu, 0x7FFFFFFFu, 0x7FFFFFFFu, 0 };
    А так ошибки компиляции нет.
    static const __m128 SIGN__m128 = { -0.f, -0.f, -0.f, 0.f }; //константа для смены знаков
    А вот целые дают ошибку компиляции. Компилятор VS2010.
     
  17. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    4.895
    Так и правильно дают, там же 4 флоута внутри, а не инты, вопрос какой?
    --- Сообщение объединено, 24 дек 2019 ---
    Я не понимаю, что ты пытаешься сделать, пихая во флоуты беззнаковые инты? Это бред какой-то.
    --- Сообщение объединено, 24 дек 2019 ---
    http://fastcpp.blogspot.com/2011/03/changing-sign-of-float-values-using-sse.html?m=1
     
  18. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    413
    Сделать инструкцию absps xmm.
    Структура __m128 представляет себе объединение, можешь посмотреть intrin.h, точней в xmmintrin.h
    Значит как то можно задать dword'ы.
    Пробовал так
    static const __m128 ABS__m128::m128_u32 = { 0x7FFFFFFFu, 0x7FFFFFFFu, 0x7FFFFFFFu, 0 };
    Не получается.
     
  19. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.796
    Intro, кастани ты эти переменные в тот тип, в который помещаешь. В цэ нельзя просто так взять и присвоить переменной одного типа значение другого типа, это защита от дурака.
     
  20. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    413
    Всё равно не понятно, надо чтобы неявного преобразования не было.
    Т.е. происходит (float)0x7FFFFFFFu, а мне надо чтобы константа не менялась.
    Вроде как-то reinterpret_cast надо использовать, но у меня что-то не работает.
    Да, это С++. Попытка вычислять методы вектора (x,y,z) с помощью sse инструкций, параллельных естественно.
     
    Последнее редактирование: 24 дек 2019