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


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