Zaloguj się, aby obserwować  
UthersonL

Programowanie - pytania, problemy, przykłady programów

1812 postów w tym temacie

Dnia 22.11.2014 o 15:37, StrictlyBananas napisał:

a drugi pomysł odpada, bo iostream :)


Hm... a może być paskudna metoda?
http://puu.sh/d0Y9e/a222d6d115.png

Tak, to jest konwersja z double na string, wyszukanie kropki (jeśli istnieje) i oddanie wyniku od pierwszego znaku w naszym stringu do jednego znaku po kropce. Niezbyt piękne ale działa.

PS A co jest nie tak z iostream? o_O Przecież bez tego nawet nie wyświetlisz wyniku na ekranie bo cout nie będzie działać... No chyba że programujesz nie w C++ a w C... co swoją drogą jest sporą różnicą.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Chodzi o to, że druga metoda nie używała iosteam, tylko cstdlib. Ja po prostu używam iostream i pisanie kilku linijek za pomocą cstdlib byłoby głupotą, jeśli by w ogóle działało.

Dzięki za kod, zobaczę czy mi działa :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Coś poszło nie tak, ale jest znacznie lepiej niż było.

Nie ma na to jakiejś prostej komendy? Trzeba funkcję samemu wymyślać?

<edit>
Po prostu jestem głupi i nie usunąłem cout.precision(3) z poprzedniej próby :)

20141122162220

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 22.11.2014 o 16:23, StrictlyBananas napisał:

Coś poszło nie tak, ale jest znacznie lepiej niż było.

Eeee, jesteś pewny że dobrze przepisałeś kod? :D

http://pastebin.com/ibYF9mRG

Bo z tego co widzę... to to działa poprawnie u mnie:
http://puu.sh/d0YWk/5bc681378c.png

Dnia 22.11.2014 o 16:23, StrictlyBananas napisał:

Nie ma na to jakiejś prostej komendy? Trzeba funkcję samemu wymyślać?

Jest, printf.

EDIT
O, widzę że rob mnie uprzedził :P I że kod jednak działa.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zrobiłem 2 żałosne błędy i nie działało. Błędy naprawiłem i już działa.

@ odnośnie printf
W ilu przypadkach korzystanie z cstdio jest lepsze od iostream? Nie używam tego, bo podczas gdy mieliśmy wybór doszedłem do wniosku, ze za bardzo przypomina mi to Javę i wybrałem iostream.

~
Korekta:
Wcześniej jak pisałem cstdlib miałem na myśli cstdio

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 22.11.2014 o 16:41, StrictlyBananas napisał:

W ilu przypadkach korzystanie z cstdio jest lepsze od iostream? Nie używam tego, bo podczas
gdy mieliśmy wybór doszedłem do wniosku, ze za bardzo przypomina mi to Javę i wybrałem
iostream.


Hmm, odpowiedź na twoje pytanie w ładnej formie już się pojawiła na stackoverflow;
http://stackoverflow.com/questions/2872543/printf-vs-cout-in-c

W skrócie:
cstdio jest szybszy, trudniejszy do rozbudowy (łatwo za to zdefiniować sobie ostream do dowolnej klasy czy przeładować operator <<), brakuje w nim sprawdzania typu (możesz walnąć "%d" i wpisać sobie ciąg znaków, błąd pojawi się dopiero w trakcie uruchomienia a nie już na etapie kompilacji - choć to akurat półprawda bo co lepsze kompilatory sprawdzają co próbujesz tam wrzucić).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam dość dziwny problem.

Otóż wczytuje z pliku obrazem typu 24bitowego .bmp. Przy mało złożonych obrazkach program dobrze wczytuje.
Przy dużej złożoności kolorów w pewnym czasie wczytywany jest ciągle ten sam kolor. Co dziwniejsze jak dodam funkcję do sprawdzania pozycji wskaźnika do pliku to wtedy ten wskaźnik wariuje i od czasu do czasu skacze losowo w losowe miejsce.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 23.11.2014 o 00:02, Piotrbov napisał:

Otóż wczytuje z pliku obrazem typu 24bitowego .bmp. Przy mało złożonych obrazkach program
dobrze wczytuje.
Przy dużej złożoności kolorów w pewnym czasie wczytywany jest ciągle ten sam kolor.
Co dziwniejsze jak dodam funkcję do sprawdzania pozycji wskaźnika do pliku to wtedy ten
wskaźnik wariuje i od czasu do czasu skacze losowo w losowe miejsce.



Szybkie pytanko na start:
- Oczywiście to co wczytujesz ląduje w heapie a nie stacku? Bo jeśli to drugie to masz odpowiedź, tam jest paskudny limit kilkuset kilobajtów (średnio, zależy od konkretnego kompilatora itd, tym niemniej za dużo pamięci nie masz).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 23.11.2014 o 00:16, ziptofaf napisał:

Szybkie pytanko na start:
- Oczywiście to co wczytujesz ląduje w heapie a nie stacku? Bo jeśli to drugie to masz
odpowiedź, tam jest paskudny limit kilkuset kilobajtów (średnio, zależy od konkretnego
kompilatora itd, tym niemniej za dużo pamięci nie masz).


To co wczytuje, czyli header pliku .bmp, jak również później kolejne wartości pikseli, lądują do tablicy.

W testach korzystam z plików bmp, które nie przekraczają 150 kilobajtów, więc imho jest spoko.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 23.11.2014 o 00:24, Piotrbov napisał:

To co wczytuje, czyli header pliku .bmp, jak również później kolejne wartości pikseli,
lądują do tablicy.

W testach korzystam z plików bmp, które nie przekraczają 150 kilobajtów, więc imho jest
spoko.


A jesteś pewny że czytasz właściwe pliki bmp?

Bo samemu postanowiłem się pobawić i zrobić coś takiego jak ty:
http://pastebin.com/YuNBeU1H (nie obiecuję ładnego kodu!)

I po drodze okazało się że teoretycznie 24-bitowe pliki BMP wcale nie są odczytywane normalnie. Za to po ich konwersji przez Gimpa właśnie na 24 bitowy format już tak. Nawiasem mówiąc - nigdy nie myślałem że ktoś wymyśli tak pogięty format że dane idą z DOŁU na górę, w formacie BGR. A i jeszcze o paddingu trzeba pamiętać bo inaczej dostajesz dane z kosmosu (ale tego już mi się nie chciało robić). Samemu na szybko sprawdziłem na plikach 512x512 i 1024x1024 (alokowane na stercie bo to jednak jest ponad milion pikseli każdy o trzech parametrach nasycenia koloru, o brak pamięci tutaj już łatwo), wydawało się działać poprawnie.

A tak, oczywiście zapomniałem o delete[] na końcu, mea culpa!

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 23.11.2014 o 00:24, Piotrbov napisał:

W testach korzystam z plików bmp, które nie przekraczają 150 kilobajtów, więc imho jest
spoko.


A tak, coś mówiłeś o skaczącym losowo wskaźniku...

Że tak ładnie spytam - jaki jest jego typ? Bo jeśli to jest int to widzę źródło problemu - on przyjmuje w końcu tylko wartości między -32768 a 32768 w 32-bitowym środowisku. A biorąc pod uwagę wielkość naszej pięknej tablicy to tych elementów może być duuuużo więcej. U mnie tego problemu nie ma bo pisałem kod na 64-bitowym Linuxie który twierdzi że do Inta wejdą liczby do 2147483647 włącznie ale w przypadku mingw/visual c++ może być dużo gorzej.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.11.2014 o 00:05, Piotrbov napisał:

Przetestowałem ten obrazek na twojej funkcji i działa identycznie jak w mojej... czyli
czyta tylko 1 linijkę...

Jakbyś chciał masz tutaj oto ten obrazek: http://speedy.sh/2B9EC/test2.bmp


Hmm...
http://www.zimagez.com/zimage/screenshot-24112014-000843.php
W międzyczasie dodałem do swojej wersji wyświetlanie grafiki. I z tego co widzę to ten jest odczytywany w miarę poprawnie - formatów BMP tak naprawdę jest dużo i są różne, doszło do przesunięcia, widać powinienem dodać jakiś padding czy inne cholerstwo, nie chciało mi się wnikać w dokumentację tego standardu. Ale nie ma "zatrzymywania" się na jakiejkolwiek linii - cała tablica z informacją o każdym pikselu jest potem wyświetlana i gdyby coś było nie tak to miałbym tam czarne plamy. Ten sam plik nadpisany jako .bmp przez Gimpa (24 bity, R8 G8 B8) wyświetlany jest za to w pełni poprawnie:
http://www.zimagez.com/zimage/screenshot-24112014-001243.php

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

>ciach

Dziwne...

U ciebie działa nieźle, korzystam z Visual Studio 2013 i może w tym problem? Jak można zmienić kompilator używany w tym programie?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Java

Czy istnieje jakiś sposób na odniesienie wartości zmiennej do nazwy komponentu?

Przyjmijmy, że mam siedemset pięćdziesiąt komponentów typu JButton o nazwach: btn1, btn2, btn3, ..., btn750. Chciałbym na każdym z nich kolejno wykonać jedną, tą samą operację. Niech tą operacją będzie [nazwaPrzycisku].setText("TEXT");.

Normalnie wklejałbym linia za linią:

btn1.setText("TEXT");
btn2.setText("TEXT");
btn3.setText("TEXT");
...
btn750.setText("TEXT");

Zamiast tego doszedłem do wniosku, że można zrobić pętlę typu for i odnieść jej zmienną iteracyjną do nazwy przycisków:

for (int i=0; i<750; i++)
btn<i>.setText("TEXT");

Powyższy kod jest oczywiście niepoprawny; ma jedynie zobrazować mój tok rozumowania.

Czy tego rodzaju odniesienie jest możliwe do uzyskania w Javie? Jeżeli tak, to jak je uzyskać?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.11.2014 o 00:28, Piotrbov napisał:

U ciebie działa nieźle, korzystam z Visual Studio 2013 i może w tym problem?

Nie twierdzę że to niemożliwe ale wątpliwe.
Tak się tylko upewnię - przy uruchamianiu pliku oczywiście robisz to w trybie binarnym (z flagą ''b'' lub ios::binary zależnie czy używasz fopen czy ifstream)? Dla Linuxów nie robi to różnicy ale Windows traktuje to specjalnie i np. jeśli użyjesz flagi ''b'' to nie będzie uznawał że przypadkiem ASCII odpowiadające \n ma traktować jako "nową linię" czy inną bzdurę gdy w środki są ciągi liczb od 0 do 255.

Poza tym można iteratory z np. int i zamienić na long i, likwidujesz wtedy szansę że przypadkiem przekraczasz maksymalny zakres.

Dnia 24.11.2014 o 00:28, Piotrbov napisał:

Jak można zmienić kompilator używany w tym programie?

Jak śmiesz w ogóle o tym myśleć, niewierny!? Toż Microsoft daje ci swoje narzędzie >zazwyczaj< za darmo a ty chcesz zmieniać kompilator na jakieś, tfu tfu, open source''owe szkaradztwo?!

A poważnie - naprawdę się nie da z tego co kojarzę. Musiałbyś ręcznie wyedytować plik makefile projektu. Albo... skorzystać z innego IDE. Albo jak porządny obywatel skorzystać z G++ i wiersza poleceń.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

>ciach

Szybko napisałem to w CodeBlocksie i co? Czytanie bez problemu działa. Więc to 100% wina Visual Studio

Kurczę, ale mam tego typu projekt, który w musi być w Visual Studio zrobione. CHyba, że wiesz jak zrobić by CodeBlocksie biblioteka plików systemc.h działała.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.11.2014 o 01:01, Kardithron napisał:

Java

Czy istnieje jakiś sposób na odniesienie wartości zmiennej do nazwy komponentu?


Da się na kilka sposobów.
Po pierwsze - zrobić tablicę naszych buttonów i tam je wszystkie trzymać. Wtedy wystarczy pętla for each i na każdym elemencie możesz wykonać te same operacje.

Opcją numer 2 są refleksje.
http://pl.wikipedia.org/wiki/Mechanizm_refleksji
"Oba fragmenty tworzą instancję klasy Foo, następnie wywołują metodę hello() tej klasy. Różnica polega na tym, że w pierwszym fragmencie nazwa klasy i metody są częścią kodu źródłowego, podczas gdy w drugim fragmencie możliwe jest przeniesienie ich do zmiennych, których wartość jest ustalana w czasie wykonania kodu."

Wtedy możesz zrobić coś w rodzaju:
int i = 0;
object_name = "btn" + i;
I wywołać metodę na takim obiekcie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.11.2014 o 01:06, Piotrbov napisał:

Szybko napisałem to w CodeBlocksie i co? Czytanie bez problemu działa. Więc to 100%
wina Visual Studio

Raczej - konkretnego elementu w kompilatorze który działa inaczej niż w przypadku MinGW 4.8.1 czy jakiej wersji się tam teraz używa. Rzadko zdarza się żeby kod źródłowy różnił się drastycznie, pamiętam że niektóre konwersje chodzą nieco inaczej w MSVC a MinGW, inne też mogą być limity danych.

Dnia 24.11.2014 o 01:06, Piotrbov napisał:

Kurczę, ale mam tego typu projekt, który w musi być w Visual Studio zrobione. CHyba,
że wiesz jak zrobić by CodeBlocksie biblioteka plików systemc.h działała.


Wpisanie nazwy tej biblioteki w google daje mi link do githuba:
https://github.com/systemc/systemc-2.2.0

"This repository contains various patches to the OSCI systemc distribution to make it possible to compile the sources with latest GCC versions."

Więc pewnie się da. Ale że jestem na kompie który nie ma Windowsa to ciężko mi sprawdzić (mogę zrobić git clone i ./configure + make ale nie widzę szczególnego sensu, na Linuxie rzadko się coś NIE kompiluje :P).
Tym niemniej - pewnie najprościej jest przeanalizować w którym momencie wersja pod MSVC zaczyna wariować, pewnie gdzieś w jakimś losowym miejscu przydałby się long zamiast int.

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ć