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

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

  1. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90
    спасибо
     
  2. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Вопрос по локальным (стековым) переменным.
    Есть ли возможность реализовать это:
    void STACK(DWORD dwStackSize)
    {
    DWORD dwData[dwStackSize];
    }
    Пример конечно убогий, но суть вопроса отражает.
     
  3. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Если dwStackSize не известен на этапе компиляции то нельзя.
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    MirrorBlack
    только если сам сделаешь кадр стека
     
  5. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    TSS
    Т.е. следующий код на Сях изобразить нельзя?

    sub esp,[ebp+8]
    бла бла бла
    add esp,[ebp+8]
     
  6. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    GoldFinch
    А как?
     
  7. InsidE

    InsidE Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    357
    Адрес:
    Over the hills and far away...
  8. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    MirrorBlack
    в MSVC можно написать както так
    Код (Text):
    1. #include <iostream>
    2.  
    3. __declspec(naked)
    4. void foo(int n)
    5. {
    6.     char* pbuf;
    7.     __asm {
    8.         push ebp
    9.         mov ebp,esp
    10.         sub esp,4 //для pbuf
    11.         sub esp,n
    12.         mov pbuf,esp
    13.     }
    14.  
    15.     *pbuf=n;
    16.     std::cout<<*pbuf<<"\n";
    17.  
    18.     __asm {
    19.         mov esp,ebp
    20.         pop ebp
    21.         ret
    22.     }
    23. }
    24.  
    25. int main()
    26. {
    27.     foo(0x32);
    28. }
    однако большие куски лучше (заранее) выделять в хипе, а небольшие - сразу макс. размера
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Вообще-то sub esp,n может неправильно работать, если n больше размера страницы.
    Динамическое выделение памяти в стеке делается функцией alloca:
    http://msdn.microsoft.com/en-us/library/wb1s57t5.aspx
    http://www.gnu.org/s/libc/manual/html_node/Variable-Size-Automatic.html
     
  10. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    diamond
    А в чём это может выражаться?
    И о каких страницах идёт речь? Страницы тоже разные бывают - 4к, 2м(PAE), 4м(PSE).
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Зачем это? Объявить автоматическую переменную и будет sub esp.
     
  12. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Booster
    Ну как это зачем? Для выделения памяти в стеке.
    Вариант сразу выделять max объём - не кошерный :)
     
  13. Booster

    Booster New Member

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

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Booster
    Вот и пытался в #1165 выделить.
     
  15. yaskhan

    yaskhan New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    29
    Не могу понять, что означает функция (или процедура?) без тела.
    Например, там просто написано:

    void чтото (чтото, чтото, чтото)

    И нет никаких фигурных скобок.
    Спс.
     
  16. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    yaskhan
    А ты в конце void чтото (чтото, чтото, чтото) не забыл добавить ";" ?
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    MirrorBlack
    Да зачем это надо? Уверен на 100%, что этого можно избежать.
     
  18. Booster

    Booster New Member

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

    yaskhan New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    29
    Ну это ж всеголиш пример. Я переважу с Си на асм, и там все правильно написано.







    Отредактировано yaskhan 01.02.2023-12:55
     
  20. Booster

    Booster New Member

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