Usuwanie elementów ze środka dynamicznej tablicy struktur

0

Zagadnienie jest takie - moja usługa pracuje w oparciu o następującą strukturę:

struct filedelays
{
    int cat;
    int elements;
    long time_to; 
};

struct filedelays cur_delay[32];

struct reg
{
    char ID[7];
    char last_val[10];
};

struct reg **registers;

Działa to w taki sposób, że pierwsza tablica stanowi nagłówek, który mówi ile jest elementów w danym zbiorze i jak długo dane mają się przetwarzać, a druga to konkretne adresy oraz wartości, które są pobierane z zewnątrz.

Sęk w tym, że to jest dynamiczne - użytkownik może sobie zażądać dodatkowych danych. Zrobiłem to w taki sposób, że jak dany zbiór się przeterminowuje, to indeks tabel się dekrementuje i pamięć jest realokowana i czyszczona po starych danych - czyli kolejka LIFO w dużym skrócie. Niestety jest problem - jeżeli szybciej się przeterminuje zbiór w środku stosu - w kibel idą wówczas wszystkie zbiory, które powinny być wciąż aktywne. Innymi słowy chodzi o to, żeby wyjąć naleśnik ze środka styrty. Jak w sposób najbardziej elegancki i optymalny rozwiązać to zagadnienie?

Można na chama - dodać flagę IsActive do struktury filedelays i ją gasić przy przeterminowaniu, minus jest taki, że pamięć będzie puchła. Można klasycznie - zrzucać elementy na osobną styrtę zbiór po zbiorze, aż dojdzie się do tego deaktywowanego i potem przerzucić dobre z powrotem - rozwiązanie fajne, ale dosyć skomplikowane jeżeli chodzi o ilość operacji.

A może dałoby się jakoś jeszcze inaczej?

K

4

Zrób prawdziwą kolejkę na liście dwukierunkowej i można bez problemu usuwać że środka.
Albo jeszcze lepiej kolejka kolejek, w sensie że masz już rozbite na paczki, usuwasz całą paczkę o ile na "górnej" liście jest więcej niż 1 element (head && head!=tail) oraz ostatnia już się wczytała.

http://forum.4programmers.net/1221015

Gdyby jednak zdecydowałeś się przejść na nowsze technologie:
https://4programmers.net/Forum/C_i_C++/364314-blad_segmentation_fault_w_liscie_dwukierunkowej?p=1874719#id1874719

0
_13th_Dragon napisał(a):

Gdyby jednak zdecydowałeś się przejść na nowsze technologie:
https://4programmers.net/Forum/C_i_C++/364314-blad_segmentation_fault_w_liscie_dwukierunkowej?p=1874719#id1874719

Dzięki. Tam jest naklepane 1300 linii kodu w ramach tej usługi, wątpię czy klient by chciał nam zapłacić za przepisanie ;)

2
kal800 napisał(a):

Dzięki. Tam jest naklepane 1300 linii kodu w ramach tej usługi, wątpię czy klient by chciał nam zapłacić za przepisanie ;)

1300 - toż max 11h pracy!!!
A policz ile tracisz na babranie się w czystym C?

4
_13th_Dragon napisał(a):

A policz ile tracisz na babranie się w czystym C?

To chyba nie babranie, ale religia

kal800 napisał(a):> > Dzięki. Tam jest naklepane 1300 linii kodu w ramach tej usługi, wątpię czy klient by chciał nam zapłacić za przepisanie ;)

A ile mu udzieliłeś rabatów za wycieki? Czy ukrywasz to ?
Dlaczego o ekonomice kodowania najczęściej się odzywają autorzy kodu niewygórowanej jakości

0

@ZrobieDobrze:
Jak nie masz nic konstruktywnego do powiedzenia, to sobie daruj te szczeniackie uwagi, bo g*o wnoszą do tematu, a swoje żale i przemyślenia zachowaj dla siebie.

@_13th_Dragon:
Chyba się przekonam do C++, ale już przy okazji kolejnego tematu. Zagadnienie, o którym piszę tutaj to tylko przysłowiowa kropka nad i - 95% funkcjonalności jest zaimplementowane i działa już produkcyjnie, zatem nie ma specjalnie sensu tego teraz rozgrzebywać. Jak będzie kolejny przyrost funkcjonalny, to rozważę. Póki co pokombinuję z kolejką jak sugerowałeś, jeszcze raz dzięki.

1
kal800 napisał(a):

@ZrobieDobrze:
Jak nie masz nic konstruktywnego do powiedzenia, to sobie daruj te szczeniackie uwagi, bo g*o wnoszą do tematu, a swoje żale i przemyślenia zachowaj dla siebie.

To co napisał @ZrobieDobrze naprawdę jest bardzo konstruktywne, to że tego nie widzisz oznacza jedynie twoją ignorancje.
Ad 1. Co do religii... Zwyczajnie zapytaj szefa czemu nie przejść na C++ a się przekonasz że to jednak religia (no chyba że się zgodzi).

Ad 2. Co do udzielenia rabatów to często właśnie tak wygląda bo firma niby nie chce ponosić strat w związku z czym robi drobne przeróbki po kosztach albo i nieco poniżej i nikt nawet nie jest w stanie (a ci co są w stanie siedzą i milczą aby nie podpaść) obliczyć że przy 2-j (może 4-j) takiej poprawce już idą straty, bo w C++ o wiele łatwiej. Przy 1300 wierszy to może okazać się że już przy 1-ej poprawce taniej na C++ przejść z całością.

0
_13th_Dragon napisał(a):

Zwyczajnie zapytaj szefa czemu nie przejść na C++ a się przekonasz że to jednak religia (no chyba że się zgodzi).

Tylko, że ja nie mam szefa. Co więcej, nawet nie muszę kodować, bo mam od tego ludzi w swojej firmie, robię to tylko niejako z zamiłowania i żeby trochę pomóc - tyle jest roboty, poza tym mogę sobie pozwolić na to, żeby się pobabrać w C. Niejako szefami są nasi klienci i akurat w tym przypadku wspólnie ustaliliśmy z działem IT taką a nie inną technologię, więc dyskusja, żeby od niej odejść nie ma imo sensu.

0
kal800 napisał(a):
_13th_Dragon napisał(a):

Zwyczajnie zapytaj szefa czemu nie przejść na C++ a się przekonasz że to jednak religia (no chyba że się zgodzi).

Tylko, że ja nie mam szefa. Co więcej, nawet nie muszę kodować, bo mam od tego ludzi w swojej firmie, robię to tylko niejako z zamiłowania i żeby trochę pomóc - tyle jest roboty, poza tym mogę sobie pozwolić na to, żeby się pobabrać w C. Niejako szefami są nasi klienci i akurat w tym przypadku wspólnie ustaliliśmy z działem IT taką a nie inną technologię, więc dyskusja, żeby od niej odejść nie ma imo sensu.

jeśli tak dostojne gremium weteranów C zaprojektowało strukturę zaczynająca się od 7 bajtów, to kajam się w pyle i popiele i nie mam więcej pytań.

0
ZrobieDobrze napisał(a):
kal800 napisał(a):
_13th_Dragon napisał(a):

Zwyczajnie zapytaj szefa czemu nie przejść na C++ a się przekonasz że to jednak religia (no chyba że się zgodzi).

Tylko, że ja nie mam szefa. Co więcej, nawet nie muszę kodować, bo mam od tego ludzi w swojej firmie, robię to tylko niejako z zamiłowania i żeby trochę pomóc - tyle jest roboty, poza tym mogę sobie pozwolić na to, żeby się pobabrać w C. Niejako szefami są nasi klienci i akurat w tym przypadku wspólnie ustaliliśmy z działem IT taką a nie inną technologię, więc dyskusja, żeby od niej odejść nie ma imo sensu.

jeśli tak dostojne gremium C zaprojektowało strukturę zaczynająca się od 7 bajtów, to kajam się w pyle i popiele

A kto powiedział, że to cała definicja struktury? Wkleiłem kawałek kodu, żeby zobrazować o co mi chodziło w KONKRETNYM zagadnieniu, a nie żeby dawać kod do recenzji, poza tym pozostałe identyfikatory pól mogłyby wskazywać na konkretnego klienta, a tego mi robić nie wolno.

0

Cze o ile dobrze rozumiem problem to ja robię tak:
tablica pointerów alokowana - trzymasz jej wielkość.
I na każdy pointer oddzielna alokacja struktury.

Dodajesz nowe rekordy:
Sprawdzasz czy na tablicy pointerów masz poiner do struktury NULL jak tak to malloc struktura.
Jezeli wszystko używane:
realloc tablica pointerów, malloc strukturka ( aktualizujesz wielkość tablicy )
Usuwasz pozycje ? Free pointer struktury i ustawiasz wskaźnik na NULL. Nie ruszasz tablicy

Ewentualnie raz na dłużej możesz wszystko przenieść do nowej pamięci aby zmniejszyć tablicę. Zależy jak to się rozrasta.
Pewnie można to olać. Oczywiście aktualizujesz wtedy wielkość tablicy.
__

Może też być coś w rodzaju odsyłania z jednej struktury do kolejnej pointerem.
Jak usuwasz jedną to przekierowujesz na kolejną strukturę,
__

Ps olej pomysły zmiany języka chyba, ze sam tego naprawdę pragniesz.

0

Poradziłem sobie inaczej - w momencie jak nowy zbiór wchodzi, to program sortuje tablicę według czasu ważności i w ten sposób element, który wypada pierwszy jest zawsze u góry stosu. Usunięcie polega na realokacji pamięci oraz dekrementacji indeksu. Złożoność związana z przesortowaniem ma marginalne znaczenie, ponieważ mówimy o 10-15 elementach maksymalnie.

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