Autor Wątek: C++ i kod natywny kontra C# i kod managed  (Przeczytany 43918 razy)

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Luty 21, 2011, 22:51:23
%d w C++ nie dość że określało typ, to dawało kolejne miejsce do wywałki gdy np. napisałeś %s a podałeś int'a.

W życiu mi się to nie zdarzyło. W ogóle jedyny problem z takim formatowaniem jaki kiedykolwiek miałem, to wrzucenie std::string bez c_str() (pozdro Kos ;-)).

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

bs.mechanik

  • Gość
# Luty 21, 2011, 22:53:34
Teraz zastanowmy sie po co sie uczysz, zeby umiec, czy zeby zdac?

Prawda jest taka ze jesli umiesz, nie masz pewnosci ze zdasz, a jesli zdales, to nie znaczy ze umiesz.
C# jest kolejnym jezykiem ktory wypada umiec. Do tworzenia tooli (w konteksie gd) sie nada. A w cpp mysle, ze bedziemy jeszcze dlugo pisac :)

Offline yorp

  • Użytkownik
    • ProfessionGG Project

# Luty 21, 2011, 22:58:37
Teraz zastanowmy sie po co sie uczysz, zeby umiec, czy zeby zdac?

Prawda jest taka ze jesli umiesz, nie masz pewnosci ze zdasz, a jesli zdales, to nie znaczy ze umiesz.
(..)

to raczej nie jest odpowiedz na pytanie, przynajmniej nie na to, ktore zadalem ;)

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Luty 22, 2011, 11:59:48
Składnia formatowania stringa z tym {0} ma tą zaletę, że w nawiasie podaje się indeks parametru. W ten sposób można zmienić ich kolejność przez samą zmianę łańcucha formatującego.

Offline Esidar

  • Użytkownik

# Luty 22, 2011, 15:36:37
większość kompilatorów i tak teraz to sprawdza, a w ostateczności jest boost::format ;]
W C# jest Format... no i ? Nie rób z tego wątku kolejnego C++ > C#. Moja odpowiedź była prostym wyjaśnieniem "dlaczego", a odpowiedź  "bo jest bezpieczniejsze" co potwierdza Boost::format który powstał z tego samego powodu.

%d w C++ nie dość że określało typ, to dawało kolejne miejsce do wywałki gdy np. napisałeś %s a podałeś int'a.

W życiu mi się to nie zdarzyło. W ogóle jedyny problem z takim formatowaniem jaki kiedykolwiek miałem, to wrzucenie std::string bez c_str() (pozdro Kos ;-)).

str_en = "You pickup %d of %s";
str_la = "Cois le tu %s pon %d";
a teraz wersja C#:
str_en = "You pickup {0} of {1}";
str_la = "Cois le tu {1} pon {0}";

[Edit]
Składnia formatowania stringa z tym {0} ma tą zaletę, że w nawiasie podaje się indeks parametru. W ten sposób można zmienić ich kolejność przez samą zmianę łańcucha formatującego.
No właśnie :)
« Ostatnia zmiana: Luty 22, 2011, 15:38:42 wysłana przez Esidar »

Offline Kos

  • Użytkownik
    • kos.gd

# Luty 22, 2011, 15:59:13
Jak mamy uprzejmy kompilator (as in: rozszerzenia z POSIX), to nam podobno przejdzie coś takiego:

printf("You pickup %1$d of  %2$s \n", 10, "kos");
printf("Cois le tu %2$s pon %1$d \n", 10, "kos");

Ale u mnie na mingw gcc 4.5.1 np. nie działa.

Offline Xirdus

  • Redaktor

# Luty 22, 2011, 16:01:21
str_en = "You pickup %d of %s";
str_la = "Cois le tu %s pon %d";
str_en = "You pickup {0} of {1}";
str_la = "Cois le tu {1} pon {0}";
I to jest najlepszy dowód na wyższość C#-owych formatów nad C-owymi. Nie jest to zaś argument w C# vs C++, bo w tym drugim też można takie coś zaimplementować (i nawet są gotowce).

Offline Dab

  • Redaktor
    • blog

# Luty 22, 2011, 16:01:57
Nie ma to nic wspólnego z C++ vs C# -- to kwestia bibliotek a nie języka. Notabene
str_en = "You pickup {NUM} of {OBJECT}";
str_la = "Cois le tu {OBJECT} pon {NUM}";
jest znacznie lepsze od obydwu powyższych wersji, jeżeli chodzi o tłumaczenia czy inne teksty widziane w UI.

Offline Esidar

  • Użytkownik

# Luty 22, 2011, 17:54:25
str_en = "You pickup {NUM} of {OBJECT}";
str_la = "Cois le tu {OBJECT} pon {NUM}";
jest znacznie lepsze od obydwu powyższych wersji, jeżeli chodzi o tłumaczenia czy inne teksty widziane w UI.
Tu się muszę nie zgodzić :) Ile to razy widziałem tekst wracający od tłumaczy:
str_en = "You pickup {NUM} of {OBJECT}";
str_la = "Cois le tu {OBJECTIO} pon {NUMERICO}";
i ile to dodatkowych testów/czasu/pieniędzy kosztowało :) Tłumacze są leniwi i często używają automatów do tłumaczenia, a potem szukaj błędów w 100tyś linijkach tekstu. Jeśli chodzi więc o tłumaczenia, to cyfry są najbezpieczniejsze i "najtańsze". A z boku i tak praktycznie zawsze jest komentarz z kontekstem tekstu. Nawet jeśli tłumacz go nie przeczyta, to nie spowoduje to głupiego zachowania/wywałki kodu.

printf("Cois le tu %2$s pon %1$d \n", 10, "kos");
Ale u mnie na mingw gcc 4.5.1 np. nie działa.
MSVC potrafi wyłapać błędy w stylu "%s %d", "%d %s", ale jeśli tłumaczysz tekst, to częściej masz printf( str, 10, "kos" ).

Offline Kos

  • Użytkownik
    • kos.gd

# Luty 22, 2011, 20:30:30
Cytuj
MSVC potrafi wyłapać błędy w stylu "%s %d", "%d %s", ale jeśli tłumaczysz tekst, to częściej masz printf( str, 10, "kos" ).

Ale ja zupełnie nie o tym! Zerknij na sam format string. ;)