gpt4 book ai didi

c - 使用 C 实现外部纯数据时内存损坏

转载 作者:行者123 更新时间:2023-11-30 18:55:23 24 4
gpt4 key购买 nike

我目前正在尝试使用 C 实现纯数据的外部。我已经有一段时间没有使用 C 了,并且遇到了内存损坏问题。我不知道该怎么办,所以请求您的帮助。

这是代码。请记住,它是纯数据的 C 代码。

t_int           *myfft_tilde_perform(t_int *w) {

t_myfft_tilde *fft = (t_myfft_tilde *)w[1];
t_float *in = (t_float *)w[2];
t_float *out = (t_float *)w[3];
int n = (int)w[4];

int i;
for(i=0; i<n; i++)
{
fft->bigbuffer[fft->nextindex] = in[i];
fft->nextindex = (fft->nextindex+1)%TAILLE;
}

if (!fft->isfull && fft->nextindex==0)
{
fft->isfull=1;
}

if (fft->isfull)
{

for(i=0; i<TAILLE; i++)
{
fft->bigbuffercpy[i] = fft->window[i] * fft->bigbuffer[i];
}

rdft(TAILLE, 1, fft->bigbuffercpy, fft->bitshuffle, fft->weighting);

if (fft->nextindex==0)
{
i=(TAILLE-1)-64;
}
else
{
i=fft->nextindex-64;
}
int j;
for(j=0; j<64; j++)
{
out[j] = fft->bigbuffercpy[i+j];
}
}

return (w+5);

}

void myfft_tilde_dsp(t_myfft_tilde *x, t_signal **sp) {

dsp_add(myfft_tilde_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);

}

void myfft_tilde_free(t_myfft_tilde *x) {

if (x->bitshuffle)
freebytes(x->bitshuffle, TAILLE*2*sizeof(int));
if (x->weighting)
freebytes(x->weighting, TAILLE*2*sizeof(float));
if (x->window)
freebytes(x->window, TAILLE*sizeof(float));
if (x->bigbuffer)
freebytes(x->bigbuffer, TAILLE*sizeof(float));
if (x->bigbuffercpy)
freebytes(x->bigbuffercpy, TAILLE*sizeof(float));

}

void *myfft_tilde_new(void) {

t_myfft_tilde *fft = (t_myfft_tilde *)pd_new(myfft_tilde_class);

fft->x_out = outlet_new(&fft->x_obj, &s_signal);

fft->bitshuffle = (int *)calloc(TAILLE*2, sizeof(int));
fft->weighting = (float *)calloc(TAILLE*2, sizeof(float));
fft->window = (float *)calloc(TAILLE, sizeof(float));
fft->bigbuffer = (float *)calloc(TAILLE, sizeof(float));
fft->bigbuffercpy = (float *)calloc(TAILLE, sizeof(float));

int i;
for(i=0; i<TAILLE; i++)
{
fft->window[i] = 0.54 - 0.46*cos(TWOPI*i/TAILLE);
}

fft->nextindex=0;
fft->isfull=0;

init_rdft(TAILLE*2, fft->bitshuffle, fft->weighting);

return (void *)fft;
}

void myfft_tilde_setup(void) {

myfft_tilde_class = class_new(gensym("myfft~"),
(t_newmethod)myfft_tilde_new,
(t_method)myfft_tilde_free,
0, sizeof(t_myfft_tilde),
CLASS_DEFAULT, A_GIMME, 0);
CLASS_MAINSIGNALIN(myfft_tilde_class, t_myfft_tilde, f);
class_addmethod(myfft_tilde_class, (t_method)myfft_tilde_dsp,
gensym("dsp"), 0);

}

你不知道的功能都是我已经给出的功能。内存损坏错误是这样发生的:我使用给定的 makefile 编译代码,然后尝试使用控制台中生成的 pd_linux 文件运行给定的纯数据文件,并且我立即在控制台中收到此消息:

*** Error in `puredata': malloc(): memory corruption: 0x084f4570 ***
Pd: signal 6

我什至尝试删除我所做的所有 calloc,但错误仍然发生......

最佳答案

您错误地使用了class_new()

它的参数是:

  • 姓名
  • 构造函数
  • 析构函数
  • 成员数据结构的大小
  • 标志
  • 构造函数的参数规范
  • a 0(终止符)

您已经交换了大小标志,给出了0字节的有效大小。然后,pd_new() 将为您的 fft 结构分配 0(零,无)字节,一旦您访问该结构,就会导致内存损坏结构成员(正如您在下一行中所做的那样)。

除此之外:请始终使用 t_sample 而不是 t_float (或 float!!) 作为示例值。始终使用 t_float 而不是 float 作为消息编号。

关于c - 使用 C 实现外部纯数据时内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27799192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com