Jump to content

Nilas

Members
  • Content Count

    221
  • Joined

  • Last visited

Community Reputation

11 Обычный

1 Follower

About Nilas

  • Rank
    Постоялец

Информация

  • Пол
    Мужчина
  • Город
    Курганская обл.

Электроника

  • Стаж в электронике
    10-20 лет
  • Сфера радиоэлектроники
    Хобби
  • Оборудование
    руки и голова + мультиметр да паяльник

Recent Profile Visitors

1661 profile views
  1. Понял почему были не те данные. В setFont(Terminal6x8); Terminal6x8 является указателем на массив (содержит его адрес), но если обращаться к отдельному его элементу, то надо указывать его адрес : cfont.height = (pgm_read_byte(&(font[1]))); Сейчас идут нужные данные из flash памяти. Буду дальше ковырять код Видимо сам догадывается, раз всё компилиться и работает
  2. fontdatatype определено дефайном как const uint8_t. PROGMEM указывает на flash память.
  3. Здравствуйте всем! В продолжение темы: третий день бьюсь с чтением из памяти даных. Уже и раскомментировал его, и вроде должен работать, но выдает не то, что надо. Уже всякого начитался в интернете, но в симуляции АВР Студии берутся не те данные, которые должны идти дальше в программе. Вот так сейчас: Компилируется без ошибок. Не могу понять, где не так делаю.
  4. Получается, что при вызове функции берем адрес переменной _swap(&x0, &x1) В самой функции адрес "перекочевывает" в указатель переменной void _swap(uint16_t *a, uint16_t *b) И в самой функции оперирует с переменными через адресацию. Сейчас все нормально скомпилировалось! и в коде, и в голове
  5. Переделал на void _setWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { _orientCoordinates(*x0,* y0); _orientCoordinates(*x1, *y1); if (x1 < x0) {_swap(*x0,* x1);} if (y1 < y0) {_swap(*y0, *y1);} Теперь ругается на каждый аргумент: .c:292:24: error: invalid type argument of unary '*' (have 'uint16_t') Совсем уже запутался. Понимаю что указатель это адрес переменной, но вот в использовании в функциях...
  6. Переделал на указатели: void _orientCoordinates(uint16_t *x1, uint16_t *y1) { switch (_orientation) { case 0: // ok break; case 1: // ok *y1 = _maxY - *y1 - 1; _swap(x1, y1); break; case 2: // ok *x1 = _maxX - *x1 - 1; *y1 = _maxY - *y1 - 1; break; case 3: // ok *x1 = _maxX - *x1 - 1; _swap(x1, y1); break; } } void _swap(uint16_t *a, uint16_t *b) { uint16_t w = *a; *a = *b; *b = w; } Объявил в хидер-файле функции как: void _swap(uint16_t *a, uint16_t *b); void _orientCoordinates(uint16_t *x1, uint16_t *y1); Но теперь компилятор выдает варнинги на тип переменных, хотя по моему разумению вроде как все одной масти (uint16_t): void _setWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { _orientCoordinates(x0, y0); _orientCoordinates(x1, y1); if (x1 < x0) {_swap(x0, x1);} if (y1 < y0) {_swap(y0, y1);} .с:292:5: warning: passing argument 1 of '_orientCoordinates' makes pointer from integer without a cast [enabled by default] .h:148:9: note: expected 'uint16_t *' but argument is of type 'uint16_t' и т.д. на каждый аргумент. Хотя на эту функцию не ругается: ........................................... case 1: // ok *y1 = _maxY - *y1 - 1; _swap(x1, y1); break; ............................................ Или в вызове функции надо сразу ставить указатель: _orientCoordinates(*x0, *y0); , но тогда, как я понимаю, в функцию будут посылаться указатели на переменную (и получится указатель указателя), и обрабатываться будут они, а не переменные?
  7. Здравствуйте всем! В программировании на С новичок. Переделываю программу из Ардуино в АВР Студию 4. Попался вот такой кусок кода: .............................................. void _orientCoordinates(uint16_t &x1, uint16_t &y1) { switch (_orientation) { case 0: // ok break; case 1: // ok y1 = _maxY - y1 - 1; _swap(x1, y1); break; case 2: // ok x1 = _maxX - x1 - 1; y1 = _maxY - y1 - 1; break; case 3: // ok x1 = _maxX - x1 - 1; _swap(x1, y1); break; } } .............................................. void _swap(uint16_t &a, uint16_t &b) { uint16_t w = a; a = b; b = w; } Посмотрев в инете, понял, что &a и &b - это "ссылки" на языке С++. Компилятор С ругается на такое. Как я понял, "ссылка" - это псевдоним переменной и все операции в итоге совершаются с ними. Можно ли тогда сделать код без "ссылок" и оставить одни переменные? Наведите на нужную мысль void _swap(uint16_t a, uint16_t b) // сделать так??? { uint16_t w = a; a = b; b = w; } void _orientCoordinates(uint16_t x1, uint16_t y1) { // и тут убрать???
×
×
  • Create New...