roboforum.ru

Технический форум по робототехнике.

Функции в CVAVR

Функции в CVAVR

snayperAlfa » 01 июл 2008, 22:28

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

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


Требует шоб слева от -> и . была структура

Re: Функции в CVAVR

avr123.nm.ru » 01 июл 2008, 23:20

"Язык Си" - http://avr123.nm.ru/05.htm

Re: Функции в CVAVR

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

a=sizeof(array); можно попробовать...

Re: Функции в CVAVR

snayperAlfa » 02 июл 2008, 01:19

На другом форуме подсказали
b = sizeof(ar)/sizeof(int); Эта шняга работает.
Но не работает следующее:
int a=2;
int b[a]; <- пишет что должна быть константа

Re: Функции в CVAVR

Digit » 02 июл 2008, 09:05

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

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

ЗЫ: читай хелпы по сям и в инете шарь. (как говорится, RTFM)

Re: Функции в CVAVR

snayperAlfa » 02 июл 2008, 10:05

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

int a[]={1,2};

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

int b[l]; //заполнение будет происходить по ходу программы
Длинна массива менятся не будет

Re: Функции в CVAVR

Digit » 02 июл 2008, 11:22

Ну и зачем? :D
размер массива а задан жестко еще на этапе компиляции, но ты его вычисляешь, суешь в переменную и пытаешься создать новый массив.... Это разве логично?
Копай в сторону #define

Re: Функции в CVAVR

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

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

А вообще книжек в сети куча, язык не такой уж и сложный - бери и учи, чтоб глупые вопросы не задавать. Я советую книжку: Керниган Ричи "Язык Си". Тут на форуме где-то упоминалась, юзай поиск...

Re: Функции в CVAVR

avr123.nm.ru » 02 июл 2008, 19:21

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


ЕЁ и посоветовал во втором посте. :D Но народ не любит зрение портить читая книжки.

Re: Функции в CVAVR

snayperAlfa » 03 июл 2008, 00:47

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

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

Вот и все

Re: Функции в CVAVR

Digit » 03 июл 2008, 12:56

я фигею :o
:ROFL:

snayperAlfa, а ты понимаешь, почему оно решилось? (Это не издевка, а нормальный вопрос - если не понимаешь, объясню)

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];

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:

Re: Функции в CVAVR

snayperAlfa » 03 июл 2008, 18:47

Спасибо за твое изложение,но я это знаю:про дефайны и инклюды.В универе в позапрошлом году изучал С.Идея заключалась чтобы размер массива сам вычислялся.Тоесть дописал в массив еще одно число и не надо больше нигде в программе ничего менять.Возможно,количество элементов массива будет менятся через самопрограммированние.Вроде бы это так называется :oops: Или в еепром потом этот массив сохранять.

Re: Функции в CVAVR

blindman » 03 июл 2008, 19:09

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

Код: Выделить всёРазвернуть
#define ASIZE (sizeof(a) / sizeof(*a))

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



Rambler\'s Top100 Mail.ru counter