powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R 6.2 Структуры и функции
25 сообщений из 32, страница 1 из 2
K&R 6.2 Структуры и функции
    #38602505
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Возникли вопросы после прочтения главы 6.2 K&R. Подскажите пожалуйста


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
//6.2
	printf("6.2 \n");
	//Проверка на возможность копирования структур
	x = { 10, 10, 2013 };
	y = x;
	//1. Как бы вывести нормально, например в цикле делать printf
	printf("%i %i %i %i %s \n", x.day, x.month, x.year, x.yearday, x.monname); 
	printf("%p %p %p %p %p \n", &x.day, &x.month, &x.year, &x.yearday, &x.monname);
	printf("%i %i %i %i %s \n", x.day, y.month, y.year, y.yearday, y.monname);



2. Я снова встретил это выражение, про внешние и статические структуры. Может быть это неправильный перевод ?
K&RИ наконец,
автоматические структуры, как и автоматические массивы, не могут быть инициализированы; инициализация возможна только в случае внешних или статических структур.


Ещё появились какие-то автоматические структуры и массивы.

3.
Код: plaintext
1.
printf("%p %p %p %p %p %p \n", &x, &x.day, &x.month, &x.year, &x.yearday, &x.monname);



Адрес x и адрес первого члена x.day совпадают. Т.о. я пришёл к выводу что структура хранится как связанные друг с другом куски памяти различной длины (как массив элементы которого могут иметь разную размерность). Это верно ?

4. Далее приводится сахарный оператор, который на мой взгляд совершенно не нужен, запись (*ps).smth_el куда очевидней чем псевдокод ps->smth_el. Вообщем переписал функцию которая приведена в примере по-другому. А как вы относитесь к оператору "->" ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//set day of year from month,day
void set__day_of_year(struct date* pd)
{
	int i, leap;
	leap = ( (*pd).year % 4 == 0 ) ? 0 : 1;
	(*pd).yearday = (*pd).day;
	for (i = 1; i < (*pd).month; i++)
	{
		(*pd).yearday += day_tb[leap][i];
	}
}
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38602509
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алгоритм вычисления високосного года упрощённо намеренно.
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38602528
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury2. Я снова встретил это выражение, про внешние и статические структуры. Может быть это неправильный перевод ?Когда сомневаешься в переводе - берешь оригинал и читаешь.
А вообще, я тебе очень не рекомендую возится с не именованными структурами. По стандарту их делать можно, а на практике это никогда не нужно. В реальном проекте у тебя всегда будут десятки различных структур и вляпывать туда еще и не именованные - нафиг-нафиг.

SashaMercuryАдрес x и адрес первого члена x.day совпадают. Т.о. я пришёл к выводу что структура хранится как связанные друг с другом куски памяти различной длины (как массив элементы которого могут иметь разную размерность). Это верно ?Да, верно. В этом и есть смысл структуры - набор разнотипных элементов.

SashaMercury4. Далее приводится сахарный оператор, который на мой взгляд совершенно не нужен, запись (*ps).smth_el куда очевидней чем псевдокод ps->smth_el. Вообщем переписал функцию которая приведена в примере по-другому. А как вы относитесь к оператору "->" ? Ниче, привыкнешь :)
А для начала посчитай: (*ps). - 4 символа. ps-> - два символа. Ты все еще хочешь заниматься ручным разименованием?
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38602593
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА для начала посчитай: (*ps). - 4 символа. ps-> - два символа.(*ps). - 4 символа и 3 шифта, ps-> - 2 символа и один шифт ;-))
вообще говоря, современные IDE умеют по контексту понимать, чего надо ставить, точку или ->, поэтому проблема практическое значение потеряла, по факту ))
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38602815
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА как вы относитесь к оператору "->" ?
Как к фиче языка, которую пользуют в 99% там где не надо.

Например чтобы использовать твою функцию set__day_of_year(struct date* pd) надо писать так
Код: plaintext
1.
2.
struct date d;
set_day_of_year(&d);



А если переделать ее на передачу параметра по ссылке
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//set day of year from month,day
void set_day_of_year(struct date& d)
{
	int i, leap;
	leap = ( d.year % 4 == 0 ) ? 0 : 1;
	d.yearday = d.day;
	for (i = 1; i < d.month; i++)
	{
		d.yearday += day_tb[leap][i];
	}
}


то использовать можно так
Код: plaintext
1.
2.
struct date d;
set_day_of_year(d);


И это не только убирание нагромождения лишних * и & , но и возможность простого переноса кода копипастом, например так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct date d;
int i, leap;
leap = ( d.year % 4 == 0 ) ? 0 : 1;
d.yearday = d.day;
for (i = 1; i < d.month; i++)
{
	d.yearday += day_tb[leap][i];
}


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

Мое личное мнение в книгах злоупотребляют использованием указателей, т.к. это круто потому что в других языках их нет. Реально именно указатель нужен в 1% случаев, для остальных 99% достаточно передачи параметра по ссылке.
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38602832
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМое личное мнение в книгах злоупотребляют использованием указателей, т.к. это круто потому что в других языках их нет. Реально именно указатель нужен в 1% случаев, для остальных 99% достаточно передачи параметра по ссылке.в С нет ссылок, ау!
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38602836
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychв С нет ссылок, ау!
ну тогда скажи как правильно это называется
Код: plaintext
1.
void set_day_of_year(struct date& d)


В других языках называется "передача параметра по ссылке"
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38602913
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКак бы вывести нормально, например в цикле делать printf
Вынеси в отдельную функцию
Код: plaintext
1.
2.
3.
4.
5.
void print_date(const char* note, struct date& x)
{
	printf("%s value: %i %i %i %i %s \n", note, x.day, x.month, x.year, x.yearday, x.monname); 
	printf("%s addr: %p %p %p %p %p \n", note, &x.day, &x.month, &x.year, &x.yearday, &x.monname);
}



А в коде
Код: plaintext
1.
2.
3.
4.
x = { 10, 10, 2013 };
print_date("x", x);
y = x;
print_date("y", y);
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603057
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tegorychв С нет ссылок, ау!
ну тогда скажи как правильно это называется
Код: plaintext
1.
void set_day_of_year(struct date& d)


В других языках называется "передача параметра по ссылке"а в С это называется "ошибка компиляции". С и С++ - разные языки, есичё
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603306
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В целом я понял :)
Dima_T, хороший пример, теперь более понятно зачем появилась передача значений по ссылке дополнительно к указателям.
White Owl, я за то чтобы бы все логарифмы были натуральными. Потому, этот сахар мне не нравится, напоминает препроцессорную опцию, точнее макроподстановку #define x->y (*x).y , и есть предположение что аналогично происходит. Но ваши мысли мне понравились, спасибо :-) Всем спасибо )
У вас интересный спор, хорошо что в нем открывается истина
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603400
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryнапоминает препроцессорную опцию, точнее макроподстановку #define x->y (*x).y , и есть предположение что аналогично происходит.в С++ оператор -> можно перегрузить, а оператор "точка" - нет. Для С замечание неактуальное, естественно

P.S. Чтобы окончательно закрыть вопрос, можно посмотреть, конечно, чё оно в ассемблере нагенерит для x->y и для (*x).y, но мне лень, например. Уверен, что код одинаковый.
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603486
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych С и С++ - разные языки, есичё
Ну так объясни это производителям компиляторов. Чтоб работало либо printf() либо cout. Лично я этой границы не знаю и знать не хочу. Но писатели книжек ее жестко придерживаются, в итоге в литературе либо сплошные *, & и ->, либо взрывы мозга с шаблонами и перегрузками. В общем крайности без намека на золотую середину. Сам учился по таким книжкам.
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603609
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЛично я этой границы не знаю и знать не хочу.
зачем тогда икру мечешь?
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603611
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tegorych С и С++ - разные языки, есичёНу так объясни это производителям компиляторов.они в курсе, не поверишь ты можешь компилировать либо в С, либо в С++, все компиляторы это поддерживают, из известных. Некоторым достаточно подсунуть исходник с расширением .c, чтобы начать в С компилировать.

K&R - это С: Брайан Керниган, Деннис Ритчи. Язык программирования С , а топикстартер спрашивает про неё, вряд ли имеет смысл давать ему советы про другой язык, не находишь?
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603662
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych вряд ли имеет смысл давать ему советы про другой язык

топикстартер считает что стоит.
Хорошо постепенно принимать различия между множествами С и С++.
Еще и про перегрузку узнал, отлично. А про printf почитаю в черновике стандарта С++, я думал что С++ полностью включает в себя С. Хотя не уверен что фраза printf \in C будет истинна.

Изопропил, egorych, не ругайтесь пожалуйста. Мне например нравится чистая дискуссия. Вот если я футбол например играю, тогда могу резкое что-нибудь сказать, или кто-нибудь жутко тормозит, тогда тоже могу не сдержаться.
Дмитрий просто недосказал что-то, или по-своему захотел ответить на поставленный вопрос, у каждого ведь своя точка зрения, и это не значит что он не знает, для меня очевидно что знает, он ответил, а вы прокомментировали, и за счёт этого мы обменялись своими мнениями (у меня так вообще самый большой плюс, я узнал из вашего спора что-то новое, понимаю что-то рассматривает с/с++ вместе,а кто-то раздельно, и та и другая точка зрения имеет право на жизнь, вероятно, но для меня на данный момент есть два множества, между которыми я пока не могу поставить знак "вложено" ).

Но мы ведь все (и egorych, и Изопропил, и Дмитрий, и я)занимаемся программированием, науке очень близкой к математике. Разве только это уже не здорово ;)

Спасибо за знания C:

ps
Dima_Tлибо взрывы мозга с шаблонами и перегрузками

здорово звучит, уже хочу их ^_^
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603663
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня на одной пятой экрана ноутбука чёрные пятна, потому ошибаюсь иногда (
кто-то рассматривает с/с++ вместе,а кто-то раздельно *
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603675
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima TЛично я этой границы не знаю и знать не хочу.
зачем тогда икру мечешь?
Накипело, сам в студенчестве восхищался брутальностью указателей, до тех пор пока вместо тестовых задачек не попытался написать что-то посерьезнее.

Хочу понять реально в чем разница С и С++. Всегда считал что С++ содержит в себе С.
И единственное ограничение с которым сталкивался:
egorychподсунуть исходник с расширением .c
Так чего нет С++ что есть в С ?
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603682
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТак чего нет С++ что есть в С ?
В основном мелочи разные.

Самое серьезное:
- неявное приведение из void* к конкретному типу указателя
- поименная инициализация полей структур.
- локальные массивы переменной длины

Первые 2 очень часто применяют в С, поэтому в большинстве реальных проектов С код не компилируется С++ компиляторами.
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603767
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky- поименная инициализация полей структур.вот это очень хочется иметь в С++
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603791
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
        //1. Как бы вывести нормально, например в цикле делать printf
	printf("%i %i %i %i %s \n", x.day, x.month, x.year, x.yearday, x.monname); 


SashaMercury, общее решение этой задачи лежит в плоскости других языков или парадигм или подходов.
Например в Lisp ты можешь обойти любую структуру (список списков) и вывести все элементы.

В С++ усилиение макропроцессора - это "путь в никуда". Это не способствует развитию "собственно языка"
и runtime а просто усложняет понимание кода.
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603937
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИзопропилпропущено...
зачем тогда икру мечешь?
Накипело, сам в студенчестве восхищался брутальностью указателей, до тех пор пока вместо тестовых задачек не попытался написать что-то посерьезнее.
Хочу понять реально в чем разница С и С++. Всегда считал что С++ содержит в себе С.
И единственное ограничение с которым сталкивался:
egorychподсунуть исходник с расширением .c
Так чего нет С++ что есть в С ? Дело не в различиях лексическо-грамматической основы языков. Дело в подходах, в стиле, методиках. На С++ можно программировать в стиле С. Надо признать что на этом форуме много людей практикующих такой подход, своеобразный расширенный С можно сказать, используют - отчего же нет если задачи решаются.

Но все же если смотреть в mainstream (скажем самые популярные библиотеки, открытые проекты) - программирование на С и на С++ кардинально различаются. Приверженцы С ярые противники С++, приверженцы С++ ярые противники С. Потусуйтесь на freenode (IRC) (можно пообщаться с разработчиками boost, gcc, curl, linux, nginx - это из того с чем я знаком).

С очень прост в отношении функционала который он дает разработчику. Но каждый из этих малочисленных инструментов очень мощный и очень опасный, программисту дается бОльшая свобода, ценой большей ответственности. Любой серьезный проект на С неизменно содержит свою собственную "стандартную библиотеку" заточенную под него, например nginx: реализованы практически все основные структуры данных, алгоритмы, при этом они заточены на использование пулов и работу с небольшими данными - HTTP-запросы, то же самое можно сказать про curl, linux, postgres, libxml. В этом смысле переиспользование кода в С значимо меньше, что не есть плохо, эти проекты - высокоэффективные самодостаточные системы со своей внутренней жизнью.

В С++ акцент сильно смещен в сторону проектирования не только общей архитектуры, но и отдельных компонент. Если в С на уровне простых компонент вы видите одни и те же вещи (callbacks, contexts, pools) реализованные примерно одинаково (с заточкой под конкретные нужды), то здесь гораздо больше простора для творчества, что однако часто приводит к сложности с нахождением простого и красивого решения. Представьте вы попали в рай технарей, есть гигантский выбор инструментов, материалов, всякого рода станков, учебников - глаза разбегаются, хватаете сначала один инструмент, потом другой, третий, лепите, рисуете, сверлите, протягиваете на экструзионном станке, и еще вон на той странной штуке. В итоге получается малопонятная мазня - сборище склеенных фич.

С++ также предоставляет больше возможностей для структурирования систем, чем С. Это важно для крупных прикладных приложений. Эти возможности не такие мощные как в языках ориентированных на так называемый "enterprise" сектор, но их вполне достаточно (хотя может и нет).
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603967
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТак чего нет С++ что есть в С ?

При изучении C (а иначе зачем брать K&R?) важно чего нет в C, а не наоборот.

Dima TМое личное мнение в книгах злоупотребляют использованием указателей, т.к. это круто потому что в других языках их нет

Ага, вообще нигде нет .
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38603987
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за ответы.
Я выводы для себя сделал. Какие - не скажу, а то развернется религиозная дискуссия страниц на 10, пока модераторы не прикроют.
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38604021
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВсем спасибо за ответы.
Я выводы для себя сделал. Какие - не скажу, а то развернется религиозная дискуссия страниц на 10, пока модераторы не прикроют.ну и жаль ))
...
Рейтинг: 0 / 0
K&R 6.2 Структуры и функции
    #38604215
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0rvin, очевидно что имелось ввиду не буквально " только в Си есть указатели", а тот факт что указатели являются лицом языка. Не придирайтесь.

mayton, что такое макропроцессор я понимаю.Под усилением вы понимаете создание искусственной функции, делающей печать каждого элемента структуры ? Мне это не очень понравилось, ибо fe в структуре будет 10 членов, придётся писать новую функцию.
Или вы другое имеете ввиду ?

sherzod_ , Будет ли решаться на С весь класс задач решаемых на С++ ?
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R 6.2 Структуры и функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]