Tablica z elementami odwołującymi się do kilku struktur

0

Witam kolegów na forum,

Ze względu na przejrzystość kodu chciałbym stworzyć tablicę, w której zmiana jednego elementu wpływać będzie na elementy struktur.

Przejrzyście bowiem jest aby zmiany odbywały się w pętli for i zmieniały po kolei każdy element tablicy. Nie chcę bowiem tworzyć kilku pętli, osobno dla każdej ze struktur.

Domyślam się, że trzeba będzie operować na wskaźnikach ale moje próby spełzły na niczym. Ponieważ nie potrafię tego zrobić, gdyż kompilator zarzuca niezgodność typów ze względu na to, że jedne elementy są typu int a inne doble.

Gdybym nie jasno opisał problem złożę wyjaśnienia.

0

Rzuć może przykładem tego, co chcesz osiągnąć.

0

Ja chyba rozumiem o co ci chodzi. Spakuj po prostu to w dodatkowe klasy/struktury skoro są jakoś powiązane. Niech elementem tablicy będzie struktura ze wskaźnikami do tych zależnych struktur.

0

Wrzucam kod z wyciętym wszystkim co nie dotyczy przykładu. Chodzi mi o modyfikację tablicy parametry_menu przy jednoczesnej zmianie elementów PID_channel_1 i PID_channel_2

PID PID_channel_1,PID_channel_2;

int	*paremetry_menu[Liczba_parametrow];

const char *elementy_menu[Liczba_parametrow] =
{
	"Tz",
	"Kp",
	"Ki",
	"Kd",
	"Tp",
	"I",
	"U"
};

ISR(INT0_vect)
{
	_delay_ms(30);
	LCD_Clear();


	// PD7 S7 - menu
	// PD6 S6 - Przesun pozycje w menu
	// PD5 S5 -
	// PD4 S4 -
	// PD3 S3 - +
	// PD1 S2 - -

	//  76543210 -- 2 to przerwanie
	switch(PIND)
	{
		case 0b01111011:
							menu_aktywne=~menu_aktywne;
							LCD_Clear();
							break;
							
		case 0b10111011:
							pozycja_w_menu++;
							if(pozycja_w_menu>Liczba_parametrow-1) pozycja_w_menu=0;
							break;
	case 0b11111001
							paremetry_regulatora[pozycja_w_menu]=paremetry_regulatora[pozycja_w_menu]-0.1;
							break;

	case 0b11111000
							paremetry_regulatora[pozycja_w_menu]=paremetry_regulatora[pozycja_w_menu]+0.1;
							break;
	}
}


int main(void)
{


	PID_channel_1.wartosc_maksymalna_calki=100.0;
	PID_channel_1.y_min=-50.0;
	PID_channel_1.y_max=50.0;		//wartosc minimalna i maksymalna wyjscia regulatora
	PID_channel_1.OCR=3.0;		//Tymczasowe zmienne zmiennoprzecinkowe są potrzebne do przeprowadzania dokładnych obliczeń związanych z regulacją PID
	PID_channel_1.OCR_min=0;
	PID_channel_1.OCR_max=65535;
	PID_channel_1.Tz=30.1,			//0 - temperatura zadana
	PID_channel_1.Kp=0.1,			//1 - Kp
	PID_channel_1.Ki=0.1,			//2 - Ki
	PID_channel_1.Kd=0.1,			//3 - Kd
	PID_channel_1.Tp=0.001024;		//4 - Tp co tyle jest taktowany zegar

	paremetry_menu[0]=&PID_channel_1.Tz;
	paremetry_menu[1]=&PID_channel_2.Tz;


    while(1)
    {
		if (wcisnieto_guzik==1)
		{
			wcisnieto_guzik=0;
			LCD_Clear();
		}

		if (menu_aktywne==0)
		{
			PCF_GetDateTime(&czas_systemowy);

			sprintf(linia_LCD_1,"%2.1f|%2.1f|%02d:%02d",	temperatura,		temperatura_sec_channel,		czas_systemowy.hour,czas_systemowy.minute);
			sprintf(linia_LCD_2,"%2.1f|%2.1f|",				PID_channel_1.Tz,	PID_channel_2.Tz);

			LCD_WriteTextInLine1(linia_LCD_1);
			LCD_WriteTextInLine2(linia_LCD_2);
		} 
		else
		{
			if (linia_LCD_1[0]!='M' && linia_LCD_1[1]!='E') LCD_Clear(); //skasuj LCD po pierwszym wejściu

			if (pozycja_w_menu>Liczba_parametrow-1) pozycja_w_menu=0;
			sprintf(linia_LCD_1,"MENU:");
			sprintf(linia_LCD_2,"%d - %s:",pozycja_w_menu,elementy_menu[pozycja_w_menu]);
			LCD_WriteTextInLine1(linia_LCD_1);
			LCD_WriteTextInLine2(linia_LCD_2);
		}
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1