Вы можете использовать sscanf для этой цели. Ниже приведена быстрая реализация сценария на языке C.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(void) {
unsigned long a;
char array[10];
char string[] = "\r\n9876543212345\r\n\r\nOK\r\n";
sscanf(string , "\r\n%ld\r\n\r\n%s\r\n", &a, array);
printf("%ld %s\n", a, array);
return 0;
}
Это не конструктор массива:
float * flatFitness;
flatFitness = new float(popSize);
Здесь вы создаете один float в куче, инициализированный значением popSize
. Если вам нужен массив с плавающей точкой, вам нужно использовать скобки вместо скобок:
float *flatFitness = new float[popSize];
Это может легко вызвать проблемы, которые вы описываете. Кроме того, помните, что при создании массивов вам необходимо удалить, используя delete []
(в конце концов):
delete [] flatFitness;
Если вы просто используете delete
, это может сработать, но поведение не определено .
Если вы хотите вообще не использовать синтаксис массива, почему бы не использовать std :: vector
? Вы можете создать вектор элементов popSize следующим образом:
#include <vector>
std::vector<float> flatFitness(popSize);
Он будет автоматически освобожден, когда выйдет из области видимости, поэтому вам не нужно беспокоиться о new
или delete
.
Обновление (re: comment): Если вы уже используете std :: vectors
в другом месте своего кода, взгляните на std :: vector :: swap ()
. Вы можете вообще избежать копирования и просто поменять пару векторов назад и вперед между буферизацией для CUDA и обработкой, которую вы здесь выполняете.
Я подозреваю, что у вас есть проблемы с многопоточностью или повреждением памяти, о которых вы не знаете. Поведение, которое вы описываете, не является каким-то стандартным, заведомо желательным поведением.
jeffamaphone может быть прав, что это проблема с многопоточностью. Другая возможность состоит в том, что объекты, которые вы читаете, уже были удалены. Вы бы тогда читали с неверного адреса. Также возможно, что структуры данных, в которые вы пишете в это время, хранятся в том же месте, где ранее находились векторы. Это может привести к описанному вами поведению.
РЕДАКТИРОВАТЬ (на основе вашего обновления):
Это может быть неисправно: stringLength
инициализируется вне внешнего цикла, но это похоже, что его нужно обновить во время этого внешнего цикла:
int stringLength = pop->GetGenome(0).GetLength();
for (int i=0;i<pop->GetPopSize();i++)
for (int j=0;j<stringLength;j++)
flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
Предлагаемое исправление:
for (int i=0;i<pop->GetPopSize();i++) {
int stringLength = pop->GetGenome(i).GetLength();
for (int j=0;j<stringLength;j++) {
flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
}
}