raVVal Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 Mam problem, mianowicie: std::string translateLC(std::string a, std::string code) { // Przygotowanie klucza. std::string bufor; std::string I[(code.size())/2]; std::string II[(code.size())/2]; for (int i = 0; i <= code.size()/2; i += 2) { I[i] = a[i]; II[i+1] = a[i+1]; } // Zamiana znak po znaku. for (int i=0; i <= a.size(); i+=1) { bufor = a[i]; for (int l=0; l <= code.size()/2; i++) { if (bufor == I[l]) { a.erase(l, 1); a.insert(l, II[l]); break; } else if (bufor == II[l]) { a.erase(l, 1); a.insert(l, I[l]); break; } } return a; } Oto kod mojej funkcji która ma tłumaczyć napis(a) według podanego kodu(code). Niestety kompilator zasypuje mnie błędami: 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(10) : error C2061: syntax error : identifier 'std' 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(22) : error C2057: expected constant expression 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(22) : error C2466: cannot allocate an array of constant size 0 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(22) : error C2133: 'I' : unknown size 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(23) : error C2057: expected constant expression 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(23) : error C2466: cannot allocate an array of constant size 0 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(23) : error C2133: 'II' : unknown size 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(24) : warning C4018: '<=' : signed/unsigned mismatch 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(30) : warning C4018: '<=' : signed/unsigned mismatch 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(33) : warning C4018: '<=' : signed/unsigned mismatch 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\main.cpp(8) : error C2601: 'main' : local function definitions are illegal 1> c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(19): this line contains a '{' which has not yet been matched 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\main.cpp(16) : fatal error C1075: end of file found before the left brace '{' at 'c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(19)' was matched Tak dla ścisłości to kod wygląda tak: std::string GDstd = "GADERYPOLUKIÓŁgaderypolukiół"; Mam nadzieję, że ktoś mi pomoże, Z góry wielkie dzięki! :thumbsup: Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 1. #include <string> 2. niedynamiczne tablice muszą mieć rozmiar znany kompilatorowi. nie możesz tam dac zmiennej, która nie byłaby z modyfikatorem const. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 A więc jakbym mógł rozwiązać ten problem? E: <string> włączyłem do nagłówka. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 Użyć dynamicznej alokacji, czyli new. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 Użyć dynamicznej alokacji, czyli new. Heh... jakiś przykładzik?? New mi się obiło u uszy, ale nie miałem okazji skorzystać. :rolleyes: Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 int c = 10; int* a = new int[c]; a[0] = 5; delete[] a; a = nullptr; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 a w moim przypadku to by wyglądało: ... Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 string* i = new string[wielkosc] Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 a w moim przypadku to by wyglądało: ... kolejny niemyślący logicznie "programista"? googluj w takim razie tutorial jak używać tablic dynamicznych - nijak się to nie różni od statycznych, jedynie alokacją i dealokacją. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 yxe +1 Pytając o gotowe rozwiąznie niczego się nie nauczysz, a jak czegoś poszukasz to już prędzej, tak jak podczas robienia ściąg. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 Dzięki, to zlikwidowało troche błędów ale jeszcze zostały: 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(10) : error C2061: syntax error : identifier 'std' 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(24) : warning C4018: '<=' : signed/unsigned mismatch 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(30) : warning C4018: '<=' : signed/unsigned mismatch 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(33) : warning C4018: '<=' : signed/unsigned mismatch 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\main.cpp(6) : error C2601: 'main' : local function definitions are illegal 1> c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(19): this line contains a '{' which has not yet been matched 1>c:\users\rafał\documents\visual studio 2008\projects\j\j\main.cpp(12) : fatal error C1075: end of file found before the left brace '{' at 'c:\users\rafał\documents\visual studio 2008\projects\j\j\lc.h(19)' was matched Pokażę może jeszcze main: #include <iostream> #include <conio.h> #include "LC.h" int main() { std::string napis; std::cin>>napis; std::cout<<translateLC(napis, GDstd)<<std::endl; getch(); } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 Sorry, że tak pytam i pytam ale te błędy to jakieś głupoty czepia się <=. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 Likwiduję błędy. Jeszcze tylko : error C2061: syntax error : identifier 'std' i te z <= Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 Main powinno być void jeśli nie zwraca funkcji, brakuje jednej klamry zamykającej w lc.h, nadal nie widzę include string, na razie tyle bo czytam to na małym ekraniku od fona. EDIT te <= to zapewne i jest signed a a.size unsigned, zamień i na unsigned i po problemie, jak byś nie wiedział jak to przed int dajesz unsigned. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 Uruchomiłem aplikacje, ale gdy podałem stringa to jakiś error wywaliło. :( Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 To ja ci daję jakąś odpowiedź... Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 Zatrzymuje się na: GML I = code; ( sorry że to nie tak jak napisałem w temacie ale właśnie zauważyłem że to tak powinno być) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 Teraz wszystko wygląda tak. LC.h #include <string> const std::string GDstd = "GADERYPOLUKIÓŁgaderypolukiół"; std::string translateLC(std::string a, std::string code); std::string translateLC(std::string a, std::string code) { // Przygotowanie klucza. std::string bufor; std::string * I = new std::string[(code.size())/2]; std::string * II = new std::string[(code.size())/2]; for (unsigned int i = 0; i <= code.size()/2; i += 2) { I[i] = code[i]; II[i+1] = code[i+1]; } // Zamiana znak po znaku. for (unsigned int i=0; i <= a.size(); i+=1) { bufor = a[i]; for (unsigned int l=0; l <= code.size()/2; i++) { if (bufor == I[l]) { a.erase(l, 1); a.insert(l, II[l]); break; } else if (bufor == II[l]) { a.erase(l, 1); a.insert(l, I[l]); break; } } } return a; } main.cpp #include <iostream> #include <conio.h> #include "LC.h" int main() { std::string napis; std::cin>>napis; std::cout<<translateLC(napis, GDstd)<<std::endl; getch(); return 0; } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 Po pierwszę nie ma tego w kodzie, po drugie jaki błąd? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 Po pierwszę nie ma tego w kodzie, po drugie jaki błąd? Podałem jak teraz wygląda. a błąd to taki w messagebox'ie po wpisani słowa do przetłumaczenia róne napisy i dziwne liczby coś unhandled exception Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 ... Daj screena jak nie umiesz przepisać błędu. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 "unhandled exception at 0x5fb1766d in j.exe: 0xC0000005: Access violation writing location 0xabababab" mówi ci to coś? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Will Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 for (unsigned int i=0; i <= a.size(); i+=1) na for (unsigned int i=0; i < a.size(); i+=1) edit: w przypadku drugiej wewnętrznej pętli to samo + zwolnij pamięć ze sterty. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 I gdy stosujesz dynamiszną alokację musisz zwolnić pamięć. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 W którym momencie mam zwolnić pamięć? Na końcu funkcji? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 Przed return. Żeby zwolnić tablicę delete I[]; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 Właśnie tak zrobiłem dalej ten błąd. A i dla jasności to nie błąd który pojawia się w kompilatorze tylko podczas działania programu. Dokładniej kiedy wpiszę to co ma przetłumaczyć czyli praktycznie w momencie uruchomienia funkcji. Zatrzymuje się na I[i] = code[i]; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Will Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 Zasadniczo to przy użyciu wbudowanego typu std::string nie powinno się korzystać z alokacji na stercie jako, że klasa stringa sama zajmuje się pamięcią. użycie klasy string: string str; str.resize(x); str[x]='a'; itd... W twoim przypadku jeśli chcesz zostać przy swoim rozwiązaniu zwolnij pamięć przed słowem kluczowym 'return'. Kolejna sprawa to parametry. Obiekty powinno przesyłać się jako referencje '&' lub wskaźniki. Inaczej leci nam mila i kosztowna operacja kopiowania. edit: Zatrzymuje się ponieważ znowu maziasz po pamięci: for (unsigned int i = 0; i <= code.size()/2; i += 2) na for (unsigned int i = 0; i < code.size()/2; i += 2) string.size() daje wielkość tablicy ale przecież indeksujesz od zera a nie od jedynki czyli < a nie <=. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
raVVal Opublikowano 13 Kwietnia 2012 Autor Udostępnij Opublikowano 13 Kwietnia 2012 Rzeczywiście nie pojawia się błąd, niestety nie pojawia się również nic innego aplikacja nic nie robi zawiesza się jakby. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Will Opublikowano 13 Kwietnia 2012 Udostępnij Opublikowano 13 Kwietnia 2012 Kod trzeba sprawdzić: for (int l=0; l <= code.size()/2; i++) bawisz się l a inkrementujesz i? logiczne, że będzie "latać" w nieskończoność. Trochę skupienia i chwila poświęcona na sprawdzenie kodu zawsze jest wymagana. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się