Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Сб апр 14, 2018 15:42:12

Это происходит из-за того что вы не подключаете заголовочный файлы (include), необходимые во вновь создаваемом файле.

Нет, с этим все нормально. Каждый модуль это отдельное творение, имеющее свой собственный хедер. И в данном случае в 3-ем модуле подключаю, хедеры от двух других.

Только необходимо, чтобы данный заголовочный файл обрабатывался один раз:
#ifndef TEST_H
#define TEST_H

Это тоже не обсуждается и не влияет на порядок файлов!!

Т.е. в вашем случае правильнее было сказать "порядок подключения заголовочных файлов", насколько я понял из последующей фразы.

Да.

-модуль здорового человека первой директивой #include должен подключать свой собственный .h-файл. Это минимизирует зависимость от контекста включения последнего в других модулях проекта.

Само собой!!мой наставник по Си говорил мне про это)))

У меня ситуация такая
хедер третьего модуля
Код:
#include "fft.h"
#include "UI.h"
#include "xpt2046_spi.h"


подключаемый хедер
Код:
#ifndef _FFT_H_
#define _FFT_H_

#include "ILI9341.h"


подключаемый хедер
Код:
#ifndef _UI_H_
#define _UI_H_

#include "ILI9341.h"
#include "enum.h"


В обоих подключается "ILI9341.h" может ли это как-то влиять?

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

Сб апр 14, 2018 18:35:41

В обоих подключается "ILI9341.h" может ли это как-то влиять?

Если header guard-ы (#ifndef/#define/#endif) прописаны то препроцессор вставит содержимое лишь при первом включении - для этого они и существуют. Если файлы включают друг друга - или напрямую или через третьи файлы - то "курица-яйцо" с вариантами и горе если первому нужно знать что-то из второго. а второму - из первого. Нарисуйте на листике граф #include-ов проекта, заметьте в каком месте ошибка, а в каком то определение, "невидимость" которого её вызывает. Сравните с выхлопом препроцессора. Но лучше потратить это время на рефакторинг проекта и сокращение количества связей между модулями.

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

Сб апр 14, 2018 19:20:36

Не нашел пока причину и что интересно ошибки какие странные.
Код:
Build target 'Target 1'
compiling main.c...
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6739): error:  #18: expected a ")"
    float32_t
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6737): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE float32_t arm_bilinear_interp_f32(
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6805): error:  #18: expected a ")"
    q31_t
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6803): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE q31_t arm_bilinear_interp_q31(
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6879): error:  #18: expected a ")"
    q31_t
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6877): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE q15_t arm_bilinear_interp_q15(
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6957): error:  #18: expected a ")"
    q31_t
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6955): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE q7_t arm_bilinear_interp_q7(
main.c: 0 warnings, 8 errors
compiling dso.c...
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6739): error:  #18: expected a ")"
    float32_t
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6737): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE float32_t arm_bilinear_interp_f32(
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6805): error:  #18: expected a ")"
    q31_t
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6803): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE q31_t arm_bilinear_interp_q31(
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6879): error:  #18: expected a ")"
    q31_t
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6877): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE q15_t arm_bilinear_interp_q15(
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6957): error:  #18: expected a ")"
    q31_t
,
E:\Keil_v5\ARM\PACK\ARM\CMSIS\5.2.0\CMSIS\Include\arm_math.h(6955): error:  #141-D: unnamed prototyped parameters not allowed when body is present
    CMSIS_INLINE __STATIC_INLINE q7_t arm_bilinear_interp_q7(

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

Сб апр 14, 2018 19:46:37

возможно, у вас есть дефайн, совпадающий с именем или строкой в этом math.h и поэтому такое происходит. и он находится перед этим инклюдом

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

Сб апр 14, 2018 19:55:53

Это похоже на правду
Код:
#ifndef _XPT2046_H_
#define _XPT2046_H_

#include "stm32f3xx.h"

#define CS_TOUCH_LOW   GPIOA->BRR |= GPIO_BRR_BR_4;      //PA4
#define CS_TOUCH_HIGH  GPIOA->BSRRL |= GPIO_BSRR_BS_4;

#define   Y    0x90
#define   X    0xD0


А X и Y в библиотеке math достаточно!!!Спасибо!!!

P.s в этом и была проблема, все заработало!!!

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

Вт апр 17, 2018 10:47:00

Код:
#define CS_TOUCH_LOW   GPIOA->BRR |= GPIO_BRR_BR_4;   
#define CS_TOUCH_HIGH  GPIOA->BSRRL |= GPIO_BSRR_BS_4;


Здесь в обоих строчках точка с запятой лишние, иногда приводит к таким труднонаходимым гадостям ...
Да и |= лишнее , достаточно = ...

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

Чт апр 19, 2018 10:22:53

Здесь в обоих строчках точка с запятой лишние, иногда приводит к таким труднонаходимым гадостям ...

Можете привести примеры гадостей ? Все время в define ставлю точку с запятой, и как-то ещё не разу не нарвался.

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

Чт апр 19, 2018 11:02:53

я в дефайнах никогда не ставлю точку с запятой т.к. дефайн может оказаться не всей командой, а только её частью, да даже если всей - то после неё в коде всёравно стоит точка с запятой.
ещё поддефайновое выражение часто заключают в скобки - тоже помогает не награблиться.

Добавлено after 3 minutes 4 seconds:
пример (правда не очень яркий): if (условие) дефайн_1 else дефайн_2;

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

Чт апр 19, 2018 11:40:21

Можете привести примеры гадостей ?

Странная просьба. Эти "гадости" сплошь и рядом на форумах встречаются.
Например :
Код:
#define  DATA_PORT    PORTA ;

А потом пытаются что-то записать :
Код:
DATA_PORT = xxx;

И ломают голову об ругань компилятора.

pokk писал(а):Все время в define ставлю точку с запятой
Это у Вас, по всей видимости, ещё мало опыта. Потом уйдёт от Вас эта привычка.
И от точки запятой откажитесь, и do{}while(0) будете ставить в дефайны, ... :)

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

Пт апр 20, 2018 11:17:14

Я тут на хабре наткнулся на извращенческое программирование на Си...
Код:
   int Ox01 = ~-~-~-~-~-~-~-~-~-' ';
   int Ox02 = ((!true)["true"]-(false)["FALSE"])>>true;
   int Ox03 = 'X'/2/2^!*"";
   int Ox04 = ('0'>>!*"")-!*"";
   int Ox05 = (~'!'-~'~')>>!*"">>(2==1==0);
   int Ox06 = ('|'||'|'|'|')["||||||||"]%*"error";
   int Ox07 = '.'>>!false;
   int Ox08 = '\\'>>('!'>>(1<<2));
   int Ox09 = '/'-'/'/'/'>>'/'/'/';
   int Ox0a = (*"")["yes"]^(*"")["no"];
   int Ox0b = *"yes"^*"no";
   int Ox0c = '0'/2-!*"";
   int Ox0d = ((!'!'+'+')>>true)+(true<<true);
   int Ox0e = (-~true^!false)*(true<<(-~true|!false))-!false;
   int Ox0f = '!'-'^'%*"*";
   int Ox10 = -~*" L"^-~*"5Z";
   int Ox11 = *"Totally" -* "not" +* "0x17" + true;
   int Ox12 = -~!*""*-~!*""*-~!*""*-~!*""*-~!*""+~!*""*-~!*""*-~!*""-true;
   int Ox13 = -compl(-compl true xor true)<<-compl true|'8'>>('1'^'2');
   int Ox14 = '^'>>('<'^'>');
   int Ox15 = *"'"-(' '>>!0);
   int Ox16 = '_'>>-~1;
   int Ox17 = 010-001+010+010;
каждая из вышеописанных переменных имеет значение 0x17
это на само деле так.
но блин!!!! я не понимаю...
первый способ получения этого значения я осилил: операции побитовой инверсии вкупе с изменением знака каждый раз отнимают 1 от исходного числа "пробел", т.е. кода этого символа... 9 попарных сочетаний этих операций и дает нужное число.

ну последний вариант тоже очевиден - восьмеричная система счисления...

но вот дальше следуют варианты, от которых пока просто оторопь... можно попросить знатоков Си последовательно, пример за примером, объяснить, как оно работает? :oops:

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

Пт апр 20, 2018 12:00:17

Код:
int Ox02 = ((!true)["true"]-(false)["FALSE"])>>true;

Упрощаем:
Код:
int Ox02 = (0["true"] - 0["FALSE"]) >> 1;

Строки заменяются адресами и компилятору не особо важно что относительно чего индексировать, т.е. остается ('t' - 'F') >> 1

Код:
int Ox03 = 'X'/2/2^!*"";

Тут вообще все просто: 0x58 / 2 / 2 ^ !0

Код:
int Ox04 = ('0'>>!*"")-!*"";

Аналогично: ('0' >> 1) - 1;

Код:
int Ox05 = (~'!'-~'~')>>!*"">>(2==1==0);

(~'!' - ~'~') >> 1 >> 1

Дальше лень разбираться, похоже все примеры достаточно однотипные...

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

Пт апр 20, 2018 12:59:10

после разжёвывания становится всё просто :) в очередной раз я купился на то, что квадратные скобки для индексации массива можно ставить чуть ли не произвольно.

выходит, что str[0] == 0[str]

манипуляции с математикой более-менее понятны, нежели вот это
Код:
int Ox0a = (*"")["yes"]^(*"")["no"];
что такое (*"") - ?!

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

Пт апр 20, 2018 13:18:04

что такое (*"") - ?!

Вместо "" будет адрес пустой строки, т.е. *"" дает завершающий 0...

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

Пт апр 20, 2018 13:21:46

я не понял, как тут разыменование происходит.

Добавлено after 1 minute 3 seconds:
сцуко, хотя, пожалуй, понял...

В общем... слушайте, детишки: никогда-никогда-никогда так не пишите!!!

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

Пт апр 20, 2018 13:22:18

Код:
const char* s = "";
*s;

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

Пт апр 20, 2018 16:29:09

int Ox16 = '_'>>-~1;
-~1 = 2
'_'>>2=0x17

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

Пт апр 20, 2018 19:48:59

да понятно уже - по первым примерам остальные прояснились...

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

Пт апр 20, 2018 20:15:33

В мне непонятно само int 0x17 = что_то_там;
Вроде же имя переменной с цифры начинается не может, разве не так?

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

Пт апр 20, 2018 20:18:54

WiseLord писал(а):Вроде же имя переменной с цифры начинается не может, разве не так?
оно и начинается с буквы O

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

Пт апр 20, 2018 20:28:32

ах, чёрт.
Ответить