Помещение плавающих строк в массив void - PullRequest
0 голосов
/ 08 сентября 2011

Я получаю ошибку сегментации, когда моя функция читает плавающие строки и помещает их в массив void.Segfault возникает после примерно 200 итераций цикла for в следующем коде:

// Allocate memory
void** data;
data = (void**)malloc(num_vals * sizeof(float));

// Convert text to floats
(*(float**)data)[0] = atof(strtok(text, " "));  
for(int index=1; index<num_vals; index++) {
    (*(float**)data)[index] = atof(strtok(NULL, " "));   
    std::cout << (*(float**)data)[index] << std::endl;
}

Массив void необходим, поскольку размер и тип данных в строке определяются во время выполнения.Я пытался увеличить размер malloc, но это ничего не меняет.Есть мысли?

Ответы [ 6 ]

5 голосов
/ 08 сентября 2011

Серьезно ??

std::vector<float> data;
std::istringstream str(text);
float fv;
while (str >> fv)
{
  data.push_back(fv);
}

Теперь это c ++

1 голос
/ 08 сентября 2011

Как бы мне ни было больно, вот версия вашего кода, которая, вероятно, делает то, что вы хотите.

// Allocate memory
void* data;
data = malloc(num_vals * sizeof(float));

// Convert text to floats
((float*)data)[0] = atof(strtok(text, " "));  
for(int index=1; index<num_vals; index++) {
    ((float*)data)[index] = atof(strtok(NULL, " "));   
    std::cout << ((float*)data)[index] << '\n';
}

Обратите внимание, однако, что если бы вы работали на меня и попытались проверить этот код, у нас было бы серьезное обсуждение вашего выбора профессии.

Я бы предпочел увидеть что-то вроде этого:

std::vector<float> v;
std::copy(std::istream_iterator<float>(std::istringstream(text)),
          std::istream_iterator<float>(),
          std::back_inserter(v));

P.s. Правило Роба № 47: Никогда не говори std::endl, когда ты имеешь в виду '\n'.

1 голос
/ 08 сентября 2011

Почему вы конвертируете в void ** ???Ваш код содержит пару ошибок при индексации, поэтому позвольте мне показать некоторые разумные изменения

float* data;
data = (float*)malloc(num_vals * sizeof(float));

// Convert text to floats
data[0] = atof(strtok(text, " "));  
for(int index=1; index<num_vals; index++) {
 data[index] = atof(strtok(NULL, " "));   
 std::cout << data[index] << std::endl;
}
0 голосов
/ 08 сентября 2011

Есть несколько проблем.Один из них - data должен быть void *, у вас есть резервный *.Другое может быть выравнивание, я не уверен, что вы можете разместить плавающее в любом месте в памяти.

0 голосов
/ 08 сентября 2011

Вы перепутали свои типы в вашей необъяснимой попытке создать этого монстра под предлогом написания "C ++".Тем не мение.то, что вы используете, это всего лишь float*, поэтому вам нужно привести data обратно к float*:

((float*)data)[0] = myfloat;
0 голосов
/ 08 сентября 2011

Я думаю, что поскольку вы определяете указатель пустого указателя и выделяете / приводите его к указателю пустого указателя, он выделяет 4-байтовую память для каждого элемента, потому что в C / C ++, относится к типу указателя, указателивсегда 4 байта, которые недостаточно велики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...