Wie Konstruktor bauen - brauche Pointer



  • Woher kommt eigentlich P und wie wurde es angelegt?

    (btw, hast du früher mal mit Java gearbeitet?)



  • Ne hab wenig mit Java gemacht.

    P wird so angelegt:

    Pattern::Pattern(int len)
    {
    	j_sets = NULL;
    	len = len;
    	j_sets = new Index_Set*[len];	
    }
    
    P = new Pattern(n);
    


  • Es liegt irgendwie am memcpy...ich weiß nicht warum...



  • Und wo genau kommt der Segfault? (ich würde ja darauf tippen, daß die Größenangaben nicht ganz zusammenpassen)

    PS Nur am Rande: In C++ verwendet man Pointer eher selten - wenn machbar, solltest du deine Variablen auf dem Stack unterbringen. Und die Zugriffe auf Membervariablen sollten lieber von der Klasse selbst übernommen werden.



  • Nene - an den Längen kanns nicht liegen - es hat ja alles funktioniert bis ich jetzt den Konstruktor geändert hatte. An den Längen hab ich nix verändert.

    Der segfault kommt genau beim memcpy() und schreit so:

    Conditional jump or move depends on uninitialised value(s)
    ==7389==    at 0x4022E6C: memcpy (mc_replace_strmem.c:406)
    ==7389==    by 0x804A1CE: Sp<double>::SP_Column(Matrix<double>*, Matrix<double>*&, Pattern*, int, double, int, int) (in /Source_code/Current/bin/sp)
    ==7389==    by 0x80497D2: main (in /Source_code/Current/bin/sp)
    

    Hmm....



  • Ich tippe immer noch auf eine Index-Überschreitung oder einen nicht-initialisierten Zeiger.

    Vorschlag: Erklär mal, was du überhaupt vorhast. Vielleicht wird der Quelltext dann klarer. (btw, anstelle der nackten Zeiger würde ich lieber mit std::vector<> arbeiten)



  • Ja ich weiß dass es in C++ schöne Templates gibt wie vector oder Set. Aber ich brauche wirklich das hier.

    Was ich vorhabe ist eigentlich trivial: Ein array in ein anderes kopieren.

    Also ich habe 2 Index_Sets und möchte von dem einen Index_Set->idcs array die werte in das andere kopieren Index_Set->idcs.

    Das erste wird so initialisiert dass es vom Pattern welches ein array aus Index_Sets hat einfach eine Index_Set extrahiert wird und an J_pattern übergeben wird.
    J (also das zweite array wohin kopiert werden soll) wird einfach so initialisiert:

    Index_Set* J = new Index_Set(n);

    J_pattern wird so gefüllt:

    template <class T>     Index_Set*    
    Spai_Sub<T>::Get_J_Set(    Pattern         *P,
                        const int     col)
    {
        Index_Set    *J = NULL;
        J = P->j_sets[col];   
        return J;
    }
    

    Das Pattern füllt seine j_sets so:

    Pattern 	*P = new Pattern(n);
    
    	for( int col = 0; col < n; col++)
    	{
    		i_set = new Index_Set(1);
    		i_set->idcs[0] = col;
    		P->j_sets[col] = i_set;
    	}
    

    wobei der Konstruktor so aussieht:

    Pattern::Pattern(int len)
    {
    	j_sets = NULL;
    	len = len;
    	j_sets = new Index_Set*[len];	
    }
    

    Die Member von Pattern:

    /// All index sets of each column
        	Index_Set 	**j_sets;
    
    		/// The length of the pattern - always size n of
    		/// matrix A
    		int 		len;
    

    das ganze wird so aufgerufen:

    Index_Set 	/*o_is,*/
     				*J_pattern = NULL,
     				*J = NULL, 
    				*I = NULL;
    
    	J = new Index_Set(A->n);		
    
    	J_pattern = o_sub.Get_J_Set(P, col);
    
    	// Copy the values into the big working Index_Set J
    	memcpy(J->idcs, J_pattern->idcs, J_pattern->len * sizeof(int));
    	J->len = J_pattern->len;
    


  • Woher kommen denn die Größenangaben n und l?

    (und was genau spricht dagegen, vector'en anstelle der dynamischen Arrays zu verwenden?)



  • das l ist eine eins als "1".

    das n ist gesetzt. Ich habe es gerade ausgeben lassen.

    Ich benutze keine std::vectoren aus einem Grund der vielleicht lächerlich erscheint - aber ich arbeite an einem zeitperformanten programm - und ich hatte mit der std-lib schon einige probleme damals gehabt die mein programm unglaublich langsam werden ließen. Ich hatte es damals umgeschrieben auf reine pointer-arithmetik ohne std-lib und es war viel schneller. Der ein oder andere mag jetzt sagen: Jaja-das lag wohl eher an der umschreibung und nicht an der std-lib. Mag sein - aber nochmal will ich mir das nicht antun. Soviel dazu.



  • ok, es liegt definitiv daran das J_pattern->len nicht gesetzt ist.
    Aber warum?



  • Lass dir doch mal J_Pattern->len und J->len ausgeben



  • AAAArgh.

    Ja klar, sowas geht ja nicht:

    Index_Set::Index_Set(int len)
    {
    	idcs = NULL;
    	len = len;
    	idcs = new int[len];
    }
    

    sondern nur sowas 🙂

    Index_Set::Index_Set(int len_a)
    {
    	idcs = NULL;
    	len = len_a;
    	idcs = new int[len];
    }
    

Anmelden zum Antworten