wojtek4994 Opublikowano 3 Lipca 2006 Zgłoś Opublikowano 3 Lipca 2006 (edytowane) 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 3 Lipca 2006 przez wojtek4994 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 3 Lipca 2006 Zgłoś Opublikowano 3 Lipca 2006 (edytowane) 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 3 Lipca 2006 przez PelzaK Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
wojtek4994 Opublikowano 4 Lipca 2006 Zgłoś Opublikowano 4 Lipca 2006 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... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 5 Lipca 2006 Zgłoś Opublikowano 5 Lipca 2006 (edytowane) 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 5 Lipca 2006 przez PelzaK Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
wojtek4994 Opublikowano 5 Lipca 2006 Zgłoś Opublikowano 5 Lipca 2006 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ł? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 5 Lipca 2006 Zgłoś Opublikowano 5 Lipca 2006 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ć :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
wojtek4994 Opublikowano 6 Lipca 2006 Zgłoś Opublikowano 6 Lipca 2006 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: Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 6 Lipca 2006 Zgłoś Opublikowano 6 Lipca 2006 co znaczy za pomoca pojedynczych znaków... zrób stringa jakiego sobie chcesz i dodaj ile chcesz razy. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
wojtek4994 Opublikowano 7 Lipca 2006 Zgłoś Opublikowano 7 Lipca 2006 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: Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...