跟贴请点击 http://www.huihoo.com/cgi-bin/forum/viewthread.php?tid=1260
作者 文章标题 struct问题,救命




新手上路



贴子数量 : 17
注册日期 : 6/8/2002
在线情况 : 离线

  发表于: 8/19/2002 - 02:56
一个idl
module test
{
struct client
{
string id;
string name;

};

interface clientmanager
{
void request(in client x);
};

};


客户端程序,如果new client(),id,name都赋值的情况下测试通过。
但是,如果name不赋值,报错。org.omg.CORBA.BAD_PARAM: minor code: 1 completed: Maybe
察看以下出错的堆栈,出错在clienthelper.java的write()方法,
at 。。。CDROutputStream.write_string(CDROutputStream.ja
ompiled Code)
at test.clientHelper.write(clientHelper.java)
at test.ClientHelper.insert(ClientHelper.java)
察看以下CDROutputStream中,
public final void write_string (final String s)
{
if( s == null )
{
throw new org.omg.CORBA.MARSHAL("Null References");
}
。。。
难道,struct member都必须赋值吗?
 
查看此人的个人资料 发送E-Mail给此人 编辑贴子 引用回复 搜索此人的所有贴子 给此人发送短消息




版主



贴子数量 : 198
注册日期 : 11/16/2001
在线情况 : 离线

  发表于: 8/19/2002 - 05:17
关于这个问题的讨论:


2002-08-19 12:03:22
谢谢
问一个问题
idl中,struct作为方法的参数,难道客户调用时都必须给struct的每一个成员赋值吗?

1999-08-19 12:05:39 LifeCycle
I think so ...

stevenWu?
(通过服务器中转)

2002-08-19 12:08:24 J
yeah
谢谢你对poa和servat locator的回答。
我以前用boa做过程序,poa这些还有些不清楚

2002-08-19 12:13:33 StevenWu
struct作参数那个问题,我想不那么简单
你想,如果 struct 是个out型或者inout型的参数,member肯定不需用客户端赋值。
这个问题困惑了我好2天。

1999-08-19 12:44:28 LifeCycle
变长struct的in的传递原型是const struct&
而out和inout则是struct&

(通过服务器中转)

2002-08-19 12:48:02 StevenWu
struct marshall 时,member为空报错是什么原因呢?
c++的helper类,你知道它的write方法是怎么写的?遇到null时怎么处理?

1999-08-19 12:58:58 LifeCycle
我一般都 是给个初始值。
(通过服务器中转)

2002-08-19 13:00:09 StevenWu
可是你做应用的时候,并不是要求所有的字段都必填啊。

1999-08-19 13:02:24 LifeCycle
我是参照Orbix2k的例子typetest来做的。
看来我需要做进一步测试。
(通过服务器中转)

2002-08-19 13:03:31 StevenWu
orbix2k的例子
如果struct不全赋值,客户端程序报错?

1999-08-19 13:03:59 LifeCycle
你试试?
(通过服务器中转)

1999-08-19 13:07:44 LifeCycle
tuexdo ???里面的corba全吗?
你可以试试Orbix2k.
(通过服务器中转)

2002-08-19 13:08:57 StevenWu

你是orbix公司的?
我回头想看看orbix,听说是最好的corba产品了,和规范走的很近


 
发送E-Mail给此人 编辑贴子 引用回复 查看此人的所有贴子 给此人发送短消息




版主



贴子数量 : 264
注册日期 : 10/28/2001
在线情况 : 离线

  发表于: 8/19/2002 - 06:50
2002-08-19 13:37:33 stevenWu
谢谢
问一个问题
idl中,struct作为方法的参数,难道客户调用时都必须给struct的每一个成员赋值吗?


2002-08-19 13:36:06 mep
具体可能需要查一下规范看看IDL映射到C++或java时的语义。

如果赋值会有问题吗?

(通过服务器中转)

2002-08-19 13:41:33 stevenWu
不是,我要给作参数的每一个struct member赋值,这样,方法调用时
才能正确的marshall,否则,老报错。

2002-08-19 13:40:09 mep
如果marshal时要求每个成员不为空(in参数),那么你就给他赋值好了(既然你的原意为空,说明你不需使用它,那么可以赋给它任意一个字符串)
(通过服务器中转)

2002-08-19 13:45:42 stevenWu
可是,我想知道到底是不是这样的?

而且,我用out参数的时候,同样的问题,必须给个无用的值,才能marshal通过?

2002-08-19 13:43:30 mep
如果是out或inout类型,可以使用对应var类型来接收返回值。


(通过服务器中转)

2002-08-19 13:49:12 stevenWu
java中是holder类来接收,但是holder类同样要求struct member不能为空,才能marshall?

2002-08-19 13:46:46 mep
让我查查看
(通过服务器中转)

2002-08-19 13:52:17 stevenWu
谢谢mep

2002-08-19 14:05:11 mep
可不可以把完整的出错堆栈给我看看
(通过服务器中转)

2002-08-19 14:09:13 stevenWu
ok

2002-08-19 14:10:40 stevenWu
org.omg.CORBA.BAD_PARAM: minor code: 1 completed: Maybe
at com.beasys.CORBA.iiop.CDROutputStream.write_string(CDROutputStream.java, Compiled Code)
at cn.sztelecom.CDMA.core.IDL.ClientInfoHelper.write(ClientInfoHelper.java:20)
at cn.sztelecom.CDMA.core.IDL.ClientInfoHelper.insert(ClientInfoHelper.java:47)
at cn.sztelecom.CDMA.core.IDL._ClientStub.update(_Clien

2002-08-19 14:14:31 stevenWu
http://java-house.jp/ml/archive/j-h-b/035700.html

同样的问题,不过是日文,我看不懂

2002-08-19 14:11:12 mep
我不太明白为什么in参数要在outputstream中marshal。
堆栈信息不全,再外部的堆栈信息?
(通过服务器中转)

2002-08-19 14:15:24 stevenWu
这是个inout参数

2002-08-19 14:17:44 stevenWu
如果我给struct member全赋值,就好了,没有错误,调用完成

2002-08-19 14:16:41 mep
喔,怪不得。

喔正在查看规范,看看是否允许返回空的out或inout参数
(通过服务器中转)

2002-08-19 14:21:39 stevenWu
即使不允许,为什么全赋值就好了?

2002-08-19 14:18:20 mep
全赋值的意思是每个都是NULL吗?
(通过服务器中转)

2002-08-19 14:22:36 stevenWu
都不空

2002-08-19 14:21:55 mep
是啊,
ORB会检查out或inout参数中的string类型是否为NULL,
如果是,就会抛出BAD_PARAM异常。
所以再marshal client类型时,它marshal它的每个成员并检查是否为空。

不过这个说法我还没有从规范中找到出处
(通过服务器中转)

2002-08-19 14:27:30 mep
好像是这样:
在某些语言中,string没有NULL值,因此,out或inout中的string中NULL会引发异常。在IDL中,NULL只能赋值个对象引用。

所以你还是必须把它的每个成员都赋非空的值
(通过服务器中转)

2002-08-19 14:32:37 stevenWu
不对, 你是指方法返回后,out参数不能为null?

可是,这是在marshal的时候啊,out参数应当可以为null.out参数既然定义为接收返回值的,marshak前,参数应当可以为空吧。

2002-08-19 14:31:38 mep
问题是有些语言中没有NULL值(除了对象引用,是否还有value?)

ojbect reference的out或inout类型可以赋NULL。其他的类型不行
(通过服务器中转)

2002-08-19 14:42:59 stevenWu
我明白你的意思。

而且,即使参数为in,出错信息是一样的。
我看了helper类,marshal的时候就是在OutputStream中。

2002-08-19 14:42:39 mep


(通过服务器中转)


 
发送E-Mail给此人 编辑贴子 引用回复 查看此人的所有贴子 给此人发送短消息




新手上路



贴子数量 : 3
注册日期 : 8/22/2002
在线情况 : 离线

  发表于: 8/22/2002 - 01:18
我知道visibroker 4。51for java中,string是必须赋值的,而且如果传输汉子,则必须转换。

 

____________________

我渴望一个美丽的女孩,美丽如一杯绿茶;
我渴望一段隽永的爱情,隽永仅此一世;
我相信我会有幸福的生活,正如我相信会有同样幸福的女孩——幸福因你而开始 ,幸福因你而终生;
我不是个一定要有什么大志的男孩,我只希望我的人生能实现这样一种一直让我 感动的境界——
携子之手,与子同老!

 
发送E-Mail给此人 编辑贴子 引用回复 查看此人的所有贴子 给此人发送短消息

COPYRIGHT © 2001-2002 huihoo.com
E-mail:webmaster@huihoo.com