查看完整版本: 初学困惑,帮忙看看这段代码!!~~

palmyang 2006-8-30 00:40

初学困惑,帮忙看看这段代码!!~~

一个程序里的一段,编译通过但无法运行,就是想在form里显示一个popTrigger和list的组合,让poptrigger在默认时显示list里的第一个item。
         FormType *pForm;
        ControlType *pControl2;
        Boolean handled=false;
        Char* Lslab;
        switch (pEvent->eType) {
                case frmOpenEvent:
                pForm = FrmGetActiveForm();
                pControl2=FrmGetobjectPtr(pForm,FrmGetobjectIndex(pForm,NewFormPopListTrigger));
                Lslab=(Char*)CtlGetLabel(pControl2);
              上面返回值赋值必须要强制转换类型嘛?CtlGetLabel返回的不就是字符串类型嘛??
StrCopy(Lslab,LstGetSelectionText(FrmGetobjectPtr(pForm,FrmGetobjectIndex(pForm,NewFormPopList)),0));
                CtlSetLabel(pControl2,Lslab);
编译通过了,但是debug切换到这个form后,simulator就报错了,这时程序运行到上面CtlSetLabel,我这段代码是在书上学来的,书上根本就没有强制转换字符串类型,其它一模一样的结构,为什么我不行??
高手!!跪求解答!!!                       

keilc51 2006-8-31 16:33

将StrCopy那一句改为Lslab=LstGetSelectionText(...)试试,你的指针操作可能有问题,在StrCopy中的 Lslab可能是个空指针,没有分配到内存空间。

palmyang 2006-9-3 01:17

[quote]keilc51 写道:

将StrCopy那一句改为Lslab=LstGetSelectionText(...)试试,你的指针操作可能有问题,在StrCopy中的 Lslab可能是个空指针,没有分配到内存空间。
[/quote]
前面不是已经给Lslab赋过值了嘛。Lslab=CtlGetLabel(pControl2);怎么可能是空指针呢?书上说不要这样Lslab=LstGetSelectionText(...)赋值,因为LstGetSelectionText()返回的也是一个指针,这样会改变Lslab指向的地址。

keilc51 2006-9-4 16:51

不知你试过了没有?如果你的pControl2控件最初并没有设置Label,那你用Lslab=CtlGetLabel(pControl2)语句得到的就是一个NULL指针;

wwhheerree 2006-9-4 18:21

Lslab指向字符串,Lslab=CtlGetLabel(pControl2)后其指向Trigger的当前字符串,并没有实际分配空间,所以用strcopy无法复制字符串到Lslab指向的地址,因为Lslab没有分配空间,所以还是应该用Lslab=LstGetSelectionText(...)试试看~~~

Greenland 2006-9-28 16:29

动态分配内存空间

Char* Lslab;
在定义一个字符型指针变量后,还要为其申请空间,才能真正利用它
const UInt32 maxCharLen = 32;    //可以更改大小.
Char* Lslab;
Lslab = new Char [maxCharLen];
...
再加入刚才的函数
...
最后不要忘记
delete [] Lslab;
否则,可就有内存泄露了。

palmyang 2006-10-24 01:39

问题已经解决了,感觉pods真不好用!!
页: [1]
查看完整版本: 初学困惑,帮忙看看这段代码!!~~