Функции в CVAVR

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Функции в CVAVR

Сообщение snayperAlfa » 01 июл 2008, 22:28

Может глупый вопрос, но как подсчитать длину массива в CVAVR ? Тоесть показать количество элементов.

Код: Выделить всё
int a;
int array[2]={1,2};
a=array.lenght;
Вот так компилятор ругается
a=array->lenght; И так тоже.


Требует шоб слева от -> и . была структура
snayperAlfa
 
Сообщения: 163
Зарегистрирован: 05 июн 2008, 22:03
Откуда: Украина,Одесса
прог. языки: С,Java,SQL если это язык,C++ немного

Re: Функции в CVAVR

Сообщение avr123.nm.ru » 01 июл 2008, 23:20

"Язык Си" - http://avr123.nm.ru/05.htm
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Функции в CVAVR

Сообщение -= Александр =- » 02 июл 2008, 00:40

a=sizeof(array); можно попробовать...
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Re: Функции в CVAVR

Сообщение snayperAlfa » 02 июл 2008, 01:19

На другом форуме подсказали
b = sizeof(ar)/sizeof(int); Эта шняга работает.
Но не работает следующее:
int a=2;
int b[a]; <- пишет что должна быть константа
snayperAlfa
 
Сообщения: 163
Зарегистрирован: 05 июн 2008, 22:03
Откуда: Украина,Одесса
прог. языки: С,Java,SQL если это язык,C++ немного

Re: Функции в CVAVR

Сообщение Digit » 02 июл 2008, 09:05

потому что Си - это не Васик :)
и даже на васике так динамические массивы не создают.
в Си надо выделять память функцией. эта функция возвращает указатель. Если у тебя есть переменная типа "указатель на целое", то ты можешь с этим указателем работать как с массивом. Насчет длины такого массива (чтоб не выйти за пределы выделенной памяти) ты должен заботиться сам.

Если тебе не надо менять в программе длину массива динамически, а нужна просто гибкость на этапе компиляции (чтоб не искать по тексту, где что завязано на длину массива), то вместо того, чтоб создавать переменную а, определи ее с помощью #define - тогда все будет пучком - будешь перед компиляцией ее значение менять и массив будет в разных версиях прошивки разный.

ЗЫ: читай хелпы по сям и в инете шарь. (как говорится, RTFM)
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Функции в CVAVR

Сообщение snayperAlfa » 02 июл 2008, 10:05

А вообще идея такая:

int a[]={1,2};

int l=sizeof(a)/sizeof(a[0]);

int b[l]; //заполнение будет происходить по ходу программы
Длинна массива менятся не будет
snayperAlfa
 
Сообщения: 163
Зарегистрирован: 05 июн 2008, 22:03
Откуда: Украина,Одесса
прог. языки: С,Java,SQL если это язык,C++ немного

Re: Функции в CVAVR

Сообщение Digit » 02 июл 2008, 11:22

Ну и зачем? :D
размер массива а задан жестко еще на этапе компиляции, но ты его вычисляешь, суешь в переменную и пытаешься создать новый массив.... Это разве логично?
Копай в сторону #define
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Функции в CVAVR

Сообщение -= Александр =- » 02 июл 2008, 16:47

Вообще если лень учить язык можно вообщу так: int a[];
Или так: int * a;

А вообще книжек в сети куча, язык не такой уж и сложный - бери и учи, чтоб глупые вопросы не задавать. Я советую книжку: Керниган Ричи "Язык Си". Тут на форуме где-то упоминалась, юзай поиск...
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Re: Функции в CVAVR

Сообщение avr123.nm.ru » 02 июл 2008, 19:21

-= Александр =- писал(а):Я советую книжку: Керниган Ричи "Язык Си".


ЕЁ и посоветовал во втором посте. :D Но народ не любит зрение портить читая книжки.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Функции в CVAVR

Сообщение snayperAlfa » 03 июл 2008, 00:47

Спасибо всем за полезные ответы. :shock:
Решилось все следующим образом:

int pas[]={1,2,3,4,5};
int ent[ sizeof(pas)/sizeof(pas[0]) ];

Вот и все
snayperAlfa
 
Сообщения: 163
Зарегистрирован: 05 июн 2008, 22:03
Откуда: Украина,Одесса
прог. языки: С,Java,SQL если это язык,C++ немного

Re: Функции в CVAVR

Сообщение Digit » 03 июл 2008, 12:56

я фигею :o
:ROFL:

snayperAlfa, а ты понимаешь, почему оно решилось? (Это не издевка, а нормальный вопрос - если не понимаешь, объясню)
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Функции в CVAVR

Сообщение snayperAlfa » 03 июл 2008, 18:21

Может потому что там строго задан размер,который попадает под описание константы.Хотя следующая строчка не работает:

int pas[]={1,2,3,4,5};
const int l=(sizeof(pas)/sizeof(pas[0])) ;
int ent[ l];
snayperAlfa
 
Сообщения: 163
Зарегистрирован: 05 июн 2008, 22:03
Откуда: Украина,Одесса
прог. языки: С,Java,SQL если это язык,C++ немного

Re: Функции в CVAVR

Сообщение Digit » 03 июл 2008, 18:38

Я думаю, что все из-за оптимизации компилятора - он видимо вычисляет значение на этапе компиляции и все.

А тот способ, о котором я тебе выше говорил (с #define) такой:

в начале файла где всякие #include пишешь:
Код: Выделить всё
#define RAZMER = 5


а потом a том месте, где массивы определяешь:
Код: Выделить всё
int pas[RAZMER]={1,2,3,4,5};
int ent[RAZMER];


#define - это директива предварительного парсера - перед тем, как текст проги будет откомпилирован, она скармливается этому парсеру и он обрабатывает директивы. Все, что начинается с # - это указания этому парсеру.
Например, когда ты пишешь #include <aaaa.h> - это указание парсеру всунуть в текст вместо этой строки текст из файла "аааа.h".
Так и с #define - парсер знает, что все строчки "RAZMER" в тексте надо заменить на "5".
И только после того, как текст проги обработан парсером, он скармливается компилятору. Т.е. компилятор думает, что ты изначально в тексте написал так:
Код: Выделить всё
int pas[5]={1,2,3,4,5};
int ent[5];


Вот такая полезная штука :wink:
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Функции в CVAVR

Сообщение snayperAlfa » 03 июл 2008, 18:47

Спасибо за твое изложение,но я это знаю:про дефайны и инклюды.В универе в позапрошлом году изучал С.Идея заключалась чтобы размер массива сам вычислялся.Тоесть дописал в массив еще одно число и не надо больше нигде в программе ничего менять.Возможно,количество элементов массива будет менятся через самопрограммированние.Вроде бы это так называется :oops: Или в еепром потом этот массив сохранять.
snayperAlfa
 
Сообщения: 163
Зарегистрирован: 05 июн 2008, 22:03
Откуда: Украина,Одесса
прог. языки: С,Java,SQL если это язык,C++ немного

Re: Функции в CVAVR

Сообщение blindman » 03 июл 2008, 19:09

Или плохо учили, или плохо учился :(
Размер статического массива задается или явно - константой, или неявно - инициализацией. const определяет не константу, а переменную, значение которой не может меняться после создания. Ты хочешь вот что:

Код: Выделить всё
#define ASIZE (sizeof(a) / sizeof(*a))

int a[] = {1,2,3,4};
int b[ASIZE];

Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

След.

Вернуться в Микроконтроллеры

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

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

cron