Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

prosty problem z poprawną dyspozycją danych w strukturze

bua 02 Maj 2007 23:58 594 2
  • #1 02 Maj 2007 23:58
    bua
    Poziom 12  

    witam.
    Mam taki problem, przy próbie wyświetlania pól struktury, wychodzą błędy...weźmy pod młotek pierwsze 2 pola,
    po wyświetleniu ich otrzymuje o dziwo perwsze pole + 2 dodatkowe znaki,
    z drugim jest to samo wyświetla mi 4 znaki zamiast 2-ch.
    Niby powinno być dla każdego pola znak zera dla ostatniego elementu i niby wpisuje to ostatnie 0 ale i tak coś jest nie tak,
    proszę może ktoś przeanalizuje kod.
    Najprawdopodobniej problem tkwi gdzieś w funkcji scopy(char*,char*).

    Code:
           ......
    


    typedef struct {
            BYTE   gga_header[6];            // offset = 0
            BYTE   gga_time_h[2];            // offset = 6+1
            BYTE   gga_time_m[2];            // offset = 9+1   
            BYTE   gga_time_s[2];            // offset = 12+1
            BYTE   gga_time_ts[4];           // offset = 15+1
       .................... itd...
            }_gga;


    void scopy(char* skad, char* dokad, char ile){        // tutaj ten wskaźnik   
                                                                       //na char  dokad mi się nie
                                                                     //podoba ale powinno działać
                     for(ile; ile > 0x00; ile--){
                              *dokad = *skad;
                              dokad++;
                              skad++;
                              };
             
                              *dokad = 0;            // tutaj niby dopisuje na końcu
                                                          //   każdego pola to zero




    };
    .....
    .....

    void put_into_gga(BYTE* wsk,_gga* wsk_gps_data){
         BYTE i;
         BYTE flaga = 0x01;
         BYTE* temp_wsk = wsk;
         _gga* temp_wsk_gps_data = wsk_gps_data;
    ....
    ....
    ....
    //     memcpy(wsk,temp_wsk_gps_data->gga_header,6);   //memcpy było tylko do testów i to       
                                                                                                       //samo sie działo
                 scopy(wsk,      temp_wsk_gps_data -> gga_header,          6);
                //     memcpy(temp_wsk_gps_data->gga_header,wsk+7,    6);
                 scopy(wsk + 7,  temp_wsk_gps_data -> gga_time_h,         2);
                     scopy(wsk + 9, temp_wsk_gps_data -> gga_time_m,     2);
                     scopy(wsk + 12,  temp_wsk_gps_data -> gga_time_s,   2);
                     scopy(wsk + 15, temp_wsk_gps_data -> gga_time_ts,   4);
                     scopy(wsk + 20,  temp_wsk_gps_data -> gga_latitude,   8);
            .....
            .....
    /*****************FUNKCJA MAIN ******************/     
                             
    int main(int argc, char *argv[])
    {
      _gga gps_data;
      // w buforze jest całe zdanie "$GPGGA,152566.777,..............."
      put_into_gga(&bufor[0], &gps_data);
    /*tutaj już z palca prubuję dopisać te zera, ale wyświetla się taka kupa że mało, tzn. tylko header reszty już nie ma */
      gps_data.gga_header[6]=0;
      gps_data.gga_time_h[2]=0;
      gps_data.gga_time_m[2]=0;
      gps_data.gga_time_s[2]=0;
      gps_data.gga_time_ts[4]=0;
      gps_data.gga_latitude[8]=0;
      gps_data.gga_NS[2]=0;
      gps_data.gga_longtitude[9]=0;
      gps_data.gga_EW[1]=0;
      gps_data.gga_quality[1]=0;
      gps_data.gga_satelite_quantity[2]=0;
     
      printf("\n oto nasz naglowek: %s\n",gps_data.gga_header);
      printf("\n godzina: %s:",gps_data.gga_time_h);
      printf("%s:",gps_data.gga_time_m);
      printf("%s:",gps_data.gga_time_s);
    .....
    .....

      BYTE i=0;

      while(gps_data.gga_header[i]!=0){
      printf("%c",gps_data.gga_header[i]);
      i++;
    };


    Moze powinienem zapisywac w sposob analizujacy przecinki w buforze, może takie podejscie przyniesie lepsze efekty.
    czy problem tkwi rzeczywiście tylko w wyświetlaniu, bo teoretycznie w tych polach znajdują się odpowiednie liczby tylko dziwne że sie wyświetla od razu następne pole....
    jeśli wyświetlam np. pole ze środka to już naprawde jest dużo więcej danych (np. 15 znaków ) dla obszaru 2 bajtowego,
    jak dopisuje zera ręcznie jak w funkcji main to wyświetla tylko nagłówek i dalej nic już nie widzi jakby wszędzie były te zera

    jutro popracuje nad tym dalej, dzisiaj już naprawde nie widze żadnych błędów.

    pzdr i dzięki za wszelkie sugestie

    ps. celowo nie używam funkcji modyfikujących stringi z biblotek standardowych, testy z memcpy itp. strcpy przyniosły podobne złe efekty...

    0 2
  • Pomocny post
    #2 03 Maj 2007 00:54
    robson_s-ec
    Poziom 14  

    Przede wszystkim wydaje mi się, że nie zdajesz sobie sprawy z tego, że w C/C++ tablice są numerowane od 0. Tak więc tablica zdeklarowan tak:

    Code:
    char bufor[5];

    Jest 5-cio elementową tablicą o elementach, do których możemy się tak odwołać:
    Code:
    bufor[0]='a';
    
    bufor[1]='z';
    bufor[2]='1';
    bufor[4]=NULL;

    Natomiast w przypadku tablicy 5-cio elementowej
    Code:
    bufor[5]=0; // ŹLE!!!

    jest już wyjściem poza tablicę.

    Dodano po 2 [minuty]:

    A no i do stringów lepiej użyj char, zamiast BYTE.

    0
  • #3 03 Maj 2007 09:27
    bua
    Poziom 12  

    robson_s-ec napisał:
    Przede wszystkim wydaje mi się, że nie zdajesz sobie sprawy z tego, że w C/C++ tablice są numerowane od 0.


    Tzn z tego że tablice są numerowane od 0 to wiedziałem tylko dałem plame bo wydawało mi się że aż do owej 5 która jest jej ostatnim elementem( czytaj. 6-tym ) do którego wprowadzam NULL,
    szkolny błąd ale dzięki bo zapomniałem o tym.
    Cytat:
    Code:
    bufor[0]='a';
    
    bufor[1]='z';
    bufor[2]='1';
    bufor[4]=NULL;

    Zgubiłeś tutaj bufor[3] = ....


    Cytat:
    A no i do stringów lepiej użyj char, zamiast BYTE.

    Nie podałem tego ale w kodzie przy deklaracjach funkcji preprocesora jest:
    Code:
    #define BYTE char
    
    #define WORD short
    #define DWORD int


    Dzięki za rade popracuje, ale myśle że to będzie to.
    pzdr,

    Dodano po 10 [minuty]:

    Okej jak ręką odjął...:D
    Wszystko działa ładnie i pięknie, wystarczyło przerobić :
    Code:


    typedef struct {
            BYTE   gga_header[6];            // offset = 0
            BYTE   gga_time_h[2];            // offset = 6+1
            BYTE   gga_time_m[2];            // offset = 9+1   
            BYTE   gga_time_s[2];            // offset = 12+1
            BYTE   gga_time_ts[4];           // offset = 15+1
       .................... itd...
            }_gga;


    na:
    Code:


    typedef struct {
            BYTE   gga_header[7];            // offset = 0
            BYTE   gga_time_h[3];            // offset = 6+1
            BYTE   gga_time_m[3];            // offset = 9+1   
            BYTE   gga_time_s[3];            // offset = 12+1
            BYTE   gga_time_ts[5];           // offset = 15+1
       .................... itd...
            }_gga;



    Wielkie dzięki robson bo nie wiem ile bym jeszcze nad tym klękał i bym do tego nie doszedł, za to że ktoś zajrzał w kod i go poanalizował daje pochwałe.

    0