[C/C++] Source verbessern - Anfänger

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von asdrexit, 4. Oktober 2007 .

  1. 4. Oktober 2007
    Source verbessern - Anfänger

    Ich probiere grade ein bisschen c++ programmierung und habe zum Testen ein Tool geschrieben, was eine Datei in Hexadezimal und dem Ascii-Zeichen des jeweilgen Bytes anzeigt. So weit so gut, hab ich das auch hinbekommen wie ich mir das vorgestellt habe, nur braucht das ganze eine Ewigkeit, obwohl die Datei keine 1000 bytes groß ist. Zur Fortschrittsanzeige hab ich eine CProgressCtrl eingebaut, aber bekomme das Teil nicht neu gezeichnet.
    Bin in c++ ein blutiger Anfänger. Progge normalerweise in Delphi und habs versucht auf c++ zu übertragen nur kann ich die Sprache eig. garnicht weshalb manche sachen ziemlich noob-like sind ^^ Hoffe ihr könnt mir unter die Arme greifen.

    (Arbeite mit Visual Studio 6 un der MFC)

    Hier der Code:

    Code:
    char *StrToHexStr(char *str) // Die Funktion hab ich aus dem Netz
    {
     char *newstr = new char[(strlen(str)*2)+1];
     char *cpold = str;
     char *cpnew = newstr;
    
     while('\0' != *cpold) {
     sprintf(cpnew, "%02X", (char)(*cpold++));
     cpnew+=2;
     }
    
     *(cpnew) = '\0';
     return(newstr);
    } 
    
    void CTestDlg::OnButton1()
    {
     CFile *file = new CFile;
     char C[1];
     unsigned int iPos;
     int linepos = 0;
     char linetext[15];
    
     m_DATA += "Datei: test.txt\r\n---------------------\r\n";
     
     file->Open(".\\test.txt", 0);
     m_Progress.SetRange(0, 100);
     UpdateData(FALSE);
     while (file->GetPosition() < file->GetLength()) 
     {
     file->Read(C, 1);
     m_DATA += StrToHexStr(C)[0];
     m_DATA += StrToHexStr(C)[1];
     m_DATA += " ";
     
     if (C[0] == char(13))
     linetext[linepos] = char(".");
     else linetext[linepos] = C[0];
    
     linepos++;
     if (linepos == 15) {
     linepos = 0;
     m_DATA += " ; ";
     m_DATA += linetext;
     m_DATA += "\r\n";
     }
    
     iPos = (file->GetPosition() / file->GetLength()) *100;
     m_Progress.SetPos(iPos);
     UpdateData(FALSE);
     m_Progress.Invalidate();
     Sleep(10);
     }
    
     UpdateData(FALSE);
     delete file;
    }
    
    Das ist die Ausgabe von dem Ganzen (Ist auch alles richtig):
    Code:
    Datei: test.txt
    ---------------------
    3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D ; ===============Ì
    3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D ; ===============Ì
    3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D ; ===============Ì
    3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D ; ===============Ì
    3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 0D 0A 20 ; ============
     Ì
    20 20 20 20 20 20 4D 49 43 52 4F 53 4F 46 54 ; MICROSOFTÌ
    20 46 4F 55 4E 44 41 54 49 4F 4E 20 43 4C 41 ; FOUNDATION CLAÌ
    53 53 20 42 49 42 4C 49 4F 54 48 45 4B 20 3A ; SS BIBLIOTHEK :Ì
    20 54 65 73 74 0D 0A 3D 3D 3D 3D 3D 3D 3D 3D ; Test
    ========Ì
    3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D ; ===============Ì
    3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D ; ===============Ì
    3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D ; ===============Ì
    3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D ; ===============Ì
    3D 3D 3D 3D 0D 0A 0D 0A 0D 0A 44 69 65 73 65 ; ====
    
    
    DieseÌ
    20 54 65 73 74 2D 41 6E 77 65 6E 64 75 6E 67 ; Test-AnwendungÌ
    20 68 61 74 20 64 65 72 20 4B 6C 61 73 73 65 ; hat der KlasseÌ
    6E 2D 41 73 73 69 73 74 65 6E 74 20 66 FF 72 ; n-Assistent fürÌ
    20 53 69 65 20 65 72 73 74 65 6C 6C 74 2E 20 ; Sie erstellt. Ì
    44 69 65 73 65 20 41 6E 77 65 6E 64 75 6E 67 ; Diese AnwendungÌ
    0D 0A 7A 65 69 67 74 20 6E 69 63 68 74 20 6E ; 
    zeigt nicht nÌ
    75 72 20 64 69 65 20 70 72 69 6E 7A 69 70 69 ; ur die prinzipiÌ
    65 6C 6C 65 20 56 65 72 77 65 6E 64 75 6E 67 ; elle VerwendungÌ
    20 64 65 72 20 4D 69 63 72 6F 73 6F 66 74 20 ; der Microsoft Ì
    46 6F 75 6E 64 61 74 69 6F 6E 20 43 6C 61 73 ; Foundation ClasÌ
    73 65 73 2C 20 0D 0A 73 6F 6E 64 65 72 6E 20 ; ses, 
    sondern Ì
    64 69 65 6E 74 20 61 75 63 68 20 61 6C 73 20 ; dient auch als Ì
    41 75 73 67 61 6E 67 73 70 75 6E 6B 74 20 66 ; Ausgangspunkt fÌ
    FF 72 20 64 69 65 20 45 72 73 74 65 6C 6C 75 ; ür die ErstelluÌ
    6E 67 20 49 68 72 65 72 20 65 69 67 65 6E 65 ; ng Ihrer eigeneÌ
    6E 20 44 4C 4C 73 2E 0D 0A 0D 0A 44 69 65 73 ; n DLLs.
    
    DiesÌ
    65 20 44 61 74 65 69 20 65 6E 74 68 FF 6C 74 ; e Datei enthältÌ
    20 64 69 65 20 5A 75 73 61 6D 6D 65 6E 66 61 ; die ZusammenfaÌ
    73 73 75 6E 67 20 64 65 72 20 42 65 73 74 61 ; ssung der BestaÌ
    6E 64 74 65 69 6C 65 20 61 6C 6C 65 72 20 44 ; ndteile aller DÌ
    61 74 65 69 65 6E 2C 20 64 69 65 20 0D 0A 49 ; ateien, die 
    IÌ
    68 72 65 20 54 65 73 74 2D 41 6E 77 65 6E 64 ; hre Test-AnwendÌ
    75 6E 67 20 62 69 6C 64 65 6E 2E 
    
     
  2. 4. Oktober 2007
    AW: Source verbessern - Anfänger

    Code:
    Sleep(10);
    Bei 1000 Byte werden schon unsinnigerweiße über 10 sek verschwendet.

    Code:
    m_DATA += StrToHexStr(C)[0];
    m_DATA += StrToHexStr(C)[1];
    Die Funktion wird 2mal aufgerufen... wieso?

    Ansonsten find ich erstmal nichts unsinniges ^^

    mfg r90
     
  3. 4. Oktober 2007
    AW: Source verbessern - Anfänger

    Das sleep hab ich jetzt garnicht mit eingerechnet ^^ Hatte das reingesetzt um den Processor zu schonen der an seine Leistungsgrenze getrieben wurde. Aber ich hätte es mir eig auch denken können, dass es an dem aktualisieren des ProgressCtrls liegt ... Hab ne Abfrage reingebaut, dass der sich nur neu zeichnen soll, wenn sich der Wert auch wirklich geändert hat.

    Der Source sieht jetzt so aus:
    Code:
    iPos = (file->GetPosition() / file->GetLength()) *100;
    if (iPos > m_Progress.GetPos()) {
     m_Progress.SetPos(iPos);
     UpdateData(FALSE);
     m_Progress.Invalidate();
    }
    
    Dann wär das Problem schonmal behoben. Thx schonmal.

    Ich übergeb ja beide male einen anderen Parameter.

    Aber wie bekomm ich das hin, dass sich das CProgressCtrls neu zeichnet ?
     
  4. 4. Oktober 2007
    AW: Source verbessern - Anfänger

    Nein, du übergibst zweimal den gleichen Parameter ("C").
    Effizienter wäre statt:
    Code:
    m_DATA += StrToHexStr(C)[0];
    m_DATA += StrToHexStr(C)[1];
    das hier:
    Code:
    char * m_TMP = StrToHexStr(C);
    m_DATA += m_TMP[0];
    m_DATA += m_TMP[1];
    Keine Ahnung, ich benutze nicht den Borland Builder (oder isses MFC?).

    mfg r90
     
  5. 4. Oktober 2007
    AW: Source verbessern - Anfänger

    Kay, ich änder das um.

    Jop, ich benutz die MFC mit dem Visual Studio 6

    Hab das ganze btw mal mit na 25k Datei getestet.. brauch dann schon ne weile.
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.