Перейти к содержанию

массив, как параметр функции в C#


Рекомендуемые сообщения

Нужна помощь, искал ответ сам, но не нашёл.
Пишу программу для Atmega8 на C#

Есть функция

void function1( unsigned char symbol[8] )
{
.....
}

как ей передать массив ?

Можно конечно так:

unsigned char p[]={1,2,3,4,5,6,7,8}; //пример
function1(p);

Но массив p так и останется висеть в оперативной памяти, да и плодить переменные не хочется.

Есть ли возможность передать массив без его объявления, как-то так. Но синтаксис не правильный.

function1({1,2,3,4,5,6,7,8});

 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Только что, DarkDigger сказал:

как ей передать массив ?

Через указатель.

Только что, DarkDigger сказал:

для Atmega8 на C#

А для AVR разве есть C# компилятор ?
 

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

22 minutes ago, Alex said:

Через указатель.

А для AVR разве есть C# компилятор ?
 

ЭЭЭ. avr-gcc ?

Я имею ввиду предать параметр без объявления массива.

как-то так

function1({1,2,3,4,5,6,7,8}); Это вопрос скорее по синтаксису

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Только что, DarkDigger сказал:

Но массив p так и останется висеть в оперативной памяти, да и плодить переменные не хочется.

Массив в любом случае будет "висеть" в памяти, не в ОЗУ, так во flash. Вы же не думаете, что написанный массив в параметрах функции не попадет в память?

Вы ничего не выиграете, если избавитесь от "переменной". Для экономии ОЗУ размещайте константы во flash-памяти

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

21 минуту назад, DarkDigger сказал:

ЭЭЭ. avr-gcc ?

avr-gcc - это не C#, а С.

21 минуту назад, DarkDigger сказал:

как-то так

function1({1,2,3,4,5,6,7,8});

Не получится. Функция принимает указатель на массив, соответственно, он (массив) должен быть объявлен, под него выделена память, а компилятор должен знать его адрес.
Это Вам не С++, где память под экземпляры выделяется "на ходу", при передаче их как аргумента, и уничтожается после использования.

Ссылка на комментарий
Поделиться на другие сайты

Только что, DarkDigger сказал:

void function1( unsigned char symbol[8] )

Надеяться на то, что внутри функции будет известен размер массива, переданного в параметре - наивно. 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Кстати, если создать свой тип с таким размером, то другие она (функция) откажется принимать.

typedef char    my_arr[8];

int func(my_arr arr){
    int ret=0, i;
    for(i=0;i<(sizeof(arr)/sizeof(arr[0])); i++){
        ret+=arr[i];
    }
    return ret;
}

 

Ссылка на комментарий
Поделиться на другие сайты

можно сделать так, переменная aaa будет видна только в фигурных скобках, за скобками переменная перестанет существовать

void function1(unsigned char symbol[8])
{
...
}

void main(void)
{
   {
      unsigned char aaa[8] = {1,2,3,4,5,6,7,8};
      function1(aaa);
   }
...
}

 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, DarkDigger сказал:

Но массив p так и останется висеть в оперативной памяти, да и плодить переменные не хочется.

не хочет, чтобы массив висел  в памяти,
в варианте который я предложил, массив не будет висеть в памяти и переменные плодиться не будут (переменная aaa видна только локально в пределах двух строчек кода)

Ссылка на комментарий
Поделиться на другие сайты

Только что, dm37 сказал:

в варианте который я предложил, массив не будет висеть в памяти

Наивные рассуждения :) То, что в фигурных скобочках так или иначе будет находиться в памяти, с большой вероятностью во flash, и избавиться от этого будет невозможно. Более того, вы предложили разместить массив локально в main, а поскольку main никогда не завершается, массив БУДЕТ висеть в ОЗУ всегда :)

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

@ARV, не, она выгрузится из ОЗУ (указатель вершины стека изменится) сразу после возвращения из функции (до закрывающийся скобки).
А вот во флеши будет висеть. И даже не с большей вероятностью, а со 100%-ной.
 

Ссылка на комментарий
Поделиться на другие сайты

Только что, Alex сказал:

не, она выгрузится из ОЗУ (указатель вершины стека изменится) сразу после возвращения из функции

Ну и когда этот указатель изменится для функции main? ;) 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

29 минут назад, ARV сказал:

Наивные рассуждения :) То, что в фигурных скобочках так или иначе будет находиться в памяти, с большой вероятностью во flash, и избавиться от этого будет невозможно. Более того, вы предложили разместить массив локально в main, а поскольку main никогда не завершается, массив БУДЕТ висеть в ОЗУ всегда

В ОЗУ висеть не будет ,вы сначала проверьте в отладчике, потом говорите.
Во flash обязательно будет висеть, или вы хотите чтобы микроконтроллер выполнял код которого не было в памяти (flash). Мы не знаем что будет внутри function1, вполне возможно, что компилятор оптимизирует данный код и массива не будет ни во flash ни в ОЗУ, только конечный результат (возможно это только пример для передачи параметра, вполне возможно, что функция в будущем будет что то возвращать)

Ссылка на комментарий
Поделиться на другие сайты

Спасибо большое за участие в моей проблеме. Проверил на эмуляторе simulavr вариан с 

void main(void)
{
   {
      unsigned char aaa[8] = {1,2,3,4,5,6,7,8};
      function1(aaa);
   }
...
}

значение массива осталось в памяти.

Скорее всего нельзя передать массив напрямую в функцию.

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

_delay_ms(100);

В simulavr , видно , что одному из РОН присваивается значение 0x64 (тоесть 100) и после он обнуляется.

Чем массив хуже? Или я просто синтаксис не правильно понял?

Ссылка на комментарий
Поделиться на другие сайты

Только что, dm37 сказал:

вы сначала проверьте в отладчике, потом говорите

Отладчик умный, он показывает локальные для текущей (отлаживаемой) функции, и мне не требуется он, чтобы вас убеждать. Сами возьмите и посмотрите в отладчике просто дамп ОЗУ. Пока функция main не завершится (а она никогда не завершится - мы же о МК говорим?) массив будет болтаться в ОЗУ. Ну а после того, как main завершится, вем уже будет все равно на ОЗУ - то есть никакой экономии не будет никогда.

Только что, DarkDigger сказал:

значение массива осталось в памяти

Неужели вы сомневались в основах языка Си и его принципах работы с памятью?!

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

24 минуты назад, DarkDigger сказал:

нельзя передать массив напрямую в функцию

Нельзя, только указатель на него.

Если хотите, то сделайте так:

void function1(unsigned char c0, unsigned char c1,  unsigned char c2,  unsigned char c3,  unsigned char c4,  unsigned char c5, unsigned char c6, unsigned char c7)
{
.......
}

void main()
{
   function1(1,2,3,4,5,6,7,8);
}

 

Ссылка на комментарий
Поделиться на другие сайты

39 минут назад, ARV сказал:

Сами возьмите и посмотрите в отладчике просто дамп ОЗУ.

компилятор IAR, оптимизация size
если не использовать PORTA и PORTB, а использовать например сумму элементов массива, то в памяти вообще ничего нет - ни во флеш ни в озу, только конечный результат (работает оптимизация)

2.png

3.png

4.png

Изменено пользователем dm37
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, ARV сказал:

Ну и когда этот указатель изменится для функции main?

Немного не понятен вопрос, что означает "для функции" ?
В разных местах функции он может быть разным. Выше скриншоты dm37 это демонстрируют. При входе в блок кода, он увеличивается на sizeof(aaa), при выходе - уменьшается.
 

@ARV , не мне Вам объяснять основы о принципах работы с памятью :)



 

Ссылка на комментарий
Поделиться на другие сайты

Только что, Alex сказал:

Немного не понятен вопрос, что означает "для функции" ?

Локальные (не статические) переменные размещаются в области стека вызванной функции - так? Если мы объявили массив локально в функции foo(), он существует только в течение жизни функции foo, т.к. располагается в области "её" стека - вышли из функции и все, массив потерян. Так? Ну а теперь те же самые рассуждения для функции main: функции main выделена область в стеке, где распределен массив. Этот массив будет потерян (т.е. может быть затерт другими данными) только после того, как main завершится. Поскольку main не завершается никогда, массив останется в ОЗУ навсегда.

Что тут не понятно? Я допускаю, что коротенькие массивы теоретически могут быть компилятором распиханы по регистрам и вообще не будут занимать ОЗУ, но этот вариант я не рассматриваю, как весьма экзотический.

Только что, dm37 сказал:

компилятор IAR, оптимизация size
если

С локальными данными БЛОКА так и должно быть, я говорю про локальные данные функции в целом. Я проглядел (виноват, прошу прощения!), что вы понаставили дополнительных фигурных скобочек, и это меня ввело в заблуждение.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

я вот одного только не понимаю - к чему такая серьезная заморочка? Памяти не хватает что-ли? Ну не выгрузилась, да и хрен с ней. Если проша скомпилировалась и залилась, то вроде как порядок. Нет?

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

так по моему только в бейсике можно делать

это массив констант чтоли? А если его таки создать и указатель на него передать? Не то же самое будет? Или он из флеша обязательно в оперативку скопируется? В знакогенераторах вроде ничего не копируется, просто берутся значения в нужный момент и все. А их там дофига

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

В плюсах тоже можно. При условии, что входным параметром у функции будет объект (класс).
Да и в классическом С такой синтаксис допустим. Причём этих параметров может быть сколько угодно и их кол-во будет переменным. Но, естественно, аргумент функции будет не обычным указателем, как у ТС.

 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...