LINUX.ORG.RU

Итератор из функции

 


1

3
#include <stdio.h>

void func()
{
	for (int i = 1; i <= 4; i++) {
		printf("%d\n", i);
	}
}

int main()
{
	func();
	return 0;
}

Можно это переделать, чтобы использование func() было в стиле

int main()
{
	while ((i = func()) != NULL) {
		printf("%d\n", i);
	}
	return 0;
}

без сохранения всего результата выполнения for{} в память?


Ответ на: комментарий от beastie

я про стиль написания - у вас int на отдельной строчке.

А в хартбите было еще лучше. Нет исходника под рукой, но там было что-то типа такого:

int fun(int arg1
, int arg2
, int arg3)
RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 2)
Ответ на: комментарий от RiseOfDeath

Тип возвращаемого значения функции отдельной строкой - это BSD style. И по-моему это разумно, т.к. в случае длинного типа (указателя на структуру, например), глаза лучше парсят именно такой стиль.

Sorcerer ★★★★★
()
Ответ на: комментарий от RiseOfDeath

Этот стиль называется BSD KNF. У него есть свои преимущества. В частности гораздо проще грепить сырцы по названиям функций. Да и на глаз читабельней.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от tailgunner

ага, он вызывает сферические команды в вакууме. а ядро ему типа не говорит: иди нафиг, у тебя нет привилегий управлять процом!

Iron_Bug ★★★★★
()
Ответ на: комментарий от Sorcerer

да вот фиг его знает. по-моему, глаза ломаются, когда этот int там завис в воздухе. это и нечитабельно, и занимает больше места по вертикали. не всегда критично, но иногда такая вертикально размазанная каша очень неудобна для чтения и редактирования. я лично думаю, что функция со всеми её аргументами и результатом должна помещаться в одну строку. если не помещается - стоит задуматься над передачей параметров структурой.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

ага, он вызывает сферические команды в вакууме. а ядро ему типа не говорит: иди нафиг, у тебя нет привилегий управлять процом!

Твое непонимание предмета просто удивительно для системного программиста.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

нет. просто ты попутал те вещи, которые делает за тебя компилятор, с работой системы. но в С компилятор ничего за тебя не делает и это принципиально. поэтому все эти нашлёпки от огрызков никогда не войдут в стандарт.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

ты попутал

Нет.

в С компилятор ничего за тебя не делает и это принципиально.

OpenMP? Не, не слышали. UPC? Штоето.

поэтому все эти нашлёпки от огрызков никогда не войдут в стандарт.

Всем пофиг. Интересны реальные компиляторы.

tailgunner ★★★★★
()
Ответ на: комментарий от proud_anon

вот потому оно и GNU C, а не стандарт. я тоже могу дописать какую-то свою фичу в компилятор, никто не мешает. но только это уже будет мой личный кастомный вариант, а не С.
стандарт - это не просто так с потолка взявшиеся правила. они обязаны сохранять переносимость и адекватность работы на всех архитектурах. это главное свойство С. для языков верхнего уровня такие тонкости до фени, они не работают с железом. С прежде всего нацелен на работу с железом, а потом уже всё прочее. поэтому в нём важно сохранять простоту синтаксиса и избегать излишних конструкций, которые просто дублируют другие реализации.
все эти нашлёпки не не несут никакого смысла. в данном случае локальные функции - это типичнейший синтаксический сахар и эталонное ненужно. в С есть структуры и указатели на функции и этого достаточно. из них элементарно это всё строится. в язык ничего добавлять не требуется.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

Тут Вышел первый том книги А. В. Столярова «Программирование: введение в профессию» (комментарий) интересный пример:

#include <stdio.h>

typedef int (*funp)(int);

funp get_cl(int a) {
    int cl(int b) {
        return a + b;
    }
    return cl;
}
int main() {
    funp fp = get_cl(10);
    printf("%d\n", fp(5));
    return 0;
}
Вроде указатель, однако он «помнит» про 10.

anonymous
()
Ответ на: комментарий от anonymous

в С для этого всегда использовались функторы. или если совсем для нубов, то статические переменные можно юзать. зачем городить такой уродливый нечитабельный синтаксис для простейших вещей?

Iron_Bug ★★★★★
()

Никогда так не делай:

#include <stdio.h>

int *
func(void)
{
	static __thread int *p = NULL;
	static __thread int state = 1;

	if (p) {
		state++;
		if (state > 4) {
			p = NULL;
		}
	} else {
		state = 1;
		p = &state;
	}

	return p;
}

int
main(void)
{
	int *i;

	while ((i = func()) != NULL) {
		printf("%d\n", *i);
	}

	printf("and another time\n");

	while ((i = func()) != NULL) {
		printf("%d\n", *i);
	}

	return 0;
}
i-rinat ★★★★★
()
Ответ на: комментарий от mystery

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

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

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

mystery ★★
()
Ответ на: комментарий от Iron_Bug

я не знаю. потому и спрашиваю.

Вот это выглядит как утверждение: Итератор из функции (комментарий)

с моей точки зрения разницы нет.

И оно противоречит этому. Собственно, поэтому и спрашиваю.

i-rinat ★★★★★
()
Ответ на: комментарий от Iron_Bug

Колбэк — это концепция. А указатель на функцию — реализация концепции. Это не одно и то же.

Они соотносятся примерно как «устройство ввода информации» и «клавиатура».

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

мы здесь про С говорим, а не про философию программирования. хоть горшком назови - всё равно указатель.
я отчасти не люблю весь этот пафос, когда простые вещи начинают называть какими-то псевдоумными словами. из-за этого программирование для начинающих превращается в ад. они воображают, что есть какие-то особые «коллбэки», «замыкания», «вложенные функции». а ничего нет. есть только указатель.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.