←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Inny
Formatowanie stringu

Zablokowany

  • +
  • -
DarkGL - zdjęcie DarkGL 12.08.2011

Szukam dokładnego opisu używania znaków formatujących ( np. %f %d %i ) np. jaka jest różnica między %i %d chociaż w sumie robią one to samo to jednak jakieś różnice są miedzy nimi
może być w języku angielskim
chcę się w to bardziej wgłębić ;)
Odpowiedz

Zkont?! - zdjęcie Zkont?! 12.08.2011

Łap linka - printf, WIKIPEDIA
Odpowiedz

  • +
  • -
R3X - zdjęcie R3X 12.08.2011

każde środowisko ma swój własny zestaw formatów, w .Net nawet nie ma typów tylko wszystkie dodatkowe parametry są zrzucane toString();
Odpowiedz

Zkont?! - zdjęcie Zkont?! 12.08.2011

Szukam dokładnego opisu używania znaków formatujących ( np. %f %d %i )


R3X, takie znaczniki występują tylko w C i C++ (mowa o %d, %i, etc.), stąd wnioskuję, że DarkGL pytał o jeden z tych języków.

PS. Przeleciałem całe google i Yahoo, lecz nie znalazłem terminu 'znaki formatujące'. Najwidoczniej on nie istnieje ^^
Użytkownik Zkont?! edytował ten post 12.08.2011 22:37
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 12.08.2011

chyba knopers mówił kiedyś o różnicy między %d i %i i tak mi to utkwiło w pamięci na wiki jest że to synonim więc chyba będe musiał się tym zadowolić
Odpowiedz

  • +
  • -
vaverix - zdjęcie vaverix 12.08.2011

Witam forumowiczów.

Sądzę, że to nie jest synonim.

%i - integer - Typ liczbowy stałoprzecinkowy (w tym całkowitoliczbowy), ze znakiem, (na ogół 32 bitowy - 4bajty - z zakresem -2147483648 .. 2147483647).

by R3X - dziękuję, za upewnienie, sprostowanie.

%d - decimal - Liczba dziesiętna.

Były 3 teorie:

Pierwsza:

%d - Według co poniektórych osób, jest to double integer - Typ liczbowy całkowity, stałoprzecinkowy o podwójnym zakresie względem zwykłego int'a (64 bity - 8 bajtów).

- Jest pierwsze "ale" - Pawn jest językiem skryptowym 32-bitowym...

Druga:

Spotkałem się z odmienną opinią na ten temat, ponieważ Pawn jest pochodną od C, a tam typ double jest liczbą zmiennoprzecinkową o podwójnej w stosunku do float dokładności.

- I tu też jest "ale" - nie tworzymy zmiennej typu double, w sposób: "new Double:Zmienna" ani też nie wyświetlamy Float'ów za pomocą formatowania %d.

Można zatem sprawdzić, czy rzeczywiście tak jest, próbując wyświetlić liczbę rzeczywistą za pomocą tego formatowania:

#include <amxmodx>

public plugin_init()
{
	register_plugin("test", "0.001", "vaverix");
	register_clcmd("say /test", "test");
}

public test(id)
{
	client_print(id, 3, "int: %d", 2);		// liczba całkowita
	client_print(id, 3, "float: %d", 2.24428);	// liczba rzeczywista
}

Gdzie po wpisaniu /test w czacie wyświetli się:

int: 2
float: 10747664

A więc liczbę całkowitą (typ integer) wyświetla poprawnie, a liczbę rzeczywistą (zmiennoprzecinkową - float) już nie.

Trzecia:

- teoria, jest taka, że to jest synonim, ale w takim razie po co on by był?

Niczego nie narzucam. To jest temat warty przedyskutowania.
Użytkownik vaverix edytował ten post 12.08.2011 19:08
Odpowiedz

  • +
  • -
R3X - zdjęcie R3X 12.08.2011

%d to decimal, a nie double
%d nie wyświetla poprawnie floatów, bo Float: jest przetwarzany zgodnie ze standardem IEE 754-1985, interpretacja całkowita nie ma sensu
Odpowiedz

Zkont?! - zdjęcie Zkont?! 12.08.2011

Spór właściwie o nic. Niżej daję Wam wyjaśnienie.

1. Odsyłam do linku nt. słowa 'Decimal' w angielskiej wikipedii. >> Decimal From Wikipedia, the free encyclopedia. Jak możecie z tego wywnioskować, decimalem nazywamy dziesiętny typ zapisu danych.

2. Następną stroną jest coś poświęcone wyrazowi 'Integer'. Podaję wersję również z angielskiej wikipedii. >> Integer From Wikipedia, the free encyclopedia. Jak widać po wyczytaniu samego wstępu, integer jest to angielskie nazewnictwo liczby całkowitej.

3. Teraz możemy śmiało powiedzieć, że jedno i drugie to właściwie to samo. Myślę, że spór zakończony.

Użytkownik Zkont?! edytował ten post 12.08.2011 22:38
Odpowiedz

  • +
  • -
vaverix - zdjęcie vaverix 12.08.2011

3. Teraz możemy śmiało powiedzieć, że jedno i drugie to właściwie to samo. Myślę, że spór zakończony.


Sporu nie ma, bo wszystko wyżej jest wyjaśnione.

%i - liczba całkowita
%d - liczba dziesiętna
Użytkownik vaverix edytował ten post 12.08.2011 21:08
Odpowiedz

  • +
  • -
A może sma? - zdjęcie A może sma? 12.08.2011

Ale jaka wtedy jest różnica skoro żadne nie jest wstanie wyświetlić liczby większej niż 2147483647?
Odpowiedz

  • +
  • -
R3X - zdjęcie R3X 12.08.2011

Niżej daję Wam wyjaśnienie.

3. Teraz możemy śmiało powiedzieć, że jedno i drugie to właściwie to samo.

Jak już nam wyjaśniasz to przynajmniej wyciągaj rozsądne wnioski. Takich bzdur, że integer i decimal to to samo dawno nie słyszałem.

Liczba `całkowita` dotyczy ogólnego podziału liczb, a `dziesiętna` określa system liczbowy.

Liczba dziesiętna to też 0x10, 010, 0b120, ale format %i ma narzucony system dziesiętny. Z liczbami całkowitymi związane są też inne formaty: %x, %X, %o, %b no i właśnie %d. Każdy z nich jest związany z jakimś systemem liczbowym. Właśnie dlatego formatowanie liczby całkowitej w systemie dziesiętnym ma 2 znaczki:
  • %i jako ogólnie liczba całkowita, domyślnie w systemie dzisiętnym
  • %d bez domysłów jako liczba całkowita w systemie dziesiętnym.
Oba formaty drukują liczbę dokładnie w ten sam sposób.



a i wcześniej nie zauważyłem

takie znaczniki występują tylko w C i C++

sam podałeś link, który temu zaprzecza


Przy okazji opisywania funkcji format sprawdziłem, które % z C działają w Pawnie tylko ktoś mi popsuł tabelkę :mur:
Odpowiedz

Zkont?! - zdjęcie Zkont?! 12.08.2011

Racja R3X, napisałem dzisiaj stek bzdur :'( Tak na marginesie, to wracając do postu 'A może SMA?', to tak duże liczby zapisujesz za pomocą stringa.
Użytkownik Zkont?! edytował ten post 12.08.2011 22:44
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 12.08.2011

czyli %d cdo np. 10 20 30 tak a %i do np. 0x13 10 0b10 ?
Odpowiedz

  • +
  • -
A może sma? - zdjęcie A może sma? 12.08.2011

Ale wtedy to już nie jest liczba tylko ciąg znaków :P
Odpowiedz

  • +
  • -
R3X - zdjęcie R3X 12.08.2011

Widzę, że wprowadziłem małe zamieszanie. Spróbuję doprecyzować.


Mamy liczbę x=16

i teraz możemy ją wydrukować jako liczbę całkowitą
log_amx("x=%i", x);
%i samo wybierze system dziesiętny i efekt będzie taki:

x=16


albo sprecyzować liczbie całkowitej system liczbowy
log_amx("x=0x%X", x); //szesnastkowy

x=0x10

log_amx("x=0%o", x);//ósemkowy

x=020

log_amx("x=%d", x);//dziesiętny

x=16



Proszę bardzo, wynik z użyciem %i i %d jest taki sam. %d jest aliasem dla %i (lub odwrotnie). To jak przypisujemy wartość do zmiennej x nie znaczenia, wszystko i tak jest konwertowane na system binarny w pamięci komputera.
Odpowiedz
Zablokowany