[MWy] omniORB, server a BAD_PARAM

Andrej Podzimek andrej at podzimek.org
Wed Apr 9 11:08:50 CEST 2008


Dobrý den všem,

neuvěřitelně dlouho řeším rozšířené zadání druhého úkolu, neboť jsem při implementaci serveru narazil na problém, který jednoduše nechápu. Volání get_status() končí výjimkou BAD_PARAM. K té se dospěje takto:

1) Celý protokol mi funguje správně tak, jak je v zadání, až po volání metody get_status().
2) Metoda get_status() úspěšně přečte své první dva parametry, (const char *, count_t &).
3) Pokus o zápis do třetího parametru (jak to požaduje zadání) skončí výjimkou BAD_PARAM.

Pokusím se popsat, jakým způsobem sekvenci předávám:

Na straně *klienta* je:
	octet_sequence_t_var	sequence;
	vInstance->get_status( peer.in(), cnt, sequence.out() );
Dřív jsem měl před voláním get_status() navíc řádku:
	sequence = new octet_sequence_t( size );
Její přítomnost výskyt výjimky neovlivňuje. Patrně není důvod alokovat „tělo“ sekvence, když se má vzápětí přepsat.
	
Na straně *serveru* je:
	// Přiřazení do výstupního parametru (operator=)
	status = new octet_sequence_t( out_size );	
	for ( CORBA::ULong i = 0; i < out_size; ++i ) {
		// TADY se vyhodí BAD_PARAM, hned při první iteraci.
		status[ i ] = (CORBA::Octet) outstr[ i ];	
	}

Co jsem zkoušel:

1)
Najít metodu length(). Všude na internetu se o ní píše, ale v omniORB nic takového není. Použití length() skončí chybou překladu „...not a member...“. Pokud to chápu správně, číselný parametr konstruktoru sice alokuje předem paměť, ale nestanovuje velikost sekvence. Ta zůstane nulová. Jakýkoliv index (včetně 0) je pak nejspíš chybný a může vyvolat BAD_PARAM.

2)
Experimety s datovými typy. Na webu je varování ohledně short/long, signed/unsigned a podobně. Zkoušel jsem nejméně deset různých castů, ale nic nepomohlo. Předávání hodnot přímo pomocí literálů ('z') nebo pomocí String_var::operator[]() rovněž nepomáhá.

3)
Vydolovat použitelné informace z té výjimky. Alespoň nějaký slovní popis toho, co je špatně. Ani to se mi nepodařilo. Dokumentace k omniORB pokrývá spolehlivě vše, co nepotřebuji vědět, zatímco důležité věci (kde najdu length(), co všechno s sebou nesou výjimky) v ní nevidím.

Něco dělám špatně a jistě se budu chytat zahlavu, až pochopím, v čem byl problém. Už jsem z toho třeskutě unavený, ale přece ten úkol nevzdám, když už jsem mu obětoval tolik času.

Za jakoukoliv radu, případně námět, co bych měl ještě vyzkoušet, předem děkuji.

S pozdravem

Andrej Podzimek




More information about the NSWI080 mailing list