Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

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

Ostatnio zmodyfikowano 2015-08-28 11:06
Autor Wiadomość
bercikw
Temat założony przez niniejszego użytkownika
Tablica z elementami odwołującymi się do kilku struktur
» 2015-08-27 21:53:24
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.
P-136941
carlosmay
» 2015-08-27 22:13:43
Spróbuj rzutowania wszystkiego na jeden typ (najlepiej na typ o największej precyzji).
P-136947
pekfos
» 2015-08-27 22:14:25
Gdybym nie jasno opisał problem złożę wyjaśnienia.
Najlepiej razem z kodem, którym próbowałeś rozwiązać problem.
P-136949
bercikw
Temat założony przez niniejszego użytkownika
» 2015-08-27 22:33:42
Przesyłam kod - nie umiem jednak znaleźć na tym forum znaczników <code> :(
C/C++
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 );
        }
    }
P-136953
pekfos
» 2015-08-28 11:06:24
nie umiem jednak znaleźć na tym forum znaczników <code> :(
A co masz pod pierwszym postem tematu..?
P-136974
« 1 »
  Strona 1 z 1