Jump to content

Вопрос по массиву


maksimdag0
 Share

Recommended Posts

Все добрый вечер!
Я столкнулся с таким случаем: передаю массив в функцию test, через указатель (см. фото 1). В теле этой функции я передаю массив другой функции - big, но передаю по одному элементу таким образом - каждый элемент массива приравниваю к первому элементу и передаю его в функцию big, НО это не работает, почему? Почему нельзя записать в первый элемент массива его любой другой элемент?  (см. фото 2)
Я отслеживал под отладкой это процесс, и выявил что никакое значение не записывается в первый элемент массива, и даже больше - значение arr_2[i] не изменялось вообще, хотя переменная "i" изменялась. подскажите пожалуйста, что я не знаю, почему так происходит?

Screenshot_1.png

 

Screensot_2.png

Edited by maksimdag0
Link to comment
Share on other sites

11 минут назад, maksimdag0 сказал:

никакое значение не записывается в первый элемент массива, и даже больше значение arr[i]

Кто такой arr[]?

Инициализацию массивов перечитайте внимательно.

void test (int *arr_2)

arr_2 в данном случае указатель на число, а не на массив.

Link to comment
Share on other sites

4 минуты назад, DedLogoped сказал:

Кто такой arr[]?

Инициализацию массивов перечитайте внимательно.

void test (int *arr_2)

arr_2 в данном случае указатель на число, а не на массив.

Ошибся, исправил тему, не arr[], а arr_2[i]

Link to comment
Share on other sites

ИП MEAN WELL для медицинских и промышленных устройств на складе Компэл

Компэл расширяет складскую программу по специальным ИП для применения в медицинских приборах и промышленных устройствах. Представлены ИП в диапазоне мощности от 5 до 500 Вт, по медицинскому стандарту EN60601-1 с двумя мерами защиты пациента (2хMOPP; тип BF) для устройств, контактирующих с пациентом.  

Все эти надежные источники питания могут применяться не только в медицинских устройствах, но и в промышленных устройствах и информационных системах.  Подробнее>>

Популярные модели литиевых батареек FANSO EVE Energy готовы к отправке
На складе КОМПЭЛ уже готовы к поставке одни из самых востребованных литиевых батареек типов ER и CR производства FANSO EVE Energy – одного из мировых лидеров на рынке первичных литиевых элементов питания.
Данные источники тока получили широкое применение в различных областях, будь то системы безопасности, приборы учета или мелкая бытовая техника.

Подробнее о применениях >>

5 минут назад, DedLogoped сказал:

Кто такой arr[]?

Инициализацию массивов перечитайте внимательно.

void test (int *arr_2)

arr_2 в данном случае указатель на число, а не на массив.

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

Link to comment
Share on other sites

LED-драйверы MEAN WELL на складе – выбор больше, стоимость ниже

Компэл расширил и существенно пополнил склад LED-драйверами компании MEAN WELL, одновременно снизив цену на них. В настоящий момент на складе представлена широкая линейка продукции для наружного (семейства HLG, ELG, XLG, LPC, LPV), и для внутреннего (APC, LCM, SLD, APV) освещения.

Имеется большой выбор моделей с различными режимами стабилизации выходных параметров. Кроме того, есть в наличии и линейка DC/DC-драйверов, как понижающих (семейство LDD), так и повышающих (семейство LDH).

Подробнее>>

12 часов назад, maksimdag0 сказал:

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

Что бы элементу массива присвоить указатель на другой массив, тип  массива должен быть соответствующим.

Link to comment
Share on other sites

LIR-20 – модуль резервирования питания от MORNSUN
Компания MORNSUN расширила линейку продукции, монтируемой на DIN-рейку, выпустив модуль резервирования питания LIR-20 с максимальным током до 20 А на канал. Модуль можно использовать на шинах с напряжением 24 или 48 В (полный диапазон напряжения 22…60 В). Данный модуль применяется в системах, где даже выход из строя источника питания (ИП) не должен привести к потере напряжения. К модулю резервирования подключаются два источника питания, причем один из них может быть бесперебойным (ИБП; UPS), и нагрузка.

Читать подробнее >>

16 часов назад, maksimdag0 сказал:

каждый элемент массива приравниваю к первому элементу и передаю его в функцию big,

Что мешает сразу сделать

big(arr_2[i]);

В чем смысл переписывать его по 10 раз?

 

16 часов назад, maksimdag0 сказал:

почему нельзя записать в первый элемент массива его любой другой элемент?

Потому что можно. И код это прекрасно делает:

image.png.0dc0a6c0300d06b0c668fe23eeadb566.png

image.png.8174065c105c4f0e525bde8c901a18bb.png

Как видишь, в функцию big() были переданы все значения массива arr_1 и сохранены в массив rec_data.

Link to comment
Share on other sites

Это произошло совсем в другом редакторе - Keil. Этот пример я настрочил в подруку попавшемуся редакторе, здесь важен только один момент - не присваивается нулевому элементу массива значение его любого другого элемента.

Link to comment
Share on other sites

23 hours ago, maksimdag0 said:

не присваивается нулевому элементу массива значение его любого другого элемента.

Вы передаете указатель, компилятор даже не знает что под тем адресом, перемеменная или массив.

Если очень надо вручную выститывайте смещение каждой ячейки массива, вытягивайте оттуда ее значение, тоже самое для второй ячейки.

Просто вы путаетесь думая, что указатель указывает на массив, указатель указывает на адрес (в вашем случае на начало массива), но в указателе нет информации на что он указыват, на массив или на просто переменную.

Edited by codenamehawk
Link to comment
Share on other sites

3 часа назад, codenamehawk сказал:

Если очень надо вручную выститывайте смещение каждой ячейки массива, вытягивайте оттуда ее значение, тоже самое для второй ячейки.

Это вы плаваете в теме.
Если я передаю функции указатель на int - компилятору по барабану, массив там или одиночная переменная. И смещение на следующий элемент вычисляется автоматически.
Если у меня функция объявлена void foo(uint16_t *ptr)
то в теле функции я могу с этим указателем делать всякое:
ptr++ приведет к тому, что указатель будет указывать на следующее слово, а не следующий байт
ptr[10] - это я обращаюсь к 10 слову, а не к 10 байту - смещение в 10 слов высчитывается автоматически.

А вот если указать void foo(void *ptr) - вот тут уже интересно. Придется внутри функции определять размерность данных и при этом учитывать кучу всякого разного.

У ТСа какая-то другая проблема. Возможно он включил какую-нибудь оптимизацию и компилятор излишне умничает.
И еще, @maksimdag0 - прекращайте пользоваться фигнёй типа int/uint. Используйте однозначное указание разрядности - uint32_t int16_t и т.д.

Edited by LiVit
Link to comment
Share on other sites

3 часа назад, codenamehawk сказал:

Вы передаете указатель, компилятор даже не знает что под тем адресом, перемеменная или массив.

Я передаю уже значение элемента массива, находящийся по этому адресу - arr_2[i]. Если я бы передавал адрес то выражение выглядело бы так - arr_2+i

прихожу к мнению, что все таки компилятор в этом виновен 

 

Link to comment
Share on other sites

@maksimdag0  Я собрал в Keil ваши функции, всё работает как надо, записывается массив без проблем. Может выложите здесь весь файл целиком, а не его куски?

Link to comment
Share on other sites

6 hours ago, LiVit said:

И смещение на следующий элемент вычисляется автоматически.

И откуда он узнает какой у вас массив (типа  int16_t или int32_t)

 

6 hours ago, LiVit said:

Если у меня функция объявлена void foo(uint16_t *ptr)
то в теле функции я могу с этим указателем делать всякое:

Никто не запрещает.

6 hours ago, LiVit said:

ptr++ приведет к тому, что указатель будет указывать на следующее слово,

Для атмеги - да.

 

6 hours ago, LiVit said:

а не следующий байт

а надо, что бы указывал на следующий элемент массива, а это будет не всегда см. выше.

Edited by codenamehawk
Link to comment
Share on other sites

6 hours ago, maksimdag0 said:

Я передаю уже значение элемента массива, находящийся по этому адресу - arr_2[i].

От того, что вы его назвали arr_2 он не стал массивом.

Нету никакого массива arr_2, вы его нигде не обьявили, по аналогии с int arr_1[3]

В переменной arr_2 будет содержаться адрес равный адресу arr_1[0], т.е. первой ячейки.

(Обратите внимание, что это только адрес, а не содержимое первой ячейки)

Если надо вычислить адрес четвертой ячейки arr_1[3], при помощи переменной arr_2, можно посчитать так

arr_2 + ( 3 * sizeof(int)), если тип хранящихся данных будет нп. int32_t, то формула будет выглядеть arr_2 + ( 3 * sizeof(int32_t)) , где 3 это номер ячейки минус один( в С массив начинается с нуля)

(Обратите внимание, что это только адрес, а не содержимое этой ячейки).

И если не ошибаюсь, то указатель должен быть без знаковый, как у

6 hours ago, LiVit said:

void foo(uint16_t *ptr)

Поинтересуйтесь https://server.179.ru/tasks/cpp/total/094.html

Если уж очень надо передать через указатель

https://www.google.com/search?q=как+передать+массив+в+функцию+си+через+указатель&newwindow=1&client=firefox-b-d&sxsrf=ALiCzsa54wcgW0CoXBCSTt5dPgXC2NVEZw%3A1656264145631&ei=0ZW4Yvr8JYurxc8PgdSZ8Ao&oq=передать+массив+в+функцию+си&gs_lcp=Cgdnd3Mtd2l6EAEYBTIHCAAQRxCwAzIHCAAQRxCwAzIHCAAQRxCwAzIHCAAQRxCwAzIHCAAQRxCwAzIHCAAQRxCwAzIHCAAQRxCwAzIHCAAQRxCwA0oECEEYAEoECEYYAFAAWABgjUVoAXABeACAAQCIAQCSAQCYAQDIAQjAAQE&sclient=gws-wiz

Link to comment
Share on other sites

9 минут назад, codenamehawk сказал:

arr_2 + ( 3 * sizeof(int)), если тип хранящихся данных будет нп. int32_t, то формула будет выглядеть arr_2 + ( 3 * sizeof(int32_t)) , где 3 это номер ячейки минус один( в С массив начинается с нуля)

какой бред вы несете...
читайте учебник:
https://metanit.com/cpp/c/5.3.php

Link to comment
Share on other sites

14 minutes ago, IMXO said:

какой бред вы несете...

Вы правы, код рабочий, изменений делать не надо.

int arr_1[3] = {101,102,103};


void mus(int *arr_2)
{
  Serial.println(arr_2[0]);
  Serial.println(arr_2[1]);
  Serial.println(arr_2[2]);
  Serial.println();

  for(int i = 0; i < 3; i++)
  {
    arr_2[0] = arr_2[i];
    Serial.println(arr_2[0]);
  }

}

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(115200);
  mus(arr_1);
}

void loop()
{
  // put your main code here, to run repeatedly:
}

Код для ардуино уно выдает

Untitled.png.e5a9b8f1ab95d12b4148ac72d585e6d5.png

Link to comment
Share on other sites

3 часа назад, codenamehawk сказал:

И откуда он узнает какой у вас массив 

Дорогой товарищ, ещё раз - вы не в теме. 

При объявлении функции указан тип переменной, на которую указывает указатель. Именно отсюда компилятор узнаёт размерность данных. 

Пишите больше программ, будете лучше понимать. 

2 часа назад, codenamehawk сказал:

Код для ардуино уно выдает

А! Вот оно что. Ардуинщик.... 

Вопросов больше не имею. 

Link to comment
Share on other sites

10 hours ago, LiVit said:

Дорогой товарищ, ещё раз - вы не в теме. 

И совсем вы не опоздали.

10 hours ago, LiVit said:

А! Вот оно что. Ардуинщик.... 

Грешен, а еще я и паскалем баловался.

Link to comment
Share on other sites

4 часа назад, codenamehawk сказал:

Грешен, а еще я и паскалем баловался.

И что этот каминг-аут должен обозначать?

Одно дело, когда вы не понимаете как работает, что-то там ковыряете и никому вреда не причиняете, а другое дело, когда вы с видом знатока вещаете на форуме, где начинающие могут прочесть и принять на веру ваши измышления. 
Как профи, я чувствую необходимость оградить неокрепшие умы от ереси. С приведением примеров в том числе. И как показывает практика, повторение - мать учения. Чем больше рассказываешь людям как оно на самом деле, тем больше пользы.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Сообщения

    • меня терзают смутные сомненья, что схема не соответствует оригиналу.
    • При питании от самодельного БП, я правильно понимаю? Преобразователь-то нерабочий.
    • Там двухкаскадный резонансный УВЧ на КП307. Полевик не шунтирует контур, добротность и избирательность бешеные! А в Эстонии 010 двухзатворные КП306 и К174ХА6.  
    • Схема рабочая, но не заточена изначально под такую силу тока, т.к. обычно сила потребляемого тока кулером до 0,5 Ампер (в моем случае 0,23 А). При этом схема даже работает какое-то время на максимальных оборотах, на минимальных же просто сильно греется транзистор, т.е. если висят парочка кулеров, то транзистор еле тёплый.   Путаете, 2SD882 гораздо скромнее чем КТ817: 12,5 Вт против 25 ВТ у КТ817, 90 МГц против 3 Мгц у КТ817, Hfe 160 против 25 у КТ817. Спасибо. Но всё таки есть ли возможность для большей силы тока изменить ту схему что уже имеется? Ещё нашёл что вроде мой потенциометр на 1 кОм только до 12 Вольт, но это не точно. Потенциометр на картинке
    • В исправном только тихое шипение, как я понимаю, его специально добавляют в звук. А гул добавился после аварии, по ощущениям синхронизирован с сетевым шумом от окружающих импульсников. Гудит из самого аппарата, что с подключенной телефонной линией, что без неё.
    • Эстония 008 и Эстония 010 ещё качественее. Только редкие и дорогие. Это Вы про Суперджет 100 российский ? Там электроника - голимое дерьмо китайское. https://www.google.com/search?client=opera&q=Суперджет+дерьмо&sourceid=opera&ie=UTF-8&oe=UTF-8
    • Посмотрел схему Радиотехники 101. Потрясающий аппарат! Там 3 транзистора только в УВЧ. Дальше идет К174ПС1 и К174ХА6. Не нужно сравнивать К174ХА34 с этим высококачественным тюнером!
×
×
  • Create New...