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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3317828#p3317828"]вы упорно не хотите написать, как именно вам ругается компилятор. Считаете это неважным? Рискну предположить, что в его ругани все описано достаточно исчерпывающе.[/uquote]

все верно, компилятор ругается на неизвестный тип...в том то и парадокс вроде как определил(но не правильно, как ща понимаю) ,передал, а он все равно ругается...

Добавлено after 4 minutes 50 seconds:
[uquote="Аlex",url="/forum/viewtopic.php?p=3317827#p3317827"]Попробуйте объявить тип структуры через typedef, чтобы без всяких

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

struct struct_1 *
было.[/uquote] я так понял тип нужно объявить внешне, чтобы видеть ее в модулях, а struct struct_1 или typedef не фатально думаю....или я ошибаюсь?

Добавлено after 5 minutes 31 second:
[uquote="ARV",url="/forum/viewtopic.php?p=3317656#p3317656"]надо так:

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

// заголовочный файл main.h
#if !defined(__MAIN_H__)
#define __MAIN_H__
#include <stdint.h>
typedef struct{
   uint8_t a;
   uint8_t b;
   uint8_t c;
} my_struct;
#endif

.[/uquote]
какая роль условной компиляции в данном коде?
Аватара пользователя
AndyBig
Грызет канифоль
Сообщения: 250
Зарегистрирован: Ср янв 17, 2018 13:09:14

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

Сообщение AndyBig »

ROMan2947 писал(а):вроде как определил(но не правильно, как ща понимаю) ,передал, а он все равно ругается...

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

ROMan2947 писал(а):я так понял тип нужно объявить внешне, чтобы видеть ее в модулях, а struct struct_1 или typedef не фатально думаю....или я ошибаюсь?

Если этот заголовочник будет вставлен в несколько модулей, то фатально. Без typedef будет ругаться на то, что переменная уже определена, с typedef не будет.
ROMan2947 писал(а):какая роль условной компиляции в данном коде?

Гарантировать что код будет скомпилирован только один раз, даже если он будет вставлен в несколько модулей.
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3317868#p3317868"]в том то и парадокс вроде как определил[/uquote]
Нет никаких парадоксов - есть три программы - препроцессор, компилятор и линкер. Препроцессор применяется к каждому С-файлу в проекте - вставляет #include, подставляет #define и исполняет остальные #-директивы. Результат его работы передаётся компилятору для превращения в объектный файл с кодом функций и местом под глобальные переменные. Объектные файлы полученные из всех С-модулей проекта [и библиотеки] передаются линкеру для установления связей данных, вызовов функций и создания окончательной программы. Если компилятор ругается на неизвестный тип - значит до данной конкретной строчки определение этого типа ему не встретилось - он работает только с тем текстом, который создан для него препроцессором - ни о других С-файлах ни о H-файлах знаний у него нет. Этот текст можно найти в папке с промежуточными файлами компиляции, иногда его требуется включить в настройках проекта, иногда это выглядит как переключатель "preprocess only" - не пожалейте времени на ознакомление с результатом работы препроцессора и поймёте, что никакой магии там нет - а идёт тупая работа с текстом. :-)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
ROMan2947
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

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

Сообщение ROMan2947 »

[uquote="ARV",url="/forum/viewtopic.php?p=3317656#p3317656"]надо так:[/uquote]
пока буковку в буковку не написал компиляция не шла...в итоге победа! еще понять бы как это работает, было бы вообще самолет) Учить и учить еще этот Си.

ВСЕМ огромное СПАСИБО!!!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

ROMan2947 писал(а):Учить и учить еще этот Си.
если в какой-нибудь книжке про Си прочитаете что-то типа "в Си можно делать так...." - дальше не читайте. начинающему надо читать те книжки, в которых написано "в Си нужно делать так..."
после того, как освоите, как НУЖНО, тогда можете читать и делать, как МОЖНО.

в частности, инклюдить Сишные файлы МОЖНО, включать в заголовочные *.h-файлы тело функции МОЖНО, и еще много чего МОЖНО, но именно на этом вы и погорели...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
PaleyAlex
Родился
Сообщения: 4
Зарегистрирован: Ср фев 28, 2018 10:33:09

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

Сообщение PaleyAlex »

Товарищи добрый день. имеется МК ATmega 128 написал для него простенькую прогу для теста. Сразу же и приведу:
0x15 - адрес PORTC, 0x1B - адрес PORTA по отладчику все в порядке, а когда смотрю осциллографом то выполняется только функция Drrb()! В чём проблема?
/*
* DC_Voltmetr_Prog.cpp
*
* Created: 28.02.2018 11:19:19
* Author : LAN_Admin
*/
#include <avr/io.h>
void Prb()
{
asm("sbi 0x1B,2");
asm("nop");
asm("cbi 0x1B,2");
asm("nop");
};
void Drrb()
{
asm("sbi 0x15,0");
asm("nop");
asm("cbi 0x15,0");
asm("nop");
}
int main(void)
{
DDRA=0xFF;
DDRC=0xFF;
/* Replace with your application code */
while (1)
{
Drrb();
Prb();
};
}
city77
Открыл глаза
Сообщения: 53
Зарегистрирован: Чт дек 28, 2017 23:07:31

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

Сообщение city77 »

У "большИх" ATmeg есть JTAG - не забывайте его отключать
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

Сообщение Пока_без_кота »

Доброго времени суток. Когда-то на асме был написан кусок кода, собирающий из 4 байт (принятых последовательно по SPI, то есть представляющие собой по сути один 32 битный регистр) состояние нужных кнопок в 1 байт. Потому что в этих 4 байтах не все биты - это значения кнопок, есть много незначащих бит. Всего содержится инфа о 8 кнопках (по 2 кнопки в каждом байте). И вот я с помощью следующего кода собирал их в 1 байт:
Осторожно, 8051 асм :)))
Спойлер

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

   mov     A,      KeyByte+1   ; А теперь склеим все 4 байта в 1 и получим байт с состоянием всех 8 кнопок
   rl      A
   orl     KeyByte,A
   mov     A,      KeyByte+2
   rl      A
   rl      A
   orl     KeyByte,A
   mov     A,      KeyByte+3
   rl      A
   rl      A
   rl      A
   orl     KeyByte,A      ; Склейка всех байтов в 1 закончена, теперь у нас в KeyByte состояние всех 8 кнопок

Как это правильнее всего всего сделать на Си:
1. Переписать 1 к 1.
2. Переписать через массив.
3. Переписать через структуру.
4. Загнать все в одну 32 битную переменную еще на этапе приема по SPI, и уже ее ужимать до 8 бит.
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

а словами написать, какие биты используются, для не желающих восстанавливать их по асму?
"правильнее" зависит от того, как вы потом обрабатываете кнопки.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

Сообщение Пока_без_кота »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3320283#p3320283"]а словами написать, какие биты используются...[/uquote]
0 и 4 бит каждого принятого байта.
В итоге в этом байте установленный бит - это нажатая кнопка. Все биты установлены - все кнопки нажаты. Какая разница, как потом его обрабатывать ?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Сдвигами и масками. Элементарно.
Если Вы сумели такое написать на АСМе, то на Си напишите запросто.

Добавлено after 42 seconds:
Можно написать линейный код - проверки битов+установки битов. Выполняться будет быстрей.
viiv
Грызет канифоль
Сообщения: 287
Зарегистрирован: Чт ноя 06, 2014 13:09:06

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

Сообщение viiv »

[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3320295#p3320295"]0 и 4 бит каждого принятого байта.
В итоге в этом байте установленный бит - это нажатая кнопка. Все биты установлены - все кнопки нажаты. Какая разница, как потом его обрабатывать ?[/uquote]

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

u8_t button_byte (u8_t *p) 
{
    return ((p[0] & 0x11) << 0) | ((p[1] & 0x11) << 1) | ((p[2] & 0x11) << 2) | ((p[3] & 0x11) << 3);
}
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3320295#p3320295"]0 и 4 бит каждого принятого байта. В итоге в этом байте установленный бит - это нажатая кнопка. Все биты установлены - все кнопки нажаты. Какая разница, как потом его обрабатывать ?[/uquote]
РЕШАЮЩАЯ разница.
Архетипичнейший сюжет кстати - когда общественность начинает "умничать" уточнениями "а вообще вы что сделать пытаетесь?" на конкретный вроде-бы вопрос. И соискателю кажется что над ним издеваются и рейтинг зарабатывают. Но дело в том, что первична задача, а не конкретные шаги по её исполнению. У ассемблерщика свои подходцы, у С-шника свои, у плюсиста - свои. Там где первый морочится упаковкой в байт - второй с третьим наложат на принятые данные структуру с битовыми полями и будут пользоваться этими полями напрямую - оставив всё побитное кунг-фу со сдвигами и масками на долю компилятора.

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

struct state {
  unsigned char btn0 : 1;
  unsigned char rsv0 : 3;
  unsigned char btn1 : 1;
  unsigned char rsv1 : 3;

  unsigned char btn2 : 1;
  unsigned char rsv2 : 3;
  unsigned char btn3 : 1;
  unsigned char rsv3 : 3;

  unsigned char btn4 : 1;
  unsigned char rsv4 : 3;
  unsigned char btn5 : 1;
  unsigned char rsv5 : 3;
};

unsigned char buf[4] = { 0 };

// приняли что положено и забыли подробности как страшный сон - жизнь и так коротка

struct state* pstate = (struct state*)buf;

if (p->btn2)
  // цветомузыка
if (p->btn0)
  // танцы
if (p->btn5)
  // асисяй

Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

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

Сообщение Пока_без_кота »

Всем спасибо. Я планировал делать примерно как viiv написал. Но способ Siarzhuk интересен с точки зрения познания.
Shrike1987
Родился
Сообщения: 7
Зарегистрирован: Пт мар 02, 2018 16:31:19

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

Сообщение Shrike1987 »

Всем мяу! Помогите новичку разобраться с синтаксисом си для stm32. Среда разработки Keil, отладочная плата stm32f4discovery. Хочу сделать библиотеку для отображения на дисплее векторных шрифтов, в дальнейшем добавить сглаживание. Столкнулся с проблемой, что как таковых текстовых типов данных нет... А ведь хотел координаты полилиний записывать в текстовом виде:

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

struct TFont {
  char *Lines;
} Font[255] ;

...
   Font[48].Lines="010516364541301001|0541";  //0
   Font[81].Lines="010516364541301001|2547";  //Q
...


но вот беда... не могу посимвольно читать строку...
Что-то тут не так:

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

for(i=0;i<strlen(Font[C].Lines);i++)
  {
      if  (Font[C].Lines[i]!="|") { }
  }

Может кто подскажет, как это делать или как вообще лучше хранить такие цепочки? Думал по 4 байта разбить отрезки типа:

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

(X1 shl 12) or (Y1 shl 8) or (X2 shl 4) or Y2
, но тут тоже вопрос как их хранить?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Shrike1987 писал(а):А ведь хотел координаты полилиний записывать в текстовом виде
я, конечно, понимаю: ARM, 32 бита, много памяти и мегагерц, но храниить шрифт в текстовом виде?! до этого даже в Майкрософте не додумались!

шрифт, как очень активно используемый ресурс, должен быть предельно оптимальным, иначе рендеринг его на экране, да еще и со сглаживанием (вы уверены, что задачу себе по "зубам" выбрали? строку не умеете считать, а антиалиасинг - легко?)

имхо, шрифт должен быть в двоичном виде. Если векторный из отрезков прямых линий (если иначе - сразу TTF загружайте - чего там мелочиться), то в виде обычного массива стреуктур типа такого

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

typedef struct{
  short int dx;
  shoet int dy;
}vect_t;

typedef struct{
   short int cnt; // количество векторов
   vect_t nodes[]; // массив векторов
}symbol_t;
массив векторов описывает на сколько пикселей и в какую сторону смещается "перо", если оба поля структуры равны нулю, это означает, что перо переносится в следующую точку без рисования линии... как-то так...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Shrike1987
Родился
Сообщения: 7
Зарегистрирован: Пт мар 02, 2018 16:31:19

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

Сообщение Shrike1987 »

Да, текстовый вариант очень плох, это я понимаю. Пришел к нему, т.к. ооочень уж туго дается мне си после delphi... С точки зрения алгоритмизации - задача по зубам, причем исходники wuline сишные есть в интернете, библиотеку для своего дисплея переписал для вывода графики через буфер (благо RAM хватает) + реализация альфа канала, обновления нужного участка экрана... С периферией разобрался благодаря CubeMX. А вот синтаксис языка си ну вообще никак не лезет...

Да, я записываю действительно массив, только не векторов, а координат полилиний, где их нужно разорвать и начать рисовать новую полилинию - ставил символ "|". Прекрасно понимаю, что эта чушь будет и медленно работать и жрать много памяти. Поэтому и решил спросить совета в каком виде хранить массив типа uint16_t чисел, в которых по 4 бита будут записаны координаты отрезка (x1,y1,x2,y2) преобразованных по формуле ( X1 shl 12 ) or ( Y1 shl 8 ) or ( X2 shl 4 ) or Y2
Экономней вижу вариант писать в массив uint8_t пару координат, а разрыв полилинии - заранее определенная (невозможная или неиспользуемая) пара координат...

Ваш вариант возьму за основу, только вместо short int буду использовать uint8_t - всё таки на байт меньше )))

Благодарю, за помощь!!!

Добавлено after 41 minute 59 seconds:
Это абзац... я не могу создать массив, структура которого содержит динамический массив... :shock:

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

typedef struct{
  uint8_t dx;
  uint8_t dy;
} vect_t;

typedef struct{
   uint8_t cnt;
   vect_t nodes[];
} symbol_t;

symbol_t VFont[255];


Компилятор, конечно же ругается: type containing an unknown-size array is not allowed
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Си - не делфи, в нём нет никаких динамический массивов. Есть, конечно, стандартные функции для выделения/удаления памяти в куче, но об этом долго писать. Погуглите...
Shrike1987
Родился
Сообщения: 7
Зарегистрирован: Пт мар 02, 2018 16:31:19

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

Сообщение Shrike1987 »

Ок. Разбираться со стеком, выделением памяти и т.д. для меня слишком муторно, поэтому возвращаюсь к варианту с типом char *Lines. Текст буду обновлять все равно редко, так что сойдет хранение координат в тексте...
Как же все-таки получить char от i-го элемента Lines структуры TFont?

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

struct TFont {
  char *Lines;
} Font[255] ;

...
   Font[48].Lines="010516364541301001|0541"; 


Font[48].Lines[i] - ругается

в коде программы загоняю примерно 25 строк в Font - все выполняется без ошибок. Теперь бы с этим научиться работать...

Добавлено after 8 minutes 12 seconds:
хотяб судя по содержимому, там полная каша...
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

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

struct TFont {
  char *Lines;
} Font[255] ;

..............

    Font[48].Lines="010516364541301001|0541";
   
    Font[48].Lines[5] = 'A';
    char ch = Font[48].Lines[10];

GCC. Компиляция проходит успешно.
Ответить

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