• 9040阅读
  • 10回复

[提问]我现在怀疑是我这个构造函数的问题…………大家帮忙看看…… [复制链接]

上一主题 下一主题
离线coding_ali
 

只看楼主 倒序阅读 楼主  发表于: 2011-06-25
我自己定义了一个类:class mywindow:public QWidget
                                         private:
                                                 QPushButton * button;
                                                 QSpinBox *w2,*w1;

我在构造函数里面出了问题:这是我的构造函数

mywindow::mywindow()
{
    this ->setGeometry(300,30,600,650);

    button = new QPushButton("OK",this);
    button ->setGeometry(500,500,50,20);
    connect(button,SIGNAL(clicked()),this,SLOT(test()));

    w1 = new QSpinBox(this);
    w1 ->setRange(0,100);
    w1 ->setGeometry(500,400,50,20);

    w2 = new QSpinBox(this);
    w2 ->setRange(0,100);
    w2 ->setGeometry(500,450,50,20);

}

button   w1  w2这三个任意一个实现都可以,但像我上面那样连续实现的话就运行崩溃……

window.open('http://www.qtcn.org/bbs/attachment/Mon_1106/17_116818_eaacc0277cf5c54.jpg?21');" style="max-width:700px;max-height:700px;" onload="if(is_ie6&&this.offsetWidth>700)this.width=700;" >


这是问什么啊…………
离线coding_ali

只看该作者 1楼 发表于: 2011-06-25
不好意思……一时手抽了…………
离线diyuanbo

只看该作者 2楼 发表于: 2011-06-25
回 1楼(coding_ali) 的帖子
内存够用?
离线diyuanbo

只看该作者 3楼 发表于: 2011-06-25
调试跟踪一下,看看new完 W1 W2是多少
离线jdwx

只看该作者 4楼 发表于: 2011-06-25
需要把代码上全了。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线coding_ali

只看该作者 5楼 发表于: 2011-06-25
回 4楼(jdwx) 的帖子
好吧  上代码……………………

头文件:

#ifndef MYWINDOW_H
#define MYWINDOW_H

#include <QApplication>
#include <QPushButton>
#include <QWidget>
#include <QPainter>
#include <QSpinBox>
#include <math.h>


#define N 128
#define PI 3.1215926

class mywindow:public QWidget
{
    Q_OBJECT
public:
    mywindow();
    void FFT(double x[],double y[],int n,int sign);     //傅里叶变换函数,测试过的,没问题
    void inital(double *m_x,double *m_y);               //初始化我傅里叶变换的序列
private:
    int frequence1,frequence2;                          //这两个变量是我要在QSpinBox里面获得的数值
    double X[N];
    double Y[N];
    QPainter *paint2;
    QPushButton * button;
    QSpinBox *w2,*w1;
    void paintEvent(QPaintEvent *);                      //我所有的绘图都是在这里面

public slots:
    void test();                                         //自己定义的槽,当我单击按钮时 frequence1,frequence2
                                                         //获得QSpinBox里面的数值,并重绘整个界面
};

#endif // MYWINDOW_H


CPP文件:

#include "mywindow.h"

mywindow::mywindow()
{
    this ->setGeometry(300,30,600,650);

    button = new QPushButton("OK",this);
    button ->setGeometry(500,500,50,20);
    connect(button,SIGNAL(clicked()),this,SLOT(test()));

    w1 = new QSpinBox(this);
    w1 ->setRange(0,100);
    w1 ->setGeometry(500,400,50,20);

    w2 = new QSpinBox(this);
    w2 ->setRange(0,100);
    w2 ->setGeometry(500,450,50,20);

    paint2 = new QPainter;

    frequence2 = 1;
    frequence1 = 1;
}

void mywindow::FFT(double x[], double y[], int n, int sign)
{
int i,j,k,l,m,n1,n2;
double c,c1,e,s,s1,t,tr,ti;

for(j = 1,i = 1; i<16; i++)
{
     m = i;
     j = 2*j;
     if(j == n)
         break;
}

//计算蝶形图的输入下标(码位倒读)
n1 = n - 1;
for(j=0,i=0; i<n1; i++)
{
    if(i<j)
    {
         tr = x[j];
         ti = y[j];
         x[j] = x;
         y[j] = y;
         x = tr;
         y = ti;
    }
    k = n/2;
    while(k<(j+1))
    {
        j = j - k;
        k = k/2;
    }
    j = j + k;
}

//计算每一级的输出,l为某一级,i为同一级的不同群,使用同一内存(即位运算)
n1 = 1;
for(l=1; l<=m; l++)
{
    n1 = 2*n1;
    n2 = n1/2;
    e = 3.1415926/n2;
    c = 1.0;
    s = 0.0;
    c1 = cos(e);
    s1 = -sign*sin(e);
    for(j=0; j<n2; j++)
    {
        for(i=j; i<n; i+=n1)
        {
            k = i + n2;
            tr = c*x[k] - s*y[k];
            ti = c*y[k] + s*x[k];
            x[k] = x - tr;
            y[k] = y - ti;
            x = x + tr;
            y = y + ti;
        }
        t = c;
        c = c*c1 - s*s1;
        s = t*s1 + s*c1;
    }
}
//如果是求IFFT,再除以N
if(sign == -1)
{
for(i=0; i<n; i++)
{
   x /= n;
   y /= n;
}
}
}

void mywindow::inital(double *m_x,double *m_y)
{
    int i;
    for(i = 0; i < N; i++)
    {
        X = m_x;
        Y = m_y;
    }
}

void mywindow::paintEvent(QPaintEvent *)
{

    paint2 ->begin(this);
    paint2 ->setPen(QPen(Qt::black,2,Qt::SolidLine));

    int i;
    double temp = 0,j = 0;

    for(i = 0; i < N; i ++)
    {
    //    temp = sqrt(X*X+Y*Y);
        paint2 ->drawLine(j,250,j ,250 - 40*X);
        j +=3;
    }

    FFT(X,Y,N,1);

    j = 0;
    for(i = 0; i < N; i ++)
    {
        temp = sqrt(X*X+Y*Y);
        paint2 ->drawLine(j,600,j ,600 - 1.5*temp);
        j +=3;
    }
    paint2 ->end();
}

void mywindow::test()
{
    int j;
    double m = 0;
    double x[N] = {0};
    double y[N] = {0};

    for(j = 0; j < N; j++)
    {
         x[j] = 1*sin(frequence2*m)+1*sin(frequence1*m);
         m += 0.25;
    }

    frequence1 = w1 ->value();
    frequence1 = w2 ->value();


    inital(x,y);
    repaint();
}


代码有点长,但这个问题实在不知道怎么解决了……崩溃啦
离线coding_ali

只看该作者 6楼 发表于: 2011-06-25
回 3楼(diyuanbo) 的帖子
我调试了一下……发现w1和w2 没有分配地址,这是为什么呢???
离线jdwx

只看该作者 7楼 发表于: 2011-06-25
你的界面写的没问题。
就是数组那里出问题了,还是不要用数组了,用QList或者QVector吧。
要不找本C语言程序设计看看。
附件: test.rar (4 K) 下载次数:1
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线coding_ali

只看该作者 8楼 发表于: 2011-06-25
回 7楼(jdwx) 的帖子
太感谢啦……终于发现问题了,我原以为算法不可能出现问题,所以就在界面上纠结

呵呵,真是太感谢,我改改试试~~~
离线coding_ali

只看该作者 9楼 发表于: 2011-06-25
回 7楼(jdwx) 的帖子
嗯,弄好了,原来是FFT那个函数的形参和我的一个临时变量同名了

个人认为是入栈或出栈的时候冲突了…………所以…………

再次感谢~~~~
离线coding_ali

只看该作者 10楼 发表于: 2011-06-25
回 3楼(diyuanbo) 的帖子
感谢你哈~~~~原来真是内存的问题,是我变量搞混了,哈哈哈~~~

哇咔咔~~~
快速回复
限100 字节
 
上一个 下一个