Zerpico
@Zerpico

Как создать массив структур с n длинной?

Доброго времени суток. Я не очень-то знаю С++, но очень нужно написать одну библиотеку для использования в C#. Не могу создать массив с длинной зависящей от другого массива.

Ошибка: выражение должно иметь константное значение

/////Класс  для get_param_value_bynames ///////////////
public ref class P_BYNAME_DATA
{
public:
    String^ PntName;         //имя точки
    String^ PrmName;         //имя параметра
    short   nPrmOffset;      //смещение параметра
    PARvalue*   pupvValue;   //(входной/выходной) значение пара-метра
    short nType;             //(входной / выходной) тип значения
    long    fStatus;         //состояние каждого до-ступа к значению
    P_BYNAME_DATA() {}
    P_BYNAME_DATA(String^ name) { PntName = name; }
    virtual ~P_BYNAME_DATA() {}
};

///Класс для обращения 
public ref class Hscnapi
{
private:
    static int status;

public:
    static int get_param_value_bynames(String ^Server, array<P_BYNAME_DATA^>^ prmdata)
    {           
        int len = prmdata->Length;
        PARAM_BYNAME_DATA rgprmbd[i]; //Ошибка: выражение должно иметь константное значение 
    }

}


По-моему надо создать указатель для определения размера массива или что-то иное. Но я не знаю как.
  • Вопрос задан
  • 270 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Более того, у вас необъявленная переменная i =)

Допустим, вы ошиблись, выпиливая лишний код, пусть эта переменная вычисляется у вас в рантайме (т.е. она не являтся константой). Внутри метода вы пытаетесь создать массив на стеке. Для этого компилятору важно знать заранее (в compile-time), какой буфер там резервировать, т.е. необходима константа или константное выражение, о чем и сказано в сообщении об ошибке.
А как же C#?
Но в С# же это было не обязательно, что же нам ответит на это Рихтер?

Базовым для всех массивов является абстрактный класс System.Array, производный от System.Object. Значит, массивы всегда относятся к ссылочному типу и размещаются в управляемой куче, а переменная в приложении содержит не элементы массива, а ссылку на массив.


В вашем же случае нужна конструкция вроде:

array< PARAM_BYNAME_DATA^ >^ rgprmbd 
                   = gcnew array< PARAM_BYNAME_DATA^ >(i);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы