Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на C / C++

Выпуск № 052
от 04.08.2002, 23:00

Администратор:
Имя: Коробов Н.А.
URL: Информационный ресурс
ICQ: 365124
Украина, Днепропетровск
О рассылке:
Задано вопросов: 145
Отправлено ответов: 295
Активность: 203.4 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе]


 Список экспертов, ответы которых опубликованы в данном выпуске

E$h@
Статус: Начальный
Общий рейтинг: 171.42
[Подробней >>]
Pablo
Статус: Опытный
Общий рейтинг: 128.83
URL: Моя страничка
[Подробней >>]
Sinner
Статус: Доверительный
Общий рейтинг: 113.2
[Подробней >>]
 
Dzik
Статус: Опытный
Общий рейтинг: 111.87
URL: Разработка игрушек
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 113.88
[Подробней >>]
Sensey
Статус: Профессиональный
Общий рейтинг: 134.25
Телефон: +38 (0572) 41-76-04 дом.
[Подробней >>]
 
Александр
Статус: Профессиональный
Общий рейтинг: 118.46
[Подробней >>]
Ayl
Статус: Профессиональный
Общий рейтинг: 124.27
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 140. Знаете, я человек не особо компетентный в с++, но по-мойму даже яжу ясно чт main быть void не может!... (ответов: 8)
Вопрос № 141. Это ответ на вопрос № 140 Эдварда Самохвалова по поводу функции main. Рассказываю теорию. Фу... (ответов: 1)

Вопросов: 2, ответов: 9


 Вопрос № 140

Знаете, я человек не особо компетентный в с++, но по-мойму даже яжу ясно чт main быть void не может!!! или это другая main??? тогда она должна отличаться набором аргументов и типом их.


Приложение:


Вопрос отправлен: 01.08.2002, 01:28
Отправитель: эдвард самохвалов

[Следующий вопрос >>] [Список вопросов]

Отвечает E$h@

Приветствую Вас, эдвард самохвалов!
Год живу, два еб..сь :) и так далее...
Вобще-то может! Если, конечно тебе не нада обрабатывать параметры командной строки (argc, argv)
Удачи!


Ответ отправлен: 04.08.2002, 11:16
Отправитель: E$h@


Отвечает Pablo

Приветствую тебя, эдвард самохвалов!
Позволю себе не согласится с Артемом, по поводу того что если в функции не указан список параметров то, подразумевается что используется один параметр int!
Вот например в Билдере функции
void __stdcall Func();
void __stdcall Func1(void);
имеют слудующий вид после компиляции
@Func$qqsv
@Func1$qqsv
А при вызове функции Func передаца параметров через стек отсутстсвует.
В Turbo Сях там вооьще очен интересные вещи, в любом случае даже есть функция main объявлена как:
main(void), в стек передается три параметра. Единственно что они в этой функции не используются просто, и являются прозрачными. В обычные функции параметры передаются также как и в Билдере с типом передачи параметров __cdecl. В этом типе параметры передаются через стек справа налево. А сте восстанавливает после вызова подпрограммы вызвающая функция.
По поводу возвращаемого значения, я так думаю что на него налагается только одно условие, чтобы оно помещалось в регистр ax(eax), т.к. в большинстве случаев используется именно он для возврата результата из подпрограмма. То есть я думаю что объявлять main можно следующими типами:
void main();
char main();
short main();
int main();
наряду с беззнаковыми версиями типов.
Символ подчеркивания как у main так и у других функций появляется вследствие определенного для них типа передачи параметров __cdecl. Для __stdcall и др. типов этот символ не появляется.

Ответ отправлен: 01.08.2002, 16:38
Отправитель: Pablo


Отвечает Sinner

Приветствую Вас, эдвард самохвалов!
Еще как может!!!

Ответ отправлен: 01.08.2002, 04:36
Отправитель: Sinner


Отвечает Dzik

Здравствуйте, эдвард самохвалов!
Это тот самый Main и он может быть войд.
Скорее всего загрузчик С сам проверяет такую ситуацию и подстраивается под нужный формат main(т.е. с параметрами/без параметров, возвращает int/void)

Ответ отправлен: 01.08.2002, 06:39
Отправитель: Dzik


Отвечает vitya

Доброе время суток, эдвард самохвалов!
на самом деле может. По стандарту анси она выглядит
так
int main()
{
}
однако же есть вариации
void main();
int main(int, char**);
void main(int, char**);
int main(int, char**, char**);
void main(int, char**);
компиляторы их кушают, но void функции не соответствуют стандарту.



Ответ отправлен: 01.08.2002, 08:30
Отправитель: vitya


Отвечает Sensey

Добрый день, эдвард самохвалов!
Че это не может? Может же все таки!


Ответ отправлен: 01.08.2002, 09:56
Отправитель: Sensey


Отвечает Александр

Здравствуйте, эдвард самохвалов!
Ну ежу может и ясно, но на самом деле может быть либо void либо int, а параметры либо void, либо int, char*[]. Не понимаю вообще сути претензий. А функция main в каждой программе своя, так что она всегда немножко другая :-). Т.е. возможны на самом деле 6 вариантов объявления main:
void main(void)
int main(void)
void main(int argc, char * argv[])
int main(int argc, char * argv[])
void main()
int main()
P.S. Вроде ничего не забыл...
P.P.S. RTFM!


Ответ отправлен: 01.08.2002, 10:20
Отправитель: Александр


Отвечает Ayl

Добрый день, эдвард самохвалов!
Ну, у ежей, возможно, void main быть не может, а в Си - может!
Если наша программа не должна возвращать значения в ОС - нафига этим заниматься? Так честно и напишем - не хотим ничего возвращать и не будем! Хотя это не соотвествует стандарту ANSI. Но поддерживается компиляторами.
Что такое "другая main"? main - это просто точка начала программы. А вообще она может возвращатть целое значение (типа int) и принимать до 3-х параметров - количество параметров в командной строке, сама командная строка и окружение.
Комментарий к ответу эксперта Александр. Видимо, в двух последних описаниях main ты все-таки имел в виду такие:
void main (int c, char * argv[], char * env[]);
int main (int c, char * argv[], char * env[]);
? Тогда точно ничего не забыл.
Просто насколько я понимаю, описания
type func (void); и
type func ();
суть одно и тоже.

Ответ отправлен: 01.08.2002, 11:13
Отправитель: Ayl


 Вопрос № 141

Это ответ на вопрос № 140 Эдварда Самохвалова по поводу функции main.

Рассказываю теорию.
Функция в тех версиях Си, с которыми я знаком, принимает параметры через стек. При этом первый параметр помещается в стек последним. Этот механизм позволяет передавать дополнительное произвольное число параметров кроме тех, что явно описаны. Примером может служить функция void printf(char *, ...). Если в описании функции не указан список параметров, то подразумевается, что функция принимает один параметр типа int (Ayl здесь ошибся). Аналогично, если не указан тип возвращаемого результата, то подразумевается, что функция возвращает тип int.

Все загрузчики/инициализаторы вызывают _main, а параметры запихивают в стек (обычно это число аргументов и массив указателей на аргументы), при этом ожидают, что функция вернёт int.
Но линкер не знает, как описана функция main, он только видит public _main - и всё! Поэтому смело можешь описывать свою функцию как душе угодно. Я, например наваял такое (см приложение). Вот только изменять параметры не рекомендуется - будут грандиозные проблемы.


Приложение:


Вопрос отправлен: 01.08.2002, 12:34
Отправитель: Артём Шегеда

[Следующий вопрос >>] [Список вопросов]

Отвечает vitya

Добрый день, Артём Шегеда!
должен сказать лишь одно, поведение программы отнюдь не определенно, и даже очень вероятно, что она вылетит.

Ответ отправлен: 01.08.2002, 12:56
Отправитель: vitya



Форма отправки вопроса

Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (45)
C / C++ (30)
Perl (10)
Delphi (16)
Pascal (32)
Basic / VBA (11)
Java / JavaScript (11)
PHP (8)
MySQL / MSSQL (10)
Пользователю
Windows 95/98/Me (45)
Windows NT/2000/XP (31)
"Железо" (36)
Поиск информации (18)
Администратору
Windows NT/2000/XP (15)
Linux / Unix (11)
Юристу
Гражданское право (5)
Семейное право (3)
Трудовое право (4)
КоАП (2)

Отправить вопрос всем экспертам выбранной рассылки.




be number one Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное