1 / 29

In 参数

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;

petula
Télécharger la présentation

In 参数

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. In参数 • 在VisiBroker中对In参数可以在客户端进行初始化,也可以在客户端不进行初始化。 • 例如:服务器端实现如下: • void ReadTextImpl::read_string(const char* _s) throw(CORBA::SystemException) • { • cout<<"output"<<_s<<endl; • }

  2. 客户端调用如下: • 1. • char *p=""; • manager->read_string(p); • cout<<"111"<<p[0]<<"333"<<endl; • cout<<"111"<<p<<"333"<<endl; 服务器端对p的输出为空,客户端对p[0]的输出为一个空字符,对p输出空

  3. 输出为空表示对p没有任何输出 例如:输出语句为 cout<<“33”<<p<<“22”<<endl; 输出为3322,则表示对p没有输出 输出p[0] 为一个空字符表示如下: 例如:输出语句为 cout<<“33”<<p[0]<<“22”<<endl; 输出为33 22,则表示对p[0]的输出为一个空字符 不输出表示就没有使用cout语句来进行输出

  4. 2. • char *p1; • manager->read_string(p1); • cout<<"111"<<p1[0]<<"333"<<endl; • cout<<"111"<<p1<<"333"<<endl; 服务器端对p1的输出为乱码,客户端对p1[0]的输出为一个乱字符,对p1的输出为乱码

  5. 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的输出为一个乱字符

  6. 4. • CORBA::String_var line; //可以对输入参数进行初始化,也可以不对输入参数进行初始化,此处没有初始化 • manager->read_string(line.in()); • cout<<"111"<<line<<"333"<<endl; 服务器端对line的输出为空,客户端对line的输出为空

  7. 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!

  8. 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的输出为乱码

  9. 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的输出为空

  10. 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的输出时就出错了

  11. 1.使用char *p;可以多个在一起使用, 什么时候是对,什么时候是错,无法从程序中看出. • 2.对于char *p;和一个CORBA::String_var line;混合使用,什么时候是对的,什么时候是错的,从程序上是看不出来的,只能从执行的结构上看到是错是对,因此不要在程序中使用没有分配内存的指针,即char *p.

  12. 同时服务器端可以:服务器端使用的字符串可以分配内存空间,也可以不分配,也就是可以使其为空指针同时服务器端可以:服务器端使用的字符串可以分配内存空间,也可以不分配,也就是可以使其为空指针 • char *p3; • cout<<"strlen"<<strlen(p3)<<endl; • cout<<"ss"<<p3<<"www"<<endl; • cout<<"111"<<p3[0]<<"333"<<endl; • cout<<"111"<<*p3<<"333"<<endl;

  13. 注意 • 在程序中最好不要使用char *p;也就是没有进行初始化的指针,没有所指的内存,虽然有些也不会出错,但是使用此指针没有什么实际意义. • 初始化为空指针是错的,如下: • char *line=NULL;或者char *line=0; • manager->read_string(line); • cout<<"222"<<line<<"444"<<endl;

  14. Inout参数 • 在VisiBroker中对Inout参数可以在客户端进行初始化,也可以在客户端不进行初始化。 • 例如:服务器端实现如下:

  15. 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!"); • } • }

  16. 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!"); • } • }

  17. 3. • void ReadTextImpl::read_string(char*& _s) throw(CORBA::SystemException) • { • CORBA::string_free(_s); • _s=CORBA::string_dup("Hello world!"); • }

  18. 客户端调用可以 • 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!

  19. 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!

  20. Out参数 • 在VisiBroker中对out参数可以在客户端进行初始化,也可以在客户端不进行初始化。 • 例如:服务器端实现如下:

  21. 1. • void ReadTextImpl::read_string(CORBA::String_out _s) throw(CORBA::SystemException) • { • //在服务器端不能对输出参数一开始进行任何的除了释放之外的操作 • //而对输入输出参数一开始可以进行输出操作 • CORBA::string_free(_s); • _s=CORBA::string_dup("Hello!"); • }

  22. 2. • void ReadTextImpl::read_string(CORBA::String_out _s) throw(CORBA::SystemException) • { • //在服务器端不能对输出参数一开始进行任何的除了释放之外的操作 • //而对输入输出参数一开始可以进行输出操作 • _s=CORBA::string_dup("Hello!"); • }

  23. 在服务器端不能 • void ReadTextImpl::read_string(CORBA::String_out _s) throw(CORBA::SystemException) • { • //在此不能对其一开始进行输出操作,这样的输出操作是错误的 • cout<<_s<<endl; • _s=CORBA::string_dup("Hello!"); • }

  24. 1. • CORBA::String_var line; • //对输出参数也可以进行初始化,在此没有初始化 • manager->read_string(line.out()); • cout<<line<<endl; 1.服务器端对line不输出,客户端对line输出为Hello! 2.服务器端对line不输出,客户端对line输出为Hello!

  25. 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!

  26. 与VC中的比较 • char *p3; • cout<<*p3<<endl; • 在VC中是错误的操作,在VBroker中输出是乱字符或者错误 • char *p3=""; • cout<<*p3<<endl; • 在VC中的输出为一个空字符,在VBroker中输出也是一个空字符

  27. char *p3=""; • cout<<"aa"<<p3<<"ss"<<endl; • 在VC中对p3输出为空,在VBroker中输出也是空 • char *p4=NULL;//表示空指针 • char *p5=“”;//表示空字符串 • 在VC中使用free(p4)释放是安全的,在VBroker中使用CORBA::string_free(p4)释放是安全的 • 对p5不能使用以上的方法来释放.

  28. 总结 • 1.传递空指针可以产生不可预料的错误 • 2.传递未初始化的in或者inout参数时,一般来说是安全的,可是有些参数在没有初始化的时候可能会产生错误,例如,假如String_var使用缺省构造时把字符串构造为一个空指针,那么传递的时候给会出错,还有就是联合的缺省构造函数也不执行初始化工作,这样在IDL接口之间传递一个未初始化的联合是非法的,这样也将产生不可预料的结果,因此在传递in和inout参数时,最好就是要对其进行初始化之后再传递。

More Related