Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/22: Рейтинг темы: голосов - 22, средняя оценка - 4.82
1 / 1 / 0
Регистрация: 26.05.2021
Сообщений: 80

Работа с массивом в разных файлах

28.11.2021, 00:24. Показов 4854. Ответов 32

Студворк — интернет-сервис помощи студентам
Всем привет. столкнулся с проблемой, у меня есть два файла, в одном объявлен массив
C
1
 const uint8_t ASCII[][5] PROGMEM ={};
а во втором файле я с ним работаю. так вот во втором файле не видно массив. пытаюсь его объявить через
C
1
 extern const uint8_t ASCII[][] PROGMEM = {};
но это не работает.
До этого чтоб объявить массив в оперативке приходилось его делать не const, и тогда во втором файле он работал. Но PROGMEM нельзя сделать без const.
Вообщем я запутался, помогите...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2021, 00:24
Ответы с готовыми решениями:

работа с экземпляром в разных файлах
Добрый день коллеги! Недавно узнал о существовании Vue. И уже влюблён! Вопрос. Как работать с одним экземпляром класса...

Работа в разных заголовочных файлах и исходниках
Здравствуйте! Ранее, когда я писал приложения, я обычно всё размещал в исходнике main.cpp, но при переходе на графическое...

Работа с массивом из разных классов
Приветствую. Вопрос состоит в следующем, имеется Словарь, который должен быть виден в двух других классах со всеми своими элементами. ...

32
 Аватар для Mane
34 / 29 / 10
Регистрация: 26.06.2020
Сообщений: 113
28.11.2021, 14:26
Студворк — интернет-сервис помощи студентам
Готовая библиотека на GitHub
1
1 / 1 / 0
Регистрация: 26.05.2021
Сообщений: 80
28.11.2021, 14:36  [ТС]
это я знаю. но возможно в будущем возникнут потребности в такого вида извращениях, а я уже буду готов)
еще раз спасибо что помогли
0
1 / 1 / 0
Регистрация: 26.05.2021
Сообщений: 80
15.01.2022, 23:39  [ТС]
Продолжаю я мучать PROGMEM, и возникли некие непонятки.
объявил переменную в прогмем и указатель на нее.
C++
1
2
3
const char  PROGMEM  hzr = 232;
 const char  PROGMEM  *const adrs   = &hzr; 
char *proverka;
теперь в главном цикле могу получить или само значение или дарес.
C++
1
2
proverka = (char*) pgm_read_ptr(adrs);
 proverka = (char*) pgm_read_ptr(&adrs);
однако если я делаю вот так то я тоже получаю адрес. и при чем правильный. Как такое происходит?
C++
1
proverka = (char*) adrs;
И еще из этой же серии
C++
1
strcpy_P(send_buf, MenuItems[MenuCurent].format );
считывает из прогмем без всяких pgm_read_ptr в качестве второго аргумента..
0
 Аватар для Mane
34 / 29 / 10
Регистрация: 26.06.2020
Сообщений: 113
16.01.2022, 16:54
Цитата Сообщение от Ramzess1488 Посмотреть сообщение
однако если я делаю вот так то я тоже получаю адрес. и при чем правильный. Как такое происходит?
Мне не понятен ваш вопрос.
Он напоминает вопрос. "Что происходит, почему так, ничего не понимаю?"
"proverka = (char*) pgm_read_ptr(adrs);" Здесь вы получили значение, хранящиеся в переменной, адрес которой находится в переменной (типа указатель на char) - adrs.
"proverka = (char*) pgm_read_ptr(&adrs);" Здесь вы получаете адрес cамой переменной - adrs.
"proverka = (char*) adrs;" Здесь, после вашего выражения, переменная proverka будет хранить адрес adrs.
pgm_read_ptr - Возвращаемый результат - будет число, хранящаяся по адресу, указанному в 1 параметре функции.
Просто для получения значения, по указанному адресу, будут использоваться инструкции "lpm" - загрузка значения из памяти программы.
0
1 / 1 / 0
Регистрация: 26.05.2021
Сообщений: 80
17.01.2022, 08:38  [ТС]
Вы меня наверное не так поняли. Я имею ввиду что как так получилось что можно считать адрес из памяти программ без специального макроса? Единственное объяснение что на этапе компиляции уже известно какой адрес я хочу получить.
Вот тогда не понятно для чего нужны эти макросы pgm_read_ptr
Так же само касается и strcpy_P . Ей получается можно скормить адрес без макроса...
0
 Аватар для Mane
34 / 29 / 10
Регистрация: 26.06.2020
Сообщений: 113
17.01.2022, 12:12
Ramzess1488,
Считать значение хранящееся в памяти программы, вы можете только с помощью макросов объявленных в файле avr/pgmspace.h. А что там хранится в этих данных, вы решаете сами, могут хранится и адреса. Переменная adrs, которая объявлена в памяти программы, хранит адрес переменной hzr, значение которой 232.
pgm_read_ptr возвращает 16 разрядное значение из памяти программы, по адресу которой вы ему передадите.

А адрес переменной, не известен на этапе компиляции, он появляется на этапе линковки. До линковки (на этапе компиляции) адресов нет.
0
1 / 1 / 0
Регистрация: 26.05.2021
Сообщений: 80
17.01.2022, 18:13  [ТС]
Цитата Сообщение от Mane Посмотреть сообщение
Считать значение хранящееся в памяти программы, вы можете только с помощью макросов объявленных в файле avr/pgmspace.h.
Мы вернулись к тому с чего начинали, как получается что вот эта конструкция работает? я ведь считываю в переменную proverka значение из памяти програм без специальных макросов и она выдает правильный результат.
C++
1
proverka = (char*) adrs;
0
 Аватар для Mane
34 / 29 / 10
Регистрация: 26.06.2020
Сообщений: 113
17.01.2022, 19:27
Ramzess1488,
Прогон на симуляторе "simulavr", оптимизация 0.
результат:
(char*) pgm_read_ptr(adrs) = 0x26e8
(char*) pgm_read_ptr(&adrs) = 0x26
proverka (char*) adrs = 0x26
proverka (char*) &adrs = 0x27

Код из файла "main.lss":
00000026 <__trampolines_end>:
26: e8 26 Address 0x00000026 is out of bounds.
.word 0xffff ; ????
00000027 <adrs>:
27: 26 00
Переменная hzr адрес 00x26, adrs адрес 00x27.
Прикладываю файл проекта, с симулятором.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
proverka = (char*) pgm_read_ptr(adrs);
sprintf(output_buffer, "(char*) pgm_read_ptr(adrs) = %p", proverka);
println(output_buffer);
    
proverka = (char*) pgm_read_ptr(&adrs);
sprintf(output_buffer, "(char*) pgm_read_ptr(&adrs) = %p", proverka);
println(output_buffer);
    
proverka = (char*) adrs;
sprintf(output_buffer, "proverka (char*) adrs = %p", proverka);
println(output_buffer);
    
proverka = (char*) &adrs;
sprintf(output_buffer, "proverka (char*) &adrs = %p", proverka);
println(output_buffer);
Вложения
Тип файла: zip tmp.zip (1.53 Мб, 6 просмотров)
0
1 / 1 / 0
Регистрация: 26.05.2021
Сообщений: 80
17.01.2022, 20:03  [ТС]
я наверно надоел уже, но никак не пойму сути. вот даже по вашим ответам видно что конструкция proverka (char*) adrs = 0x26 работает. хотя не должна. мы ведь пытаемся получить данные из памяти программ
прилагаю скриншоты из атмел студио, я подключил отладчик и смотрел куда именно записывает программа
Вложения
Тип файла: rar скрины.rar (397.0 Кб, 8 просмотров)
0
 Аватар для Mane
34 / 29 / 10
Регистрация: 26.06.2020
Сообщений: 113
18.01.2022, 08:46
Вот как транслятор делает код, это взял из файла "main.lst".
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
44:main.c        ****     proverka = (char*) adrs;
 320                            .loc 1 44 0
 321 0180 80E0              ldi r24,lo8(hzr)
 322 0182 90E0              ldi r25,hi8(hzr)
 323 0184 9093 0000     sts proverka+1,r25
 324 0188 8093 0000     sts proverka,r24
 
48:main.c        ****     proverka = (char*) &adrs;
 354                            .loc 1 48 0
 355 01c6 80E0              ldi r24,lo8(adrs)
 356 01c8 90E0              ldi r25,hi8(adrs)
 357 01ca 9093 0000     sts proverka+1,r25
 358 01ce 8093 0000     sts proverka,r24
Наблюдаю, что транслятор не извлекает значения из памяти, а подставляет готовые константы.
0
1 / 1 / 0
Регистрация: 26.05.2021
Сообщений: 80
19.01.2022, 22:22  [ТС]
я понял. получается что АВР в этом плане сложнее даже стм32.

Добавлено через 2 часа 6 минут
Перечитываю ваше сообщение:
"proverka = (char*) pgm_read_ptr(&adrs);" Здесь вы получаете адрес cамой переменной - adrs.
"proverka = (char*) adrs;" Здесь, после вашего выражения, переменная proverka будет хранить адрес adrs.
Что от сюда следует? что эти два выражение идентичны?
1
 Аватар для Mane
34 / 29 / 10
Регистрация: 26.06.2020
Сообщений: 113
20.01.2022, 06:17
Ramzess1488, Спасибо, за подсказку.
Цитата Сообщение от Ramzess1488 Посмотреть сообщение
"proverka = (char*) pgm_read_ptr(&adrs);" Здесь вы получаете адрес cамой переменной - adrs.
Я ошибся "proverka = (char*) pgm_read_ptr(&adrs);" Извлекается значение по адресу adrs, это значение равно адресу "hzr"
Простите великодушно.
1
1 / 1 / 0
Регистрация: 26.05.2021
Сообщений: 80
20.01.2022, 22:38  [ТС]
вот теперь вроде как картинка сложилась) спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.01.2022, 22:38

using в разных заголовочных файлах
Добрый день. подскажите пожалуйста Допустим есть у меня следующие файлы: main.cpp //... #include&quot;test1.h&quot; ...

Программирование в разных файлах
Я только начинающий программист(даже очень начинающий) и начал с языка c++. У меня есть файл main.cpp, где вам дают выбрать какою функцию...

JS Функционал в разных файлах
растащил код JS По разным файлам и фсе файлы подключил к страницею. Пощёл далще и прищёл к необходимости по клику который отслеживается в...

Vector в разных файлах
Здравствуйте проблема заключается в следующем. Есть три Юнита. В Юнит2 создан вектор указателей на абстрактный класс ...

Сравнение строк в разных файлах
В данном файле в первой строке кол-во последующих строк,со второй строки- запись в формате &quot;событие_год&quot;. Нужно вывести в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru