Easyelectronics.ru

Электроника для всех
Текущее время: 27 июн 2017, 12:08

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



    • The World's Cheapest 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
Сообщения: 1305
Откуда: Докучаевск, Донецкая обл
Хм, в шестой студии скомпилилось сразу.
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
Сообщения: 643
Откуда: Херсон
Да говорил уже. Х-р.
Вирезка лога из проекта.
Show

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


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

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

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

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


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

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


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

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2223
возник вопрос. надо очищать массив структур.
Структура:
Код:
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
Сообщения: 825
Откуда: Україна
Вы передаете в качестве параметра указатель. Из него нельзя получить реальный размер структуры через sizeof(). Используйте sizeof(SAT_IN_GSV_STRUCT)
Если надо обнулить одним махом весь массив структур, то либо берите размер самого массива, либо размер структуры умножайте на кол-во элементов в массиве.
И еще: выграша по сравнению с обнулением в цикле не будет. memset даст только более красивую запись, но не более того. Внутри нее будет тот же самый цикл.

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

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


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

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


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

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

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

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


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

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


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

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


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

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

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

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


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

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


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

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2223
Хм, а такая ситуация. Есть структура 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
Сообщения: 825
Откуда: Україна
Если исправить ошибку в названии указателя, то вполне.

Если я правильно понял Вашу мысль, то должно быть так:
Код:
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
Сообщения: 2223
да, это форумная опечатка, втупую скопировал из раннего сообщения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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
Сообщения: 2223
не работает так... как сказали выше - нельзя передавать в 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
Сообщения: 2223
обязательно проверю, отпишусь. Странно, но с указателем не работало.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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
Сообщения: 643
Откуда: Херсон
Доброго всем времени суток!
Появилась надобность в сохранении настроек с проверкой CRC.
Собственно вопрос:
Кто и как рассчитывает CRC на этапе компиляции программы?
В моем случае нужно знать evSets_com_CRC.

Show


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

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


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

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2096
Откуда: Санкт-Петербург
Конкретно 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
Сообщения: 28
Приветствую!

Есть всеми известные директивы #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 часов


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

Сейчас этот форум просматривают: Aner


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

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

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