[C++] Problem z odwróceniem ciągu znaków w AnsiString

Witam

Piszę sobie programik który ma zamieniać systemy liczbowe. Mój “komplikator” to Borland C++ Builder 6 edycja Personal. System WIN XP SP3 Wszystko szło stosunkowo gładko, lecz poległem na głupim odwróceniu ciągu znaków. Oto problematyczny fragment kodu:

int dlug;

dlug=temp.Length();

for (int a=0;a!=dlug;a++)

        {

        wynik2[a]=temp[dlug-a];

        }

gdzie wynik2 jest zmienną typu AnsiString, tak samo jak temp. Wszystko wydaje się proste, program nawet się kompiluje, lecz przy wykonaniu powyższego fragmentu wywala mi messageboxem : “Project Project1.exe raised exception class ERangeError with message ‘’. Process stopped. Use step or Run to continue.” Po kliknięciu “OK” przenosi mnie do pliku “dstring.h” i podświetla linijkę zaznaczoną strzałką.

char& __fastcall operator [](const int idx)

    {

--> ThrowIfOutOfRange(idx); // Should Range-checking be optional to avoid overhead ??

      Unique(); // Ensure we're not ref-counted

      return Data[idx-1];

    }

Gdy ją za komentuję podczas wykonywania programu wywala mi komunikat "Project “Project1.exe raised exception class EAccessViolation with message ‘ACCESS violation at adress 004019bc in module ‘Project1.exe’. Write of adress FFFFFFFF’. Process stopped. Use Step or Run to continue.”. Podświetla mi wtedy linijkę w programie

int dlug;

dlug=temp.Length();

for (int a=0;a!=dlug;a++)

        {

 --> wynik2[a]=temp[dlug-a];

        }

Gdyby był potrzebny to podaję cały kod programu (domyślam się że trochę namieszałem :? )

#include 

#pragma hdrstop


#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

}

//---------------------------------------------------------------------------

char ltz (int a)

{

switch (a)

{

 case 0: return '0';break;

 case 1: return '1';break;

 case 2: return '2';break;

 case 3: return '3';break;

 case 4: return '4';break;

 case 5: return '5';break;

 case 6: return '6';break;

 case 7: return '7';break;

 case 8: return '8';break;

 case 9: return '9';break;

 case 10: return 'A';break;

 case 11: return 'B';break;

 case 12: return 'C';break;

 case 13: return 'D';break;

 case 14: return 'E';break;

 case 15: return 'F';break;

}}




AnsiString inttox (int liczba, int system)

{


char wynik[100];

AnsiString wynik2;

int licznik=0;

while (liczba!=0)


{

  wynik[licznik]=ltz((liczba%system));

  liczba=liczba/system;

  licznik++;

}

wynik[licznik]=NULL;

AnsiString temp=wynik;



int dlug;

dlug=temp.Length();

for (int a=0;a!=dlug;a++)

        {

        wynik2[a]=temp[dlug-a];

        }


Form1->Edit3->Text=wynik2;

}



void __fastcall TForm1::Button1Click(TObject *Sender)

{

int a=StrToInt(Edit1->Text);

int b=StrToInt(Edit2->Text);

inttox(a,b);


}

//---------------------------------------------------------------------------

Tablice indeksuje się od 0 do x, gdzie x to rozmiar tablicy. temp.Length to nic innego jak ilość liter w ciągu znaków. Powinno być:

dlug = temp.Length() - 1;

EDIT:

Racja, nie przepatrzyłem całego kodu, mimo wszystko to IMHO głupota VCL.

Niewiele dało … "Project “Project1.exe raised exception class EAccessViolation with message ‘ACCESS violation at adress 004019bc in module ‘Project1.exe’. Write of adress FFFFFFFF’. Process stopped. Use Step or Run to continue.” i podświetla tą samą linijkę

Nie jestem pewien ale zmienna wynik2 nie została zainicjowana żadną wartością w związku z czym zapis wynik2[a] odwołuje się do nieprzydzielonego obszaru pamięci co powoduje błąd. Sprawdź czy zadziała jeśli przed zamianą znaków przypiszesz zmiennej wynik2 wartość temp aby oba łańcuchy miały tą samą długość.

Pomogło, program działa, jednak dalej wyświetla mi odwrócony wynik :shock:

// edit. Już sobie poradziłem. Zamiast bawić się AnsiString zastosowałem char i pomogło

… tak na marginesie… i na przyszłość… (char to jest jednak zawsze “pewniejszy”)

AnsiString indeksuje się od 1, a nie od 0, gdy odnosi się do niego poprzez operator []. Jest to częsty błąd (sam regularnie o tym zapominam).Tak więc pierszy kod, po niewielkiem modyfikacji powinien zadziałać.

Szkoda że tego nie napisałeś wczoraj … musiałem zrobić jeszcze funkcję odwrotną (z dowolnego systemu na dziesiętny), i zmarnowałem z godzinę dochodząc czego to nie działa :slight_smile: