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

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

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

Благодарю !!!
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Сообщение levaclaus »

Подскажите, в rx_buffer[] сливаются ответы от uart, известны все возможные слова и их расположение в этом буфере.
Как теперь красивее и практичнее воспользоваться условием if ?

К примеру в
rx_buffer[0] = 'I';
rx_buffer[1] = 'V';

if ((rx_buffer[0] == 'I')&&(rx_buffer[1] == 'V')) {
doit();
};

Но как быть если нужно проверить строку из 16 символов?
Последний раз редактировалось levaclaus Вс фев 25, 2018 08:28:53, всего редактировалось 1 раз.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

levaclaus писал(а):Но как быть если нужно проверить строку из 16 символов?
strncmp
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Приветствую! в файле main объявил структуру, по прерыванию передаю адрес этой структуры в функцию в include-файл для работы с ее членами. компилятор плюется. Как можно решить эту проблему?
Спойлер

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


///////////////////////////////////////
struct struct_1 {
      
         uint8_t a;
	 uint8_t b;
	 uint8_t c;
 }A;

ISR (INT0_vect)
{
function(&A);
}

int main(void)
{
}
//////////////////////////////////////////

//////////////////
include - file////
/////////////////

void function(struct struct_1 *A)
{

A->a+=1;
A->b+=1;
A->c+=1;

}

Последний раз редактировалось ROMan2947 Пн фев 26, 2018 19:51:20, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3317650#p3317650"]компилятор плюется. Как можно решить эту проблему?[/uquote]

Как ругается компилятор? Он ведь Вам говорит, что ему не нравится.
Попробую свои телепатические возможности

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

struct struct
Зачем два раза? Имя структуры не может совпадать ключевым словом (struct - ключевое слово)
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

вы инклюдите исходник, т.е. файл с расширением *.c? если так, то это плохая практика.
надо инклюдить только *.h файлы, в которых, кстати, не должно быть никакой реализации функций.

надо так:

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

// заголовочный файл 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

// файл main.c
#include "main.h"
#include "next.c"
static my struct A;

ISR(INT0_vect){
   function(&A);
}

// файл next.h
#if !defined(__NEXT_H__)
#define __NEXT_H__
#include "main.h"
void function(my_struct *s);
#endif

// файл next.c
#include "next.h"

void function(my_struct *s){
   s->a++;
   s->b--;
   s->c = s->a + s->b;
}
кстати, вызывать функции из других модулей в обработчике прерываний - тоже так себе идея...
Последний раз редактировалось ARV Пн фев 26, 2018 19:53:28, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Зачем два раза? Имя структуры не может совпадать ключевым словом (struct - ключевое слово)
исправил

Добавлено after 3 minutes 40 seconds:
вы инклюдите исходник, т.е. файл с расширением *.c? если так, то это плохая практика.
в maine я подключаю файл с расширением .h туда и передаю структуру для работы, в этом файле у меня функция function.

Добавлено after 3 minutes 8 seconds:
кстати, вызывать функции из других модулей в обработчике прерываний - тоже так себе идея...
чем это чревато?да и как быть если оч надо....
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ROMan2947 писал(а):файл с расширением .h туда и передаю структуру для работы, в этом файле у меня функция function
не делайте так
ROMan2947 писал(а):чем это чревато?
ничем страшным, кроме достаточно долгого вызова обработчика прерываний и расхода памяти на стек. в принципе, можно забить.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

не делайте так
у меня уже несколько библиотек написанных подобным образом,что удивительно, что они работают без нарекания...я бы дальше так и думал,что все так и должно быть...но мне одно не понятно почему они работают когда в *h. файлах должно быть только описание,а там у меня куча функции с текстом, которые и принимаю и возвращают данные, хоть и внешние....а со структурами не прокатило?
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Они работают "без нарекания" до тех пор, пока этот .h файл включается в коде только один раз.

Стоит только включить такой .h файл в два разных .c файла, и начнёте долго и упорно разгребать ошибки компоновки.

А по поводу приведённого кода тоже включу телепатию и предположу, что ругается компилятор на вызов в прерывании неизвестной (ранее не объявленной) функции.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Попробуйте объявить тип структуры через typedef, чтобы без всяких

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

struct struct_1 *
было.
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

вы упорно не хотите написать, как именно вам ругается компилятор. Считаете это неважным? Рискну предположить, что в его ругани все описано достаточно исчерпывающе.

подсказка: откуда вдруг в объявлении функции будет известен тип struct_1?
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение 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]
какая роль условной компиляции в данном коде?
Грызет канифоль
Аватара пользователя
Сообщения: 250
Зарегистрирован: Ср янв 17, 2018 13:09:14

Сообщение AndyBig »

ROMan2947 писал(а):вроде как определил(но не правильно, как ща понимаю) ,передал, а он все равно ругается...
Если этот заголовочник вставлен в начале основного файла, то правильно ругается, потому что функция со структурой компилируется до того как встретится определение этой структуры.
ROMan2947 писал(а):я так понял тип нужно объявить внешне, чтобы видеть ее в модулях, а struct struct_1 или typedef не фатально думаю....или я ошибаюсь?
Если этот заголовочник будет вставлен в несколько модулей, то фатально. Без typedef будет ругаться на то, что переменная уже определена, с typedef не будет.
ROMan2947 писал(а):какая роль условной компиляции в данном коде?
Гарантировать что код будет скомпилирован только один раз, даже если он будет вставлен в несколько модулей.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение 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! ;-)
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

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

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

Сообщение ARV »

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

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

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

Сообщение 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();
};
}
Открыл глаза
Сообщения: 53
Зарегистрирован: Чт дек 28, 2017 23:07:31

Сообщение city77 »

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

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

Доброго времени суток. Когда-то на асме был написан кусок кода, собирающий из 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 бит.
Ответить

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