Я думаю, что мне не хватает чего-то простого, но я не могу понять, почему я получаю эту ошибку.Размер массива, созданного динамически, не соответствует
У меня есть массив с необработанными данными, которые я хочу преобразовать в double. У меня также есть размер этого массива:
resWavFile0.resampledSingalData // array with data
resWavFile0.length // size of my array
Если я хочу, чтобы отобразить его, то он работает:
for (int i = 0; i < resWavFile0.length; i++)
{
cout << "\n" << *((int*)resWavFile0.resampledSingalData+i)/(double)0x7fffffff;
}
не падает на всех, я получаю все мои ценности, отображенных в два раза. Но сейчас я хотел бы сохранить эти значения в отдельном массиве, так что я творю:
double* singnalToProcess0;
И потому, что resWavFile0.length может измениться мне нужно выделить мой массив динамически:
singnalToProcess0 = (double*) malloc(resWavFile0.length * sizeof(double));
Также можно установить значение каждый блок памяти в 0:
memset(singnalToProcess0, 0, resWavFile0.length * sizeof(double));
Но теперь я хочу, чтобы вставить мои двойники внутри:
for (int i = 0; i < resWavFile0.length; i++)
{
*(singnalToProcess0 + i) = *((int*)resWavFile0.resampledSingalData+i)/(double)0x7fffffff;
}
И, например, моя resWavFile0.length значение 149077, но я получаю «0xC0000005: нарушение прав доступа чтения местоположения 0x01f6d000) при г = 75074. Если я пытаюсь расширить размер массива в таНос, например, даже так:
singnalToProcess0 = (double*) malloc(30* resWavFile0.length * sizeof(double));
Я по-прежнему получаю такую же ошибку при 75074. Если я работаю с другим образцом, например, короче или дольше - он всегда вылетает с этой ошибкой вблизи середины итерации. Также статическое распределение не работает:
double* singnalToProcess0 = new double[149077];
врезаться Также около середины - при я = 75074 ...
Полный код есть:
//// transfer to double
singnalToProcess0 = (double*) malloc(resWavFile0.length * sizeof(double));
memset(singnalToProcess0, 0, resWavFile0.length * sizeof(double));
for (int i = 0; i < resWavFile0.length; i++) {
*(singnalToProcess0 + i) = *((int*)resWavFile0.resampledSingalData+i)/(double)0x7fffffff;
}
Что я делаю неправильно?
Edit: ResampledWavFile структура:
typedef struct ResampledWavFile
{
short* resampledSingalData;
int length;
} ResampledWavFile;
Edit2 теперь он работает:
for (int i = 0; i < resWavFile0.length; i++)
{
singnalToProcess0[i] = resWavFile0.resampledSignalData[i]/(double)0x7fffffff;
}
EDIT3: я ошиблась, и это также возможно:
singnalToProcess0 = new double[resWavFile0.length];
Какой тип resWavFile0? Можете ли вы показать фрагмент кода его объявления? – Alejandro
Если вы используете 'malloc()', вы не должны использовать C++. Если вы используете C++, вы должны использовать 'new'. Пожалуйста, выберите язык - один язык - потому что разумные ответы очень разные в зависимости от того, код вы на C или C++. (Да, вы, вероятно, можете сделать код работать в обоих, вы, вероятно, не должны.) –
Я использую C++, но я не могу использовать new, потому что resWavFile0.length - это вычисленное значение. Я также добавил структуру ResampledWavFile в соответствии с запросом. Код о заполнении массива довольно длинный, потому что его метод передискретизации с низким уровнем интеллекта lvl intel - но если я попытаюсь отобразить значения внутри resampledSignalData и длины, я могу получить доступ к каждому из них. – F1sher