Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

Почему компилятор предупреждает?   Найти похожие ветки 

 
Vovan#1   (2006-09-14 22:53) [0]

Функция должна возвращать трёхмерный массив, а точнее - массив двумерных массивов, каждое из звеньев выделено в тип. Компилятор ругается на то, что значение ф-ии может быть неопределено и это даже при том, что я поставил в самое начало следующий код:


 SetLength(Result, 3);
 for i := Low(Result) to High(Result) do
  begin
   SetLength(Result[i], 1, 1);
   Result[i][0,0] := 0;
  end;


Почему так?


 
Eraser ©   (2006-09-14 23:03) [1]

> [0] Vovan#1   (14.09.06 22:53)

компилятор не на столько умен, чтобы ещё заглядывать какие там операнды в операторе цикла, так что избавиться от предупреждения можно добавив строку Result[i][0,0] := 0; сразу после SetLength(3, 3);

кстати не понял, почему

> SetLength(Result, 3);

Result ведь в данном случае действительно ещё не опеределен!


 
Vovan#1   (2006-09-14 23:14) [2]

>Eraser ©   (14.09.06 23:03) [1]

Если честно, то не внял ни первому, ни второму. Можешь поставить что-надо в код, чтоб наглядно было? И в чём проблема с SetLength(Result, 3)?

Суть в том, что всё работает, но компилятор нервирует.


 
Anatoly Podgoretsky ©   (2006-09-14 23:16) [3]

Кстати, а почему бы не написать сразу SetLength(Result, 3, 1, 1);


 
Eraser ©   (2006-09-14 23:19) [4]

> [2] Vovan#1   (14.09.06 23:14)


> И в чём проблема с SetLength(Result, 3)?

какой тип возращаемый функцией?
допустим если одномерный массив, то все правильно, но все равно значение не определено.
как лечить - написал в [1].


 
Vovan#1   (2006-09-14 23:29) [5]

Возвращает тип
 TSomeType = array of T2DArray;
 T2DArray = array of array of Integer;

Написал в начале:

SetLength(Result, 1, 1, 1);
Result[0, 0, 0] := 0;

Всё равно ругается!

>Anatoly Podgoretsky ©   (14.09.06 23:16) [3]

Я хочу именно сохранить записать SetLength(Result, 3), потому что каждый двумерный массив будет заполнять другая функция, которая его размер и установит. То, что идёт цикл заполнения сразу - это я сейчас написал для примера.


 
Eraser ©   (2006-09-14 23:42) [6]

> [5] Vovan#1   (14.09.06 23:29)


> Компилятор ругается на то, что значение ф-ии может быть
> неопределено и это даже при том, что я поставил в самое
> начало следующий код:
>
>
> SetLength(Result, 3);
> for i := Low(Result) to High(Result) do
>  begin
>   SetLength(Result[i], 1, 1);
>   Result[i][0,0] := 0;
>  end;

type
 T2DArray = array of array of Integer;
 TSomeType = array of T2DArray;
...
function SomeFn: TSomeType;
var
 i: Integer;
begin
 SetLength(Result, 3);
 for i := Low(Result) to High(Result) do
 begin
   SetLength(Result[i], 1, 1);
   Result[i][0,0] := 0;
 end;
end;

компилятор не ругается.


 
Vovan#1   (2006-09-14 23:50) [7]

В твоём примере если удалить тело функции, то тоже ругаться не будет. Я уже вытался локализовать ошибку. Но не получилось.

Мой код у меня ругается. Двойной щелчок по сообщению [Warning] xxx.pas(479): W1035 Return value of function "xxx" might be undefined выводит на SetLength(Result, 3). Чего-то тут не то.


 
Eraser ©   (2006-09-14 23:56) [8]

> [7] Vovan#1   (14.09.06 23:50)
> В твоём примере если удалить тело функции, то тоже ругаться
> не будет.

в моем примере, как он есть - не ругается.


 
Джо ©   (2006-09-14 23:59) [9]

Мы имеем дело со случаем, известным под названием "Партизан на допросе в Гестапо".


 
Anatoly Podgoretsky ©   (2006-09-15 00:35) [10]

Vovan#1   (14.09.06 23:29) [5]
Это не для предупреждения сообщения, а оптимизация, зачем делать выделение в цикле.


 
Mike Petrichenko   (2006-09-15 01:42) [11]

Перед SetLength(Result, 3)
пиши Result := nil;
Ругаться не будет :)
Вопрос, что это даст?


 
Anatoly Podgoretsky ©   (2006-09-15 13:19) [12]

Может ругаться и не будет, но все равно значение ф-ии может быть неопределено.


 
Vovan#1   (2006-09-15 18:42) [13]

В общем, сегодня я, обвинённый в невыдаче кода, скопировал проект и стал всё удалять, оставляя эту функцию и следя за варнингами компилятора. SetLength как была, так и осталась. В результате дошло до того, что если удаляешь то, про что компилятор пишет - assigned value is never used, то исчезает варнинг про неопределённость результата. Если удаляешь неиспользуемую переменную - тоже исчезает варнинг. Если упрощаешь выражение, значение которого не используется - пропадает варнинг.

Вот вам код:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

 type
 TPixelArray = array of array of Integer;
 Tsomearray = array of TPixelArray;

 Tsomeset = record
   FullBlack: TColor;
   LettersCount: Integer;
  Similarity: Integer;
  RectWidth: Integer;
  RectHeight: Integer;
  gogol: Boolean;
  propolis: Integer;
  propolis2: Integer;
 end;

function somefunct(var B: TPixelArray; S: Tsomeset): Tsomearray;

implementation

{$R *.dfm}

type
 TLetterColors = array [1..3] of TColor;

type
 PColorFreq = ^TColorFreq;
 TColorFreq = record
   Color: TColor;
   Freq: Integer;
 end;

function somefunct(var B: TPixelArray; S: Tsomeset): Tsomearray;
var
 FL: TList;
 x, y, n, m, i, k: Integer;
 x1, y1: Integer;
 H1, H2, S1, S2, L1, L2: Word;
 W, H: Integer;
 Temp: TPixelArray;
 LC: TLetterColors;
 IsInside: Boolean;
 InsideStart: Integer;
 InsideEnd: Integer;
 DoneLetter: Boolean;
 CI: PColorFreq;
 C: Tcolor;
begin
 W := Length(B);
 H := Length(B[0]);

 SetLength(Result, 3);

 for i := 1 to 3 do
  begin
  x := (W - S.RectWidth * 3) div 4 * i     // zakommentitui eto!
  + (S.RectWidth * (i - 2));
   y := 12;

    for y := 0 to H-1 do
     for x := 1 to W-2 do
       If (Result[i-1][x,y] = S.FullBlack) and
          (Result[i-1][x-1,y] <> S.FullBlack) and
          (Result[i-1][x+1,y] <> S.FullBlack) then
           Result[i-1][x,y] := Result[i-1][x-1,y];
    for x := 0 to W-1 do
     for y := 1 to H-1 do
       If (Result[i-1][x,y] = S.FullBlack) and
          (Result[i-1][x,y-1] <> S.FullBlack) and
          (Result[i-1][x,y+1] <> S.FullBlack) then
           Result[i-1][x,y] := Result[i-1][x,y-1];

   if S.gogol then
     begin
      for n := 1 to 2 do
       begin
        IsInside := False;
        InsideStart := 0;
        for y := 0 to H-1 do
          for x := 0 to W-1 do
           begin
             If (not IsInside) and (Result[i-1][x,y] <> S.FullBlack) then
              begin
               IsInside := True;
               InsideStart := x;
             end;
            If (IsInside) and (Result[i-1][x,y] = S.FullBlack) then
             begin
               IsInside := False;
               InsideEnd := x;
               If (InsideEnd-InsideStart) < S.propolis then
                begin
                  for k := InsideStart to InsideEnd do
                   Result[i-1][k,y] := S.FullBlack;
                end;
             end;
           end;
        IsInside := False;
        InsideStart := 0;
        for x := 0 to W-1 do
          for y := 0 to H-1 do
           begin
            If (not IsInside) and (Result[i-1][x,y] <> S.FullBlack) then
             begin
              IsInside := True;
              InsideStart := y;
             end;
            If (IsInside) and (Result[i-1][x,y] = S.FullBlack) then
             begin
               IsInside := False;
               InsideEnd := y;
               If (InsideEnd-InsideStart) < S.propolis2 then
                begin
                  for k := InsideStart to InsideEnd do
                   Result[i-1][x,k] := S.FullBlack;
                end;
             end;
          end;
        end;
      for k := 1 to 2 do
       begin
         for y := 0 to H-1 do
           for x := 1 to W-2 do
           If (Result[i-1][x,y] <> S.FullBlack) and
                (Result[i-1][x-1,y] = S.FullBlack) and
                (Result[i-1][x+1,y] = S.FullBlack) then
                 Result[i-1][x,y] := S.FullBlack;
         for x := 0 to W-1 do
           for y := 1 to H-1 do
           If (Result[i-1][x,y] <> S.FullBlack) and
                (Result[i-1][x,y-1] = S.FullBlack) and
                (Result[i-1][x,y+1] = S.FullBlack) then
                 Result[i-1][x,y] := S.FullBlack;
       end;
     end;
  end;
end;

end.


Или скачайте его:

И объясните мне, почему если закомментировать обозначенную строчку - исчезает варнинг? Почему он вообще есть? И почему про переменную DoneLetter не пишет, что она задекларированна, но не используется, а про другие - пишет. Использую Borland Delphi 2005.


 
Vovan#1   (2006-09-15 18:43) [14]

Ссылку забыл
http://www.speedyshare.com/309606196.html
9 килобайт.


 
Плохиш ©   (2006-09-15 18:49) [15]


> Vovan#1   (15.09.06 18:43) [14]

Хм, хотел сделать доброе дело, но корявые веб-дизайнеры всё обломили :-(



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.046 c
15-1158383746
PSPF2003
2006-09-16 09:15
2006.10.08
.aspx приложения в Д7


11-1134842022
nester
2005-12-17 20:53
2006.10.08
KOL и x64


1-1156764443
Mameluke
2006-08-28 15:27
2006.10.08
Масштабирование окна


2-1158308782
TrainerOfDolphins
2006-09-15 12:26
2006.10.08
loCaseInsensitive


10-1123948782
mufan
2005-08-13 19:59
2006.10.08
TWordApplication - save AS





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский