Salve a tutti, ho da completare del codice in C, e dovrei capire cosa scrivere anche basandomi sulla parte che ho già, il problema è che non riesco a capire il funzionamento del metodo. Non vi chiedo di completarmi il codice, ma di spiegarmi il funzionamento della parte nota in modo da provare ad arrivarci da solo, non mi piace farmi fare le cose.
Il codice è questo
void v_insert_n(vector_type v,iterator start_i,unsigned n,void* new_val){
char null[v->e_sz];
int inserted, moved, to_insert, to_move;
if ( n==0 ) /*** nothing to insert ***/
return;
if ( v == NULL )
fail("v_insert_n(): no such vector");
if ( start_i == iterator_end )
start_i = v->no_e;
if ( start_i < 0 )
fail("v_insert_n(): bad iterator");
if ( start_i >= v->no_e ) {
memset((void*)null,0,v->e_sz);
while ( start_i > v->no_e ) /*** fill-in the gap with zero elements ***/
v_push_back(v,(void*)null);
/*** insert new elements at index >= v->no_e ***/
for ( inserted=0 ; inserted < n ; inserted++ )
v_push_back(v,new_val);
return;
}
/*** otherwise, we have to move some elements first, in order to make space ***/
moved = (v->no_e);
to_move = moved - start_i;
to_insert = n;
#ifdef DEBUG
printf(" ... v_insert_n(%1d): moved=%1d, to_move=%1d, start_i=%1d\n",
n,moved,to_move,start_i);
#endif
for ( inserted = 0 ; (to_move+inserted) < n ; inserted++, to_insert-- )
v_push_back(v,new_val);
#ifdef DEBUG
printf(" ... v_insert_n(%1d): inserted=%1d\n",n,inserted);
#endif
for ( to_move = moved ; to_move >= start_i && inserted < n ; inserted++, to_move-- );
for ( inserted = 0 ; to_move < moved ; inserted++, to_move++ ) {
#ifdef DEBUG
printf(" ... v_insert_n(%1d): pushing_back %1d\n",n,to_move);
#endif
v_push_back(v, v->e_array + (v->e_sz) * to_move );
}
/*** move possibly remaining elements and then add the new ones ***/
for ( moved -= inserted ; moved-- > start_i ; ) {
#ifdef DEBUG
printf(" ... v_insert_n(%1d): moving %1d to %1d\n",n,moved,moved+n);
#endif
/*** TO BE DONE START ***/
/*** TO BE DONE END ***/
}
while ( to_insert-- > 0 ) {
#ifdef DEBUG
printf(" ... v_insert_n(%1d): inserting %1d\n",n,start_i+to_insert);
#endif
/*** TO BE DONE START ***/
/*** TO BE DONE END ***/
}
}
Principalmente non capisco la parte dopo il primo #endif.