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.