290 likes | 439 Views
In 参数. 在 VisiBroker 中对 In 参数可以在客户端进行初始化 , 也可以在客户端不进行初始化。 例如:服务器端实现如下: void ReadTextImpl::read_string(const char* _s) throw(CORBA::SystemException) { cout<<"output"<<_s<<endl; }. 客户端调用如下: 1. char *p=""; manager->read_string(p); cout<<"111"<<p[0]<<"333"<<endl;
E N D
In参数 • 在VisiBroker中对In参数可以在客户端进行初始化,也可以在客户端不进行初始化。 • 例如:服务器端实现如下: • void ReadTextImpl::read_string(const char* _s) throw(CORBA::SystemException) • { • cout<<"output"<<_s<<endl; • }
客户端调用如下: • 1. • char *p=""; • manager->read_string(p); • cout<<"111"<<p[0]<<"333"<<endl; • cout<<"111"<<p<<"333"<<endl; 服务器端对p的输出为空,客户端对p[0]的输出为一个空字符,对p输出空
输出为空表示对p没有任何输出 例如:输出语句为 cout<<“33”<<p<<“22”<<endl; 输出为3322,则表示对p没有输出 输出p[0] 为一个空字符表示如下: 例如:输出语句为 cout<<“33”<<p[0]<<“22”<<endl; 输出为33 22,则表示对p[0]的输出为一个空字符 不输出表示就没有使用cout语句来进行输出
2. • char *p1; • manager->read_string(p1); • cout<<"111"<<p1[0]<<"333"<<endl; • cout<<"111"<<p1<<"333"<<endl; 服务器端对p1的输出为乱码,客户端对p1[0]的输出为一个乱字符,对p1的输出为乱码
3. • char *p3; • cout<<*p3<<endl; • manager->read_string(p3); • cout<<"111"<<p3[0]<<"333"<<endl; • cout<<"111"<<*p3<<"333"<<endl; 服务器端对p3的输出为乱码,客户端对*p3的输出为一个乱字符,对p3[0]的输出为一个乱字符,对*p3的输出为一个乱字符
4. • CORBA::String_var line; //可以对输入参数进行初始化,也可以不对输入参数进行初始化,此处没有初始化 • manager->read_string(line.in()); • cout<<"111"<<line<<"333"<<endl; 服务器端对line的输出为空,客户端对line的输出为空
5. • CORBA::String_var line; • //可以对输入参数进行初始化,也可以不对输入参数进行初始化 • line=CORBA::string_dup("Hello world!"); • manager->read_string(line.in()); • cout<<"222"<<line<<"444"<<endl; 服务器端对line的输出为Hello world!,客户端对line的输出也Hello world!
7. • char *p1; • manager->read_string(p1); • cout<<"111"<<p1[0]<<"333"<<endl; • cout<<"111"<<p1<<"333"<<endl; • char *p3; • cout<<*p3<<endl; • manager->read_string(p3); • cout<<"111"<<p3[0]<<"333"<<endl; • cout<<"111"<<*p3<<"333"<<endl; 服务器端对p1的输出为乱码,客户端对p1[0]的输出为一个乱字符,对p1的输出为乱码 服务器端对p3的输出为乱码,客户端对p3[0]的输出为一个乱字符,对p3的输出为乱码
8. • char *p1; • manager->read_string(p1); • cout<<"111"<<p1[0]<<"333"<<endl; • cout<<"111"<<p1<<"333"<<endl; • CORBA::String_var line; • manager->read_string(line.in()); • cout<<"111"<<line<<"333"<<endl; 服务器端对p1的输出为乱码,客户端对p1[0]的输出为一个乱字符,对p1的输出为乱码 服务器端对line的输出为空,客户端对line的输出为空
9. • char *p1; • manager->read_string(p1); • cout<<"111"<<p1[0]<<"333"<<endl; • cout<<"111"<<p1<<"333"<<endl; • char *p3; • cout<<*p3<<endl; • manager->read_string(p3); • cout<<"111"<<p3[0]<<"333"<<endl; • CORBA::String_var line; • manager->read_string(line.in()); • cout<<"111"<<line<<"333"<<endl; 服务器端对p1的输出为乱码,客户端对p1[0]的输出为一个乱字符,对p1的输出为乱码 到了对p3的输出时就出错了
1.使用char *p;可以多个在一起使用, 什么时候是对,什么时候是错,无法从程序中看出. • 2.对于char *p;和一个CORBA::String_var line;混合使用,什么时候是对的,什么时候是错的,从程序上是看不出来的,只能从执行的结构上看到是错是对,因此不要在程序中使用没有分配内存的指针,即char *p.
同时服务器端可以:服务器端使用的字符串可以分配内存空间,也可以不分配,也就是可以使其为空指针同时服务器端可以:服务器端使用的字符串可以分配内存空间,也可以不分配,也就是可以使其为空指针 • char *p3; • cout<<"strlen"<<strlen(p3)<<endl; • cout<<"ss"<<p3<<"www"<<endl; • cout<<"111"<<p3[0]<<"333"<<endl; • cout<<"111"<<*p3<<"333"<<endl;
注意 • 在程序中最好不要使用char *p;也就是没有进行初始化的指针,没有所指的内存,虽然有些也不会出错,但是使用此指针没有什么实际意义. • 初始化为空指针是错的,如下: • char *line=NULL;或者char *line=0; • manager->read_string(line); • cout<<"222"<<line<<"444"<<endl;
Inout参数 • 在VisiBroker中对Inout参数可以在客户端进行初始化,也可以在客户端不进行初始化。 • 例如:服务器端实现如下:
1. • void ReadTextImpl::read_string(char*& _s) throw(CORBA::SystemException) • { • if(strlen(_s)<strlen("Hello world!")) • { • CORBA::string_free(_s); • _s=CORBA::string_dup("Hello world!"); • } • else • { • strcpy(_s,"Hello!"); • } • }
2. • void ReadTextImpl::read_string(char*& _s) throw(CORBA::SystemException) • { • //对输入输出参数可以一开始就进行输出操作, • //而对输出参数这样不可以 • cout<<_s<<endl; • if(strlen(_s)<strlen("Hello world!")) • { • CORBA::string_free(_s); • _s=CORBA::string_dup("Hello world!"); • } • else • { • strcpy(_s,"Hello!"); • } • }
3. • void ReadTextImpl::read_string(char*& _s) throw(CORBA::SystemException) • { • CORBA::string_free(_s); • _s=CORBA::string_dup("Hello world!"); • }
客户端调用可以 • 1. • CORBA::String_var line; • //可以对输入输出参数进行初始化,也可以不对输入参数进行初始化,此处没有进行初始化 • manager->read_string(line.inout()); • cout<<line<<endl; 1.服务器端对line不输出,客户端对line输出为Hello World! 2.服务器端对line的输出为空,客户端对line输出为Hello World! 3. 服务器端对line不输出,客户端对line输出为Hello World!
2. • CORBA::String_var line; • //可以对输入输出参数进行初始化,也可以不对输入参数进行初始化,此处没有进行初始化 • line=CORBA::string_dup("wwwwwwwwwwwwwwwww"); • manager->read_string(line.inout()); • cout<<line<<endl; 1.服务器端对line不输出,客户端对line输出为Hello! 2.服务器端对line的输出为wwwwwwwwwwwwwwwww ,客户端对line输出为Hello! 3. 服务器端对line不输出,客户端对line输出为Hello World!
Out参数 • 在VisiBroker中对out参数可以在客户端进行初始化,也可以在客户端不进行初始化。 • 例如:服务器端实现如下:
1. • void ReadTextImpl::read_string(CORBA::String_out _s) throw(CORBA::SystemException) • { • //在服务器端不能对输出参数一开始进行任何的除了释放之外的操作 • //而对输入输出参数一开始可以进行输出操作 • CORBA::string_free(_s); • _s=CORBA::string_dup("Hello!"); • }
2. • void ReadTextImpl::read_string(CORBA::String_out _s) throw(CORBA::SystemException) • { • //在服务器端不能对输出参数一开始进行任何的除了释放之外的操作 • //而对输入输出参数一开始可以进行输出操作 • _s=CORBA::string_dup("Hello!"); • }
在服务器端不能 • void ReadTextImpl::read_string(CORBA::String_out _s) throw(CORBA::SystemException) • { • //在此不能对其一开始进行输出操作,这样的输出操作是错误的 • cout<<_s<<endl; • _s=CORBA::string_dup("Hello!"); • }
1. • CORBA::String_var line; • //对输出参数也可以进行初始化,在此没有初始化 • manager->read_string(line.out()); • cout<<line<<endl; 1.服务器端对line不输出,客户端对line输出为Hello! 2.服务器端对line不输出,客户端对line输出为Hello!
2. • CORBA::String_var line; • //对输出参数也可以进行初始化 • line=CORBA::string_dup("hhhhh"); • manager->read_string(line.out()); • cout<<line<<endl; 1.服务器端对line不输出,客户端对line输出为Hello! 2.服务器端对line不输出,客户端对line输出为Hello!
与VC中的比较 • char *p3; • cout<<*p3<<endl; • 在VC中是错误的操作,在VBroker中输出是乱字符或者错误 • char *p3=""; • cout<<*p3<<endl; • 在VC中的输出为一个空字符,在VBroker中输出也是一个空字符
char *p3=""; • cout<<"aa"<<p3<<"ss"<<endl; • 在VC中对p3输出为空,在VBroker中输出也是空 • char *p4=NULL;//表示空指针 • char *p5=“”;//表示空字符串 • 在VC中使用free(p4)释放是安全的,在VBroker中使用CORBA::string_free(p4)释放是安全的 • 对p5不能使用以上的方法来释放.
总结 • 1.传递空指针可以产生不可预料的错误 • 2.传递未初始化的in或者inout参数时,一般来说是安全的,可是有些参数在没有初始化的时候可能会产生错误,例如,假如String_var使用缺省构造时把字符串构造为一个空指针,那么传递的时候给会出错,还有就是联合的缺省构造函数也不执行初始化工作,这样在IDL接口之间传递一个未初始化的联合是非法的,这样也将产生不可预料的结果,因此在传递in和inout参数时,最好就是要对其进行初始化之后再传递。