Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69

Узнать размер переменной

23.03.2025, 23:20. Показов 6366. Ответов 50

Студворк — интернет-сервис помощи студентам
Вопрос носит теоретический характер.

Вот можно узнать размер типа
C#
1
2
byte MyByte;
int Size = sizeof(byte);
Можно узнать тип переменной
C#
1
Type MyType = MyByte.GetType();
А вот узнать размер переменной по имени как-то не получается
C#
1
int Size = sizeof(MyByte); // не работает
В этом заложен какой-то глубокий смысл?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.03.2025, 23:20
Ответы с готовыми решениями:

Надо вывести название переменной, тип данных переменной, значение переменной
у нас есть переменная int variable = 0; Надо вывести название переменной, тип данных переменной, значение переменной как это сделать?

Обеспечить возможность ввода значений в поля Размер x, Размер y
Создать меню с командами InputSize, Choose, Change, Exit. При выборе команды InputSize открывается диалоговое окно, содержащее два поля...

Подогнать размер картинки под размер формы
Здравствуйте! Я накладываю изображение на форму, но я столкнулся с проблемой. Мой код:this.BackgroundImage = new...

50
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
26.03.2025, 03:47
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Jack0v Посмотреть сообщение
А если можно то проблем для значимых типов не вижу.
Проблем может и нет, но повторюсь -- идеология C# немного отличается от C++. Не стоит ожидать что в .net будут работать все фичи из языка с явно другой философией.

Цитата Сообщение от Jack0v Посмотреть сообщение
Даже у всяких массивов и списков есть .lenght
которое показывает количество элементов и не более, к размеру в памяти это отношение не имеет. У того же list есть capacity, который намекает что под капотом там не всё так просто.
0
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,580
26.03.2025, 10:46
Цитата Сообщение от Jack0v Посмотреть сообщение
Ну наверно, по логике вещей, выравнивание не должно учитываться.
Вот именно, что наверное. Я тоже не знаю, только предполагаю.

Цитата Сообщение от Jack0v Посмотреть сообщение
Да и что за такие оптимизации могут произойти с int или byte, что они сменят свой размер? Хотелось бы хотя бы один пример такой оптимизации.
С int или byte ничего не может произойти, это типы, они всегда имею один и тот же размер. А вот с переменной всякое может произойти. Например, компилятор при оптимизации может её вообще выкинуть. Размер чего в таком случае должен вычислить sizeof?
0
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69
26.03.2025, 23:44  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Что-то не вижу связи. Как не знание размера переменной тебе помешает сериализовать структуру в массив?
В С/С++ можно провернуть такой фокус: берём указатель на нужную структуру, приводим его к байтовому (или любому другому) типу в плюсах это char (возможно в новых редакциях появилось что-то ещё, я не знаю) и с этим указателем можно работать как с обычным массивом. Для удобства, чтобы каждый раз к байтовому типу не приводить, можно переприсвоить в указатель чаровского типа. Но чтобы с массивом работать надо знать его размер, и вот тут sizeof() как нельзя кстати.

Цитата Сообщение от Wolfdp Посмотреть сообщение
которое показывает количество элементов и не более, к размеру в памяти это отношение не имеет. У того же list есть capacity, который намекает что под капотом там не всё так просто.
Но можно перемножить на размер типа и получить искомое.

Цитата Сообщение от John Prick Посмотреть сообщение
Например, компилятор при оптимизации может её вообще выкинуть. Размер чего в таком случае должен вычислить sizeof?
Размер выкинутой переменной. Почему бы и нет?


Ладно, хоть этот код работает и на том спасибо.
0
Эксперт .NET
 Аватар для Usaga
14769 / 9543 / 1365
Регистрация: 21.01.2016
Сообщений: 35,984
27.03.2025, 03:28
Цитата Сообщение от Jack0v Посмотреть сообщение
В С/С++ можно провернуть такой фокус: берём указатель на нужную структуру, приводим его к байтовому (или любому другому) типу в плюсах это char (возможно в новых редакциях появилось что-то ещё, я не знаю) и с этим указателем можно работать как с обычным массивом. Для удобства, чтобы каждый раз к байтовому типу не приводить, можно переприсвоить в указатель чаровского типа. Но чтобы с массивом работать надо знать его размер, и вот тут sizeof() как нельзя кстати.
Это всё классно. А C# и сериализация тут причём?
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,754
Записей в блоге: 4
27.03.2025, 10:50
Цитата Сообщение от Jack0v Посмотреть сообщение
Но чтобы с массивом работать надо знать его размер, и вот тут sizeof() как нельзя кстати.
В C# длина массива определяется методом Lenght() и далее циклами (for или foreach) решаешь любой вопрос с ним, а так же методами класса Array можно сделать очень много всего.
0
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,580
27.03.2025, 11:32
Цитата Сообщение от Jack0v Посмотреть сообщение
В С/С++ можно провернуть такой фокус: берём указатель на нужную структуру, приводим его к байтовому (или любому другому) типу
В C++ это ещё не UB, но прямая дорожка к нему. То, что язык такое позволяет, а компилятор не бьёт по рукам, не значит, что так делать надо. Вот C# и не позволяет.
1
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69
28.03.2025, 02:54  [ТС]
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
В C# длина массива определяется методом Lenght()
Так это понятно, я применительно к С/С++ говорил. Но опять таки, как было замечено ранее и не мной Lenght указывает не длину массива в байтах, а количество элементов в нём, а это не одно и тоже.

Цитата Сообщение от John Prick Посмотреть сообщение
язык такое позволяет, а компилятор не бьёт по рукам
Раз язык позволяет почему компилятор должен бить по рукам?
Цитата Сообщение от John Prick Посмотреть сообщение
не значит, что так делать надо
Вот надо мне структуру побайтно переложить в массив, как ещё тут можно обойтись малой кровью? Не в ручную же каждое поле копировать в массив.
Цитата Сообщение от John Prick Посмотреть сообщение
Вот C# и не позволяет.
Позволяет. Называется unsafe-контекст.

Цитата Сообщение от Usaga Посмотреть сообщение
Это всё классно. А C# и сериализация тут причём?
При том что такой же фокус я хотел провернуть и в C#, и в принципе сделать это можно, только заморочек чуть больше, но куцый sizeof() подвёл. Хотя его ущербность не сильно мешала, но я всё равно сериалезацию через маршалинг сделал.
А вот десериализацию буду наверно через указатели делать (по другому пока не знаю как).
0
Эксперт .NET
 Аватар для Usaga
14769 / 9543 / 1365
Регистрация: 21.01.2016
Сообщений: 35,984
28.03.2025, 03:55
Цитата Сообщение от Jack0v Посмотреть сообщение
При том что такой же фокус я хотел провернуть и в C#, и в принципе сделать это можно, только заморочек чуть больше, но куцый sizeof() подвёл. Хотя его ущербность не сильно мешала, но я всё равно сериалезацию через маршалинг сделал.
А вот десериализацию буду наверно через указатели делать (по другому пока не знаю как).
И пофиг тебе, что есть такая штука как JIT и версия среды исполнения, которые в праве определять внутреннее представление объектов так как им удобнее для текущей архитектуры процессора и версии .NET? И на кучу управляемую GC тебе тоже пофиг?..
0
 Аватар для roach1967
985 / 465 / 234
Регистрация: 27.06.2014
Сообщений: 1,039
28.03.2025, 06:34
Jack0v, может эта статья поможет...
1
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,754
Записей в блоге: 4
28.03.2025, 08:38
Цитата Сообщение от Jack0v Посмотреть сообщение
указывает не длину массива в байтах, а количество элементов в нём, а это не одно и тоже
А зачем длина массива в байтах? В NET управляемая память, ей занимается сборщик мусора (GC) и среда выполнения, там объекты могут быть абсолютно не того размера который вы вычислите. В NET не практикуется прямая работа с памятью, всё управляется средой выполнения.

Если хотите писать в стиле C/C++ используйте unsafe, но и в этом случае всё будет отличатся... И смысл тогда перехода на NET? Пишите дальше на C/C++...
0
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69
29.03.2025, 05:26  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
И пофиг тебе, что есть такая штука как JIT и версия среды исполнения, которые в праве определять внутреннее представление объектов так как им удобнее для текущей архитектуры процессора и версии .NET? И на кучу управляемую GC тебе тоже пофиг?..
Я чёт тебя никак не пойму. Ты к чему клонишь, что в C# нельзя сделать сериализацию структур? Можно. Вон, даже статья есть.

Цитата Сообщение от roach1967 Посмотреть сообщение
Jack0v, может эта статья поможет...
Да, спасибо, сейчас примерно так и делаю.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А зачем длина массива в байтах?
Если хотите писать в стиле C/C++ используйте unsafe, но и в этом случае всё будет отличатся
Буквально в предыдущем сообщении об этом писал.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
И смысл тогда перехода на NET? Пишите дальше на C/C++...
Слышал что на С# окошки проще писать. Что-то проще, а что-то оказалось сложнее. Впрочем как обычно.
0
Эксперт .NET
 Аватар для Usaga
14769 / 9543 / 1365
Регистрация: 21.01.2016
Сообщений: 35,984
29.03.2025, 05:49
Цитата Сообщение от Jack0v Посмотреть сообщение
Я чёт тебя никак не пойму. Ты к чему клонишь, что в C# нельзя сделать сериализацию структур? Можно. Вон, даже статья есть.
Я клоню к тому, что C# - язык управляемый. И заниматься такой фигнёй, которой ты занимаешься, он нормально не позволяет.

В языке есть встроенные сериализаторы, которые корректно могут в управляемой среде работать с объектами. Их и надо использовать.

Есть веская причина, зачем ты свой велосипед собрался изобретать?

Кстати, насколько я знаю, в плюсах такая "сериализация" тоже не поощряется.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
29.03.2025, 06:12
Цитата Сообщение от Jack0v Посмотреть сообщение
Слышал что на С# окошки проще писать.
Ну, если заниматься сериализацией данных через sizeof -- то да, не проще. Если нужно сохранить инфу в тот же файл, используют либо общепринятый json|xml, либо если нужна максимальная скорость и компакность то можно взять например protobuf.

Ещё есть всякие BinaryWriter и BinaryReader, с их помощью в целом тоже можно абсолютно спокойно записать/считать интересующие данные (хоть и не так изящно, как при классической сериализации).
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,754
Записей в блоге: 4
31.03.2025, 08:42
Цитата Сообщение от Jack0v Посмотреть сообщение
Слышал что на С# окошки проще писать.
MFC/Qt из C++ исключили?
0
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69
01.04.2025, 01:09  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
И заниматься такой фигнёй, которой ты занимаешься, он нормально не позволяет.
Такое ощущение, что ты вообще не читаешь того что я пишу:
Цитата Сообщение от Jack0v Посмотреть сообщение
...но я всё равно сериалезацию через маршалинг сделал.
Цитата Сообщение от Jack0v Посмотреть сообщение
...сейчас примерно так и делаю.


Цитата Сообщение от Wolfdp Посмотреть сообщение
сохранить инфу в тот же файл
Нужно свой собственный сетевой протокол закодить на канальном уровне. Работаю через PcapDotNet, а он требует байтовый массив.

Цитата Сообщение от Wolfdp Посмотреть сообщение
protobuf
Добавляет что-то своего лишнего.


Цитата Сообщение от Andrey-MSK Посмотреть сообщение
MFC/Qt из C++ исключили?
Не знаю, за что купил за то и продаю. Потребовалось софтину написать вот и решил воспользоваться случаем - C# пощупать.


Цитата Сообщение от kotelok Посмотреть сообщение
Можно так попробовать. Но, согласно документации, оно не всегда может совпадать с 'sizeof':
C#
System.Runtime.InteropServices.Marshal.S izeOf(MyByte);
Ещё вот такой вариант нашёл
System.Runtime.CompilerServices.Unsafe.SizeOf<MyByte>();
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,754
Записей в блоге: 4
01.04.2025, 08:42
Цитата Сообщение от Jack0v Посмотреть сообщение
Не знаю, за что купил за то и продаю.
MFC - библиотеки MS для написания UI. Являются обёртками над WinAPI. Встроена в поставку C++ в Visual Studio, нужно отметить соответствующую опцию в установщике.
Qt - сторонняя библиотека для создания UI на языке C++. Является кроссплатформенной.

Добавлено через 6 минут
Jack0v, Если уж сильно хочется поведение как в C/C++ то можно заморочится с C++/CLI. Это язык NET, который предназначен для связи управляемого кода и неуправляемого. В нём есть возможность создавать UI по технологии Windows Forms (нужно лишь настроить шаблон проекта), но она несколько урезана по сравнению с C#. Зато в нём можно писать код на чистом C++ и на C++/CLI.

И не требуйте от C# того поведения которого в нём нет. Это совсем другая технология. Изучите разницу между управляемым кодом (NET) и неуправляемым (C/C++).

Добавлено через 8 минут
Jack0v, Ещё по поводу C++/CLI. Можно создать проект, добавить его в своё решение, написать на C++ нужные вещи, на C++/CLI написать связь для NET, и в проекте на C# уже использовать всё из проекта C++/CLI. В общем выбор за вами
0
Эксперт .NET
 Аватар для Usaga
14769 / 9543 / 1365
Регистрация: 21.01.2016
Сообщений: 35,984
01.04.2025, 08:51
Цитата Сообщение от Jack0v Посмотреть сообщение
Нужно свой собственный сетевой протокол закодить на канальном уровне. Работаю через PcapDotNet, а он требует байтовый массив.
Protobuf в помощь. Зачем насиловать язык чужими для него концепциями мне не понятно.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
01.04.2025, 11:46
Цитата Сообщение от Jack0v Посмотреть сообщение
Нужно свой собственный сетевой протокол закодить на канальном уровне
Цитата Сообщение от Usaga Посмотреть сообщение
Protobuf в помощь.
+1

То что вам кажется "лишним", не очень то и лишнее. Насколько помню там добавляется числовой индификатор для определения типа данных, а в остальном это очень компактная и быстрая бинарная сериализация. Вообще обычно это "чёрный ящик" который пишет в массив/поток, и читает из него. А как -- дело десятое, и всем пофиг что там добавляется в процессе, пока не стоит задача "максимально компактно".

Даже если отказываться от protobuf, есть BitConverter или BinaryWriter/BinaryReader, которые чуть более предсказуемо пишут/читают. Я не уверен на 100%, но прямая запись структур в массив байт -- не безопасный код, который может зависеть от выполняемой среды. Да и в целом если стоит выбор между "свой велосипед" и "готовое и протестированное решение" -- выбор чаще в пользу последнего.

В целом если уже организовали через прямую запись структуры -- скорее всего вы и дальше будете использовать это, пока не всплывут проблемы (не обязательно что будут), либо пока не переведут проект под руководство более опытного в C# и у него не появиться желание + возможность переделать это. Вам достаточно понять сейчас что в C# делают вообще-то по другому, и по возможности ознакомиться.
0
122 / 2 / 0
Регистрация: 04.02.2025
Сообщений: 69
02.04.2025, 02:28  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Protobuf в помощь.
Ты похоже действительно не читаешь что я пишу:
Цитата Сообщение от Wolfdp Посмотреть сообщение
protobuf.
Цитата Сообщение от Jack0v Посмотреть сообщение
Добавляет что-то своего лишнего.


Цитата Сообщение от Wolfdp Посмотреть сообщение
То что вам кажется "лишним", не очень то и лишнее. Насколько помню там добавляется числовой индификатор для определения типа данных
Перед каждым полем. Скорее всего это нужно для обратной десериализации. Но для меня это именно что лишнее. В протоколе каждое поле стоит на своём месте, каждый байт имеет своё значение. Мне что теперь, протокол подгонять под этот protobuf?
Цитата Сообщение от Wolfdp Посмотреть сообщение
BitConverter или BinaryWriter/BinaryReader
Ознакомлюсь.
Цитата Сообщение от Wolfdp Посмотреть сообщение
В целом если уже организовали через прямую запись структуры -- скорее всего вы и дальше будете использовать это, пока не всплывут проблемы
Вы похоже тоже не читаете что я пишу. Третий раз повторяю:
Цитата Сообщение от Jack0v Посмотреть сообщение
...но я всё равно сериалезацию через маршалинг сделал.


Цитата Сообщение от Andrey-MSK Посмотреть сообщение
щё по поводу C++/CLI. Можно создать проект, добавить его в своё решение, написать на C++ нужные вещи, на C++/CLI написать связь для NET, и в проекте на C# уже использовать всё из проекта C++/CLI.
Нет уж, я доем свой кактус!
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
02.04.2025, 06:24
Цитата Сообщение от Jack0v Посмотреть сообщение
Перед каждым полем. Скорее всего это нужно для обратной десериализации. Но для меня это именно что лишнее. В протоколе каждое поле стоит на своём месте, каждый байт имеет своё значение. Мне что теперь, протокол подгонять под этот protobuf?
ну, обычно закидывается набор байт, а принимающая сторона должна сообразить что это. Грубо говоря на вход приходит плюс-минус 100 байт (а если это Stream, то там в целом считываешь пока считывается). Нужно понять что эти ~100 байт это MessageTypeA, а не MessageTypeB. Т.е. в любом случае нужно вводить флаг-перечислитель, чтобы понимать что пытаешься считать. Причём так как C# это про ООП, то эти самые сообщения пакуются в модели данных.

В protobuf ещё есть определённые заморочки. В плане компакности умные люди из гугла решили что мелкие числа будут передаваться чаще, а поэтому не обязательно гонять все 4 байта для того же int. В итоге имеем такую картину:

Code
1
2
3
4
5
message User {
    int32 id = 1;
    string login = 2;
    int64 balance = 3;
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    var user = new User
    {
        Id = 39,
        Login = "Miku",
        Balance = 1234
    };
    using var memory = new MemoryStream();
    {
        using var output = new CodedOutputStream(memory);
        user.WriteTo(output);
    }
    var result = memory.ToArray(); // 11 байт, хотя только Id + Balance по идеи должны занимать 12.
 
    ;
Но это всё история прикладного уровня, учитывая что вы используете PcapDotNet, есть подозрение что городите виртуальный адаптер и таки не вы определяете формат пересылаемых данных. Ну или по каким-то причинам хотите видить именно "прямой формат данных", когда сначала идет 4 байта для int, потом сколько-то байт для string и т.д.

Не по теме:

Цитата Сообщение от Jack0v Посмотреть сообщение
Вы похоже тоже не читаете что я пишу
Все всё читают, просто вы всё ещё на волне С++. Плюс у вас изначальный вопрос был вообще про sizeof, т.к. вы спрашиваете не "как правильно решить задачу Х", а придумали решение A и теперь хотите понять как его лучше реализовать, хотя возможно вам следует выбрать решение B.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.04.2025, 06:24

Подогнать размер изображения под размер PictureBox
Как изменить размер изображения при открытии? А то когда я добавляю в пикчер бокс, они обычно бывают не того разрешения и либо вылазят...

Можно ли подогнать размер браузера под размер фонового изображения
Здравствуйте! Подскажите как сделать, чтоб фоновое изображение подходило по ширине к ширине окна браузера? Чтоб оно не дублировалось и не...

Размер приложения превышает размер ресурсов почти на 100 Мб
Здравствуйте..Столкнулся с такой проблемой: Сейчас пишу Metro-приложения под Windows 8..У меня есть некоторые файлы (ресурсы), которые...

Размер изображения в см. если дан размер в пикселях
Смотрю свойства изображения, а мне пишет 2652х4999 пикселей. Что это? Как их перевести в сантиметры? Добавлено через 10 минут ...

Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции
Подскажите, в чем ошибка? Выдает ошибку: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru