Указатель в структуре вопроса. Я сделал это правильно? - PullRequest
2 голосов
/ 13 ноября 2009

Я переписываю некоторый код с наличия обычного указателя на то, где указатель находится в структуре.

Это оригинальный код, который работает:

int wrote = sf_writef_double(outfile, *mono_channel, frames);

В новом коде, где я поместил указатель mono_channel в структуру, я написал

int wrote = sf_writef_double(outfile, data->mono_channel, frames);

Компилятор не жалуется, но программа вылетает.

Так что вопрос в том. data->mono_channel совпадает с *mono_channel?

Объятия, Луиза

Edit: Чтобы быть более точным, вот что я делаю:

ltfat_complex* fm;
fm = malloc(data->L * sizeof(ltfat_complex));
if (fm == NULL) { puts("fm malloc failed"); exit(1); }

/* Writes output to fm */      
idgt_fac(data->coef, gdf, data->L, 1, 1, data->a, data->M, fm);

free(data->mono_channel);

data->mono_channel = (double*) fm;
free(fm);

...

int wrote = sf_writef_double(outfile_handler, data->mono_channel, frames);

Может быть проблема в том, что я пытаюсь повторно использовать указатель data->mono_channel?

Edit2: Вот все исходные коды (~ 700 строк каждый):

Старый, который работает: http://www.student.dtu.dk/~s011392/gabor-io.zip

Новое: http://www.student.dtu.dk/~s011392/gui.zip

К сожалению, им требуется много библиотек для компиляции: ltfat из SVN, fftw3, lapack, blas, sndfile.

Но они есть =)

Ответы [ 3 ]

4 голосов
/ 13 ноября 2009

Вы разыменовываете mono_channel в первой версии, но не во второй. Попробуйте

int wrote = sf_writef_double(outfile, *(data->mono_channel), frames);
2 голосов
/ 13 ноября 2009

Нет, data-> mono_channel и * mono_channel - это не одно и то же. * (data-> mono_channel) совпадает с * mono_channel.

Мне действительно интересно, как вы справились с * mono_channel в вашей программе, если вы хотите передать указатель на double вместо double. Ясно, что mono_channel был указателем на указатель на вектор двойных чисел. Скорее всего, mono_channel был указателем на массив (который на самом деле является вектором) значений типа double.

double *mono_channel[1000];   // let's say

В любом случае, если вы терпите крах, возможно, это потому, что вы не выделили хранилище и не указали на него mono_channel, а просто определили его как элемент вашей структуры, представляющей собой double *, и используете его. Вам нужно либо указать mono_channel на предопределенный глобальный массив, либо выделить его с помощью malloc / new.

1 голос
/ 13 ноября 2009

data->mono_channel совпадает с (*data).mono_channel

Если вы хотите содержимое указанной переменной, я предлагаю вам *(data->mono_channel)

Вы можете перечитать K & R.

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