Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698

Как сделать так, чтобы вернулась часть объекта?

18.10.2014, 15:20. Показов 3623. Ответов 69
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Поскольку в C++ возможно всё, вот я и решил, может и такое возможно?

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
//Должна возвращаться часть этого объекта, 
class kl
{
 
                               //важно
                               //важно
                               //важно
         //Тут всё просто. Конструиреутся объект с аргумента типа 
         //bool, а когда нужно преобразовать объект к типу bool,  
         //возвращается инициализированный флаг                   
         public:
         kl (bool x):flag(x) {}
         
         //Очень важный оператор переопределения типа!
         operator bool () {return flag;} 
        
         private: 
         //очень важный флаг!
         bool flag;
                               //важно
                               //важно
                               //важно
 
         //тут много разных полей, типа наполнители
         //они типа балласт
         int a, b, c, d, e; //и т. д.
 
};
 
//Есть функция, которая должна возвращать тип kl, приведённый к bool, вот так:
//Тут всё просто, f вернёт true или false в зависимости от принятого значения
kl f (bool x)
{
 //Тут придётся весь код менять
 return kl(x);
}
 
 
 
                               //main
                               //main
                               //main
int main ()
{
 
 //А вот использование функции
 
 //start Это нельзя менять эти строки должны остаться неизменными
 kl kl_0= f (false); 
 bool x= kl_0;
 //end Это нельзя менять эти строки должны остаться неизменными  
 
 //На фига мне это всё надо:
 if (x)
 {
  //Работаем с полями kl_0.a, kl_0.b, kl_0.c, kl_0.d, kl_0.e 
 }
 else;
  //А вот тут поля мне даром не нужны!
  return 0;
}
                               //main
                               //main
                               //main
Вот теперь посмотрите. f() возвращает объект типа kl, но, грубо говоря, только в половине случаев нужны будут все его поля a, b, с и так далее- при возврате true. В реальной программе что именно вернётся- true или false будет зависеть от многих факторов, этот тут я могу руками всё прописать. В общем нужно, чтобы f при возврате kl (которое false), как-то отбрасывало, что ли, эти все ненужные поля. Если возвращается false, они мне даром не нужны. Выход из программы и всё. В реальной программе в класс kl будут входить всякие сложные типы и у всех будут конструкторы и все они будут конструироваться. А для чего? При возвращении false они все не нужны и все вызова их конструкторов только зря отнимут время.
Менять можно весь код и реализацию kl, но интерфейс (2 строчки в main) должны остаться неизменными. Спасибо, кто откликнется.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.10.2014, 15:20
Ответы с готовыми решениями:

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

Как сделать так, чтобы эта часть кода искала файлы по расширениям?
string file = @"F:\test"; string FileName; DirectoryInfo DI = new DirectoryInfo(file); foreach (FileInfo FI in DI.GetFiles())...

Как сделать так, чтобы эта часть брала любое число из рандома?
Кое-как сделал программу на файлы. Было условие задачи: "Дан файл вещественных чисел. Определить количество нулевых значений в этом...

69
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.10.2014, 17:39  [ТС]
Студворк — интернет-сервис помощи студентам
И по-английски всё, да?
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
18.10.2014, 17:43
Цитата Сообщение от kravam Посмотреть сообщение
И по-английски всё, да?
Тема уже достаточно старая, думаю русской инфы тоже много.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
18.10.2014, 17:46
Здесь:
C++
1
2
3
4
5
6
7
8
9
int f(int n)
{
 int r;
 for (r=1; n>0; --n)
 {
  r*=n;
 }
 return r;
}
нужна именно копия. А здесь:
C++
1
2
3
4
5
6
7
8
9
10
int f(const int &x)
{
 int i;
  int r;
 for (r=1, i=n; i>0; --i)
 {
  r*=i;
 }
 return r;
}
можно что угодно. Теперь представь: ты объявил
C++
1
int f(const int &x)
, а потом решил не заводить переменную для копии, то есть написать
C++
1
2
3
4
5
6
7
8
{
 int r;
 for (r=1; n>0; --n)
 {
  r*=n;
 }
 return r;
}
. Вопрос: сколько символов надо исправить? И что мешает завести для копию специальную переменную внутри функции? В случае объекта принцип не меняется, только копировать в варианте
C++
1
int f(int n)
надо больше. Но меняется то внутри не весь объект, а конкретные члены. И если вдруг окажется, что менять внутри надо только часть членов, то можно съэкономить память и операции, передав объект по ссылке, а внутри скопировав конкретные члены.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.10.2014, 21:15  [ТС]
Не просто ли открывался ларчик?

Можно ведь возвращать не объект а указатель на объект. И тогда смело можно возвращать NULL, если что-то не заладится. А если всё заладится- указатель на объект.
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 <stdio.h>
#include <vector>
#include <string>
using namespace std;
 
 
//Должна возвращаться часть этого объекта, 
class kl
{
    public:
      vector <string> v;          
};
 
 
 
 
//Есть функция, которая должна возвращать тип kl, приведённый к bool, вот так:
//Тут всё просто, f вернёт true или false в зависимости от принятого значения
kl* f (bool x)
{
 if (x){
  kl* kl_= new kl();
  kl_->v.push_back("str_0");
  kl_->v.push_back("str_1");
  return kl_;
 }
 else
  return NULL;
 
}
 
 
 
                               //main
                               //main
                               //main
int main ()
{
 
 //А вот использование функции
 
 kl& x= *(f (true)); 
 
 //На фига мне это всё надо:
 if (x)
 {
  for (int i= 0; i< x->v.size(); i++)
   printf ("%s\n", x->v[i].c_str());
 }
 
 delete x;
 
 getchar ();
}
                               //main
                               //main
                               //main
Преимущества: нет необходимости переопределить конструктор приведения типов в классе.

Недостатки: необходимо потом применять оператор delete.

Но можно и ещё дальше пойти. К примеру, зачем вообще использовать авторский класс? Можно напрямую работать с вектором строк! То есть в случае удачи возвращать vector<string>*. И тогда не понадобится ничего удалять с помощью delete.

Не это ли имел ввиду 0X10, говоря
Цитата Сообщение от 0x10 Посмотреть сообщение
вернуть nullptr
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
18.10.2014, 22:37
Цитата Сообщение от kravam Посмотреть сообщение
Недостатки: необходимо потом применять оператор delete.
Тут недостаток даже не в том, что придется где-то использовать delete, а в том, что память выделяется в одном месте, а освобождается в другом (и непонятно кем). В общем случае так не делается.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.10.2014, 22:43  [ТС]
Цитата Сообщение от Kastaneda Посмотреть сообщение
Тут недостаток даже не в том, что придется где-то использовать delete, а в том, что память выделяется в одном месте, а освобождается в другом (и непонятно кем). В общем случае так не делается.
Так вот в том-то и дело, этот вопрос меня всегда беспокоил и я периодически к нему возвращался, но всё ж таки не нахожу причин, почему так нельзя делать и дело даже не в том, что компилятор не ругается. Итак, память под объект выделяется ОДНОЗНАЧНО не в стеке а в какой-то там куче, а она общая по определению. Остаётся только внимательно проследить за удалением.

Я уже склоняюсь к мысли, что эта штука new delete для того и была придумана, чтобы именно выделять и освобождать память в разных местах, если возникает необходимость как сейчас, например. Ибо только собственная невнимательность может воспрепятствовать нормальному написанию и выполнению программы. Ну так не всё ж должно быть гладко, иногда нужно приложить усилия над собой и поднапрячься.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
18.10.2014, 22:51
Представь ты работаешь с чужим кодом (а может быть даже с собранной библиотекой и у тебя только хидеры). Ты видишь ф-цию, которая возвращает указатель на что-то. Ок, используешь ее, все работает. Тебе даже в голову не придет, что ты должен где-то освободить какую-то память, пока не прочитаешь документацию к коду (1. если она есть 2. да кто ж ее читает). Это лишь один из множества примеров почему так делать нельзя. По-моему такие вещи со временем начинают интуитивно пониматься.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.10.2014, 22:54  [ТС]
Тут пожалуйста поподробнее. Если я вижу хидеры, то с меня и взятки гладки, я же не вижу реализацию и не смогу её поправить никоим образом. И тем более память какую-то освободить.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
18.10.2014, 23:02
Цитата Сообщение от kravam Посмотреть сообщение
Тут пожалуйста поподробнее.
Ну вот представь, что кто-то выделяет память в ф-ции и возвращает на нее указатель, рассчитывая, что пользователь (т.е. программист, который будет использовать эту ф-цию) эту память потом освободит. Но пользователь этого конечно же не делает. Это к вопросу почему плохо выделять память в одном месте, а освобождать в другом.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.10.2014, 23:05  [ТС]
Я же сказал- реализации-то у меня нет. как я её смогу поправить? Писать самому? Ну и что остаётся в сухом остатке? То, что я взял у кого-то ОДНИ ЛИШЬ хидеры. Без реализации. Без объектных файлов. Без *.dll-ок. Ситуация смешная какая-то.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
18.10.2014, 23:08
Цитата Сообщение от kravam Посмотреть сообщение
То, что я взял у кого-то ОДНИ ЛИШЬ хидеры. Без реализации. Без объектных файлов. Без *.dll-ок.
я ж говорю
Цитата Сообщение от Kastaneda Посмотреть сообщение
а может быть даже с собранной библиотекой и у тебя только хидеры
у тебя есть исполняемый машинный код в каком-то виде + хидеры к нему.

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
как я её смогу поправить?
никак, тебе придется жить с тем, что ты будешь должен освобождать память, указатель на которую вернет ф-ция.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.10.2014, 23:12  [ТС]
Я ничё не понимаю. Во-первых, я не понимаю, что в данном случае собранная библиотека. Это может быть *.dll? Ну, наверное. Итак, у меня меня есть хидер и dll-ка к нему и ещё файл *.a, и где я буду должен освободить память? Править dll-ку в hievе?
0
18.10.2014, 23:15

Не по теме:

есть ощущение, что мы либо о разных вещах говорим, либо об одной, но каждый на своей волне )

0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
18.10.2014, 23:18
Цитата Сообщение от kravam Посмотреть сообщение
Я ничё не понимаю.
попытаюсь объяснить
Kastaneda, имеет ввиду что кто то написал корявую библиотеку
вот у тебя есть описание функции
SuperPuperStruct * SuperPuperFunc()
которая возвращает какую то структуру, внутри себя выделяет память и как то инициализирует
ты смело её используешь раз так 100 или 1000 и получаешь утечку памяти, потому что тот забыл написать что память ты должен сам удалять
вот к этому и звучит
Цитата Сообщение от Kastaneda Посмотреть сообщение
почему плохо выделять память в одном месте, а освобождать в другом.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
19.10.2014, 01:18  [ТС]
Тому, кто так работает-

1) не принимает указатель на структуру,
2) возвращает указатель на структуру

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

++++++++++++++++++++++++++++++++++++++++ +++++++

3) и не пишет надо оборвать руки.

Это значит только одно- рано или поздно его код даст прикурить, хоть он сто раз оговорит. И нужно держаться от него подальше и заносить в чёрную книгу разработчиков.

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

Добавлено через 1 час 44 минуты

++++++++++++++++++++++++++++++++++++++++ ++++
++++++++++++++++++++++++++++++++++++++++ ++++
++++++++++++++++++++++++++++++++++++++++ ++++
++++++++++++++++++++++++++++++++++++++++ ++++

Вот я вам щас теоретический вопрос задам по тому, где выделять и освобождать память. Вот, к примеру я создаю многопоточное оконное приложение. (Понятное дело, главный поток "обслуживает окно", но я щас о других, дочерних ему потоках.) По его запуску начинает работать несколько потоков. Какое именно количество- заранее неизвестно. То есть их количество определяется автоматически, всякий раз оно разное. Для каждого потока существует функция потока, в неё передаётся указатель на структуру. В этой структуре всякие разные данные, с которыми функция потока работает. Память под структуру выделяется динамически (поскольку, мы не знаем, сколько потоков и, следовательно сколько таких элементов нам понадобится.)

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

В процессе работы приложения пользователь убивает потоки, нажимая на кнопки. Теперь следите за руками. Я нажал на кнопку, в обработчике события click я уничтожил поток. И, коль скоро потока больше нет, необходимо память под структуру, указатель на которую был передан в функцию потока. Освободить. Где это делать? Естессно, тут же, в функции обработчике click.

Понятно, к чему я клоню? Память под структуру, нужную для потока, выделяем в самом начале в функции-обработчике события возникновения окна. А освобождаем её в функции-обработчике события click. В разных то есть местах. По-другому никак.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.10.2014, 01:49
Цитата Сообщение от kravam Посмотреть сообщение
Вопрос- а где я выделяю память под эту структуру? В самом начале программы. Например, в функции-обработчике события возникновения окна. Надеюсь, это всем понятно?
Не всем. Почему нельзя создавать структуру в каждом потоке (тем более, если количество их заранее неизвестно), в каждой функции?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
19.10.2014, 01:57  [ТС]
Структуру в потоке создавать нельзя. По синтаксису существует функция потока, принимающая 4 параметра, последний из который указатель void*. И он служит для того, чтобы в него передать указатель на любую структуру, в которую запихать какие-нибудь данные для обработки в функции потока. Следовательно, если в функцию потока передаётся структура, то создана она должна быть где-нибудь в другом месте- в каком нибудь обработчике события. А не в функции потока, куда, повторю, всего-навсего передаётся указатель на неё.

Вообще вы не хуже меня знаете, оконные процедуры- штука хитрая. Это не простое консольное main. Логическое начало в одном обработчике, конец в другом. Ткнул на кнопку- поток создался. Ткнул на другую- завершился. Сработали две разных функции-обработчика события. В одной выделилась память под структуру, в другой освободилась. Такие дела.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.10.2014, 02:01
Цитата Сообщение от kravam Посмотреть сообщение
В разных то есть местах. По-другому никак.
Ничего плохого в этом нет.
Рекомендация "я тебя породил, я тебя и убью", на мой взгляд, относится к контексту выполнения.
Т.е. в случае с dll это следует понимать так:
Память выделилась (new) внутри dll, через api стала доступной в клиентском приложении (которое эту dll использует).
Мы использовали эти данные в приложении и теперь их надо удалить. А как? Внутри dll использовалась new, malloc, tmalloc, my_super_fast_allocator и т.д. Мы точно не знаем что именно, потому что в документации это не указано, а исходников у нас нет. Или даже знаем, но, вот беда, рантайм, с которым линковалась dll статически, вкомпилен в нее и освобождать память, через delete, выделенную с помощью new, но в другом экземпляре рантайма - нельзя (категорически). Вот мы и приплыли.
Поэтому рекомендация "в одном и том же месте" на мой взгляд предусматривает под одним и тем же местом тот же самый контекст выполнения, а не тот же самый класс или функцию. Т.е. в вышеприведенном примере правильная dll предоставила бы еще и функцию освобождения данных. Вот пример:
C++
1
2
Data * getData(); // функция dll, которая дает динамические данные
void freeData(Data *);  // функция dll, которая "забирает" данные
И юзеру dll после работы с Data*, нужно вызвать именно freeData, а не delete или free. Принцип "я тебя породил, я тебя и убью" соблюден, Data выделялась на стороне dll, на стороне dll же и будет освобождена.
Если же мы оставим в API только первую функцию, то вышеописанные проблемы тут же всплывают.

Если вернуться к твоему с примеру с потоками, то, имхо, там все правильно, основной поток создал данные и основной поток же потом их освободил. Принцип не нарушен. А вот если бы он их создал в одном потоке, а освобождать принялся из другого, то вот тут уже нужно насторожиться. Но, я скажу так: как нет серебряной пули, так и нет решения, которые было бы правильно или неправильно во всех случаях. Поэтому без детального рассмотрения задачи нельзя утверждать, что это некорректно. Но насторожиться можно.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.10.2014, 02:05
Цитата Сообщение от kravam Посмотреть сообщение
Структуру в потоке создавать нельзя.
Я так и не понял: почему? Что нужно передавать в фнкцию потока - это одно, вопрос в другом: почему в функции нельзя создать структуру? Ответа не услышал. В потоках Qt всё прекрасно создаётся.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
19.10.2014, 02:08  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
почему в функции нельзя создать структуру?
Да в какой функции-то? Я сказал уже, структура создаётся в функции, которая обработчик события, которое возникает при создании окна. Там же создаётся поток.

Цитата Сообщение от kravam Посмотреть сообщение
Вопрос- а где я выделяю память под эту структуру? В самом начале программы. Например, в функции-обработчике события возникновения окна.
Ты щас опять переспросишь, почему структуру нельзя создать в функции?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.10.2014, 02:08
Помогаю со студенческими работами здесь

Как сделать так, чтобы по гипперссылке менялась не вся страница а только ее внутренняя часть!
Помогите пожалуйста! Как сделать так, чтобы по гипперссылке менялась не вся страница а только ее внутренняя часть! ?????? :huh:

Как сделать так, чтобы график занимал не всю форму, а лишь определенную часть
Здравствуйте, Как сделать так, чтобы график занимал не всю форму, а лишь определенную часть, например правый верхний угол. Или это...

Как сделать так чтобы метод объекта возвращал бы объект своего же типа?
Как сделать так чтобы метод объекта возвращал бы объект себя своего же типа?

Как сделать так чтобы картинка в Image не мерцала при увеличении объекта?
Может кто нить подсказать как сделать так чтобы картинка в Image не мерцала при увеличении объекта? Мож буферизировать надо или чё нить...

Как сделать так, чтобы программа на free pascal или ее часть выполнялась на всех ядрах и потоках?
Как сделать так, чтобы программа на free pascal или ее часть выполнялась на всех ядрах и потоках? Чтобы пошустрее работала.


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru