Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51

Адресация переменных и всей структуры программы на реальной памяти в ОС

20.11.2017, 21:38. Показов 4522. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, Вопрос по памяти, не совсем понятно:
1. Я написал программу 1.cpp, выполняю ее компиляцию, если я не использую динамическое выделение памяти, то при ее компиляции, исходя из объявленных переменных и еще чего-то там(?????), вычисляется объем памяти, требуемый для выполнения программы, затем происходит линковка - компоновка написанной программы, адресация каждой инструкции и разрешение имен для ф-ций(их адресация) . Линкер делает адресацию относительно "нуля" всего блока инструкций. Таким образом получается исполняемый файл - блок инструкций с рассчитанным, для его выполнения, объемом данных, у которого каждая инструкция теперь имеет адрес и за именем ф-ции скрывается адрес.

2. При запуске такого файла, ОС выделяет память, рассчитанную при компиляции и загружает программу в какую-то область оперативки с адресом X, где X и является по-сути тем самым "нулем" программы. ОС настраивает процессор на выполнение 1-ой инструкции и начинается ее выполнение, как только он доходит до инстр. вызова ф-ции, он кладет в IP адрес след.инструкции (в стек?) и переходит по адресу, который был дан ф-ции при линковке, передавая пар-ры этой ф-ции в стек обл-ти памяти где лежит наша программа. (Как этот стек выделяется? Это часть памяти, рассчитанной при компиляции? ) , затем ф-ция выполняется, работая с лок. переменными, которые лежат в том же стеке, и дойдя до return из стека (IP???) выдергивается адрес возврата и "процессор возвращается с каким - то значением".

3. При использовании динамического выделения, у нас и статическая память будет иметь место, в которой будет храниться выполняемая программа? и в процессе выполнения программы, дойдя до инструкции malloc (new), происходит выделение дин.памяти "где-то" в опер. памяти.
Верно ли я понимаю, скорректируйте, пожалуйста))))

Хочу понять и иметь общее представление о данном процессе) Буду очень рад, если кто-нибудь возьмется написать поэтапно все это)))
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.11.2017, 21:38
Ответы с готовыми решениями:

GlobalAlloc и адресация структуры
Привет всем! У меня небольшой вопрос по-поводу программирования на TASM (думаю он также касатеся и других ассемблеров). Пишу на...

Адресация переменных по стандарту МЭК 61131-3
Добрый день. Столкнулся с проблемой. Есть среда AXEl Logiclab по стандарту (МЭК 61131-3), есть исходные коды программы управления...

Адресация памяти
Добрый день, друзья. Начав изучать такую замечательную вещь, как программирование, в частности язык C++, столкнулся с необходимостью...

42
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.11.2017, 00:00
Студворк — интернет-сервис помощи студентам
Все адреса в программе внутренние. Физический вообще, наверное, только в самом процессоре есть.
И что за защита стека указателями? Ты про его ограниченный размер, что ли? Ну указатель 4/8 байт, а выделить памяти по нему можно много, она же вне стека.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
30.11.2017, 00:09
Цитата Сообщение от prado777 Посмотреть сообщение
3 шаг. Добавляем лок. переменные ф-ции frab() в стек и передаем ей управление ( fp и sp переместились).
Почему ret_val, ret_val, regist занимают всего, судя по смещениям, 4 байта???
Потому что показывайте как считали смешения.
1) Принцип as if говорит что наблюдаемое поведение программы должно совпадать с ее исходником. То есть, frab должно вернуть x+y. А вот локальные переменные компилятор имеет право выкинуть или наоборот добавить.
2) Компилятор никому не обязан хранить локальные переменные в стеке, если они помещаются в регистрах. Где на всех набрать регистров это уже другой вопрос.
Цитата Сообщение от prado777 Посмотреть сообщение
6.Операция взятия адреса & показывает физ. адрес или номер страницы в таблице страниц?
Виртуальный адрес.
Цитата Сообщение от prado777 Посмотреть сообщение
7. Тут мы передаем пар-ры (копии лок.переменных), которые имеют другой адрес.
А когда используем указатель, то используем адрес на лок. переменную в main(),
не создавая копию для передачи, но ведь указатель то все равно нужно сохр. в стеке, то есть
это те же 32 бита (для 32 х разр), так как же указатели защищают от переполнения стека?
А кто сказал что указатели защищают от переполнения стека? Единственное что если переменная больше указателя на нее, стек жрется не так активно. Но жрется все равно.
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,094
30.11.2017, 00:45
Цитата Сообщение от prado777 Посмотреть сообщение
2 шаг.
В стеке сохраняются еще адрес возврата и, возможно, состояния регистров, используемых в функции.
Цитата Сообщение от prado777 Посмотреть сообщение
6.Операция взятия адреса & показывает физ. адрес или номер страницы в таблице страниц?
Виртуальный адрес в пространстве памяти процесса. Реальный физический адрес виден только операционке.
Цитата Сообщение от prado777 Посмотреть сообщение
как же указатели защищают от переполнения стека?
Они защищают не для простых типов данных, а для здоровенных структур, классов или массивов. Представьте структуру размером 1000 байт. Одно дело пропихивать ее через стек и другое - только 4/8 байт указателя на нее же.
0
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
02.12.2017, 12:23  [ТС]
1. Считал я смещения так: пользовался для каждой переменной операцией взятия адреса &. Затем переводил из (hex) в (dec) // мне так пока что понятнее// и у каждой переменной получилось такое смещение. Я то думал, что при компиляции все идет линейно: от базового адреса добавляются смещения, в зависимости от размера переменной, но в моем примере этого не заметил я, тут вроде бы эта "линейность" в начале, а потом смещения уже пар-ов ф-ции Frab() другие, потом снова идет эта "линейность" с шагами на размер переменной. Вот почему так?

Может 472 - это уже другая "страница" виртуальной памяти?? Которая, как мы с Вами говорили,
находится уже в другом месте физической памяти, так? А та уже забилась.

2.
Цитата Сообщение от Renji Посмотреть сообщение
2) Компилятор никому не обязан хранить локальные переменные в стеке, если они помещаются в регистрах. Где на всех набрать регистров это уже другой вопрос.
А стек это не набор регистров, которые очищаются и записываются по воле процессора? Не понятно!

3.
Цитата Сообщение от Renji Посмотреть сообщение
То есть, frab должно вернуть x+y. А вот локальные переменные компилятор имеет право выкинуть или наоборот добавить.
, так вот в шаге 4 - они "выкидываются"
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,094
02.12.2017, 12:44
Цитата Сообщение от prado777 Посмотреть сообщение
А стек это не набор регистров, которые очищаются и записываются по воле процессора? Не понятно!
Разумеется, нет. Стек это область оперативной памяти. Обычно он ее использует именно как стек (LIFO, последний вошел первый вышел), но также в этой области хранятся локальные переменные, причем в обход стекового механизма, то есть стек знать не знает что к каким-то его элементам есть прямой доступ.
Цитата Сообщение от prado777 Посмотреть сообщение
Может 472 - это уже другая "страница" виртуальной памяти?? Которая, как мы с Вами говорили,
Вряд ли. Внутри программы адресация линейна. Более вероятно что помимо локальных переменных в стеке сохраняются регистры процессора и какая-то еще служебная информация.
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
02.12.2017, 12:45
Цитата Сообщение от prado777 Посмотреть сообщение
Может 472 - это уже другая "страница" виртуальной памяти?? Которая, как мы с Вами говорили,
находится уже в другом месте физической памяти, так? А та уже забилась.
Последовательность виртуальных адресов не зависит от распределения физических адресов

Цитата Сообщение от prado777 Посмотреть сообщение
2. А стек это не набор регистров, которые очищаются и записываются по воле процессора? Не понятно!
Стек это раздел выделенной памяти. У каждого процесса свой стек, причем для каждого процесса или потока может быть отдельный стек для пользовательского режима и для режима ядра. Зависит от ОС
0
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
02.12.2017, 14:35  [ТС]
То есть Вы хотите сказать, что лок. переменные хранятся в стеке, но доступ к ним не через LIFO, а прямой. И Получается все лок. переменные из стека удаляются, кроме лок. переменных main() // при вызовах только из main()//
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,094
02.12.2017, 15:28
Программе доступны две области памяти: стек и куча.
С кучей все понятно - программа запрашивает выделение кусков памяти под переменные с помощью malloc/free или new/delete, после чего ОС выдает ей их адреса (или не выдает в случае ошибки). Произвольного доступа к куче нет. Вы не можете напрямую писать, скажем, по адресу 0x1234. Зато динамическим выделением можно получить от ОС огромные куски памяти, даже больше чем есть оперативки в железе (механизм подкачки).
Стек же это служебная непрерывная структура данных. Основное предназначение это сохранение и восстановление при входе в подпрограммы. При этом сохраняются как минимум адрес возврата и состояние регистров процессора. Причем это происходит именно через стековый механизм: они кладутся на стек, а когда надо - по одному снимаются. По историческим причинам стек растет вниз - от конца доступной памяти к началу. Чтобы локальные переменные разных функций (особенно при рекурсии) не путались, они размещаются там же, в стеке, но доступ к ним идет напрямую. Низкоуровневая работа со стеком довольно хитрая и отличается от компилятора к компилятору, я с этим глубоко не разбирался. Вот область стека доступна программе для записи в произвольную область. Правда, учитывая что она активно используется компилятором, пользоваться этим не стоит. Кроме того, объем стека довольно невелик. По умолчанию в Linux он составляет около 8 МБ.
0
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
02.12.2017, 15:57  [ТС]
1. Так, получается что когда у нас на этапе линковки у каждой иснтрукции, переменной рассчитывается смещение, относительно базового адреса, затем при запуске exe выделяется память под "это все" при помощи страничной организации памяти - это куча? Что конкретно в ней хранится? Команды для процессора?

2. Исходя из чего назначается область памяти стека для конкретной программы?Откуда этот адрес берется? Во время компиляции?

3. При выходе из ф-ции лок переменные удаляются из стека?

5. Для моей программы что будет в стеке, а что в куче?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Листинг:
int main() {
int Age = 30;
int Pi = 3;
int r = 0;
 
//call func
r = frab(Age,Pi);
retutn 0;
}
 
//difinition func
int frab(int x,int y) {
int i = x + y;
int o = 0;
return i;
}
6 . Глобальные переменные лежат в куче?

7. При закрытии exe файл удаляется?

8. Правда, что если ты выделил малоком память без фри , то при закрытии exe ОС все равно почистит память. Это плохая практика, но все же?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
02.12.2017, 16:34
Цитата Сообщение от prado777 Посмотреть сообщение
А стек это не набор регистров, которые очищаются и записываются по воле процессора? Не понятно!
Это вы сейчас регистровое окно описали. Бывает и так, но экзотика. Процессор обычно не умеет работать непосредственно с памятью, сначала ему нужно перенести данные в регистры. Но регистров мало, на все не хватает, поэтому те данные которым места не хватило уезжают в стек. Однако, если отгружать данные в стек не требуется, компилятор может логично заключить "а зачем тогда место под них резервировать?". С другой стороны, у регистров адресов нет. Так что если вот кровь из носа, надо обратиться к переменной по указателю, компилятор вынужден скрепя сердце выдать этой переменной место в стеке.
Цитата Сообщение от prado777 Посмотреть сообщение
1. Считал я смещения так: пользовался для каждой переменной операцией взятия адреса &.
У вас для & смещения какие-то странные. Очень вряд ли вы могли бы получить "524", так как если мне память не изменяет, самые младшие адреса зарезервированы под нулевые указатели и не используются. Покажите сам код с этими & и их печатью, станет понятней.
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
02.12.2017, 17:00
Цитата Сообщение от prado777 Посмотреть сообщение
организации памяти - это куча?
Нет. Это виртуальная память процесса. Куча формируется поверх нее.
Цитата Сообщение от prado777 Посмотреть сообщение
Исходя из чего назначается область памяти стека для конкретной программы?
Стек - это просто зарезервированный участок виртуальной памяти для потока (а не процесса). Его размер можно указать при создании потока для основного потока размер указывается в заголовках некоторых исполняемых файлов.
Цитата Сообщение от prado777 Посмотреть сообщение
Что конкретно в ней хранится?
Дофига всего в ней хранится. Даже код ядра ОС, только у обычного приложения к нему нет доступа.
Цитата Сообщение от prado777 Посмотреть сообщение
Команды для процессора?
И они тоже.
Цитата Сообщение от prado777 Посмотреть сообщение
При выходе из ф-ции лок переменные удаляются из стека?
Современные компиляторы используют по возможности регистры для переменных, а не стек. Да и вообще могут все тело функции встроить, так что вопрос требует уточнения. Если рассматривать С++, то локальные у локальных уобъектов заканчивается время жизни при выходе из функции, но нет никакого требования, чтобы компилятор прямо сразу "освобождал" занятые ячейки памяти.
Цитата Сообщение от prado777 Посмотреть сообщение
Глобальные переменные лежат в куче?
Вопрос опять некорректный. Глобальные переменные обычно размещаются в сегменте данных (инициализированных или нет) и "создаются" на момент загрузки приложения. Но это справедливо только для простых типов.
Цитата Сообщение от prado777 Посмотреть сообщение
При закрытии exe файл удаляется?
А самому проверить слабо?
Цитата Сообщение от prado777 Посмотреть сообщение
Правда, что если ты выделил малоком память без фри , то при закрытии exe ОС все равно почистит память.
Да.
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,094
02.12.2017, 17:02
Цитата Сообщение от prado777 Посмотреть сообщение
1. Так, получается что когда у нас на этапе линковки у каждой иснтрукции, переменной рассчитывается смещение, относительно базового адреса, затем при запуске exe выделяется память под "это все" при помощи страничной организации памяти - это куча? Что конкретно в ней хранится? Команды для процессора?
Про инструкции сейчас вообще не говорим, это совсем другая область памяти, не стек и не куча.
Про страничную организацию памяти просто забудьте. Вы занимаетесь прикладным, а не системным программированием.
Цитата Сообщение от prado777 Посмотреть сообщение
2. Исходя из чего назначается область памяти стека для конкретной программы?Откуда этот адрес берется? Во время компиляции?
Настройки операционной системы. Их можно изменить и программе будет выдан больший или меньший стек.
Цитата Сообщение от prado777 Посмотреть сообщение
3. При выходе из ф-ции лок переменные удаляются из стека?
Близко, но не так. Смещается вершина стека и локальные переменные оказываются в "свободной" области. Она не очищается, но может быть перезаписана другими функциями или работой со стеком. То есть специально никто не чистит, но могут перезаписать случайно.
Цитата Сообщение от prado777 Посмотреть сообщение
5. Для моей программы что будет в стеке, а что в куче?
Все в стеке.
C++
1
2
3
4
5
6
int glob_var;
int main(){
  int loc_var;
  int *dyn_var = new int;
  delete dyn_var;
}
glob_var находится в отдельной области памяти (не в стеке и не в куче). Но тут точно сказать не могу, глубоко не лез. Скорее всего, зависит от компилятора.
loc_var в стеке
dyn_var в куче. Точнее, сам указатель все еще в стеке, но вот указывает на кучу.
Цитата Сообщение от prado777 Посмотреть сообщение
6 . Глобальные переменные лежат в куче?
см. 5.
Цитата Сообщение от prado777 Посмотреть сообщение
7. При закрытии exe файл удаляется?
Не понял вопроса. Стек, выделенный процессу, освобождается. Занятые участки кучи обычно освобождаются. Насколько я знаю, не всегда - на старых ОСях это приводило к глобальной утечке памяти. Сам файл не удаляется точно.
Цитата Сообщение от prado777 Посмотреть сообщение
8. Правда, что если ты выделил малоком память без фри , то при закрытии exe ОС все равно почистит память. Это плохая практика, но все же?
см. 7.
0
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
02.12.2017, 23:41  [ТС]
На рисунке то, что я выделил красным - это куча?

Регистры переменных, это регистры процессора? Получается при загрузке лок. переменных в память они по возможности загружаются именно в них, а вот если их не хватает - то в стек?

То есть идея такая:
1. Написали программу, у каждой инструкции, переменной есть свое смещение.
2. При запуске exe ОС выделяет память под это: Сегмент стека, сегмент данных и сегмент кодов.
3. В сегменте кодов хранятся инструкции для процессора из нашей программы
4. В сегменте данных хранятся данные (переменные глобальные), но могут и локальные?
5. В стеке хранятся лок. переменные, если при регистров не хватает, указатели на данные из сегмента данных.
6. При вызове ф-ции локальные переменные берутся из стека или из регистров (если их хватило)
7. Затем, дойдя до инстр. RET у этих регистров или ячеек в стеке можно данные перезаписать
8. При вызове следующей ф-ции лок. пер опять пишуться в регистры процессора, при нехватке в стек "на место предыдущих"
9. После закрытия exe, вся память, которая была выделена проге освобождается.

// 10. malloc() realloc() calloc() работают неявно? То есть под объявлением переменной int x=10 скрывается malloc()?
Когда мы хотим динамическое выделение (самое медленное) - скажем при вводе данных с клавиатуры, у нас в куче (сегмент данных см. скрин) по мере ввода выделяется память доп.
Миниатюры
Адресация переменных и всей структуры программы на реальной памяти в ОС  
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.12.2017, 23:45
Как сегмент кода может быть кучей?
malloc() работает явно.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
02.12.2017, 23:48
Цитата Сообщение от prado777 Посмотреть сообщение
работают неявно?
Они работают с кучей. А указатели с адресами на память в куче, которые возвращаются/принимаются этими функциями, находятся в стеке или в сегменте данных.
0
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
02.12.2017, 23:50  [ТС]
А по поводу остального? Значит куча - это сегмент данных
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
03.12.2017, 00:19
Цитата Сообщение от prado777 Посмотреть сообщение
А по поводу остального? Значит куча - это сегмент данных
Нет. На твоей картинке нет кучи
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.12.2017, 00:21
Лучший ответ Сообщение было отмечено prado777 как решение

Решение

Цитата Сообщение от prado777 Посмотреть сообщение
На рисунке то, что я выделил красным - это куча?
Куча скорее всего между тем что у вас нарисовано. То есть, malloc по мере надобности делает "оптовую" закупку памяти размещая ее в никем не занятых адресах, а потом отдает вам так сказать в розницу. А на момент старта программы никакой "кучи" пока нет, "склады" у malloc пусты, он ждет заказов от населения.
Цитата Сообщение от prado777 Посмотреть сообщение
То есть идея такая:
Да, примерно такая.
1) Только в exe файле все же секции, а не сегменты.
4) Локальные переменные в стеке, а не в загруженной из exe секции данных.
6) Ну, вернее процессор постоянно жонглирует этими переменными одни выгружая в стек, другие наоборот загружая в регистры.
7) Стандартная практика - при вызове функции состояние регистров сохраняется в стек, при RET возвращается как было.
1
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
03.12.2017, 00:24  [ТС]
Спасибо!
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
03.12.2017, 01:19
Цитата Сообщение от prado777 Посмотреть сообщение
На рисунке то, что я выделил красным - это куча?
Рисунок скорее похож на DOS.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.12.2017, 01:19

Адресация переменных: найти и исправить ошибку в коде
Приветствую. Есть код: #include "stdafx.h" #include <iostream> using namespace std; int main() { int a; cin>>a; ...

Распределение и адресация памяти
Доброго времени суток. Уважаемые гуру и ассемблеристы , требуется подсказка начинающему программисту. Вопрос заключается в следующем: Есть...

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

Туториал по написанию реальной программы
Всем привет. Я изучаю язык программирования C# и понимаю, что чтобы научиться реально программировать, нужно написать настоящие программы...

Адресация памяти, помогите разобраться
Имеется контроллер STM32F100RB. Исходя из рисунка видно, что у нас имеется 4Гб, к которым мы можем обратиться. <Изображение...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
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. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru