Zaloguj się, aby obserwować  
Bartuc

Język C / C++ / C# / Java - pytania, problemy...

1979 postów w tym temacie

Słyszałem od pewnego faceta, że nie ważny jest papierek, pokaż nam co potrafisz.

Na razie czytam wstęp, 40 stron tekstu. Cóż... mam nadzieję, że pójdzie lepiej niż z "Symfonią C++" :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 13.06.2012 o 16:18, Sigu napisał:

Na razie czytam wstęp, 40 stron tekstu. Cóż... mam nadzieję, że pójdzie lepiej niż z "Symfonią C++" :)

Musisz przeboleć do 67, ale to jest konieczne. Potem zacznie się konkret. A od str. 90 pierwsze zadania (bardzo łatwe zresztą).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Próbował ktoś ogarnąć algorytm Postman Sort w C++ bez udziału elementów programowania obiektowego? Znajomy dostał takie oto zadanie od naszego prowadzącego:

Program ma pobierać dane z pliku tekstowego, w każdej linii ma się znajdować nazwisko, ulica, nr bloku, kod pocztowy i miasto poprzedzielane średnikami (więcej niz 30 linii) np:
Kowalski; Jana Pawła II; 63; 61-160; Poznań
Dane te mają zostać posortowane wg. algorytmu postman sort (opis znajduje się na angielskiej wikipedii) , najważniejszym "atrybutem" jest miasto, potem kod (tak działa poczta), potem ulica i nr bloku, względem nazwiska nie sortujemy Wyniki maja być wyświetlone na ekranie Z pliku wczytujemy całe line (funkcja getline: http://www.cplusplus.com/reference/string/getline/ )

Póki co przepisałem każdą linijkę jako osobny element do tablicy stringów, również za pomocą getline chciałem oddzielić kolejne elementy które oddzielone są średnikami, ale coś nie idzie. Ma ktoś jakiś inny pomysł jak zgrabnie to podzielić i posortować?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.06.2012 o 10:38, tykus napisał:

Póki co przepisałem każdą linijkę jako osobny element do tablicy stringów, również za
pomocą getline chciałem oddzielić kolejne elementy które oddzielone są średnikami, ale
coś nie idzie.


A to "coś" to co konkretnie?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.06.2012 o 12:39, rob006 napisał:

A to "coś" to co konkretnie?

W pętli wrzucona następująca komenda getline(table[k], sorted[k][j], '';'');
skutkuje takim wynikiem kompilatora:

postman.cpp:39:42: error: no matching function for call to ‘getline(std::string&, std::string&, char)’

czyli zapewne do końca nie zrozumiałem idei getline. Swoją drogą fajnie że rzucają takimi zadaniami jak nawet nie mieliśmy okazji się zapoznać z klasą string :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.06.2012 o 12:54, tykus napisał:

W pętli wrzucona następująca komenda getline(table[k], sorted[k][j], '';'');


Co to jest sorted[k][j] ? Drugim parametrem powinien być rozmiar ciągu po który funkcja przerywa wczytywanie (czyli w twoim wypady raczej jakaś duża liczba, żeby tego nie przerywało).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Wedle cplusplus.com jak i Grębosza pierwszy parametr to element z którego wczytujemy, drugi to miejsce zapisu a trzeci to znak (char) po którym ma przerwać zapis. Chciałem te dane powrzucać do macierzy[k][j], gdzie k byłoby każdym kolejnym całym adresem, a kolejne parametry j to nazwisko, ulica itp.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.06.2012 o 13:15, tykus napisał:

Wedle cplusplus.com jak i Grębosza pierwszy parametr to element z którego wczytujemy,
drugi to miejsce zapisu a trzeci to znak (char) po którym ma przerwać zapis. Chciałem
te dane powrzucać do macierzy[k][j], gdzie k byłoby każdym kolejnym całym adresem, a
kolejne parametry j to nazwisko, ulica itp.


Bo to inny getline jest, sprawdź ten: http://www.cplusplus.com/reference/iostream/istream/getline/ .
Orłem z C++ nie jestem, ale oba getline''y zwracają istream, czyli po rozbiciu teksu na linie w tablicy masz obiekty iostream, więc musisz na nich operować funkcją którą ja podałem. Chyba... bo to bardziej tak na logikę niż z doświadczenia :P

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam pytanie dotyczące Javy. Kodzę sobie Snake''a i mam swoje okienko dziedziczące po JFrame. Na jego warstwie ContentPane tworzę JSPlitPane i po lewej stronie mam menu a po prawej okno "z grą". I teraz chcialbym, żeby po kliknięciu guzika "Start Game" z menu pojawiało się pole gry z początkowym wężykiem (co się dzieje) i żeby można było nim sterować za pomocą strzałek. I teraz nie bardzo wiem, jak i do czego zaimplementować KeyListenera. Próbowałem różnych kombinacji i nic się nie dzieje. Jedyne co działa to zaimplementowanie KeyListenera do mojej klasy dziedziczącej po JFrame (i wtedy faktycznie obsługa działa), ale w momencie kliknięcia "Start Game" czy czegokolwiek innego przestaje reagować. Czytałem, że ma to coś wspólnego z ustawianiem focus, ale zupełnie nie wiem, jak się do tego zabrać. W momencie kliknięcia "Start Game" mam ustawiać Focusable wszystkich komponentów na false a swojego panelu z grą na true?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 15.07.2012 o 20:12, Erton napisał:

W momencie kliknięcia "Start Game" mam ustawiać Focusable wszystkich komponentów na false
a swojego panelu z grą na true?

requestFocusInWindow()

Focusable powinno być tylko na tych elementach, które faktycznie zawierać powinny obsługę klawiatury. Możesz ewentualnie ustawić obsługę klawiszy w oknie najwyższego poziomu i delegować użycie konkretnych klawiszy do panelu gry.

I poczytaj o tym tu:
http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dziękujęi, zadziałało. Jak czytałem w dokumentacji to jest strasznie dużo opcji i metod dotyczących tego Focusa. Więc w razie czego będzie gdzie szukać.

Kodzę sobie tego Snake''a tak w ramach ćwiczeń, potem mam nadzieję zabrać się za coś internetowego - myślałem nad pokerem przez Internet. Żeby była obsługa myszki (drag,drop itd.), serwer i w ogóle coś bardziej wymyślnego. Póki co wprawiam się (a raczej przypominam to co robiłem w kwietniu, ale wtedy wszystko było robione na aferę, żeby zdążyć oddać, bo inne projekty były do zrobienia), bo teraz chcę naprawdę jakoś trochę pojąć tę Javę. Na praktyki mnie nigdzie nie chcieli (inna sprawa, że nie złożyłem do wystarczającej liczby miejsc aplikacji), więc trzeba siedzieć i samemu się uczyć :(

Dziękuję jeszcze raz.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam jeszcze jedno pytanie, problem właściwie.

Teraz rzecz dotyczy metody paint();
Mam obiekt klasy GameScreen (dziedzicząca po JPanel) a w niej tablicę dwuwymiarową z obiektami klasy GameField, też dziedziczącymi po JPanel (co, jak się domyślam, nie jest najlepszym pomysłem). Tenże gameScreen (obiekt klasy GameScreen) ma ustawiony jako layout GridBagLayout i w pojedynczych "komórkach" mam właśnie obiekty klasy GameField - dodaję je w konstruktorze gameScreen za pomocą:
add(tmpGameField,gridBagConstraints);
I póki co "maluję" mojego wężyka poprzez odpowiednie ustawianie setBackground w paintComponent każdego z tych gameFields (i on sobie tam lata po planszy). A chciałbym wykorzystywać (dla każdego z gameFields) obiekt klasy Graphics celem wykorzystywania obrazków a nie zwykłego kolorowania tłem. I nie bardzo wiem, jak to zrobić. paint() każdego z gameFields jest wywoływany sukcesywnie (bo to wszystko chodzi w jednym wątku i jest odmalowywanie co jakiś czas), ale wywołanie g.drawImage(img,0,0,this) nic nie robi, "działa" tylko setBackground(Color.RED) (a już wyczytałem, że to wynika z cech JPanelu, że ma tło, w przeciwieństwie do JComponent). Czy ja powinienem jeszcze coś robić czy może niepotrzebnie robię rysowanie w każdej "kratce" z osobna i powinienem przekazywać współrzędne do paint() całego gameScreen? Trochę się w tym gubię szczerze powiedziawszy. Próbowałem w paint() obiektu gameScreen wywoływać repaint() po kolei wszystkich gameFields, jednak skutkowało to rzuceniem wyjątku - z tego co zrozumiałem ja za późno tworzę obiekty typu gameFields a paint() jest wywoływany wcześniej.

Pewnie piszę nieco chaotycznie, więc może pokażę, jak to wygląda w kodzie:

public class GameScreen extends JPanel implements KeyListener {
private static final long serialVersionUID = 1L;
public GameScreen() {
setLayout(new GridBagLayout());
gridBagConstraints = new GridBagConstraints();
for(int i=0; i<20;i++) {
for(int j=0;j<20;j++) {
gameFields[j] = new GameField(this);
}
}

for(int i=0; i<20; i++) {
for(int j=0; j<20;j++) {
GameField tmpGameField = gameFields[j];
add(tmpGameField,gridBagConstraints);
}
}
}


Natomiast klasa GameField extends JPanel a jej paintComponent(Graphics g) wygląda tak:
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, null); ->to nie działa w ogóle
setBackground(getColor()); ->to działa poprawnie
}


Zdaję sobie sprawę, że jest tego wszystkiego strasznie dużo, ale będę wdzięczny za jakąkolwiek pomoc.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 17.07.2012 o 18:55, Erton napisał:

Mam obiekt klasy GameScreen (dziedzicząca po JPanel) a w niej tablicę dwuwymiarową z
obiektami klasy GameField, też dziedziczącymi po JPanel (co, jak się domyślam, nie jest
najlepszym pomysłem).

No nie jest. GUI używane do rysowania gry jest ogólnie fatalnym sposobem pisania gier. Używanie skomplikowanych obiektów JPanel czy JComponent tylko po to, żeby wyrysować szachownicę z polami złożonymi z obrazków jest jak strzelanie do muchy za pomocą armaty załadowanej piankami. :)
To przecież nie jest nic trudnego podzielić sobie współrzędne x i y powierzchni roboczej ekranu/panela na a i b części, a następnie odrysowywać pojedynczy prostokąt lub kwadrat (zależnie od sposobu podziału) czy to za pomocą drawRect czy drawImage. Jedyne czego powinieneś wymagać od GUI, to tylko to aby w regularnych odstępach czasu wywoływał jakąś metodę aktualizującą stan gry oraz paint tego ekranu/panela. To robisz za pomocą dowolnego timera, a w wersji profesjonalnej czegoś co nazywa się active rendering (do wygooglania i poczytania).

I jeszcze na marginesie dodam, że ostatni argument drawImage służący do obserwowania postępu malowania obrazka powinien być null. Ten parametr stosuje się tylko w przeglądarkach do aktualizacji renderowania obrazków wczytywanych w z sieci (czasem widzisz to jako wypełniane od góry obrazy). Użycie go spowalnia nieco renderowania, poza tym, że nie ma w tej sytuacji sensu.

Dnia 17.07.2012 o 18:55, Erton napisał:

I póki co "maluję" mojego wężyka poprzez odpowiednie ustawianie setBackground w paintComponent
każdego z tych gameFields (i on sobie tam lata po planszy). A chciałbym wykorzystywać
(dla każdego z gameFields) obiekt klasy Graphics celem wykorzystywania obrazków a nie
zwykłego kolorowania tłem.

Prawdę mówiąc możesz sobie wypełniać tło każdego z tych gameFields przez dowolny obrazek za pośrednictwem ich własnych paint czy paintComponent, ale to jak już napisałem strzelanie z armaty do muchy. GridLayout o tyle ułatwia i skraca kod, że sam oblicza właściwe współrzędne dla poszczególnych kratek, więc jest kilka linijek kodu z obliczeniami mniej do napisania i to tyle jeżeli chodzi o zalety. Inną cechą jest to, że zasłonięcie i odsłonięcie takiej szachownicy paneli powoduje automatyczne odrysowanie tylko tych paneli, które były zakryte, co może być zarówno zaletą jak i wadą.

Dnia 17.07.2012 o 18:55, Erton napisał:

I nie bardzo wiem, jak to zrobić. paint() każdego z gameFields
jest wywoływany sukcesywnie (bo to wszystko chodzi w jednym wątku i jest odmalowywanie
co jakiś czas), ale wywołanie g.drawImage(img,0,0,this) nic nie robi

kod aktualizujący stan gry powinien robić na każdym z paneli invalidate(), a na koniec aktualizacji cały panel, który je zawiera powinien dostać validate() i repaint(). To spowoduje więc zaktualizowanie grafiki również każdego z pól.

Dnia 17.07.2012 o 18:55, Erton napisał:

Próbowałem w paint()
obiektu gameScreen wywoływać repaint() po kolei wszystkich gameFields, jednak skutkowało
to rzuceniem wyjątku - z tego co zrozumiałem ja za późno tworzę obiekty typu gameFields
a paint() jest wywoływany wcześniej.

To źle zrozumiałeś. Wywoływanie repaint czegokolwiek w paint powoduje wytworzenie wywołania rekurencyjnego, czyli nieskończonej pętli. Dlatego kończy się zawsze wyjątkiem, ewentualnie totalnym pokazem slajdów.
Repaint nakazuje obiektowi, który został tym potraktowany, przy najbliższej okazji uaktualnienie obrazu swojego komponentu graficznego i wszystkich jego potomków w drzewku wyświetlania. Wtedy kiedy tylko Swing odzyska kontrolę wywołuje ze swojego wątku paint tego obiektu, a ten paint powoduje wywołanie paint wszystkich innych komponentów, które znajdują się na obszarze jego wyświetlania.
Jest jednak pewna metoda nazywająca się paintImmediately, ale musisz osiągnąć 11. stopień wtajemniczenia, żeby załapać po co się ją stosuje. ;) Normalnie dla Ciebie nie istnieje.

Dnia 17.07.2012 o 18:55, Erton napisał:

Natomiast klasa GameField extends JPanel a jej paintComponent(Graphics g) wygląda tak:
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, null); ->to nie działa w ogóle
setBackground(getColor()); ->to działa poprawnie
}

Ta pierwsza instrukcja odmalowuje tło komponentu, czyli to co było ustawione przez ostatnie setBackground. Druga powinna działać chyba, że ją zamalowujesz, co robisz przez ostatnią instrukcję, której ubocznym efektem ustawienia koloru jest wrzutka invalidate, wymuszająca paint, a to powoduje natychmiastowy clearRect , czyli zamazanie obrazka, który próbujesz wyrysować.
Pamiętaj, że setBackground niczego nie rysuje. Zmienia tylko stan komponentu w zmiennych, które dziedziczysz i nie masz do nich bezpośredniego dostępu. Jedyną metodą naprawdę coś wyrysowującą jest super.paintComponent, chociaż rysuje ona tylko tło.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

To znowu ja. Mam teraz pytanie dotyczące plików JAR.

Nie wiem za bardzo, jak ładować obrazki. Przy tworzeniu JAR File (czy raczej powinienem robić Runnable JAR File?) nie ma nigdzie opcji do zaznaczenia, żeby spakowane zostały także obrazki. Raz mi się pojawił obrazek do "zaznaczenia", że też ma być spakowany, ale potem zniknął i zupełnie nie wiem, jak wymusić załadowanie kilku obrazków. Czy mógłbym prosić o jakiś prosty przykład jak ładować obrazek, z wyraźnym zaznaczeniem co w którym pliku i katalogu się znajduje i jak wygląda do niego ścieżka? Bo strasznie się motam, zwiedziłem pół Internetu i się nie dowiedziałem. Byłbym bardzo wdzięczny.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

No dobra, chyba za wcześnie panikuję, coś ruszyło :)

Nie wiem czemu, ale nagle pojawiły się wszystkie obrazki jako resources i zrobiły się możliwe do zaznaczenia i teraz wszystko śmiga. O ile tylko tworzę plik .jar w głównym katalogu gry. Jeśli chcę zrobić folder wyżej to już nie działa :(


Ogólnie to chciałbym się zapytać, czy istnieje możliwość zapakowania całego projeku w plik .jar, ze wszystkimi obrazkami itd., żeby móc go swobodnie przemieszczać? Żeby po prostu cały projekt był zapakowany i to czy ruszy nie zależało od jego pozycji na dysku.

Mam nadzieję, że niczego nie plączę.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 29.07.2012 o 22:22, Erton napisał:

Ogólnie to chciałbym się zapytać, czy istnieje możliwość zapakowania całego projeku w
plik .jar, ze wszystkimi obrazkami itd., żeby móc go swobodnie przemieszczać?

Jest możliwe. Być może będzie to najłatwiejsze przy użyciu Mavena, który jest wbudowany lub ma wtyczki w praktycznie każdym rozbudowanym IDE.

Dnia 29.07.2012 o 22:22, Erton napisał:

Żeby po prostu cały projekt był zapakowany i to czy ruszy nie zależało od jego pozycji na dysku.

Problem leży w tym, że sam program java.exe jest tak nieżyciowo zbudowany, że to co uruchamia ściśle zależy od położenia na dysku. Na przykład polecenie uruchomienia programu z pliku .class w ogóle nie chce podawania gdzie ten plik .class jest na dysku i nawet jak się nazywa. Oczekuje jedynie nazwy klasy zawierającej metodę main zakładając, że wie jak plik powinien się nazywać i gdzie znajdować. Ponieważ tak naprawdę wcale tego nie wie istnieje jeszcze dodatkowa opcja -classpath, którą się wykorzystuje jako podpowiedź, aby to aroganckie podejście naprawić kiedy głupia java.exe wreszcie stwierdzi, że jednak bez takiej opcji sama znaleźć klasy nie potrafi.
To jest niestety skutek tego, że nazwy plików w Javie są zależne od systemu, więc najprościej było spróbować je wyeliminować. Dlatego java i javac mają taką porytą składnię wywołania.

Co do samego archiwum jar, to jest to taki mocno ograniczony zip. Często okazuje się, że trzeba coś ręcznie do niego dopakować lub wypakować. W tym celu istnieje w pakiecie javy polecenie jar (w Windows jest to jar.exe).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

To znowu ja :) Nazbierało mi się kilka pytań.

Na wstępie chciałbym podziękować za dotychczasową pomoc. Oczywiście zawsze staram się poszukać rozwiązań problemów czy to w dokumentacji czy to w Internecie, ale nie zawsze się udaje. Więc jeśli wszystkie możliwe kombinacje pomysłów nie przychodzą mi do głowy, wtedy się pytam :)

Pierwsze pytanie jest z gatunku tych frustrujących. Mam sobie okienko gry, w którego metodzie paint maluję sobie tło i karty (bo próbuję napisać Pokera w uproszczonej wersji). I teraz chcę domalować guzik (on będzie służył do poinformowania Serwera, żeby podesłał wymienił karty). I teraz ten guzik nie chce się pokazywać. Pokazuje się dopiero po najechaniu na niego myszką a jeśli rozszerzam okno to "miga" przy każdym rozszerzeniu. Czytałem w internecie, że parę osób miało z tym problem, ale jakoś rozwiązania znaleźć nie mogłem. Button dodaję do ContentPane okienka (wiem, że lepiej na panelach, ale póki co to chyba bez różnicy). I szczerze mówiąc to już wywoływałem wszystkie możliwe validate(), paint() itd. i dla całego JFrame i dla samego JButton. I nic. Guzik pojawia się dopiero po najechaniu. Nie jest to problem z moim setVisible (bo parę razy już się tak naciąłem, że najpierw robiłem setVisible(true) a potem coś domalowywałem i się dziwiłem, czemu tego nie ma). W paint() maluję maluję za pomocą obiektu klasy Image (i metody getGraphics()), poza tym nic więcej. I szczerze mówiąc jest to trochę wkurzające :) Byłbym za to bardzo wdzięczny.


Drugi problem polega na tym, że chciałbym móc przeciągać karty i żeby w trakcie przeciągania karta "podążała" za myszką aż do momentu jej upuszczenia. Wykorzystuję do tego MouseListener i MouseMotionListener. I chciałem to zrobić tak, że w metodzie mousePressed aktywuję jakąś flagę, w mouseReleased ją zdezaktywować, a w mouseMoved, jeśli ta flaga jest aktywowana to aktualizować współrzędne karty (repaint() to już inna, też dość problematyczna, kwestia :)). I teraz chciałem to sobie sprawdzić, zrobiłem sobie zmienną boolean, w mousePressed ustawiałem ją na true, w mouseReleased na false, a w mouseMoved robiłem
if (tmp) System.out.println(arg0.getX()). No i to nie działa. Wypisywanie się nie wykonuje :( Może ja powinienem wtedy jakiś wątek odpalać i w nim operować tym mouseMoved? Bo może teraz nie jest mi to aż tak bardzo potrzebne (skoro radośnie repaint() odmalowuje u mnie całe okno to siłą rzeczy musi migać, więc zrezygnowałem z tego, a nie chce mi się teraz zmieniać całej koncepcji), ale przydałoby się wiedzieć, jak to się robi.

Tyle miałem problemów a teraz mogę sobie przypomnieć tylko te 2 :/ Byłbym wdzięczny za pomoc (zwłaszcza z tym pierwszym). I jeszcze raz dziękuję za dotychczasową :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

>/..tniemy../

Fajnie jakbyś wrzucił kawałek kodu, jak dodajesz buttona do Twojego Panelu - jak możesz to umieść go na pastebin.com czy czymś podobnym, żeby tu nam sie temat zanadto nie rozrósł :)

Próbowałeś revalidate() ?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jasne. Przesyłam ważne elementy z konstruktora i paint. Reszta to ogarnianie połączenia z Serwerem itd. Więc wydaje mi się, że nie jest istotna z punktu widzenia problemu. To co jest w konstruktorze czyli i revalidate() i repaint() i setVisible(true) to jak można się domyślać desperackie próby zrobienia czegokolwiek, żeby zadziałało ;)

http://pastebin.com/ifNvzMFg

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 12.08.2012 o 22:11, Erton napisał:

Jasne. Przesyłam ważne elementy z konstruktora i paint. Reszta to ogarnianie połączenia
z Serwerem itd. Więc wydaje mi się, że nie jest istotna z punktu widzenia problemu. To
co jest w konstruktorze czyli i revalidate() i repaint() i setVisible(true) to jak można
się domyślać desperackie próby zrobienia czegokolwiek, żeby zadziałało ;)

http://pastebin.com/ifNvzMFg


Sam się Javy dopiero uczę :), więc najfajnej jakby sie wypowiedział Olamagato, ale czy revalidate() nie powinienes wywołać na panelu do którego dodajesz element?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Utwórz konto lub zaloguj się, aby skomentować

Musisz być użytkownikiem, aby dodać komentarz

Utwórz konto

Zarejestruj nowe konto na forum. To jest łatwe!


Zarejestruj nowe konto

Zaloguj się

Masz już konto? Zaloguj się.


Zaloguj się
Zaloguj się, aby obserwować