Elektroda.pl
Elektroda.pl
X
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 1541 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):

    
    #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:
    
    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:
    
    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
    
    //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