Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Borland C++ bład w programie

dodda19 02 Maj 2010 21:56 1153 8
  • #1 02 Maj 2010 21:56
    dodda19
    Poziom 8  

    Code:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    
    {
    char dw[200];
    for(int i=1;i<=Memo1->GetTextLen();i++)
         dw[i]=(char)Memo1->Lines->Text[i] ;
    char ciag[200];
    for(int j=1;j<=Memo2->GetTextLen();j++)
         ciag[j]=(char)Memo2->Lines->Text[j] ;


    for(int k=1;k<=Memo1->GetTextLen();k++)
    {
            if(ciag[k]=="0")
                    dw[k]=(char)((int)dw[k]+ 65280);

    }
    for( int t=1;t<=Memo1->GetTextLen();t++)
            Memo1->Lines->Text[t]=Memo1->Lines->Text[t]+(AnsiString)dw[t];
    }

    Co tutaj jest źle? ten fragment programu ma pobierać wartości binarne z Memo2 i w zależności od nich ustawiać poszczególne litery słowa w Memo1. Przykładowo litera "a" ma kod 97 oraz 65345... jeśli pobraną wartością binarną jest 1 to ma zapisać pobraną literę o kodzie 97, jeśli wczytana wartość binarna to 0, to ma zapisać literę o kodzie 65345.


    juz zauwazylam 2 błędy:
    Code:
    if(ciag[k]==0) a nie if(ciag[k]=="0")    oraz
    
    Memo1->Lines->Text[t]=Memo1->Lines->Text[t]+dw[t];


    ale i tak nie działa :-(

    Proszę pamiętać o używaniu znaczników code. - arnoldziq

    0 8
  • #2 03 Maj 2010 21:49
    Dżyszla
    Poziom 42  

    1. czemu tablice znaków mają:
    a. stały rozmiar?
    b. krótszy od możliwego indeksu?
    2. czemu tablica ciąg ma przypisywane wartości z memo2, a następnie jest odczytywana do długości Memo1?
    3. Czemu porównujesz z (int)0? Co tam w tym memo2 jest? O ile mi wiadomo, komponent zasadniczo służy do reprezentacji znaków, a nie wartości binarnych. Że o możliwych załamaniach linii nie wspomnę.
    4. Czemu znakowi (Text[t]) próbujesz przypisać sumę dwóch znaków? Co to ma dawać?

    0
  • #3 03 Maj 2010 23:40
    dodda19
    Poziom 8  

    Stały rozmiar dałam chcąc sprawdzić cały kod (przy uruchamianiu programu wczytywałam krótki, na pewno nie 200 znakowy ciąg), w tym momencie nie miało to dla mnie znaczenia (bo nawet dla takiego nie działa)....w Memo2 mam ciąg binarny który muszę ukryć w Memo1. Robię to w ten sposób, że jeśli w memo2 napotkam na "1" to zamieniam literę w Memo1 na tą samą ale o innym kodzie ASCII

    0
  • #4 04 Maj 2010 06:19
    Dżyszla
    Poziom 42  

    To radzę:
    1. ciąg-klucz szyfrujący zapisywać jednak albo wprost w tablicy znaków, albo w zmiennej typu string. Memo może wprowadzać modyfikacje!
    2. Zupełnie nie rozumiem tego dodawania. Moim zdaniem powinno być coś na kształt

    Code:
    wynik[i]=zrodlo[i]; if (klucz[i]) wynik[i]+=65245

    3. A pracujesz w której wersji środowiska, a ściślej - czy tam typ char jest na pewno de facto typem widechar czyli dwubajtowym? Jeśli nie, to możesz zapisać co najwyżej wartość z przedziału 0-255, czyli bez Unicode. Chyba bezpieczniej byłoby pracować na tablicy typu Word (czyli dwubajtowa bez znaku) i przy wyświetlaniu (do komponentu obsługującego unicode!) dokonywać odpowiedniego rzutowania/konwersji (zwróć uwagę, że o ile dobrze pamiętam, w C typy znakowe to liczby ze znakiem).

    0
  • #5 05 Maj 2010 11:34
    dodda19
    Poziom 8  

    Witam:-) mam pytanie- czy w Borland C++ jest jakaś funkcja zamieniająca wartości dziesiętne na binarne i odwrotnie??takie coś jak DecToBen ???

    0
  • #7 06 Maj 2010 14:14
    dodda19
    Poziom 8  

    Miałeś rację, trzeba było użyć typu Word...dziękuję bardzo bardzo:-)

    Dodano po 1 [godziny] 12 [minuty]:

    Pojawia się kolejny problem. Jak mam zrzutować tą tablicę aby wyświetlały mi się litery... rzutowanie na char doprowadzi mnie do punktu wyjścia.

    0
  • #9 07 Maj 2010 11:34
    dodda19
    Poziom 8  

    Code:
    Word d[200];
    
    for(int i=1;i<=kontener->GetTextLen();i++)
         d[i]=kontener->Lines->Text[i] ;

    char ciag[200];
    for(int j=1;j<=ciagbinarny->GetTextLen();j++)
         ciag[j]=ciagbinarny->Lines->Text[j] ;

    for(int k=1;k<=ciagbinarny->GetTextLen();k++)
    {
            if(ciag[k]=='1')
                   
                    d[k]+=65280;

    }

    for( int t=1;t<=kontener->GetTextLen();t++)
            Memo1->Lines->Text=Memo1->Lines->Text+d[t];
    W ten sposób wyświetla mi w Memo nie litery ale ich wartości dziesiętne

    0