1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Ошибка выделения памяти, как разрешить?

Тема в разделе "WASM.BEGINNERS", создана пользователем _sheva740, 8 сен 2011.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Добрый день.
    Переписываю прожку из под линуксовского gcc под win.
    В Dev-C++ выделение памяти в стеке (строка [38] ниже)
    проходит нормально, в VC6.0++ - ошибка.

    Подскажите пожалуйста как Вы обходите такую "ситуацию"
    в VC6.0++ ?

    Код (Text):
    1. [..]  MyWord_generation(int nLength)
    2. [37]  {
    3. [38]    char szWord[nLength + 1];
    4. [39]    ...
    5. [..]    return true;
    6.     }
    7.  
    8.     int main()
    9.     {
    10.         ...
    11.         MyWord_generation(rand()%(nRange))
    12.         ...
    13.     }
    14.  
    15.  
    16. c:\_temp\4pass\4pass.cpp(38) : error C2057: expected constant expression
    17. c:\_temp\4pass\4pass.cpp(38) : error C2466: cannot allocate an array of constant size 0
    18. c:\_temp\4pass\4pass.cpp(38) : error C2133: 'szWord' : unknown size
    Спасибо.
     
  2. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    :-О Как это? По синтаксису языка C/C++ разве можно выделять автоматические массивы неконстантного размера?
     
  3. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Хотя, теоретически может быть это было бы допустимо, если такой массив среди всеъ автоматических переменных функции один и компилятор его сделает последним в стековом фрейме
     
  4. Psionic

    Psionic New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    153
    Код (Text):
    1. char *szWord=new char[nLength+1];
    это взлетит, токо потом прибери за собой памаять выделенную.
    Dmitry_Milk
    Ммм ну незнаю столько дизасмом не потрошил файлы всегда застаю нечто вроде
    Код (Text):
    1.  czWord dd ?
    2.                     dd ?
    3.                     ...
    4.                     dd ?
     
  5. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Не понял, это в каком месте? Если это просто резервирование места в сегментах, то этож не автоматические переменные, это глобальные и статические.

    А в данном же случае надо в стековом кадре для очередного вызова функции зарезервировать заранее неизвестное количество байт. Это конечно сделать без проблем, но все смещения в стековом кадре к автоматическим переменным компилятор считает во время компиляции, и таким образом переменное количество байт в стековом кадре можно сделать только в самом конце кадра.
     
  6. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Ага, а если он не знает, где там выходы из функции? А если там в норме вылеты по исключениям из глубжележащих выозовов? Тут какой-то смартпоинтер на char надо.
     
  7. Psionic

    Psionic New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    153
    Ну да - компилер руководствуясь константой делает так вроде-бы всегда.
     
  8. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    В 6 VC не получится динамически менять длинну массива. Для 2008 видел решения на RSDN.