EEPROM, char* и int

Lictor
Offline
Зарегистрирован: 01.10.2015

Добрый день. 

Столкнулся с проблемой, на экран можно выводить только переменные типа 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), а вот конвертация выдает что-то странное и зацикливает ардуино. 

пример того, что видно в порте:

Lictor
Offline
Зарегистрирован: 01.10.2015

Пардон, забыл удалить const адресс, здесь она не используется.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

У вас массив указателей на символы размерностью 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()
{

}

 

Lictor
Offline
Зарегистрирован: 01.10.2015

Благодарю. Теперь разницу ощущаю. Когда я делал часы, там я действительно указывал массив. Поэтому-то оно и работало.

Здесь я так сделал, т.к. считал, что такая запись создаст массив из 7 строковых символов. Как массив целых чисел, там же допускается такая запись?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Lictor пишет:

Здесь я так сделал, т.к. считал, что такая запись создаст массив из 7 строковых символов. Как массив целых чисел, там же допускается такая запись?

Разница между типом данных и указателем на тип данных - огромная. Сравните:

int array[5]; // массив из 5 переменных типа int

int* array2[5]; // массив из указателей на 5 переменных типа int

Более того, размерность указателя и размерность типа данных, на который он указывает - разная. Применительно к AVR размерность указателя - 2 байта, а указывать этот указатель может на структуру размером в 100 байт, например:

typedef struct
{
 byte data[100];
} BigStruct;

BigStruct array1[2];
BigStruct* array2[2];

Serial.println(sizeof(array1));
Serial.println(sizeof(array2));

Закачайте этот код и посмотрите, что выдаёт в Serial.

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

помогите пожалусто с синтаксисом....

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]);
     }	
}

КОМПИЛЯТОР выдает ошибку , какието скобки просит а я не соображу никак..

mega.ino:In function 'void Kvitirovanie()'
mega.ino:655:46: error: array must be initialized with a brace-enclosed initializer
Error compiling

вот как обьявлена у меня функция 

void Send_MD_Nev_Val( char* namePin,int & val_int)

что за скобки нужно добавить?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

у тебя обьявление массива внутри цикла.

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

ооо реально не знал этого что нельзя в цыкле обьявлять массив ))

спасибо большое, теперь запомню....

вот так компилируется, осталось размер подровнять и все ок!

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]);
      }	
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а так? 

_alarm_int = strcat("alarm",char(i));

это в цикле

b707
Offline
Зарегистрирован: 26.05.2017

Baks пишет:

ооо реально не знал этого что нельзя в цыкле обьявлять массив ))

спасибо большое, теперь запомню....

можно. Дело не в том. что нельзя обьявлять, а в том. что вы этот массив неправильно инициализируете. о чем вам еомпилятор и пишет.

Вот так нельзя:

char _alarm_int[10]= strcat("alarm",char(i));

а вот так - можно (даже внутри цикла):

char _alarm_int[10];
_alarm_int = strcat("alarm",char(i)); 

Baks пишет:
вот так компилируется, осталось размер подровнять и все ок!

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 (в котором всего десять мест!) указатель на символ. Это бред.

Разберитесь наконец, как пользоваться строковыми массивами и не пишите чушь.

 

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

 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);
      } 
}

вот и вывод ее 

alarm0
alarm1
alarm2
alarm3
alarm4
alarm5
alarm6
alarm7
alarm8
alarm9
 то что надо!

может конечно и можно сделать по другому.....

b707
Offline
Зарегистрирован: 26.05.2017

Baks пишет:

 может конечно и можно сделать по другому.....

Конечно можно -  в программировании все можно сделать несколькими способами. Но и ваш код уже вполне нормальный, мне за такой стыдно не было бы...