Pobieranie z internetu, a komunikaty kompilatora

0

Mam następującą procedurę pobierającą pliki z internetu. Zauważyłem jednak iż kompilator zgłasza iż niektóre ze zmiennych w procedurze Download nie zostały użyte...

uses WinInet;

procedure TForm.Download(const URL: String; FileName: String);
var
 {Bufor zawierający ściągnięty fragment pliku}
 Buffer : array[1..1024] of Byte;
 hSession, hURL : HINTERNET;
 dwRead, dwBufLen, dwIndex, dwSize : DWORD;
 F : File;
 pBuf : Pointer;
 TotalRead : Integer;
begin
 hSession := InternetOpen('Fast Download', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
 Application.ProcessMessages;

  try
   {Otwarcie podanego adresu URL}
   hURL := InternetOpenURL(hSession, PChar(URL), nil, 0, 0, 0);
   Application.ProcessMessages;

   dwBufLen := 1024;
   dwIndex := 0;
   GetMem(pBuf, dwBufLen);

   {Pobranie informacji na temat wielkości pliku}
   HttpQueryInfo(hURL, HTTP_QUERY_CONTENT_LENGTH, pBuf, dwBufLen, dwIndex);
   dwSize := StrToInt(StrPas(pBuf));
   ProgressBar.Max := (dwSize div 1024);

   FreeMem(pBuf, dwBufLen);

   try
    AssignFile(F, FileName);
     try
      Rewrite(F, 1);
      repeat
       InternetReadFile(hURL, @Buffer, SizeOf(Buffer), dwRead);
       BlockWrite(F, Buffer, dwRead);
       TotalRead := TotalRead + dwRead;

       Application.ProcessMessages;
       Label_Postep.Caption := 'Pobrano ' + IntToStr(TotalRead div 1024) + ' kB z ' + IntToStr(dwSize div 1024) + ' kB';
       ProgressBar.Position := TotalRead div 1024; // 1
      until dwRead = 0;
     finally
      CloseFile(F);
     end;
   finally
     InternetCloseHandle(hSession);
   end;
 finally
   InternetCloseHandle(hURL); // 2
 end;

 // pobrano...
end;

Pola // liczba wskazują gdzie kompilator odwołuje się:
[Warning] Code_File.pas(1455): Łączone znaki i nie-znaki typów - należy rozszerzyć oba argumenty // 1
[Warning] Code_File.pas(1458): Zmienna 'TotalRead' nigdy nie została użyta // 1
[Warning] Code_File.pas(1468): Zmienna 'hURL' nigdy nie została użyta // 2

Dlaczego jest źle i jak to poprawić ? [soczek] Dziękuję

0

Daj komunikaty nie przepuszczone przez translatora, my umiemy po angielsku, a np. pierwszy komunikat brzmi bez sensu (pewno chodzi o signed and unsigned types :) )

0
brodny napisał(a)

Daj komunikaty nie przepuszczone przez translatora, my umiemy po angielsku, a np. pierwszy komunikat brzmi bez sensu (pewno chodzi o signed and unsigned types :) )

Sami obcokrajowcy :D

[Warning] Code_File.pas(1457): Combining signed and unsigned types - widened both operands
[Warning] Code_File.pas(1460): Variable 'TotalRead' might not have been initialized
[Warning] Code_File.pas(1470): Variable 'hURL' might not have been initialized

0
Opi napisał(a)

[Warning] Code_File.pas(1460): Variable 'TotalRead' might not have been initialized
[Warning] Code_File.pas(1470): Variable 'hURL' might not have been initialized

Opi napisał(a)

[Warning] Code_File.pas(1458): Zmienna 'TotalRead' nigdy nie została użyta
[Warning] Code_File.pas(1468): Zmienna 'hURL' nigdy nie została użyta

No widzisz to jest złe tłumaczenie. Nie chodzi o to, że nie została użyta tylko nie została zainicjowana, czyli podczas pierwszego odwołania może mieć wartość losową

0

Nie - MOGŁA nie zostać zainicjalizowana. Często tak wychodzi, gdy inicjalizacja odbywa się wewnątrz bloku try, a w except lub finally korzystamy z tej zmiennej.

0
brodny napisał(a)

Nie - MOGŁA nie zostać zainicjalizowana. Często tak wychodzi, gdy inicjalizacja odbywa się wewnątrz bloku try, a w except lub finally korzystamy z tej zmiennej.

w tym konkretnym przypadku (TotalRead) akurat NIE ZOSTAŁA - pierwsze odwołanie do niej wygląda tak
TotalRead := TotalRead + dwRead;
a wypadało by ją gdzieś najpierw wyzerować

BTW jest też tak jeśli inicjujesz jakąś zmienną np. w bloku case i Ty wiesz, że na pewno któryś warunek się wykona a kompilator nie musi tego wiedzieć, np.

var
  x, y: integer;
begin
...
  //ustawienie x na 1, 2 lub 3 i żadne inne
  case x of
    1: y := 1;
    2: y := 2;
    3: y := 3;
  end;
  ShowMessage(IntToStr(y)); //tu zakrzyczy, że może być niezainicjowana
end;
0

Dzięki Misiekd za wytłumaczenie. Zrobiłem według twojej wypowiedzi: Dodałem "wyzerowanie" zmiennej:

TotalRead := 0;

i jest OK.

Pozostała jeszcze zmienna:

hURL : HINTERNET;

Jej nie da się przecież wyzerować.

brodny: czyli w bloku

finally end;

i except end;

 poprostu usunąć jej wywołanie ?

oraz: [Warning] Code_File.pas(1457): Combining signed and unsigned types - widened both operands
0

Misiekd: nie wpatrywałem się w kod, miałem na myśli tylko komunikat - że mogła zostać niezainicjalizowana, ale nie musiała.

Opi: nie czytasz ze zrozumieniem :) A co do komunikatu ostatniego - dotyczy on porównywania (albo dodawania czy coś w tym stylu) zmiennych ze znakiem i bez.

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