Wątek zablokowany 2014-03-06 15:52 przez msm.

Funkcja delphi na c++

2014-03-04 17:57
Ania27
0

Witam

Czy mógłby ktoś mi przepisać tę funkcję na c++ ?
Nie znam delphi a ucze się programować w c++Builder personal

procedure BitmapBlur(var theBitmap: TBitmap);
var
  x, y: Integer;
  yLine,
  xLine: PByteArray;
begin
  for y := 1 to theBitmap.Height -2 do begin
    yLine := theBitmap.ScanLine[y -1];
    xLine := theBitmap.ScanLine[y];
    for x := 1 to theBitmap.Width -2 do begin
      xLine^[x * 3] := (
        xLine^[x * 3 -3] + xLine^[x * 3 +3] +
        yLine^[x * 3 -3] + yLine^[x * 3 +3] +
        yLine^[x * 3] + xLine^[x * 3 -3] +
        xLine^[x * 3 +3] + xLine^[x * 3]) div 8;
      xLine^[x * 3 +1] := (
        xLine^[x * 3 -2] + xLine^[x * 3 +4] +
        yLine^[x * 3 -2] + yLine^[x * 3 +4] +
        yLine^[x * 3 +1] + xLine^[x * 3 -2] +
        xLine^[x * 3 +4] + xLine^[x * 3 +1]) div 8;
      xLine^[x * 3 +2] := (
        xLine^[x * 3 -1] + xLine^[x * 3 +5] +
        yLine^[x * 3 -1] + yLine^[x * 3 +5] +
        yLine^[x * 3 +2] + xLine^[x * 3 -1] +
        xLine^[x * 3 +5] + xLine^[x * 3 +2]) div 8;
    end;
  end;
end;

tagi <code>

edytowany 1x, ostatnio: msm, 2016-12-13 18:26

Pozostało 580 znaków

2014-03-04 18:33
0

yLine,xLine:PByteArray jest odpowiednikiem unsigned char *yLine,*xLine; pętle chyba rozumiesz, operacje matematyczne też powinieneś, zamiast div zwykłe dzielenie /.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-03-04 19:19
Ania27
0

Dziękuje
Po wszystkim funkcja wygląda tak:


bool TForm1::Blur(Graphics::TBitmap *lpBmp)
{
    if( !lpBmp )
        return false;

    int x, y;
    unsigned char *yLine,*xLine;

    try
    {
        for( y = 1; y<lpBmp->Height-2;y++ )
        {
            yLine = (Byte*)lpBmp->ScanLine[y-1];
            xLine = (Byte*)lpBmp->ScanLine[y];

            for( x = 1; x < lpBmp->Width-2; x++ )
            {
                xLine[x*3]    = ( xLine[x * 3 -3] + xLine[x * 3 +3] + yLine[x * 3 -3] + yLine[x * 3 +3] + yLine[x * 3] + xLine[x * 3 -3] + xLine[x * 3 +3] + xLine[x * 3])  / 8;
                xLine[x*3 +1] = ( xLine[x * 3 -2] + xLine[x * 3 +4] + yLine[x * 3 -2] + yLine[x * 3 +4] + yLine[x * 3 +1] + xLine[x * 3 -2] + xLine[x * 3 +4] + xLine[x * 3 +1]) / 8;
                xLine[x*3 +2] = ( xLine[x * 3 -1] + xLine[x * 3 +5] + yLine[x * 3 -1] + yLine[x * 3 +5] + yLine[x * 3 +2] + xLine[x * 3 -1] + xLine[x * 3 +5] + xLine[x * 3 +2]) / 8;
            }
        }
        return true;
    }
    catch(...)
    {
        return false;
    }
}

Pozostało 580 znaków

2014-03-04 19:55
1
  1. Używaj przyrostkowej wersji inkrementacji.
  2. for( y = 1; y<lpBmp->Height-1;++y)
    for( x = 1; x < lpBmp->Width-1; ++x)

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Pokaż pozostałe 6 komentarzy
Obrażanie mnie tu nie pomoże. Co wyeliminuje optymalizator w tym kodzie? - vpiotr 2014-03-06 13:39
Optymalizator wyeliminuje niepotrzebne tworzenie kopii wartości zmiennej przed inkrementacją. Nie wiem dla czego cię obraża to co twierdziłeś jakiś miesiąc temu. - _13th_Dragon 2014-03-06 15:30
Po co W TYM KODZIE miałby kompilator tutaj tworzyć jakąś kopię??? Mam wrażenie, że Elles miał jednak rację. - vpiotr 2014-03-06 15:46
Może różnie rozumiemy "W TYM KODZIE". W którym tym? - _13th_Dragon 2014-03-06 15:49
W tym pod którym są te komentarze, to oczywiste. - vpiotr 2014-03-06 15:51

Pozostało 580 znaków

2014-03-05 00:03
Ania27
0

Czemu? jaka jest różnica?

szybciej dziala - fasadin 2014-03-05 09:48
Mam nadzieje że -1 zauważyłaś. - _13th_Dragon 2014-03-05 10:32
@fasadin: nie zawsze szybciej dziala, ale na pewno standardowa implementacja nie bedzie wolniejsza. - n0name_l 2014-03-06 06:53

Pozostało 580 znaków

2014-03-06 13:57
0

Nie będę zaczynał kolejnego wątku dla takiej bzdury, ale tu przykład w załącznikach - czym się różni post inkrementacja od pre-inkrementacji.

ASM z VS 2010 (debug, optymalizator OFF).

Podsumowując - NICZYM.


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2014-03-06 14:08
0

Widzę, że walka tutaj trwa między ++x, a x++ :)
Może ten link rozwiąże tą walkę: http://www.tantalon.com/pete/[...]syougo.htm#UsePrefixOperators wersja prefix lepiej wpływa na wydajność.

edytowany 1x, ostatnio: jackoi, 2014-03-06 14:08
To jest przykład dla własnego operatora. Nie ma zastosowania w przypadku int-a. - vpiotr 2014-03-06 14:12
Jest tam pokazana optymalizacja własnego operatora post inkrementacji, używającego pre inkrementacji. A wykres jest dla wydajności post i pre. Czytając z wykresu, pre inkrementacja dla int wykona się o "0.01" szybciej. - jackoi 2014-03-06 14:16
To zależy co się testowało, ale na pewno nie ten nieszczęsny for o którym tu mowa. - vpiotr 2014-03-06 14:24

Pozostało 580 znaków

2014-03-06 15:27
0

Dla swojego testu w GCC Explorer i braku optymalizacji. Dostałem jedną różnicę. post posiada o jedną więcej linijkę:

movl    $0, %esi

Umiejscowiona jest ona 3 linijki powyżej .L4 nie znam się na asm, więc nie wiem co ona oznacza, ale jest minimalna różnica :)


#include <iostream>
#include <vector>

using namespace std;

void post(vector<int> n) { 
    vector<int>::iterator it = n.begin();
    for(it; it != n.end(); it++) {
        cout << *it << " ";
    }
}

void pre(vector<int> n) {
    vector<int>::iterator it = n.begin();
    for(it; it != n.end(); ++it) {
        cout << *it << " ";
    }
}

int main() {
    vector<int> n;
    for(int i = 0; i < 10; ++i) 
        n.push_back(i);

    post(n);
    pre(n);

    return 0;
}

Kod asm w linku.

Tu masz jedną pętlę z inkrementacją int i dwie z iteratorami. Czego to dowodzi? Przeczytałeś uważnie o czym jest dyskusja? Od czego się zaczęła? - vpiotr 2014-03-06 15:42

Pozostało 580 znaków

2014-03-06 15:52
msm
0

Główny temat wątku (chyba) zakończony, proponuję przenieść się z kłótnią o wyższości ++i nad i++ i odwrotnie do dedykowanego wątku bo robimy sobie wstyd jak zwykle offtopowaniem/kłóceniem się/tym wątkiem.
Jestem tylko zdziwiony że dzielenie w (... xLine[x * 3 +2]) / 8 nie zostało wytknięte i poprawione na wyraźnie lepsze przesunięcie bitowe. ;)

A, tak, zamykam jeśli można.

edytowany 9x, ostatnio: msm, 2014-03-06 15:57

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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