Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

или подключить к земле, - используя параметр INPUT_PULLUP?
или может все незадействованные ноги ардуино посадить на минус, чтобы не ловили помехи какие-нибудь
Это конечно полная ерунда написана. От непонимания.
3 метра подключен к ардуине, может из за этого виснуть?
Может. Попробуйте для начала подключить коротким проводом его. Чтобы исключить остальные проблемы.
Реклама
Родился
Сообщения: 2
Зарегистрирован: Вт июн 08, 2021 10:56:42

Сообщение sakvvvvvv »

Всем здрасте.
До этого программировал avr в Flowcode.
Я новичок в Си, месяц читаю и в большинстве всё понятно.
НО, откуда берут какой #include в каком случае, как например для задержки времени _delay_us надо включить <avr/delay.h>, но нигде не говорят где и в каком случае подключать другие файлы библиотеки и какие переменные/имена использовать из той библиотеки.
К примеру хочу I2C, какой #include< > мне для этого нужен и какие имена из него использовать и т.д.?
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18813
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 2
Зарегистрирован: Вт июн 08, 2021 10:56:42

Сообщение sakvvvvvv »

[uquote="ARV",url="/forum/viewtopic.php?p=4044456#p4044456"]все это берут из документации к тулчейну.[/uquote]
Тулчей, значит тулчей.

Добавлено after 49 seconds:
[uquote="NStorm",url="/forum/viewtopic.php?p=4044491#p4044491"]sakvvvvvv, если avr-gcc, то:
https://www.nongnu.org/avr-libc/user-ma ... dules.html
https://www.nongnu.org/avr-libc/user-manual/pages.html[/uquote]
Это уже ближе, спасибо.
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Тулчей, значит тулчей.
Тулчейн. https://en.wikipedia.org/wiki/Toolchain
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18813
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Код: Выделить всё

ISR(TIMER1_OVF_vect){
	static uint8_t	entry;
	static uint8_t	pos;
	static pos_t *scr = screen;
	regs_t	regs;

	// считаем входы
	if(++entry >= IND_RPT){
		entry = 0;
		// каждые 2 мс
		two_ms++;
		// смена разряда
		scr++;
		if(++pos >= POS_CNT){
			pos = 0;
			scr = screen;
		}
		regs.word = _BV(11+pos);
	}
	// готовим один из двух символов для вывода
	regs.word &= 0xf800;
	regs.word |= digs[scr->symbol[entry >= scr->bright]];

	// выдача в сдвиговые регистры через SPI
	SPDR = regs.bytes[1];
	while(bit_is_clear(SPSR, SPIF));
	SPDR = regs.bytes[0];
	while(bit_is_clear(SPSR, SPIF));
	// строб для защелкивания данных
	PORTB |= LOAD_PIN;
	PORTB &= ~LOAD_PIN;
}
вот такой код для динамической индикации. каждые 2 мс происходит смена разряда, а каждый заход в обработчик происходит обновление символов (символов два, сначала выводится один, а когда количество входов превысит заданное значение - другой, таким образом реализована "плавная" смена символов).

так вот, код этот РАБОТАЕТ. но, если внимательно посмотреть на него, а именно на структуру regs, то станет понятно, что работать он НЕ ДОЛЖЕН: структура локальная, значит, содержимое её при каждом новом входе не определено, а значит, строка после комментария "готовим один из двух символов для вывода" не имеет смысла - подавлять часть разрядов поля структуры для того, чтобы сохранить биты управления разрядом индикатора, нет смысла - там неизвестно что может быть! кстати, некоторые версии компилятора avr-gcc предупреждают, что переменная тут может быть не проинициализирована, некоторые этот факт игнорируют, но при оптимизации -O3 код работает после компиляции любой версией (проверял 4 разных, от 4.хх.хх до 10.хх.хх). и еще кстати, при -Os код не работает так же независимо от версии компилятора.

казалось бы, в чем беда? делаем структуру static и... и код НЕ РАБОТАЕТ!!!!!!!! :o то есть когда от прерывания к прерыванию я сохраняю состояние структуры, т.е. значение битов, управляющих разрядами индикатора, это не только не делает нерабочий код рабочим, но и полностью рушит индикацию!

может кто-нибудь пояснить, что происходит?! :shock:

да, структура regs такая:

Код: Выделить всё

typedef union{
	uint8_t		bytes[2];			// 2 байта для выдачи в регистры
	uint16_t		word;
} regs_t;
идея индикации следующая: старшие 5 битов в regs.word задают номер светящегося разряда индикатора, а остальные - выводимый символ (для ГРИ это 1 бит в нужном разряде). потом эти 16 бит выдаются побайтно в регистры 74HC595 и управляют индикаторами.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

В качестве предположения.

То, что код работает, хотя и не должен - можно сослаться на "везение" в том смысле, что regs всегда попадает на один и тот же определённый адрес при определённом уровне оптимизации.

А вот то, что код не работает в случае static - да, более странно. Но не может ли быть так, что доступ к "статической" структуре получается с точки зрения ассемблера более длинным, что в итоге является той каплей, что прерывание не успевает выполниться за нужное время?

Я о том, что два while() внутри прерывания при передаче по SPI могут быть "впритирку" ко времени между вызовами сосбственно прерываний.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18813
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

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

Мой уютный бложик... заходите!
Контактная информация:
Мудрый кот
Сообщения: 1856
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="ARV",url="/forum/viewtopic.php?p=4047216#p4047216"]только то, что основной цикл станет выполняться очень медленно, а динамическая индикация продолжится, хоть и с некоторыми артефактами вроде разной яркости разрядов.
у меня же происходит вообще странное: во всех разрядах начинают "призрачно" дублироваться цифры соседних, т.е. в кажом разряде светится правильная цифра наиболее ярко, и слегка просвечивают цифры, которые на всех остальных. будто у меня команда, маскирующая "символьную" часть структуры, не выполняет свою задачу...[/uquote]
Что тут непонятного?
regs.word |= digs[scr->symbol[entry >= scr->bright]]; выполняется в каждом ISR.
Не знаю что такое digs, предположу что оно хранит младшие 11 бит. Тогда эти 11 бит будут верными при каждом вызове ISR.
Если эти 11 бит - карта сегментов, то она всегда будет правильной передаваться в SPI. А старшие 5 бит (позиция?) будут неправильными. И то - если других прерываний нет, то место занимаемое в стеке regs может оказаться неразрушенным (и сохраниться от момента последней правильной записи старших 5 бит). Тогда и позиция будет передаваться правильная. Но иногда (когда содержимое regs трётся в стеке другой процедурой), то позиция будет неправильная (при правильных сегментах). А значит и будет наблюдаться - в основном правильное отображение, но иногда символы будут попадать в неправильные случайные позиции. Это будет редко, поэтому светится они там будут слабо.

PS: Ожидание завершения передачи по SPI в while() внутри ISR - это конечно верх быдлокодинга... :o
Если конечно там (в МК) имеется FIFO глубиной >= 2 байта и while() ожидает не завершения передачи, а завершения записи в FIFO, то тогда - нормально.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18813
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

jcxz писал(а):Что тут непонятного?
а вы посмотрите внимательно:
regs.word &= 0xf800;
regs.word |= digs[scr->symbol[entry >= scr->bright]];

младшие 11 бит в каждом прерывании меняются, а старшие 5 - только каждое 62 прерывание. то есть так должно быть, если regs будет static.
вопрос не в том, почему без static работает (хоть это и странно, но вполне логичное объяснение вы сами и дали), вопрос в том, почему со static не работает?!
ведь благодаря static старшие биты сохраняются не из-за случая в стеке/памяти, а абсолютно однозначно! то есть должно быть лучше, а по факту - становится хуже.
как это объясните?
jcxz писал(а):Ожидание завершения передачи по SPI в while() внутри ISR - это конечно верх быдлокодинга
SPI работает на частоте вдвое меньше тактовой, т.е. передача 1 байта требует 16 тактов - пока исполнится код, организующий ожидание, пройдет половина этого интервала.
вам известны более красивые способы отправки двух байт с последующей дрыгоножной выдачей строба на классическом AVR? посоветуйте, я всегда готов учиться хорошему. а грубить я умею и сам.

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

Мой уютный бложик... заходите!
Контактная информация:
Открыл глаза
Сообщения: 42
Зарегистрирован: Вс сен 03, 2017 19:43:57

Сообщение technik-1017 »

У вас структура regs определяется каждый раз при запуске прерывания и имеет в качестве данных мусор (что вы и написали).
А первое присвоение происходит в условии if. А если условие ложное то структура не заполниться и строки

Код: Выделить всё

   regs.word &= 0xf800;
   regs.word |= digs[scr->symbol[entry >= scr->bright]];
будут работать с мусором
Использование static заставляет компилятор оптимизировать данный код (скорее всего он выкидывает часть)
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18813
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

technik-1017 писал(а):Использование static заставляет компилятор оптимизировать данный код (скорее всего он выкидывает часть)
использование static заставляет компилятор сделать загрузку 2 байт в структуру при входе в функцию и сохранение этих 2 байт при выходе, только и всего, никакой другой оптимизации он не делает. не должен делать, во всяком случае.

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

Мой уютный бложик... заходите!
Контактная информация:
Открыл глаза
Сообщения: 42
Зарегистрирован: Вс сен 03, 2017 19:43:57

Сообщение technik-1017 »

Ассемблерный код все таки наверно придётся смотреть, что бы понять что происходит.

На самом деле у меня было несколько вопросов:
1) переменная entry определена как static, но где тогда происходит первая инициализация. Впервые встречается в условии if и уже сама себя увеличивает (увеличивает мусор?)
2) переменная pos, аналогично пункту 1.
3) переменная regs вроде должна быть (задумано) как static ну и также не инициализирована.
4) переменная two_ms вроде как глобальная, тогда зачем было часть переменных делать глобальными, а часть как static.

Желание избавиться от глобальных переменных? Но по факту они остаются глобальными.
Может пойти классическим путём: в прерывании использовать глобальные переменные с volatile?

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

То что иногда работает, уже говорили: скорее всего используется память которая ранее была освобождена, и содержала корректные данные от предыдущих действий программы.
Контактная информация:
Мудрый кот
Сообщения: 1856
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="ARV",url="/forum/viewtopic.php?p=4047298#p4047298"]а вы посмотрите внимательно:
regs.word &= 0xf800;
regs.word |= digs[scr->symbol[entry >= scr->bright]];

младшие 11 бит в каждом прерывании меняются, а старшие 5 - только каждое 62 прерывание.[/uquote]Я это видел, об этом и писал.
А что значит "со static не работает"? В чём это выражается "не работает"?
Неработать может от того, что кроме этого у вас там есть ещё баги. И их комбинация даёт причудливый результат - когда-то что-то работает, когда-то - нет. Одни баги могут компенсировать/нивелировать действие других.
Например - когда делаете static, то в другом месте другой код, у вас эту область памяти портит. Потому и не работает. Как вариант.
И вообще - как можно о чём-то судить если половину кода не привели и листинга не привели? Только гадать....
Например - что такое static pos_t *scr = screen; и зачем ему (static-переменной scr) на каждом входе в функцию присваивается (переменная/константа/etc.(?)) screen? Какой тут смысл делать статик если по использованию тут нужна обычная автоматическая переменная?

Добавлено after 6 minutes 19 seconds:
[uquote="technik-1017",url="/forum/viewtopic.php?p=4047576#p4047576"]1) переменная entry определена как static, но где тогда происходит первая инициализация. Впервые встречается в условии if и уже сама себя увеличивает (увеличивает мусор?)[/uquote]Не имеющие явной инициализации глобальные/статические переменные, инициализируются 0. Это поведение по умолчанию для си/си++ (может быть измененено соответствующими ключевыми словами компилятора).
Но для самокомментируемости кода, полезно делать явную инициализацию 0-м, чтобы показать для каких переменных это критично. Но не обязательно.

[uquote="technik-1017",url="/forum/viewtopic.php?p=4047576#p4047576"]2) переменная pos, аналогично пункту 1.
3) переменная regs вроде должна быть (задумано) как static ну и также не инициализирована.[/uquote]Хотя бы для начала изучите си. :dont_know:

[uquote="technik-1017",url="/forum/viewtopic.php?p=4047576#p4047576"]Может пойти классическим путём: в прерывании использовать глобальные переменные с volatile?[/uquote]Зачем? (volatile)

Добавлено after 14 minutes 32 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=4047298#p4047298"]вам известны более красивые способы отправки двух байт с последующей дрыгоножной выдачей строба на классическом AVR? посоветуйте, я всегда готов учиться хорошему. а грубить я умею и сам.[/uquote]Сразу, навскидку, что бросается в глаза - ожидания делать не после записей, а перед. А строб перенести в начало ISR. Это сразу уменьшает ожидание внутри ISR на эти самые 16 тактов.

PS: Чисто теоретически я бы выбрал другой МК: с DMA (для SPI) или с FIFO (в SPI). И эти проблемы бы сами собой отпали. Например STM8Lxx.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18813
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

jcxz писал(а):А что значит "со static не работает"? В чём это выражается "не работает"?
как минимум в том, что в обычном случае добавление static к любой локальной переменной никаких побочных эффектов, кроме увеличения статически выделенной памяти, давать не должно, т.е. что со static, что без, поведение программы должно быть неизменным. в моём случае это не так.
jcxz писал(а):Например - когда делаете static, то в другом месте другой код, у вас эту область памяти портит. Потому и не работает. Как вариант.
невероятный вариант: локальная переменная потому и локальная, что более нигде не используется, хоть со static, хоть без. а всякие "опасные" действия (с указателями) у меня отсутствуют в коде.
jcxz писал(а):Например - что такое static pos_t *scr = screen; и зачем ему (static-переменной scr) на каждом входе в функцию присваивается (переменная/константа/etc.(?)) screen? Какой тут смысл делать статик если по использованию тут нужна обычная автоматическая переменная?
для локальной static-переенной это присваивание делается один раз, по идее вы не должны были спрашивать это, это ведь азы Си. для первого входа в обработчик надо, чтобы указатель указывал на начало массива, а в ходе обработки (см. код) этот указатель сдвигается.
jcxz писал(а):ожидания делать не после записей, а перед. А строб перенести в начало ISR. Это сразу уменьшает ожидание внутри ISR на эти самые 16 тактов.
ну, это, наверное, сделать можно, хотя фактически получится, что состояние индикаторов будет отставать от того, что делает обработчик :) но вряд ли это критично... 16 тактов, я имею ввиду.
jcxz писал(а):я бы выбрал другой МК
выбирайте, я не запрещаю.
technik-1017 писал(а):переменная regs вроде должна быть (задумано) как static ну и также не инициализирована
так о том и речь: когда эта переменная БЕЗ static, т.е. содержит мусор на входе в функцию, все работает, а когда я делаю её static, т.е. она на первом входе уже инициализирована нулями - работать перестаёт...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Сообщения: 437
Зарегистрирован: Пн май 27, 2019 07:18:28
Откуда: ВВХ-ск

Сообщение mont-oriol »

[uquote="ARV",url="/forum/viewtopic.php?p=4047638#p4047638"]когда эта переменная БЕЗ static, т.е. содержит мусор на входе в функцию, все работает, а когда я делаю её static, т.е. она на первом входе уже инициализирована нулями - работать перестаёт...[/uquote]
==
Когда переменная находится в одной области памяти, все работает, а когда переносится в другую область памяти - работать перестаёт?
Возможно, что-то портит ту область, где static переменные. Может стек туда наезжает. Для проверки можно сделать переменную глобальной, и объявить её выше / ниже по отношению к другим переменным, так, чтобы можно было менять её адрес расположения в памяти. Если окажется, что при таком перемещении переменной всё заработало - вывод очевиден.
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Кстати, вот это

Код: Выделить всё

   static pos_t *scr = screen;
действительно опаснее, чем выглядит. Хотя, если screen - тоже static и представляет собой массив pos_t, то всё вроде выглядит ОК - один раз оно получит своё значение, а дальше уже будет итерироваться/сбрасываться.

Хотя я бы, наверное, вообще убрал эту переменную, а просто обращался бы к screen[pos].symbol[n], так как scr и pos фактически друг друга дублируют

Если идти последовательно:

При старте программы все static переменные получают свои значения (не важно, локальные они или нет):
entry = 0;
pos = 0;
scr = screen;

Далее, при первом входе в прерывание:
regs = ???; // не определено значение

Условие "считаем входы" не выполняется, поэтому regs так и остаётся неопределённым. Поэтому далее в regs.word состояние 5 старших битов так и остаётся непонятным в течение как минимум IND_RPT раз. И только 1 раз из IND_RPT у нас значение старших 5 байтов regs определено. Остальные - просто "везёт" из-за попадания в ту же ячейку памяти на стеке.

А вот почему код, если regs сделать static, ломается - действительно странно. Потому как после IND_RPT вхождений в прерывание индикация должна бы наладиться

Добавлено after 1 minute 34 seconds:
Может, и правда ОЗУ уже не хватает и стек наезжает на область статических переменных...
Контактная информация:
Открыл глаза
Сообщения: 42
Зарегистрирован: Вс сен 03, 2017 19:43:57

Сообщение technik-1017 »

Скорее всего static в Си не может использоваться со структурами (так как мы этого хотим в данном примере) и конечно их не инициализирует (инициализировать структуру нужно принудительно).
static используется только для ограничения видимости. Попробуйте сделать структуру глобальной переменной.
Контактная информация:
Мудрый кот
Сообщения: 1856
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="ARV",url="/forum/viewtopic.php?p=4047638#p4047638"]
jcxz писал(а):А что значит "со static не работает"? В чём это выражается "не работает"?
как минимум в том[/uquote]Вы не поняли вопрос. Перечитайте ещё раз.
ARV писал(а):
jcxz писал(а):Например - когда делаете static, то в другом месте другой код, у вас эту область памяти портит. Потому и не работает. Как вариант.
невероятный вариант: локальная переменная потому и локальная, что более нигде не используется, хоть со static, хоть без.
И что что "не используется"? Она в памяти присутствует? Рядом с ней другие переменные (static или глобальные) присутствуют? А раз присутствуют, значит любая неправильная операция с памятью может её порушить.
ARV писал(а):а всякие "опасные" действия (с указателями) у меня отсутствуют в коде.
Ну да, а ещё вы пишете абсолютно безглючный код, который никогда не глючит. :))) Зачем тогда вопрос задали раз у вас ничего не глючит?
ARV писал(а):для локальной static-переенной это присваивание делается один раз, по идее вы не должны были спрашивать это, это ведь азы Си.
А вам по идее с этого места надо взять учебник по си и начать изучать азы. Ибо смотрим в листинг (IAR):

Код: Выделить всё

inline void CpuUseTimeTick()
{
  _Z14CpuUseTimeTickv: (+1)
  ...
 //static u16 t = cpuUseCalc;
 0x4821             LDR.N    R0,??CpuUseTimeTick_0+0x8
 0x78C0             LDRB     R0,[R0, #+3]
 0x8020             STRH     R0,[R4, #+0]
...
Как видим - нормально так static переменной t присваивается значение переменной cpuUseCalc на каждом входе в функцию CpuUseTimeTick().
Или думаете это IAR не знает азов си? 8) Или всё-таки вы их не знаете? :)))

PS: Складывается ощущение, что это не у вас эти баги, а у меня. К советам вы не прислушиваетесь, ещё и спорите.... Зачем тогда вообще вопрос задали?
Баги эти вроде не у меня. И мне абсолютно на них насрать. Не нужно вам найти решение - воля ваша. Зачем тогда было спрашивать? :dont_know:

Добавлено after 1 minute 2 seconds:
[uquote="mont-oriol",url="/forum/viewtopic.php?p=4047681#p4047681"]Возможно, что-то портит ту область, где static переменные.[/uquote]Я уже это советовал автору. Но не принимает никаких советов.... :dont_know:

Добавлено after 2 minutes 35 seconds:
[uquote="WiseLord",url="/forum/viewtopic.php?p=4047688#p4047688"]Кстати, вот это

Код: Выделить всё

   static pos_t *scr = screen;
действительно опаснее, чем выглядит. Хотя, если screen - тоже static и представляет собой массив pos_t[/uquote]Я ещё в самом начале советовал автору привести определения всех объектов и типов, фигурирующих в примере кода. Чтобы не играть в угадайку. Но он проигнорировал. Видимо ищет здесь гадалок....

Добавлено after 2 minutes 10 seconds:
[uquote="WiseLord",url="/forum/viewtopic.php?p=4047688#p4047688"]А вот почему код, если regs сделать static, ломается - действительно странно.[/uquote]Очень просто - наверняка там ещё табун других багов рядом пасётся. :))) которые иногда проявляются, иногда - нет. Как карты лягут....
Ответить

Вернуться в «Разные вопросы по МК»