Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116

Пишу примитивный никому не нужный контейнер

25.09.2014, 10:12. Показов 4162. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
захотелось для практики написать аналог array из STL ну не полностью аналог, так, по своему как мне он был бы удобен... безо всяких лишних на мой взгляд переобъявлений типов аля "typedef size_t size_type", которых куча объявлена в реальном array и т.п. лишних вещей... в общем сейчас пока что проблема с конструктором копирования, вроде кажется правильно все, но x в main упорно хранит мусор в конце ну и + посмотрите вообще все очень плохо написано или как?

array.h
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
#include <iostream>
#include <initializer_list>
 
using namespace std;
 
template <typename T>
class array
{
private:
    //Указатель на память в которой хранится массив
    T* ptr;
 
    //Размер массива
    size_t _size;
 
public:
    //Конструктор по умолчанию
    array() : ptr(0), _size(0) {};
 
    //Конструктор копирования
    array(array& arr)
    {
        _size = arr._size;
        ptr = new T[arr._size];
        memcpy(ptr, arr.ptr, arr._size);
    }
 
    //Конструктор, создающий массив заданного размера
    array(size_t size) : _size(size), ptr(new T[size]) {}
 
    //Конструктор, инциализирующий массив
    array(initializer_list<T> values) : _size(values.size()), ptr(new T[values.size()])
    {
        const T* tmp = values.begin();
        for (int i = 0; i < _size; i++)
            ptr[i] = *tmp++;
    }
 
    //Деструктор
    ~array() { delete[] ptr; }
 
    //Перегрузка оператора [] для доступа к элементам массива
    T& operator [] (size_t index) { return ptr[index]; }
 
    //Получение размера массива
    size_t size() { return _size; }
 
    //Изменение размера массива
    void resize(size_t newsize)
    {
        T* tmp = new T[newsize];
        memcpy(tmp, ptr, _size < newsize ? _size : newsize);
        delete[] ptr;
        ptr = tmp;
        _size = newsize;
    }
};
main.cpp
C++
1
2
3
4
5
6
7
8
9
#include "array.h"
 
int main()
{
    array<int> a({ 2, 3, 1 });
    array<int> b(a);
    int x[] = { b[0], b[1], b[2] };
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.09.2014, 10:12
Ответы с готовыми решениями:

1 Апреля...Никому не веря
1 апреля - день, не внесенный ни в какие календари знаменательных дат и всенародных праздников и тем не менее засевший уже где-то в глубине...

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

Заменить контейнер vector, использовавшийся для хранения текстовых строк (листинг 2.3), на контейнер list
Здравствуйте форумчане, может кто объяснить как делать это задание и что собственно мы тут вообще делаем. сам листинг 2.3 ниже ...

42
2410 / 1946 / 764
Регистрация: 27.07.2012
Сообщений: 5,582
25.09.2014, 11:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от GetHelp Посмотреть сообщение
ну хорошо, может и есть смысл другое имя задать
Можно просто поместить в своё пространство имён:
C++
1
2
3
4
namespace my_container
{
    class array { /* ... */ };
}
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
25.09.2014, 14:47  [ТС]
а вот еще нашел хорошее пояснение работы с памятью в векторе http://alenacpp.blogspot.ru/2005/06/vector_30.html

Добавлено через 2 часа 58 минут
так появились еще вопросы:

1. как в классе объявить константу? я имею ввиду не внутри какой то функции класса, а как константную переменную класса с доступом private, просто не понятно где ей присвоить стартовое значение...
пытался и так и так никак не выходит...
C++
1
2
3
4
5
6
class Array
{
private:
const size_t min_size(100);
const size_t min_size = 100;
}
2. как кинуть исключение out_of_range? просто чтобы в нужный момент вылезла табличка с ошибкой... я честно говоря вообще ничего не понимаю в исключениях и как их кидать
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
25.09.2014, 14:51
Цитата Сообщение от GetHelp Посмотреть сообщение
1. как в классе объявить константу?
Ну вообще при нормальной поддержке компилятором стандарта такой код должен работать.
В противном случае можно так:
C++
1
2
3
4
5
struct Array {
    Array() : min_size(42) {}
    
    const int min_size; 
};
А если константа общая для всех объектов, то так:
C++
1
2
3
struct Array {
    static const int min_size = 42;
};
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
25.09.2014, 15:21  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
А если константа общая для всех объектов, то так:
а вообще не проверил, действительно так работает, даже без статика

и еще нашел кажется как исключение вызвать
C++
1
throw std::out_of_range("Index of array is out of range!");
Добавлено через 20 минут
кстати а очень плохо вызывать в классе из одной функции другую? скажем у меня есть resize и я хочу сделать push_back и чтобы не переписывать кучу кода из resize по работе с памятью я просто ее заюзаю в push_back в нужном месте инкрементировав предварительно счетчик? а там уже в resize я уже реализовал чтобы она не перевыделяла каждый раз память а выделяла буферами если не хватает...
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
25.09.2014, 15:26
Цитата Сообщение от GetHelp Посмотреть сообщение
кстати а очень плохо вызывать в классе из одной функции другую?
Функции пишутся для того, чтобы их переиспользовать.
Другое дело, что в данном случае resize не очень подходит, поскольку нужна другая семантика - reserve.
0
25.09.2014, 17:19

Не по теме:

Цитата Сообщение от GetHelp Посмотреть сообщение
Пишу примитивный никому не нужный контейнер
:cry: Терпи, казак - атаманом станешь.

0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
25.09.2014, 17:27  [ТС]
в общем как то так
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
#include <iostream>
#include <initializer_list>
#include <algorithm>
#include <stdexcept>
 
template <typename T>
class Array
{
private:
    //Минимальный размер выделенной памяти (количество элементов)
    const size_t m_min_size = 100;
 
    //Коэффициент перевыделения памяти
    const double m_k = 1.25;
 
    //Указатель на память в которой хранится массив
    T* m_ptr;
 
    //Размер массива
    size_t m_size;
 
    //Количество элементов массива на которые выделена память
    size_t m_max_size;
 
public:
    //Конструктор по умолчанию
    Array() : m_size(0), m_max_size(m_min_size)  { m_ptr = new T[m_max_size]; }
 
    //Конструктор копирования
    Array(const Array& arr)
    {
        m_size = arr.m_size;
        m_max_size = arr.m_max_size;
        m_ptr = new T[arr.m_max_size];
        std::copy(&arr.m_ptr[0], &arr.m_ptr[arr.m_size], m_ptr);
    }
 
    //Конструктор, создающий массив заданного размера
    Array(size_t size)
    {
        m_max_size = (m_size = size) > m_min_size ? m_size : m_min_size;
        m_ptr = new T[m_max_size];
    }
 
    //Конструктор, инциализирующий массив
    Array(std::initializer_list<T> values)
    {
        m_size = values.size();
        m_max_size = m_size > m_min_size ? m_size : m_min_size;
        m_ptr = new T[m_max_size];
        std::copy(values.begin(), values.end(), m_ptr);
    }
 
    //Деструктор
    ~Array() { delete[] m_ptr; }
 
    //Перегрузка оператора [] для доступа к элементам массива
    T& operator [] (size_t index)
    {
        if (index >= m_size) 
            throw std::out_of_range("Index of array is out of range!");
        else 
            return m_ptr[index];
    }
 
    //Получение размера массива
    size_t size() { return m_size; }
 
    //Изменение размера массива
    void resize(size_t newsize)
    {
        if (newsize > m_max_size)
        {
            m_size = m_max_size;
            T* tmp = new T[m_max_size = newsize * m_k];
            std::copy(&tmp[0], &tmp[m_size], m_ptr);
            delete[] m_ptr;
            m_ptr = tmp;
            m_size = newsize;
        }
        else m_size = newsize;
    }
 
    //Вставка элементов в конец
    void push_back(const T& value)
    {
        if (++m_size > m_max_size) resize(m_size);
        m_ptr[m_size - 1] = value;
    }
};
буду думать что еще полезного присобачить
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
25.09.2014, 17:58
Цитата Сообщение от GetHelp Посмотреть сообщение
const size_t m_min_size = 100;
И все-таки по смыслу эти константы - static.
Цитата Сообщение от GetHelp Посмотреть сообщение
Array() : m_size(0), m_max_size(m_min_size) *{ m_ptr = new T[m_max_size]; }
Выделение памяти нулевого размера не имеет смысла.
Цитата Сообщение от GetHelp Посмотреть сообщение
Array(size_t size)
excplicit
Цитата Сообщение от GetHelp Посмотреть сообщение
size_t size() { return m_size; }
const
Цитата Сообщение от GetHelp Посмотреть сообщение
T* tmp = new T[m_max_size = newsize * m_k];
Слишком много операций на строку кода.
Цитата Сообщение от GetHelp Посмотреть сообщение
std::copy(&tmp[0], &tmp[m_size], m_ptr);
std::copy(tmp, tmp + m_size, m_ptr);

Добавлено через 3 минуты
Цитата Сообщение от GetHelp Посмотреть сообщение
буду думать что еще полезного присобачить
См интерфейс вектора. В общем случае одного resize мало, нужны resize + reserve, ибо функционал разный.
+ Оператор присваивания.
+ Move-конструктор.
+ Константный оператор[]
+ Итераторы
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
25.09.2014, 19:26  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
И все-таки по смыслу эти константы - static.
а в чем смысл то их статик объявлять? будет какой то выигрыш в памяти или быстродействии? ну можно так то ладно без разницы...
Цитата Сообщение от 0x10 Посмотреть сообщение
Выделение памяти нулевого размера не имеет смысла.
так никто же не выделяет нулевого да... тут выделяется память на 100 элементов...
Цитата Сообщение от 0x10 Посмотреть сообщение
excplicit
а все таки что толку? зачем этот запрет на приведение типа? size_t так или иначе не может быть меньше 0, так что при приведении - если таково будет отбросится...
Цитата Сообщение от 0x10 Посмотреть сообщение
const
с какой стороны? в смысле возвращаемое значение или справа от названия функции? впрочем я опять таки не понимаю какая разница? она так или иначе ничего не меняет, объявляй это официально или не объявляй... ну а возвращаемое значение const было бы и вовсе глупостью имхо...
Цитата Сообщение от 0x10 Посмотреть сообщение
Слишком много операций на строку кода.
ну можно и разнести... а так то все работает
Цитата Сообщение от 0x10 Посмотреть сообщение
std::copy(tmp, tmp + m_size, m_ptr);
опять таки никакой разницы...
Цитата Сообщение от 0x10 Посмотреть сообщение
См интерфейс вектора. В общем случае одного resize мало, нужны resize + reserve, ибо функционал разный.
а что конкретно делает reserve чего не делает resize? вы видите как у меня resize реализована? она меняет только m_size, а с памятью начинает работать уже когда она кончается... т.е. мне кажется она примерно как reserve и работает, т.е. она резервирует...
Цитата Сообщение от 0x10 Посмотреть сообщение
+ Оператор присваивания.
присваивания другого объекта Array? поверх данных this? ок попробую... я еще думаю сделать перегрузку на сложение 2х объектов, т.е. this будет увеличиваться на размер суммируемого объекта, и в this будут дописываться элементы... еще можно думаю сделать перегрузку сравнения...
Цитата Сообщение от 0x10 Посмотреть сообщение
+ Move-конструктор.
что это такое?
Цитата Сообщение от 0x10 Посмотреть сообщение
+ Константный оператор[]
опять таки вообще не понимаю что это и зачем? как это константный? он должен константное значение возвращать? а как он будет отличаться от неконстантного? подозреваю что будет ошибка компиляции, потому что 2 перегрузки одного и того же оператора...
Цитата Сообщение от 0x10 Посмотреть сообщение
+ Итераторы
это типа чтоб бегать for-range? я вон в соседней теме спрашивал, но пока че то не разобрался как там это делать... я вон посмотрел реализацию вектора, там просто 2 функции begin(), end() возвращают что то типа iterator(ptr[0]), iterator(ptr[size]), а у меня такое ошибки выдает

Добавлено через 2 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
И все-таки по смыслу эти константы - static.
кстати попробовал и бах : "error C2864: "Array<T>::m_k": статический элемент данных с инициализатором внутри класса должен иметь неизменяемый целочисленный тип const"

Добавлено через 10 минут
Цитата Сообщение от GetHelp Посмотреть сообщение
size_t так или иначе не может быть меньше 0, так что при приведении - если таково будет отбросится...
даже не отбросится, а выдаст ошибку, я проверил...
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
25.09.2014, 21:01
Цитата Сообщение от GetHelp Посмотреть сообщение
а так то все работает
Тут важно понимать, что код пишется не только чтобы работало, а еще чтобы его можно было потом прочитать и сопровождать другому человеку или тебе через некоторое время ( когда уже все забыл).
Может тебе и сложно сейчас это понять, но как-только начнешь работать программистом, понимание придет.

PS. Константность твой друг, не стоит ей пренебрегать.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
25.09.2014, 22:01  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Тут важно понимать, что код пишется не только чтобы работало, а еще чтобы его можно было потом прочитать и сопровождать другому человеку или тебе через некоторое время ( когда уже все забыл).
Может тебе и сложно сейчас это понять, но как-только начнешь работать программистом, понимание придет.
к чему это сейчас было сказано? у меня что не читаемый код? хз лично я считаю что у меня как раз очень даже понятный читаемый и простой код выходит... к тому же все прокомментил... так что это ты зря...

Добавлено через 5 минут
кстати такой вопрос еще: а в списке проканает такая преаллокация памяти? думаю после массива, попробовать сделать список (двусвязный)
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
25.09.2014, 22:21
Цитата Сообщение от GetHelp Посмотреть сообщение
к чему это сейчас было сказано? у меня что не читаемый код? хз лично я считаю что у меня как раз очень даже понятный читаемый и простой код выходит...
Это пояснение к твоему непониманию рекомендаций 0x10. Все эти вещи нужны и используются в реальных проектах. В том числе чтобы сделать сопровождение и доработку кода более простой. Т.к. часть работы по обеспечению корректности интерфейсов берет на себя компилятор, отсюда меньше потенциальных ошибок.

У кода много мер качества. Иногда не достаточно чтобы код просто работал. Т.е. отмазка "и так сойдет" не пойдет, если от этого зависит прибыль компании.

И не надо все воспринимать как наезд.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
26.09.2014, 08:38
Цитата Сообщение от GetHelp Посмотреть сообщение
будет какой то выигрыш в памяти или быстродействии?
static переменная принадлежит классу. Не-static - объекту, т.е. память для констант будет выделяться в каждом созданном объекте.
Цитата Сообщение от GetHelp Посмотреть сообщение
так никто же не выделяет нулевого да... тут выделяется память на 100 элементов...
Недоглядел.
Цитата Сообщение от GetHelp Посмотреть сообщение
а все таки что толку? зачем этот запрет на приведение типа?
См пост 12, там есть пример кода.
Цитата Сообщение от GetHelp Посмотреть сообщение
с какой стороны? в смысле возвращаемое значение или справа от названия функции?
Второе. size_t size() const;
Иначе такой код не скомпилируется:
C++
1
2
3
4
int main() {
    const Array<int> a{1, 2, 3};
    a.size();
}
Цитата Сообщение от GetHelp Посмотреть сообщение
ну можно и разнести... а так то все работает
Неочевидные для беглого чтения побочные эффекты. Обычно при виде оператора new меньше всего ожидают, что где-то в нем спрятано еще и присваивание.
Цитата Сообщение от GetHelp Посмотреть сообщение
опять таки никакой разницы...
Меньше пунктуации - чище код.
Последние два пункта - то, о чем и говорит DrOffset
Цитата Сообщение от GetHelp Посмотреть сообщение
еще можно думаю сделать перегрузку сравнения...
А вот с этим нужно аккуратнее думать. Когда два массива равны? Когда равны их размеры и i-тый элемент первого массива равен i-тому элементу второго массива. Т.е. реализация оператора сравнения на равенство накладывает ограничение на тип T: при использовании оператора== для типа T тоже должен быть определен оператор==. Какие тут могут быть проблемы:
1. Не всегда очевидно как должен быть реализован оператор == для типа. Например, если это сложная структура, то сравнение в разных контекстах может быть выполнено по разным критериям. Это подводит к мысли, что было бы неплохо передавать предикат сравнения, но:
2. Оператор == бинарный, т.е. передать предикат не получится. Т.о. реализация сравнения двух массивов в виде внешней функции - универсальнее.
3. Нас устраивает, что в случае сравнения двух массивов указателей будут сравниваться исключительно их адреса?
4. Значения с плавающей точкой не совсем корректно сравнивать на строгое равенство, обычно сравнение выполняется с некоторой точностью.
От реализации не отговариваю, но с этими вопросами нужно определиться.
Цитата Сообщение от GetHelp Посмотреть сообщение
что это такое?
Лучше сразу обратиться к книгам с информацией по 11 стандарту по ключевым словам rvalue, move constructor, rvo - там будет написано понятнее, чем я пока могу пояснить. Если коротко - нужны конструктор и оператор присваивания, которые позволили бы избежать лишних копирований. Например, для возможности эффективной реализации функции swap.
Цитата Сообщение от GetHelp Посмотреть сообщение
опять таки вообще не понимаю что это и зачем? как это константный? он должен константное значение возвращать? а как он будет отличаться от неконстантного? подозреваю что будет ошибка компиляции, потому что 2 перегрузки одного и того же оператора...
const T& operator [] (size_t index) const;
Последний const - часть сигнатуры, поэтому неоднозначности не будет. Нужно по полной аналогии с константным size, см пример выше.
Цитата Сообщение от GetHelp Посмотреть сообщение
это типа чтоб бегать for-range? я вон в соседней теме спрашивал, но пока че то не разобрался как там это делать... я вон посмотрел реализацию вектора, там просто 2 функции begin(), end() возвращают что то типа iterator(ptr[0]), iterator(ptr[size]), а у меня такое ошибки выдает
range-for, стандартные алгоритмы. Соседнюю тему не помню, предполагаю, что не реализован свой класс итератора.

Добавлено через 2 минуты
Цитата Сообщение от GetHelp Посмотреть сообщение
кстати попробовал и бах : "error C2864: "Array<T>::m_k": статический элемент данных с инициализатором внутри класса должен иметь неизменяемый целочисленный тип const"
Это странное ограничение, причин которого я не помню. Нужно определение статических полей неинтегрального типа выносить за определение класса.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
26.09.2014, 11:36
Наверное уже было заявлено в треде, но в исправленной версии не увидел.

Пишем:
C++
1
Array<int> a(42), b = a;
Наслаждаемся падением. Необходимо определить явно оператор присваивания.

P.S.
m_size = size в 41 строке. Удивляемся почему всегда true.. (Оператор присваивания заместо оператора сравнения в тернарке).
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
26.09.2014, 11:48
Цитата Сообщение от MrGluck Посмотреть сообщение
m_size = size в 41 строке. Удивляемся почему всегда true.. (Оператор присваивания заместо оператора сравнения в тернарке).
Не, там осознанный сайд-эффект в виде присваивания.

Добавлено через 8 минут
Цитата Сообщение от MrGluck Посмотреть сообщение
Наслаждаемся падением. Необходимо определить явно оператор присваивания.
Но это же конструирование, а не присваивание.
PS На работоспособность не проверял.
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,651
Записей в блоге: 6
26.09.2014, 11:51
В догонку:
C++
1
    Array() : m_size(0), m_max_size(m_min_size)  { m_ptr = new T[m_max_size]; }
Крайне не безапасный конструктор. Вам бы ТС изучить для чего предназначенны аллокаторы.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
26.09.2014, 12:12
Цитата Сообщение от Ilot Посмотреть сообщение
Крайне не безапасный конструктор. Вам бы ТС изучить для чего предназначенны аллокаторы.
А можно в двух словах пояснить? Я не догнал про небезопасность и чем тут поможет аллокатор.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,651
Записей в блоге: 6
26.09.2014, 12:25
0x10, ну как бы вопрос старый что будет если конструктор T на n-ом элементе кинет исключение?
0
26.09.2014, 12:29

Не по теме:

Цитата Сообщение от 0x10 Посмотреть сообщение
Не, там осознанный сайд-эффект в виде присваивания.
Сам поправил, сам словил падение.
Привык, что подобные вещи возникают по вине неопределённого оператора присваивания ( и конструктора копирования т.к. обычно или пишут и то и то, либо не пишут ничего).

Вобщем извиняюсь, мой косяк по невнимательности.

0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
26.09.2014, 12:31
Цитата Сообщение от Ilot Посмотреть сообщение
0x10, ну как бы вопрос старый что будет если конструктор T на n-ом элементе кинет исключение?
Не вижу проблемы.
Выделение памяти с помощью new происходит в два этапа.
1. Выделение сырой памяти.
2. Конструирование объектов.
Если один из конструкторов кинул исключение, то выделенная на первом этапе память будет освобождена. Т.е. не страшно, что не будет вызван деструктор ~Array.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.09.2014, 12:31

Зачем вы пишите никому не нужные сайты?
Поисковики это как газеты с объявлениями, можно за деньги и гарантировано, а можно попробовать опубликовать бесплатно. Но чтобы...

Неужто этого с почтой никому не приходилось делать ????
Привет всем ситуация такова Поручили мне на работе обрабатывать почту поступающую к нам и отсылать то что нужно на сотовые телефоны Все...

Какой смысл иметь СДЛ если он никому не нужен?
Здравствуйте! Мне вот интересно, СДЛ сайты, находящиеся в ЯК и приносящие около 5тр/месяц вообще хоть что-нибудь стОят? Хотел продать: ...

Народ, а никому не попадалась плата ардуино - под ЛУТ/смд?
собственно, рисовать лень. покупать долго, хотя нашел место, где продадут несобранную. Хочу сына немного научить феном работать. под...

Что значит НИКОМУ неизвестный (даже гуглу) атрибут SMART HDD?
У меня HDD WD Gold 1 TB Программа Victoria показала атрибут 16 GAS GUAGE как критический. А вот что он значит никто не знает. Нет вообще...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение 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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru