Вопросы по С/С++ (СИ)
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
- Реклама
Подскажите, в rx_buffer[] сливаются ответы от uart, известны все возможные слова и их расположение в этом буфере.
Как теперь красивее и практичнее воспользоваться условием if ?
К примеру в
rx_buffer[0] = 'I';
rx_buffer[1] = 'V';
if ((rx_buffer[0] == 'I')&&(rx_buffer[1] == 'V')) {
doit();
};
Но как быть если нужно проверить строку из 16 символов?
Как теперь красивее и практичнее воспользоваться условием 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 раз.
strncmplevaclaus писал(а):Но как быть если нужно проверить строку из 16 символов?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Приветствую! в файле 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
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3317650#p3317650"]компилятор плюется. Как можно решить эту проблему?[/uquote]
Как ругается компилятор? Он ведь Вам говорит, что ему не нравится.
Попробую свои телепатические возможности
Зачем два раза? Имя структуры не может совпадать ключевым словом (struct - ключевое слово)
Как ругается компилятор? Он ведь Вам говорит, что ему не нравится.
Попробую свои телепатические возможности
Код: Выделить всё
struct struct- Реклама
вы инклюдите исходник, т.е. файл с расширением *.c? если так, то это плохая практика.
надо инклюдить только *.h файлы, в которых, кстати, не должно быть никакой реализации функций.
надо так:кстати, вызывать функции из других модулей в обработчике прерываний - тоже так себе идея...
надо инклюдить только *.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 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
исправилЗачем два раза? Имя структуры не может совпадать ключевым словом (struct - ключевое слово)
Добавлено after 3 minutes 40 seconds:
в maine я подключаю файл с расширением .h туда и передаю структуру для работы, в этом файле у меня функция function.вы инклюдите исходник, т.е. файл с расширением *.c? если так, то это плохая практика.
Добавлено after 3 minutes 8 seconds:
чем это чревато?да и как быть если оч надо....кстати, вызывать функции из других модулей в обработчике прерываний - тоже так себе идея...
не делайте такROMan2947 писал(а):файл с расширением .h туда и передаю структуру для работы, в этом файле у меня функция function
ничем страшным, кроме достаточно долгого вызова обработчика прерываний и расхода памяти на стек. в принципе, можно забить.ROMan2947 писал(а):чем это чревато?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
у меня уже несколько библиотек написанных подобным образом,что удивительно, что они работают без нарекания...я бы дальше так и думал,что все так и должно быть...но мне одно не понятно почему они работают когда в *h. файлах должно быть только описание,а там у меня куча функции с текстом, которые и принимаю и возвращают данные, хоть и внешние....а со структурами не прокатило?не делайте так
Они работают "без нарекания" до тех пор, пока этот .h файл включается в коде только один раз.
Стоит только включить такой .h файл в два разных .c файла, и начнёте долго и упорно разгребать ошибки компоновки.
А по поводу приведённого кода тоже включу телепатию и предположу, что ругается компилятор на вызов в прерывании неизвестной (ранее не объявленной) функции.
Стоит только включить такой .h файл в два разных .c файла, и начнёте долго и упорно разгребать ошибки компоновки.
А по поводу приведённого кода тоже включу телепатию и предположу, что ругается компилятор на вызов в прерывании неизвестной (ранее не объявленной) функции.
Попробуйте объявить тип структуры через typedef, чтобы без всяких было.
Код: Выделить всё
struct struct_1 *вы упорно не хотите написать, как именно вам ругается компилятор. Считаете это неважным? Рискну предположить, что в его ругани все описано достаточно исчерпывающе.
подсказка: откуда вдруг в объявлении функции будет известен тип struct_1?
подсказка: откуда вдруг в объявлении функции будет известен тип struct_1?
[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, чтобы без всякихбыло.[/uquote] я так понял тип нужно объявить внешне, чтобы видеть ее в модулях, а struct struct_1 или typedef не фатально думаю....или я ошибаюсь?
Добавлено after 5 minutes 31 second:
[uquote="ARV",url="/forum/viewtopic.php?p=3317656#p3317656"]надо так:
.[/uquote]
какая роль условной компиляции в данном коде?
все верно, компилятор ругается на неизвестный тип...в том то и парадокс вроде как определил(но не правильно, как ща понимаю) ,передал, а он все равно ругается...
Добавлено after 4 minutes 50 seconds:
[uquote="Аlex",url="/forum/viewtopic.php?p=3317827#p3317827"]Попробуйте объявить тип структуры через typedef, чтобы без всяких
Код: Выделить всё
struct struct_1 *Добавлено 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
какая роль условной компиляции в данном коде?
- Сообщения: 250
- Зарегистрирован: Ср янв 17, 2018 13:09:14
Если этот заголовочник вставлен в начале основного файла, то правильно ругается, потому что функция со структурой компилируется до того как встретится определение этой структуры.ROMan2947 писал(а):вроде как определил(но не правильно, как ща понимаю) ,передал, а он все равно ругается...
Если этот заголовочник будет вставлен в несколько модулей, то фатально. Без typedef будет ругаться на то, что переменная уже определена, с typedef не будет.ROMan2947 писал(а):я так понял тип нужно объявить внешне, чтобы видеть ее в модулях, а struct struct_1 или typedef не фатально думаю....или я ошибаюсь?
Гарантировать что код будет скомпилирован только один раз, даже если он будет вставлен в несколько модулей.ROMan2947 писал(а):какая роль условной компиляции в данном коде?
- Сообщения: 353
- Зарегистрирован: Вс янв 19, 2014 22:41:55
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3317868#p3317868"]в том то и парадокс вроде как определил[/uquote]
Нет никаких парадоксов - есть три программы - препроцессор, компилятор и линкер. Препроцессор применяется к каждому С-файлу в проекте - вставляет #include, подставляет #define и исполняет остальные #-директивы. Результат его работы передаётся компилятору для превращения в объектный файл с кодом функций и местом под глобальные переменные. Объектные файлы полученные из всех С-модулей проекта [и библиотеки] передаются линкеру для установления связей данных, вызовов функций и создания окончательной программы. Если компилятор ругается на неизвестный тип - значит до данной конкретной строчки определение этого типа ему не встретилось - он работает только с тем текстом, который создан для него препроцессором - ни о других С-файлах ни о H-файлах знаний у него нет. Этот текст можно найти в папке с промежуточными файлами компиляции, иногда его требуется включить в настройках проекта, иногда это выглядит как переключатель "preprocess only" - не пожалейте времени на ознакомление с результатом работы препроцессора и поймёте, что никакой магии там нет - а идёт тупая работа с текстом.
Нет никаких парадоксов - есть три программы - препроцессор, компилятор и линкер. Препроцессор применяется к каждому С-файлу в проекте - вставляет #include, подставляет #define и исполняет остальные #-директивы. Результат его работы передаётся компилятору для превращения в объектный файл с кодом функций и местом под глобальные переменные. Объектные файлы полученные из всех С-модулей проекта [и библиотеки] передаются линкеру для установления связей данных, вызовов функций и создания окончательной программы. Если компилятор ругается на неизвестный тип - значит до данной конкретной строчки определение этого типа ему не встретилось - он работает только с тем текстом, который создан для него препроцессором - ни о других С-файлах ни о H-файлах знаний у него нет. Этот текст можно найти в папке с промежуточными файлами компиляции, иногда его требуется включить в настройках проекта, иногда это выглядит как переключатель "preprocess only" - не пожалейте времени на ознакомление с результатом работы препроцессора и поймёте, что никакой магии там нет - а идёт тупая работа с текстом.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
[uquote="ARV",url="/forum/viewtopic.php?p=3317656#p3317656"]надо так:[/uquote]
пока буковку в буковку не написал компиляция не шла...в итоге победа! еще понять бы как это работает, было бы вообще самолет) Учить и учить еще этот Си.
ВСЕМ огромное СПАСИБО!!!
пока буковку в буковку не написал компиляция не шла...в итоге победа! еще понять бы как это работает, было бы вообще самолет) Учить и учить еще этот Си.
ВСЕМ огромное СПАСИБО!!!
если в какой-нибудь книжке про Си прочитаете что-то типа "в Си можно делать так...." - дальше не читайте. начинающему надо читать те книжки, в которых написано "в Си нужно делать так..."ROMan2947 писал(а):Учить и учить еще этот Си.
после того, как освоите, как НУЖНО, тогда можете читать и делать, как МОЖНО.
в частности, инклюдить Сишные файлы МОЖНО, включать в заголовочные *.h-файлы тело функции МОЖНО, и еще много чего МОЖНО, но именно на этом вы и погорели...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 4
- Зарегистрирован: Ср фев 28, 2018 10:33:09
Товарищи добрый день. имеется МК 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();
};
}
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
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Доброго времени суток. Когда-то на асме был написан кусок кода, собирающий из 4 байт (принятых последовательно по SPI, то есть представляющие собой по сути один 32 битный регистр) состояние нужных кнопок в 1 байт. Потому что в этих 4 байтах не все биты - это значения кнопок, есть много незначащих бит. Всего содержится инфа о 8 кнопках (по 2 кнопки в каждом байте). И вот я с помощью следующего кода собирал их в 1 байт:
Осторожно, 8051 асм
Как это правильнее всего всего сделать на Си:
1. Переписать 1 к 1.
2. Переписать через массив.
3. Переписать через структуру.
4. Загнать все в одну 32 битную переменную еще на этапе приема по SPI, и уже ее ужимать до 8 бит.
Осторожно, 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 бит.


