powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ исходного кода. Разбор IOCCC 1985 august
281 сообщений из 281, показаны все 12 страниц
Анализ исходного кода. Разбор IOCCC 1985 august
    #38718921
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Вчера я решил заняться чем-нибудь интересным. Решил разобрать код автора august, созданный в 1985 году для IOCCC. Ниже привожу код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#define p struct c
#define q struct b
#define h a->a
#define i a->b
#define e i->c
#define o a=(*b->a)(b->b,b->c)
#define s return a;}q*
#define n (d,b)p*b;{q*a;p*c;
#define z(t)(t*)malloc(sizeof(t))
q{int a;p{q*(*a)();int b;p*c;}*b;};q*u n a=z(q);h=d;i=z(p);i->a=u;i->b=d+1;s
v n c=b;do o,b=i;while(!(h%d));i=c;i->a=v;i->b=d;e=b;s
w n o;c=i;i=b;i->a=w;e=z(p);e->a=v;e->b=h;e->c=c;s
t n for(;;)o,main(-h),b=i;}main(b){p*a;if(b>0)a=z(p),h=w,a->c=z(p),a->c->a=u,
a->c->b=2,t(0,a);putchar(b?main(b/2),-b%2+'0':10);} 



0.1 Когда я стал его разбирать (на листочке конечно-же), мне стало понять почему мне говорили про кучу define, когда я спрашивал про то, как можно написать работу с длинными числами за 200 символов. Вероятно, написать и правда можно(если обладать фантазией с немалым коэффициентом извращённости).
0.2 Разобрал 2 строки после списка макрозамен, и решил что не серьёзно изучать Си, и не написать для этого программу (тем более, в дальнейшем её можно будет использовать для парсера языка).


1. Я решил, что сначала мне нужно получить список всех замен (как бы это слово правильно назвать, макроподстановок? ) в тексте. Написал для этого алгоритм. Подскажите пожалуйста, верен ли он ? Или я что-то/много что упустил.
2. Вероятно, лучше всего хранить список макрозамен в массиве структур. И ещё должна быть переменная, в которой хранится количество записей. Глобальная переменная.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct mr
{
	unsigned i;//номер по порядку, хотя я не уверен в его необходимости
	char* identifier = NULL;
	char* replacement_list = NULL;
};
...

struct mr* mrl = NULL;



Хотя в этом я не уверен. Правильно ли я думаю ?

3. Согласно стандарту может быть максимум 4095 разных макроидентификаторов?

ISO/IEC 9899:201x4095 macro identifiers simultaneously defined in one preprocessing translation unit


4. Можно ли посмотреть код, полученный после работы препроцессора VS ?

Модератор: Вложение удалено.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38718923
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рисунок просто огромный, прошу прощение. Я загружу новый. Удалите пожалуйста старый.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38718924
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury4. Можно ли посмотреть код, полученный после работы препроцессора VS ?
http://stackoverflow.com/questions/277258/c-c-source-file-after-preprocessing

Вам пора научиться гуглить

ЗЫ. Остальное мне не интересно, поэтому не комментирую.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38719132
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВам пора научиться гуглить
Да хотя бы открыть для себя ключи /?, -h, --help (в зависимости от компилятора)...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38719270
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алгоритм не совсем верный, он не распознает функции
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38719574
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, Сашок. У некоторых компилляторов есть опции
которые показывают результат макро-процессинга.

Воспользуйся им. Потом отформатируй нормально исходник
и мы с удовольствием на него посмотрим.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38719721
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Следующий шаг - изучить что такое CFG и bison.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38719929
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, спасибо :)

воспользовался ещё вчера, но у меня есть чувство, что навряд-ли вы посмотрите на этот код с удовольствием. Хотя мне он кажется интересным.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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.
#include <stdio.h>
#include <stdlib.h>

struct b
{ 
	int a; 
	struct c
	{ 
		struct b*(*a)(); 
		int b; 
		struct c*c; 
	}*b; 
}; 

struct b* u(int d, struct c* b)
{
	struct b* a; 
	struct c* c; 
	a = (struct b*)malloc(sizeof(struct b)); 
	a->a = d; 
	a->b = (struct c*)malloc(sizeof(struct c)); 
	a->b->a = u; 
	a->b->b = d + 1;
	return a; 
}

struct b* v(int d, struct c* b)
{
	struct b* a; 
	struct c*c; 
	c = b; 
	do a = (*b->a)(b->b, b->c), b = a->b; 
	while (!(a->a%d)); 
	
	a->b = c; 
	a->b->a = v; 
	a->b->b = d; 
	a->b->c = b; 
	return a; 
} 

struct b* w(int d, struct c* b)
{
	struct b* a; 
	struct c* c; 
	a = (*b->a)(b->b, b->c); 
	c = a->b; 
	a->b = b; 
	a->b->a = w; 
	a->b->c = (struct c*)malloc(sizeof(struct c)); 
	a->b->c->a = v; 
	a->b->c->b = a->a; 
	a->b->c->c = c; 
	return a; 
}

struct b* t(int d, struct c* b) 
{ 
	struct b*a; 
	struct c*c; 
	for (;;)
		a = (*b->a)(b->b, b->c), main(-a->a), b = a->b; 
}

main(int b)
{
	struct c*a; 
	if (b>0)a = (struct c*)malloc(sizeof(struct c)), a->a = w, a->c = (struct c*)malloc(sizeof(struct c)), a->c->a = u,
		a->c->b = 2, t(0, a); 
	putchar(b ? main(b / 2), -b % 2 + '0' : 10);
}



Anatoly Moskovsky, я не догадался сделать запрос на английском. Спасибо
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38720305
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, Саш. Это всё замечательно. А каково назначение этого алгоритма?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38720310
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Который я рисовал выше ? Xочу для начала написать слабую версию препроцессора, и алгоритм выше собирает все макроподстановки в файле. Но он не до конца верный
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38720394
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или алгоритма из конкурса запутанного кода ? Это я не знаю, хочется разобраться. Мне уже пора, до свидание всем. Если у кого-нибудь будут интересные мысли по коду, то пишите :)
PS
Всё-же удивляюсь, почему так мало кому интересен этот конкурс. Он наверное вам кажется слишком детским, и не серьёзным
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38720432
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саш я на правах обычного мембера выскажу своё мнение что часть твоих
постов - бесполезны для форума. И я тебя как мембер прошу фильтровать посты
по степени их полезности.

Желаю успехов.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38720437
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryXочу для начала написать слабую версию препроцессора, и алгоритм выше собирает все макроподстановки в файле. Но он не до конца верный
Нужно еще учесть что макроподстановки рекурсивные.
SashaMercuryВсё-же удивляюсь, почему так мало кому интересен этот конкурс. Он наверное вам кажется слишком детским, и не серьёзным
Разбираться в чужом коде - это работа за которую платят деньги :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780423
Фотография боевые
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСаш я на правах обычного мембера выскажу своё мнение что часть твоих
постов - бесполезны для форума. И я тебя как мембер прошу фильтровать посты
по степени их полезности.

Желаю успехов.
Не согласен. Не нужно решать за остальных читателей, что им полезно, а что нет. Афтору спасибо за работу, остальные сами решат полезен код или нет, кнопку закрытия вкладки никто не отменял.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780527
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercury, Сашок. У некоторых компилляторов есть опции
которые показывают результат макро-процессинга.

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

Код: plaintext
1.
2.
-P
для Microsoft C/C++ compiler
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780531
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте.

Вчера я решил заняться чем-нибудь интересным. Решил разобрать код автора august, созданный в 1985 году для IOCCC. Ниже привожу код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#define p struct c
#define q struct b
#define h a->a
#define i a->b
#define e i->c
#define o a=(*b->a)(b->b,b->c)
#define s return a;}q*
#define n (d,b)p*b;{q*a;p*c;
#define z(t)(t*)malloc(sizeof(t))
q{int a;p{q*(*a)();int b;p*c;}*b;};q*u n a=z(q);h=d;i=z(p);i->a=u;i->b=d+1;s
v n c=b;do o,b=i;while(!(h%d));i=c;i->a=v;i->b=d;e=b;s
w n o;c=i;i=b;i->a=w;e=z(p);e->a=v;e->b=h;e->c=c;s
t n for(;;)o,main(-h),b=i;}main(b){p*a;if(b>0)a=z(p),h=w,a->c=z(p),a->c->a=u,
a->c->b=2,t(0,a);putchar(b?main(b/2),-b%2+'0':10);} 





Этот код -- пример того, как не надо использовать препроцессор.
Я лично не понимаю, что тут интересного.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780558
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭтот код -- пример того, как не надо использовать препроцессор.
Я лично не понимаю, что тут интересного.
представь себе, что код нужно доставить в удалённую точку по телеграфному каналу со скоростью 110 бод
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780563
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилпредставь себе, что код нужно доставить в удалённую точку по телеграфному каналу со скоростью 110 бодИ почём сейчас машина времени???
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780568
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovИзопропилпредставь себе, что код нужно доставить в удалённую точку по телеграфному каналу со скоростью 110 бодИ почём сейчас машина времени???
ну так и код 1985 года.

а вот на javascript пожатый это сильно издали смахивает
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780621
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня другой вопрос волнует.

SashaMercury, где обещанный декодер? :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780643
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилну так и код 1985 годаЕсли сейчас обсуждается код 1985 года в контексте 110 бод, то у кого-то появилась (завалялась) машина времени.
Возникает закономерный вопрос: почём сейчас машина времени.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780715
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyМеня другой вопрос волнует.

SashaMercury, где обещанный декодер? :)

Здравствуйте. Прекрасно помню, и скоро (до конца года точно) реализую. С понедельника начну уже точно. Я делаю это долго, но поверьте мне я выполняю много посильной работы . Регулярно читаю стандарт, каждый день решаю более простые задачи. И ещё очень большой блок по математике,дифференциальные уравнения(параллельно изучению мной прекрасного языка Си). Также, постоянно читаю Кнута.

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

Резюмируя:
Я делаю это медленно, спасибо что подсказали, с понедельника начну более плотную работу именно над этим.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780716
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И улетал на полторы недели практически (
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780717
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надеюсь, что кому-то, разбор этого кода в итоге окажется интересным и полезным. Например разбор кода из 1 чемпионата мира по запутанному программному коду был интересен
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780718
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryAnatoly MoskovskyМеня другой вопрос волнует.

SashaMercury, где обещанный декодер? :)
Перед собой поставил более глобальную задачу, написать синтаксический анализатор языка Си
Чето мне нехорошо стало... пойду накапаю себе капель.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780726
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryпропущено...

Перед собой поставил более глобальную задачу, написать синтаксический анализатор языка Си
Чето мне нехорошо стало... пойду накапаю себе капель.
А шо тут такого. Это ж не компилятор, а всего лишь парсер.
Пишется за неделю, при условии что знаешь язык.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780731
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЭто ж не компилятор, а всего лишь парсер.
Пишется за неделю, при условии что знаешь язык.
Готовый YACC файл гуглится за минуту: http://www.quut.com/c/ANSI-C-grammar-y-2011.html
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38780738
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ну, чел же ясно сказал, что хочет придумать сам :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782421
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Вчера начала думать более плотно над задачей по частичной имитации работы препроцессора. Составил общий алгоритм. И мне кажется уже понял как это будет работать. Но я не уверен что правильно организовал структуру данных. Как вы считаете ? Как правильней назвать структуры ? Мне кажется названия не совсем корректные. Подскажите пожалуйста

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
//макрозамена
struct Macros
{
	int type;//тип макрозамены
	int count_arg;//количество аргументов
	char* identifier = NULL;
	char** list_arguments = NULL;//массив аргументов
	char* rep_list = NULL;
};

//все макрозамены
struct AllMacros
{
	int count;
	struct Macros* ms = NULL;
};
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782423
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только названия неправильные.
Есть object-like и function-like macro. Согласно стандарту.

ISO/IEC 9899:201x 6.10.3 Macro replacement6.10.3 Macro replacement
Constraints
1 Two replacement lists are identical if and only if the preprocessing tokens in both have
the same number, ordering, spelling, and white-space separation, where all white-space
separations are considered identical.
2 An identifier currently defined as an object-like macro shall not be redefined by another
#define preprocessing directive unless the second definition is an object-like macro
definition and the two replacement lists are identical. Likewise, an identifier currently
defined as a function-like macro shall not be redefined by another #define
preprocessing directive unless the second definition is a function-like macro definition
that has the same number and spelling of parameters, and the two replacement lists are
identical.
3 There shall be white-space between the identifier and the replacement list in the definition
of an object-like macro.
4 If the identifier-list in the macro definition does not end with an ellipsis, the number of
arguments (including those arguments consisting of no preprocessing tokens) in an
invocation of a function-like macro shall equal the number of parameters in the macro
definition. Otherwise, there shall be more arguments in the invocation than there are
parameters in the macro definition (excluding the ...). There shall exist a )
preprocessing token that terminates the invocation.
5 The identifier _ _VA_ARGS_ _ shall occur only in the replacement-list of a function-like
macro that uses the ellipsis notation in the parameters.
6 A parameter identifier in a function-like macro shall be uniquely declared within its
scope.
Semantics
7 The identifier immediately following the define is called the macro name. There is one
name space for macro names. Any white-space characters preceding or following the
replacement list of preprocessing tokens are not considered part of the replacement list
for either form of macro.
8 If a # preprocessing token, followed by an identifier, occurs lexically at the point at which
a preprocessing directive could begin, the identifier is not subject to macro replacement.
9 A preprocessing directive of the form
Код: plaintext
1.
# define identifier replacement-list new-line

defines an object-like macro that causes each subsequent instance of the macro name171)
to be replaced by the replacement list of preprocessing tokens that constitute the
remainder of the directive. The replacement list is then rescanned for more macro names
as specified below.
10 A preprocessing directive of the form
Код: plaintext
1.
2.
3.
# define identifier lparen identifier-listopt ) replacement-list new-line
# define identifier lparen ... ) replacement-list new-line
# define identifier lparen identifier-list , ... ) replacement-list new-line

defines a function-like macro with parameters, whose use is similar syntactically to a
function call. The parameters are specified by the optional list of identifiers, whose scope
extends from their declaration in the identifier list until the new-line character that
terminates the #define preprocessing directive. Each subsequent instance of the
function-like macro name followed by a ( as the next preprocessing token introduces the
sequence of preprocessing tokens that is replaced by the replacement list in the definition
(an invocation of the macro). The replaced sequence of preprocessing tokens is
terminated by the matching ) preprocessing token, skipping intervening matched pairs of
left and right parenthesis preprocessing tokens. Within the sequence of preprocessing
tokens making up an invocation of a function-like macro, new-line is considered a normal
white-space character.
The sequence of preprocessing tokens bounded by the outside-most matching parentheses
forms the list of arguments for the function-like macro. The individual arguments within
the list are separated by comma preprocessing tokens, but comma preprocessing tokens
between matching inner parentheses do not separate arguments. If there are sequences of
preprocessing tokens within the list of arguments that would otherwise act as
preprocessing directives,172) the behavior is undefined.
12 If there is a ... in the identifier-list in the macro definition, then the trailing arguments,
including any separating comma preprocessing tokens, are merged to form a single item:
the variable arguments. The number of arguments so combined is such that, following
merger, the number of arguments is one more than the number of parameters in the macro
definition (excluding the ...).
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782434
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

# и ## будешь обрабатывать?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782438
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
пока что не буду. Сначала нужно сделать это
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782444
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСоставил общий алгоритм
возможную рекурсию учёл?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782445
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилSashaMercuryСоставил общий алгоритм
возможную рекурсию учёл?

Да, буду проходить по тексту циклом до тех пор, пока количество замен за 1 проход не будет равно 0
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782448
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДа, буду проходить по тексту циклом до тех пор, пока количество замен за 1 проход не будет равно 0

рискуешь никогда не остановиться
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782450
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилSashaMercuryДа, буду проходить по тексту циклом до тех пор, пока количество замен за 1 проход не будет равно 0

рискуешь никогда не остановиться

тоже про это думал, но потом прочитал (позже найду где) что такое невозможно.

хм.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782454
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

в твоём алгоритме - возможно
на косвенную рекурсию обрати внимание
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782456
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для зацикливания достаточно написать:
1. заменить А на Б
2. заменить Б на А

Предусматривай выход из такой ситуации.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782591
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Препроцессоры С обычно однопроходные...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782842
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДа, буду проходить по тексту циклом до тех пор, пока количество замен за 1 проход не будет равно 0
Это неправильный подход.
Вместо этого у вас должна быть функция, которая на входе получает идентификатор, а возвращает список токенов после подстановки макроса. И аналогично для function-like macro.
И эти функции используются при токенизации текста перед парсингом.
Это все естественно за один проход делается.
Просто функции рекурсивные.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782926
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
А что вы можете сказать про предложенные структуры ? Я правильно их спроектировал, как вы считаете ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38782985
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСпасибо.
А что вы можете сказать про предложенные структуры ? Я правильно их спроектировал, как вы считаете ?
Ну можно и так. :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38783015
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это самое важное сейчас. Спасибо.
Завтра продолжу, у нас уже поздно..
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38783053
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо только учесть, что в реальном проекте был бы не массив макросов, а хеш-таблица.
Иначе не взлетит на больших исходниках, типа стандартных хедеров или winapi.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38783238
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

наличие elipsis ( ... ) в макроопределении имеет смысл в структуре отразить
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38783449
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сашик. Я тебе тест придумал.
Код: plaintext
1.
2.
3.
4.
5.
6.
/* Sasha's Funky test! */
#define TRUE FALSE
#define x xx
#define - --
#define if while
/* Mua-ha-ha.... :) */
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38783570
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСашик. Я тебе тест придумал.
Код: plaintext
1.
2.
3.
4.
5.
6.
/* Sasha's Funky test! */
#define TRUE FALSE
#define x xx
#define - --
#define if while
/* Mua-ha-ha.... :) */



Вот как :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38783571
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нашёл в стандарте, а разве нет ограничений на макроимена(если неправильно называю, то поправьте пожалуйста) ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38784017
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Имена макросов должны быть идентификаторами.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38784820
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Тестирую функцию формирования пространства макроопределения. Подскажите пожалуйста, где я ошибаюсь в работе с памятью ?(или в другом месте)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct Macro
{
	int type;//тип макроопределения, 0:object-like macro,1:function-like macro
	int count_args;//количество аргументов
	char* identifier = NULL;
	char** list_args = NULL;//массив аргументов
	char* rep_list = NULL;
};

struct MacroSpace
{
	int count;
	struct Macro* m = NULL;
};




далее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
//конструктор пространства макроопределений
struct MacroSpace* create_MacroSpace()
{
	struct MacroSpace*	ms = (struct MacroSpace*)malloc(sizeof(struct MacroSpace));
	ms->count = 0;
	return ms;
}



и начало функции в которой возникает ошибка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
//Добавление макроопределиния к пространству макросов
int add_macros(struct MacroSpace* ms, FILE* in)
{
	ms->count += 1;
	ms->m=(struct Macro*)realloc(ms->m, ms->count*sizeof(struct Macro));
	struct Macro* cur = &(ms->m[ms->count - 1]);//указатель на текущий макрос, создал его чтобы было проще работать в дальнейшем
...
}



и вот вызов функции

Код: plaintext
1.
2.
3.
4.
5.
6.
int main(int argc, char** argv)
{
	FILE* in = fopen("august.c", "r");
	struct MacroSpace* ms = create_MacroSpace();
	add_macros(ms, in);
...



ошибка в функции add_macros.
Диагностическое сообщениеавторUnhandled exception at 0x772BE753 (ntdll.dll) in preprocessing.exe: 0xC0000374: Куча была повреждена (parameters: 0x772F4270)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38784837
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока не разобрался в чём проблема, читаю книги. Решил немного изменить структуру макроопределения

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct Macro
{
	int type:2;//тип макроопределения, 0:object-like macro,1:function-like macro
	int count_args:15;//количество аргументов. максимум 15 бит, согласно стандарту ISO/IEC 9899:201x максимально число
	//макроопределений в одной единице трансляции 4095=4*2^10-1,т.о. достаточно 14 бит, +1(на всякий случай)
	char* identifier = NULL;
	char** list_args = NULL;//массив аргументов
	char* rep_list = NULL;
};



Подскажите пожалуйста, выиграю ли я в памяти если укажу явное количество бит на поля с известными ограничениями ? Не потеряю ли я в скорости или в чём-либо другом ?
Вы используете данный механизм в структурах ?

Как правильно назвать тот факт, что я дважды попросил количество бит с запасом ? фраза "на всякий случай" мне не нравится.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38784838
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, достаточно 12 бит, +1
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38784971
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саш структуры аллоцируют память кратную байтам, words, dwords.
Забудь про биты вообще! Напиши просто работающий софт а потом
будешь заниматься архивацией и уплотнением.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38784995
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСаш структуры аллоцируют память кратную байтам, words, dwords.
Забудь про биты вообще! Напиши просто работающий софт а потом
будешь заниматься архивацией и уплотнением.

Хорошо, к этому вопросу вернусь позже. Я догадывался что байтами, потому и спросил этот вопрос, ведь для чего-то этот механизм нужен, скорее всего для оптимизации по части памяти. Ладно, вернусь потом.

Пока пытаюсь понять в чём ошибка в коде
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785479
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct Macro
{
	int type;//тип макроопределения, 0:object-like macro,1:function-like macro
	int count_args;//количество аргументов
	char* identifier = NULL;
	char** list_args = NULL;//массив аргументов
	char* rep_list = NULL;
};

struct MacroSpace
{
	int count;
	struct Macro* m = NULL;
};


Где это вы в С видели инлайн-инициализаторы полей структур?
Их даже в С++ добавили только в С++11.
Очевидно вы нам тут приводите код, который не соответствует тому что вы в реальности компилируете.
Как не стыдно

SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
//Добавление макроопределиния к пространству макросов
int add_macros(struct MacroSpace* ms, FILE* in)
{
	ms->count += 1;
	ms->m=(struct Macro*)realloc(ms->m, ms->count*sizeof(struct Macro));
	struct Macro* cur = &(ms->m[ms->count - 1]);//указатель на текущий макрос, создал его чтобы было проще работать в дальнейшем
...
}


Соответственно исходя из выше сказанного, ms->m до первого вызова add_macros() содержит мусор. Вот и крэшится.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785516
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct Macro
{
	int type;//тип макроопределения, 0:object-like macro,1:function-like macro
	int count_args;//количество аргументов
	char* identifier = NULL;
	char** list_args = NULL;//массив аргументов
	char* rep_list = NULL;
};

struct MacroSpace
{
	int count;
	struct Macro* m = NULL;
};


Где это вы в С видели инлайн-инициализаторы полей структур?
Их даже в С++ добавили только в С++11.
Очевидно вы нам тут приводите код, который не соответствует тому что вы в реальности компилируете.
Как не стыдно

SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
//Добавление макроопределиния к пространству макросов
int add_macros(struct MacroSpace* ms, FILE* in)
{
	ms->count += 1;
	ms->m=(struct Macro*)realloc(ms->m, ms->count*sizeof(struct Macro));
	struct Macro* cur = &(ms->m[ms->count - 1]);//указатель на текущий макрос, создал его чтобы было проще работать в дальнейшем
...
}


Соответственно исходя из выше сказанного, ms->m до первого вызова add_macros() содержит мусор. Вот и крэшится.

Что такое инлайн-инициализаторы ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785550
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЧто такое инлайн-инициализаторы ?
Код: plaintext
1.
2.
3.
4.
5.
6.
struct Macro
{
	...
	char* identifier = NULL; // это - инлайн-инициализатор
	...
};
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785551
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЧто такое инлайн-инициализаторы ?
Код: plaintext
1.
2.
3.
4.
5.
struct MacroSpace
{
	int count;
	struct Macro* m = NULL;
};
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785556
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,
уровень показа предупреждений при компиляции какой стоит? сколько предупреждений выдаёт компилятор после компиляции?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785560
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct Macro
{
	int type;//тип макроопределения, 0:object-like macro,1:function-like macro
	int count_args;//количество аргументов
	char* identifier = NULL;
	char** list_args = NULL;//массив аргументов
	char* rep_list = NULL;
};

struct MacroSpace
{
	int count;
	struct Macro* m = NULL;
};


Где это вы в С видели инлайн-инициализаторы полей структур?
Их даже в С++ добавили только в С++11.
Очевидно вы нам тут приводите код, который не соответствует тому что вы в реальности компилируете.
Как не стыдно

SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
//Добавление макроопределиния к пространству макросов
int add_macros(struct MacroSpace* ms, FILE* in)
{
	ms->count += 1;
	ms->m=(struct Macro*)realloc(ms->m, ms->count*sizeof(struct Macro));
	struct Macro* cur = &(ms->m[ms->count - 1]);//указатель на текущий макрос, создал его чтобы было проще работать в дальнейшем
...
}


Соответственно исходя из выше сказанного, ms->m до первого вызова add_macros() содержит мусор. Вот и крэшится.

Что такое инлайн-инициализаторы ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785565
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

Он скорее всего по-прежнему как С++ компилирует.
На это намекает этот каст, который не нужен в С:
Код: plaintext
1.
(struct Macro*)realloc(



Но естественно инлайн-инициализаторы (правильное название in-class initializer, но по русски не звучит) работают даже в С++ только при вызове конструкторов, но никак не при malloc
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785568
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, Анатолий хотел сказать что указатели в структурах
не принято инициализировать так как ты написал. Почему? Наверное
есть аргументы..
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785580
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercury, Анатолий хотел сказать что указатели в структурах
не принято инициализировать так как ты написал.не то, чтобы не принято ))) просто запрещено )))
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785583
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercury, Анатолий хотел сказать что указатели в структурах
не принято инициализировать так как ты написал. Почему? Наверное
есть аргументы..
Нет, я хотел сказать что в С таких инициализаторов нет.
Соответственно аргументы тут не требуются :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785596
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyОн скорее всего по-прежнему как С++ компилирует.скилл выбирать правильный режим компилятора в математике не прокачивается ;-))
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785608
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychскилл выбирать правильный режим компилятора в математике не прокачивается ;-))
Не будем о наболевшем )
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785618
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу всех обсуждать вопрос а не персону.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785648
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня интернет телефон раздаёт, потому дважды одно и то-же сообщение.

Почему то думал что вы меня этому научили, Анатолий. В какой-то из тем.
Я показал тут код, который компилировал, без обманов.

Не могу сказать какой уровень предупреждений стоит, ибо на этом ноутбуке у меня ничего не установлено, кроме Maple. А другой далеко.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785664
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И найти топик не могу, в котором это было. Очень медленный трафик. А может быть я что-то путаю, вы меня учили чему-нибудь другому наверное, а я перепутал.
Завтра найду ту тему в которой я впервые это применил. И почему применил.
Меня гонят..Доброго времени суток :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38785682
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПочему то думал что вы меня этому научили, Анатолий. В какой-то из тем.
Я к сожалению не обладаю возможностью учить других тому, чего я сам не знаю. Было бы неплохо уметь такое

SashaMercuryЯ показал тут код, который компилировал, без обманов.
Ну, то была моя первая мысль.
А вторая, альтернативная, что компилируется в режиме С++.
Это конечно более вероятно.
Поэтому прежде чем продолжать изучать С, возьмите и таки разберитесь, как компилировать программу как С, а не как С++.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786220
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Искать не буду откуда я это взял, это и не важно. Маловероятно что это вы мне посоветовали. По-моему было так, я выделял память в описании структуры данных, вы мне сказали что так нельзя делать в Си, и я исправил , и стал писать =NULL, хотя это неправильно. Вы имели ввиду одно, а я понял неправильно.

Хотя с другой стороны, испытываю некоторый дискомфорт когда вижу непроинициализированный указатель, особенно если потом я буду выделять к нему память. Буду продолжать работать, потерял полдня из-за этой глупой ошибки.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786221
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не потерял конечно, но отвлёкся от алгоритма
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786223
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправил

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
struct Macro
{
	int type;//тип макроопределения, 0:object-like macro,1:function-like macro
	int count_args;//количество аргументов. максимум 15 бит, согласно стандарту ISO/IEC 9899:201x максимальное число
	//макроопределений в одной единице трансляции 4095=4*2^10-1,т.о. достаточно 14 бит, +1(на всякий случай)
	char* identifier;
	char** list_args;//массив аргументов
	char* rep_list;
};

struct MacroSpace
{
	int count;
	struct Macro* m;
};



Исправил, всё равно вылетает (
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786226
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

А код где? Телепаты спят :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786229
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот мой код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LENGTH_INTERNAL_IDENTIFIER 63+1 //согласно стандарту ISO/IEC 9899:201x

struct Macro
{
	int type;//тип макроопределения, 0:object-like macro,1:function-like macro
	int count_args;//количество аргументов. максимум 15 бит, согласно стандарту ISO/IEC 9899:201x максимальное число
	//макроопределений в одной единице трансляции 4095=4*2^10-1,т.о. достаточно 14 бит, +1(на всякий случай)
	char* identifier;
	char** list_args;//массив аргументов
	char* rep_list;
};

struct MacroSpace
{
	int count;
	struct Macro* m;
};


//Добавление макроопределиния к пространству макросов
int add_macros(struct MacroSpace* ms, FILE* in)
{
	ms->count += 1;
	printf("%i\n",ms->count);
	ms->m=(struct Macro*)realloc(ms->m, ms->count*sizeof(struct Macro));
	printf("123\n");
	if (!ms->m)
	{
		printf("Memory is over\n");
		return -1;
	}

	struct Macro* cur = (ms->m+ms->count - 1);//указатель на текущий макрос, создал его чтобы было проще работать в дальнейшем
	printf("123\n");
        return 0;
...//далее всё закоментировано
}
//конструктор пространства макроопределений
struct MacroSpace* create_MacroSpace()
{
	struct MacroSpace*	ms = (struct MacroSpace*)malloc(sizeof(struct MacroSpace));
	ms->count = 0;
	return ms;
}

int main(int argc, char** argv)
{
	FILE* in = fopen("august.c", "r");
	struct MacroSpace* ms = create_MacroSpace();
	printf("%i\n", ms->count);
	add_macros(ms, in);

	fclose(in);
	free(ms);
	return 0;
}
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786235
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВот мой код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
//конструктор пространства макроопределений
struct MacroSpace* create_MacroSpace()
{
	struct MacroSpace*	ms = (struct MacroSpace*)malloc(sizeof(struct MacroSpace));
	ms->count = 0;
	return ms;
}


Ну, и кто будет ms->m инициализировать? Там по-прежнему мусор :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786236
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercuryВот мой код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
//конструктор пространства макроопределений
struct MacroSpace* create_MacroSpace()
{
	struct MacroSpace*	ms = (struct MacroSpace*)malloc(sizeof(struct MacroSpace));
	ms->count = 0;
	return ms;
}


Ну, и кто будет ms->m инициализировать? Там по-прежнему мусор :)

Саша балда. Извините, глупая ошибка : (
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786276
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На ваш взгляд, такая функция имеет место быть в данной программе ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
//установка стартового значения макроопределения
int setstartvalue_Macro(struct Macro* m)
{
	m->type = 0;
	m->count_args = 0;
	m->identifier = NULL;
	m->list_args = NULL;
	m->rep_list = NULL;
	return 0;
}



Сделал вывод: Для любой структуры данных (особенно если в ней присутствуют объекты на которые в дальнейшем планируется выделять память) нужно писать отдельный конструктор.

Этот вывод правильный ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786306
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЭтот вывод правильный ?правильный, в целом, и ведёт он к отказу от С и переходу к С++ )))
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786544
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСделал вывод: Для любой структуры данных (особенно если в ней присутствуют объекты на которые в дальнейшем планируется выделять память) нужно писать отдельный конструктор.

Этот вывод правильный ?
В одной из серий мульт-сериала Симпсоны, Нельсон бросает камень в белку.
Белка убегает. Нельсон записывает в блокнотик вывод - "Белки не любят камни".
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786654
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВчера я решил заняться чем-нибудь интересным
http://cpip.sourceforge.net/
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786686
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо что этот вывод правильный :) Изучения языка, подобно пониманию окружающего мира ребенком, потому даже такой вывод кажется большим.

Часть программы написал около 5 часов назад, но мне не нравится эта функция, сначала переделаю а потом покажу :) Я нашёл отличную статью на выходные C:
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786858
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати пришлось и мне решать подобного рода вопросы.
http://rsdn.ru/forum/com/5693941 MSDN wrapper classes

Так вот при генерации кода для *.idl была проблема поместить перед определениями
интерфейсов все необходимые "нестандартные" определения структур, ... /UDT/.
Так вот алгоритм находил в *.h Microsoft определение какого-либо "нестандартного" типа
/не забываем о том, что automation выставляет свои правила использования типов данных .../
и если к примеру это было определение какой-либо структуры, то нужно было пройтись по
определениям полей и если встречался "нестандартный" тип, то вытащить из *.h для него
определение ...
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38786942
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton"Белки не любят камни".что, в целом, недалеко от истины, тем не менее ;-))
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38787406
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

обрати внимание на

Код: plaintext
1.
ms->m=(struct Macro*)realloc(ms->m, ms->count*sizeof(struct Macro));



задай себе вопрос: для ms->m я выделил память, чтобы ее переаллоцировать?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38787779
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковSashaMercury,

обрати внимание на

Код: plaintext
1.
ms->m=(struct Macro*)realloc(ms->m, ms->count*sizeof(struct Macro));



задай себе вопрос: для ms->m я выделил память, чтобы ее переаллоцировать?

Нет, не выделял. А разве в спецификации realloc говорится о том, что нельзя реаллоцировать память, если память ещё не выделена, а указатель проинициализирован в NULL ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38787780
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понял realloc перераспределяет память для блока, с новой длиной. Функция возвращает указатель на блок с новой длиной (поэтому адрес может не совпадать с тем, по которому происходит перераспределение памяти, потому присвоение обязательно, fe p=(T)realloc(p,size), нельзя просто realloc(p,size)). Исходя из того что я понимаю(и если я ничего не упустил в стандарте, сейчас проверю), достаточно того, чтобы указатель бы проинициализирован.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38787781
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ISO/IEC 9899:201x7.22.3.5 The realloc function
Synopsis
1 #include <stdlib.h>
void *realloc(void *ptr, size_t size);
Description
2 The realloc function deallocates the old object pointed to by ptr and returns a
pointer to a new object that has the size specified by size. The contents of the new
object shall be the same as that of the old object prior to deallocation, up to the lesser of
the new and old sizes. Any bytes in the new object beyond the size of the old object have
indeterminate values.
3 Ifptr is a null pointer, the realloc function behaves like the malloc function for the
specified size. Otherwise, if ptr does not match a pointer earlier returned by a memory
management function, or if the space has been deallocated by a call to the free or
realloc function, the behavior is undefined. If memory for the new object cannot be
allocated, the old object is not deallocated and its value is unchanged.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38787783
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, скорее всего malloc частный случай realloc, и такое в Си встречается, пока не решил как к этому отношусь, хорошо или плохо. С одной стороны нужно помнить больше функций, происходит дублирование, увеличение общего объёма кода (при подключении библиотек), а с другой стороны скорее всего плюсы какие-то есть, просто я их не вижу в силу своей малой грамотности в теории языков программирования
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38787790
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется, что я ошибаюсь при работе с массивом указателей list_args.
Первым делом

Код: plaintext
1.
m->list_args = NULL;


Затем, добавлю в цикле аргументы, вот что происходит в цикле

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
//i=0..
cur->list_args = (char**)realloc(cur->rep_list, (i + 1)*sizeof(char*));
cur->list_args[i] = NULL;

//smh do

cur->list_args[i] = (char*)malloc(sizeof(char)*len);



Подскажите пожалуйста, правильный ли порядок действий ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38787791
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде бы всё понимаю, у меня есть массив указателей, сначала нужно установить в NULL его голову, затем в цикле реаллоцировать в зависимости от текущего количества строк, новую реаллоцированную строку нужно установить в NULL, и следующим действием выделить на неё столько памяти, сколько нужно. Но где-то у меня ошибка
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38787794
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Почему у вас выделенное ниже - разные выражения?
Код: plaintext
1.
cur->list_args = (char**)realloc(cur->rep_list, (i + 1)*sizeof(char*));


После вызова realloc, cur->rep_list становится невалидным. И последующий вызов будет работать с мусором.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38787795
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ааа..Не знаю почему я вообще так написал и не заметил, сейчас исправлю!
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38787796
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, спасибо, заработало C :

Ну как я мог такое не проверить.. Уже все варианты продумал, прочитал статью про realloc, думал что неправильно работаю с памятью, а ошибка оказалась обычной опечаткой из-за неудачного именования полей структуры, и моей невнимательности (
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38787806
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такая функция получилась. 1 вариант. Она будет запускаться как только программа поиска встретит токен "#define"

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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.
#define MAX_LENGTH_INTERNAL_IDENTIFIER (63+1) //согласно стандарту ISO/IEC 9899:201x
#define MAX_LENGTH_REP_LIST (1000+1) //по собственным соображениям
#define MASK "%[a-z A-Z _ 0-9]" //множество сканирования для инициализации макроимени и параметров
#define MASK2 "%[^\n]"

//Добавление макроопределиния к пространству макросов
int add_macros(struct MacroSpace* ms, FILE* in)
{
	//1. Работа с памятью 
	ms->count += 1;
	ms->m = (struct Macro*)realloc(ms->m, ms->count*sizeof(struct Macro));
	struct Macro* cur = &(ms->m[ms->count - 1]);//указатель на текущий макрос, создал его чтобы было проще работать в дальнейшем
	setstartvalue_Macro(cur);//инициализация всех элементов текущей(вновь созданной) структуры макроопределения стартовыми значениями

	//2. Инициализация макроопределния

	//иниициализация идентификатора cur->identifier
	char* temp = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
	fscanf(in, MASK, temp);
	char* temp2 = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
	sscanf(temp, "%s", temp2);
	int len = strlen(temp2) + 1;
	cur->identifier = (char*)malloc(sizeof(char)*len);
	strcpy(cur->identifier, temp2);
	free(temp);
	free(temp2);

	//инициализация типа макроимени и массива аргументов cur->list_args
	int next_char;
	fscanf(in, "%c", &next_char);
	if ((char)next_char == '(')
	{
		cur->type = 1;//меняю тип макроимени
		//инициализация массива аргументов
		int i = 0;
		while ((char)next_char != ')')
		{
			cur->list_args = (char**)realloc(cur->list_args, (i + 1)*sizeof(char*));
			cur->list_args[i] = NULL;


			char* temp = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
			fscanf(in, MASK, temp);
			char* temp2 = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
			sscanf(temp, "%s", temp2);
			int len = strlen(temp2) + 1;
			cur->list_args[i] = (char*)malloc(sizeof(char)*len);
			strcpy(cur->list_args[i], temp2);
			free(temp);
			free(temp2);

			cur->count_args += 1;
			//printf("%s\n", cur->list_args[i]);
			fscanf(in, "%c", &next_char);
			i += 1;
		}
	}

	//инициализация  cur->repl_list
	temp = (char*)malloc(sizeof(char)*MAX_LENGTH_REP_LIST);
	fscanf(in, MASK2, temp);
	len = strlen(temp) + 1;
	cur->rep_list = (char*)malloc(sizeof(char)*len);
	strcpy(cur->rep_list, temp);
	free(temp);

	return 0;
}



Конечно, часть функции касаемо записи в идентификаторы имени макроподстановки и её параметров лучше бы вынести в отдельную функцию, что я и пытался сделать, но неудачно. Если использовать такую подфункцию то ничего не происходит

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
//Установка значения идентефикатора из потока на входе
int set_identifier(FILE* in, char* destination)
{
	char* temp = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
	fscanf(in, MASK, temp);
	char* temp2 = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
	sscanf(temp, "%s", temp2);
	int len = strlen(temp2) + 1;
	destination = (char*)malloc(sizeof(char)*len);
	strcpy(destination, temp2);
	free(temp);
	free(temp2);
	return 0;
}



Подумаю почему.

Ну и скорее всего придётся передать эту функцию с точки зрения логики, мне кажется я получаю нужные строки далеко не оптимально. Вы согласны ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38787843
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Реализация плохая.
А могу ли я считать по маске "%[a-zA-Z_]%[0-9]" в один массив ?

Подумал, если встречаю токен "#define" то считывать сразу всю строку до '\n' и с ней уже работать. Пока что общий алгоритм поиска выглядит так


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
//Устанавливает позицию  индикатора файла на первый символ новой строки. Возвращает 1 если всё ок.
//Если файл закончился (новой строки нет), возвращает -1
int step_to_newline(FILE* in)
{
	int c;
	while ((c = getc(in)) != '\n')
	{
		if (c == EOF) return -1;
	}
	return 1;
}
//как бы лучше назвать ?
int search_and_set__MacroSpace(FILE* in, struct MacroSpace* ms)
{
	do
	{
		char* w1 = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
		fscanf(in, "%s", w1);
		(strcmp(w1, "#define") == 0) ? add_macros(ms, in) : false;
	} 
	while (step_to_newline(in) != -1);
	return 0;
}
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788779
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Основные моменты решил. У меня остался один вопрос, подскажите пожалуйста. У нас есть такой участок кода.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#define MASK "%[a-zA-Z_0-9]%" //множество сканирования для инициализации макроимени и параметров
              //. . . . .
	char* temp = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
	fscanf(in, MASK, temp);
	int len = strlen(temp) + 1;
	cur->identifier = (char*)malloc(sizeof(char)*len);
	strcpy(cur->identifier, temp);
	free(temp);

	//инициализация типа макроимени и массива аргументов cur->list_args
	int next_char = fgetc(in);



Допустим индикатор положения файла указывает на q, то есть в temp запишется q. Как будет проинициализирован next_char ?(между q и struct есть пробел)

#define q struct b
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788780
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня постоянно инициализируется s, сколько бы пробелов не было между struct и q. А если выше я сделаю ungetc(' ',in), то всё хорошо
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788787
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понял, первое считывание по маске даёт такой эффект (установка указателя в файле после всех пробелов), хотя по этому примеру из стандарта, я этого не ожидал.

ISO/IEC 9899:201xEXAMPLE 2 The call:
#include <stdio.h>
Код: plaintext
1.
2.
3.
/* ... */
int i; float x; char name[50];
fscanf(stdin, "%2d%f%*d %[0123456789]", &i, &x, name);

with input:
56789 0123 56a72
will assign to i the value 56 and to x the value 789.0, will skip 0123, and will assign to name the
sequence 56\0. The next character read from the input stream will be a.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788791
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если сделать считывание по маске вот таким, то всё заработало. А почему так, я не понял.

Код: plaintext
1.
fscanf(in, "%[^ (]", temp);
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788793
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что я процент добавил в конце первой маски, и не заметил этого :(
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788821
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вы считаете, такая функция имеет право быть ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
int test(char* p)
{
	p = (char*)malloc(10);
	for (int i = 0; i < 9; ++i)
	{
		*(p + i) = 'a' + i;
	}
	p[9] = '\0';
	
	printf("%s %i\n", p, strlen(p));
	return 0;
}



Подскажите пожалуйста, как бы вы её вызывали ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788837
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКак вы считаете, такая функция имеет право быть ?
право конечно имеет,
но зачем ей игнорируемый параметр и фиксированное возвращаемое значение?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788855
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хотел делать так:
Код: plaintext
1.
2.
char* p;
test(p);



но не получилось. Интуитивно догадываюсь почему, но чёткого обоснования для себя я не дал.

пришлось возвращать char* и делать так
Код: plaintext
1.
2.
char* p;
p=test(p);
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788900
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryИнтуитивно догадываюсь почему, но чёткого обоснования для себя я не дал.
char** p;


SashaMercury
Код: plaintext
1.
2.
char* p;
p=test(p);


а зачем параметр p нужен?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788911
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропила зачем параметр p нужен?

в принципе, он видимо избыточен. Сейчас исправлю
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788924
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция поиска макросов создана, и протестирована в первом приближении.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//как бы лучше назвать ?
int search_and_set_MacroSpace(FILE* in, struct MacroSpace* ms)
{
	do
	{
		char* w1 = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
		fscanf(in, "%s", w1);
		(strcmp(w1, "#define") == 0) ? add_macros(ms, in) : false;
	} 
	while (step_to_newline(in) != -1);
	return 0;
}



, где

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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.
//Добавление макроопределиния к пространству макросов
int add_macros(struct MacroSpace* ms, FILE* in)
{
	//1. Работа с памятью 
	ms->count += 1;
	ms->m = (struct Macro*)realloc(ms->m, ms->count*sizeof(struct Macro));
	struct Macro* cur = &(ms->m[ms->count - 1]);//указатель на текущий макрос, создал его чтобы было проще работать в дальнейшем
	setstartvalue_Macro(cur);//инициализация всех элементов текущей(вновь созданной) структуры макроопределения стартовыми значениями

	//2. Инициализация макроопределния

	//иниициализация идентификатора cur->identifier
	skipspaces(in);
	cur->identifier = set_value(in, MASK1);

	//инициализация типа макроимени и массива аргументов cur->list_args
	int next_char = fgetc(in);
	if (next_char == '(')
	{
		cur->type = 1;//меняю тип макроимени
		//инициализация массива аргументов
		int i = 0;
		while ((char)next_char != ')')
		{
			skipspaces(in);
			cur->list_args = (char**)realloc(cur->list_args, (i + 1)*sizeof(char*));
			cur->list_args[i] = NULL;
			cur->list_args[i] = set_value(in, MASK1);

			cur->count_args += 1;
			skipspaces(in);
			fscanf(in, "%c", &next_char);
			i += 1;
		}
	}

	//инициализация  cur->repl_list
	cur->rep_list = set_value(in, MASK2);
	return 0;
}



и

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
char* set_value(FILE* in, const char* mask)
{
	char* buf = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
	fscanf(in, mask, buf);
	int len = strlen(buf) + 1;
	char* res = (char*)malloc(sizeof(char)*len);
	strcpy(res, buf);
	free(buf);
	return res;
}



и ещё две функции,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
//Устанавливает позицию  индикатора файла на первый символ новой строки. Возвращает 1 если всё ок.
//Если файл закончился (новой строки нет), возвращает -1
int step_to_newline(FILE* in)
{
	int c;
	while ((c = getc(in)) != '\n')
	{
		if (c == EOF) return -1;
	}
	return 1;
}

//Пропускает все пробелы
int skipspaces(FILE* in)
{
	int c;
	while ((c = getc(in)) == ' ');
	ungetc(c, in);
	return 0;
}




Хотя я не пришёл к выводу, как лучше(быстрее и безопаснее), считать по строкам, и потом делать их разбор, либо делать так как сейчас сделано.

а вот и точка входа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int main(int argc, char** argv)
{
	FILE* in = fopen("august.c", "r");
	struct MacroSpace* ms = create_MacroSpace();
	search_and_set_MacroSpace(in, ms);
	view_MacroSpace(ms);
	
	fclose(in);
	free(ms);
	return 0;
}
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788942
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поиск директив "#define" это лексический анализ, а дальнейший разбор строки макроопределения, это синтаксический анализ. Я так понял. Это правильно ?

В целом функции не слишком поганые ? Или вы бы делали совершенно по-другому ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788962
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПоиск директив "#define" это лексический анализ, а дальнейший разбор строки макроопределения, это синтаксический анализ. Я так понял. Это правильно ?


нет, кажется, если я правильно понял твою мысль.

В целом, лексер -- это выделение лексем,
парсер (синтаксический анализ) -- грамматик.
Лексемы выделяются безусловно, грамматики -- с вариациями.
Напр. в С это --

Код: plaintext
1.
2.
3.
"Asdfghjk";
12345;
123.456e42;



лексемы, потому что это не может быть ничем другим.

Код: plaintext
1.
a = 25;



уже элемент грамматики, это может быть

Код: plaintext
1.
2.
3.
4.
int 
a = 25;
//or
a = 25;



Что же касается препроцессора, кажется, он не включается в обычную архитектуру компилятора и выполняется отдельно, до него.
Он конечно имеет свой собственный лексер и парсер.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788975
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,
Код: plaintext
1.
(strcmp(w1, "#define") == 0) ? add_macros(ms, in) : false;



Это я считаю форменное безобразие.

надо писать

Код: plaintext
1.
!strcmp(w1, "#define") ? add_macros(ms, in) : false;



Это С, это не паскаль какой-нибудь тебе...

Ну и конечно, тут должен быть IF, ты не вычисляешь выражение, ты ветвишь поток управления.

В С к тому же нет false/true. Традиционно. Что-то там добавляли в последних стандартах -- но настоящий с-шник написал бы

Код: plaintext
1.
!strcmp(w1, "#define") ? add_macros(ms, in) : 0;



И в итоге код должен быть

Код: plaintext
1.
2.
if( !strcmp(w1, "#define") ) 
  add_macros(ms, in);



К тому же между '#' и директивой препроцессора (define в данном случае) могут быть (разрешены) пробелы.

strcmp не покатит, по крайней мере в таком виде.

Думаю, лучше всего всё же использовать регвыражения типа libPCRE.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788980
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//как бы лучше назвать ?
int search_and_set_MacroSpace(FILE* in, struct MacroSpace* ms)
{
	do
	{
		char* w1 = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
		fscanf(in, "%s", w1);
		(strcmp(w1, "#define") == 0) ? add_macros(ms, in) : false;
	} 
	while (step_to_newline(in) != -1);
	return 0;
}




А если strcmp(w1, "#define") , как думаешь, куда девается выделенная память ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38788987
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Существует #undef, поэтому

Код: plaintext
1.
struct MacroSpace* ms



должен быть стеком, а не просто списком.
Точнее, структура макроопределений должна быть стеком твоих вот этих массивов MacroSpace.
И в каждой точке компиляции кода должен применяться один из элементов этого стека (top, head).
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38789163
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, спасибо.

По поводу памяти, я неправ. Забыл освободить. По другим замечаниям, мне нужно подумать, прежде чем ответить
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38789781
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКстати, скорее всего malloc частный случай realloc, и такое в Си встречается, пока не решил как к этому отношусь, хорошо или плохо. С одной стороны нужно помнить больше функций, происходит дублирование, увеличение общего объёма кода (при подключении библиотек), а с другой стороны скорее всего плюсы какие-то есть, просто я их не вижу в силу своей малой грамотности в теории языков программирования
В сях как-раз мало дублирования функционала. Потому как язык создавался
в помощь разработке ядра Unix. И по сути большинство API просто отражают
kernel-API.

А вот если-бы ты полез в библиотеки и фремворки C#/Java - там просто
оторопь берёт от обилия одних и тех-же яиц в анфас и профиль. Одних
XML-ных API существует дюжина.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38790051
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSashaMercury,
Код: plaintext
1.
(strcmp(w1, "#define") == 0) ? add_macros(ms, in) : false;



Это я считаю форменное безобразие.

надо писать

Код: plaintext
1.
!strcmp(w1, "#define") ? add_macros(ms, in) : false;



Это С, это не паскаль какой-нибудь тебе...

Ну и конечно, тут должен быть IF, ты не вычисляешь выражение, ты ветвишь поток управления.

В С к тому же нет false/true. Традиционно. Что-то там добавляли в последних стандартах -- но настоящий с-шник написал бы

Код: plaintext
1.
!strcmp(w1, "#define") ? add_macros(ms, in) : 0;



И в итоге код должен быть

Код: plaintext
1.
2.
if( !strcmp(w1, "#define") ) 
  add_macros(ms, in);



К тому же между '#' и директивой препроцессора (define в данном случае) могут быть (разрешены) пробелы.

strcmp не покатит, по крайней мере в таком виде.

Думаю, лучше всего всё же использовать регвыражения типа libPCRE.

код исправил, в целом я согласен. Использование тернарного оператора не есть самое удачное решение в данном конкретном случае. Поиск исправлю в дальнейшем, сейчас не хочу отрывать от несколько другой задачи, нужно сделать все замены в файле.
По поводу организации данных, вы правы. Сейчас исправлять не буду, в дальнейшем, возможно, я это учту. Опять таки, пока не хочу отвлекаться от основной задачи.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38790058
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот если бы я для считывания данных использовал посимвольный анализ, а не fscanf (хотя fscanf тоже веротяно читает по символам), было бы быстрее/медленнее ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38790064
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

fscanf медленнее, чем посимвольное чтение, т.к. ему приходится еще разбирать строку формата при каждом вызове.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38790070
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

это значит, что если бы у вас были знания на уровне моих в области Си(дело в том, что возможно есть другие функции, наиболее оптимальные, или есть библиотека о которой я не знаю, и использование этих функций/библиотек должно быть тут, а не посимвольное fscanf и getc(in)), то вы бы реализовали аналогичный алгоритм формирующий пространство макроимён через посимвольный анализ ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38790071
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Я бы использовал готовый генератор лексических анализаторов вместо самописного лексера. Например flex.
А алгоритм бы уже работал с лексемами.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38790104
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryAnatoly Moskovsky,

это значит, что если бы у вас были знания на уровне моих в области Си(дело в том, что возможно есть другие функции, наиболее оптимальные, или есть библиотека о которой я не знаю, и использование этих функций/библиотек должно быть тут, а не посимвольное fscanf и getc(in)), то вы бы реализовали аналогичный алгоритм формирующий пространство макроимён через посимвольный анализ ?

как правило делают посимвольный ввод, потому что так гибче.

если бы ты знал в деталях, как работает fscanf, ты бы тоже его не использовал.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38791142
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryэто значит, что если бы у вас были знания на уровне моих в области Си(дело в том, что возможно есть другие функции, наиболее оптимальные, или есть библиотека о которой я не знаю, и использование этих функций/библиотек должно быть тут, а не посимвольное fscanf и getc(in)), то вы бы реализовали аналогичный алгоритм формирующий пространство макроимён через посимвольный анализ ?
Вопрос-то как звучит? Наиболее оптимальные! По объёму кода - для данной задачи наверное
fscanf хватит. Лаконично. По скорости.. надо попрофилировать. Дать тыщу исходников. Тогда наверное
fgets, или getc будет быстрее. Но для него надо хорошенький Finite-State-Machine для разбора написать.
И еще критерий можно придумать. Дуракоустойчивость. Возможность exploit-a.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38791247
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton Наиболее оптимальные!
режет глаз словосочетание
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38791291
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилmayton Наиболее оптимальные!
режет глаз словосочетание

не издевайтесь :) Когда пишу, то порой не успеваю за своими мыслями, потому подгоняю себя, тем самым минимизирую время поиска подходящего слова, потому порой пишу неграмотно, или с опечатками. И я не Фёдор Михайлович Достоевский, чтобы изощряться, и не Бальмонт с его "Я изысканность русской медлительной речи ...".
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38791292
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Особенно когда много думаешь прежде чем написать, в голове совсем другие мысли, а не о том как не ошибиться в грамматике/орфографии. Главное передать суть, и ничего не забыть, увеличение риска появления ошибки не играет слишком большой роли на фоне основной задачи. Тем не менее, я считаю, что писать нужно грамотно.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38791316
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryграмматике/орфографии.
с грамматикой/орфографией проблем нет.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38791335
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда что вас смутило ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38791385
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryТогда что вас смутило ?
семантика.

optimus - он уже наилучший

Что касается данного обсуждения - важен критерий оптимальности.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38799395
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мудрое решение /другого и не ждал. Копия форума firebird/
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38799463
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Мудрое решение /другого и не ждал. Копия форума firebird/

loop ( 1 ) {

say( "Извеняюсь, извеняюсь, извеняюсь" );

}

PS: Не обратил внимания, что появился topic "Про улучшение DLL".
Думал просто все выбросили ...
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38800194
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Продолжил заниматься макроподстановками. Составил общий алгоритм, согласно которому производились бы замены в тексте программы. Как вы считаете, в первом приближении он верный ? Рекурсия подразумевается в пункте 2.3 ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38800195
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашёл ошибку, если w_c=="#" || w_c=="#define", то нужно перейти на новую строку
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38802917
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Сейчас написал функцию, пробегающую по всем идентификаторам исходного кода(за исключением строк, начинающихся с #, т.к. там никаких замен быть не может). Мне она не очень нравится. Подскажите пожалуйста, видите ли вы какие-нибудь явные недостатки/минусы ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
#define MAX_LENGTH_INTERNAL_IDENTIFIER (63+1) //согласно стандарту ISO/IEC 9899:201x

char* get_next_identifier(FILE* in)
{
	int c;
	while ((c = getc(in)) != EOF)
	{
		if (c == '#')
		{
			int temp = step_to_newline(in);
			if (temp == -1)
				return -1;
		}
		if (('a' <= c&&c <= 'z') || ('A' <= c&&c <= 'Z') || (c == '_'))
		{
			char* buf = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
			char* pb = buf;
			*pb++ = c;
			while (('a' <= (c = getc(in)) && c <= 'z') || ('A' <= c&&c <= 'Z') || (c == '_'))
			{
				*pb++ = c;
			}
			*pb = '\0';
			return buf;
		}
	}
	return -1;
}



Вот так вызываю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int main(int argc, char** argv)
{
	FILE* in = fopen("august.c", "r");
	char* i=NULL;
	while ((i = get_next_identifier(in)) != -1)
	{
		printf("%s\n", i);
		free(i);
	}


	return 0;
}



Хотя сразу вижу, можно вынести выделение памяти за функцию. Выделить память один раз, и не делать malloc кучу раз. Та проблема что встречалась ранее. Сейчас перепишу. (да, и верхних функциях, непонятно почему возвращаю -1, там ведь указатели. Ещё одна ошибка, слишком сконцентрировался на алгоритме)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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.
//Устанавливает позицию  индикатора файла на первый символ новой строки. Возвращает 1 если всё ок.
//Если файл закончился (новой строки нет), возвращает -1
int step_to_newline(FILE* in)
{
	int c;
	while ((c = getc(in)) != '\n')
	{
		if (c == EOF) return -1;
	}
	return 1;
}

int main(int argc, char** argv)
{
	FILE* in = fopen("august.c", "r");
	char* i = malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
	while (get_next_identifier(i,in)!= -1)
	{
		printf("%s\n", i);
	}
	free(i);
	return 0;
}

//get next identifier in-place
int get_next_identifier(char* s, FILE* in)
{
	int c;
	while ((c = getc(in)) != EOF)
	{
		if (c == '#')
		{
			int temp = step_to_newline(in);
			if (temp == -1)
				return -1;
		}
		if (('a' <= c&&c <= 'z') || ('A' <= c&&c <= 'Z') || (c == '_'))
		{
			char* ps = s;
			*ps++ = c;
			while (('a' <= (c = getc(in)) && c <= 'z') || ('A' <= c&&c <= 'Z') || (c == '_'))
			{
				*ps++ = c;
			}
			*ps = '\0';
			return 1;
		}
	}
	return -1;
}



всё равно не нравятся ни код, ни алгоритм. сейчас ещё подумаю
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38802919
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно поменять местами проверку на # и на символы, ибо вероятность появления не # выше чем диапазона символов.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38802922
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryнужно поменять местами проверку на # и на символы, ибо вероятность появления не # выше чем диапазона символов.

а вот тут, можно видеть противоречия с математикой, по части рассуждений, и построения алгоритма.
При построение алгоритма, сначала обрабатываются частные случаи, а потом общий случай(чаще всего так). При описании алгоритма, на языке программирования, сначала лучше описать вилку для общего случая(если в каждой вилке предусмотрен переход в конец блока цикла, или выход из него), и в дальнейшем описывать ветки по уменьшению вероятности захода в неё.
Это опять таки мои предположения, но скорее всего они верны. Если компилятор(например оптимизирующий) не проводит оценку самостоятельно (сам придумывает тесты, и делает оценку). Но это маловероятно
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38803140
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПодскажите пожалуйста, видите ли вы какие-нибудь явные недостатки/минусы ?

попытки преждевременной оптимизации.

с принципиальными моментами бы сначала разобраться
-макроопределение может быть многострочным
-строки и комментарии не нуждаются в разборе
- строка , начинающаяся с # тоже требует разбора (это элементарно stringification может быть)
- новые идентификаторы могут появляться по ходу макроподстановки(конкатенация)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38803267
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
#define X Y
#define Y Z
#define Z X
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38803737
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нас с 1 курса универа учили делать "защиту" от дурака. На любой
вводимый руками текст софт должен давать реакцию как минимум
адекватную.

Без BSOD-ов, segmentation fault, stackoverflow. На циклическую или
авто-рекурсивную замену defines должна быть чёткая реакция
с выводом сообщения об ошибке.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38803765
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНа циклическую или
авто-рекурсивную замену defines должна быть чёткая реакция
с выводом сообщения об ошибке
это не ошибка, в случае рекурсии подстановка согласно спецификациям прекращается.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38803775
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Сашик кодит свои реплейсменты согласно спецификациям или так... ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38803790
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНас с 1 курса универа учили делать "защиту" от дурака. На любой
вводимый руками текст софт должен давать реакцию как минимум
адекватную.

Без BSOD-ов, segmentation fault, stackoverflow. На циклическую или
авто-рекурсивную замену defines должна быть чёткая реакция
с выводом сообщения об ошибке.

Доброго времени суток.

Алан Мэтисон Тьюринг, Proposals for ACE(1945)До некоторого момента лучше допустить наличие ошибок в программе, чем потратить на её разработку столько времени, сколько потребуется на устранение всех ошибок(сколько десятилетий на это потребуется?).

Хотя к данному конкретному случаю, скорее всего вы правы больше. Сегодня думал об этом, если хотите, то я пришёл к выводу что мне больше нравится принцип ASSUME. Не знаю есть ли такой в науке информационные технологии, но думаю вы поняли что я имею ввиду. (хотя нравится не нравится, спи моя красавица)
Сегодня вечером я исправлял небольшую часть замечаний от научного руководителя, и это только книги :(. Не могу пока более плотно заняться этой задачей. Но я её решаю, и знаю что решу её точно, пусть и в первом приближении, пусть и с принципом ASSUME. Меня уже гонят, я тут в темноте ели как цитату эту нашёл :D
Доброго времени суток, всем спасибо за советы, всё запомнил C:
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38803793
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-ж тебя "гонит-то" всё время? Купи планшет штоль.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811367
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да у меня он есть, а я им не пользуюсь, где-то валяется. Когда покупал, думал буду каждый день с ним ходить везде :D попользовался месяц, и он мне надоел :)

Здравствуйте.
В первом приближении программу написал, но пока что показывать не буду, ибо мне она не нравится. Покажу её после рефакторинга. У меня возник вопрос. Подскажите пожалуйста, возможно ли написать функцию, которая будет принимать и файл и строку по одному параметру?Вот такой прототип fe
Код: plaintext
1.
2.
3.
4.
int func(TheType* in)
{
smth do...
}



но чтобы её можно было вызывать следующим образом:
Код: plaintext
1.
2.
3.
4.
char s[]="Depeche mode Zemfira etc";
FILE* in=fopen("input.txt","r";)
func(s);
func(in);
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811382
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант: можно две написать, одну использовать как обертку второй
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int func(char* in)
{
...
}

int func(FILE* in)
{
  char buf[123];
  ... читаем файл в buf
  return func(buf);
}
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811386
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКак вариант: можно две написать, одну использовать как обертку второй
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int func(char* in)
{
...
}

int func(FILE* in)
{
  char buf[123];
  ... читаем файл в buf
  return func(buf);
}



Спасибо.
Можно, но тогда получится что мы дважды читаем символы, один раз из файла, а потом из строки. Хотелось бы этого избежать
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811390
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryполучится что мы дважды читаем символы, один раз из файла, а потом из строки. Хотелось бы этого избежать
Не избежать этого, программа работает только с данными в памяти, т.е. строкой в твоем случае, при работе с файлом сначала все-равно чтение из файла в память произойдет. Как бы ты не написал свою функцию.

Если уж очень хочется одну, то можно два параметра:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int func(char* in_c, FILE* in_f)
{
 if(in_c) {
   ... работа со строкой
 } else {
   ... работа с файлом
 }
}


вызывать так
Код: plaintext
1.
2.
func(str, NULL);
func(NULL, file);
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811428
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
жаль что нельзя сделать по-другому. Хотя возможно это и правильно, что нельзя.(хотя у меня было такое чувство что должна быть изящная лазейка)
Спасибо :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811430
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а можно передавать указатель на Тип, и в зависимости от типа, выполнять различные операции ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811467
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: plaintext
1.
2.
int func(char* in)
int func(FILE* in)


В С нельзя таким образом перегружать функции.
В С++ можно.

SashaMercuryа можно передавать указатель на Тип, и в зависимости от типа, выполнять различные операции ?
В С++ - поизвращаться типами можно. Но в целом идея дурацкая :)

Данный класс проблем обычно (в любых языках) решается путем введения дополнительных абстракций.
Например если одна и та же функция должна уметь читать и из памяти и из файла, то вводится абстракция Stream, у которой есть операции read_char()/read_line() etc. Функция работает с ней. А при вызове функции создается либо MemoryStream либо FileStream - разные реализации этой абстракции.
В С это реализуется через структуры и указатели на функции.
В С++ есть явный синтаксис абстракций - виртуальные функции и шаблоны.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811484
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, это интересно.

Значит можно создать структуру Stream, в ней описать такие вещи как: признак конца файла, указатель на функцию чтения потока, тип потока (0-строка,1-файл).
Код: plaintext
1.
2.
3.
4.
5.
6.
struct Stream
{
	int type;
	char(*get_symb)();
	char mark_end_Stream;
};



примерно так ? И через неё реализовывать функции чтения/записи из потока. По сути это так-же обёртка о которой писал Дмитрий, если я правильно понял. Только более глобальная.
Я правильно вас понял ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811492
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryа можно передавать указатель на Тип, и в зависимости от типа, выполнять различные операции ?
можно передать отдельным параметром тип, т.е.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#define TYPE_STR 1
#define TYPE_FILE 2
int func(void* p, int type)
{
  if(type == TYPE_STR) {
    char* str = (char*) p;
    ...
  } else if(type == TYPE_FILE) {
    ...
  }
}



вызывать так
Код: plaintext
1.
func(str, TYPE_STR);



Вобщем тоже достаточно громоздко получается.

Я бы тебе посоветовал не заниматься минимизацией количества функций, компилятор это прекрасно сделает за тебя. Почитай про inline функции и про правила их написания.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811496
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ правильно вас понял ?
Да
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811497
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я не минимизацией занимаюсь:), а хочу чтобы один и тот-же алгоритм приводился один раз, а не писался отдельно для файла или строки
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811519
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДа я не минимизацией занимаюсь:), а хочу чтобы один и тот-же алгоритм приводился один раз, а не писался отдельно для файла или строки
Прочитай файл в строку и обрабатывай своим алгоритмом. Не на том экономишь.

Если думаешь что файл медленно читается - решай именно эту проблему, выделяй в памяти место под весь файл и читай его за один раз. Можно использовать средства ОС, тогда ОС это сделает за тебя.
Почитай Отображение файла в память .
Например для виндовса читай про CreateFileMapping()
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811526
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryа хочу чтобы один и тот-же алгоритм приводился один раз, а не писался отдельно для файла или строки
ну так уже сказали - используй абстракцию потока(с концом файла пущай поток сам разбирается, о типе тож знать в алгоритме незачем )
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811558
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилс концом файла пущай поток сам разбирается, о типе тож знать в алгоритме незачем
Да, это по-любому.

SashaMercury,

примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
struct Stream
{
	int (*get_symb)(struct Stream*);
 };

struct FileStream{
   struct Stream stream;
   FILE* f;
};

int FileStream_get_symb(struct Stream* stream)
{
    struct FileStream* fstream = (struct FileStream*) stream;
    return fgetc(fstream->f);
}

int main()
{
    struct FileStream fs;
    fs.stream.get_symb = FileStream_get_symb;
    fs.f = fopen(...);
    
    process((struct Stream*)&fs);
    
    fclose(fs.f);
}



С буфером в памяти - по аналогии.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811637
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо C:

До своего отлета постараюсь разобраться и переделать мой код(в любом случае выложу то что получится), использовав все советы выше.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811815
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли думаешь что файл медленно читается - решай именно эту проблему, выделяй в памяти место под весь файл и читай его за один раз. Можно использовать средства ОС, тогда ОС это сделает за тебя.
Почитай Отображение файла в память .
Например для виндовса читай про CreateFileMapping()
Дежа-вю. Я уже где-то слышал универсальный совет - переколбасить весь I/O на файл-маппинг.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38811837
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДежа-вю. Я уже где-то слышал универсальный совет - переколбасить весь I/O на файл-маппинг.
Я этого не предлагал, но пользуюсь частенько для чтения.

Как минимум для писания логов это лишнее.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38815689
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Занимаюсь декомпозицией решения в части организации расположения элементов программного кода. Сейчас, весь код в одном файле, мне это не нравится.
Создал файл Macro.h в него поместил такой код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct Macro
{
	int type;//тип макроопределения, 0:object-like macro,1:function-like macro
	int count_args;//количество аргументов. максимум 13 бит, согласно стандарту ISO/IEC 9899:201x максимальное число
	//макроопределений в одной единице трансляции 4095=4*2^10-1,т.о. достаточно 12 бит, +1(на всякий случай)
	char* identifier;
	char** list_args;//массив аргументов
	char* rep_list;
};



и Macro.cpp

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
#include <stdio.h>
#include <stdlib.h>
#include "Macro.h"

//установка стартового значения макроопределения
int setstartvalue_Macro(struct Macro* m)
{
	m->type = 0;
	m->count_args = 0;
	m->identifier = NULL;
	m->list_args = NULL;
	m->rep_list = NULL;
	return 0;
}

int view_Macro(struct Macro* m)
{
	printf(m->type == 0 ? "type: object-like macro\n" : "type: function-like macro\n");
	printf("identifier: %s\n", m->identifier);
	printf("count arguments: %i\n", m->count_args);
	for (int i = 0; i < m->count_args; ++i)
	{
		printf("argument[%i]: %s\n", i, m->list_args[i]);
	}
	printf("replacement list: %s\n", m->rep_list);
	return 0;
}



В главном файле (как он правильно называется ? Запускаемый ?), подключаю Macro.cpp.
Но мне кажется это неправильно, скорее всего, нужно описать прототипы функций в файле Macro.h и подключать его. Верно ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38815690
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все работает, но мне кажется, что так не делается
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38815691
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О как. Сделал так.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
struct Macro
{
	int type;//тип макроопределения, 0:object-like macro,1:function-like macro
	int count_args;//количество аргументов. максимум 13 бит, согласно стандарту ISO/IEC 9899:201x максимальное число
	//макроопределений в одной единице трансляции 4095=4*2^10-1,т.о. достаточно 12 бит, +1(на всякий случай)
	char* identifier;
	char** list_args;//массив аргументов
	char* rep_list;
};

int setstartvalue_Macro(struct Macro* m);

int view_Macro(struct Macro* m);



ошибка
Error 9 error LNK2001: unresolved external symbol _setstartvalue_Macro ...preprocessing.obj

делаю так
Код: plaintext
1.
2.
3.
extern int setstartvalue_Macro(struct Macro* m);

extern int view_Macro(struct Macro* m);



нет результата
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38815807
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

подозреваю, что снова смешаны исходники C и C++.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38815852
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВ главном файле (как он правильно называется ? Запускаемый ?), подключаю Macro.cpp.это как? #include "Macro.cpp"? нет, так не делается. Делается #include "Macro.h", в котором указываются прототипы функций и структуры данных
В файле Macro.h есть Include guard ?
И почему опять .cpp? ты же вроде на С решил писать?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38816847
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolf,

вы полностью правы.

egorych, Include guard отсутствует.
Моя невнимательность приводит к тому что пишу на Си, а файлы забываю правильно именовать.

Спасибо что подсказали :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38816984
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМоя невнимательность приводит к тому что пишу на Си, а файлы забываю правильно именовать.
Мы будем тебе чаще это напоминать.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38825684
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Скажите пожалуйста, как вам на вскидку такая функция ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
#define IDENTIFIER 1
#define NUMBER 2
#define SYMBOL 3

int get_word(char* s, FILE* in)
{
	int c = *s++ = getc(in);
	if (isalpha(c) || c == '_')//identifier
	{
		while (isalnum(c = *s++ = getc(in)) || c == '_');
	        *--s = '\0';
		ungetc(c, in);
		return IDENTIFIER;
	}
	else if (isdigit(c))//число
	{
		while (isdigit(c = *s++ = getc(in)));
		*--s = '\0';
		ungetc(c, in);
		return NUMBER;
	}
	else if (c == EOF)//конец файла
	{
		return EOF;
	}
	else //символ ( ) ; smth else 
	{
		*s = '\0';
		return SYMBOL;
	}
	return -1; //не уверен что всё учёл
}



PS
feof не проверяет текущий символ потока и работает по другому ? Нужно использовать её ?
softwarerSashaMercuryдля меня очевидно, что он лучше во всём,
Так не бывает. Можно нежно любить свой бугатти вейрон, но таки для некоторых задач лучше подходит камаз, а для некоторых - велосипед.

При этом, нежно любя свой бугатти вейрон, стоит таки знать и понимать его недостатки. Скажем, если он сломается где-нибудь под Тюменью, будет достаточно проблематично найти запчасть.

SashaMercuryОчевидным решение проблемы определения конца файла будет возврат символа не принадлежащего пространству возможных элементов
Одно из важных качеств разработчика - умение выбирать лучшее решение, не останавливаясь на очевидном . Описанное Вами - давно известный путь в адъ. Почти все проходили это, засовывая всякие минус единицы в возраст и прочие "что никак не может встретиться". Потом приходят неанглоязычные пользователи, и вдруг оказывается, что виндовая буква "я" совершенно случайно равна EOF (char ведь у нас signed, мы помним, да?). Потом у нас приходит unicode, и вдруг оказывается, что в пространстве int16 перестаёт хватать места. Итдитп., и в итоге оказывается, что в библиотеку таки попадает feof(), потому что гениальной идеи "возврата символа не принадлежащего пространству" таки не хватает, чтобы прикрыть задницу.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38825763
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте.
Скажите пожалуйста, как вам на вскидку такая функция ?
Код: plaintext
1.
int c = *s++ = getc(in);

вот это - отвратительно.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826029
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саша! OMG! То о чём я говорил... Тело цикла в скобках while.

И что ты получил? Оптимизацию? И как дебаггер будет ходит по этой колбасе?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826187
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк, пользуюсь приёмами K&R..
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826189
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryЗдравствуйте.
Скажите пожалуйста, как вам на вскидку такая функция ?
Код: plaintext
1.
int c = *s++ = getc(in);

вот это - отвратительно.

ну вот.. K&R глава 6.3..авторы языка так учат..
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826225
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryну вот.. K&R глава 6.3..авторы языка так учат..фтопку такие приёмы, слишком много побочных эффектов на одну строчку кода, плохо отлаживаемо, плохо читаемо, плохо сопровождаемо.
Зато, конечно, олдскулл, будь он неладен ))
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826251
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryegorychпропущено...
вот это - отвратительно.

ну вот.. K&R глава 6.3..авторы языка так учат..
Что-то я не верю что они учат упаковывать всё в скобки к while.

Знаешь... год назад здесь был один перец. Он писал ультра-короткий язык.
Никто его не понимал. Афтор был непонят. Обижен. И как следствие покинул
форум.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826278
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного модифицировал, но в K&R было так
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826281
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя есть ещё пример, где именно в скобках происходит присваивание, не могу найти в электронной версии
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826434
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саш. Ну... будешь бит когда-нибудь коллегами Крепко-крепко.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826919
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

ну теперь вы хотя бы согласны с тем, что K&R так делали ?
PS
к сожалению мои коллеги, и весь мой практически миллионный город ни бум бум в Си.(ну ладно, человек 20 может быть чего и знают)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826929
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и вообще, почему отладчики не могу особым образом проверять такие выражения
Код: plaintext
1.
a1=a2=...=an
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826981
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryи вообще, почему отладчики не могу особым образом проверять такие выражения
Код: plaintext
1.
a1=a2=...=an

отладчик ходит по строке, ведь. Если ты в одну строчку записываешь несколько операторов, то ты ССЗБ, отладчик тут не виноват )))
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826982
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

а почему не сделать такой отладчик, чтобы он делал остановки внутри строки ? Или разбирал особые выражения, как, например, выше ?

Это невозможно сделать физически ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826983
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryegorych,

а почему не сделать такой отладчик, чтобы он делал остановки внутри строки ? Или разбирал особые выражения, как, например, выше ?

Это невозможно сделать физически ?как ты себе это физически представляешь? как поставить точку останова на второе присваивание в строке a=b=c; ?
неоправданное усложнение и так не простого софта, имхо
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38826985
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychкак поставить точку останова на второе присваивание в строке a=b=c; ?даже не так, как поставить точку останова на инкремент в строке int c = *s++ = a[ 0 ];?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827006
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,я не знаю как(ибо не разбирал процесс отладки).А спрашиваю, возможно ли это?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827051
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА спрашиваю, возможно ли это?
Конечно возможно - разбить выражение на отдельные строки
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827067
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymayton,

ну теперь вы хотя бы согласны с тем, что K&R так делали ?
PS
к сожалению мои коллеги, и весь мой практически миллионный город ни бум бум в Си.(ну ладно, человек 20 может быть чего и знают)
Ты еще молод в форуме и С++ а уже приобрёл зловещие приёмы демагогии.
Хочешь надавить на меня авторитетом К&R ? Зачем тебе это нужно?
Ты будешь чувствовать себя "правым" с таким вот исходником:

Код: plaintext
1.
while (isalnum(c = *s++ = getc(in)) || c == '_');



P.S. По сабжу я не уверен что К&R об этом писали и давали подобные
рекомендации. Это противоречит best practices и создаёт нерешаемые
проблемы в режиме debug.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827216
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, да вы чего, ((
ни на кого я не давлю, чьим-то авторитетом, а просто показал что это я не из головы взял, а из K&R :(

Я вообще ультрамирный человек, особенно тут. А вы говорите что я давлю. Обидно такое слышать. Ну если бы мне какой идиот из раздела программирования такое сказал, я бы ему чего ответил, а тут такое слышать обидно (
И я не чувствую себя правым, никогда. Мне никогда не нравится мой код, крайне редко я им доволен хотя бы на 4 с минусом
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827217
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я плачущего товарища не рисовал.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827263
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто я прошу тебя не "притаскивать за уши" K&R. Эти парни не имеют никакого
отношения к тому что ты написал.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827351
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryни на кого я не давлю, чьим-то авторитетом, а просто показал что это я не из головы взял, а из K&R :(Ньютон заслуженно считается основателем классической механики. Не знаю как сейчас, но мы начинали с первого тома ландафшица. "Начала натуральной философии" на физфаке даже не упоминались.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827356
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovSashaMercuryни на кого я не давлю, чьим-то авторитетом, а просто показал что это я не из головы взял, а из K&R :(Ньютон заслуженно считается основателем классической механики. Не знаю как сейчас, но мы начинали с первого тома ландафшица. "Начала натуральной философии" на физфаке даже не упоминались.

надо полагать, что язык на котором написаны Начала, труден для восприятия(ибо 17 век). И если уж на то пошло, то законы Ньютона есть приближение к реальному положению вещей, и некоторые могут сказать что они вообще не должны изучаться
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827363
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело не в языковой разнице, а в актуальности знаний. Классическая механика (в рамках применимости) - актуальна, труды Ньютона - уже нет, но могут быть интересны историкам науки.
Тоже самое с K&R: да, основоположники, но использовать их примеры кода налево-направо - несколько неразумно.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827365
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПросто я прошу тебя не "притаскивать за уши" K&R. Эти парни не имеют никакого
отношения к тому что ты написал.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827366
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827374
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovДело не в языковой разнице, а в актуальности знаний. Классическая механика (в рамках применимости) - актуальна, труды Ньютона - уже нет, но могут быть интересны историкам науки.
Тоже самое с K&R: да, основоположники, но использовать их примеры кода налево-направо - несколько неразумно.

Вы считаете что в настоящее время программирование на Си, ушло сопоставимо далеко как теория относительности от физики Ньютона, или сопоставимо далеко как труды Ньютона в 17 веке, и их современное толкование ?

Хорошо, мнение всех я понял, приму к сведению. Всем спасибо :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827378
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И что? Тот факт, что C/C++ позволяет создавать замысловатые конструкции никак не меняет простых фактов:
1. Замысловатый код сложнее понимать и отлаживать;
2. Разработчики компиляторов не зря жуют свой хлеб и в состоянии сгенерировать оптимальный машинный код, даже если программист не пытался вывернуться наизнанку.
Да, программист должен понимать хитропопый код, но вот использовать ...
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827384
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласитесь, читать о Родионе Раскольникове не так просто, как читать о Гарри Поттере. Но это не значит, что я должен писать книги равняясь на Роулинг, а Фёдора Михайловича не открывать. Да, если это массовый продукт, то зачем изголяться, приму к сведению. Но для меня, программный код это повесть. И мне не хочется писать примитивные книги

PS
Прочитать Гарри Поттера можно за 5 часов(самую толстую книгу). Любую книгу Достоевского минимум неделю. Но от чего вы получите удовольствие ?
PSPS
Всё, я принял к сведению ваше мнение, учту:)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827385
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Начнем с того, что книгу по С в которой все листинги ЗАГЛАВНЫМИ буквами, вообще не стоит читать :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827388
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovИ что? Тот факт, что C/C++ позволяет создавать замысловатые конструкции никак не меняет простых фактов:
1. Замысловатый код сложнее понимать и отлаживать;
2. Разработчики компиляторов не зря жуют свой хлеб и в состоянии сгенерировать оптимальный машинный код, даже если программист не пытался вывернуться наизнанку.
Да, программист должен понимать хитропопый код, но вот использовать ...

только прочитал.
1. сложнее, не значит хуже(значит получишь больше удовольствие). Меньше псевдопрограммистов будут работать программистами.
Плохой код, и сложный код, разные вещи. Прототип функции копирования без указания квалификатора const к источнику, сложное именование переменных, и т.д.-плохой код, что такое сложный код, другой вопрос.
2. ну..тут вам виднее
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827389
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

у менять есть с маленькими буквами, там аналогично :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827396
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1. сложнее, не значит хуже(значит получишь больше удовольствие)Я ещё раз напомню о производстве кода. За собственным верстаком можно развлекаться как угодно. Но не более того.Меньше псевдопрограммистов будут работать программистами"Нет сынок, теперь ты будешь меньше кушать".Плохой код, и сложный код, разные вещиСложный код, как правило, разновидность плохого.
Есть исключения, где сложность кода определяется нетривиальностью задачи, но, в этом случае, любой вариант не будет тривиальным.
Если же "а вот тут мы на шкаф залезем" вместо "ди эрсте колонне марширт, ди цвайте колонне марширт", то это, imho, звоночек.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827407
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
...,der dritte Kolonne marschiert .. ;)

Доброго времени суток :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827408
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
впрочему, Фуль, или Пфуль (не помню), был скорее примером в мою пользу, чем в вашу :p
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38827448
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саш.

Ох как-же я люблю цитировать сам себя... Ну что мне снова найти
фразу где я говорю об исключительности функции strcpy и ассемблере?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38828151
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСаш.

Ох как-же я люблю цитировать сам себя... Ну что мне снова найти
фразу где я говорю об исключительности функции strcpy и ассемблере?

Марк, как давно появилась эта операция в ассемблере ?Примерно
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38828155
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотря в каком ассемблере. В true-RISC - нет и не должно быть.
Про Z80 - не в курсе, в x86 - изначально было rep movs и два специальных регистра для поддержки. Даже три, если считать регистр цикла. Хотя сильно оптимизированная версия будет использовать load/double shift/store в общем случае.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38828170
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До моего рождения. Речь идёт скорее всего об одной из первых версий С для разработки Unix.
C 1973 года.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38828171
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это к тому, что я не уверен в том, что именно этот пример представлен в книге из-за связи с какими-то расширенными командами процессора (причём RISC процессоры отпадают(как я предполагал, а выше подтвердили)).

Пример приведен не отталкиваясь от того, как будет работать отладчик. Он приведен с упором на возможности и преимущества языка.

В любом случае, я не занимаюсь демагогией, и я вас прекрасно понимаю, если отладчик работает так как он работает, то такой код может добавить проблем при отладке. Полностью согласен.

Но вот у меня такой вопрос. Как вы считаете, в данном конкретном случае:
1. Программист должен ограничивать себя, из-за несовершенства отладчика ?
2. Правильно ли, что программист должен ограничивать себя из-за несовершенства отладчика ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38828185
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryпричём RISC процессоры отпадают(как я предполагал, а выше подтвердили)Отпадают не RISC, а true-RISC.
Скажем, у вполне RISC-овых IBM Power, насколько я знаю, команда пересылки невыровненной цепочки байт - есть.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38828189
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1. Программист должен ограничивать себя, из-за несовершенства отладчика ?
2. Правильно ли, что программист должен ограничивать себя из-за несовершенства отладчика ?программист должен ограничивать себя, чтобы писать понятный, легкочитаемый и сопровождаемый код. Совершенство/несовершенство отладчика в данном случае - вопрос 800ой очерёдности.
Недавно топик был про v[ i++ ] = i++; - явление такого же порядка. Слишком много побочных эффектов для одной строчки кода, что потенциально может привести к появлению трудноуловимых ошибок.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38828201
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1. Программист должен ограничивать себя, из-за несовершенства отладчика ?
Тут речь идёт о другом. Скорее всего ты ограничиваешь своих коллег. Ты заставляешь их
делать code-review следующей какашки.

Код: plaintext
1.
while (isalnum(c = *s++ = getc(in)) || c == '_');



Если ты реализуешь "некоторую логику" то должно следовать ЯСНОЕ и ЧЁТКОЕ доказательство
ее корректности в ОБЩЕМ СЛУЧАЕ. Тоесть функция не должна вызывать ни у кого вопросов
или неоднозначных толкований. Цикл ВСЕГДА содержит выражения инициализации, итерационное
выражение и тело цикла. 3 сущности. Они должны быть чётко обозначены. В строгих ЯП типа
Pascal специально созданы жёсткие синтаксические конструкты. Декларации. Выражения инкремента.
Тело цикла. Там нет возможности сделат финт или написать что-то неоднозначное.

И не надо говорить про несовершенство отладчика. Он - простой и ясный инстумент для
хождения по СТРОКАМ исходника. И если ты намисал ВСЁ приложение в 1 строчку
то ты сам себе злобный буратино! Не пиши так! Не ходите дети... в Африку гулять.

Выражение

Код: plaintext
1.
WHILE((*S++=*T++)!='\0');



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

В отличие от твоего кода. Который будет еще over 9000 раз исправлен. Дополнен условиями и кейсами.

Вобщем ты можешь писать как угодно. Но как только ты выносишь код на суд, в форум.
В паблик SVN. Просишь критиковать. Обсуждать. То тут уж - извини. Я оттянусь по полной. .

Кстати я всегда прислушиваюсь к чужим советам и по поводу своего
кода. Бывает что и глаз замылен. И лень-паттерн...
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38828212
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ лень-паттерн... нашевсё
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38828213
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ оттянусь по полной. .


всегда рад :)

maytonКстати я всегда прислушиваюсь к чужим советам и по поводу своего
кода. Бывает что и глаз замылен. И лень-паттерн...

прислушиваюсь всегда к чужим советам.

Basil A. Sidorov,egorych, mayton, всем спасибо за критику и предложения:)Все мнения учтены, и все они у меня в голове.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38836303
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саша дуй сюда Физики есть?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38853729
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Праздникам конец.

Не помню говорил ли, но реализация алгоритма М (выполнение макрозамен в коде программы) завершена, ещё в прошлом году.
Однако, мне не нравится моя реализация. Потому занимаюсь изменением алгоритма.(кстати, а есть ли для этого словосочетания слово аналогичное слову "рефакторинг" ? ). Да, собственно потому, то что сделал не выложил. Потому что не доволен этим.

Первый шаг алгоритма M0 предлагаю сделать таким: считать весь код программы в heap. Адрес объекта например char* code.
В дальнейшем алгоритм будет работать только с этим объектом.
В настоящее время, токенизация происходит из файла.

Причины такого решения:
1. Как можно быстрее освободить файл, вследствие чего предотвратить возможные ошибки. Например, во время работы с файлом с ним что-то произойдёт и он будет прочитан не полностью. Если время в течении которого мы с ним работаем больше, то вероятность того что это случится выше.
2. Предполагаю, что за счёт этого я не потеряю в производительности больше чем незначительно, даже в том случае если причина1 неверна. При возможных небольших потерях в производительности, выигрываю в простоте кода.

Минусы:
1. Выделение памяти, хотя незначительное. Допустим код программы содержит 10^6 символов<2^(3.4*6) Байт<2^21 Байт=2 Мб
Не так много, но на старых машинах прилично.
2. Возможные издержки во времени

Возникающие проблемы:
Как мне узнать сколько памяти в куче выделить на конкретный файл? Нужно выделить столько, сколько нужно + небольшой задел, мало-ли, ошиблись.
Искать конец файла, или считать количество символов не считаю правильным, ибо долго. Должна где-то храниться информация о размере файла, и её вероятно как-то можно прочитать. Верно ?


Подскажите пожалуйста, имеют ли место быть рассуждения выше ? Делали ли бы вы шаг М0 ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38853744
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1. Как можно быстрее освободить файл, вследствие чего предотвратить возможные ошибки. Например, во время работы с файлом с ним что-то произойдёт и он будет прочитан не полностью. Если время в течении которого мы с ним работаем больше, то вероятность того что это случится выше. Зачем??? Не шмогли значит не шмогли. Выдал ошибку что мол файл неожиданно закончился, или заблокирован, или что там еще с ним случилось и отменил всё. Какой смысл предотвращать ошибку файлового типа на этапе компиляции?
И если ты ее даже предотвратишь: была версия файла номер N. Ты начал с ней работать, а в это время пришел злодей-юзер, подправил файл и стала там версия N+1. А у тебя в это время продолжается компиляция версии N. Откомпилировали, запустили - видим что программа работает не правильно. Но мы же знаем что мы эту ошибку только что исправляли?!


SashaMercuryКак мне узнать сколько памяти в куче выделить на конкретный файл? Нужно выделить столько, сколько нужно + небольшой задел, мало-ли, ошиблись.
Искать конец файла, или считать количество символов не считаю правильным, ибо долго. Должна где-то храниться информация о размере файла, и её вероятно как-то можно прочитать. Верно ?Верно. Хранится она в FS (File System) и доступна когда ты читаешь директорию, или через stat()/fstat() функции, или через пару fseek()+ftell() которые выполняются очень даже быстро (потому что внутри используют fstat()).
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38853774
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl, спасибо.
Вы считаете, что не стоит менять текущий алгоритм в контексте токенизации из файла ? Вы бы не стали использовать предварительное чтение данных в кучу ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38854010
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПервый шаг алгоритма M0 предлагаю сделать таким: считать весь код программы в heap. Адрес объекта например char* code.
В дальнейшем алгоритм будет работать только с этим объектом.
В настоящее время, токенизация происходит из файла.

Причины такого решения:
1. Как можно быстрее освободить файл, вследствие чего предотвратить возможные ошибки. Например, во время работы с файлом с ним что-то произойдёт и он будет прочитан не полностью. Если время в течении которого мы с ним работаем больше, то вероятность того что это случится выше.
2. Предполагаю, что за счёт этого я не потеряю в производительности больше чем незначительно, даже в том случае если причина1 неверна. При возможных небольших потерях в производительности, выигрываю в простоте кода.

Если у тебя файл с исходником могут (внезапно) украсть инопланетяне то в топку твою файловую
безопасность.

Если твои файлы лежат на сетевом диске NFS/SMB/ftp/webdav то копируй их себе в каталог проекта
или хоть в $TEMP/$TMP и наслаждайся эксклюзивом.

Если твой компиллятор просто так по приколу всё прогружает в хип то рано или поздно разгневанный
анонимос придёт к тебе в блог и выскажет своё мнение по поводу тебя и твоей драгоценной мамы
(дай бох ей здоровья).
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38854213
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
:D спасибо, и вашей маме здоровья.

Эту идею никто не поддержал. Хорошо. Приму вашу точку зрения, оставлю всё как есть, по вопросу токенизации
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38854335
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Не поддерживают, потому что не надо подстраивать алгоритм под невероятные сценарии
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38854653
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите http://opencxx.sourceforge.net/ OpenC++ is C++ frontend library (lexer+parser+DOM/MOP) and source-to-source translator
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38854741
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012,
зачем ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38855582
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1. Я решил, что сначала мне нужно получить список всех замен (как бы это слово правильно назвать, макроподстановок? ) в тексте
Приведенная ссылка - это тот проект с чего началась PVS-Studio /согласно их мемуаров/.
Если вас интересует тема лексического разбора C++ ..., то этот проект по идее должен был бы быть
вам интересен.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38855843
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, пользуюсь вашим советом. В свете недавних решений касаемо алгоритма, в первую очередь нужно реализовать алгоритмы через объект Stream.
Изменил то, что вы предлагали. Подскажите пожалуйста, имею ли я право создавать такую структуру вообще, и подходит ли она мне в дальнейшем в таком виде ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct Stream
{
	void* name;
	int (*get_symb)(struct Stream*);
	int (*unget_symb)(struct Stream*);
	int end_symb;
};
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38855844
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012,

мне нравится делать это самому. Не так много знаю, чтобы пользоваться готовыми решениями. Позже обязательно посмотрю. Спасибо )
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38855861
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryимею ли я право создавать такую структуру вообще, и подходит ли она мне в дальнейшем в таком виде ?
Имеете. Подходит.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38857196
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Сегодня возник вопрос. Правильно ли я понимаю, что вызов функций через объект Stream, будет медленней чем вызов функций непосредственно ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38857206
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСегодня возник вопрос. Правильно ли я понимаю, что вызов функций через объект Stream, будет медленней чем вызов функций непосредственно ?
Да, косвенная адресация занимает больше тактов процессора.
Но на практике задержка будет несущественной по сравнению например со временем доступа к файлу на диске. Да и современнные процессоры умеют оптимизировать это.

А чтобы устранить оверхед от дополнительного уровня абстракции, можно применить буферизацию.
Т.е. читать не по символу из потока, а блоками. А уже из блока читать символы простым сдвигом указателя.
Примерно так и реализуются обычно потоки.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38857220
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но для того чтобы читать блоками, нужно знать размер файла, верно ?Чтобы не прочитать то, что я не должен прочитать. Да и вообще, в любом случае, считывание блока, будет абстракцией в том смысле, что по факту я буду считывать один блок по символам. Либо это происходит по другому ?
PS
Уже не эти ли функции тут используются fread, fwrite ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38857253
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В свете рассуждений выше, возможно всё-таки лучше оставить код без введения интерфейса независимого от реализации. Думаю ещё вообщем
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38857255
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И при этом добавить буферизацию, например считывать по строкам(для начала). Первоначально разобравшись с тем, как это делать. Таким образом, нивелирование задержек при внедрении косвенной адресации, можно заменить на ускорение существующего алгоритма
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38857483
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Вам вообще ничего не надо оптимизировать.
У вас алгоритма-то рабочего собственно пока нет :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38857554
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercury,

Вам вообще ничего не надо оптимизировать.
У вас алгоритма-то рабочего собственно пока нет :)

есть. Но мне он не нравится. Скоро выложу, когда доведу код до ума
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38857621
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryAnatoly MoskovskySashaMercury,

Вам вообще ничего не надо оптимизировать.
У вас алгоритма-то рабочего собственно пока нет :)

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

Франсуа Рабле - Гаргантюа и Пантагриэль - Глава -4 - О том, как Пантагрюэль правильно
разрешил один удивительно неясный и трудный вопрос - разрешил столь мудро, что его
решение было признано поистине чудесным
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38865117
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк, спасибо, прочитаю обязательно. Но позже. Если научный узнает что я сейчас что-либо кроме математики читаю, то мало не покажется, да и времени очень мало.

Ребята, подскажите пожалуйста как нормально построить структуры и методы, и связи. То как это делается в виде таблиц мне не нравится. Или ткните куда почитать пожалуйста :) Это всё к этой задаче. мне постоянно всё не нравится, и я её переделываю.
PS
Знаю что долго. Всё началось с того, что изначальный алгоритм был неверный.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38865121
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу нарисовать на большом листе, и уже закончить с ней
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38865325
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryРебята, подскажите пожалуйста как нормально построить структуры и методы, и связи. UML ? не?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38865411
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryХочу нарисовать на большом листе, и уже закончить с ней
На самом деле рисовать можно в любом виде понятном тебе самому.
Даже будет плюс если ты разработаешь систему своих собственнх графических
обозначений. Я вот в использовани Relational Diagram нигде не могу найти
редактора который подводит "стрелочку со связью" (многие к одному)
не к сущности а к сущности+полю. Ну не могу и всё тут. А это важно.
Тк. по именам колонок не всегда понятно какая именно ключуется с foreign
key. Рисую сам поэтому.

А UML нужен в основном для презентаций или "общих" SR где в красивых и обтекаемых
формах показывают всю крутизну и продвинутость создаваемого так называемого ПО.

И "структуры", "методы" и "связи" ты можешь показать десятком способов.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38866136
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо. Спасибо за совет.

Подскажите пожалуйста, имеет ли место быть такая функция ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void add_Macro_to_MS(struct MacroSpace* ms, const struct Macro* m)
{
	ms->count += 1;
	ms->m = (struct Macro*)realloc(ms->m, ms->count*sizeof(struct Macro*));
	struct Macro* cur = &(ms->m[ms->count - 1]);
	cur = m;
}



У меня до этого добавление было сразу облако. А мне кажется это неправильно. Нужно формировать макрос, и потом добавлять макрос в пространство макросов
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38866169
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит я должен хранить массив указателей макроподстановки, а не так как я сейчас храню. Верно ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38866172
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так
Код: plaintext
1.
2.
3.
4.
5.
struct MacroSpace
{
	int count;
	struct Macro** m;
};
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38866183
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ещё функции

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
//конструктор пространства макроопределений
struct MacroSpace* create_MacroSpace()
{
	struct MacroSpace*	ms = (struct MacroSpace*)malloc(sizeof(struct MacroSpace));
	ms->count = 0;
	ms->m = NULL;
	ms->m = (struct Macro**)malloc(sizeof(struct Macro*));
	return ms;
}

void add_Macro_to_MS(struct MacroSpace* ms, const struct Macro* m)
{
	ms->count += 1;
	ms->m = (struct Macro**)realloc(ms->m, ms->count*sizeof(struct Macro*));
	ms->m[ms->count - 1] = m;
}



такие функции имеют место быть ? Подскажите пожалуйста. Чувствую что где-то ошибся. А вот так предполагаю использовать:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
//произвести проепроцессорную обработку кода программы на языке программирования Си
void parse_file(FILE* out, FILE* in, struct MacroSpace* ms)
{
	char* id = (char*)malloc(sizeof(char)*MAX_LENGTH_INTERNAL_IDENTIFIER);
	int t;
	while ((t = get_identifier(id, in)) != EOF)
	{
		if (t == WORD)//слово
		{
			int ind;//индекс макроподстановки
			if (!strcmp(id, KEYWORD_FOR_MACRO))//Далее определена макрозамена. Добавление макрозамены
			{
				struct Macro* m = create_Macro();
				set_Macro_from_File(m, in);//беру макрос из файла. всё ок, проверял
				add_Macro_to_MS(ms, m);
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867862
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Разобрался. Проблема была с выводом. Всё выше верно.

Подскажите пожалуйста по следующему вопросу. Реализовать функцию чтения идентификаторов из потока Файл очень легко. Потому что мы всегда напрямую работаем с внутренним указателем потока. Работа по извлечению идентификаторов из строки сложнее. Нужно дополнительно хранить текущий индекс внутри строки. Можно как-нибудь уйти от этой проблемы ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867884
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У строки нет курсоров. Придётся хранить.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867895
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ строки нет курсоров. Придётся хранить.

хорошо, спасибо :)
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867917
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А на С++ можно как-либо решить эту проблему ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867920
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Должен быть какой-то объект Reader который рассматривает строку как файл.
Правда я давно не следил за развитием STD/Boost и не знаю есть ли там такое или нет.

Как по мне - должно быть. Пускай знающие подскажут.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867932
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНужно дополнительно хранить текущий индекс внутри строки. Можно как-нибудь уйти от этой проблемы ?и в чём проблема? жалко памяти на один char*??
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867937
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, вы не поверите.
5 февраля выходит Игра в имитацию. Жду с нетерпением. Только сейчас узнал.
Мне пора.

PS
прошу прощение за оффтоп, не мог удержаться и не поделиться с Сообществом радостной новостью.Про Алана Тьюринга не каждый день кино снимают C:
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867947
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,
мне кажется, что каждая переменная удваивает сложность программы. Жалко читабельности
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867948
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДолжен быть какой-то объект Reader который рассматривает строку как файл.std::stringbuf?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867953
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryegorych,
мне кажется, что каждая переменная удваивает сложность программы. Жалко читабельностинаоборот, с удачным именем если, и к месту применённая, то наоборот, уменьшает сложность и повышает читабельность.
Пора тебе читать Совершенный код , чтобы не ходить по граблям, которые давно найдены, исследованы и описаны ))
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867955
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryРабота по извлечению идентификаторов из строки сложнее. Нужно дополнительно хранить текущий индекс внутри строки.
Сложнее, но не особо.
Сделай структуру-обертку и с ней работай
Код: plaintext
1.
2.
3.
4.
struct str_file {
  char* str;
  char* index;
}
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867957
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, а вы знаете почему Стивен и ко выбрали логотипом яблоко ? Одну из трёх теорий, непосредственно связанных с ним

PS
ну все, сейчас не смогу заснуть, жду - не дождусь фильма ^_^

Модератор: Редактировано

Модератор: Вложение удалено.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867960
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryРабота по извлечению идентификаторов из строки сложнее. Нужно дополнительно хранить текущий индекс внутри строки.
Сложнее, но не особо.
Сделай структуру-обертку и с ней работай
Код: plaintext
1.
2.
3.
4.
struct str_file {
  char* str;
  char* index;
}



Думал про это. Но решил не использовать. Спасибо
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867964
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, по хорошему ещё бы длину в ней хранить. Если ничего не придумаю до понедельника, то буду использовать обёртку, вероятно
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867977
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДмитрий, по хорошему ещё бы длину в ней хранить. Если ничего не придумаю до понедельника, то буду использовать обёртку, вероятно
Если это классическая строка, то конец так проверяется
Код: plaintext
1.
*index == 0


если нет, то добавить указатель на последний символ
Код: plaintext
1.
2.
3.
4.
5.
struct str_file {
  char* str;
  char* index;
  char* end;
}


и проверять так
Код: plaintext
1.
index > end


так операций меньше по сравнению с хранением смещения и длины строки.
Последовательное чтение элементарно делается:
Код: plaintext
1.
2.
3.
4.
5.
6.
index++;
if(index > end) {
  return EOF;
} else {
  return *index;
}


изначально index = str - 1
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867978
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryegorych,
мне кажется, что каждая переменная удваивает сложность программы. Жалко читабельности
В Паскале строки хранят внутри себя длину. Точнее структура данных представляющая
строки ее инкапсулирует. Это вобщем-то имеет преимущество. Сравнение длин строк
идёт очень быстро. В отличие от "C" ASCIIZ строк. Развивая эту идею можно положить
рядышком с длинной и current_position.

Твой тезис о читабельности - неверный. Инкапсуляция тебе в помощь.
А попытка "скромничать" породит еще несколько антипаттерном. Будешь потом
"тяпкой" корчевать свой код. Выкорчёвывать "паттерны скромности".
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38867990
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо. Я подумаю, обо всём этом.
PS
ребята, я боюсь эти британцы исказили историю, и фильм может разочаровать.И выбрали попсового актёра на роль Тьюринга. В английских театрах всё наоборот. Главные роли играют самые некрасивые и непримечательные люди. Почему ? Для того чтобы передавать идею и завоевывать публику игрой, а не лицом. Актерские качества первичны.
меня гонят..Всего доброго

Модератор: Редактировано
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38868056
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саша. Давай британцев и Тьюринга под спойлер.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38868058
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ Паскале строки хранят внутри себя длину.что ограничивает размер строки до 255 символов, потому что длина у них хранится в нулевом байте. А если надо строку побольше, то бери ASCIIZ-строку, чудес то ведь не бывает ))
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38868070
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychчто ограничивает размер строки до 255 символов, потому что длина у них хранится в нулевом байте.Это у Борландов.
Но никто не запрещает использовать честный record.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38868072
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно. Оракл тоже свинью подкинул. Самое смешное что один и тот-же тип данных VARCHAR2
в PLSQL машине ограничен в 32К а в табличке не более 4000 байт.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38868096
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovНо никто не запрещает использовать честный record.а рекорд - это не аналог структуры у них, разве?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38868107
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychа рекорд - это не аналог структуры у них, разве?Аналог, но это не мешает использовать записи для реализации строк языка Pascal.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38868116
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovegorychа рекорд - это не аналог структуры у них, разве?Аналог, но это не мешает использовать записи для реализации строк языка Pascal.если внутри будет сидеть pchar и длина строки отдельным полем то, это ничем не отличается от того, что DimaT предлагает для С.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38868147
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychBasil A. Sidorovпропущено...
Аналог, но это не мешает использовать записи для реализации строк языка Pascal.если внутри будет сидеть pchar и длина строки отдельным полем то, это ничем не отличается от того, что DimaT предлагает для С.
Это близко к stl::string но Саша насколько я понял не юзает STL.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38868294
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
struct Fstring
{
	char* s;
	char* index;
};

struct Fstring* create_Fstring(const char* s)
{
	struct Fstring* fs = (struct Fstring*)malloc(sizeof(struct Fstring));
	fs->s = NULL;
	size_t pow = strlen(s) + 1;
	fs->s = (char*)malloc(sizeof(char)*pow);
	strcpy(fs->s, s);
	fs->index = fs->s;
	return fs;
}

void free_Fstring(struct Fstring* fs)
{
	free(fs->s);
	free(fs);
}



пока сделал так. Но мне это не очень нравится. Хочется реализацию этого на уровне стандартной библиотеки. Только не такую как в языке Паскаль
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38868296
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот так читаю,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
int get_identifier_from_Fstring(char* s,  struct Fstring* fs)
{
	char c = *s++ =  *fs->index++;
	if (isalpha(c) || c == '_')//слово
	{
		while (isalnum(c = *s++ = *fs->index++) || c == '_');
		*--s = '\0';
		--fs->index;
		return WORD;
	}
	else if (isdigit(c))//число
	{
		while (isdigit(c = *s++ = *fs->index++));
		*--s = '\0';
		--fs->index;
		return NUMBER;
	}
	else if (c == '\0')//конец строки
	{
		return '\0';
	}
	else //символ ( ) ; smth else 
	{
		*s = '\0';
		return SYMBOL;
	}
}



вечером буду тестировать
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38868984
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

1. Пришел к выводу, что по хорошему вот как нужно делать: в каждом крупном проекте должен быть файл с именем fe: libs.h
В него должны подключаться все модули этой программы. А в файле содержащем точку входа нужно подключать libs.h

2. Возможно константы определенные макрозаменами стоит хранить в одном файле, и включать его в каждый . Далее циклом собирать каждую единицу трансляции. Это предложение совсем абстрактное.

3. Можно ли построить саму программу или корректный механизм трансляции и сборки программ без использования дополнительных директив сборки, fe таких как pragma once и схожего назначения? Это основной вопрос о котором я думаю. Возможно это так, но тогда процесс добавления нового модуля в программу будет крайне затруднителен. Ответьте пожалуйста на этот вопрос

4. Используете ли вы pragma once и как вы относитесь к этой директиве ?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38868997
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте.

1. Пришел к выводу, что по хорошему вот как нужно делать: в каждом крупном проекте должен быть файл с именем fe: libs.h
В него должны подключаться все модули этой программы. А в файле содержащем точку входа нужно подключать libs.h

2. Возможно константы определенные макрозаменами стоит хранить в одном файле, и включать его в каждый . Далее циклом собирать каждую единицу трансляции. Это предложение совсем абстрактное.

3. Можно ли построить саму программу или корректный механизм трансляции и сборки программ без использования дополнительных директив сборки, fe таких как pragma once и схожего назначения? Это основной вопрос о котором я думаю. Возможно это так, но тогда процесс добавления нового модуля в программу будет крайне затруднителен. Ответьте пожалуйста на этот вопрос

4. Используете ли вы pragma once и как вы относитесь к этой директиве ?1. Да. Я часто использую такой заголовочный файл. Он особенно хорошо живет вместе с прекомпляцией заголовков.

2. Объявлять константы через дефайны - да. Циклом собирать единицу трансляции... ээээ??? Зачем там цикл?

3. Да конечно можно собирать без директив сборки. Все эти директивы это совершенно ненужные костыли которые больше вредят чем помогают. Используя их можно чуть-чуть облегчить себе жизнь на первом году, но они жутко мешают при попытках переноса программы в другое окружение.

4. По существу единственная pragma которую имеет смысл использовать это pack. Все остальные нафиг не нужны.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38869006
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, Анатолий, вы не поверите.

Программа препроцессорной обработки кода на языке программирования Си в первом приближении готова C:
И её не так стыдно показать. Только немного потестирую
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38869047
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако чем-то pragma once помешала? Неужели приятнее плодить что-то вроде #ifndef _FILE_H_SOME_GUID_LIKE_CRAP/#define _FILE_H_SOME_GUID_LIKE_CRAP/#endif по заголовкам?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38869100
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wst,

её не все компиляторы поддерживают.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38869102
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wstОднако чем-то pragma once помешала? Неужели приятнее плодить что-то вроде #ifndef _FILE_H_SOME_GUID_LIKE_CRAP/#define _FILE_H_SOME_GUID_LIKE_CRAP/#endif по заголовкам?ага, приятней. Ибо стандартно, православно и работает везде
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38869195
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не поддерживает IBM XL C/C++. Наверняка не поддерживают компиляторы от каких-то микроконтроллеров. Это повод отказываться от нее в остальных случаях?
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38869316
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... тут вообще всё печально. По поводу #pragma once

https://ru.wikipedia.org/wiki/Pragma_once

цитирую

В наборе компиляторов GCC до версии 3.4 считалась устаревшей и для применения не рекомендовалась.[1] Однако из-за широкого применения это решение было изменено.[2]
Можно использовать обе команды, #pragma once и include guards, для написания переносимого кода, что также может принести выгоду от применения #pragma once при оптимизации (если компилятор её поддерживает):
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38869448
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично мне хватает того, что её не поддерживает IAR.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38869489
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wstОднако чем-то pragma once помешала? Неужели приятнее плодить что-то вроде #ifndef _FILE_H_SOME_GUID_LIKE_CRAP/#define _FILE_H_SOME_GUID_LIKE_CRAP/#endif по заголовкам?
Тут другой вопрос. Задача включения хедера once решается препроцессором с #ifdef-define-endif ? Решается.
Если следовать принципу KISS, то ничего больше делать не надо.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38870326
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Вроде бы проверил всё что мог. Максимальный уровень вложенности 2^10 макроподстановок
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38870331
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Рекомендую github.com для публикации кода.
Там и просмотр кода и история изменений прямо на сайте.
А смотреть запакованные исходники приложенные к сообщению никто не будет.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38870642
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я буду смотреть. Но буду ворчать.
...
Рейтинг: 0 / 0
Анализ исходного кода. Разбор IOCCC 1985 august
    #38872779
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги. Зашёл на хабр.

Ссылки по теме макропроцессинга. Может кому будет интересно

Магия макросов для объединения объявления и реализации
http://habrahabr.ru/post/148494/
Грязные трюки с макросами C++
http://habrahabr.ru/post/246971/
Макросы с переменным числом параметров
http://habrahabr.ru/post/138150/
...
Рейтинг: 0 / 0
281 сообщений из 281, показаны все 12 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ исходного кода. Разбор IOCCC 1985 august
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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