Allocazione array bidimensionali

di il
5 risposte

Allocazione array bidimensionali

Salve a tutti,
ho un problema: quando assegno dei valori a dei double anche parte di matrici si sovrascrivono.
Riporto il codice che va a sovrascrivere la matrice maT in modo inspiegabile per me.

Potete darmi una mano, sono disperato.

GRAZIE

\\\\\\\\\\\\\\\\\\\ MAIN \\\\\\\\\\\\\

//Istanzio le classi
CCAD_Elaborazioni Cad;
CUtilityFile FileUtility_src;

//dichiarazioni e inizializzazioni
double X,Y,Z,A_fi,B_teta,C_psi;
X = 0;
Y= 0;
Z = 0;
A_fi = 0;
B_teta = 0;
C_psi = 0;

double maT_base_offset[4][4];
double maT[4][4];

// inizializzo le matrici con una semplice funzione
GeneraMatIdentita(Matrice);
GeneraMatIdentita(maT_base_offset);

//apro file e lo carico in un vettore
...
//

//scorro il vettore e cerco la tiga interessata
for(int indice_linea=0;indice_linea<max_ind_linea_src;indice_linea++)
{
	// assegno alla stringa line una riga alla volta del vettore
	string line = FileUtility_src.GetLineaString(indice_linea);

	cerco in ogni riga del vettore "Base_Offset"
	int pos = line.find("Base_Offset = {",0);
	if(pos!=string::npos)
	{
		// trovata la riga: Base_Offset = {X 1, Y 2, Z 3, A 4, B 5, C 6}

		//in questo punto la matrice è corretta:
		// maT = [ 1 0 0 0
		//		      0 1 0 0
		//		      0 0 1 0
		//		      0 0 0 1 ]

//PROBLEMA>>>>>>>>>>>>>>>>>>>>>>
		// estraggo dalla riga i valori della sestina e li metto in double 
                //(la funzione è riportata sotto)
		Cad.EstrazioneDatiRigaDat(line,X, Y, Z, A_fi, B_teta, C_psi);

		//la matrice diventa:
		//  maT = [ 1 0 0 0
		//		      0 1 0 0
		//		      0 0 1 6
		//		      5 4 3 2 ]
		//notare la somiglianza dell'ultima riga della matrice con con la linea letta 
//PROBLEMA>>>>>>>>>>>>>>>>>>>>

		// costruisco la matrice dalla sestina
		CostruzioneMatOmogeneaTrasformazione(X, Y, Z, A_fi, B_teta, C_psi, maT_base_offset);			
	}
}

.......

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

//
//Estrae dalla riga del file dat i valori di
//X, Y, Z, A_fi, B_teta, C_psi
//
void CCAD_Elaborazioni::EstrazioneDatiRigaDat(string linea_dat, double &O_X, double &O_Y, double &O_Z, double, &O_A, double &O_B, double &O_C)
{	
	//dichiarazioni locali
	string supporto;
	vector<string> results;
	results.clear();
	
	//Istanzio classe di CUtilityStringhe per usarne le proprietà della classe
	CUtilityStringhe StringheUtility;
	
		// ricordo che linea_dat sarà "Base_Offset = {X 1, Y 2, Z 3, A 4, B 5, C 6}"

	StringheUtility.SplitString(linea_dat,"{",results);
	//results[1] contiene la stringa con i dati utili
	supporto = results[1]; \\ "X 1, Y 2, Z 3, A 4, B 5, C 6}"

	if (StringheUtility.SplitString(supporto, "}", results) > 0)
	{
		supporto = results[0]; \\ "X 1, Y 2, Z 3, A 4, B 5, C 6"
	};

	StringheUtility.SplitString(supporto,",",results);
	//elimino blank
	results[0] = StringheUtility.TrimStringa(results[0]); \\ "X 1"
	results[1] = StringheUtility.TrimStringa(results[1]); \\ "Y 2"
	results[2] = StringheUtility.TrimStringa(results[2]); \\ "Z 3"
	results[3] = StringheUtility.TrimStringa(results[3]); \\ "A 4"
	results[4] = StringheUtility.TrimStringa(results[4]); \\ "B 5"
	results[5] = StringheUtility.TrimStringa(results[5]); \\ "C 6"

	//Ora elimino la lettera iniziale da ogni stringa
	results[0] = results[0].erase(0,1); \\ "1"
	results[1] = results[1].erase(0,1); \\ "2"
	results[2] = results[2].erase(0,1); \\ "3"
	results[3] = results[3].erase(0,1); \\ "4"
	results[4] = results[4].erase(0,1); \\ "5"
	results[5] = results[5].erase(0,1); \\ "6"

	//Converto stringhe di numeri in double	
	O_X	= ConvertoStringaNumeriInDouble(StringheUtility.TrimStringa(results[0]));
	O_Y	= ConvertoStringaNumeriInDouble(StringheUtility.TrimStringa(results[1]));
	O_Z	= ConvertoStringaNumeriInDouble(StringheUtility.TrimStringa(results[2]));
	O_A	= ConvertoStringaNumeriInDouble(StringheUtility.TrimStringa(results[3]));
	O_B	= ConvertoStringaNumeriInDouble(StringheUtility.TrimStringa(results[4]));
	O_C	= ConvertoStringaNumeriInDouble(StringheUtility.TrimStringa(results[5]));
	
}

5 Risposte

  • Re: Allocazione array bidimensionali

    Il debug che ti dice? puoi fare una prova. dichiarare la matrice come
    
    const double mat[][4]  = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};
    
    cos' impedisci almeno "a livello codice" di sovrascrivere quella parte di memoria. Se viene riscritta allora una delle funzioni fa casini e solo il debug ti può dire dove sbagli.
  • Re: Allocazione array bidimensionali

    Non posso definirla come costante perchè più avanti quando incontro un'altra riga devo iniziarla nuovamente per moltiplicarla con altre matrici.

    Anche se modifico la funzione che fa i danni con la seguente non cambia esattamente niente.
    C'è un modo per salvaguardare la memoria dove vengono scritte le matrici?
    
    void CCAD_Elaborazioni::EstrazioneDatiRigaDat(string linea_dat, double &O_X, double &O_Y, double &O_Z, double, &O_A, double &O_B, double &O_C)
    {	
    	
    	O_X	= 1;
    	O_Y	= 2;
    	O_Z	= 3;
    	O_A	= 4;
    	O_B	= 5;
    	O_C	= 6;	
    }
    
    
  • Re: Allocazione array bidimensionali

    Cosa ti dice il debugger in fase di esecuzione funzione? A me se succede una cosa del genere mi da: "memory around variable ... has been corrupted". definiscila come costante per capire dov'èe il problema. Si va per stadi. Si fa il + piccolo programma dove compare l'errore e poi lo si studia. Avendo un programma enorme non riuscirai mai a capire.
  • Re: Allocazione array bidimensionali

    O almeno posta un esempio "Compilabile" così si possono fare delle prove.
  • Re: Allocazione array bidimensionali

    Ho trovato scusate sbagliavo io, consideravo la matrice 4x4 con indici da 1 a 4 anzichè da 0 a 3.
Devi accedere o registrarti per scrivere nel forum
5 risposte