LINUX.ORG.RU
решено ФорумTalks

Это тот (те дроиды) С который настоящий С?

 


1

0
#include<stdio.h>
struct denom{
    struct denom *prev;
    int base;
    int power;
    int n;
}   start;

int forward(struct denom* A){struct denom next;

    if(A->n==1){
        backward(1,A->prev);
        return 0;
    }

    while(A->n%A->base)A->base++;//yes, not so fast;

    A->power=0;
    do{A->power++;
        A->n/=A->base;
    }while(!(A->n%A->base));

    next=*A;
    next.prev=A;
    forward(&next);
}

int
backward(int out,struct denom* A){
    int i;
    for(i=0;i<=A->power;i++){
        if(A->prev){
            backward(out,A->prev);
        }else{
            printf("%d ",out);
        }
        out*=A->base;
    }
}

int main(){
    start.prev=NULL;start.base=2;start.power=0;

    scanf("%d",&start.n);

    if(start.n==1){printf("1 ");return 0;}

    forward(&start);
    return 0;
}

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

★★☆

Последнее исправление: qulinxao (всего исправлений: 1)

С как С.

Ну прогони через astyle, да настрой свой редактор.

Bfgeshka ★★★★★
()

Какая-то отвратительная хрень. Сделай вот так:

#include <stdio.h>
#include <stdlib.h>

static struct denom {
	struct denom    *prev;
	int              base;
	int              power;
	int              n;
} start = {
        .base = 2
};

void backward(int, struct denom *);

void forward(struct denom *A)
{
	struct denom next;

	if (A->n == 1) {
		backward(1, A->prev);
		return;
	}

	while (A->n % A->base)
		A->base++;

	A->power = 0;

	do {
		A->power++;
		A->n /= A->base;
	} while ((A->n % A->base) == 0);

	next = *A;
	next.prev = A;

	forward(&next);
}

void backward(int out, struct denom *A)
{
	for (int i = 0; i <= A->power; i++) {
		if (A->prev)
			backward(out, A->prev);
		else
			printf("%d ", out);
		out *= A->base;
	}
}

int main()
{
	scanf("%d", &start.n);

	if (start.n == 1)
		printf("1 ");
        else
                forward(&start);

	exit(EXIT_SUCCESS);
}
kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 1)

//yes, not some fast;

Это какой язык ?

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

Йозеф Эметс

Человек, притворяясь, забывает, что маска прирастает к коже, а после врастает и в мясо. Исключений нет, какой бы чужеродной и временной маска ни казалось бы поначалу. Один претворяется слабым и становится слабым. Другой притворяется циником и становится циником. Ничто не бетонирует душу быстрее лжи. Вода принимает форму того сосуда, в котором находится. А если вода замерзает, то сосуд лопается — и вот она, готовая форма. Нужно быть очень осторожным со временным. Оно очень скоро становится постоянным

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

подразумевал что была ложная дихотомия.

тут кста дислектикой(именем) явно не словарно(денотат вот это всё) оперируют.

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

Когда мне гугл отвечает, я его и то больше понимаю.

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

тема этого треда вообщет

отчего при изучении(обучении) указателей структур и -> начинают сразу использовать библиотечные малок и фри когда как вышеприведённый пример имхо более соотвествует истории развития языка ну и вообще такой «странности» как -> оператор

qulinxao ★★☆
() автор топика
Ответ на: комментарий от CaptainFarrell

Это название рассказа, которое несколько раз встречается в тексте рассказа

qulinxao ★★☆
() автор топика
Ответ на: комментарий от kirk_johnson

есть ли возможность освоботить от A->

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

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

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

АААААААААААААААААААААААААА ЧТО ТЫ НЕСЕШЬ?!

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

jr.

есть однонаправленный связанный список в стартовой программе.

можно ЛИ так переписать интерфейс(прототип) функции forward что бы вызов был бы

forward(node* prev,int a,int b,int c)

то есть убрать явное выделение struct denom next и потом копирование и модификацию next = *A; next.prev = A;

и вызывать

forward(&prev,a,b,c)

???

тогда к полям можно обращаться явно по имени без явного A->

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

и да что вычитывается из программы - что она делает?

qulinxao ★★☆
() автор топика

Ты с жабы/жабоскрипта что-ли начинал? :) Вермишель такая...

Прогони через indent, что-ли, не позорься.

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

можно ЛИ так переписать интерфейс(прототип) функции forward что бы вызов был бы forward(node* prev,int a,int b,int c)

Ты хочешь заменить рекурсию на итерацию?

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

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

#include<stdio.h>
struct denom{
	struct denom *prev;
	int base;
	int power;
	int n;
};
int forward(struct denom *prev,int base, int power, int n){
//	struct denom *local=&prev;
	if(n==1){
		backward(1,prev);
		return 0;
	}
	while(n%base)base++;//yes, not so fast;
	power=0;do{
		power++;
		n/=base;
	}while(!(n%base));
	forward(&prev,base,power,n);
}
int backward(int out,struct denom* A){
	int i;
	for(i=0;i<=A->power;i++){
		if(A->prev){
			backward(out,A->prev);
		}else{
			printf("%d ",out);
		}
		out*=A->base;
	}
}

int main(int n){
	scanf("%d",&n);
	if(n==1){printf("1 ");return 0;}
	forward(NULL,2,0,n);
	return 0;
}

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

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

По существу - данный пример есть вещь в себе. Результатом работы функции (то, что выводится в stdout) как-то воспользоваться (для дальнейших вычислений, например) будет крайне проблематично.

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

У тебя ошибка.

int forward(struct denom *prev,int base, int power, int n)
{
struct denom *local=&prev;
....
prev уже имеет тип struct denom * ,по сути ты пытаешься записать в local struct denom **, правильно будет так:
struct denom *local=prev;
Но не суть.Далее

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

С не относится к managed языкам (в отличии от Java и C#). А следовательно структура всегда явная.Или я опять не понял, что ты хотел сказать.

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

Это маркетинговое выражение Microsoft.

Я просто не знаю как их обозвать.Если вы знаете подскажите, буду очень благодарен.

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

Честно говоря, я, как и вы, не очень уверен в том, что понимаю, что имел в виду товарищ кулинксао. Может, «безопасный» или «высокоуровневый»?

Deleted
()
Последнее исправление: romeo250501 (всего исправлений: 1)
Ответ на: комментарий от BlackJack

ох Ё.

мысль устроить список на стеке(и не просто на стеке что можно локальной структурой, а список на стеке из аргументов функций) по мере вызовов форфард.

будь передача аргументов всегда через стек и падинги такиеже как при организации структуры то адресс первого аргумента функции т.е. &prev можно использовать как начало структуры

cur=(struct denom*)&prev

но поля итак как аргументы доступны поэтому эта эквивалентность важна только для функции бэквард.

крч. 1)есть ли стандартный способ гарантировать одинаковые падинги у структур и у полей функции ? 2) передача нужных полей именно через стек

зы. от того что тут взятие указателей и разыминованние внимательный взгляд позволяет заметить тут нет динамического выделения(только автоматическое) и счего вы там оба стали про менеджед ...

qulinxao ★★☆
() автор топика
Ответ на: комментарий от BlackJack

мне не нужно копирование , я закаментированной строкой показываю семантику адресса по которому передан первый аргумент функции prev как начала структуры с одноимёнными полями

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

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

#pragma pack(0);

есть ли стандартный способ гарантировать одинаковые падинги у структур и у полей функции

Это вообще то гарантируется самим языком.Если конечно ты не развлекаешься с прагмами.

передача нужных полей именно через стек

А в чем вопрос передавай, значение структуры по стеку. Ты вполне можешь написать

int forward(struct denom prev,int base, int power, int n);
 
Тогда вызов будет таким
struct denom data;
forward(data,2,0,n);
В результате вызова на стеке будет создана копия структуры data.

BlackJack
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.