powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ исходного кода. Разбор IOCCC 1985 august
25 сообщений из 281, страница 6 из 12
Анализ исходного кода. Разбор 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
25 сообщений из 281, страница 6 из 12
Форумы / C++ [игнор отключен] [закрыт для гостей] / Анализ исходного кода. Разбор IOCCC 1985 august
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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