Skocz do zawartości
wojtek4994

Problem Z Memo...

Rekomendowane odpowiedzi

Witam! Potrzebuję taką pętlę (właściwie dwie pętle :P), która będzie przebiegała kolejno po wszystkich znakach w Memo. Napisałem na razie coś takiego (Memo, po którym "przebiegają" pętle nazywa się w tym przykładzie inputMemo):

 

for(int i=0; i<inputMemo->Lines->Count; i++)	for(int j=0; j<inputMemo->Lines->operator [](i).Length(); j++)	{		for(int k=0; k<113; k++)		{						  // INSTRUKCJE DOKONYWANE NA KAŻDYM ZNAKU		}	}

O dziwo powyższy kod z pustymi pętlami kompiluje się dobrze i przy wykonywaniu nie powoduje żadnych błędów (ale też nie ma żadnych widocznych efektów :D). Problem w tym, że kiedy umieszczę w nim warunek pojawia się błąd w rtl100.bpl (dopiero przy wykonaniu, kompilacja przebiega bez żadnych errorów i warnów) związany z pamięcią, chodzi o przekroczenie jakiegoś zakresu. Wygląda na to, ze problem jest z tym warunkiem...

 

for(int i=0; i<inputMemo->Lines->Count; i++)	for(int j=0; j<inputMemo->Lines->operator [](i).Length(); j++)	{		for(int k=0; k<113; k++)		{			if (znaki[k]==inputMemo->Lines->operator [](i).operator [](j))			{				// INSTRUKCJE			}		}	}

Dodam, że mam w kodzie także tablicę typu char o nazwie znaki o 113 elementach (0..112)...

 

Widzi ktoś tu błąd? Może jest jakieś prostsze rozwiązanie... Z góry dzięki za pomoc i pozdro!

Edytowane przez wojtek4994

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

mi się wydaje, że indeksując Lines za pomoca 2 indeksów wyskakujesz poza zakres bo tak nie można indeksować, mimo że na logikę byłoby to poprawnie. Kompilator interpretuje to prawdopodobnie nie jako znak j-ty linii i-tej, tylko jako i*Length+j linia bądź znak.. na styl deklaracji w pamięci tablic dwuwymiarowych. Po prostu nie rozumie że [j] tyczy się litery a linii i traktuje to chyba jako złożony indeks dla linii...

 

Przypisz w każdej iteracji linię jako AnsiStringa... i wtedy poleć po każdym jego znaku.... będziesz miał pojedynczy indeks tylko i być może zadziała...

Edytowane przez PelzaK

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Niestety :mur: nie działa... to chyba ma związek ze znakami nie z liniami... Po wyskoczeniu wyjątku klikam Break i wyskakuje mi plik dstring.h z zaznaczoną linią 150:

 

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

Obecnie kod wygląda tak i jak już wspomniałem generuje te same błędy:

 

AnsiString linia;for(int i=0; i<inputMemo->Lines->Count; i++){	linia=inputMemo->Lines->operator [](i);	for(int j=0; j<linia.Length(); j++)	{		for(int k=0; k<113; k++)		{			if (znaki[k]==linia[j])			{				// INSTRUKCJE			}		}	}}

Przy okazji: dziwi mnie, że konstrukcja Memo->Lines[index] się nie kompiluje, podobnie jak Memo->Lines->operator[](index).[index_znaku], a w przypadku normalnej zmiennej AnsiString działa normalnie: zmienna[index_znaku]. Pamiętam, że w Delphi takie coś zawsze działało...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

w moim builderze takie coś zawsze działa :D.. nie wiem czemu u Ciebie nie :)

 

wimho bezpieczniej jest umieszzczać deklarację AnsiString linia; wewnątrz bloku for w którym jest użyta.. Mimo iż zajmuje to więcej czasu (stworzenie i usunięcie zmiennej przy każdej iteracji) to jest bezpieczniejsze gdyż w każdej iteracji masz tą zmienną inicjowaną od nowa... masz pewność że nie będzie tam śmieci z poprzedniej iteracji.

 

I nie rozumiem po co jest ta pętla do 112... Skoro wyżej iterujesz po każdym znaku stringa to ta petla najbardziej zagnieżdzona przypisuje wszystkim elementom tablicy znaki tą samą literę... line[0], potem line[1]....

 

Spróbuj zamiast tablicy znaki[] użyć

vector<char> znaki;

albo

vector<AnsiString> znaki;

 

dużo bezpieczniejsze i wygodniejsze w użyciu... choćby dlatego że masz dowolny rozmiar. Wektor to jest mniejwiecej to samo co tablica, tylko że jest to klasa kontenera przechowująca dowolną ilość obiektów dowolnego typu. Wpisz w gogle STL VECTOR i poczytaj o co chodzi.

 

 

Poza tym w TMemo jest atrybut TEXT, który chyba przechowuje cały text wpisany w memo... więc można pobrać ten text i przelecieć tlyko po jego literkach... :)

Edytowane przez PelzaK

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Już wiem w czym jest problem :D (tylko nie wiem jak go rozwiązać :mur: ).

 

Chodzi o to ze ten operator [], któremu podaje np. indeks interesującego mnie znaku w AnsiString przyjmuje wartości const. Sprawdziłem to: jak wpisze np. 2 to działa a jak już nazwę zmiennej to nie :(. Nie wiesz moze jak to rozwiązać? Jak to obejść żeby powyższy kod działał?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie chodzi o to... podając 2 podajesz prawidłowy indeks.. a spróbuj polecieć sobie krokowo po tej pętli to zobaczysz że ona się sypie dopiero po którejś iteracji... Pętle trzeba umieć debugować :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Problem rozwiązany :D. Najgorsze jest to, że próbowałem już tego rozwiązania i nie działało a teraz działa :P

 

Wystarczyło zmienić indeksowanie znaków tak, aby indeksy zaczynały się od 1 a nie od 0. I teraz wygląda na to, że działa dobrze.

 

Ale mam jeszcze jeden problem/pytanie: jak wypełnić Memo za pomocą pojedynczych znaków? Bo konstrukcje typu Memo->Text[index]='znak' lub Memo->Lines->operator [] (index).operator [] (index_znaku)='znak' nie działają :sad:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No fakt to ostatnie pytanie było trochę głupie :D zrobiłem roboczego stringa którego budowałem znak po znaku i wtedy tylko Memo->Lines->Add(string) i gra :D

 

Teraz wszystko związane z Memo działa ale za to co innego nie chce :lol2: :lol2:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...