🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.c
11 messages
11 total messages Started by heby Wed, 05 Apr 2023 10:38
Mapa zakresów
#310451
Author: heby
Date: Wed, 05 Apr 2023 10:38
20 lines
1551 bytes
Cześć.

Rozgladam się za czymś eleganckim w rodzaju:

Foo< jakieśtamtypy > map = {
  { { 0x0000, 0x1fff }, range1lambda }
  { { 0x2000, 0x20ff }, range2lambda }
  { { 0x8000, 0xffff }, range3lambda }
  };

... i użyciem jakoś w rodzaju:

foo[ address ]( data );

Co ma spowodować selekcję prawidłowej "lambda" na podstawie zakresu 
"address" i wywołanie lambdy.

Jast jakiś gotowiec do tego w boost? Czy rekodzieło? Przejrzałem boosta, 
stackoverlow, ale nie widze od ręki lub przeoczyłem. Niby jest 
boost:range, ale jakoś mapy tego typu wprost nie widzę.
Re: Mapa zakresów
#310452
Author: Maciek Godek
Date: Wed, 05 Apr 2023 20:14
37 lines
2475 bytes
środa, 5 kwietnia 2023 o 12:39:02 UTC+2 heby napisał(a):
> Cześć. 
> 
> Rozgladam się za czymś eleganckim w rodzaju: 
> 
> Foo< jakieśtamtypy > map = { 
> { { 0x0000, 0x1fff }, range1lambda } 
> { { 0x2000, 0x20ff }, range2lambda } 
> { { 0x8000, 0xffff }, range3lambda } 
> }; 
> 
> ... i użyciem jakoś w rodzaju: 
> 
> foo[ address ]( data ); 
> 
> Co ma spowodować selekcję prawidłowej "lambda" na podstawie zakresu 
> "address" i wywołanie lambdy. 
> 
> Jast jakiś gotowiec do tego w boost? Czy rekodzieło? Przejrzałem boosta, 
> stackoverlow, ale nie widze od ręki lub przeoczyłem. Niby jest 
> boost:range, ale jakoś mapy tego typu wprost nie widzę.

Tak na szybko to bym wymyślił takie coś:

int address_range(intptr_t address) {
  return 1*(0x0000 <= address && address < 0x2000) 
          + 2*(0x2000 <= address && address < 0x20ff)
          + 3*(0x8000 <= address && address < 0xffff);
}

void (*function[4])(void *) = { ... };

void dispatch(intptr_t address, void *data) {
    function[address_range(address)](data);
}

(chyba że zakresy byłyby równe - wtedy bym użył operatora dzielenia)
Re: Mapa zakresów
#310453
Author: Maciek Godek
Date: Wed, 05 Apr 2023 20:24
5 lines
1617 bytes
Chyba że chcesz te zakresy dynamicznie zmieniać - w takiej sytuacji bym spróbował czegoś w rodzaju

https://en.wikipedia.org/wiki/Range_tree

(coś mi mrugnęło że w booście jest coś co się nazywa "R-tree", może się nadaje?)
Re: Mapa zakresów
#310455
Author: heby
Date: Wed, 05 Apr 2023 20:27
15 lines
1716 bytes
On 05/04/2023 22:14, Maciek Godek wrote:
> Tak na szybko to bym wymyślił takie coś:
> int address_range(intptr_t address) {
>    return 1*(0x0000 <= address && address < 0x2000)
>            + 2*(0x2000 <= address && address < 0x20ff)
>            + 3*(0x8000 <= address && address < 0xffff);

Elegancko miało być ;)

> (chyba że zakresy byłyby równe - wtedy bym użył operatora dzielenia)

Nie są. To mapa pamięci pewnego systemu uC i każda z funkcji ma 
delegować do innej części kodu obsługującego dostęp.

Innymi słowy: ranges różne, ale stabilne w runtime.
Re: Mapa zakresów
#310454
Author: heby
Date: Wed, 05 Apr 2023 20:30
5 lines
1451 bytes
On 05/04/2023 22:24, Maciek Godek wrote:
> (coś mi mrugnęło że w booście jest coś co się nazywa "R-tree", może się nadaje?)

Jest boost::geometry::index::rtree ale wygląda jak armata na muchy. Jak 
nic innego się nie znajdzie, to pomyślę. Dzięki.
Re: Mapa zakresów
#310456
Author: Ghost
Date: Sun, 23 Apr 2023 09:23
18 lines
1868 bytes
W dniu 05.04.2023 o 22:27, heby pisze:
> On 05/04/2023 22:14, Maciek Godek wrote:
>> Tak na szybko to bym wymyślił takie coś:
>> int address_range(intptr_t address) {
>>    return 1*(0x0000 <= address && address < 0x2000)
>>            + 2*(0x2000 <= address && address < 0x20ff)
>>            + 3*(0x8000 <= address && address < 0xffff);
> 
> Elegancko miało być ;)
> 
>> (chyba że zakresy byłyby równe - wtedy bym użył operatora dzielenia)
> 
> Nie są. To mapa pamięci pewnego systemu uC i każda z funkcji ma 
> delegować do innej części kodu obsługującego dostęp.
> 
> Innymi słowy: ranges różne, ale stabilne w runtime.

stworz sobie odpowiednia funkcje mieszajaca
Re: Mapa zakresów
#310457
Author: heby
Date: Sun, 23 Apr 2023 09:58
4 lines
1312 bytes
On 23/04/2023 11:23, Ghost wrote:
> stworz sobie odpowiednia funkcje mieszajaca

Mogę, dla zanim to zrobię, pytam o gotowiec.
Re: Mapa zakresów
#310458
Author: Przemek Biernat
Date: Thu, 27 Apr 2023 16:44
27 lines
2066 bytes
On Wednesday, April 5, 2023 at 12:39:02 PM UTC+2, heby wrote:
> Cześć. 
> 
> Rozgladam się za czymś eleganckim w rodzaju: 
> 
> Foo< jakieśtamtypy > map = { 
> { { 0x0000, 0x1fff }, range1lambda } 
> { { 0x2000, 0x20ff }, range2lambda } 
> { { 0x8000, 0xffff }, range3lambda } 
> }; 
> 
> ... i użyciem jakoś w rodzaju: 
> 
> foo[ address ]( data ); 
> 
> Co ma spowodować selekcję prawidłowej "lambda" na podstawie zakresu 
> "address" i wywołanie lambdy. 
> 
> Jast jakiś gotowiec do tego w boost? Czy rekodzieło? Przejrzałem boosta, 
> stackoverlow, ale nie widze od ręki lub przeoczyłem. Niby jest 
> boost:range, ale jakoś mapy tego typu wprost nie widzę.

Proponował był tablice 

jakiśtamtyp* tab

i przeliczanie indeksu do typu integer kolejno
Re: Mapa zakresów
#310459
Author: Przemek Biernat
Date: Thu, 27 Apr 2023 16:47
27 lines
2062 bytes
On Wednesday, April 5, 2023 at 12:39:02 PM UTC+2, heby wrote:
> Cześć. 
> 
> Rozgladam się za czymś eleganckim w rodzaju: 
> 
> Foo< jakieśtamtypy > map = { 
> { { 0x0000, 0x1fff }, range1lambda } 
> { { 0x2000, 0x20ff }, range2lambda } 
> { { 0x8000, 0xffff }, range3lambda } 
> }; 
> 
> ... i użyciem jakoś w rodzaju: 
> 
> foo[ address ]( data ); 
> 
> Co ma spowodować selekcję prawidłowej "lambda" na podstawie zakresu 
> "address" i wywołanie lambdy. 
> 
> Jast jakiś gotowiec do tego w boost? Czy rekodzieło? Przejrzałem boosta, 
> stackoverlow, ale nie widze od ręki lub przeoczyłem. Niby jest 
> boost:range, ale jakoś mapy tego typu wprost nie widzę.

Proponowałbym tablice:

jakistamtyp*  tab;

i przeliczanie indeksu kolejno
Re: Mapa zakresów
#310460
Author: Wojciech Muła
Date: Mon, 22 May 2023 17:45
25 lines
2226 bytes
On Wednesday, April 5, 2023 at 12:39:02 PM UTC+2, heby wrote:
> Cześć. 
> 
> Rozgladam się za czymś eleganckim w rodzaju: 
> 
> Foo< jakieśtamtypy > map = { 
> { { 0x0000, 0x1fff }, range1lambda } 
> { { 0x2000, 0x20ff }, range2lambda } 
> { { 0x8000, 0xffff }, range3lambda } 
> }; 
> 
> ... i użyciem jakoś w rodzaju: 
> 
> foo[ address ]( data ); 
> 
> Co ma spowodować selekcję prawidłowej "lambda" na podstawie zakresu 
> "address" i wywołanie lambdy. 
> 
> Jast jakiś gotowiec do tego w boost? Czy rekodzieło? Przejrzałem boosta, 
> stackoverlow, ale nie widze od ręki lub przeoczyłem. Niby jest 
> boost:range, ale jakoś mapy tego typu wprost nie widzę.

To chyba by pasowało. https://www.boost.org/doc/libs/1_82_0/libs/icl/doc/html/index.html

w.
Re: Mapa zakresów
#310461
Author: heby
Date: Mon, 22 May 2023 17:47
4 lines
1214 bytes
On 22/05/2023 19:45, Wojciech Muła wrote:
> To chyba by pasowało. https://www.boost.org/doc/libs/1_82_0/libs/icl/doc/html/index.html

O dzięki, poczytam.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads