Вопрос по указателям
- Войдите на сайт для отправки комментариев
Пнд, 05/09/2016 - 11:51
Объявлена структура
struct variable { const char *varMinStr; void *ptrVarMin; //указатель на любой тип данных };
затем указатель на массив
variable *Variables;
В конструкторе класса задается значение указателей:
{ ... //создается массив, допустим из одного элемента Variables = new variable[1]; //промежуточная локальная переменная в конструкторе используется для приведения к float. Например: Variables[0].varMinStr = "0.25\n", тогда a=0.25 double a= atof (Variables[0].varMinStr); //сохраняется адрес, где хранится значение 0.25 в указателе Variables[0].ptrVarMin, который при этом имеет тип void* Variables[0].ptrVarMin = &a; ... }
Доступ к значению получаю так:
//приведение к указателю на double и разыменование *(double*)Variables[0].ptrVarMin)
Вопрос:
Является ли защищенным от перезаписи в процессе выполнения программы, значение (0.25), на которое указывает Variables[0].ptrVarMin, которое изначально было задано в конструкторе. Т.е. интересует срок жизни этого значения.
Не окажется ли там рано или позно какая-то абракадабра? Переменной
Окажется. Локальная переменная живёт только в своём блоке. НИкаких счётчиков ссылок и автоматической работы с памятью, как в JavaScript (и много где ещё) здесь нет.
Спасибо за быстрый отклик и за то, что подтвердили мои опасения.
Опять возникли сомнения. Указатель, ведь, не пуст. Он содержит определенный адрес памяти. Неужели контроллер с этим не считается? Или он с оставшимися тремя байтами, кроме первого, свободно будет обращаться?
Ну, содержит он адрес, и что? А что именно лежит по этому адресу его не волнует, ну абсолютно. Вы можете иметь два указателя на один и тот же адрес и менять содержимое памяти по любому из указателей. Собственно в этом и смысл указателей.
В данном случае указатель указывает на неое место в области стека. В процессе работы со стеком там может оказаться всё, что угодно.
Суть понял. Еще раз Спасибо.
ЕвгенийП а будут этюды про указатели? очень бы хотел пополнить свои познания в этом вопросе, а то я никак не допру что это и с чем это едят...
Будут и скоро. Про динамическую память я уж с год обещаю, вот скоро сделаю.
Mr.Privet, а массивы понимаете? Вот представьте, что оперативная память - это такой аппаратный массив byte RAM[2048], и мы можем оттуда читать и записывать байты: RAM[3] = 42;. 42 - это значение байтовой переменной, а 3 - это указатель на неё, на то место в памяти, где она находится.
kite, просто интересуюсь - ваш код - это теоретические изыскания или на самом деле планируете его использовать?
Планирую. Паял одно устройство. Работает под управлением ардуино, мало того, еще и работает. Дошло до дело дисплея. Сделал меню с навигацией энкодером, что называется "в лоб". Работает. Кода дохренища, понятности на следующий день - 0. Решил оптимизировать ))), да и с языком поближе познакомиться. Вторая неделя пошла. Надеюсь скоро это ,...., меню закончить. Как и две недели назад.
Сам вопрос касался задачи ограничения пределов вводимых значений для разных типов.
P.s. Про готовые библиотеки меню знаю.
P.s. 2. Не работа, хобби.
Планирую. Паял одно устройство. Работает под управлением ардуино, мало того, еще и работает. Дошло до дело дисплея. Сделал меню с навигацией энкодером, что называется "в лоб". Работает. Кода дохренища, понятности на следующий день - 0. Решил оптимизировать ))), да и с языком поближе познакомиться. Вторая неделя пошла. Надеюсь скоро это ,...., меню закончить. Как и две недели назад.
Сам вопрос касался задачи ограничения пределов вводимых значений для разных типов.
P.s. Про готовые библиотеки меню знаю.
P.s. 2. Не работа, хобби.
Слишком универсальное решение хотите получить. Массивы указателей и динамические объекты - это не совсем для Ардуино. Получите самодостаточный код. Я бы не мудрил...
Его как-раз и хочу получить, речь о библиотеке для себя на будущее. Да и просто интересно.
Массивы указателей и динамические объекты - это не совсем для Ардуино.
Динамические объекты, особенно мелкие, в 2К памяти, могут больше памяти на дескрипторы выделенных участков уесть, чем на данные. Тут да. Зато статический массив указателей на функции, который компилятор может разместить во флеше, наоборот, поможет сэкономить в итоге память.
А вот объектно-ориентированное (С++) системное программирование - от лукавого. Например, много ли С++ кода в ядре линукса найдете? Догадайтесь, почему.
Mr.Privet, а массивы понимаете? Вот представьте, что оперативная память - это такой аппаратный массив byte RAM[2048], и мы можем оттуда читать и записывать байты: RAM[3] = 42;. 42 - это значение байтовой переменной, а 3 - это указатель на неё, на то место в памяти, где она находится.
енто то я прочитал на вики, просто в этюдах уважаемого ЕвгенияП мне нравится то что он все очень хорошо расжовывает и приводит примеры, да еще и то в каких случаях это нужно делать а когда нет. А у меня пока понимание на уровне обезяны, вот я писал скетчик, без звездочки не работает, компелятор что то про звездочку написал, я звездочку поставил и заработало как я хотел. А что там да как, да сколько памяти понимания нет. Ну новички мы такие, методом научного тыка познаем все, а когда дымок пошел пишем в форум что ардуино г...но.
без звездочки не работает, компелятор что то про звездочку написал, я звездочку поставил и заработало
А просто почитать Кернигана и Ричи не пробовали? Я не шучу. С этой книжки добрая половина Си-шников профи начинала.