По сути, преобразование объектов T* и T** в векторы и многое другое. дружественные контейнеры.
Atm У меня есть две переменные,
double* data
double* references
Здесь, на SO, я видел трюк, который позволяет легко назначать обычный вектор двойному*, например:
references = &(*m_DataMaxPoints)[0];
так что ничего страшного.
Однако данные* должны быть установлены из std::vector< std::vector>* m_Data;
Я не знаю, как мне это назначить.
Я попробовал &(* m_Data)[0][0];, но я действительно не знаю, что мне здесь делать.
Любые советы будут приветствоваться..
Редактирование 1: Исходная обработка данных* в C-программе
Данные double* объявляются в main()< /p>
int main(int argc, char *argv[])
{
FILE *infile;
int verbose_flag = FALSE;
double *data = NULL, *reference = NULL, *maximum = NULL;
int *cumsizes = NULL;
int nobj = 0, nruns = 0;
int k;
double volume = 0;
double time_elapsed;
read_input(stdin, "stdin", &data, &nobj, &cumsizes, &nruns);
read_input анализирует числа из текстового файла в массивы.
#define PAGE_SIZE 4096 // allocate one page at a time
#define DATA_INC (PAGE_SIZE/sizeof(double))
#define SET_INC 128 // assume 128 datasets (can grow)
int read_input(FILE *infile, const char *filename, double **datap, int *ncolsp, int **cumsizesp, int *nrunsp)
{
char b[2];
double number;
int newline; // last input was newline
int datai; // the current element of (*datap)
int col; // the column being read
int set = *nrunsp; // the current data set
int ncols = *ncolsp; // the number of columns
int datasize;
int setsize;
datai = (set == 0)
? 0
: ncols * (*cumsizesp)[set-1];
setsize = (set == 0)
? 0
: ((set-1) / SET_INC + 1) * SET_INC;
*cumsizesp = realloc(*cumsizesp, setsize * sizeof(int));
datasize = (datai == 0)
? 0
: ((datai - 1) / DATA_INC + 1) * DATA_INC;
*datap = realloc(*datap, datasize * sizeof(double));
// remove leading whitespace
fscanf (infile, "%*[ \t\n]");
if (feof(infile)) {
warnprintf("%s: file is empty.", filename);
return -1;
}
do {
newline = 0;
if (set == setsize) {
setsize += SET_INC;
*cumsizesp = realloc(*cumsizesp, setsize * sizeof(int));
}
(*cumsizesp)[set] = (set == 0) ? 0 : (*cumsizesp)[set-1]; // beginning of data set
while (newline == 0) {
col = 0; // beginning of row
while (newline == 0) {
if (fscanf(infile, "%lf", &number) != 1) {
char buffer[64];
fscanf(infile, "%60s", buffer);
errprintf(
"could not convert string `%s' to double, exiting...",
buffer);
}
if (datai == datasize) {
datasize += DATA_INC;
*datap = realloc(*datap, datasize * sizeof(double));
}
(*datap)[datai++] = number;
#if DEBUG > 2
fprintf(stderr, "set %d, row %d, column %d, x = %g\n",
set, (*cumsizesp)[set], col, number);
#endif
col++; // new column
fscanf(infile, "%*[ \t]");
newline = fscanf(infile, "%1[\n]", b);
}
if (!ncols)
ncols = col;
else if (col != ncols) {
if ((*cumsizesp)[0] == 0)
errprintf ("reference point has dimension %d"
" while input has dimension %d",
ncols, col);
else
errprintf("row %d has different length (%d)"
" than previous rows (%d), exiting...",
(*cumsizesp)[set], col, ncols);
}
(*cumsizesp)[set]++;
fscanf (infile, "%*[ \t]");
newline = fscanf (infile, "%1[\n]", b);
}
#if DEBUG > 1
fprintf (stderr, "Set %d, %d rows in total\n", set, (*cumsizesp)[set]);
#endif
set++; // new data set
fscanf (infile, "%*[ \t\n]");
} while (!feof(infile));
*ncolsp = ncols;
*nrunsp = set;
return 0;
}
Я пытаюсь как можно меньше конвертировать в C++, чтобы упростить его использование и внедрить его в более крупный проект, создав класс-оболочку для этого интерфейса. .
Итак, анализ файлов и распределение данных выполняются с помощью векторов (они не обязательно должны быть указателями).
После синтаксического анализа я бы предпочел преобразовать векторы в массивы в стиле C, чтобы можно было вызвать функцию исходного кода без необходимости добавлять вектор для поддержки всего этого, потому что я не понимаю, как читать его на чистом C (реализация многоцелевого эволюционного алгоритма).
Исходный код наконец вызывает:
volume = hv(data, nobj, cumsizes[nruns-1], reference);
Пока я хотел бы это сделать:
double* data = &(*m_Data)[0][0]; // my 2d vector
double* references = &(*m_DataMaxPoints)[0]; // 1d vector
int cumsizes = m_Data->at(0).size();
m_Volume = hv(data, Objectives(), cumsizes, references);
Подробнее здесь: https://stackoverflow.com/questions/518 ... -to-double
Мобильная версия