2017-01-01 5 views
-1

Как я могу поместить VARIANT в COleSafeArray? Я попыталсяконвертировать вариант в COleSafeArray в MFC C++

Variant vara; 
COleSafeArray force= vara; 

и получил «отладка утверждение не удалось»

Я использовал библиотеку для преобразования значения напряжения Принудительного значения. В библиотеке есть ниже функция:

VARIANT _Calibration::ConvertToFT(VARIANT* Voltages, LPCTSTR ForceUnits, LPCTSTR TorqueUnits) 
{ 
    VARIANT result; 
    static BYTE parms[] = 
     VTS_PVARIANT VTS_BSTR VTS_BSTR; 
    InvokeHelper(0x60030040, DISPATCH_METHOD, VT_VARIANT, (void*)&result, parms, 
     Voltages, ForceUnits, TorqueUnits); 
    return result; 
} 

Так в моей основной программе:

COleSafeArray voltagesk; 
double voltages[6]; 
_read-voltage(voltages); 
long y; 
    for (y = 0; y<6; y++) { 
     // COleSafeArrays use pass-by-reference methods to read or write 
     voltagesk.PutElement(&y, &(voltages[y])); 
    } 
COleSafeArray forces = GetActiveCalibration().ConvertToFT(voltagesk, L"lb", L"in-lb"); 
for (y = 0; y<6; y++) { 
     // COleSafeArrays use pass-by-reference methods to read or write 
     forces.GetElement(&y, &(voltages[y])); 

Я попытался удаляемым эта строку «COleSafeArray forces = GetActiveCalibration().ConvertToFT(voltagesk, L"lb", L"in-lb");», моя программа побежала хорошо, но не может преобразовать напряжение в силу так Я думаю, что переход от VARIANT к COleSafeArray имеет проблему

+0

Какие данные находятся в 'vara'? Конструктор 'COleSafeArray' принимает только тот вариант, который сам обертывает saferyray (в этом случае Safariray копируется). Если вместо этого вы хотите добавить вариант в качестве элемента в новый массив, вам понадобится что-то вроде 'COleSafeArray force; force.CreateOneDim (VT_VARIANT, someSize); длинный индекс = 0; force.PutElement (& index, &vara); ' –

+0

*« Ошибка отладки »* не все, что у вас есть. Диалоговое окно [assertion failed] (https://msdn.microsoft.com/en-us/library/05d5fakw.aspx) также предложил взломать исходный код (нажав * «Retriy» *). Это приведет вас к выражению, которое не может быть оценено как true. Вы также получите весь стек вызовов, ведущий к этой точке. Не обращайте внимания на эту полезную информацию и вместо этого включите в свой вопрос. – IInspectable

+0

Igor Tandetnik Я отредактировал свой вопрос, указав более подробную информацию о моем коде. IInspectable, callstack показал, что «Рамы ниже, возможно, неправильные/ormissing» – abcd

ответ

0

Спасибо за ваше мнение. На самом деле, этот код предназначен для преобразования из напряжения в измеряемое значение. voltagesk не пуст, потому что _read-voltage (напряжения) помещает значения в напряжения. «GetActiveCalibration() ConvertToFT» прочитать калибровочные данные из калибровочного файла и преобразование напряжения в нужное значение (в соответствии с правилом калибровочного файла) Я изменил код следующим образом:

long y; 

Double tempc[6]; 

_read (voltages); 

for (y = 0; y<7; y++) { 

    voltagesk.PutElement(&y, &(voltages[y])); 
} 
VARIANT vara= GetActiveCalibration().ConvertToFT(voltagesk, L"N", L"N-m"); 

//returned value type of convertToFT is VARIANT 
    COleSafeArray forces; 
forces.Create(VT_R8, 1, numElements); 
for (y = 0; y<6; y++) 
    { 
     forces.PutElement(&y, &vara); 
    } 
for (y = 0; y<6; y++) { 

    forces.GetElement(&y, &tempc[y]); // tempc is the converted value 

    } 

моей программа шла хорошо, однако преобразованное значение (2,3333E-1233). Я думаю, что тип «VT_R8» имеет проблему в QT. I изменен способ. Вместо использования файла калибровки чтения кода я сам его прочитал и понял. После этого я переписал свою программу хорошо и просто для преобразования цели без COleSafeArray