raVVal Opublikowano 13 Kwietnia 2012 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:
PsichiX Opublikowano 13 Kwietnia 2012 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.
raVVal Opublikowano 13 Kwietnia 2012 Autor Opublikowano 13 Kwietnia 2012 A więc jakbym mógł rozwiązać ten problem? E: <string> włączyłem do nagłówka.
ediepl Opublikowano 13 Kwietnia 2012 Opublikowano 13 Kwietnia 2012 Użyć dynamicznej alokacji, czyli new.
raVVal Opublikowano 13 Kwietnia 2012 Autor 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:
PsichiX Opublikowano 13 Kwietnia 2012 Opublikowano 13 Kwietnia 2012 int c = 10; int* a = new int[c]; a[0] = 5; delete[] a; a = nullptr;
raVVal Opublikowano 13 Kwietnia 2012 Autor Opublikowano 13 Kwietnia 2012 a w moim przypadku to by wyglądało: ...
PsichiX Opublikowano 13 Kwietnia 2012 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ą.
ediepl Opublikowano 13 Kwietnia 2012 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.
raVVal Opublikowano 13 Kwietnia 2012 Autor 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(); }
raVVal Opublikowano 13 Kwietnia 2012 Autor Opublikowano 13 Kwietnia 2012 Sorry, że tak pytam i pytam ale te błędy to jakieś głupoty czepia się <=.
raVVal Opublikowano 13 Kwietnia 2012 Autor Opublikowano 13 Kwietnia 2012 Likwiduję błędy. Jeszcze tylko : error C2061: syntax error : identifier 'std' i te z <=
ediepl Opublikowano 13 Kwietnia 2012 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.
raVVal Opublikowano 13 Kwietnia 2012 Autor Opublikowano 13 Kwietnia 2012 Uruchomiłem aplikacje, ale gdy podałem stringa to jakiś error wywaliło. :(
raVVal Opublikowano 13 Kwietnia 2012 Autor 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ć)
raVVal Opublikowano 13 Kwietnia 2012 Autor 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; }
ediepl Opublikowano 13 Kwietnia 2012 Opublikowano 13 Kwietnia 2012 Po pierwszę nie ma tego w kodzie, po drugie jaki błąd?
raVVal Opublikowano 13 Kwietnia 2012 Autor 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
ediepl Opublikowano 13 Kwietnia 2012 Opublikowano 13 Kwietnia 2012 ... Daj screena jak nie umiesz przepisać błędu.
raVVal Opublikowano 13 Kwietnia 2012 Autor Opublikowano 13 Kwietnia 2012 "unhandled exception at 0x5fb1766d in j.exe: 0xC0000005: Access violation writing location 0xabababab" mówi ci to coś?
Will Opublikowano 13 Kwietnia 2012 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.
ediepl Opublikowano 13 Kwietnia 2012 Opublikowano 13 Kwietnia 2012 I gdy stosujesz dynamiszną alokację musisz zwolnić pamięć.
raVVal Opublikowano 13 Kwietnia 2012 Autor Opublikowano 13 Kwietnia 2012 W którym momencie mam zwolnić pamięć? Na końcu funkcji?
ediepl Opublikowano 13 Kwietnia 2012 Opublikowano 13 Kwietnia 2012 Przed return. Żeby zwolnić tablicę delete I[];
raVVal Opublikowano 13 Kwietnia 2012 Autor 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];
Will Opublikowano 13 Kwietnia 2012 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 <=.
raVVal Opublikowano 13 Kwietnia 2012 Autor 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.
Will Opublikowano 13 Kwietnia 2012 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.
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ę