关于Borland C++ Builder 奇怪的问题

时间:2022-12-15 15:11:02
用Borland   C++   Builder 6 用了两年了,一直有很奇怪的情况发生。之前的先不说了,就说这两天发生的情况
我是做audio coding的,想通过filter把输入信号变小。问题来了,有的时候滤波之后的信号是变小的,有的时候不是。我就在查,然后发现:在文件开头,
#define  N 2048     /* frame shift */
#define  W N+1024     /* frame size */
这样写,滤波之后信号energy变小
#define  N 2048     /* frame shift */
#define  W 3072        /* frame size */
这样写,滤波之后信号energy变大
其他地方都没有改,请问这个是Borland   C++   Builder 6的问题,还是我程序写的时候有问题?我不知道为什么我写的程序会跟预定义的W的值有关系
再有就是,在后面的程序里,如果我写
for (j=0;j<W-NN;j++)
    winbuf[j]=winbuf[NN+j];
for (j=W-NN;j<W;j++)
    winbuf[j]=nbuf[(W-N)/2+subframe+j-W+NN];
滤波之后信号energy变小,

如果写
for (j=0;j<N-NN+1024;j++)
    winbuf[j]=winbuf[NN+j];
for (j=N-NN+1024;j<N+1024;j++)
    winbuf[j]=nbuf[(W-N)/2+subframe+j+NN-N-1024];
滤波之后信号energy变大

如果把上面的改成
for (j=0;j<N-NN+1024;j++)
    winbuf[j]=winbuf[NN+j];
for (j=N-NN+1024;j<N+1024;j++)
    winbuf[j]=nbuf[(W-N)/2+subframe+j+NN-W];
滤波之后信号energy变小,

再如果把上面的改成
for (j=0;j<N-NN+1024;j++)
    winbuf[j]=winbuf[NN+j];
for (j=N-NN+1024;j<N+1024;j++)
    winbuf[j]=nbuf[(W-N)/2+subframe+j+NN-(W)];
滤波之后信号energy变大


包括之前遇到过一些问题,更改文件名或者某个函数名以后,就解决了。。。

到底是为什么呢,请教各位大虾了!!!

13 个解决方案

#1


帮你顶,是不是预定义顺序的问题?

#2


引用 1 楼 wewaa 的回复:
帮你顶,是不是预定义顺序的问题?

可是先定义的N后定义的W啊
而且不是因为W=N+1024有问题,是直接写W=3072有问题
先谢谢你哈

#3


按照C语言,预定义好像是直接代入
subframe+j-W+NN会被替换成subframe+j-N+1024+NN,
所以被改变了。

#4


引用 3 楼 lhylhy 的回复:
按照C语言,预定义好像是直接代入
subframe+j-W+NN会被替换成subframe+j-N+1024+NN,
所以被改变了。

你说的确实是一个问题,我再看看我程序还有类似的问题没有,因为现在的情况是,写正确的预定义,结果是错误的,写错误的预定义,结果更好

麻烦看一下http://topic.csdn.net/t/20040404/14/2923532.html的74楼
引用
我用BCB6,有些奇怪的问题让我百思不得其解: 

1、我有两个计算语句,如果在这两句之前加一句ShowMessage语句,随便show什么内容,那么计算语句就会正确,否则计算就会经常出错,当然偶尔也会对。真不明白ShowMessage语句怎么会对计算语句造成影响? 

2、我的Form上有两个button,按button1进行计算,按button2把计算数据写到文件中,也就是普通的 "fprintf "写文件语句,令人奇怪的是我对fprintf语句注释掉后,居然会对button1里面的计算造成影响。 

怪!!!请高手指点!

请问这又是为什么呢,第一个问题我也遇到过

#5


是你的问题
#define  N 2048  /* frame shift  */
#define  W N+1024 /* frame size */
这样写,滤波之后信号energy变小
#define  N 2048  /* frame shift  */
#define  W 3072 /* frame size */

这里的for (j=0;j<W-NN;j++)
  winbuf[j]=winbuf[NN+j];
NN是不是被替换成:20482048?
你把NN换成nn看看

#6


引用 5 楼 kerbcurb 的回复:
NN是不是被替换成:20482048?


应该不是这个问题,我有#define NN 16 而且有输出过来看,NN确实是16

#7


呵呵

#define W (N+1024)

#8


引用 7 楼 xili 的回复:
呵呵

#define W (N+1024)


好,注意使用括号

#9


关于Borland C++ Builder 奇怪的问题细致细节

#10


该回复于2010-10-31 12:11:08被版主删除

#11


引用 5 楼 kerbcurb 的回复:
NN是不是被替换成:20482048?

不会的预定义转换是对整个标识符,不会将标识符的一部分转换。

#12


#define W (N+1024) /* frame size */

#13


谢谢楼上几位,加括号确实是应该加的
关于其他问题呢,还请有经验的朋友帮忙解答一下啊!

#1


帮你顶,是不是预定义顺序的问题?

#2


引用 1 楼 wewaa 的回复:
帮你顶,是不是预定义顺序的问题?

可是先定义的N后定义的W啊
而且不是因为W=N+1024有问题,是直接写W=3072有问题
先谢谢你哈

#3


按照C语言,预定义好像是直接代入
subframe+j-W+NN会被替换成subframe+j-N+1024+NN,
所以被改变了。

#4


引用 3 楼 lhylhy 的回复:
按照C语言,预定义好像是直接代入
subframe+j-W+NN会被替换成subframe+j-N+1024+NN,
所以被改变了。

你说的确实是一个问题,我再看看我程序还有类似的问题没有,因为现在的情况是,写正确的预定义,结果是错误的,写错误的预定义,结果更好

麻烦看一下http://topic.csdn.net/t/20040404/14/2923532.html的74楼
引用
我用BCB6,有些奇怪的问题让我百思不得其解: 

1、我有两个计算语句,如果在这两句之前加一句ShowMessage语句,随便show什么内容,那么计算语句就会正确,否则计算就会经常出错,当然偶尔也会对。真不明白ShowMessage语句怎么会对计算语句造成影响? 

2、我的Form上有两个button,按button1进行计算,按button2把计算数据写到文件中,也就是普通的 "fprintf "写文件语句,令人奇怪的是我对fprintf语句注释掉后,居然会对button1里面的计算造成影响。 

怪!!!请高手指点!

请问这又是为什么呢,第一个问题我也遇到过

#5


是你的问题
#define  N 2048  /* frame shift  */
#define  W N+1024 /* frame size */
这样写,滤波之后信号energy变小
#define  N 2048  /* frame shift  */
#define  W 3072 /* frame size */

这里的for (j=0;j<W-NN;j++)
  winbuf[j]=winbuf[NN+j];
NN是不是被替换成:20482048?
你把NN换成nn看看

#6


引用 5 楼 kerbcurb 的回复:
NN是不是被替换成:20482048?


应该不是这个问题,我有#define NN 16 而且有输出过来看,NN确实是16

#7


呵呵

#define W (N+1024)

#8


引用 7 楼 xili 的回复:
呵呵

#define W (N+1024)


好,注意使用括号

#9


关于Borland C++ Builder 奇怪的问题细致细节

#10


该回复于2010-10-31 12:11:08被版主删除

#11


引用 5 楼 kerbcurb 的回复:
NN是不是被替换成:20482048?

不会的预定义转换是对整个标识符,不会将标识符的一部分转换。

#12


#define W (N+1024) /* frame size */

#13


谢谢楼上几位,加括号确实是应该加的
关于其他问题呢,还请有经验的朋友帮忙解答一下啊!