Allora il fatto che prima alloco in numerox e poi mi copio il risultato in numero è dovuto al prototipo e alla routine Modifica_Attribbuto
perchè :
int Bianca(struct attributo *numero,int &inbyte)
mentre Modifica_Attribbuto
extern "C" int _stdcall Modifica_Attribbuto(struct attributo &record,int &modalita,struct sub_attributo &record2,int &dime);
e quando gli vado a passare direttamente numero la procedura va in errore.
mentre passandogli la copia numerox evito l'errore.
il fatto che inbyte sia passata per reference è dovuto al fatto che in assembler conviene più passarle per reference che come costanti.
e la routine sarà chiama da una funzione Assembler che dovrà calcolare il giusto valore. ma questa è un altra storia!
allora ricapitolando la funzione dovrebbe essere fatta cosi:
int Bianca(struct attributo *numero,int &inbyte)
int dime, modalita, errore, indy;
if ( inbyte==0 ) { errore=42; return errore; }
dime=0; modalita=0; indy=0; errore=0;
bool su_stack = numero !=null ptr;
sub_attributo sattrib;
// metto le inizializzazioni di sattrib
sattrib.inbyte= (int8_t)inbyte; // a proposito va bene come conversione da int a int_8?
attributo numerox;
try {
if ( !su_stack)
{ numero = new (std::nothrow) attributo;
if (!numero) { return 105; }
}
}
try { numero->valore = new char[inbyte]; }
catch (bad_alloc &err)
{ if (!su_stack) { delete numero; numero=nullptr; }
errore=105;
}
return errore;
}
modalita=0;
numerox=numero; // cosi dovrei rispettare il reference della funzione modifica_Attribbuto
errore = Modifica_Attribbuto(numerox,modalita, sattrib,dime);
if (errore !=0) { delete[] numero->valore; delete numero; numero=nullptr; numero->valore=nullptr; }
se volessi ampliare la funzione immettendo un nuovo parametro int &opzione
con 0 allocherebbe sia numero che numero.valore
con 1 allocherebbe solo numero.valore
<0 o >1 errore
andrebbe bene fatta in questa maniera?
case 0: // l' allocazione come e fatta di sopra
case 1: { if (numero==nullptr) { errore=???; break; }
numerox->valore = numero->valore; // conservo il vecchio vettore;
try { numero->valore = new char[inbyte]; } // provo ad allocare il nuovo vettore
catch (bad_alloc &err)
{ numero->valore = numerox->valore; errore=YYY;break; } // c'è errore rimetto le cose come stavano prima
delete [] numerox->valore; // le cose sono andate bene dealloco il vecchio vettore.