|
|
  |
Переменная потеряла значение |
|
|
|
Nov 23 2007, 12:52
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(alexander55 @ Nov 23 2007, 14:12)  А x используется дальше где-нибудь ? Я бы спросил точнее: значение переменной x, полученное в результате вызова calculate_ram_crc(), где-нибудь используется? Если нет, то компилятор имеет полное право его выкинуть. Цитата(Beginning @ Nov 23 2007, 15:40)  Чёта я не понял? А куда мая предыдущая месага делась???? Может быть, там были матюки? Если так, то отмодерили. Цитата(Beginning @ Nov 23 2007, 15:40)  Х - так называемая расходная переменная Совет по стилю: вместо одной расходной переменной лучше применять разные, чтобы имя переменной в каждой отдельной ситуации поясняло, зачем она используется. Работа компилятора - сделать код не хуже, чем при использовании одной переменной. Ему это вполне по силам. Цитата(Beginning @ Nov 23 2007, 15:40)  она дальше в main в сотни случаях пользуется. Ещё один совет по стилю: если функция раздулась до сотни строк, значит её надо разбивать на подфункции.
|
|
|
|
|
Nov 23 2007, 12:54
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Beginning @ Nov 23 2007, 15:40)  Х - так называемая расходная переменная, она дальше в main в сотни случаях пользуется. Если программа выглядит примерно так: Код int main(void) { unsigned int x; x = calculate_ram_crc();
initialisation(); VICIntEnable |= (1<<5);
// 1
for(x = 0; x < 8; x++) { ... } } то в точке 1 x может быть каким угодно.
|
|
|
|
|
Nov 23 2007, 13:14
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Цитата Я бы спросил точнее: значение переменной x, полученное в результате вызова calculate_ram_crc(), где-нибудь используется? Если нет, то компилятор имеет полное право его выкинуть. Разумеется. Функция calculate_ram_crc проверяет RAM и возвращает succes или false и соответственно далее в зависимости от результата, идёт разветвление программы, конкретно в моём примере следующим образом: while(x) { ... } Цитата Может быть, там были матюки? Если так, то отмодерили. Да нет???? Мне кто-то ответил, что сталкивался с таким, я спросил в чём грабдли были. После обеда, пришёл и в придкушении ответа зашёл на форум, а тут не моего ни его ответов нет! Цитата Совет по стилю: вместо одной расходной переменной лучше применять разные, чтобы имя переменной в каждой отдельной ситуации поясняло, зачем она используется. Смысловые переменные конечно имеют уникальные названия, но согласитесь есть очень много мест где переменная требуется максимум на пару строк, тот же самый пресловутый: Цитата for(x = 0; x < 8; x++) Т.к. число регистров у ARM7 весьма ограничено то и приходится использовать переменные повторно. Впринципе, я считаю это обсалютно нормальным. Цитата Ещё один совет по стилю: если функция раздулась до сотни строк, значит её надо разбивать на подфункции. Это я образно выразился. Если кусок кода начинает приобретать лёгкие черты инкапсуляции то он сразу превращается в функцию Ну а теперь вернусь к своим "баранам". Переменную анализирую выводом в терминал. Без оптимизации всё работает отлично. С аптимизацией нет. Пока не копаюсь в дезасемблировании поскольку, даже если найду ущербный код, то это не поможет от него избавится.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Nov 23 2007, 13:40
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Beginning @ Nov 23 2007, 15:14)  Да нет???? Мне кто-то ответил, что сталкивался с таким, я спросил в чём грабдли были. После обеда, пришёл и в придкушении ответа зашёл на форум, а тут не моего ни его ответов нет! Днем было какое-то странное поведение, возможно форум падал и восстановился с предыдущего бекапа. Цитата(Beginning @ Nov 23 2007, 15:14)  Смысловые переменные конечно имеют уникальные названия, но согласитесь есть очень много мест где переменная требуется максимум на пару строк, тот же самый пресловутый: Код { uint_fast8_t x; for(x = 0; x < 8; x++) { ...... } } Тут четко видно, что х - временная переменная и дальше не используется. Или использовать плюсы и тогда for(uint_fast8_t x = 0; x < 8; x++) {} Цитата(Beginning @ Nov 23 2007, 15:14)  Т.к. число регистров у ARM7 весьма ограничено то и приходится использовать переменные повторно. Впринципе, я считаю это обсалютно нормальным. Связь между регистрами и переменными - забота компилятора. И скорее всего связи такой нет. Переменная может "путешествовать" по регистрам по мере необходимости. Повторное использование переменной скорее мешает компилятору, чем помогает. А по вашей проблеме - стека хватает? Ваша переменная x на время вызова промежуточных функций хранится на стеке, если вы пройдетесь отладчиком по дизассемблеру - можете увидеть кто ее портит и понять почему.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 23 2007, 14:12
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Цитата Переменная может "путешествовать" по регистрам по мере необходимости. Ну если переменная локальная, то имхо, переадресация её из одного регистра в другой является более "стрессовой" ситуацией для компилятора. Цитата Связь между регистрами и переменными - забота компилятора. И скорее всего связи такой нет Ну здесь Вы лукавите (имхо). Связь между ЛОКАЛЬНЫМИ переменными и регистрами непосредственная. И если помогать в этом компилятору, то и код будет "лучше".
Сообщение отредактировал Beginning - Nov 23 2007, 14:13
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Nov 23 2007, 14:37
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Beginning @ Nov 23 2007, 16:12)  Ну если переменная локальная, то имхо, переадресация её из одного регистра в другой является более "стрессовой" ситуацией для компилятора. С чего бы "стрессовой", если он сам ее и перекладывает? На высоких уровнях оптимизации такое встечается. Цитата(Beginning @ Nov 23 2007, 16:12)  Ну здесь Вы лукавите (имхо). Связь между ЛОКАЛЬНЫМИ переменными и регистрами непосредственная. И если помогать в этом компилятору, то и код будет "лучше". Какая может быть связь, если переменная может быть в регистре, а если вдруг этот регистр понадобился - переменная перекочует на стек? Вы "поможете" компилятору, потом добавите еще одну локальную переменную с бОльшим временем жизни и вся ваша "помощь" пойдет коту под хвост, ибо переменные распределятся по регистрам и стеку иначе. Я предпочитаю не мешать компилятору делать его работу. Помогаю, заводя локальные блоки как показывал выше. И ему проще, и мне понятнее.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 27 2007, 08:39
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Nov 26 2007, 17:34)  Cупер компилятор выдал следующий перл....  Цитата При поиске IAR4.42 не нашёл полную установочную версию, зато нашёл самораспаковывающуюся. Это как-же нужно было "искать" что-бы на родном сайте IAR просто не взять  . Moderator: Придерживайтесь заявленной темы.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 28 2007, 07:22
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Цитата Это как-же нужно было "искать" что-бы на родном сайте IAR просто не взять Мне надо было с ключиком. Проект кже давно за 30 кил разрешённых в триальной версии. Цитата Извините, я в глубоко сомневаюсь. Тут какая-то лажа. А вы попробуйте сжать свой установленный IAR хотябы RAR, и с удивлением обнаружите что он сжался раз в 5! Не 10 метров конечно но ~24 у меня сжался.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|