- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#include <iostream>
#include <conio.h>
#include <clocale>
using namespace std;
int files; int disc_D(); int disc_E(); int disc_C();
int resursefunction()
{char s;
cout << "Выберите диск" << endl;
cout <<"1-D:\\" << endl;
cout <<"2-C:\\" << endl;
cout <<"3-E:\\" << endl;
cout <<"0 - рабочий стол" << endl;
cin >> s;
if(s == '1') return disc_D();
if(s == '2') return disc_C();
if(s == '3') return disc_E();
if(s == '0') return main();
_getch();}
int main()
{ char vibor;
setlocale( LC_ALL, "Russian" );
cout << "\t\t\t\tРабочий стол" << endl;
cout << "\n\n";
cout << "1-Управление ресурсами" << endl;
cout << "2-Программы" << endl;
cout << "3-Игры" << endl;
cout << "4-Выход из системы" << endl;
cin >> vibor;
if(vibor == '1') resursefunction();
_getch();
return main();}
int disc_D()
{ int res, a;
char vv;
cout << "D:\\" << endl;
cout << "На диске" << endl;
cout << "5 - папок" << endl;
cout << files << " - файлов" << endl;
cout << "1 - создать файл" << endl;
cout << "2 - удалить файл" << endl;
cout << "0 - назад" << endl;
cin >> vv;
if(vv == '1')
{cout << "Введите сколько создать файлов"; cin >> a; res = files + a;
res = files + a;}
if(vv == '2')
{cout << "Введите сколько удалить файлов"; cin >> a; res = files - a;
res = files - a;}
if(vv == '0') return resursefunction();
files = res;
return disc_D();}
int disc_E()
{
int res, a;
char vv;
cout << "E:\\" << endl;
cout << "На диске" << endl;
cout << "7 - папок" << endl;
cout << files << " - файлов" << endl;
cout << "1 - создать файл" << endl;
cout << "2 - удалить файл" << endl;
cout << "0 - назад" << endl;
cin >> vv;
if(vv = '1')
{cout << "Введите сколько создать файлов"; cin >> a; res = files + a;
res = files + a;}
if(vv == '2')
{cout << "Введите сколько удалить файлов"; cin >> a; res = files - a;
res = files - a;}
if(vv == '0') return resursefunction();
files = res;
return disc_E();}
int disc_C()
{int res, a;
char vv;
cout << "C:\\" << endl;
cout << "На диске" << endl;
cout << "5 - папок" << endl;
cout << files << " - файлов" << endl;
cout << "1 - создать файл" << endl;
cout << "2 - удалить файл" << endl;
cout << "0 - назад" << endl;
cin >> vv;
if(vv = '1')
{cout << "Введите сколько создать файлов"; cin >> a; res = files + a;
res = files + a;}
if(vv == '2')
{ cout << "Введите сколько удалить файлов"; cin >> a; res = files - a;
res = files - a; }
if(vv == '0') return resursefunction();
files = res;
return disc_C();}
Еще нашел на форумах. К сожалению форматирование пришлось убить, иначе оно не помещалось целиком
И подключать conio.h только из-за _getch() — говноедство
На гцц не должно вылететь, он умел в tail-call optimisation.
Только с включенной оптимизацией.
Хотя нет, атипичная, рекурсия всё-таки.
system - наследие от 16-битки
system32 - 64(!) битные файлы
syswow64 - 32(!) битные файлы
А я вот их кроме как в книжке Нортона (или кого там) только видел. Мне уже достались только io.sys и msdos.sys в моем досе. Правда что в IBMBIO.SYS была большая часть того что сейчас в BIOS?
io.sys = ibmbio.sys = drbio.sys = ptsbio.sys = rombio.sys
msdos.sys = ibmdos.sys = drdos.sys = ptsdos.sys = romdos.sys
Предназначено для разжигания холиваров на тему, DOS какого производителя круче. Кстати, в MS-DOS 7.x-8.x, который встроен в Windows 95/98/Me всего один файл IO.SYS, а в Free DOS — только KERNEL.SYS, а второй (msdos.sys) разжалован за ненадобностью.
Зачем при этом форматировать диск? Достаточно же с любого Живого Компактного Диска просто удалить windows/program files и т.п.
И передавать по наследству от отца к сыну.
А вообще, эта традиция пошла из-за засранности диска и вирусов? Или из-за "халявной дефрагментации"?
Ну я вот грузился с dos'овской дискетки, переименовывал windows, program files, docs & settings, затем ставил винду, и уже из винды выносил из тех папок лишнее... Но кому хотелось так извращаться? Вот и форматировали все к хуям.
Можно ;) Ну правда в других функциях 0 не подразумевается, и вернет что-нибудь другое, что под руку попадется. Где-то здесь даже был пример возвращающего правильное значение (при -O2) кода из лабы:
Ну и если код никогда не дойдет до этой точки, то UB'а не будет. И некоторым людям нравится (мне не нравится), что кресты и сишка, в отличие от жабы не заставляет дописывать в таких случаях бесполезный return или throw...
Эту херню с возвратом 0 из main'а прикрутили в с99 и почему-то в крестах. Я честно не понимаю, зачем это нужно, особенно в крестах. Видимо совместимость с каким-нибудь говном мамонта.
Т.е. ты конечно можешь сказать линкеру, что тебе нужна другая точка входа. Но получится совсем не то, что ты хотел :)
В gcc вызов main() зашит в модуль crt1.o. Если заменить этот модуль на свой, то можно вызвать функцию с любой сигнатурой, с какой захотим.
Вот аналогичный пример из Watcom C (где-то в недрах clib3s.lib есть cmain386.obj):
А вот пример из MSVC (где-то в глубинах libcmt.lib лежит модуль crt0.obj):
P.S. В Борман Си аналогичный фрагмент в c0x32.obj.
MS VS:
mainCRTStartup (or wmainCRTStartup)
WinMainCRTStartup (or wWinMainCRTStartup)
or
_DllMainCRTStartup
В основном конструкторы статических объектов.
хорошо что не vizbor