powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / inline extern из библиотеки, как правильно декларировать-имплементировать?
25 сообщений из 276, страница 6 из 12
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283353
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима.

По поводу давно забытого Card-Raytracer benchmark.
https://sourceforge.net/p/card-raytracer-bench/code/HEAD/tree/trunk/cpp/

Помнится ты заметил что в идентичных сорцах картинки не были численно-точно равны.
Даже при том что мы включили одинаковый конгруэнтный ГПСЧ для всех сорцов и ЯП.
Мы тогда списали это на погрешность вычислений и забили болт. Не стали детально
разбираться.

А я вот щас предполагаю что РЕАЛИЗАЦИЯ работы floating-point вычислений (библиотечные функции,
FPU-80bit (extended double), или инструкции SSE) могли как раз повлиять на результат
при том при всём что стандарт представления числа IEE-754 вобщем не нарушался.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283354
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ здесь не спорю а просто дополняю. Привожу фрагмент статьи Никлауса Вирта.А я говорю о том, что "дробные копейки" - вещь принципиальная и не зависит от представления числа (двоичное или десятичное).
Более того, выбор представления оказывает влияние только для дробных чисел, но любые дробные числа с фиксированной запятой можно превратить в целые путём умножения на целый нормирующий коэффициент.
В результате, представление нас уже не колышет, а вот дробные копейки - продолжают существовать.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283355
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВот ещё подумай, что рациональное число в одной системе счисления не обязательно является рациональным числом в другой системе счисления.
да неужели?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283356
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное имеется в виду что в троичной системе счисления мы можем точно
представить 1/3 а в двоичной будет бесконечная дробная часть близкая к 1/3.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283357
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да понятно, что имелось в виду, но неточность формулировок - вещь опасная.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283358
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivПотому что double / float -- это не целые.
А числа с нормализованной мантиссой и порядком.
Мы на форуме философов-теоретиков или все-таки технарей? Давай в цифрах рассуждать. Я прекрасно знаю что есть догма "расчеты в числах с плавающей запятой неточны". Я знаю откуда она родилась.

значит, все же не знаешь, потому как 1) это не догма, 2) от разрядности неточность не зависит, в смысле, даже увеличивая разряднрсть точности не достичь, поскольку обусловлена она именно формой представления числа.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283359
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Школьную математеку так сильно обрезали, что о бесконечных периодических и непериодических дробях уже не рассказывают?
Мы проходили это в девятом классе средней общеобразовательной школы без всяких "уклонов".
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283360
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv2) от разрядности неточность не зависит, в смысле, даже увеличивая разряднрсть точности не достичь, поскольку обусловлена она именно формой представления числа.Точность зависит от многих факторов и представление - всего лишь один из этих факторов. И далеко не всегда - главный или, хотя бы, определяющий.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283363
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу 15 дес. разрядов. Возможно в этих константах есть некоторые
полезные значения.

http://en.cppreference.com/w/cpp/types/climits

К сожалению на моем жлобском MinGW часть из них нелетают. Может версия протухла.
gcc version 5.3.0 (x86_64-win32-sjlj-rev0, Built by MinGW-W64 project)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283367
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Десятичный логарифм двойки ~= 0,3010 (таблицы Брадиса, если кто в курсе).
Вариант 10**3 == 2**10 проще, но менее точен.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283374
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T...
Мы на форуме философов-теоретиков или все-таки технарей? ...
(как все запущено-то, оказывается)

Не используют floating point numbers для денежных вычислений.
Без теории, на самой что ни на есть практике - не используют .

Не было ни у Кернигана, ни у Риччи цели создавать язык, пригодный для финансовых вычисления.
Ясно и очевидно стояла иная цель - создать такой язык, на котором можно было бы перезапрограммировать наново все, что уже напрограммировано в ЦЕРНе на фортране. Тут, раз нет фортрана без float binary double, то и C без него жить не будет - наличие обязательно.

А Грейс Хоппер ни для чего иного, как для расчета зарплаты свой кобол и не создавал.
Потому там fixed point арифметика вшита до рождения языка. Без нее сам язык смысла не имеет.

А создали ады - не знали, зачем министерство обороны США им язык заказывает - траекторию полета баллистических ракет считать
или доходы от продажи оружия.
Поэтому встроили возможность и деньги считать, хоть это никому и не понадобилось.

MasterZiv Ну, нормальная потеря значимости.
О ней booby и говорил.
(задумчиво) ну, sort of...
Строго говоря я говорил о плавающей абсолютной точности.
А "потеря значимости", имхо, чаше обсуждается в контекстах, о которых пишет Basil A. Sidorov.
И, если сложение теряет значащие цифры частично, сохраняя относительную точность результата (15-16 десятичных цифр для binary float),
то вычитание обладает специальным свойством "катастрофической" потери точности, когда в результате может теряться произвольное количество точных десятичных цифр, вплоть до всех 16и разом.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283390
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyDima T...
Мы на форуме философов-теоретиков или все-таки технарей? ...
(как все запущено-то, оказывается)

Не используют floating point numbers для денежных вычислений.
Без теории, на самой что ни на есть практике - не используют .

Не было ни у Кернигана, ни у Риччи цели создавать язык, пригодный для финансовых вычисления.
Ясно и очевидно стояла иная цель - создать такой язык, на котором можно было бы перезапрограммировать наново все, что уже напрограммировано в ЦЕРНе на фортране. Тут, раз нет фортрана без float binary double, то и C без него жить не будет - наличие обязательно.

А Грейс Хоппер ни для чего иного, как для расчета зарплаты свой кобол и не создавал.
Потому там fixed point арифметика вшита до рождения языка. Без нее сам язык смысла не имеет.

А создали ады - не знали, зачем министерство обороны США им язык заказывает - траекторию полета баллистических ракет считать
или доходы от продажи оружия.
Поэтому встроили возможность и деньги считать, хоть это никому и не понадобилось.

MasterZiv Ну, нормальная потеря значимости.
О ней booby и говорил.
(задумчиво) ну, sort of...
Строго говоря я говорил о плавающей абсолютной точности.
А "потеря значимости", имхо, чаше обсуждается в контекстах, о которых пишет Basil A. Sidorov.
И, если сложение теряет значащие цифры частично, сохраняя относительную точность результата (15-16 десятичных цифр для binary float),
то вычитание обладает специальным свойством "катастрофической" потери точности, когда в результате может теряться произвольное количество точных десятичных цифр, вплоть до всех 16и разом.

Всё запущено с вашим количество сообщений в ветке Microsoft Access.

Не используют? Вы серьезный финансовый аналитик-программист? Или вы на С/С++ пишите код с утра до вечера? Почитайте пожалуйста, если у вас будет свободное время.

Господин Брайан Керниган не создавал язык Си, и тем более С++.

Дальше вы пишите что может быть что-то при сложение, что-то при вычитании. Не вникая, я могу написать вам тысячу такого рода абстрактных предложений во вставками "может быть", "немаловероятно" и т.д. и т.п. Извольте выражаться конкретней, Дмитрий справедливо заметил выше о том, что мы здесь не философией занимаемся и даже не на собседедовании
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283391
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вы вообще в теме с таким названием умудрились перейти к арифметике?)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283418
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКак вы вообще в теме с таким названием умудрились перейти к арифметике?)стреляли.. (с)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283423
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В продолжение тесткейсов...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
#include <math.h>
#include <stdio.h>
#include <stdint.h>

//

#include <bitset>

using namespace std;

// Fucken floating point test
// -----------------------------------
// http://www.h-schmidt.net/FloatConverter/IEEE754.html
// http://en.cppreference.com/w/cpp/types/climits
// https://en.wikipedia.org/wiki/Double-precision_floating-point_format
// https://en.wikipedia.org/wiki/Floating_point
// https://en.wikipedia.org/wiki/Single-precision_floating-point_format 

struct bitcard {    
           uint32_t sign:1;
           uint32_t exponent:8;
           uint32_t mantissa:23;
};

struct bitcard_double {    
           uint64_t sign:1;
           uint64_t exponent:11;
           uint64_t mantissa:53;
};

int main(int argc,char **argv,char **env){

	// [S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM ] 
        //  1       8           23
	union FloatUnion2 {
         float     v;
         struct    bitcard bc;
         uint32_t  iv;
	} fu;

	// [S EEEEEEEEEEE MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMM ]
	//  1      11                                 53

	union DoubleUnion {
         double    v;   
         struct    bitcard_double bc;
         uint64_t  iv;
	} du;

	fu.v = M_PI; // 3.14159265358979323846
	du.v = M_PI;

	bitset<32> fs(fu.iv);
	bitset<64> ds(du.iv);

	// Float output has been tested with FloatConverter online calculator 1.02f . 
	printf("fu.float     = %f\n",fu.v); 
	//printf("fu.sign      = %01Xh\n",fu.bc.sign);
	//printf("fu.exponent  = %02Xh\n",fu.bc.exponent);
	//printf("fu.mantissa  = %08Xh\n",fu.bc.mantissa);
	
	string fss = fs.to_string();
	printf("fu.raw       = %s\n",fss.c_str()); 
	printf("    sign     = %s\n",fss.substr(0,1).c_str()); 
	printf("    exponent = %s\n",fss.substr(0+1,8).c_str()); 
	printf("    mantissa = %s\n",fss.substr(0+1+8,23).c_str()); 


	printf("du.double    = %.18g\n",  du.v); 
	//printf("du.sign      = %02Xh\n",du.bc.sign);
	//printf("du.exponent  = %03Xh\n",du.bc.exponent);
	string dss = ds.to_string();
	//printf("du.mantissa  = %014Xh\n",du.bc.mantissa);
	printf("du.raw       = %s\n",dss.c_str()); 
	printf("    sign     = %s\n",dss.substr(0,1).c_str()); 
	printf("    exponent = %s\n",dss.substr(0+1,11).c_str()); 
	printf("    mantissa = %s\n",dss.substr(0+1+11,53).c_str()); 

	return 0;

}

...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283434
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivзначит, все же не знаешь, потому как 1) это не догма, 2) от разрядности неточность не зависит, в смысле, даже увеличивая разряднрсть точности не достичь, поскольку обусловлена она именно формой представления числа.
Все я знаю. И про особенности преобразования дробных чисел в разные системы счисления, и даже преобразовывал неоднократно ручкой в тетради во время учебы.

Давай сначала немного ТЗ восстановим. Началось тут 19473119 где я утверждаю что денежные расчеты можно вести в double если не нужно использовать более 15 десятичных разрядов (чуть перефразировал), тут 19475388 ты усомнился в моем заявлении что в FoxPro все числовые переменные double, сходу не смог, а сейчас нагуглил . Магическое число 15 там упоминается, не я его придумал.

Я не утверждал что возможна абсолютная точность. Есть погрешность преобразования мантиссы и эта погрешность легко считается как 1/2^52 = 2.22*10^-16 точнее мантисса 53 бита, т.к. первый бит всегда единица и просто подразумевается, а не пишется. 1/2^53 = 1.11*10^-16. Это означает что при переводе 15 значного десятичного числа в double и обратно погрешность никак не помешает, главное вовремя округлять.
Не настолько силен в математике чтобы доказывать формулами, поэтому сделал тест перебором преобразования всех 15-тизначных целых чисел в double и обратно.
Правда не быстрый он, за 22 минуты дошел только до 100601824280576 и дальше молотит. Конца дожидаться не буду. Пару часов погоняю, отпишусь чем кончилось.
исходник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void main() {
	for(int64_t x = 100000000000000L; x <= 999999999999999L; x++) {
		double y = x;
		int64_t x2 = y;
		if (x != x2) {printf("error %lld\n", x); break;}
		if((x & 0xFFFFFFF) == 0) printf("test %lld\n", x); 
	}
	printf("finish\n");
}



Запускал в дебаге, чтобы оптимизатор код не упростил, вот с асмом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
void main() {
000000013FFB2690  push        rbp  
000000013FFB2692  push        rdi  
000000013FFB2693  sub         rsp,148h  
000000013FFB269A  lea         rbp,[rsp+20h]  
000000013FFB269F  mov         rdi,rsp  
000000013FFB26A2  mov         ecx,52h  
000000013FFB26A7  mov         eax,0CCCCCCCCh  
000000013FFB26AC  rep stos    dword ptr [rdi]  
	for(int64_t x = 100000000000000L; x <= 999999999999999L; x++) {
000000013FFB26AE  mov         rax,5AF3107A4000h  
000000013FFB26B8  mov         qword ptr [rbp+8],rax  
000000013FFB26BC  jmp         main+39h (013FFB26C9h)  
000000013FFB26BE  mov         rax,qword ptr [rbp+8]  
000000013FFB26C2  inc         rax  
000000013FFB26C5  mov         qword ptr [rbp+8],rax  
000000013FFB26C9  mov         rax,38D7EA4C67FFFh  
000000013FFB26D3  cmp         qword ptr [rbp+8],rax  
000000013FFB26D7  jg          main+9Bh (013FFB272Bh)  
		double y = x;
000000013FFB26D9  cvtsi2sd    xmm0,qword ptr [rbp+8]  
000000013FFB26DF  movsd       mmword ptr [rbp+28h],xmm0  
		int64_t x2 = y;
000000013FFB26E4  cvttsd2si   rax,mmword ptr [rbp+28h]  
000000013FFB26EA  mov         qword ptr [rbp+48h],rax  
		if (x != x2) {printf("error %lld\n", x); break;}
000000013FFB26EE  mov         rax,qword ptr [rbp+48h]  
000000013FFB26F2  cmp         qword ptr [rbp+8],rax  
000000013FFB26F6  je          main+7Ah (013FFB270Ah)  
		if (x != x2) {printf("error %lld\n", x); break;}
000000013FFB26F8  mov         rdx,qword ptr [rbp+8]  
000000013FFB26FC  lea         rcx,[string "error %lld\n" (013FFBADC0h)]  
000000013FFB2703  call        printf (013FFB1280h)  
000000013FFB2708  jmp         main+9Bh (013FFB272Bh)  
		if((x & 0xFFFFFFF) == 0) printf("test %lld\n", x); 
000000013FFB270A  mov         rax,qword ptr [rbp+8]  
000000013FFB270E  and         rax,0FFFFFFFh  
000000013FFB2714  test        rax,rax  
000000013FFB2717  jne         main+99h (013FFB2729h)  
000000013FFB2719  mov         rdx,qword ptr [rbp+8]  
000000013FFB271D  lea         rcx,[string "test %lld\n" (013FFBADD0h)]  
000000013FFB2724  call        printf (013FFB1280h)  
	}
000000013FFB2729  jmp         main+2Eh (013FFB26BEh)  
	printf("finish\n");
000000013FFB272B  lea         rcx,[string "finish\n" (013FFBADE0h)]  
000000013FFB2732  call        printf (013FFB1280h)  
}





PS Для float погрешность 1/2^24 = 5.96*10^-8. Т.е. точно можно оперировать 7-ю знаками, для денег это маловато, т.к. максимум будет 99999.99 а дальше погрешности вылезут.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283435
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПомнится ты заметил что в идентичных сорцах картинки не были численно-точно равны.
Даже при том что мы включили одинаковый конгруэнтный ГПСЧ для всех сорцов и ЯП.
Мы тогда списали это на погрешность вычислений и забили болт. Не стали детально
разбираться.
Забили, но было правдоподобное объяснение что в разных ЯП параметры могут читаться в разном порядке, т.е. даже при одинаковой последовательности будут разные результаты. Например f(rand(), rand()). Там были такие подозрительные места в коде.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283437
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЗабили, но было правдоподобное объяснение что в разных ЯП параметры могут читаться в разном порядке, т.е. даже при одинаковой последовательности будут разные результаты. Например f(rand(), rand()). Там были такие подозрительные места в коде.
Ну это легко фиксится introduce temp var.

Код: plaintext
1.
2.
3.
int R1 = rand();
int R2 = rand();
f(R1,R2);
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283441
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу это легко фиксится introduce temp var.
ХЗ, оптимизатор превратит это обратно в f(rand(), rand()), а то и еще во что похуже, а ограничивать оптимизатор - порушить всю нашу идею замеров скорости. Потому и забили. Как-то так мне припоминается.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283444
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TХЗ, оптимизатор превратит это обратно в f(rand(), rand()),
серьёзно?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283446
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima TХЗ, оптимизатор превратит это обратно в f(rand(), rand()),
серьёзно?
я ж написал ХЗ, т.е. сомневаюсь но возможно :)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283451
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилсерьёзно?
Вполне: и компилятор и процессор вольны менять порядок независимых (с их точки зрения)
операций вплоть до параллельного исполнения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283454
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати задумался... возможно ли написать честную последовательность float/double псевдо случайных
величин по линейному закону.

Сама плотность значений float/double распределена по вещесвенной оси изначально неравномерно.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283458
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНе настолько силен в математике чтобы доказывать формулами, поэтому сделал тест перебором преобразования всех 15-тизначных целых чисел в double и обратно.
Правда не быстрый он, за 22 минуты дошел только до 100601824280576 и дальше молотит. Конца дожидаться не буду. Пару часов погоняю, отпишусь чем кончилось.

Прошло два часа, досчитало до 103329396948992, считает дальше. Ошибок не было.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283459
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovИзопропилсерьёзно?
Вполне: и компилятор и процессор вольны менять порядок независимых (с их точки зрения)
операций вплоть до параллельного исполнения.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int get() { static int s = 0; return s++; };
void quest(int a, int b) {
	printf("%i %i\n", a, b);
};
....
	int x = get();
	int y = get();
	quest(x, y);


может напечатать 1 0 ?
...
Рейтинг: 0 / 0
25 сообщений из 276, страница 6 из 12
Форумы / C++ [игнор отключен] [закрыт для гостей] / inline extern из библиотеки, как правильно декларировать-имплементировать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]