Перейти к содержанию
    

igorle

Свой
  • Постов

    337
  • Зарегистрирован

  • Посещение

Весь контент igorle


  1. Вы код кернела линукса видели? Там goto почти в каждом файле. Обычно используется как error handling Для переменной цикла нет ничего лучше стандартной i, j или k. Посмотрите в том-же кернеле. У меня нет под линукса под рукой, но если вы можете, посмотрите результат вывода строк grep -rw for . | grep -w i | wc -l grep -rw for . | grep -w counter | wc -l и расскажите нам, каких циклов вы нашли больше - с переменной цикла i, или counter. Вы демострируете нежелание понять, почему Си работает так как он работает. Вы не слышите, что вам говорят ТРИ человека, но при этом именно остальных обвиняете в упертости и косности. Я думаю, что язык Си просто не подходит для тех задач, которые вы решаете по ходу своей работы. И это корень ваших проблем. Вы будете смеяться, но прекрасное "как он дышит так и пишет, не стараясь угодить" - к программистам тоже относится. Лучше пишите, как считаете правильным.
  2. Я пока не получил мои борды, так что своего опыта не имею. Но из теории я понял, что RTC может стартовать даже вообще без кварца. На внутренней RC цепочке. Просто нестабильным будет. Не может быть, что иногда кварц не заводится, но пользователь этого не замечает?
  3. Чтобы почуствовать разницу, забегите вот этот код: static void foo(char *str) { printf("%p\n", str); } int main(void) { foo(NULL); foo("\0"); return 0; } После этого попытайтесь объяснить, почему ваше утверждение неверно. По поводу всего остального. Я подписал обязательство, согласно которому, если станет известно что я консультирую участников конкурса Холы, то я должен буду вернуть полученую от них приемию. А я премию уже потратил на детальки. Так что дальше - самостоятельно. Адью :)
  4. Ну, некоторые пишут, чтобы получать лулзы, глядя как люди рвут на себе волосы "Код работает" - это совсем не аргумент. Надо не код, который один раз сработает с данным примером, а код, который будет работать в библиотеке. Он будет вызываться миллионы раз как с короткими, так и мегабайтными строками. void str_cpy (char **a, char *b) { *a = b; } Кто сказал что сорс будет существовать после вызова функции? Может быть я работаю с буфером, потом копирую строку и снова пишу в буфер. Или освобождаю буфер. Что будет с сохраненным значением? void str_cat (char **a, char *b){ int _size1 = strlen(b); int _size2 = strlen(*a); Функция может быть вызвана для неинициализированного дестинейшена. strlen для NULL - крэш char * tmp = NULL; tmp = realloc(tmp, _size1 + _size2 + 2); Зачем вызывать реаллок для NULL? Зачем двойка добавлена? memmove(tmp , *a, _size2); memmove(tmp + _size2, b, _size1); *a = tmp; } Старое значение *a перетерто. Память, на которую указывала *a - потеряна. Результирующая строка не ограничена нулем.
  5. Проблема общения в виртуале - никогда не уверен - человек шутит, или серьезно. Ваш вариант выглядит как троллинг. Вы действительно хотите комментариев к этому коду?
  6. Спасибо. Теперь сравните с c = !!a ^ !!b; Допустим, мы разбираем чужой код. Понятно что ксор - не самоцель, а промежуточный результат. Может быть даже - аргумент функции. Какой вариант выберете теперь? Кстати, это меня сын недавно научил, когда я вслух посетовал на то, что нету логического ксора. Сыну восемнадцать, но он уже профессионал. И такие конструкции для него - кирпичики. Он над ними не думает. Повторюсь - это сродни английскому. Если ты его знаешь - ты думаешь "что написать". А если "со словарем" - то все силы уходят на "как правильно выразить мою, такую умную мысль"
  7. Код в студию. Мы же программисты, и Си - наш язык. Компактный код - легче понять. Но этому надо научиться. Не зазорно не знать. Зазорно не желать знать. Цель не усложнить жизнь, и уж тем более не унизить Вас. Цель - заинтересовать Вас и тех, кто следит за этой веткой, узнать Си чуть поглубже. Прочуствовать его. Это как на машине. Сначала по прямой ехать трудно, а потом ты начинаешь чуствовать ее, и иногда можешь даже использовать занос с пользой. И начинаешь ездить свободно, и все внимание - только на дорожную ситуацию. Если после нашей дискуссии вы перестаните писать слово профессионал в кавычках - значит мы не зря потратили время :)
  8. Все эти знания важны, чтобы во время программирования думать не о языке, а об алгоритме. Для этого надо говорить на языке свободно, а не со словарем. Тогда не будешь зависать над вопросами - чему равно (-3)%10 Чтобы лучше понять друг друга, попрошу Вас написать несколько строк кода. Есть три переменны типа int - a,b,c; В языке Си есть логические И и Или (&& ||), но нет логического XOR. Вам потребовалось сделать так, чтобы "с" была ксором от a и b. Как вы это напишите в Вашем проекте?
  9. Все мы консервативны и держимся за свои привычки. Интересно наблюдать за человеком, который первый раз видит двойной восклицательный знак: int a, b; a = 27; b = !!a; Многие сначала офигевают, и спорят, что это невозможно понять. А через время смотришь - сами так писать начинают. Привыкли. Кстати, я проверял скомпилированный код для трех случаев: b = !!a; b = a ? 1 : 0; if (a) b = 1; else b = 0; Во всех трех случаях gcc дает одинаковый результат.
  10. Да, это я сглупил. Дважды. Объявил восемь символов, а использовал только 4 (маска 0x3). Я хотел написать вот так: printf("\x1b[1D%c", "|/-\\|/-\\"[++idx & 0x7]); Но следовало так, как Вы говорите: printf("\x1b[1D%c", "|/-\\"[++idx & 0x3]); Массив не задан a[5]. Массив задан, например, a[10]. Здесь демонстрировалось, что a[5] и 5[a] дает одинаковый результат. Вопрос "зачем" здесь не логичен. Правильнее спрашивать - "почему". Понятно, что Кениган и Ритчи не говорили "а давай мы здесь впиндюрим такую фичу". Нет, но они говорили - смотри как изящно можно реализовать оператор квадратные скобки". И то, что теперь на Си конечный (машинный) код получается гораздо лучше, чем большинство могут написать на Ассемблере - заслуга изящества Си
  11. 2 ARV - Пробелы можно добавить вокруг & - [++idx & 0x3] Обычно взгляд автоматически парсит такие строки, но в общем - принимаю. Здесь пробелы не повредят. Сейчас поправлю. - Не надо жрать исходники. a[5] и 5[a] - не самоцель. Это демонстрация того как работает оператор [ ]. Если Вам это не интересно - то это нормальная позиция для ремесленника, но странная для творческого человека. Хотя знаете, мне сын доказывал, что привычка понимать суть - вредная привычка, так как мешает двигаться вперед быстро. Может быть Вы и правы. Работает - ну и хрен с ним. - Эта ветка не про то, как решить конкретную проблему, а про то, как работает Си. Поэтому демострации могут и должны быть утрированы. Типа - вложенных блоков с автоматической переменной с тем же именем. Так как наглядно демонстрирует область определения переменной. - Насчет "попытки возвыситься" - извините что доставил Вам неудобство.
  12. Да, например, можно вызывать эту функцию внутри медленного цикла. Пользователь будет видеть, что процесс идет: static void fan(void) { static char idx; printf("\x1b[1D%c", "|/-\\|/-\\"[++idx & 0x3]); } Должно работать на стандартной консоли (не проверял, может быть ошибка в коде сдвига курсора на одну позицю влево) И это уже не демо, а реальный код.
  13. Господа toweroff и ARV Вы путаете понимание языка и применение. Например, вы должны понимать как работает arr[5] должны так писать Вы должны понимать, как работает *(arr +5), но писать так должны только в некоторых, специальных случаях Вы никогда не должны писать такой код: int main(void) { int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int i; for (i = 0; i <10; i++) printf("%d ", i[arr]); printf("\n%d\n", 5[arr]); return 0; } Но неплохо бы понимать, как и почему это работает. Ну а если вы не поволяете людям объяснять как и почему работает 5[arr], мотивируя тем, что так писать нельзя, то я с вами не согласен.
  14. Ничего удивительного. Когда я говорю "никто не смог", я имею ввиду - из России/Украины никто не смог решить. В целом - они в эту игру играют уже год. Список победителей за это время есть на их сайте.
  15. Чтобы пример стал более наглядным, я предлагаю переписать его так: #include <stdio.h> int main(void) { int i=1; { int i=2; { int i=3; printf("%d\n", i); } printf("%d\n", i); } printf("%d\n", i); return 0; } 2 ARV - ну это же дается не как рабочий код, а как демонстрация того, как работает язык Си.
  16. Я обещал не комментировать и никак иначе не помогать участникам. Так что, извините. Скажу только, что направление правильное, но пока что это не годится. Сплетнями поделться могу. Я спросил организаторов, как идут дела. Они сказали, что отказались от идеи предлагать удаленную работу программистам из России/Украины. Но от своих обязательств по олимпиаде не отказываются. И если кто сможет решить задачу, то премию получит. Пока никто не смог.
  17. Это очень странный, и в моем понимании - неправильный код. На всякий случай проверил - как и ожидалось, компилятор обругал меня за повторную декларацию. В классическом Си все автоматические переменные должны декларироваться в начале блока. Некоторые диалекты Си и классический С++ позволяют объявлять переменные в любом месте. Но я считаю, что это плохая привычка.
  18. Вот ключ к Вашему успеху: b = Ln(Rt1/ Rt0) / (1/T1 – 1/T0) b - Для Вашего термистора B57964S0202 равен 3560 T0 - температура 273+25 Rt0 - сопротивление при температуре T0 - 2000 Ом в Вашем случае T1 - текущая температура в Кельвинах Rt1 - сопротивление при текущей температуре Пользуясь этой формулой, вы можете выразить T1 через Rt1 или наоборот. Одна десятая градуса - это вы погорячились. У меня выход делителя Резистор - Термистор идет на ADC. Вместо того, чтобы считать экспоненту в коде, я просто храню таблицу значений, при температуре от нуля до 110 градусов (мой диапазон) с шагом один градус. И по этой таблице нахожу ближайшую температуру. Поэксперементируйте, убедитесь что вычисления совпадают с таблицей и с Вашими реальными измерениями.
  19. Спасибо огромное. Эта та самая страничка, о существовании которой я подозревал, но не мог найти. Мой путь несравнимо хуже. Я убил на него массу времени. А здесь все под рукой.
  20. Это то что я ищу. Мне не надо готовую ссылку. Меня поражает, что я не могу найти ее сам :( Я этим уже несколько дней занимаюсь :( Я не нашел кнопки "Design Resources". Есть слева замечательная панел "Resources", откуда я пытаюсь начать плясать. Можно вот отсюда показать, как дойти до библиотеки? Спасибо за терпение. Мне кажется, что я зашел в каждый список под каждой закладкой под Resources и искал слово periph. Не нашел библиотек :( СТОП! Нашел!!!! Стыдно, но оставлю здесь этот пост. Вдруг еще кому пригодится: Идем Sowtware -> STM32 Firmware (49) -> STM32F10x standard peripheral library Может это на сайте глюк? Помню что вчера под "STM32 Firmware" меньше айтемов было.... Или я вчера был слеп....
  21. Понятно. Я как раз понял, что поскольку там 4 гига адрессного пространства, то они хорошо подумали и раскидали регистры так, чтобы потом не пришлось их двигать. И поэтому я понял что совместим именно код, причем скомпилированный... Видимо, мой недостаточный американский сказался. У меня в планах джентельменский набор начинающего эмбедера: - GPIO - ADC - PWM - USB as file system - USB as COM Все это я планирую использовать на 103-м. Судя по вашим ответам - лучше дождаться моих бордов и уже на них упражняться? Еще вопрос. Стыдно, но я не нашел на сайте st.com, где скачать последнюю версию StdPeriph_Lib. Вроде бы должна быть версия 3.5.
  22. Я взялся за изучение STM32. Почитав теорию, развел небольшую пробную плату под stm32f103, отослал в производство и заказал детали. Плата прибудет через две-три недели. Пока упражняюсь с кодом. И вот тут засада. Я читал, что вся линейка кортексов совместима. То есть все, что написано для меньшего варианта, заработает и на большей версии. У меня есть stm32f3discovery. Если я пишу код для f303 - все работает. Если пишу для 103 и прожигаю в discovery - не бежит :( Вопрос - так должно быть, или я туплю? Достаточно ли инициализации, которую я делаю для 103-го, для того, чтобы использовать в 303-м функциональность 103-го.
  23. У Вас все правильно. С остальными ораторами я не согласен. realloc - не нужен, так как Вам не нужны старые данные, и поведение реаллока отличается при недостатке памяти. А передача параметров по ссылке к Си отношения не имеет.
  24. Я хочу отделить "чистую" землю от всей остальной земли. При этом я не хочу добавлять элемент "резистор 0 Ом". Результат представляю себе вот так: Точка G будет находиться в непосредственной близости от источника питания.
  25. Совет принят. Поменял на всем дизайне - результат понравился. А что для пинхедеров используете (как пины, так и розетки)? Я беру или pinhead, или con-lstX, Но там пады или длинные, или восьмиугольные.
×
×
  • Создать...