Jump to content

    

Darth Vader

Участник
  • Content Count

    133
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Darth Vader

  • Rank
    Частый гость

Recent Profile Visitors

348 profile views
  1. У нас на работе база именно так и сделана. Да, она большая, но пользоваться ей удобнее. Вероятность ошибиться меньше.
  2. Altium Designer 19 (365)

    Дорожки (печатные проводники) на плате - это объекты, принадлежащие только плате. В схеме их нет. Поэтому и синхронизация их не затрагивает. Есть Nets - связи между выводами компонентов, отображаемые на PCB тонкими нитками - вот на них синхронизация действует. Хотите выделить и удалить все дорожки - выделяйте одну, далее FSO иудаляете все, что нашлось этим запросом.
  3. Измените проверку, искусственно "замусорив" три байта после вашего тестового: А вот теперь сравните test1 и test2. Первый равен 0x00000001. А вот второй стал 0х04030201.
  4. OSH Park прямо говорит об этой проблеме на своём сайте: Disabling “ Mechanical Layers to Add to All Gerber Plots” (4-я позиция).
  5. Главное, что теперь вы понимаете, что и это совсем не одно и тоже. И что именно делает каждое из них.
  6. А вам точно нужны сто РАЗНЫХ констант? Если все ваши сто указателей должны указывать на одно и то же значение (целое число 100), то выделите память и инициализируйте ОДНУ константу. А всем вашим ста указателям присвойте её адрес.
  7. Проговорите действия этой строки словами, чтобы стал понятен смысл: приводим целое число 100 к типу указателя на целое. Получаем адрес 100. Присваиваем этот адрес указателю expression.r_var. Теперь точно известен адрес в памяти, на который указывает указатель - это адрес 100. Однако, то, что находится по этому адресу неизвестно, т.к. объект по этому адресу не был выделен и инициализирован. Это мусор. В итоге ваш указатель указывает на мусор. Теперь сравните это с тем, чего вы хотели в своём первом посте, в самом конце. Это совсем не то. Вы хотели обратного: на точное значение адреса вам было плевать, главное, чтобы он указывал на целое число со значением 100. В такой постановке задачи без выделения памяти и инициализации её значением (100) обойтись нельзя впринципе. Ваш указатель после инициализации должен указывать на объект в памяти. Объект в данном случае - это целое число 100. Чтобы это сделать, память под объект надо выделить и инициализировать значением 100. После этого взять адрес этого объекта и присвоить его вашему указателю. Только после этого можно гарантировать истинность логического выражения: (*((int*)(expression.r_var)) == 100)
  8. В этой строке: звезда точно ПЕРЕД именем типа должна быть, а не ПОСЛЕ? Что вы сделали? Привели целое 100 к типу указателя на void, получив тем самым адрес 100, и присвоили этот адрес вашей переменной - указателю. В операции сравнения вы сделали обратное: привели значение указателя (адреса 100) к целому числу 100. Конечно, всё сравнилось. Вам же надо было сначала привести указатель на void к указателю на int, после чего разыменовать его. И уже это сравнивать со 100. Вот правильное логическое выражение для оператора if: (*((int*)(expression.l_var)) == 100) Проверьте, истинно ли оно. Проверьте, чему равно значение левой его части. Откройте окно просмотра содержимого памяти. Посмотрите, что лежит по адресу 100 (0х64). Точнее в четырёх байтах по адресам 0х64-0х67. На что похоже?
  9. Значение 0х64 в столбце Value - это значение указателя, которое есть адрес. Да, он действительно равен 100. Адрес равен 100. Вы же хотели получить иное: чтобы значение, на которое указывает указатель, было бы целое число 100. Проверьте правильность вашего варианта вашим же примером из первого поста темы: if (*(expression.l_var) == 100) { } else { }; По какой ветке пойдёт программа? На что указывает указатель?
  10. Нет. В первом случае вы присваиваете указателю адрес объекта Value со значением 100. Адрес его размещения выбран компоновщиком автоматически. Но значение задано вами явно - число 100. Во втором - приводите к типу указателя целое число 100. В результате в вашем указателе будет лежать адрес 100. Т.е. 100 - это адрес, а не значение. Что лежит по адресу 100 вам неизвестно. Т.е. ваш указатель указывает на мусор. А должен указывать на число 100. Почувствуйте разницу.
  11. #define MY_CONST_VAL 100 static const int Value = MY_CONST_VAL; expression.l_var = &Value; Компоновщик разместит объект Value со значением 100 в области флеш-памяти. Вы присвоите вашему указателю его адрес. В итоге ваш указатель будет указывать на нужное вам число 100, адрес которого вам впринципе не важен, его за вас выбрал компоновщик. То, что вам было надо. Вам про это ещё на первой странице написали. И ещё. Различайте понятия: - указатель на константу; - константный указатель; - константный указатель на константу. То, что у вас в структуре указатель стал указывать на константу не значит, что он является указателем на константу. Т.к. он может указывать не только на константу.
  12. Автор хочет не этого. Прочитайте в заглавном посте самый конец. Ему не важно значение адреса, которым инициализируется указатель (у вас это 100). Важно, чтобы по этому адресу лежало конкретное нужное ему значение.
  13. Повторил процедуру стирания/прошивки/назначения серийника/добавления лицензий. Задал серийник 12345678. С ним ошибка повторилась. Поковырялся с настройками проекта, вроде бы и не менял ничего, но всё чудесным образом заработало. Ошибка ушла и больше не возникала. Что было не так непонятно.
  14. Посмотрите, как реализован выбор конкретного процессора в SPL. Сначала надо определить один из нескольких макросов, соответствующих типу используемого процессора (раскомментировать нужную строку с дефайном). А уже потом в зависимости от того, какой макрос определён, препроцессором в директивах условной компиляции инклудится файл с описанием регистров нужного процессора. Так же задаётся тип отладочной платы, если она есть.
  15. В файл Config.h необходимо добавить строку #include Buf.h Тогда тип TstackLow в файле Config.h будет объявлен до того, как будет использован для построения типа ConfigFile_t. Ну и файл app.h по-хорошему должен содержать лишь макроопределения, типа размеров буферов и флагов условной компиляции и не включать в себя никаких заголовков. Это должно решить вашу проблему.