Вернуться   Форум Рубцовска > Городской Интернет > Программирование
+4°Давление 738
Ветер 1 м/с ЮЮВ
Комфорт +4°

Ответ
 
Опции темы Опции просмотра
  #41  
Старый 11.04.2022, 18:56
Аватар для Neil
Neil Neil вне форума
Генерал-Полковник
 
Регистрация: 26.01.2008
Сообщений: 7,370
Спасибо: 2,904
Neil стоит на развилке
Лампочка

- все элементы теперь активны с самого начала.
- убрал кнопку "разделить". теперь деление на подсети происходит вместе с расчётом.
- косметические изменения.

Вложение 91976

p.s.: чем бы подсветить "неправильные" маски в выборе?
есть более лаконичные решения кроме ComboBox.DrawMode / OwnerDrawnVariable?
__________________
"любой вопрос имеет право на жизнь, любой человек может ошибаться или не знать каких-то простых вещей" © serr (lubuntu.ru)

Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
Мальчик сказал папе: “Я хочу кушать”. Папа отправил его к маме.
Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
И бегал так мальчик, пока в один момент не упал.
Что случилось с мальчиком? TTL кончился.


три слова - это два слова! © banda agency Киев

Последний раз редактировалось Neil; 03.05.2022 в 13:21.
Ответить с цитированием
  #42  
Старый 12.04.2022, 02:37
BigO BigO вне форума
Рядовой
 
Регистрация: 31.08.2016
Сообщений: 36
Спасибо: 42
BigO стоит на развилке
По умолчанию

Цитата:
Сообщение от Neil Посмотреть сообщение
- все элементы теперь активны с самого начала.
- убрал кнопку "разделить". теперь деление на подсети происходит вместе с расчётом.
- косметические изменения.
Ну вот, гораздо лучше стало. Можно покопать еще в сторону визуализации данных. Много одинаковых по размеру и по внешнему виду компонентов сливаются и не дают быстро находить нужные вещи. Группировка, размер, порядок элементов могут сильно визуальное восприятие поменять, но это уже такое.

Хотя есть пара моментов, которые все таки точно требуют внимания:
1. Поля с рассчитанными данными хорошо бы сделать readonly. Сейчас они провоцируют в них чего-то вписать самому, а это не имеет смысла, все равно будут сброшены при расчете.
2. Деление на подсети вопросы вызывает. 192.168.0.1/28, 2 подсети. Число хостов:14, 2 подсети по 6. Не сходится. 8 подсетей - 0 хостов в подсети. Что-то где-то теряется.

Цитата:
Сообщение от Neil Посмотреть сообщение
p.s.: чем бы подсветить "неправильные" маски в выборе?
есть более лаконичные решения кроме ComboBox.DrawMode / OwnerDrawnVariable?
Кто ж эти ваши винформсы знает то, чтобы такое подсказывать. Вот была бы репа в гитхабе, можно было бы перед сном попробовать посмотреть что там сделать можно)
Ответить с цитированием
  #43  
Старый 12.04.2022, 10:33
Аватар для Capsaicin
Capsaicin Capsaicin вне форума
Прапорщик
 
Регистрация: 13.11.2014
Сообщений: 308
Спасибо: 239
Capsaicin стоит на развилке
По умолчанию

Привет.
Хочешь более управляемого интерфейса - откажись от винформс, используй впф. ВПФ более гибкий, позволит тебе нормально привязывать данные к интерфейсу. Но для этого придётся почитать про паттерны проектирования.

А зачем кнопка посчитать? Легче было бы пользоваться если бы шёл автоматический рассчёт, как мне кажется. А вместо модалок с сообщениями об ошибках показывать уведомления прям на главной форме.
И повторю других, заливай на гитхаб исходники .
__________________
Только ситхи всё возводят в абсолют.
Ответить с цитированием
  #44  
Старый 12.04.2022, 12:30
Аватар для Neil
Neil Neil вне форума
Генерал-Полковник
 
Регистрация: 26.01.2008
Сообщений: 7,370
Спасибо: 2,904
Neil стоит на развилке
Хорошо

Цитата:
Сообщение от BigO Посмотреть сообщение
Ну вот, гораздо лучше стало. Можно покопать еще в сторону визуализации данных. Много одинаковых по размеру и по внешнему виду компонентов сливаются и не дают быстро находить нужные вещи. Группировка, размер, порядок элементов могут сильно визуальное восприятие поменять, но это уже такое...
совсем уж косметикой займусь как всё допилю

Цитата:
Сообщение от BigO Посмотреть сообщение
...
1. Поля с рассчитанными данными хорошо бы сделать readonly. Сейчас они провоцируют в них чего-то вписать самому, а это не имеет смысла, все равно будут сброшены при расчете...
а я думал оставить так. вдруг кому то захочется чего-нибудь копирнуть оттуда

Цитата:
Сообщение от BigO Посмотреть сообщение
...
2. Деление на подсети вопросы вызывает. 192.168.0.1/28, 2 подсети. Число хостов:14, 2 подсети по 6. Не сходится. 8 подсетей - 0 хостов в подсети. Что-то где-то теряется...
вход: 192.168.0.1/28
выход: 14 хостов + адрес сети и броадкаст = 16

вход: делим на 2 подсети
выход: 2 сети по 6 хостов = 12 + 2 (к одной добавляется броадкаст, к другой адрес сети) + 2 адреса (первый и последний) исходной сети = 16

вход: делим на 8 подсетей
выход: 8 подсетей с адресами самих сетей и первым IP, он же и последний (считай броадкаст)
хостов в такой сети нет если же посчитать общее кол-во адресов в 8 подсетях,
то получим 16

Цитата:
Сообщение от BigO Посмотреть сообщение
Кто ж эти ваши винформсы знает то, чтобы такое подсказывать. Вот была бы репа в гитхабе, можно было бы перед сном попробовать посмотреть что там сделать можно)
Цитата:
Сообщение от Capsaicin Посмотреть сообщение
... повторю других, заливай на гитхаб исходники .
будет репа, будет! НО потом

Цитата:
Сообщение от Capsaicin Посмотреть сообщение
...
Хочешь более управляемого интерфейса - откажись от винформс, используй впф. ВПФ более гибкий, позволит тебе нормально привязывать данные к интерфейсу. Но для этого придётся почитать про паттерны проектирования...
ну тада потом. может в новом приложении

Цитата:
Сообщение от Capsaicin Посмотреть сообщение
...
А зачем кнопка посчитать? Легче было бы пользоваться если бы шёл автоматический рассчёт, как мне кажется...
посмотрю в эту сторону

Цитата:
Сообщение от Capsaicin Посмотреть сообщение
... вместо модалок с сообщениями об ошибках показывать уведомления прям на главной форме...
прикольно! замучу...

p.s.: Благодарю!
__________________
"любой вопрос имеет право на жизнь, любой человек может ошибаться или не знать каких-то простых вещей" © serr (lubuntu.ru)

Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
Мальчик сказал папе: “Я хочу кушать”. Папа отправил его к маме.
Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
И бегал так мальчик, пока в один момент не упал.
Что случилось с мальчиком? TTL кончился.


три слова - это два слова! © banda agency Киев
Ответить с цитированием
  #45  
Старый 12.04.2022, 13:29
Аватар для Capsaicin
Capsaicin Capsaicin вне форума
Прапорщик
 
Регистрация: 13.11.2014
Сообщений: 308
Спасибо: 239
Capsaicin стоит на развилке
По умолчанию

Цитата:
Сообщение от Neil Посмотреть сообщение
а я думал оставить так. вдруг кому то захочется чего-нибудь копирнуть оттуда
Так ты и оставь текстбоксы, только проставь флаг ридонли. Пользователю можно будет выделять, копировать, но не изменять.
__________________
Только ситхи всё возводят в абсолют.
Ответить с цитированием
  #46  
Старый 12.04.2022, 16:50
BigO BigO вне форума
Рядовой
 
Регистрация: 31.08.2016
Сообщений: 36
Спасибо: 42
BigO стоит на развилке
По умолчанию

Цитата:
Сообщение от Capsaicin Посмотреть сообщение
А зачем кнопка посчитать? Легче было бы пользоваться если бы шёл автоматический рассчёт, как мне кажется. А вместо модалок с сообщениями об ошибках показывать уведомления прям на главной форме.
Тоже про это в первом отзыве писал, пока не хочет, но ничего, к какой-нибудь итерации и до такого рокет сайнса дойдем)

Цитата:
Сообщение от Neil Посмотреть сообщение
вход: 192.168.0.1/28
выход: 14 хостов + адрес сети и броадкаст = 16

вход: делим на 2 подсети
выход: 2 сети по 6 хостов = 12 + 2 (к одной добавляется броадкаст, к другой адрес сети) + 2 адреса (первый и последний) исходной сети = 16

вход: делим на 8 подсетей
выход: 8 подсетей с адресами самих сетей и первым IP, он же и последний (считай броадкаст)
хостов в такой сети нет если же посчитать общее кол-во адресов в 8 подсетях,
то получим 16
Вот это все бы в явном виде. Мол, вот адреса такие, вот эти для этого, а эти и использовать можно. Когда у тебя просто показывается первый адрес сети и пустота в остальных местах - страшно. А подсети с 0 хостов имеют вообще смысл? Имею в виду: есть ли смысл давать выбирать такие конфигурации тогда? Может лучше тоже ошибку показывать?

Цитата:
Сообщение от Neil Посмотреть сообщение
будет репа, будет! НО потом
Не надо стесняться своего кода, если оно компилируется, запускается и выполняет свою работу - это уже лучше, чем многие пишут в продакшн за деньги.
Ответить с цитированием
Этот пользователь поблагодарил BigO(а) за это полезное сообщение:
Capsaicin (12.04.2022)
  #47  
Старый 12.04.2022, 17:06
Аватар для Neil
Neil Neil вне форума
Генерал-Полковник
 
Регистрация: 26.01.2008
Сообщений: 7,370
Спасибо: 2,904
Neil стоит на развилке
Лампочка

Цитата:
Сообщение от Capsaicin Посмотреть сообщение
Так ты и оставь текстбоксы, только проставь флаг ридонли. Пользователю можно будет выделять, копировать, но не изменять.
Вложение 91980
__________________
"любой вопрос имеет право на жизнь, любой человек может ошибаться или не знать каких-то простых вещей" © serr (lubuntu.ru)

Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
Мальчик сказал папе: “Я хочу кушать”. Папа отправил его к маме.
Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
И бегал так мальчик, пока в один момент не упал.
Что случилось с мальчиком? TTL кончился.


три слова - это два слова! © banda agency Киев

Последний раз редактировалось Neil; 03.05.2022 в 13:21.
Ответить с цитированием
  #48  
Старый 12.04.2022, 21:27
Аватар для Neil
Neil Neil вне форума
Генерал-Полковник
 
Регистрация: 26.01.2008
Сообщений: 7,370
Спасибо: 2,904
Neil стоит на развилке
Лампочка

Цитата:
Сообщение от BigO Посмотреть сообщение
...
Вот это все бы в явном виде. Мол, вот адреса такие, вот эти для этого, а эти и использовать можно...
в этом и была задумка - показать новичку / интересующемуся как всё происходит,
НО выше меня подтолкнули к минимализму
добавлю и примеры побитовых операций, НО! мне кажется это может только запутать

Цитата:
Сообщение от BigO Посмотреть сообщение
... Когда у тебя просто показывается первый адрес сети и пустота в остальных местах - страшно. А подсети с 0 хостов имеют вообще смысл? Имею в виду: есть ли смысл давать выбирать такие конфигурации тогда? Может лучше тоже ошибку показывать?...
а в SOHO маршрутизаторах со стандартным 192.168.1.1 можно выбрать подсеть 255.255.255.254?
я бы попробовал. НО мне завтра ещё работать в моём 841n есть рандом по маске.
НО не хочется перенастраивать... в итоге для этого есть и такой функционал в моём приложении

сети с 0 хостов имеют смысл. их можно посчитать

Цитата:
Сообщение от BigO Посмотреть сообщение
... Не надо стесняться своего кода, если оно компилируется, запускается и выполняет свою работу - это уже лучше, чем многие пишут в продакшн за деньги.
Благодарю. я не из-за стеснения. у меня руки не доходят
можно проще

...
using System;
using System.Net;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Netuter
{
public partial class Glavnoe_Okno : Form
{
struct Net
{
public byte[] ip;
public byte[] maska;
public byte[] wildcard;
public byte biti_v_maske;
public ulong hosti;
public byte[] set;
public byte[] minip;
public byte[] broadcast;
public byte[] maxip;
}
public Glavnoe_Okno()
{
InitializeComponent();
Pole_Vvoda_IP.SelectedItem = "192.168.0.1";
Pole_Vvoda_Maski.SelectedItem = "255.255.255.0";
Pole_KolVo_Podsetei.SelectedItem = "4";
}
private void Glavnoe_Okno_Load(object sender, EventArgs e)
{}
private void Poschitat_Click(object sender, EventArgs e)
{
Pole_Vivoda_Bit_V_Maske.Clear();
Pole_Vivoda_Seti.Clear();
Pole_Vivoda_Broadcast.Clear();
Pole_Vivoda_Wildcard.Clear();
Pole_Vivoda_MinIP.Clear();
Pole_Vivoda_MaxIP.Clear();
Pole_Vivoda_Hostov.Clear();

Net set;

try
{
set = Obiect_set(Pole_Vvoda_IP.Text, Pole_Vvoda_Maski.Text.Substring(Pole_Vvoda_Maski.Text.IndexOf('-') + 2));
}
catch (Exception)
{
return;
}

if (Proverka_Maski_I_IP(set) == false)
{
return;
}

Pole_Vivoda_Bit_V_Maske.Text = set.biti_v_maske.ToString();
Pole_Vivoda_Seti.Text = $"{set.set[0]}.{set.set[1]}.{set.set[2]}.{set.set[3]}";
Pole_Vivoda_Broadcast.Text = $"{set.broadcast[0]}.{set.broadcast[1]}.{set.broadcast[2]}.{set.broadcast[3]}";
Pole_Vivoda_Wildcard.Text = $"{set.wildcard[0]}.{set.wildcard[1]}.{set.wildcard[2]}.{set.wildcard[3]}";
Pole_Vivoda_MinIP.Text = $"{set.minip[0]}.{set.minip[1]}.{set.minip[2]}.{set.minip[3]}";
Pole_Vivoda_MaxIP.Text = $"{set.maxip[0]}.{set.maxip[1]}.{set.maxip[2]}.{set.maxip[3]}";

if (set.maxip[0] == set.set[0])
{
if (set.maxip[1] == set.set[1])
{
if (set.maxip[2] == set.set[2])
{
if (set.maxip[3] == set.set[3])
{
Pole_Vivoda_MaxIP.Text = "--//--//--";
}
}
}
}

if (set.biti_v_maske == 32)
{
Pole_Vivoda_Broadcast.Text = "--//--//--";
Pole_Vivoda_MinIP.Text = "--//--//--";
Pole_Vivoda_MaxIP.Text = "--//--//--";
}

Pole_Vivoda_Hostov.Text = set.hosti.ToString(); Pole_Vivoda_Hostov.Enabled = true;

uint kolvo_setei = uint.Parse(Pole_KolVo_Podsetei.Text);

ulong shag = (set.hosti + 2) / (kolvo_setei);

if (2 > shag)
{
Ne_Hvataet_Hostov malo_hostov = new Ne_Hvataet_Hostov();

malo_hostov.ShowDialog();

return;
}

for (int i = 0; i < Kvadratnii_Koren(kolvo_setei); i++)
{
set.maska = Pribavliaem_Bit_K_Maske(set.maska);
}

set = Obiect_set(set.minip, set.maska);

list_Vivod_Podsetei.Items.Clear();

for (int i = 0; i < kolvo_setei; i++)
{
ListViewItem lv = new ListViewItem(new string[] {
$"{set.minip[0]}.{set.minip[1]}.{set.minip[2]}.{set.minip[3]}",
$"{set.maxip[0]}.{set.maxip[1]}.{set.maxip[2]}.{set.maxip[3]}",
$"{set.maska[0]}.{set.maska[1]}.{set.maska[2]}.{set.maska[3]}",
$"{set.set[0]}.{set.set[1]}.{set.set[2]}.{set.set[3]}",
set.hosti.ToString() });

if (set.maxip[0] == set.set[0])
{
if (set.maxip[1] == set.set[1])
{
if (set.maxip[2] == set.set[2])
{
if (set.maxip[3] == set.set[3])
{
lv = new ListViewItem(new string[] {
$"{set.minip[0]}.{set.minip[1]}.{set.minip[2]}.{set.minip[3]}",
"--//--//--",
$"{set.maska[0]}.{set.maska[1]}.{set.maska[2]}.{set.maska[3]}",
$"{set.set[0]}.{set.set[1]}.{set.set[2]}.{set.set[3]}",
set.hosti.ToString() });
}
}
}
}

list_Vivod_Podsetei.Items.Add(lv);

set = Obiect_set(Pribavliaem_Biti_K_IP(set.ip, shag), set.maska);
}
}
static byte[] Ocifrovka_IP(string stroka_s_ip)
{
Regex shablon_dlia_proverki_vvedennogo_ip = new Regex(@"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}?$");

byte[] massiv_ip;

if (shablon_dlia_proverki_vvedennogo_ip.IsMatch(stroka_s_ip))
{
IPAddress ip_adres;

IPAddress.TryParse(stroka_s_ip, out ip_adres);

if (ip_adres != null)
{
massiv_ip = IPAddress.Parse(stroka_s_ip).GetAddressBytes();
}
else
{
Ne_Pravilnii_IP plohoi_ip = new Ne_Pravilnii_IP();

plohoi_ip.ShowDialog();

return null;
}
}
else
{
Ne_Pravilnii_IP plohoi_ip = new Ne_Pravilnii_IP();

plohoi_ip.ShowDialog();

return null;
}

return massiv_ip;
}
static byte[] Wildcard(byte[] maska)
{
byte[] wildcard = { 0, 0, 0, 0 };

wildcard[0] = (byte)(~maska[0]);
wildcard[1] = (byte)(~maska[1]);
wildcard[2] = (byte)(~maska[2]);
wildcard[3] = (byte)(~maska[3]);

return wildcard;
}
static byte Biti_V_Maske(byte[] maska)
{
byte biti_v_maske = 0;

for (int i = 0; i < 4; i++)
{
switch (maska[i])
{
case 255: biti_v_maske += 8; break;
case 254: biti_v_maske += 7; break;
case 252: biti_v_maske += 6; break;
case 248: biti_v_maske += 5; break;
case 240: biti_v_maske += 4; break;
case 224: biti_v_maske += 3; break;
case 192: biti_v_maske += 2; break;
case 128: biti_v_maske += 1; break;
default: break;
}
}

return biti_v_maske;
}
static ulong Hosti(byte biti_v_maske)
{
ulong hosti = 1;

if (biti_v_maske == 32)
{
return hosti = 0;
}

for (int i = 0; i < 32 - biti_v_maske; i++)
{
hosti <<= 1;
}

hosti -= 2;

return hosti;
}
static byte[] Set(byte[] ip, byte[] maska)
{
byte[] set = { 0, 0, 0, 0 };

set[0] = (byte)(ip[0] & maska[0]);
set[1] = (byte)(ip[1] & maska[1]);
set[2] = (byte)(ip[2] & maska[2]);
set[3] = (byte)(ip[3] & maska[3]);

return set;
}
static byte[] MinIP(byte[] set)
{
byte[] minip = { 0, 0, 0, 0 };

minip[0] = set[0];
minip[1] = set[1];
minip[2] = set[2];
minip[3] = set[3];

minip[3]++;

return minip;
}
static byte[] Broadcast(byte[] set, byte[] wildcard)
{
byte[] broadcast = { 0, 0, 0, 0 };

broadcast[0] = (byte)(set[0] + wildcard[0]);
broadcast[1] = (byte)(set[1] + wildcard[1]);
broadcast[2] = (byte)(set[2] + wildcard[2]);
broadcast[3] = (byte)(set[3] + wildcard[3]);

return broadcast;
}
static byte[] MaxIP(byte[] broadcast)
{
byte[] maxip = { 0, 0, 0, 0 };

maxip[0] = broadcast[0];
maxip[1] = broadcast[1];
maxip[2] = broadcast[2];
maxip[3] = broadcast[3];

maxip[3]--;

return maxip;
}
static Net Obiect_set(string ip, string maska)
{
Net set;

set.ip = Ocifrovka_IP(ip);
set.maska = Ocifrovka_IP(maska);
set.wildcard = Wildcard(set.maska);
set.biti_v_maske = Biti_V_Maske(set.maska);
set.hosti = Hosti(set.biti_v_maske);
set.set = Set(set.ip, set.maska);
set.minip = MinIP(set.set);
set.broadcast = Broadcast(set.set, set.wildcard);
set.maxip = MaxIP(set.broadcast);

return set;
}
static Net Obiect_set(byte[] ip, byte[] maska)
{
Net set;

set.ip = ip;
set.maska = maska;
set.wildcard = Wildcard(set.maska);
set.biti_v_maske = Biti_V_Maske(set.maska);
set.hosti = Hosti(set.biti_v_maske);
set.set = Set(set.ip, set.maska);
set.minip = MinIP(set.set);
set.broadcast = Broadcast(set.set, set.wildcard);
set.maxip = MaxIP(set.broadcast);

return set;
}
static bool Proverka_Maski_I_IP(Net set)
{
if (set.ip[0] == 192)
{
if (set.biti_v_maske < 16)
{
Ne_Pravilnaia_Maska plohaia_maska = new Ne_Pravilnaia_Maska();

plohaia_maska.ShowDialog();

return false;
}
}

if (set.ip[0] == 172)
{
if (set.biti_v_maske < 12)
{
Ne_Pravilnaia_Maska plohaia_maska = new Ne_Pravilnaia_Maska();

plohaia_maska.ShowDialog();

return false;
}
}

if (set.ip[0] == 10)
{
if (set.biti_v_maske < 8)
{
Ne_Pravilnaia_Maska plohaia_maska = new Ne_Pravilnaia_Maska();

plohaia_maska.ShowDialog();

return false;
}
}

return true;
}
static byte[] Pribavliaem_Bit_K_Maske(byte[] maska)
{
byte[] novaia_maska = { 0, 0, 0, 0 };

novaia_maska[0] = maska[0];
novaia_maska[1] = maska[1];
novaia_maska[2] = maska[2];
novaia_maska[3] = maska[3];

for (int i = 0; i < 4; i++)
{
switch (novaia_maska[i])
{
case 0: novaia_maska[i] = 128; return novaia_maska;
case 128: novaia_maska[i] = 192; return novaia_maska;
case 192: novaia_maska[i] = 224; return novaia_maska;
case 224: novaia_maska[i] = 240; return novaia_maska;
case 240: novaia_maska[i] = 248; return novaia_maska;
case 248: novaia_maska[i] = 252; return novaia_maska;
case 252: novaia_maska[i] = 254; return novaia_maska;
case 254: novaia_maska[i] = 255; return novaia_maska;
default: break;
}
}

return novaia_maska;
}
static byte[] Pribavliaem_Biti_K_IP(byte[] ip, ulong kolichestvo_bit)
{
byte[] novii_ip = { 0, 0, 0, 0 };

novii_ip[0] = ip[0];
novii_ip[1] = ip[1];
novii_ip[2] = ip[2];
novii_ip[3] = ip[3];

for (ulong i = 0; i < kolichestvo_bit; i++)
{
if (novii_ip[3] == 255)
{
if (novii_ip[2] == 255)
{
if (novii_ip[1] == 255)
{
novii_ip[3] = 0;
novii_ip[2] = 0;
novii_ip[1] = 0;
novii_ip[0]++;
}
else
{
novii_ip[3] = 0;
novii_ip[2] = 0;
novii_ip[1]++;
}
}
else
{
novii_ip[3] = 0;
novii_ip[2]++;
}
}
else
{
novii_ip[3]++;
}
}

return novii_ip;
}
static uint Kvadratnii_Koren(uint kolvo_setei)
{
uint count = 0;

while (true)
{
if (kolvo_setei == 1 || kolvo_setei == 0)
{
return count;
}

kolvo_setei = kolvo_setei / 2;

count++;
}
}
}
}
__________________
"любой вопрос имеет право на жизнь, любой человек может ошибаться или не знать каких-то простых вещей" © serr (lubuntu.ru)

Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
Мальчик сказал папе: “Я хочу кушать”. Папа отправил его к маме.
Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
И бегал так мальчик, пока в один момент не упал.
Что случилось с мальчиком? TTL кончился.


три слова - это два слова! © banda agency Киев
Ответить с цитированием
  #49  
Старый 13.04.2022, 00:14
Аватар для Копатель
Копатель Копатель вне форума
Майор
 
Регистрация: 16.11.2010
Сообщений: 2,734
Спасибо: 2,165
Копатель стоит на развилке
По умолчанию

Не обязательно же все на одну форму лепить. Примеры можно сделать во всплывающих сообщениях (к полям). Или в отдельном окне (типа справки).
Ответить с цитированием
  #50  
Старый 13.04.2022, 22:24
Аватар для Neil
Neil Neil вне форума
Генерал-Полковник
 
Регистрация: 26.01.2008
Сообщений: 7,370
Спасибо: 2,904
Neil стоит на развилке
Лампочка

Цитата:
Сообщение от Копатель Посмотреть сообщение
Не обязательно же все на одну форму лепить. Примеры можно сделать во всплывающих сообщениях (к полям). Или в отдельном окне (типа справки).
с самого начала хотел сделать некое подобие справочной информации
и подспудного материала для начинающих / интересующихся.

как показала практика - в обратной связи мне проще всего работать попунктно (Спасибо BigO )

я понимаю, что программисты != сисадмины.

отсюда интерес

напишите что Вам не понятно и что нужно сделать, чтобы было понятнее.

попунктно!

а я разберусь
__________________
"любой вопрос имеет право на жизнь, любой человек может ошибаться или не знать каких-то простых вещей" © serr (lubuntu.ru)

Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
Мальчик сказал папе: “Я хочу кушать”. Папа отправил его к маме.
Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
И бегал так мальчик, пока в один момент не упал.
Что случилось с мальчиком? TTL кончился.


три слова - это два слова! © banda agency Киев
Ответить с цитированием
  #51  
Старый 17.04.2022, 13:25
Аватар для Neil
Neil Neil вне форума
Генерал-Полковник
 
Регистрация: 26.01.2008
Сообщений: 7,370
Спасибо: 2,904
Neil стоит на развилке
Лампочка

- ушёл от текст-боксов
- перенёс инфо-сообщения в главное окно, т. о. избавился от лишних окон
- навёл косметику. вроде получше...

Вложение 91984

...
using System;
using System.Net;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace Netuter
{
public partial class Glavnoe_Okno : Form
{
struct Net
{
public byte[] ip;
public byte[] maska;
public byte[] wildcard;
public byte biti_v_maske;
public ulong hosti;
public byte[] set;
public byte[] minip;
public byte[] broadcast;
public byte[] maxip;
}
public Glavnoe_Okno()
{
InitializeComponent();
Pole_Vvoda_IP.SelectedItem = "192.168.0.1";
Pole_Vvoda_Maski.SelectedItem = "255.255.255.0";
Pole_KolVo_Podsetei.SelectedItem = "4";
}
private void Glavnoe_Okno_Load(object sender, EventArgs e)
{

}
private void Poschitat_Click(object sender, EventArgs e)
{
label_Error.Text = "";

Net set;

try
{
set = Obiect_set(Pole_Vvoda_IP.Text, Pole_Vvoda_Maski.Text.Substring(Pole_Vvoda_Maski.Text.IndexOf('-') + 2));
}
catch (Exception)
{
return;
}

if (Proverka_Maski_I_IP(set) == false)
{
return;
}

label_Bit_V_Maske.Text = set.biti_v_maske.ToString();
label_Vivoda_Seti.Text = $"{set.set[0]}.{set.set[1]}.{set.set[2]}.{set.set[3]}";
label_Vivoda_Broadcast.Text = $"{set.broadcast[0]}.{set.broadcast[1]}.{set.broadcast[2]}.{set.broadcast[3]}";
label_Vivoda_Wildcard.Text = $"{set.wildcard[0]}.{set.wildcard[1]}.{set.wildcard[2]}.{set.wildcard[3]}";
label_Vivoda_MinIP.Text = $"{set.minip[0]}.{set.minip[1]}.{set.minip[2]}.{set.minip[3]}";
label_Vivoda_MaxIP.Text = $"{set.maxip[0]}.{set.maxip[1]}.{set.maxip[2]}.{set.maxip[3]}";

if (set.maxip[0] == set.set[0])
{
if (set.maxip[1] == set.set[1])
{
if (set.maxip[2] == set.set[2])
{
if (set.maxip[3] == set.set[3])
{
label_Vivoda_MaxIP.Text = "----------------";
}
}
}
}

if (set.biti_v_maske == 32)
{
label_Vivoda_Broadcast.Text = "----------------";
label_Vivoda_MinIP.Text = "----------------";
label_Vivoda_MaxIP.Text = "----------------";
}

label_Vivoda_Hostov.Text = set.hosti.ToString();

uint kolvo_setei = uint.Parse(Pole_KolVo_Podsetei.Text);

ulong shag = (set.hosti + 2) / (kolvo_setei);

if (2 > shag)
{
label_Error.Text = "Количество хостов исходной сети меньше, чем в желаемых";
label_Error.Left = (groupBox_Vhodnie_dannie.Width - label_Error.Width) >> 1;

return;
}

for (int i = 0; i < Kvadratnii_Koren(kolvo_setei); i++)
{
set.maska = Pribavliaem_Bit_K_Maske(set.maska);
}

set = Obiect_set(set.minip, set.maska);

list_Vivod_Podsetei.Items.Clear();

for (int i = 0; i < kolvo_setei; i++)
{
ListViewItem lv = new ListViewItem(new string[] {
$"{set.minip[0]}.{set.minip[1]}.{set.minip[2]}.{set.minip[3]}",
$"{set.maxip[0]}.{set.maxip[1]}.{set.maxip[2]}.{set.maxip[3]}",
$"{set.maska[0]}.{set.maska[1]}.{set.maska[2]}.{set.maska[3]}",
$"{set.set[0]}.{set.set[1]}.{set.set[2]}.{set.set[3]}",
set.hosti.ToString() });

if (set.maxip[0] == set.set[0])
{
if (set.maxip[1] == set.set[1])
{
if (set.maxip[2] == set.set[2])
{
if (set.maxip[3] == set.set[3])
{
lv = new ListViewItem(new string[] {
$"{set.minip[0]}.{set.minip[1]}.{set.minip[2]}.{set.minip[3]}",
"----------------",
$"{set.maska[0]}.{set.maska[1]}.{set.maska[2]}.{set.maska[3]}",
$"{set.set[0]}.{set.set[1]}.{set.set[2]}.{set.set[3]}",
set.hosti.ToString() });
}
}
}
}

list_Vivod_Podsetei.Items.Add(lv);

set = Obiect_set(Pribavliaem_Biti_K_IP(set.ip, shag), set.maska);
}
}
byte[] Ocifrovka_IP(string stroka_s_ip)
{
Regex shablon_dlia_proverki_vvedennogo_ip = new Regex(@"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}?$");

byte[] massiv_ip;

if (shablon_dlia_proverki_vvedennogo_ip.IsMatch(stroka_s_ip))
{
IPAddress ip_adres;

IPAddress.TryParse(stroka_s_ip, out ip_adres);

if (ip_adres != null)
{
massiv_ip = IPAddress.Parse(stroka_s_ip).GetAddressBytes();
}
else
{
label_Error.Text = "Введён не верный IP";
label_Error.Left = (groupBox_Vhodnie_dannie.Width - label_Error.Width) >> 1;

return null;
}
}
else
{
label_Error.Text = "Введён не верный IP";
label_Error.Left = (groupBox_Vhodnie_dannie.Width - label_Error.Width) >> 1;

return null;
}

return massiv_ip;
}
static byte[] Wildcard(byte[] maska)
{
byte[] wildcard = { 0, 0, 0, 0 };

wildcard[0] = (byte)(~maska[0]);
wildcard[1] = (byte)(~maska[1]);
wildcard[2] = (byte)(~maska[2]);
wildcard[3] = (byte)(~maska[3]);

return wildcard;
}
static byte Biti_V_Maske(byte[] maska)
{
byte biti_v_maske = 0;

for (int i = 0; i < 4; i++)
{
switch (maska[i])
{
case 255: biti_v_maske += 8; break;
case 254: biti_v_maske += 7; break;
case 252: biti_v_maske += 6; break;
case 248: biti_v_maske += 5; break;
case 240: biti_v_maske += 4; break;
case 224: biti_v_maske += 3; break;
case 192: biti_v_maske += 2; break;
case 128: biti_v_maske += 1; break;
default: break;
}
}

return biti_v_maske;
}
static ulong Hosti(byte biti_v_maske)
{
ulong hosti = 1;

if (biti_v_maske == 32)
{
return hosti = 0;
}

for (int i = 0; i < 32 - biti_v_maske; i++)
{
hosti <<= 1;
}

hosti -= 2;

return hosti;
}
static byte[] Set(byte[] ip, byte[] maska)
{
byte[] set = { 0, 0, 0, 0 };

set[0] = (byte)(ip[0] & maska[0]);
set[1] = (byte)(ip[1] & maska[1]);
set[2] = (byte)(ip[2] & maska[2]);
set[3] = (byte)(ip[3] & maska[3]);

return set;
}
static byte[] MinIP(byte[] set)
{
byte[] minip = { 0, 0, 0, 0 };

minip[0] = set[0];
minip[1] = set[1];
minip[2] = set[2];
minip[3] = set[3];

minip[3]++;

return minip;
}
static byte[] Broadcast(byte[] set, byte[] wildcard)
{
byte[] broadcast = { 0, 0, 0, 0 };

broadcast[0] = (byte)(set[0] + wildcard[0]);
broadcast[1] = (byte)(set[1] + wildcard[1]);
broadcast[2] = (byte)(set[2] + wildcard[2]);
broadcast[3] = (byte)(set[3] + wildcard[3]);

return broadcast;
}
static byte[] MaxIP(byte[] broadcast)
{
byte[] maxip = { 0, 0, 0, 0 };

maxip[0] = broadcast[0];
maxip[1] = broadcast[1];
maxip[2] = broadcast[2];
maxip[3] = broadcast[3];

maxip[3]--;

return maxip;
}
Net Obiect_set(string ip, string maska)
{
Net set;

set.ip = Ocifrovka_IP(ip);
set.maska = Ocifrovka_IP(maska);
set.wildcard = Wildcard(set.maska);
set.biti_v_maske = Biti_V_Maske(set.maska);
set.hosti = Hosti(set.biti_v_maske);
set.set = Set(set.ip, set.maska);
set.minip = MinIP(set.set);
set.broadcast = Broadcast(set.set, set.wildcard);
set.maxip = MaxIP(set.broadcast);

return set;
}
static Net Obiect_set(byte[] ip, byte[] maska)
{
Net set;

set.ip = ip;
set.maska = maska;
set.wildcard = Wildcard(set.maska);
set.biti_v_maske = Biti_V_Maske(set.maska);
set.hosti = Hosti(set.biti_v_maske);
set.set = Set(set.ip, set.maska);
set.minip = MinIP(set.set);
set.broadcast = Broadcast(set.set, set.wildcard);
set.maxip = MaxIP(set.broadcast);

return set;
}
bool Proverka_Maski_I_IP(Net set)
{
if (set.ip[0] == 192)
{
if (set.biti_v_maske < 16)
{
label_Error.Text = "Для сети 192.168.0.0 минимальная маска 255.255.0.0";
label_Error.Left = (groupBox_Vhodnie_dannie.Width - label_Error.Width) >> 1;

return false;
}
}

if (set.ip[0] == 172)
{
if (set.biti_v_maske < 12)
{
label_Error.Text = "Для сети 172.16.0.0 минимальная маска 255.240.0.0";
label_Error.Left = (groupBox_Vhodnie_dannie.Width - label_Error.Width) >> 1;

return false;
}
}

if (set.ip[0] == 10)
{
if (set.biti_v_maske < 8)
{
label_Error.Text = "Для сети 10.0.0.0 минимальная маска 255.0.0.0";
label_Error.Left = (groupBox_Vhodnie_dannie.Width - label_Error.Width) >> 1;

return false;
}
}

return true;
}
static byte[] Pribavliaem_Bit_K_Maske(byte[] maska)
{
byte[] novaia_maska = { 0, 0, 0, 0 };

novaia_maska[0] = maska[0];
novaia_maska[1] = maska[1];
novaia_maska[2] = maska[2];
novaia_maska[3] = maska[3];

for (int i = 0; i < 4; i++)
{
switch (novaia_maska[i])
{
case 0: novaia_maska[i] = 128; return novaia_maska;
case 128: novaia_maska[i] = 192; return novaia_maska;
case 192: novaia_maska[i] = 224; return novaia_maska;
case 224: novaia_maska[i] = 240; return novaia_maska;
case 240: novaia_maska[i] = 248; return novaia_maska;
case 248: novaia_maska[i] = 252; return novaia_maska;
case 252: novaia_maska[i] = 254; return novaia_maska;
case 254: novaia_maska[i] = 255; return novaia_maska;
default: break;
}
}

return novaia_maska;
}
static byte[] Pribavliaem_Biti_K_IP(byte[] ip, ulong kolichestvo_bit)
{
byte[] novii_ip = { 0, 0, 0, 0 };

novii_ip[0] = ip[0];
novii_ip[1] = ip[1];
novii_ip[2] = ip[2];
novii_ip[3] = ip[3];

for (ulong i = 0; i < kolichestvo_bit; i++)
{
if (novii_ip[3] == 255)
{
if (novii_ip[2] == 255)
{
if (novii_ip[1] == 255)
{
novii_ip[3] = 0;
novii_ip[2] = 0;
novii_ip[1] = 0;
novii_ip[0]++;
}
else
{
novii_ip[3] = 0;
novii_ip[2] = 0;
novii_ip[1]++;
}
}
else
{
novii_ip[3] = 0;
novii_ip[2]++;
}
}
else
{
novii_ip[3]++;
}
}

return novii_ip;
}
static uint Kvadratnii_Koren(uint kolvo_setei)
{
uint count = 0;

while (true)
{
if (kolvo_setei == 1 || kolvo_setei == 0)
{
return count;
}

kolvo_setei = kolvo_setei / 2;

count++;
}
}
}
}
__________________
"любой вопрос имеет право на жизнь, любой человек может ошибаться или не знать каких-то простых вещей" © serr (lubuntu.ru)

Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
Мальчик сказал папе: “Я хочу кушать”. Папа отправил его к маме.
Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
И бегал так мальчик, пока в один момент не упал.
Что случилось с мальчиком? TTL кончился.


три слова - это два слова! © banda agency Киев

Последний раз редактировалось Neil; 03.05.2022 в 13:21.
Ответить с цитированием
  #52  
Старый 17.04.2022, 17:54
Аватар для Neil
Neil Neil вне форума
Генерал-Полковник
 
Регистрация: 26.01.2008
Сообщений: 7,370
Спасибо: 2,904
Neil стоит на развилке
Лампочка

немного поправил

Вложение 91986
__________________
"любой вопрос имеет право на жизнь, любой человек может ошибаться или не знать каких-то простых вещей" © serr (lubuntu.ru)

Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
Мальчик сказал папе: “Я хочу кушать”. Папа отправил его к маме.
Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
И бегал так мальчик, пока в один момент не упал.
Что случилось с мальчиком? TTL кончился.


три слова - это два слова! © banda agency Киев

Последний раз редактировалось Neil; 03.05.2022 в 13:21.
Ответить с цитированием
  #53  
Старый 17.04.2022, 19:18
Аватар для Копатель
Копатель Копатель вне форума
Майор
 
Регистрация: 16.11.2010
Сообщений: 2,734
Спасибо: 2,165
Копатель стоит на развилке
По умолчанию

Гит. Тебе нужен гит. Хотя бы локально. Вон уже сколько версий приложений было. Самому же удобнее будет.

P.S. И версионность вести было бы неплохо. С изменениями от версии к версии (ну типа как ты тут пишешь, только в changelog). Потом прикольно будет, через пару лет наткнешься на исходник и будет приятно вспомнить эту историю эволюции отдельно взятого приложения. Мы для своих продуктов используем семантическое версионирование. Почитай. Интересная концепция, оказалась довольно удобной.

Последний раз редактировалось Копатель; 17.04.2022 в 21:15.
Ответить с цитированием
  #54  
Старый 18.04.2022, 18:54
Аватар для Letum
Letum Letum вне форума
Лейтенант
 
Регистрация: 19.10.2006
Адрес: Рубцовск
Сообщений: 741
Спасибо: 241
Letum стоит на развилке
По умолчанию

читать больно из-за отсутствия форматирования кода, имена переменных транслитом с кирилицы - тоже такое себе. плюс винформ уже устарел. если цель - прокачаться, то для десктопа WPF с паттерном MVVM (он уже по ситуации но ознакомиться обязательно), там же про WCF можно прочитать, хоть он сейчас и смотрится аскетично и очень вредный, либо, если кровавый интерпрайс, то тенденция на веб-приложения и тут уже asp.net core + MVC. а второй вариант заставит ещё и html+css минимум подучить, хотя б на базовом уровне, что б натянуть тот же boostrap. ну и очень часто БД нужны, т.е. уже либо t-sql и запросы сложнее "select * from table1", с обобщёнками, времянками, табличными переменными и т.д. либо pl/pgsql т.к. с тенденцией на импортозамещение постгрес становится стандартом для многих компаний. без гита как уже раньше говорили - нафиг надо оценивать код, физически больно
Ответить с цитированием
  #55  
Старый 18.04.2022, 19:09
Аватар для Neil
Neil Neil вне форума
Генерал-Полковник
 
Регистрация: 26.01.2008
Сообщений: 7,370
Спасибо: 2,904
Neil стоит на развилке
Лампочка

Вложение 91988

- добавил пояснения при ошибках в выборе IP/Маски
- https://github.com/Intern-box/Netute...lavnoe_Okno.cs
__________________
"любой вопрос имеет право на жизнь, любой человек может ошибаться или не знать каких-то простых вещей" © serr (lubuntu.ru)

Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
Мальчик сказал папе: “Я хочу кушать”. Папа отправил его к маме.
Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
И бегал так мальчик, пока в один момент не упал.
Что случилось с мальчиком? TTL кончился.


три слова - это два слова! © banda agency Киев

Последний раз редактировалось Neil; 03.05.2022 в 13:21.
Ответить с цитированием
Эти 3 пользователей(ля) поблагодарили Neil за это полезное сообщение:
BigO (19.04.2022), Capsaicin (18.04.2022), Копатель (18.04.2022)
  #56  
Старый 18.04.2022, 19:26
Аватар для Дем
Дем Дем вне форума
Лейтенант
 
Регистрация: 13.11.2010
Адрес: алейскый
Сообщений: 790
Спасибо: 272
Дем стоит на развилке
По умолчанию

нейминг потешный) хоть и информативный)
__________________


Ответить с цитированием
  #57  
Старый 18.04.2022, 19:31
Аватар для Neil
Neil Neil вне форума
Генерал-Полковник
 
Регистрация: 26.01.2008
Сообщений: 7,370
Спасибо: 2,904
Neil стоит на развилке
Радость

Цитата:
Сообщение от Дем Посмотреть сообщение
нейминг потешный) хоть и информативный)


а мне нравится
__________________
"любой вопрос имеет право на жизнь, любой человек может ошибаться или не знать каких-то простых вещей" © serr (lubuntu.ru)

Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
Мальчик сказал папе: “Я хочу кушать”. Папа отправил его к маме.
Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
И бегал так мальчик, пока в один момент не упал.
Что случилось с мальчиком? TTL кончился.


три слова - это два слова! © banda agency Киев
Ответить с цитированием
  #58  
Старый 18.04.2022, 22:00
Аватар для Capsaicin
Capsaicin Capsaicin вне форума
Прапорщик
 
Регистрация: 13.11.2014
Сообщений: 308
Спасибо: 239
Capsaicin стоит на развилке
По умолчанию

Цитата:
Сообщение от Letum Посмотреть сообщение
читать больно из-за отсутствия форматирования кода, имена переменных транслитом с кирилицы - тоже такое себе. плюс винформ уже устарел. если цель - прокачаться, то для десктопа WPF с паттерном MVVM (он уже по ситуации но ознакомиться обязательно), там же про WCF можно прочитать, хоть он сейчас и смотрится аскетично и очень вредный, либо, если кровавый интерпрайс, то тенденция на веб-приложения и тут уже asp.net core + MVC. а второй вариант заставит ещё и html+css минимум подучить, хотя б на базовом уровне, что б натянуть тот же boostrap. ну и очень часто БД нужны, т.е. уже либо t-sql и запросы сложнее "select * from table1", с обобщёнками, времянками, табличными переменными и т.д. либо pl/pgsql т.к. с тенденцией на импортозамещение постгрес становится стандартом для многих компаний. без гита как уже раньше говорили - нафиг надо оценивать код, физически больно
Для маленьких проектиков часто проще использовать nosql вместо sql. Взять JSON да и хранить в нём.
__________________
Только ситхи всё возводят в абсолют.
Ответить с цитированием
  #59  
Старый 19.04.2022, 10:40
Аватар для Capsaicin
Capsaicin Capsaicin вне форума
Прапорщик
 
Регистрация: 13.11.2014
Сообщений: 308
Спасибо: 239
Capsaicin стоит на развилке
По умолчанию

Цитата:
Сообщение от Neil Посмотреть сообщение
Вложение 91988

- добавил пояснения при ошибках в выборе IP/Маски
- https://github.com/Intern-box/Netute...lavnoe_Okno.cs
Отлично! Молодец что учитываешь советы и стараешься развиваться.
Если хочешь улучшить написание кода и нужны комментарии, то вот, что заметил.

Не храни всю логику в одном файле формы. Старайся разделять на логические блоки. На классы, так, чтобы каждый класс был вполне себе понятной логической единицей.

В качестве именования в шарпах в основном используют CamelCase нотацию (но не всегда конечно).

Отсутствие комментариев в коде это нормально, кто бы что ни говорил. Идеальный (которого не существует, кек) код понятно без комментариев благодаря стилю написания и именованию переменных и блоков.

Лучше бы вместо массив байт использовать класс с 4 октетами для описания айпи. И переопределить операции для работы с этим классом.

В методе byte[] Ocifrovka_IP(string stroka_s_ip) незачем использовать регулярку, тем более она в очень общих чертах написана. У тебя дальше по коду есть IPAddress.TryParse(stroka_s_ip, out ip_adres), как раз с помощью него лучше откинуть неподходящие варианты.

Что вызывает вопросы в коде без ответов:
Не понятно, зачем столько раз делаешь битовый сдвиг вправо для позиции контрола с надписью.
Берёшь ширину групбокса, вычитаешь ширину надписи, делаешь битовый сдвиг вправо и это будет позицией надписи?
https://github.com/Intern-box/Netute...e_Okno.cs#L309

Зачем такой способ вычисления квадратного корня (static uint Kvadratnii_Koren(uint kolvo_setei)). Можно же Math.Sqrt и округлить.
__________________
Только ситхи всё возводят в абсолют.
Ответить с цитированием
Эти 2 пользователей(ля) поблагодарили Capsaicin за это полезное сообщение:
BigO (19.04.2022), Копатель (19.04.2022)
  #60  
Старый 19.04.2022, 12:07
Аватар для Neil
Neil Neil вне форума
Генерал-Полковник
 
Регистрация: 26.01.2008
Сообщений: 7,370
Спасибо: 2,904
Neil стоит на развилке
Лампочка

Цитата:
Сообщение от Capsaicin Посмотреть сообщение
...
Не храни всю логику в одном файле формы. Старайся разделять на логические блоки. На классы, так, чтобы каждый класс был вполне себе понятной логической единицей...
кода пока мало. поэтому пока так.
дальше гляну к чему приду...

Цитата:
Сообщение от Capsaicin Посмотреть сообщение
...
В качестве именования в шарпах в основном используют CamelCase нотацию (но не всегда конечно)...
посмотрю как-нибудь

Цитата:
Сообщение от Capsaicin Посмотреть сообщение
...
Отсутствие комментариев в коде это нормально, кто бы что ни говорил. Идеальный (которого не существует, кек) код понятно без комментариев благодаря стилю написания и именованию переменных и блоков...
кода мало. и так всё понятно комментировать нечего пока
методы старался делать не сложными и понятными.
что не понятно, пишите, отвечу

Цитата:
Сообщение от Capsaicin Посмотреть сообщение
...
Лучше бы вместо массив байт использовать класс с 4 октетами для описания айпи. И переопределить операции для работы с этим классом...
чё за класс такой?

Цитата:
Сообщение от Capsaicin Посмотреть сообщение
...
В методе byte[] Ocifrovka_IP(string stroka_s_ip) незачем использовать регулярку, тем более она в очень общих чертах написана. У тебя дальше по коду есть IPAddress.TryParse(stroka_s_ip, out ip_adres), как раз с помощью него лучше откинуть неподходящие варианты...
IPAddress отфильтровывает не всё. пришлось к регулярным обратиться.
на сайте MS об этом есть инфа, НО сходу я не нашёл.

Цитата:
Сообщение от Capsaicin Посмотреть сообщение
...
Не понятно, зачем столько раз делаешь битовый сдвиг вправо для позиции контрола с надписью.
Берёшь ширину групбокса, вычитаешь ширину надписи, делаешь битовый сдвиг вправо и это будет позицией надписи?
https://github.com/Intern-box/Netute...e_Okno.cs#L309...
поправлю. спешил уже не помню, НО на моменте инициализации
выравнивание почему то не сработало. решил так, временно

Цитата:
Сообщение от Capsaicin Посмотреть сообщение
...
Зачем такой способ вычисления квадратного корня (static uint Kvadratnii_Koren(uint kolvo_setei)). Можно же Math.Sqrt и округлить.
смотрел я его. почему то он мне не понравился. не помню почему
__________________
"любой вопрос имеет право на жизнь, любой человек может ошибаться или не знать каких-то простых вещей" © serr (lubuntu.ru)

Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
Мальчик сказал папе: “Я хочу кушать”. Папа отправил его к маме.
Мальчик сказал маме: “Я хочу кушать”. Мама отправила его к папе.
И бегал так мальчик, пока в один момент не упал.
Что случилось с мальчиком? TTL кончился.


три слова - это два слова! © banda agency Киев
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +7, время: 00:05.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot