template-methode => arrayproblem



  • hi,

    kleines problem:
    An meine template methode sort soll ein array (der länge x, mit datenelementen der größe y) weitergegeben werden.
    Dann soll in der template methode natürlich gelten das T ein array vom typ x mit den dateneelementen ist.
    Aber es gilt sizeof(T)==x*y und wenn ich T als array benutze dann bekomme ich nur für den ersten wert den korrekten wert, also die interpretation von (T *array) array[0] ist korrekt aber von array[1] dann nicht mehr, da array[1] auf unbekanntes gebiet rechts vom arrayblock zeigt... wenn das problem noch nicht klar ist bitte unten die ausgabe ansehn

    glaub irgendwie das das net so schwer sein kann aber ich bin bissel zu blöd 😉

    bis dann

    main.cpp

    #include "stdafx.h"
    
    int _tmain(int argc, _TCHAR* argv[])
    {	
    	int tmp[]= {3, 2, 0, 13};
    	sort(&tmp, 4);
    	for(int i=0; i<4; i++)
    		cout<<tmp[i]<<" ";	
    	return 0;
    }
    

    sort.h

    #include <assert.h>
    
    template <class T>
    void sortSwap(T *pa,T *pb)
    {
       T tmp=*pa;
       *pa=*pb;
       *pb=tmp;
    };
    
    template <class T>
    void sort(T *array,int size)
    {
    	cout << "sizeof(T)" << sizeof(T) << endl;
    	cout << **(array+0) << " " << **(array+1) << " " << **(array+2) << " " << **(array+3) << endl;
    	cout << *(array+0) << " " << *(array+1) << " " << *(array+2) << " " << *(array+3) << endl;
    
    	int obergrenze=size-1;
    	while(obergrenze>0)
    	{
    		int letzterAustausch=0;
    		for(int pos=0;pos<obergrenze;++pos)
    		{
    			//cout << *(array[pos]) << " >? " << *(array[pos+1]) << "i:" << pos << ":"<< pos+1 <<endl;
    			if(array[pos]>array[pos+1])
    			{
    				sortSwap(array[pos],array[pos+1]);
    				letzterAustausch=pos;
    			}
    		}
    		obergrenze=letzterAustausch;
    	}
    }
    

    ausgabe:

    sizeof(T)16
    3 -858993460 -858993460 -858993460
    0012FE88 0012FE98 0012FEA8 0012FEB8
    3 2 0 13
    

    erwünschte ausgabe:

    sizeof(T)16
    3 2 0 13
    0012FE88 0012FE8C 0012FE90 0012FE94
    13 3 2 0
    


  • also ich versuch das mal, wobei ich schon seit 3 oder 4 monaten kein c++ gemacht habe und jetzt zu faul bin mir ein c++ compiler zu installieren.
    auf jeden fall krieste mit

    *array[index]
    

    die richtigen werte des arrays raus.

    das ist auch falsch

    //cout << *(array[pos]) << " >? " << *(array[pos+1]) << "i:" << pos << ":"<< pos+1 <<endl
    

    das muss *array[pos], also ohne die () heissen. weil du willst ja nicht den wert von array[pos] dereferenzieren sondern erst array dereferenzieren und dann auf die elemente mittels [] zugreifen.

    ausserdem ist

    // ...
    if(array[pos]>array[pos+1])
                {
    // ...
    

    falsch. weil er vergleicht die adressen und nicht die werte der array-elemente das muss

    if(*array[pos] > *array[pos+1])
                {
    

    heissen.
    deswegen kommt bei dir auch 3 2 0 13 als ergebniss.
    er vergleicht ob die adresse von array[0] grösser ist als die von array[1], was sie ja nie ist und so wird auch nichts vertauscht.

    aber wieso so kompleziert ?

    template <class T, int size>
    void sort(T & array)
    { // ...
    
    template <class T>
    void sortSwap(T & pa,T & pb)
    {
    

    so gehts doch auch und du hast nicht soviel zeiger drinner.


Log in to reply