Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288

Массив объектов абстрактного класса

10.05.2016, 19:00. Показов 5219. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть абстрактный класс с двумя чисто виртуальными методами, от него наследуются два класса в которых эти методы переопределены и есть класс множество, в котором есть массив объектов базового абстрактного класса и нужно выполнить некоторые действия(вставка, удаление, пересечение)
C++
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <iostream>
#include <string>
#include "stdlib.h"
#include "stdio.h"
 
using namespace std;
 
class IObject
{
public:
    virtual bool less(IObject*) = 0;
    virtual IObject *clone() = 0;
};
 
class StringObject: public IObject
{
    string data;
public:
    void setData(string temp);
    string getData();
    bool less(IObject*);
    IObject *clone();
};
 
class IntObject : public IObject
{
    int data;
public:
    void setData(int temp);
    int getData();
    bool less(IObject*);
    IObject *clone();
};
 
void IntObject::setData(int temp)
{
    data = temp;
}
 
int IntObject::getData()
{
    return data;
}
bool IntObject::less(IObject* obj)
{
    if (IntObject *bt = dynamic_cast<IntObject*>(obj))
    {
        return true;
    }
    return false;
}
IObject* IntObject::clone()
{
    IntObject* ret = new IntObject;
    ret->setData(this->getData());
    return ret;
}
 
bool StringObject::less(IObject* obj)
{
    if (StringObject *bt = dynamic_cast<StringObject*>(obj))
    {
        return true;
    }
    return false;
}
void StringObject:: setData(string temp)
{
    data = temp;
}
string StringObject::getData()
{
    return data;
}
 
IObject* StringObject::clone()
{
    StringObject* ret = new StringObject;
    ret->setData(this->getData());
    return ret;
}
 
class set_t{
    IObject* data;
    int size;
public:
    set_t();
    set_t(const set_t &data);
    void insert(IObject* f_data);
    void realloc_plus(char ch);
    int get_size();
    IObject& operator [](size_t pos);
    void show();
};
 
IObject& set_t::operator [](size_t pos)
{
    return data[pos];
}
ostream& operator << (ostream& stream, set_t& str)
{
    for (int i = 0; i < str.get_size(); i++)
        stream << str[i] << " ";
    return stream;
}
 
set_t::set_t()
{
    data = NULL;
    size = 0;
}
void set_t::realloc_plus(char ch)
{
    size++;
    if (ch == 'I')
        data = new IntObject[size];
}
void set_t::insert(IObject *f_data)
{
    realloc_plus('I');
    data = f_data;
}
 
int set_t::get_size()
{
    return size;
}
 
int main()
{
    IntObject intA;
    IObject * p1 = &intA;
    set_t t;
    intA.setData(1);
    t.insert(p1);
    cout << t << endl;
    return 0;
}
Почему у меня не работает выывод? и еще,
C++
1
виртуальная функция должна сравнивать объекты на меньше, что это значит?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.05.2016, 19:00
Ответы с готовыми решениями:

Переопределение конструктора копирования абстрактного класса, на клонирование дочерних объектов
Здравствуйте. Помогите решить следующую проблему. Есть абстрактный класс Object, у которого есть метод AddChild(Object* child)...

Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей на базовый абстрактный класс,...

Динамический массив абстрактного класса
Никак не могу понять, почему память не освобождается. Подскажите в чем ошибка пожалуйста. #ifndef Lol #define Lol #include...

26
1 / 1 / 0
Регистрация: 08.05.2016
Сообщений: 13
10.05.2016, 19:29
Цитата Сообщение от Nike1995 Посмотреть сообщение
виртуальная функция должна сравнивать объекты на меньше, что это значит?
обычное сравнение, как, например, два числа сравнивают
C++
1
2
if (a < b)
   cout << "a < b";
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
10.05.2016, 22:13  [ТС]
kernel_, нет, там что-то другое

Добавлено через 2 часа 23 минуты
Вот, немного переделал. Как перегрузить операторы << и [] для вывода(чтобы посмотреть, правильно ли работают методы)
C++
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
class IObject
{
public: 
    virtual bool less(IObject*) = 0; 
    virtual IObject *clone() = 0;
    IObject *CheckDataType (char* input);
};
 
IObject *IObject::CheckDataType (char* input)
{
    IObject *p;
    if (atoi(input))                
    {
        IntObject in; in.add(atoi(input)); p = &in;
    }
    else
    {
        StringObject in; in.add(input); p = &in;
    }
    return p;
}
 
class IntObject : public IObject
{
    int data;
public:
    void setData(int temp);
    int getData(); bool less(IObject*);
    IObject *clone();
    void add(int n);
};
 
void IntObject::setData(int temp)
{ data = temp;
}
 
int IntObject::getData()
{
    return data;
} bool IntObject::less(IObject* obj)
{
    if (IntObject *bt = dynamic_cast<IntObject*>(obj))
    {
        return true;
    }
    return false;
}
IObject* IntObject::clone()
{
    IntObject* ret = new IntObject; ret->setData(this->getData());
    return ret;
}
 
void IntObject::add(int n)
{ data = n;
}
 
class StringObject: public IObject
{
    char *data;
public:
    void setData(char *temp);
    char *getData(); bool less(IObject*);
    IObject *clone();
    void add(char *temp);
}; bool StringObject::less(IObject* obj)
{
    if (StringObject *bt = dynamic_cast<StringObject*>(obj))
    {
        return true;
    }
    return false;
}
void StringObject:: add(char *temp)
{ strcpy(data, temp);
}
char* StringObject::getData()
{
    return data;
}
 
IObject* StringObject::clone()
{
    return new StringObject(*this);
}
 
class set_t{
    IObject* data;
    int size;
public:
    set_t();
    set_t(const set_t &data);
    void insert(IObject* f_data);
    void realloc_plus(char ch);
    int get_size();
    IObject& operator [](size_t pos);
    void show(int index);
};
 
ostream& operator << (ostream& stream, set_t& str)
{
    for (int i = 0; i < str.get_size(); i++) stream << str[i] << " ";
    return stream;
}
 
IObject& set_t::operator [](size_t pos)
{
    return data[pos];
}
 
set_t::set_t()
{ 
    data = NULL; 
    size = 0;
}
 
void set_t::realloc_plus(char ch)
{ 
    size++;
    if (ch == 'I') 
        data = new IntObject[size];
}
void set_t::insert(IObject *f_data)
{ 
    realloc_plus('I'); 
    data = f_data;
}
 
int set_t::get_size()
{
    return size;
}
 
void set_t::show(int index)
{ 
    cout << data[index] << endl;
}
0
1 / 1 / 0
Регистрация: 08.05.2016
Сообщений: 13
11.05.2016, 08:16
Я не знаю)

Добавлено через 34 секунды
не знаю как перегрузить операторы << и []
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.05.2016, 08:23
У тебя же есть в 100-й строке << - по аналогии и делай.
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
11.05.2016, 10:32  [ТС]
nmcf, Вот, я переделал. Только мусор программа выводит, ошибка где-то в функции add, а где именно не пойму
C++
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
class IObject
{
public:
    virtual bool less(IObject*) = 0;
    virtual IObject *clone() = 0;
};
class IntObject : public IObject
{
    int data;
public:
    IntObject();
    IntObject(int n);
    bool less(IObject*);
    IObject *clone();
};
bool IntObject::less(IObject* obj)
{
    if (IntObject *bt = dynamic_cast<IntObject*>(obj))
    {
        return true;
    }
    return false;
}
IObject* IntObject::clone()
{
    return new IntObject(*this);
}
 
IntObject::IntObject(int n)
{
    data = n;
}
 
IntObject::IntObject()
{
}
class StringObject: public IObject
{
    string data;
public:
    StringObject();
    StringObject(string temp);
    bool less(IObject*);
    IObject *clone();
};
bool StringObject::less(IObject* obj)
{
    if (StringObject *bt = dynamic_cast<StringObject*>(obj))
    {
        return true;
    }
    return false;
}
StringObject::StringObject(string temp)
{
    data = temp;
}
StringObject::StringObject(){}
 
IObject* StringObject::clone()
{
    return new StringObject(*this);
}
class set_t{
    IObject** data;
    int size = 0;
public:
    set_t();
    set_t(const set_t &l);
    ~set_t(){delete []data;};
    int get_size() const;
    IObject* get_data() const;
    void show();
    void add(IObject *obj);
};
set_t::set_t()
{
    data = new IObject*[size];
}
 
int set_t::get_size() const
{
    return size;
}
 
IObject* set_t::get_data() const
{
    return *data;
}
 
set_t::set_t(const set_t &l)
{
    size = l.get_size();
    for(int i = 0; i < size; i++)
        *data[i] = l.get_data()[i];
}
 
void set_t::add(IObject *obj)
{
    IObject** ptrTemp = new IObject*[size];
    if(size > 0)
        data[size - 1] = obj->clone();
    else
        data[0] = obj->clone();
 
    for (int i = 0; i < size; i++)
        ptrTemp[i] = data[i];
 
    delete [] data;
    size++;
 
    data = new IObject*[size];
 
    for (int i = 0; i < size - 1; i++)
        data[i] = ptrTemp[i];
 
   delete [] ptrTemp;
}
 
void set_t::show()
{
    for(int i = 0; i < size; i++)
        cout << data[i] << endl;
}
int main()
{
    set_t intA;
    IObject *p_1 = new IntObject(5);
    IntObject *bi = dynamic_cast<IntObject*>(p_1);
    IObject *p_2 = new IntObject(15);
    IntObject *b2 = dynamic_cast<IntObject*>(p_1);
    intA.add(bi);
    intA.add(b2);
    intA.show();
 
    return 0;
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.05.2016, 11:00
C++
1
2
3
4
5
6
7
8
9
10
11
12
void set_t::add(IObject *obj)
{
    IObject** ptrTemp = new IObject*[size + 1];
 
    for (int i = 0; i < size; i++) ptrTemp[i] = data[i];
 
    delete [] data;
 
    data = ptrTemp;
 
    data[size++] = obj->clone();
}
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
11.05.2016, 11:12  [ТС]
nmcf, спасибо, но проблема осталась. все равно выводит адреса, а не сами значения(
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.05.2016, 11:34
В show()? Ну так data[i] - это и есть указатель. Всё верно.
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
11.05.2016, 11:35  [ТС]
nmcf, а как сделать, чтобы выводились значения?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.05.2016, 11:40
Определи операцию << для классов StringObject и IntObject и будешь выводить *(data[i]).
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
11.05.2016, 11:57  [ТС]
nmcf,
написал дружественную функцию
C++
1
2
3
4
5
ostream& operator << (ostream& stream, StringObject& str)
{
    stream << str.data;
    return stream;
}
В классе объявил как friend, аналогично для IntObject, и в функции show стал выводить *(data[i])- но выводит ошибку, мол, не переопределил оператор <<?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.05.2016, 12:40
Покажи актуальный вариант.
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
11.05.2016, 17:53  [ТС]
nmcf, вы про это?
C++
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
class IObject
{
public:
    virtual bool less(IObject*) = 0;
    virtual IObject *clone() = 0;
};
class IntObject : public IObject
{
    int data;
public:
    IntObject();
    IntObject(int n);
    bool less(IObject*);
    IObject *clone();
    friend ostream& operator << (ostream& stream, IntObject& str);
};
bool IntObject::less(IObject* obj)
{
    if (IntObject *bt = dynamic_cast<IntObject*>(obj))
    {
        return true;
    }
    return false;
}
IObject* IntObject::clone()
{
    return new IntObject(*this);
}
 
IntObject::IntObject(int n)
{
    data = n;
}
 
IntObject::IntObject()
{
}
ostream& operator << (ostream& stream, IntObject& str)
{
    stream << str.data;
    return stream;
}
class StringObject: public IObject
{
    string data;
public:
    StringObject();
    StringObject(string temp);
    bool less(IObject*);
    IObject *clone();
    friend ostream& operator << (ostream& stream, StringObject& str);
};
bool StringObject::less(IObject* obj)
{
    if (StringObject *bt = dynamic_cast<StringObject*>(obj))
    {
        return true;
    }
    return false;
}
StringObject::StringObject(string temp)
{
    data = temp;
}
StringObject::StringObject(){}
 
IObject* StringObject::clone()
{
    return new StringObject(*this);
}
ostream& operator << (ostream& stream, StringObject& str)
{
    stream << str.data;
    return stream;
}
class set_t{
    IObject** data;
    int size = 0;
public:
    set_t();
    set_t(const set_t &l);
    ~set_t(){delete []data;};
    int get_size() const;
    IObject* get_data() const;
    void show();
    void add(IObject *obj);
};
set_t::set_t()
{
    data = new IObject*[size];
}
 
int set_t::get_size() const
{
    return size;
}
 
IObject* set_t::get_data() const
{
    return *data;
}
 
set_t::set_t(const set_t &l)
{
    size = l.get_size();
    for(int i = 0; i < size; i++)
        *data[i] = l.get_data()[i];
}
 
void set_t::add(IObject *obj)
{
    IObject** ptrTemp = new IObject*[size];
    if(size > 0)
        data[size - 1] = obj->clone();
    else
        data[0] = obj->clone();
 
    for (int i = 0; i < size; i++)
        ptrTemp[i] = data[i];
 
    delete [] data;
    size++;
 
    data = new IObject*[size];
 
    for (int i = 0; i < size - 1; i++)
        data[i] = ptrTemp[i];
 
   delete [] ptrTemp;
}
 
void set_t::show()
{
    for(int i = 0; i < size; i++)
        cout << data[i] << endl;
}
int main()
{
    set_t intA;
    IObject *p_1 = new IntObject(5);
    IntObject *bi = dynamic_cast<IntObject*>(p_1);
    IObject *p_2 = new IntObject(15);
    IntObject *b2 = dynamic_cast<IntObject*>(p_1);
    intA.add(bi);
    intA.add(b2);
    intA.show();
 
    return 0;
}
Добавлено через 1 час 8 минут
nmcf, после перегрузки оператора [] в классах IntObject и SStringObject можно выводить данные, но только непосредственно в main'e
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    set_t intA;
    IObject *p_1 = new IntObject(5);
    IntObject *bi = dynamic_cast<IntObject*>(p_1);
    IObject *p_2 = new IntObject(15);
    IntObject *b2 = dynamic_cast<IntObject*>(p_1);
    intA.add(bi);
    intA.add(b2);
    cout << *bi << endl;
 
    return 0;
}
а как перегрузить в set_t, чтобы использовать в методе show()

Добавлено через 2 часа 46 минут
После пары часов тыканья в небо, я все-таки сделал))
C++
1
2
3
4
5
6
7
8
void set_t::show()
{
    for(int i = 0; i < size; i++)
    {
        IntObject *bi = dynamic_cast<IntObject*>(data[i]);
        cout << *bi << endl;
    }
}
Операторы перегружать не пришлось))
nmcf, конструкция *data[i] работать не будет, но все-равно спасибо))
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.05.2016, 18:10
Лучший ответ Сообщение было отмечено Nike1995 как решение

Решение

Делаешь так:
C++
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
class IObject
{
public:
    virtual bool less(IObject*) = 0;
    virtual IObject *clone() = 0;
};
class IntObject : public IObject
{
    int data;
public:
    IntObject();
    IntObject(int n);
    bool less(IObject*);
    IObject *clone();
 
    virtual void show(ostream &os);
 
    friend ostream& operator << (ostream& stream, IntObject& str);
 
};
 
void IObject::show(ostream &os) { os << data; }
 
ostream& operator << (ostream& stream, IntObject& str)
{
    str.show(stream);
    return stream;
}
Оператор << у IObject, у потомков переопределяешь функцию show() для вывода их полей.
1
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
11.05.2016, 18:26  [ТС]
nmcf, спасибо, но я уже написал свою реализацию))

Добавлено через 4 минуты
nmcf, другой вопрос: как теперь выполнить объединение двух множеств?
т.е. я так понимаю там будет метод вида
C++
1
 IObject** _union(IObject *un_obj)
?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.05.2016, 18:45
Ну можешь и так.
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
11.05.2016, 18:46  [ТС]
или
C++
1
IObject** _union(set_t un_obj)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.05.2016, 18:50
C++
1
void set_t::union(set_t &un_obj)
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
11.05.2016, 18:51  [ТС]
Добавлено через 52 секунды
nmcf, а что если в задании сказано, что все методы должны принимать указатель на IObject?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.05.2016, 18:51
Помогаю со студенческими работами здесь

Передача объектов дочерних классов через массив объектов родительского класса в функцию
Здравствуйте. Возможно, вопрос больше относится к теории ООП, но все же я не решился задавать его в теме теории ООП, так как он кажется мне...

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив объектов класса из предыдущей лабы и в...

Массив объектов класса. Печать строк-членов класса.
подскажите, как распечатать строки? #include &quot;myString.h&quot; #include &lt;iostream&gt; #define stop __asm nop void main() { ...

Массив объектов класса как член другого класса
Здравствуйте. У меня тут возникла проблемка #include &quot;main.h&quot; class player { public: player(); player(char*); ...

Как обратится к обьекту класса, являющегося наследником абстрактного класса
Здравствуйте! У меня есть 4 класса: один виртуальный, следующие 2 - наследуют виртуальный класс и последний класс содержит указатель на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru