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

массив, как параметр функции в 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 пользователей онлайн

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

    • Все предложенные к рассмотрению источники питания работают примерно по одному принципу: сетевое напряжение выпрямляется, фильтруется (получаем чуть больше 300 вольт постоянного), затем преобразуется снова в переменное, но уже на частотах в несколько десятков килогерц, понижается на трансформаторе и снова выпрямляется. За счёт высокой частоты преобразования используется трансформатор на ферритовом, а не на стальном, сердечнике, гораздо меньших габаритов и стоимости. Минусы: значительное усложнение схемы блока и вероятность возникновения различных помех от него. Модули управления (кроме первого) также являются импульными преобразователями, с теми же достоинствами и недостатками. Если нужно по быстрому собрать некое подобие ЛБП, то уж лучше брать модуль вроде этого. Ну и блок питания к нему соответствующий. Но не очень понятно, какой практический опыт можно получить от соединения готовых модулей парой проводов.  
    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
×
×
  • Создать...