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

Переопределение переменной в теле функции.

Только что, Сергей Борщ сказал:

Так это придирки. Может там архитектура такая (типа AVR), которая не умеет по uint8_t * из флеша доставать.

Где "там"? Думаете ILI9341_WriteData() вызывается на AVR, в то время как вызывающая её функция - на ARM??? :shok: Это как это?

Если вызывающий код (ILI9341_Init()) имеет доступ (может скопировать массив) из одной памяти в другую, то скорей всего и вызываемый код (ILI9341_WriteData()) может также это сделать (если это реально нужно, например - если производится пересылка этого массива по DMA, который не имеет доступа к const-памяти с инициализирующими данными).

Даже если в реальности нужно производить пересылку из другой памяти (DMA в МК не имеет доступа к flash), то такая пересылка логично делается внутри функции ILI9341_WriteData() которая как раз знает как она производит пересылку. А не вызывающим кодом.

Только что, Сергей Борщ сказал:

Вопрос-то не об этом был, а о переменных с одинаковыми именами внутри разных блоков.

14 минут назад, Сергей Борщ сказал:

Он или не понял вопроса, или ерунду сказал сознательно. А вы радуетесь.

А по-моему - это Вы не поняли вопроса или сознательно говорите ерунду. Как-то так... :unknw:

Поделиться сообщением


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

2 hours ago, jenya7 said:

стоит пользоваться такой конструкцией? мне она не нравиться честно говоря.

Эт типа лямбды.
Значит программер пришел из программирования десктопов или смартфонов. 

Поделиться сообщением


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

18 минут назад, AlexandrY сказал:

Эт типа лямбды.

Где?

48 минут назад, jenya7 сказал:

но это будет один локальный массив.

То есть вы сделали то же самое, но теперь размер этого массива будет считать не компилятор незаметно где-то внутри себя, а вы лично и вручную, чтобы туда влезли все данные для самого ниахудшего случая использования. И если вам потребуется дописать кусок, в котором потребуется чуток больше памяти - вы обязательно забудете исправить размер этого "одного локального массива". Круто, чо.

Поделиться сообщением


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

7 minutes ago, Сергей Борщ said:

Где?

То есть вы сделали то же самое, но теперь размер этого массива будет считать не компилятор незаметно где-то внутри себя, а вы лично и вручную, чтобы туда влезли все данные для самого ниахудшего случая использования. И если вам потребуется дописать кусок, в котором потребуется чуток больше памяти - вы обязательно забудете исправить размер этого "одного локального массива". Круто, чо.

шутите? это не C# c  его Array.Resize<byte>.

Поделиться сообщением


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

3 minutes ago, jenya7 said:

шутите? это не C# c  его Array.Resize<byte>.

Немножко не так. Вы заранее выделили на стеке 16 байт и при каждом вызове функции нужно руками указывать, сколько байт передается. То есть уже две точки возможных ошибок.

А у ТС в каждом блоке выделяется ровно столько, сколько нужно и длина блока, передаваемая в функцию, считается автоматически.

Это не противоречит стандарту, позволяет исключить возможные ошибки - что еще надо программисту для счастья :)

Поделиться сообщением


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

11 minutes ago, Harvester said:

Немножко не так. Вы заранее выделили на стеке 16 байт и при каждом вызове функции нужно руками указывать, сколько байт передается. То есть уже две точки возможных ошибок.

А у ТС в каждом блоке выделяется ровно столько, сколько нужно и длина блока, передаваемая в функцию, считается автоматически.

Это не противоречит стандарту, позволяет исключить возможные ошибки - что еще надо программисту для счастья :)

там 20 таких строчек. на стеке будет 20 масивов переменной длины?

Поделиться сообщением


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

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

Поделиться сообщением


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

9 minutes ago, Сергей Борщ said:

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

я не считаю. я спрашиваю. это был мой первоначальный вопрос - как поведет себя компилятор. Вы уверенны что все компиляторы так сделают?

 

я пишу в IAR но иногда перетаскиваю библиотеки в MCUXpresso или VxWorks. хотелось быть уверенным что все компиляторы поведут себя одинаково.

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

Поделиться сообщением


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

7 минут назад, jenya7 сказал:

я не считаю. я спрашиваю. это был мой первоначальный вопрос - как поведет себя компилятор. Вы уверенны что все компиляторы так сделают?

Однозначно это разные массивы данных и они никогда не пересекутся в памяти.

Но лучше их объявить глобальными константами с подходящими именами.

 

Поделиться сообщением


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

4 minutes ago, HardEgor said:

Однозначно это разные массивы данных и они никогда не пересекутся в памяти.

Но лучше их объявить глобальными константами с подходящими именами.

 

 

16 minutes ago, Сергей Борщ said:

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

 

ну ребята вы уже определитесь как то. это же вынос мозга :))

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

Поделиться сообщением


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

2 часа назад, Сергей Борщ сказал:

Давайте тогда конкретные примеры, как это может произойти. Я во всех вменяемых компиляторах наблюдаю резервирование на стеке необходимого объема после входа в функцию и освобождение перед выходом. Не пересекающиеся во времени данные занимают одну и ту же память.

У себя проверил простейшим образом - все так же. Ваша правда.
Но вот обязан ли компилятор так делать - вопрос остается открытым...
 

25 минут назад, HardEgor сказал:

Однозначно это разные массивы данных и они никогда не пересекутся в памяти.

Вот как раз ровно наоборот. Область видимости играет большую роль здесь.
Разные то они разные, с точки зрения языка. А с точки зрения распределения памяти - нет.

Поделиться сообщением


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

57 минут назад, Arlleex сказал:

Вот как раз ровно наоборот. Область видимости играет большую роль здесь.

Разные то они разные, с точки зрения языка. А с точки зрения распределения памяти - нет.

И какой смысл?

Например в процессе работы первой функции  data займет регион памяти, а потом освободит.

Можно ли эту память использовать другим программам или нет?

Или этот регион памяти надо персонально закрепить за data из первой функции и остальным ни-ни, так напишите static или сделайте константой и будет вам счастье.

Стек это общая область памяти, которая динамически выделяется и освобождается в процессе работы(в данном примере при вызове функций).

 

p.s.  Да, другой вопрос  - если включена сильная оптимизация и эти функции один раз в программе вызываются подряд, то компилятор может оптимизировать конкретные вызовы в одну общую функцию и одну переменную или вообще заинлайнить(inline).

Поделиться сообщением


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

1 hour ago, jenya7 said:

ну ребята вы уже определитесь как то. это же вынос мозга :))

А вам зачем это, если не секрет? Какая разница, как будет распределена память? Вы же пишите на Си, а не на ассемблере. Вас такой низкоуровневый вопрос не должен беспокоить до поры до времени.

6 minutes ago, HardEgor said:

Например в процессе работы первой функции  data займет регион памяти, а потом освободит.

Именно так и будет. После закрытия первого блока (фигурной скобкой) память, занимаемая переменной data и любыми другими локальными переменными этого блока, считается свободной. И может быть занята сразу же для любых других целей.

void foo() {
  int a = 5; // допустим, эта переменная будет динамически размещена на стэке или в регистре в момент входа в функцию
  {
    int a = 7; // эта переменная будет создана, как только процессор "дойдёт до фигурной скобки", но эта "а" не равна внешей "а"
  } // здесь "а", равная 7 будет уничтожена. Не в прямом смысле. Просто память, которую она занимает, в т.ч. и регистровая, может быть использована
  
  {
    int a; // а эта "а" может содержать мусор, если выделена в каком-то участке стэка или регистре, не равном "а" из прошлого блока, которая была равна 7
           // а может быть и компилятор сгенеририут код, который будет использовать память этой самой "а" из прошлого блока
  } // здесь "а" будет уничтожена
} // здесь будет уничтожена "а", равная пяти

 

12 minutes ago, HardEgor said:

так напишите static или сделайте константой и будет вам счастье.

Мне кажется, уважаемый @Arlleex говорил о другом.

 

Поделиться сообщением


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

8 минут назад, haker_fox сказал:

Мне кажется, уважаемый @Arlleex говорил о другом.

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

Поделиться сообщением


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

2 minutes ago, HardEgor said:

Для нормальной работы программы, как он это спрашивает, этого не требуется.

Автор темы не @Arlleex:blum: А @jenya7 действительно не понятно чего хочет.

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...