Easyelectronics.ru

Электроника для всех
Текущее время: 18 окт 2017, 05:15

Часовой пояс: UTC + 5 часов



    • JLCPCB for PCB Prototyping: 10 шт. 2-слоя 100*100mm 2$(около 140rub), изготовление за 24 часа.
    • Создание принципиальных схем и проектирование печатных плат
    • Крупнейший китайский онлайн магазин радиодеталей. Скидка 50%
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 307 ]  На страницу Пред.  1 ... 9, 10, 11, 12, 13  След.
Автор Сообщение
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 10 апр 2014, 16:30 
Старожил
Аватара пользователя

Зарегистрирован: 18 июн 2011, 16:29
Сообщения: 1347
Откуда: Докучаевск, Донецкая обл
Хм, в шестой студии скомпилилось сразу.
Show Build log

_________________
Programmer - it is a machine for converting coffee to software.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 10 апр 2014, 16:35 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
S_Alex писал(а):
Код:
/*
Меняю настройки на atmega8.

avr-gcc.exe -mmcu=atmega8 -Wall -DF_CPU=8000000UL -Os -Ih:\avr\include -IE:\tst_m8_eep -c fuse.c -o obj\fuse.o
avr-gcc.exe -mmcu=atmega8 -Wall -DF_CPU=8000000UL -Os -Ih:\avr\include -IE:\tst_m8_eep -c main.c -o obj\main.o
avr-gcc.exe -Lh:\avr\lib -Lh:\avr\lib\avr4\ -o bin\tst_m8_eep.elf obj\fuse.o obj\main.o -mmcu=avr4 -Wl,-Map=bin\tst_m8_eep.map,--cref
obj\main.o: In function "main':
main.c:(.text.startup+0x4): undefined reference to "__eerd_byte_m8'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 0 warning(s) (0 minute(s), 0 second(s))

Чего ему не хватает.
*/

Возможно и линкеру надо говорить что это atmega8:
avr-gcc.exe -Lh:\avr\lib -Lh:\avr\lib\avr4\ -o bin\tst_m8_eep.elf obj\fuse.o obj\main.o -mmcu=atmega8 -Wl,-Map=bin\tst_m8_eep.map,--cref


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 10 апр 2014, 16:51 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2010, 01:03
Сообщения: 645
Откуда: Херсон
Да говорил уже. Х-р.
Вирезка лога из проекта.
Show

_________________
Если руки золотые, то не важно с какого места они растут.
Изображение
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 12 апр 2014, 21:39 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1532
Откуда: Киев
Мне кажется поблема здесь:

-Lh:\avr\lib -Lh:\avr\lib\avr4\

Или трусы надеть, или крестик снять )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 20 июн 2014, 03:12 
Старожил
Аватара пользователя

Зарегистрирован: 17 июн 2013, 14:28
Сообщения: 813
Откуда: Красноярск
С какой версии visual C впервые появился объект инспектор как в паскеле? а то у меня 6 версия 98 года и там нет такого. (чтоб лишнего не качать хочу подревнее)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 21 июл 2014, 12:41 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2334
возник вопрос. надо очищать массив структур.
Структура:
Код:
typedef struct   
{
unsigned   char         Sat_ID;         // ID спутника 1...32
unsigned   char         Sat_Elevation;   // возвышение спутника 0...90
unsigned   int         Sat_Azimuth;   // азимут спутника   0...359
unsigned   char         Sat_SNR;      // сигнал от спутника 0...99 (0 - не отслеживается)

} SAT_IN_GSV_STRUCT;


Массив:
Код:
SAT_IN_GSV_STRUCT   NMEA_sat_GLONASS[16];


Функция (упрощенно):

Код:
void parser_GSV(SAT_IN_GSV_STRUCT *addr_pointer)
{
  memset(addr_pointer, 0, sizeof(addr_pointer) );
}


Вызываю функцию:
parser_GSV(NMEA_sat_GLONASS);
Но массив не обнуляется. Что делаю не так? Лепить цикл, в котором обнуляется каждый элемент крайне неохота - медленно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 21 июл 2014, 12:45 
Старожил
Аватара пользователя

Зарегистрирован: 10 фев 2012, 18:04
Сообщения: 826
Откуда: Україна
Вы передаете в качестве параметра указатель. Из него нельзя получить реальный размер структуры через sizeof(). Используйте sizeof(SAT_IN_GSV_STRUCT)
Если надо обнулить одним махом весь массив структур, то либо берите размер самого массива, либо размер структуры умножайте на кол-во элементов в массиве.
И еще: выграша по сравнению с обнулением в цикле не будет. memset даст только более красивую запись, но не более того. Внутри нее будет тот же самый цикл.

_________________
"Если вы такие умные, что ж вы строем не ходите?"

Легче зажечь одну маленькую свечу, чем постоянно жаловаться на тьму...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 21 июл 2014, 12:49 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2334
хм. тогда придется делать так:
memset(addr_pointer, 0, sizeof(SAT_IN_GSV_STRUCT)*16);
Но необходимость указывать размерность массива немного не нравится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 21 июл 2014, 12:52 
Старожил
Аватара пользователя

Зарегистрирован: 10 фев 2012, 18:04
Сообщения: 826
Откуда: Україна
А что мешает обьявить дефайн или енум для размера массива, а уже его использовать и при обьявлении массива и далее в коде

_________________
"Если вы такие умные, что ж вы строем не ходите?"

Легче зажечь одну маленькую свечу, чем постоянно жаловаться на тьму...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 21 июл 2014, 12:54 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2334
да, с дефайнами всё работает. Пусть пока так, потом доработаем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 21 июл 2014, 13:09 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2334
хм, а отчего тогда memset верно работает в случае:
char str[] = "1234567890";
memset(str,0,sizeof(str));
? из-за того что явно передано имя массива, не через указатель, который ссылается только на начало массива?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 21 июл 2014, 13:11 
Старожил
Аватара пользователя

Зарегистрирован: 10 фев 2012, 18:04
Сообщения: 826
Откуда: Україна
да. сайзоф из указателя даст лишь размер самого указателя, но не того объекта, на который он ссылается.

_________________
"Если вы такие умные, что ж вы строем не ходите?"

Легче зажечь одну маленькую свечу, чем постоянно жаловаться на тьму...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 21 июл 2014, 13:14 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2334
оке. Спасибо за разъяснения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 21 июл 2014, 15:32 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2334
Хм, а такая ситуация. Есть структура GSV_STRUCT , со вложенным массивом структур SAT_IN_GSV_STRUCT
Код:
typedef struct   
{
unsigned   char         Sat_ID;         // ID спутника 1...32
unsigned   char         Sat_Elevation;   // возвышение спутника 0...90
unsigned   int            Sat_Azimuth;   // азимут спутника   0...359
unsigned   char         Sat_SNR;      // сигнал от спутника 0...99 (0 - не отслеживается)
} SAT_IN_GSV_STRUCT;


typedef struct   
{
unsigned   char         Number_Msg;            // кол-во сообщений GSV
unsigned   char         Curr_Number;         // текущий номер сообщения
unsigned   char         Sat_view;            // кол-во видимых спутников
SAT_IN_GSV_STRUCT         Sat_Info[SAT_COUNT];   // инфа о видимых спутниках
unsigned   char         Sat_curr;            // для парсера
} GSV_STRUCT;




Обнуление вложенного массива таким способом будет корректно?

Код:
void parser_GSV(SAT_IN_GSV_STRUCT *addr_pointer)
{
memset(gsv_pointer->Sat_Info,   0,   sizeof(SAT_IN_GSV_STRUCT)*SAT_COUNT);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 21 июл 2014, 15:42 
Старожил
Аватара пользователя

Зарегистрирован: 10 фев 2012, 18:04
Сообщения: 826
Откуда: Україна
Если исправить ошибку в названии указателя, то вполне.

Если я правильно понял Вашу мысль, то должно быть так:
Код:
void parser_GSV(GSV_STRUCT *addr_pointer)
{
memset(addr_pointer->Sat_Info,   0,   sizeof(SAT_IN_GSV_STRUCT)*SAT_COUNT);
}

_________________
"Если вы такие умные, что ж вы строем не ходите?"

Легче зажечь одну маленькую свечу, чем постоянно жаловаться на тьму...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 21 июл 2014, 15:49 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2334
да, это форумная опечатка, втупую скопировал из раннего сообщения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 21 июл 2014, 17:18 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
memset(addr_pointer->Sat_Info, 0, sizeof(addr_pointer->Sat_Info));


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 22 июл 2014, 10:09 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2334
не работает так... как сказали выше - нельзя передавать в sizeof указатель на массив, т.к. это всего-лишь адрес начала массива, и не более того.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 22 июл 2014, 14:28 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
Hold писал(а):
не работает так... как сказали выше - нельзя передавать в sizeof указатель на массив, т.к. это всего-лишь адрес начала массива, и не более того.
серьезно?
Код:
void parser_GSV(GSV_STRUCT *gsv_pointer)
{
  //memset(gsv_pointer->Sat_Info,   0,   sizeof(SAT_IN_GSV_STRUCT)*SAT_COUNT);
  //memset(addr_pointer->Sat_Info, 0, sizeof(gsv_pointer->Sat_Info));
  printf("%d\n", sizeof(SAT_IN_GSV_STRUCT)*SAT_COUNT);
  printf("%d\n", sizeof(gsv_pointer->Sat_Info));
}

int main()
{
  GSV_STRUCT a;

  parser_GSV(&a);
  return 0;
}

всегда выдает два одинаковых числа. курите матчасть и не более того. массив != указателю на массив.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 22 июл 2014, 15:10 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2334
обязательно проверю, отпишусь. Странно, но с указателем не работало.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 22 июл 2014, 16:04 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
с просто указателем как таковым и не будет работать. а с массивом - будет. gsv_pointer->Sat_Info - это массив, компилятор знает его размерность(!!!), хоть его и можно использовать как указатель на 1й элемент. чтобы проще понять/убедиться - вспомните массивы двойной размерности. массив байтов [8][8] займет непрерывно в памяти 64 байта, но компилятор в уме держит его размеры и может посчитать смещение по 2м индексам. передав куда-нить лишь указатель на этот массив - размерности потеряются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 18 апр 2015, 15:21 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2010, 01:03
Сообщения: 645
Откуда: Херсон
Доброго всем времени суток!
Появилась надобность в сохранении настроек с проверкой CRC.
Собственно вопрос:
Кто и как рассчитывает CRC на этапе компиляции программы?
В моем случае нужно знать evSets_com_CRC.

Show


А то я "танцую на граблях" из двух проектов с общими файлами настроек, один для МК, другой для ПК.
Подправил в одном файле настройки в первом проекте.
Пересобрал, запустил второй. Он подправил второй файл в первом проекте.
Компилируем первый проект. И CRC в полном порядке.
Может быть есть метод по-проще?

_________________
Если руки золотые, то не важно с какого места они растут.
Изображение
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 18 апр 2015, 16:10 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2215
Откуда: Санкт-Петербург
Конкретно CRC не делал, но вообще вроде это стандартная задача кодогенерации. Типовое решение - выносим данные в отдельный файл своего формата и при сборке проекта генерим по нему C-файл, который и компилируем.
Для Visual Studio (или Atmel Studio 6 соответственно) это делается или через Custom Build Rule для своего типа файлов, или через Pre-build step.
Для проектов на мейкфайлах всё по сути аналогично.

Конкретно для вашего случая можно сделать по ленивому: pre-build step в проекте для мк, который соберёт (через msbuild, полагаю) проект для компа и запустит его. Недостаток - вырастет время сборки проекта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 19 апр 2015, 14:13 
Заглядывает иногда

Зарегистрирован: 16 авг 2011, 19:31
Сообщения: 97
gcc 4.4+ сборки поддерживают C++11 и constexpr-функции(вычисляемые на этапе компиляции). С помощью них будет не проблема сделать, однако я не проверял скомпилится ли это(и будет ли работать) в avr-gcc.

PS:Но и да, это с++


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Вопрос по Си
СообщениеДобавлено: 06 фев 2017, 14:21 
Заглядывает иногда

Зарегистрирован: 07 июн 2016, 19:24
Сообщения: 39
Приветствую!

Есть всеми известные директивы #ifndef, #define и #endif, которые служат для предотвращения многократного включения хедера в проекте:

Код:
#ifndef MAIN_H
#define MAIN_H

...

#endif MAIN_H


Так вот, насколько я понимаю, нижнее подчёркивание "_" заменяет точку, но я видел ещё ряд записей этого кода:

Код:
#ifndef MAIN_H_
#define MAIN_H_

...

#endif /*MAIN_H_*/


Код:
#ifndef _MAIN_H_
#define _MAIN_H_

...

#endif


Какая из этих записей будет более грамотная? Зачем после (или перед) "H" ставить опять "_", если там нет точки? И правильно ли после #endif не указывать файл, который записан в #ifndef? Компилятор в Atmel Studio вроде не ругается...

Думаю, вопрос совсем лёгкий, поэтому загнал его в "детские", хотя я что-то не догоняю...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 307 ]  На страницу Пред.  1 ... 9, 10, 11, 12, 13  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB