EEPROM, char* и int
- Войдите на сайт для отправки комментариев
Пт, 01/07/2016 - 17:14
Добрый день.
Столкнулся с проблемой, на экран можно выводить только переменные типа char*, а записывать настройки в модуль часов только в int. написал программу с использованием itoa и atoi, все работает, туда-сюда конвертирует выводит и т.п. НО! почему-то с EEPROM это не работает.
#include <Wire.h>
#include <Eeprom24C01_02.h>
#define EEPROM_ADDRESS 0x50
static Eeprom24C01_02 eeprom(EEPROM_ADDRESS);
char* Eprmcon[1];
void setup()
{
Serial.begin(9600);
eeprom.initialize();
const byte address = 0;
int Znach;
Znach = int(eeprom.readByte(1));
delay(5);
Serial.println(Znach);
itoa(Znach, Eprmcon[0],10);
Serial.println(itoa(Znach, Eprmcon[0],10));
}
void loop()
{
}
Здесь пример кода без излишков. Считывание с микросхемы памяти проходит нормально (значение 179), а вот конвертация выдает что-то странное и зацикливает ардуино.
пример того, что видно в порте:
Пардон, забыл удалить const адресс, здесь она не используется.
У вас массив указателей на символы размерностью 1 создан, оно и глючит не по-детски. Надо бы создавать не массив указателей на символы, а массив символов - разницу ощущаете? Надо так:
#include <Wire.h> #include <Eeprom24C01_02.h> #define EEPROM_ADDRESS 0x50 static Eeprom24C01_02 eeprom(EEPROM_ADDRESS); char Eprmcon[10] = {0}; // массив символов из 10 штук, влезет строковое представление числа 123456789, плюс нуль-терминатор void setup() { Serial.begin(9600); eeprom.initialize(); const byte address = 0; int Znach; Znach = int(eeprom.readByte(1)); delay(5); Serial.println(Znach); Serial.println(itoa(Znach, Eprmcon,10)); } void loop() { }Благодарю. Теперь разницу ощущаю. Когда я делал часы, там я действительно указывал массив. Поэтому-то оно и работало.
Здесь я так сделал, т.к. считал, что такая запись создаст массив из 7 строковых символов. Как массив целых чисел, там же допускается такая запись?
Здесь я так сделал, т.к. считал, что такая запись создаст массив из 7 строковых символов. Как массив целых чисел, там же допускается такая запись?
Разница между типом данных и указателем на тип данных - огромная. Сравните:
Более того, размерность указателя и размерность типа данных, на который он указывает - разная. Применительно к AVR размерность указателя - 2 байта, а указывать этот указатель может на структуру размером в 100 байт, например:
typedef struct { byte data[100]; } BigStruct; BigStruct array1[2]; BigStruct* array2[2]; Serial.println(sizeof(array1)); Serial.println(sizeof(array2));Закачайте этот код и посмотрите, что выдаёт в Serial.
помогите пожалусто с синтаксисом....
void Kvitirovanie() // сюда подключим кнопку для сброса сигнализации { noTone(Pin_beep); kvit_dvijenie = true;// переменная сброса сработавшего сигнала, для запрета многоразовой отправки сигнала kvit_septik = true;// переменная сброса сработавшего сигнала, для запрета многоразовой отправки сигнала for (int i=0; i < 10; i++) { char _alarm_int[10]= strcat("alarm",char(i)); // ТУТ ОШИБКА Send_MD_Nev_Val(_alarm_int, arr_alarm[i]); } }КОМПИЛЯТОР выдает ошибку , какието скобки просит а я не соображу никак..
вот как обьявлена у меня функция
что за скобки нужно добавить?
у тебя обьявление массива внутри цикла.
ооо реально не знал этого что нельзя в цыкле обьявлять массив ))
спасибо большое, теперь запомню....
вот так компилируется, осталось размер подровнять и все ок!
void Kvitirovanie() // сюда подключим кнопку для сброса сигнализации { noTone(Pin_beep); kvit_dvijenie = true;// переменная сброса сработавшего сигнала, для запрета многоразовой отправки сигнала // Send_MD_Nev_Val(_alarm, 0); kvit_septik = true;// переменная сброса сработавшего сигнала, для запрета многоразовой отправки сигнала char _alarm_int[10]; for (int i=0; i < 10; i++){ _alarm_int[10] = strcat("alarm",char(i)); Send_MD_Nev_Val(_alarm_int, arr_alarm[i]); } }а так?
_alarm_int = strcat("alarm",char(i));это в циклеооо реально не знал этого что нельзя в цыкле обьявлять массив ))
спасибо большое, теперь запомню....
можно. Дело не в том. что нельзя обьявлять, а в том. что вы этот массив неправильно инициализируете. о чем вам еомпилятор и пишет.
Вот так нельзя:
char _alarm_int[10]= strcat("alarm",char(i));а вот так - можно (даже внутри цикла):
char _alarm_int[10]; _alarm_int = strcat("alarm",char(i));void Kvitirovanie() // сюда подключим кнопку для сброса сигнализации { noTone(Pin_beep); kvit_dvijenie = true;// переменная сброса сработавшего сигнала, для запрета многоразовой отправки сигнала // Send_MD_Nev_Val(_alarm, 0); kvit_septik = true;// переменная сброса сработавшего сигнала, для запрета многоразовой отправки сигнала char _alarm_int[10]; for (int i=0; i < 10; i++){ _alarm_int[10] = strcat("alarm",char(i)); Send_MD_Nev_Val(_alarm_int, arr_alarm[i]); } }может и компилируется, но это неправильно. Работать не будет. В строке 9 вы присваиваете 11-ому элементу массива _alarm_int (в котором всего десять мест!) указатель на символ. Это бред.
Разберитесь наконец, как пользоваться строковыми массивами и не пишите чушь.
b707 мммм, спасибо за подсказку, перечитал по вашему совету статью, вот ссылка оставлю чтоб не потерялась http://rsdn.org/article/cpp/cstr.xml и переписал функцию, сделал вот так
void Kvitirovanie() // сюда подключим кнопку для сброса сигнализации { char _alarm_int[10]; for (int i=0; i < 10; i++){ sprintf (_alarm_int, "%s%d", "alarm", i); // Send_MD_Nev_Val(_alarm_int, arr_alarm[i]); Serial.println(_alarm_int); } }вот и вывод ее
может конечно и можно сделать по другому.....
может конечно и можно сделать по другому.....
Конечно можно - в программировании все можно сделать несколькими способами. Но и ваш код уже вполне нормальный, мне за такой стыдно не было бы...