Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Suffix Array Verfgleich und Befüllung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.11.2011, 14:15 Uhr
~Auronsen
Gast


Guten Tag,
ich soll einen Algorithmus (MLR) Programmieren, dazu brauch ich ein Suffix-Array welchen ich dann Lexikographisch sortieren muss. Als String bzw. Text wird mir eine datei übergeben die ich dann auslese und in den Array fülle und danach sortiere.

Die Datei(also alle Chars in der datei) wird in den vector= vector<char>text; gespeichert.

Ich dachte mir dabei, die Sort funktion zu benutzen welche eine Compare objekt benutzt(Compare hab ich dann selber in einer Klasse mit der dazugehörigen Funktion geschrieben).

Mein Problem ist, sobald ich auf die Sort funktion zugreife gibt er mir einen APPCRASH raus, jedoch weis ich nicht warum, habe auch schon eine andere Funktion (Lexikographic_sort) probiert wo genau der selbe fehler auftritt.

Hier mal der Part des Codes, wo ich denke das da ein fehler sein könnte,


C++:

#includet things...

vector<char> text;

class suffixcompare
{
    
    public: inline bool operator()(int A, int B)
        {
            /*if(A<B)
            {
                lexicographical_compare(text.begin()+A,text.end(),text.begin()+B,text.end());
                return true;
                    
            }
            else
                return false;
                */

                                
        
        if(strcmp(&text[A],&text[B])==0)
            return (true);
        
        if(strcmp(&text[A],&text[B])==-1)
            return (true);
        
        if(strcmp(&text[A],&text[B])==1)
            return (true);        
        // hier müssen noch die if abfragen hin...
    
        }
        
        suffixcompare()
        {
        }
        

};

void sa(vector<char> &Sa, string p)
{     //Suffarray befüllung
    int m,k;
    vector<int> sufar(Sa.size());
    
    for(m=0; m<Sa.size();++m)
        {sufar.push_back(m);}
    
    suffixcompare testObj;

    sort(sufar.begin(),sufar.end(),testObj);
    cout<<"FAIL";  /* nur zum testen ob er bis hierher kommt oder nicht, wenn ich cout<<"FAIL"; über die sort funktion schreibe, wird dies noch ausgegeben bevor der APPCrash kommt*/
}

int main(int argc, char* argv[])
{
/*in der main gab es noch anderen code, der jedoch nur zum laden der textfile wichtig ist, da dies klappt, denke ich ist dieser code nicht notwendig.*/
    
for(int z=2;z<argc; z++)
        {
    
            sa(text,argv[z]);
        }
  
    
    
    return 0;
}




für einen tipp wär ich euch sehr dankbar, könnte es daran liegen das vecto<char> text; global ist und ich dort auch in der mainfunktion zugreife?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.11.2011, 16:10 Uhr
Lensflare



Hi Auronsen,

strcmp nimmt als parameter zwei null-terminierte strings (zeiger auf kette aus chars, die mit dem null-char endet).
du übergibst aber jeweils einen zeiger auf ein char.

ich weiss nicht was der algo machen soll, aber wenn du nur zwei chars vergleichen willst, dann kannst du statt


C++:
        if(strcmp(&text[A],&text[B])==0)
            return (true);
        
        if(strcmp(&text[A],&text[B])==-1)
            return (true);
        
        if(strcmp(&text[A],&text[B])==1)
            return (true);  



einfach


C++:
        if(text[A] == text[B])
            return (true);
        
        if(text[A] < text[B])
            return (true);
        
        if(text[A] > text[B])
            return (true);  



schreiben.

falls du strings vergleichen willst:
benutze std::string statt std::vector<char> und statt char[].
es crasht möglicherweise deswegen, weil kein null-char gefunden wird. außerdem glaube ich, dass man sich nicht darauf verlassen kann, dass die chars in einem vector<char> genau so nebeneinander im speicher liegen wie bei einem char array.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 09.11.2011 um 16:21 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: