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

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

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

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

Подробнее>>

Литиевые батарейки FANSO в беспроводных датчиках

Литиевые батарейки различного химического состава и разных типоразмеров широко используются в беспроводных датчиках систем сбора данных, промышленной автоматики и систем умного дома. Широкий спектр таких батареек производит не прекратившая поставки в Россию китайская компания Fanso, входящая во всемирно известный концерн по производству электрохимических элементов питания EVE.

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

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

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

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

void test (int *arr_2)

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

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

Link to comment
Share on other sites

Широкий выбор продукции MEAN WELL для промавтоматики на складе КОМПЭЛ

Компания КОМПЭЛ наращивает объем поставок источников питания MEAN WELL для промышленной автоматизации. Компания MEAN WELL не планирует уходить с рынка РФ, а ее продукция широко применяется в сфере промавтоматики (монтаж на DIN-рейку) и рекомендована в качестве замены других брендов и для применения в новых разработках.

Представляем ассортимент продукции MEAN WELL на складе КОМПЭЛ для надежного и бесперебойного электропитания устройств промавтоматики.

Подробнее>>

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

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

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

Link to comment
Share on other sites

Мощный универсальный неизолированный стабилизатор MORNSUN

Компания MORNSUN разработала универсальный понижающе-повышающий неизолированный стабилизатор (DC/DC-преобразователь) с выходным током до 10 А — KUB4836EB-10A. Этот стабилизатор можно использовать при входном напряжении в диапазоне 9…60 В (питающие шины с номинальным значением напряжения 12/24/48 В), а выходное напряжение можно подстраивать в диапазоне от 0 до 60 В. Преобразователь выполнен в корпусе 1/8 Brick с возможностью установки на печатную плату, имеется разновидность для монтажа на шасси — KUB4836EBF-10A.

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

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.
×
×
  • Create New...