Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[C++] Prosta struktura - sortowanie.

zupazkrokodyla 24 Mar 2010 10:28 1529 2
  • #1
    zupazkrokodyla
    Level 2  
    Proszę, wyselekcjonowałem to, co nie działa poprawnie w moim kodzie (w mniejszy program ilustrujący mój problem):

    Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    typedef struct struktura{
           int val;
    }struktura;



    void merge(struktura *wskaz, int poczatek, int srodek, int koniec){
       struktura* tab[16];
       int i=poczatek, j=srodek+1, licznik=0;
       while(i!=srodek+1 && j!=koniec+1){
             if((wskaz+i)->val >(wskaz+j)->val){
                   tab[licznik]=(wskaz+j);
                   ++j;
                   ++licznik;
             }
             else{
                   tab[licznik]=(wskaz+i);
                   ++i;
                   ++licznik;
             }
        }
       while(j!=koniec+1){
             tab[licznik]=(wskaz+j);
             ++j;
             ++licznik;
       }
          while(i!=srodek+1){
                tab[licznik]=(wskaz+i);
             ++i;
             ++licznik;
       }
       memcpy(wskaz, tab, 16*sizeof(struktura));
    }

    void merge_sort(struktura *wsk, int poczatek,  int koniec){
       int srodek;
       if(poczatek!=koniec){
             srodek=(poczatek+koniec)/2;
             merge_sort(wsk, poczatek, srodek);
             merge_sort(wsk, srodek+1, koniec);
             merge(wsk, poczatek, srodek, koniec);
        }
    }

    int main(){
       int a;
       struktura *wsk_struct = (struktura*) malloc (16 *sizeof(struktura));
       int tablica[]={12, 3, 4, 2, 7, 9, 44, 90, 21, 32, 56, 29, 13, 14, 6, 10};
       for(a=0; a<16; ++a){
             (wsk_struct+a)->val=tablica[a];
             printf("%d ", tablica[a]);
       }
       printf("\n");
       merge_sort(wsk_struct, 0, 15);
       for(a=0; a<16; ++a)
              printf("%d ", (wsk_struct+a)->val);
       printf("\n");
       getchar();
       return 0;
    }



    Czy mógłby mi ktoś wskazać co i dlaczego robię źle w celu posortowania struktury?
  • #2
    nsvinc
    Level 35  
    po co ci struktura w ktorej jest TYLKO INT?!

    Czy ty znasz zastosowanie struktur? Po co przepisujesz stałą tablicę intów
    do dynamicznej tablicy intów (bo w efekcie wlasnie to osiągasz alokując na stercie miejsce na te swoje struktury)...

    1. Nieeleganckie otagowanie struktury - Dlaczego typ u ciebie nazywa się tak samo jak tag?... eleganckim rozwiazaniem jest np. coś takiego:
    Code:

    typedef struct _tText
       {
       u8 id;
       u8 *text; //pointer to text
       u8 fill; //fill
       s16 x,y; //position
       u16 rx,ry; //reference
       tColor color; //fade color start,stop
       u32 deffont:1;
       tFont *font;
       void **object; //pointer to pointer array
       u16 objIndex; //pointer index in pointer array
       u8 spacing; //text spacing
       u8 wrap:1; //word wrap
       u8 xcenter:1; //x
       u8 ycenter:1; //y
       u16 ex,ey;
       } tText;
    //mala literka "t" przed nazwa informuje ze tLiczby to TYP, a nie docelowa zmienna...


    2. Struktura z jednym intem nie ma sensu. Rdzeniowi zajmie więcej czasu dostęp do tablicy struktur niż prostej tablicy intów (chociaż to już zależy
    od inteligencji kompilatora i ficzerów rdzenia)...
    Proponowane rozwiazanie:
    Code:

    int *tablicaIntow;
    ...
    tablicaIntow=malloc(sizeof(int)*moj_rozmiar);


    3. Cast typu zwracanego przez malloc jest bezcelowy. Malloc zawsze zwraca domyslny wskaznik na void, ktory AUTOMATYCZNIE rzutuje się na typ, do ktorego przypisujesz powrót malloc-a.
    Pierwsze Prawo Magii: Castuj gdy dokonujesz DEREFERENCJI wskaznika

    4. Nigdzie nie sprawdzasz co zwraca malloc...
    Drugie Prawo Magii: Po kazdym uzyciu malloc-a SPRAWDZAJ IF-em ten
    wskaznik, do ktorego przypisales powrót tej funkcji, czy PRZYPADKIEM NIE JEST ZEREM.

    Jeśli malloc zwróci zero, to:
    a) brakło ci sterty - Powieksz rozmiar sterty lub gdy brakuje ci ramu, uzyj wiekszego procka
    b) nie zadeklarowales uzycia sterty - linker nie wie gdzie ma miejsce na sterte
    Jesli bedziesz dokonywał zapisu pod zerowy wskaznik, procek walnie faultem i najpewniej bedzie wisiał w ISR-rze tego faulta az do resetu... Jeśli będziesz czytać spod zerowego wskaznika to odczytasz badziewie (tj. informacje ktorych wogole nie chcesz znać :D )

    5. Pierwsze Prawo Elektrody: NIE MA WSRÓD NAS WRÓŻEK.
    Sprecyzuj na jaki procesor piszesz, z jakiego srodowiska korzystasz, jak objawia
    się niedziałanie twojego programu...

    6. Przyklad pracy na wskaznikach, typach strukturalnych i dynamicznych tablicach
    Code:

    //KOD ZAMIESZCZONY W CELACH EDUKACYJNYCH. STANOWI MOJĄ WŁASNOŚĆ INTELEKTUALNĄ!

    tText *napis;

    napis=malloc(sizeof(tText)); //parent tText
    napis->id=idText;
    napis->x=5;
    napis->y=2;
    napis->text="TEKST1";
    napis->deffont=1;
    napis->color.color=0x1FFF;
    napis->objIndex=3;
    napis->fill=tFillSolid;
    napis->ex=32767;
    napis->spacing=2;

    napis->object=malloc(sizeof(*(napis->object)));
    *(napis->object)=malloc(sizeof(tText));
    ((tText*)(*(napis->object)))->id=idText;
    ((tText*)(*(napis->object)))->text="parent->potomek1";
    ((tText*)(*(napis->object)))->x=15;
    ((tText*)(*(napis->object)))->y=22;
    ((tText*)(*(napis->object)))->deffont=1;
    ((tText*)(*(napis->object)))->color.color=0xFFFF;
    ((tText*)(*(napis->object)))->objIndex=1;
    ((tText*)(*(napis->object)))->fill=tFillSolid;
    ((tText*)(*(napis->object)))->spacing=2;
    ((tText*)(*(napis->object)))->ex=32767;

    ((tText*)(*(napis->object)))->object=malloc(sizeof( *(((tText*)(*(napis->object)))->object) ));
    (*(((tText*)(*(napis->object)))->object))=malloc(sizeof(tText));
    ((tText*)(*(((tText*)(*(napis->object)))->object)))->id=idText;
    ((tText*)(*(((tText*)(*(napis->object)))->object)))->text="parent->potomek1->potomek1";
    ((tText*)(*(((tText*)(*(napis->object)))->object)))->x=15;
    ((tText*)(*(((tText*)(*(napis->object)))->object)))->y=12;
    ((tText*)(*(((tText*)(*(napis->object)))->object)))->deffont=1;
    ((tText*)(*(((tText*)(*(napis->object)))->object)))->color.color=0xA0BE;
    ((tText*)(*(((tText*)(*(napis->object)))->object)))->objIndex=0;
    ((tText*)(*(((tText*)(*(napis->object)))->object)))->fill=tFillSolid;
    ((tText*)(*(((tText*)(*(napis->object)))->object)))->spacing=2;
    ((tText*)(*(((tText*)(*(napis->object)))->object)))->ex=32767;

    napis->object=realloc(napis->object,2*sizeof(*(napis->object)));
    *(napis->object+1)=malloc(sizeof(tText));
    ((tText*)(*(napis->object+1)))->id=idText;
    ((tText*)(*(napis->object+1)))->text=malloc(sizeof(u8)*64);
    sprintf(((tText*)(*(napis->object+1)))->text,"To Jest Tekst Z Sprintfa: %u",fps);
    ((tText*)(*(napis->object+1)))->x=15;
    ((tText*)(*(napis->object+1)))->y=50;
    ((tText*)(*(napis->object+1)))->deffont=1;
    ((tText*)(*(napis->object+1)))->color.color=0xFFFF;
    ((tText*)(*(napis->object+1)))->objIndex=1;
    ((tText*)(*(napis->object+1)))->fill=tFillSolid;
    ((tText*)(*(napis->object+1)))->spacing=2;
    ((tText*)(*(napis->object+1)))->ex=32767;
  • #3
    qudi
    Level 15  
    Witam !!! Mógłbyś konkretniej powiedzieć na czym polega twój problem bo wiesz sam kod to trochę nie ułatwia sprawy... powiedz coś więcej, to może ktoś pomoże