?? c_shm_merge.cpp
字號:
while( i_item_seq < MAX_ITEM_COUNT )
{
if( i_element_seq < p_merge_item[i_item_seq]->p_merge_info->record_count )
{
i_sort_seq = 1;
return &(p_merge_item[i_item_seq]->p_merge_list[i_element_seq]);
}
if( i_element_seq < p_merge_item[i_item_seq]->p_merge_info->add_record_count )
{
i_sort_seq = 0;
return &(p_merge_item[i_item_seq]->p_add_merge_list[i_element_seq]);
}
i_item_seq ++;
}
return NULL;
//return getElementBySeq(i_item_seq, i_element_seq, i_sort_seq );
}
SHM_MERGE_LIST* c_shm_merge::getNextElement()
{
i_element_seq ++;
if( 1 == i_sort_seq )
{
//有序區是否已經找完,是,到無序區找。
if( i_element_seq >= p_merge_item[i_item_seq]->p_merge_info->record_count )
{
i_sort_seq = 0;
i_element_seq = 0;
}
}
else
{
//無序區是否找完,是,到下一個子塊中找
if( i_element_seq >= p_merge_item[i_item_seq]->p_merge_info->add_record_count )
{
i_sort_seq = 1;
i_element_seq = 0;
i_item_seq ++;
while( i_item_seq < MAX_ITEM_COUNT )
{
if( i_element_seq < p_merge_item[i_item_seq]->p_merge_info->record_count )
{
i_sort_seq = 1;
return &(p_merge_item[i_item_seq]->p_merge_list[i_element_seq]);
}
if( i_element_seq < p_merge_item[i_item_seq]->p_merge_info->add_record_count )
{
i_sort_seq = 0;
return &(p_merge_item[i_item_seq]->p_add_merge_list[i_element_seq]);
}
i_item_seq ++;
}
}
}
//是否已到最大塊?
if( i_item_seq >= MAX_ITEM_COUNT )
{
return NULL;
}
else
{
//返回值
if( 1 == i_sort_seq )
return &(p_merge_item[i_item_seq]->p_merge_list[i_element_seq]);
else
return &(p_merge_item[i_item_seq]->p_add_merge_list[i_element_seq]);
}
}
bool c_shm_merge::getChargeList1(const long serv_id, const int billing_cycle_id )
{
//構造main
char tmp_buf[20];
memcpy( &tmp_buf[0], &serv_id, 8 );
memcpy( &tmp_buf[8], &billing_cycle_id, 4 );
//首先確定是在哪一塊中
int main_seq = getMergeItemSeq(&tmp_buf[0]);
//在小塊中查找
SHM_MERGE_LIST* p_find_main = p_merge_item[main_seq]->find(&tmp_buf[0]);
if( p_find_main != NULL )
{
//找到號碼
get_next_pos = p_find_main ->item_pos;
p_list = getNext();
list_get_item_count = -1;
return true;
}
else
{
return false;
}
}
int c_shm_merge::getChargeList(const int serv_id, const int counting_type_id)
{
//首先確定是在哪一塊中
int main_seq = (serv_id%100)/10;
//在小塊中查找
SHM_MERGE_LIST* p_find_main = p_merge_item[main_seq]->findServID( serv_id, counting_type_id );
p_find_charge_main = p_find_main ;
if( p_find_main != NULL )
{
//找到號碼
//return update( p_find_main->item_pos, p_item, p_fee );
get_next_pos = p_find_main->item_pos;
return 0;
}
else
{
//打不到
get_next_pos = -1;
return -1;
}
}
void c_shm_merge::displayMain()
{
/*
char main_value[500];
int int_value;
long long_value;
double double_value;
if( p_find_charge_main != NULL )
{
for ( int i = 0 ; i < g_main_key.size() ; i ++)
{
memcpy(&main_value[0], &(p_find_charge_main->main[g_main_key[i].pos]), g_main_key[i].size);
main_value[g_main_key[i].size] = '\0';
switch ( g_main_key[i].type )
{
catch 1:
cout<<i<<"field:"<<main_value<<endl;
break;
catch 2:
memcpy( &int_value, &main_value[0], 4 );
cout<<i<<"field:"<<int_value<<endl;
break;
catch 3:
cout<<i<<"field:"<<main_value<<endl;
break;
catch 4:
memcpy( &double_value, &main_value[0], 8 );
cout<<i<<"field:"<<double_value<<endl;
break;
catch 5:
memcpy( &long_value, &main_value[0], 12 );
cout<<i<<"field:"<<long_value<<endl;
break;
default:
cout<<i<<"field:"<<main_value<<endl;
break;
}
}
}
*/
return;
}
//冒泡法排序,只對8個進行排序
int c_shm_merge_addition::qSort(const int begin_pos)
{
return 0;
}
int c_shm_merge_addition::getPos(const int get_pos)
{
return p_merge_list_item[get_pos].next_pos;
}
long c_shm_merge_addition::getFee( const int main_pos, const int item )
{
int j, last_pos, get_comp_pos;
int last_main_pos = main_pos;
int t;
if( p_merge_list_item[last_main_pos].next_pos == -1 )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
if( t == 0 )
{
return p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee;
}
else if( t < 0 )
{
return -999999;
}
else
{
//在本塊中查找
for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
if( t == 0 )
return p_merge_list_item[ last_main_pos ].acctFee[ j ].fee;
else if( t > 0 )
return -999999;
}
}
}
while( p_merge_list_item[last_main_pos].next_pos != -1 )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
if( t == 0 )
{
return p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee;
}
else if( t < 0 )
{
last_main_pos = p_merge_list_item[last_main_pos].next_pos;
}
else
{
//在本塊中查找
for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
if( t == 0 )
return p_merge_list_item[ last_main_pos ].acctFee[ j ].fee;
else if( t > 0 )
return -999999;
}
}
}
return -999999;
}
bool c_shm_merge_addition::getFee( int main_pos, const int item, long* out_value )
{
int j, last_pos, get_comp_pos;
int last_main_pos = main_pos;
int t;
if( p_merge_list_item[last_main_pos].next_pos == -1 )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
if( t == 0 )
{
memcpy( out_value, &(p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee), sizeof(long) );
return true;
}
else if( t < 0 )
{
return false;
}
else
{
//在本塊中查找
for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
if( t == 0 )
{
memcpy( out_value, &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), sizeof(long) );
return true;
}
else if( t > 0 )
return false;
}
}
}
while( p_merge_list_item[last_main_pos].next_pos != -1 )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
if( t == 0 )
{
memcpy( out_value, &(p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee), sizeof(long) );
return true;
}
else if( t < 0 )
{
last_main_pos = p_merge_list_item[last_main_pos].next_pos;
}
else
{
//在本塊中查找
for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
if( t == 0 )
{
memcpy( out_value, &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), sizeof(long) );
return true;
}
else if( t > 0 )
return false;
}
}
}
return false;
}
bool c_shm_merge_addition::updateFee( const int main_pos, const int item, const long fee )
{
int j, last_pos, get_comp_pos;
int last_main_pos = main_pos;
int t;
if( p_merge_list_item[last_main_pos].next_pos == -1 )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
if( t == 0 )
{
memcpy( &(p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee), &fee, sizeof(long) );
return true;
//p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee = fee;
}
else if( t < 0 )
{
append( main_pos, &item, &fee );
return true;
}
else
{
//在本塊中查找
for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
if( t == 0 )
{
memcpy( &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), &fee, sizeof(long) );
//long test_long ;
//memcpy( &test_long, &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), sizeof(long) );
//int tmp_d;
//char tmp_char[17];
//memcpy( &tmp_char[0], &(p_merge_list_item[ last_main_pos ].acctFee[ j ].key), 16 );
//for( tmp_d = 0 ; tmp_d < 16; tmp_d ++ )
// printf( "%d\t", tmp_char[tmp_d] );
//printf("\n");fflush(stdout);
return true;
//p_merge_list_item[ last_main_pos ].acctFee[ j ].fee = fee;
}
else if( t > 0 )
{
append( main_pos, &item, &fee );
return true;
}
}
}
}
while( p_merge_list_item[last_main_pos].next_pos != -1 )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].key - item ;
if( t == 0 )
{
memcpy( &(p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee), &fee, sizeof(long) );
return true;
//p_merge_list_item[ last_main_pos ].acctFee[ p_merge_list_item[ last_main_pos ].ele_count -1 ].fee = fee;
}
else if( t < 0 )
{
last_main_pos = p_merge_list_item[last_main_pos].next_pos;
}
else
{
//在本塊中查找
for( j = 0; j < p_merge_list_item[ last_main_pos ].ele_count; j++ )
{
t = p_merge_list_item[ last_main_pos ].acctFee[ j ].key - item;
if( t == 0 )
{
memcpy( &(p_merge_list_item[ last_main_pos ].acctFee[ j ].fee), &fee, sizeof(long) );
return true;
//p_merge_list_item[ last_main_pos ].acctFee[ j ].fee = fee;
}
else if( t > 0 )
{
append( main_pos, &item, &fee );
return true;
}
}
}
}
return true;
}
/*
SHM_MERGE_LIST_ITEM* c_shm_merge_addition::binfind( const int begin_pos, const int end_pos, const SHM_MERGE_LIST_ITEM* item )
{
if( begin_pos == end_pos )
{
if( listItemComp(&(p_merge_list_item[begin_pos]), item ) == 0 )
{
return &(p_merge_list_item[begin_pos]);
}
else
{
return NULL;
}
}
else
{
int middle_pos = begin_pos + (end_pos-begin_pos)/2;
int comp = listItemComp(&(p_merge_list_item[middle_pos]), item );
if( comp == 0 )
{
return &(p_merge_list_item[middle_pos]);
}
else if( comp > 0 )
{
return binfind( begin_pos, middle_pos, item );
}
else
{
return binfind( middle_pos+1, end_pos, item );
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -