[Algorytmy][C++] Średnia liczb z danego obszaru pamięci

royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[Algorytmy][C++] Średnia liczb z danego obszaru pamięci

Post autor: royas »

Czyli masz jednak masz do dyspozycji jednego float i możesz sobie dodać int*
No to tak:

Kod: Zaznacz cały

float srednia (int* w1, int* w2) {
   int* t;
   if (w1>w2) swap (w1,w2) //jeśli nie możesz użyć swap to ręcznie używając t
   float suma=0.0;
   t=w1; 
   while (t<=w2) suma += *(t++);
   return suma/(w2-w1+1);
}
A lepszym rozwiązaniem by było gdyby suma mogła być int. I wtedy tylko jedna konwersja na float przy dzieleniu.
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[Algorytmy][C++] Średnia liczb z danego obszaru pamięci

Post autor: Ser Cubus »

kropek wprowadził zmienną i, która liczy ile jest wyrazów więc jego rozwiązanie odpada

royas:
To wyrażenie zwróci chyba ilość bitów +1 ?

Kod: Zaznacz cały

w2-w1+1
nie trzeba tutaj sizeof?

edit:
Twoje rozwiązanie działa, tylko nie rozumiem dlaczego

jeżeli w2 jest wskaźnikiem to:
w2 = adres
w2 - w1 = różnica adresów / typ
?

Tak by wynikało z Twojego poprzedniego posta
Ostatnio zmieniony 4 sty 2013, o 14:21 przez Ser Cubus, łącznie zmieniany 1 raz.
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[Algorytmy][C++] Średnia liczb z danego obszaru pamięci

Post autor: royas »

Nie. Zwróci to co trzeba czyli ile intów jest pomiędzy nimi. Tak jakbyś działał na indeksach tablicy.
Tak samo jak int*wsk; wsk+1 da adres następnego inta, a nie adres przesunięty o jeden bit (technicznie niemożliwe) czy bajt.
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[Algorytmy][C++] Średnia liczb z danego obszaru pamięci

Post autor: Ser Cubus »

ok, dzięki wielkie

edit:
z ciekawości, jak uzyskać różnicę adresów między wskaźnikami?
&wsk1 - &wsk2 ?
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[Algorytmy][C++] Średnia liczb z danego obszaru pamięci

Post autor: royas »

Możesz próbować tak ((int)wsk1)-((int)wsk2) ale nie jestem pewny czy na każdej architekturze/systemie otrzymasz to co chcesz.
kopek11111
Użytkownik
Użytkownik
Posty: 36
Rejestracja: 28 lis 2011, o 13:26
Płeć: Mężczyzna
Lokalizacja: Chorzele
Podziękował: 13 razy

[Algorytmy][C++] Średnia liczb z danego obszaru pamięci

Post autor: kopek11111 »

Odejmujesz wskaźnik o mniejszym adresie od wskaźnika o większym adresie:

Kod: Zaznacz cały

wsk_wieksze-wsk_mniejsze
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[Algorytmy][C++] Średnia liczb z danego obszaru pamięci

Post autor: Ser Cubus »

kropek, mylisz się, przeczytaj posty royasa o tej tematyce

chociaż też do końca tego nie rozumiem, kompilator zachowuje się tak jak royas mówi
witekkq
Użytkownik
Użytkownik
Posty: 145
Rejestracja: 16 lis 2007, o 09:06
Płeć: Mężczyzna
Lokalizacja: Gniezno
Podziękował: 2 razy
Pomógł: 27 razy

[Algorytmy][C++] Średnia liczb z danego obszaru pamięci

Post autor: witekkq »

Kod: Zaznacz cały

((int)wsk_max-(int)wsk_min)/sizeof(int)  =  wsk_max-wsk_min
dlaczego? dlatego że zapis po prawej stronie ma robić dokładnie to co ten po lewej, tylko kompilator przelicza to sobie w zależności od architektury na jaką kompilujesz i rozmiaru int`a w tym przypadku, dzięki czemu nie musisz pisać pełnej formy ani tym bardziej kusić się o wpisanie wartości statycznych.
Ostatnio zmieniony 5 sty 2013, o 10:04 przez Afish, łącznie zmieniany 1 raz.
Powód: Stosuj tagi code.
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[Algorytmy][C++] Średnia liczb z danego obszaru pamięci

Post autor: royas »

Tylko to po lewej czasami może nie zadziałać.
ODPOWIEDZ