Zaloguj się, aby obserwować  
Bartuc

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

1979 postów w tym temacie

Dnia 09.01.2010 o 16:20, zbysheck napisał:

poza tym lepiej zamiast "endl" używać "\n" - mniej pisania.

Tyle, że to nie to samo. endl oprócz wyrzucenia ''\n'' na standardowe wyjście czyści również bufor tego strumienia oraz wszystkich związanych z nim strumieni - dopiero to umożliwia rzeczywiste wypuszczenie całego wiersza do systemu. Oprócz tego synchronizuje również standardowe wejście (usuwa wszystkie nieoczekiwane znaki). Dzięki temu jest możliwe takie przekierowanie strumieni, żeby nie zdarzył się przypadek rozsynchronizowania wejścia i wyjścia.
Samo wypuszczenie ''\n'' nie jest przenośne w tym sensie, że na części systemów zadziała tak samo jak endl (często nawet zostanie przekonwertowane na "\r\n", ale na innych nie koniecznie. Brak synchronizacji może uniemożliwić zdalne sterowanie aplikacji, co dla człowieka będzie upierdliwe, a dla innego programu (np. aplikacji IDE) często będzie nie do przeskoczenia. Na przykład w sytuacji w której program będzie żądać odpowiedzi na pytanie, którego system jeszcze nie wypuścił na ekran.

To tak w ramach doprecyzowania. Zdalne wywołania jednych programów przez inne są rzadkie, ale zdarzają się i właśnie w takich rzadkich przypadkach wychodzą drobne różnice w działaniu.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 13.01.2010 o 05:26, DemoBytom napisał:

Jak w jakiś sensowny sposób dokonać głębokiej kopii obiektu w C#? Czy da się/jak napisać
konstruktor kopiujący w tym języku?

Nie. Podobnie jak w javie nie da się napisać ogólnej metody kopiującej inne obiekty niż własny. I to pod warunkiem, że wszystkie ewentualne pola obiektowe implementują interfejs ICloneable (czyli potrafią się same sklonować).
Nie pomoże też w tym serializacja. A przynajmniej nie w każdym przypadku. Chodzi o to, że jednym z pól może być tablica lub inny kontener zawierający jakieś obiekty. I te obiekty również muszą być ICloneable, aby całe kopiowanie mogło się udać. A tego nie można zagwarantować z poziomu kompilacji.
Można więc napisać metodę klonującą próbującą obu sposobów, czyli klonowania i serializacji, ale jeżeli choć jeden unikalny podobiekt z całego ich grafu (właściwie drzewa) nie spełnia ani jednej, ani drugiej cechy, to głębokiej kopii nie uda się wykonać w takim przypadku.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.01.2010 o 05:14, Olamagato napisał:

> poza tym lepiej zamiast "endl" używać "\n" - mniej pisania.
Tyle, że to nie to samo (...)

O.O no nie wiedziałem :D dzięki za krótką lekcję, przyda się, mimo że nie wszystko rozumiem ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Krótka piłka: Jakim programem w Windowsie pisać programy w zwykłym C, nie C++? Wiem, że można w notatniku, ale potem chcę to skompilować... Pomożecie?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 28.01.2010 o 14:47, Harrolfo napisał:

Krótka piłka: Jakim programem w Windowsie pisać programy w zwykłym C, nie C++? Wiem,
że można w notatniku, ale potem chcę to skompilować... Pomożecie?

Dev C++ - nazwa myląca, ale C w nim jak najbardziej jest ;]

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

No dobra, napisałem prosty program, żeby sprawdzić, czy ten ściągnięty działa. Tak wyglada:

#include <stdio.h>
int main ()
{
int i;
i==4;
if(i<5)
{
printf("Ten program dziala");
}
else
{
printf("PrInTf");
}
return 0;
}

I w tle mignie mi na chwilę takie dosowe okienko, ale tak na dosłownie 0,5 sekundy - nie mogę zobaczyć wyniku. Co z tym zrobić?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

/.../
Przed return 0 dodaj linijkę:
system("PAUSE");
Dev C++ niestety potrzebuje tego do szczęścia ;)

A tak przy okazji - każdy kompilator C++ (nie tylko Dev) jest zgodny z C :P Nie licząc najnowszych standardów tych języków (które chyba jeszcze nie zostały wprowadzone).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 28.01.2010 o 15:10, ziptofaf napisał:

/.../
Przed return 0 dodaj linijkę:
system("PAUSE");
Dev C++ niestety potrzebuje tego do szczęścia ;)

Dziwne - moja wersja robi to sama przy tworzeniu projektu :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Moja nie :/

Teraz mam problem z kodem:

#include <stdio.h>
int main ()
{
int i;
i==6;
if(i<5)
{
printf("Ten program dziala");
}
if(i>5 || i==5)
{
printf("NIE");
}
system("PAUSE");
return 0;
}

Ciągle wypisuje mi to, co powinien wypisać dla i<5. Dlaczego? Co mam źle? próbowałem zamiast tego drugiego ifa wpisać else, ale nie działało też...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 28.01.2010 o 15:06, Harrolfo napisał:

No dobra, napisałem prosty program, żeby sprawdzić, czy ten ściągnięty działa. Tak wyglada:


#include <stdio.h>
int main ()
{
int i;
i==4;
if(i<5)
{
printf("Ten program dziala");
}
else
{
printf("PrInTf");
}
return 0;
}

Być może dostaniesz info, że program działa, ale nie działa. Abstrahując od znikającego okienka:
i==4
Ta linijka sprawdza, czy i jest równe 4. Nie zmienia jego wartości. Więc w i są prawdopodobnie jakieś śmieci. Chyba chodziło o i=4

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 28.01.2010 o 15:17, hans_olo napisał:

Dziwne - moja wersja robi to sama przy tworzeniu projektu :)


Wszystkie wersje robią to same przy tworzeniu projektu ^^ Tylko Harrolfo chyba wkleił do Dev-a już gotowy kod, pozbywając się w ten sposób system("PAUSE"); :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 28.01.2010 o 15:17, hans_olo napisał:

Dziwne - moja wersja robi to sama przy tworzeniu projektu :)

2 ostatnie słowa tej wypowiedzi są kluczowe ;] Nowy projekt nie musi oznaczać nowego pliku, prawda? Zdecydowana większość nowych użytkowników nie będzie zaczynać działać od ''Utwórz nowy projekt'', a od ''Utwórz nowy pusty plik'' ;) Dlatego DevC++ nie dodaje zawsze sam System("PAUSE").

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 28.01.2010 o 15:30, Wilkv napisał:

Dlatego DevC++ nie dodaje zawsze sam System("PAUSE").

Bo to jest kretyńskie rozwiązanie, po drugie nieprzenośne.
Dokładnie to samo robi:
while(kbhit()) getch(); puts("Naciśnij klawisz"); getch();
A jest 10 razy mniejsze i tyle samo razy szybsze.
Sprowadza się to do opróżnienia buforów stdin, następnie wypisania komunikatu i pobraniu wiersza z pustego buforu, co powoduje zatrzymanie programu aż do jego skompletowania i potwierdzenia przyciskiem enter.

Jeszcze szybsze jest po prostu samo getch(), albo while(!kbhit()); jeżeli mamy pewność, że program ściągał na bieżąco wszystkie potrzebne dane wejściowe z konsoli.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 29.01.2010 o 00:09, Olamagato napisał:

Bo to jest kretyńskie rozwiązanie, po drugie nieprzenośne.

Oczywiście, co jednak nie oznacza, że wszędzie gdzie uczą C pod Windowsem, od tego zaczynają naukę. ''Używać System("PAUSE"). Dopóki nie poznacie czegoś lepszego, ale o tym później.'' I tego później nigdy nie ma ;]

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ć