Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

Таинственные переменные
https://zx.oberon.org/forum/viewtopic.php?f=79&t=401
Страница 1 из 1

Автор:  Len [ 22 сен 2018, 13:22 ]
Заголовок сообщения:  Таинственные переменные

Я продолжил фрагмент программы, предложенной Zorko. Но у меня получилось не то, что бы криво, а как-то даже странно. Обратите внимание на переменные j, a в строке 6. Они вроде-бы нигде не учавствуют и без них программа компилируется, но работает она совсем по-другому (для этого в обеих случаях надо вставить флешку перед запуском процедуры): с этими переменными программа выводит количество свободной памяти на флешке, без них - не выводит.
Код: "OBERON"
  1. IMPORT StdLog, WinApi;
  2.  
  3. CONST numberOfSteps = 134217728;(*количество шагов в цикле, а также размер записываемого файла*)
  4.  
  5. PROCEDURE Start*;
  6. VAR i, j, numberOfDisks, a: INTEGER;
  7. b: WinApi.PtrSTR;
  8. drives: SET;
  9. drivesString: ARRAY 32 OF ARRAY 2 OF SHORTCHAR;
  10. boolInt: INTEGER;
  11. i1, i2, i3, i4: INTEGER;
  12. lage: LONGINT;
  13. BEGIN
  14. drives := BITS(WinApi.GetLogicalDrives ());
  15. i := 0;
  16. numberOfDisks := 0;
  17. REPEAT
  18. IF i IN drives THEN
  19. drivesString[numberOfDisks, 0] := SHORT(CHR(i + 97));
  20. StdLog.String(drivesString[numberOfDisks] + ":" );
  21. drivesString[numberOfDisks, 1] := ":";
  22. IF WinApi.GetDriveType(drivesString[numberOfDisks]) = WinApi.DRIVE_REMOVABLE THEN
  23. StdLog.String(" съёмный диск; Количество свободного места на диске: ");
  24. boolInt := WinApi.GetDiskFreeSpace("g:", i1, i2, i3, i4);
  25. lage := i3 * i2 * LONG(i1);
  26. IF lage > numberOfSteps THEN
  27. StdLog.Real(lage);
  28. StdLog.String (" байт;");
  29. END;
  30. StdLog.Ln;
  31. END;
  32. StdLog.Ln;
  33. INC(numberOfDisks)
  34. END;
  35. INC(i)
  36. UNTIL i = 31;
  37. END Start;
  38.  

Автор:  Len [ 22 сен 2018, 13:38 ]
Заголовок сообщения:  Re: Таинственные переменные

В BB 1.7 во время выполнения выдаёт ошибку, в v 1.5 ошибку выдаёт только на 32 разрядной платформе, но не смотря на это в рабочий журнал выводятся разные сообщения.

Автор:  Comdiv [ 22 сен 2018, 14:35 ]
Заголовок сообщения:  Re: Таинственные переменные

Для строк требуется завершающий 0, а так - в массиве неопределённый мусор, который смещается в зависимости от количества объявленных переменных.

Автор:  Zorko [ 23 сен 2018, 16:42 ]
Заголовок сообщения:  Re: Таинственные переменные

Len, зачем UNTIL i = 31 ? Сколько букв в латинском алфавите?

Автор:  Len [ 24 сен 2018, 12:10 ]
Заголовок сообщения:  Re: Таинственные переменные

26. Исправил.

Автор:  Zorko [ 24 сен 2018, 14:03 ]
Заголовок сообщения:  Re: Таинственные переменные

Без обид, но именно большое внимание к деталям отличает хорошего программиста от посредственного. Так считаю.

Страница 1 из 1 Часовой пояс: UTC + 2 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/