gpt4 book ai didi

c++ - 将此 vector 字符数组复制到字符串中的正确方法是什么

转载 作者:行者123 更新时间:2023-11-27 23:48:53 25 4
gpt4 key购买 nike

我正在尝试使用一个返回 void**(数据数组的数组)的 C API,它可能由任意数量的每种不同类型(double、long、short、custom struct ...)组成 API适用于除数组 char 数组以外的所有数组。

// a simplified API prototype
void READHISTORY( long id // ID in custom database
, short numFields // number of fields
, const timestruct* oldest // oldest time to look up
, const timestruct* newest // newest time to look up
, long maxRetVals // the size of each data array
, const short DataTypes[] // types[] length numFields
, void* theData[] // pointers to data arrays
, short* numReturned // number of returned values
)

要设置主读取,读取数据库以查看有多少字段及其自定义类型。

#define MAXVALS (2048) 
long id = 20L;
short vals; // number of vals returned
tstruct oldest = {2017,1,1,0,0,0};
tstruct newest = {2018,1,1,0,0,0};
int numFields;
std::vector<short> datatypes;

GETFIELDS(id, &numFields, datatypes); // API to get the number and types of fields
std::vector<void*> values;

for(int i=0; i<numFields; i++) {
datatypes.push_back(DataTypes[i]);
switch (DataTypes[i]) { // want the arrays created dynamically
case -1: // time
values.push_back(new tstruct[MAXVALS]);break;
case -2: // short
values.push_back(new short[MAXVALS]);break;
case -3: // long
values.push_back(new long[MAXVALS]);break;
case -4: // double
values.push_back(new double[MAXVALS]);break;
default: // positive numbers are char array length
values.push_back(new char[DataTypes[i]][MAXVALS]);
}
}

READHISTORY 调用正在运行并返回数据,但是我收到了 char 数组的异常错误。

// call the API to get data into the individual data arrays
READHISTORY(id, numFields, &oldest, &newest, MAXVALS, datatypes.data(), values.data(), &vals);

for (int i=0; i<vals ; i++) {
for(int j=0; j< datatypes.size(); j++) {
switch(datatypes[j]) {
case -1: tstruct tval = static_cast<tstruct*>(values[1])[i]; break; // works fine
case -2: short sval = static_cast<short*>(values[j])[i]; break; // works fine
case -3: long lval = static_cast<long*>(values[j])[i]; break; // works fine
case -4: double dval = static_cast<double*>(values[j])[i]; break; // works fine
...

default:
int len = datatypes[j]; // positive datatypes are the char array length
char* nchar = new char[len+1];

// attempting to copy the char gets an access violation is here.
strncpy(nchar, static_cast<char**>(values[j])[i], len);

nchar[len+1] = '\0';
String^ nstr = gcnew String(nchar);
delete nchar;
// do something with nstr and so on...
}
}
}

未处理的异常:System.AccessViolationException:试图读取或写入 protected 内存。

我做错了什么?

最佳答案

你用错了constructor创建你的载体:

std::vector<short> values(numFields);

这将创建一个包含 numFields 空指针的 vector 。您稍后会附加动态分配的数组,但空指针仍将是 READHISTORY 将尝试使用的第一个元素。

取而代之的是默认构造空 vector :

std::vector<short> values;

关于c++ - 将此 vector 字符数组复制到字符串中的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48285601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com