jcxz 234 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба Только что, Сергей Борщ сказал: Так это придирки. Может там архитектура такая (типа AVR), которая не умеет по uint8_t * из флеша доставать. Где "там"? Думаете ILI9341_WriteData() вызывается на AVR, в то время как вызывающая её функция - на ARM??? Это как это? Если вызывающий код (ILI9341_Init()) имеет доступ (может скопировать массив) из одной памяти в другую, то скорей всего и вызываемый код (ILI9341_WriteData()) может также это сделать (если это реально нужно, например - если производится пересылка этого массива по DMA, который не имеет доступа к const-памяти с инициализирующими данными). Даже если в реальности нужно производить пересылку из другой памяти (DMA в МК не имеет доступа к flash), то такая пересылка логично делается внутри функции ILI9341_WriteData() которая как раз знает как она производит пересылку. А не вызывающим кодом. Только что, Сергей Борщ сказал: Вопрос-то не об этом был, а о переменных с одинаковыми именами внутри разных блоков. 14 минут назад, Сергей Борщ сказал: Он или не понял вопроса, или ерунду сказал сознательно. А вы радуетесь. А по-моему - это Вы не поняли вопроса или сознательно говорите ерунду. Как-то так... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 2 hours ago, jenya7 said: стоит пользоваться такой конструкцией? мне она не нравиться честно говоря. Эт типа лямбды. Значит программер пришел из программирования десктопов или смартфонов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 18 минут назад, AlexandrY сказал: Эт типа лямбды. Где? 48 минут назад, jenya7 сказал: но это будет один локальный массив. То есть вы сделали то же самое, но теперь размер этого массива будет считать не компилятор незаметно где-то внутри себя, а вы лично и вручную, чтобы туда влезли все данные для самого ниахудшего случая использования. И если вам потребуется дописать кусок, в котором потребуется чуток больше памяти - вы обязательно забудете исправить размер этого "одного локального массива". Круто, чо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 7 minutes ago, Сергей Борщ said: Где? То есть вы сделали то же самое, но теперь размер этого массива будет считать не компилятор незаметно где-то внутри себя, а вы лично и вручную, чтобы туда влезли все данные для самого ниахудшего случая использования. И если вам потребуется дописать кусок, в котором потребуется чуток больше памяти - вы обязательно забудете исправить размер этого "одного локального массива". Круто, чо. шутите? это не C# c его Array.Resize<byte>. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 3 minutes ago, jenya7 said: шутите? это не C# c его Array.Resize<byte>. Немножко не так. Вы заранее выделили на стеке 16 байт и при каждом вызове функции нужно руками указывать, сколько байт передается. То есть уже две точки возможных ошибок. А у ТС в каждом блоке выделяется ровно столько, сколько нужно и длина блока, передаваемая в функцию, считается автоматически. Это не противоречит стандарту, позволяет исключить возможные ошибки - что еще надо программисту для счастья :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 11 minutes ago, Harvester said: Немножко не так. Вы заранее выделили на стеке 16 байт и при каждом вызове функции нужно руками указывать, сколько байт передается. То есть уже две точки возможных ошибок. А у ТС в каждом блоке выделяется ровно столько, сколько нужно и длина блока, передаваемая в функцию, считается автоматически. Это не противоречит стандарту, позволяет исключить возможные ошибки - что еще надо программисту для счастья :) там 20 таких строчек. на стеке будет 20 масивов переменной длины? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба Если ваши 20 массивов не используются одновременно - будет выделен один массив размером с максимальную строку. Почему вы считаете писателей компиляторов глупее себя? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 11 ноября, 2020 Опубликовано 11 ноября, 2020 (изменено) · Жалоба 9 minutes ago, Сергей Борщ said: Если ваши 20 массивов не используются одновременно - будет выделен один массив размером с максимальную строку. Почему вы считаете писателей компиляторов глупее себя? я не считаю. я спрашиваю. это был мой первоначальный вопрос - как поведет себя компилятор. Вы уверенны что все компиляторы так сделают? я пишу в IAR но иногда перетаскиваю библиотеки в MCUXpresso или VxWorks. хотелось быть уверенным что все компиляторы поведут себя одинаково. Изменено 11 ноября, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 80 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 7 минут назад, jenya7 сказал: я не считаю. я спрашиваю. это был мой первоначальный вопрос - как поведет себя компилятор. Вы уверенны что все компиляторы так сделают? Однозначно это разные массивы данных и они никогда не пересекутся в памяти. Но лучше их объявить глобальными константами с подходящими именами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 11 ноября, 2020 Опубликовано 11 ноября, 2020 (изменено) · Жалоба 4 minutes ago, HardEgor said: Однозначно это разные массивы данных и они никогда не пересекутся в памяти. Но лучше их объявить глобальными константами с подходящими именами. 16 minutes ago, Сергей Борщ said: Если ваши 20 массивов не используются одновременно - будет выделен один массив размером с максимальную строку. Почему вы считаете писателей компиляторов глупее себя? ну ребята вы уже определитесь как то. это же вынос мозга :)) Изменено 11 ноября, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 2 часа назад, Сергей Борщ сказал: Давайте тогда конкретные примеры, как это может произойти. Я во всех вменяемых компиляторах наблюдаю резервирование на стеке необходимого объема после входа в функцию и освобождение перед выходом. Не пересекающиеся во времени данные занимают одну и ту же память. У себя проверил простейшим образом - все так же. Ваша правда. Но вот обязан ли компилятор так делать - вопрос остается открытым... 25 минут назад, HardEgor сказал: Однозначно это разные массивы данных и они никогда не пересекутся в памяти. Вот как раз ровно наоборот. Область видимости играет большую роль здесь. Разные то они разные, с точки зрения языка. А с точки зрения распределения памяти - нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 80 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 57 минут назад, Arlleex сказал: Вот как раз ровно наоборот. Область видимости играет большую роль здесь. Разные то они разные, с точки зрения языка. А с точки зрения распределения памяти - нет. И какой смысл? Например в процессе работы первой функции data займет регион памяти, а потом освободит. Можно ли эту память использовать другим программам или нет? Или этот регион памяти надо персонально закрепить за data из первой функции и остальным ни-ни, так напишите static или сделайте константой и будет вам счастье. Стек это общая область памяти, которая динамически выделяется и освобождается в процессе работы(в данном примере при вызове функций). p.s. Да, другой вопрос - если включена сильная оптимизация и эти функции один раз в программе вызываются подряд, то компилятор может оптимизировать конкретные вызовы в одну общую функцию и одну переменную или вообще заинлайнить(inline). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 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 говорил о другом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 80 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 8 минут назад, haker_fox сказал: Мне кажется, уважаемый @Arlleex говорил о другом. Не важно. Такие желания появляются, если ТС хочет в обход программы использовать стек, например подменять содержимое стека (чем обычно и пользуются хакеры) или прочитать что-то в стеке. Для нормальной работы программы, как он это спрашивает, этого не требуется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 2 minutes ago, HardEgor said: Для нормальной работы программы, как он это спрашивает, этого не требуется. Автор темы не @Arlleex А @jenya7 действительно не понятно чего хочет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться