Mam następujący problem. Napisałem sobie strukturę:
struct strOut
{
uint8_t ownNumber;
uint8_t modulWidth;
uint8_t modulsAmount;
uint8_t modulType;
uint8_t font;
uint8_t color;
uint8_t speed;
uint8_t effect;
uint8_t brightness;
uint8_t hardwareOutNumber;
uint8_t align;
uint16_t *buffer;
char *text;
void (*StatFun)(struct strOut*);
void (*StepFun)(struct strOut*);
};
typedef struct strOut Out;
extern Out Out_JP1, Out_JP2;
Następnie zainicjalizowałem sobie te strukturę poprzez wywołanie funkcji:
void InitStruct(Out *str)
{
//odczytywanie wartości z pamięci eeprom
str->hardwareOutNumber = eeprom_read_byte(&ee_hardwareOutNumber_out[str->ownNumber]);
str->brightness = eeprom_read_byte(&ee_brightness_out[str->ownNumber]);
str->modulsAmount = eeprom_read_byte(&ee_modulsAmount_out[str->ownNumber]);
str->modulType = eeprom_read_byte(&ee_modulType_out[str->ownNumber]);
str->modulWidth = eeprom_read_byte(&ee_modulWidth_out[str->modulWidth]);
//zerowanie pozostałych pól stuktury
str->font = 0;
str->color = 0;
str->speed = 0;
str->effect = 0;
str->align = ALIGN_CENTER;
//alokacja pamięci dla bufora
str->buffer = (uint16_t*) calloc (str->modulsAmount*str->modulWidth, sizeof(uint16_t));
//alokacja pamięci dla tablicy znaków
str->text = (char*) calloc (str->modulsAmount*(str->modulWidth), sizeof(char));
}
Teraz w funkcji main robie sobie coś takiego:
Out_JP1.text[0] = 'a';
Out_JP1.text[1] = 'b';
Out_JP1.text[2] = 'c';
Out_JP1.text[3] = 0x00;
Out_JP2.text[0] = '1';
Out_JP2.text[1] = '2';
Out_JP2.text[2] = '3';
Out_JP2.text[3] = 0x00;
A następnie w petli nieskończonej:
while(1)
{
ShowTextStart(&Out_JP1);
ShowTextStart(&Out_JP2);
_delay_ms(500);
Out_JP1.text = &Out_JP1.text[0];
Out_JP2.text = &Out_JP2.text[0];
}
Funkcja ShowTextStart przesuwa mi wskaźnik po kolejnych elementach struktury, czyli wywołuje kilkukrotnie str->text++ (tak upraszczając);
Po wykonaniu funkcji chciałbym wrócić na pierwsza pozycje tablicy, jeśli zamiast
Out_JP1.text = &Out_JP1.text[0];
Out_JP2.text = &Out_JP2.text[0];
wstawię:
Out_JP1.text = Out_JP1.text -= 3;
Out_JP2.text = &Out_JP2.text -= 3;
to wszystko jest ok, bo funkcja ShowTextStart przesuwa wskaźnik o 3 pozycje (str->text += 3);
Ale przesunięcie w funkcji ShowTextStart może być różne.
Nie wiem jak mam traktować zapis np Out_JP1.text = "Ala ma kota"; Rozumiem, że taka operacja nie wpisuje mi ciągu do mojej alokowanej pamięci ale ustawia wewnętrzny wskaźnik struktury na tablicę "Ala ma kota". Czyli w ten sposób utraciłem referencje do tablicy zaalokowanej? Czy da się w takim razie tej tablicy w strukturze używać jak zwykłej tablicy?
Czy zapis
Out_IP1.text[0] = 'a' ;
Out_IP1.text[1] = 'b' ;
Out_IP1.text[2] = 'c' ;
Out_IP1.text[3] = 0x00 ;
oznacza coś innego niż
Out_JP1.text = "abc";
Chodzi mi generalnie o tablice w strukturze alokowana dynamicznie, do której mogę wpisywać sobie co mi przyjdzie do głowy.
Tzn, że na zewnątrz moge używać jej jak zwykłej globalnej tablicy.