Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
6 / 6 / 5
Регистрация: 17.03.2015
Сообщений: 60
1

Поиск ошибки в коде

27.07.2015, 08:54. Показов 1640. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
А вот еще один дурной вопрос от псевдопрограммиста:

следующий код содержит функцию поиска объекта
и участок кода, который производит поиск, а потом делает чего-то с объектом

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// определены переменные
var a: array[0..10] of TObject;
   // предполагается, что элементы массива "а" уже имеют какие-то значения
    b: TObject;
    // переменная "b" для временного хранения значений
 
{
  функция, выполняющая поиск необходимого объекта в массиве
  найденный объект передается через аргумент "Obj"
}
function GetObject( Name: string; var Obj: TObject ): Boolean;
var nn: Integer;
begin
 
for nn := 0 to Length(a) - 1 do
  if not(a[nn] = nil)and(a[nn].ClassName = Name) then Obj := a[nn];
 
// возвращаем TRUE, если объект найден
Result := Obj <> nil;
 
end;
 
{
  а вот часть программы, задающая условия поиска
  и выполняющая над найденными объектами какие-то действия
}
begin
 
if GetObject( 'TEdit', b ) then b.Free;
if GetObject( 'TComboBox', b ) then b.Free;
if GetObject( 'TMemo', b ) then b.Free;
if GetObject( 'TCheckBox', b ) then b.Free;
 
{ ошибка в реализации функции поиска }
 
end.
прошу не цепляться к ClassName = ... и b.Free
это только для примера

ошибка происходит, если объект не найден!
почему, ведь если он не найден (Obj = nil), то функция выдаст FALSE, а в этом случае вызов метода не должен происходить.

Ваши варианты?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2015, 08:54
Ответы с готовыми решениями:

Ошибки в коде
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

Ошибки в коде
Не могу понять в чём суть ошибки :( Unit1.pas(38): W1036 Variable 'j' might not have been...

ошибки в коде
возникла проблемка. вот код: unit Unit3; interface uses Windows, Messages, SysUtils,...

Ошибки в коде
Доброго времени суток. Программа должна удалять по выбору или четную букву, или четное слово, или...

22
20 / 20 / 7
Регистрация: 08.07.2015
Сообщений: 176
27.07.2015, 10:07 2
Если писать пример, то почему бы не написать нормальный пример? Почему у вас функция GetObject находится внутри другой процедуры? Структура такая должна быть
Delphi
1
2
3
4
function
var
begin
end;
Если вы хотите внутри вызывать функцию, то надо делать так
Delphi
1
2
3
4
5
6
7
8
function
var
begin
  CallFunc (par1, procedure(par)
  var
  begin
  end;)
end;
Добавлено через 32 минуты
После
Delphi
1
begin
идет
Delphi
1
end.
а должно идти
Delphi
1
2
  end;
end.
0
6 / 6 / 5
Регистрация: 17.03.2015
Сообщений: 60
27.07.2015, 11:00  [ТС] 3
Вот те раз!
да ниче не должно идти, если в самом начале поставить "program Test1;", тогда получится настоящее консольное приложение!

написано же, где копать:
ошибка происходит, если объект не найден!
почему, ведь если он не найден (Obj = nil), то функция выдаст FALSE, а в этом случае вызов метода не должен происходить.
Вы то хотели, как я понял, замостить этот код сразу в IDE и проверить?
нееееее, мыслите абстрактно
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
27.07.2015, 11:29 4
Лучший ответ Сообщение было отмечено deva1i0 как решение

Решение

Цитата Сообщение от deva1i0 Посмотреть сообщение
почему
Потому что, даже если объект уничтожен, то это вовсе не означает, что b = nil.
0
96 / 84 / 49
Регистрация: 17.09.2014
Сообщений: 670
27.07.2015, 11:30 5
deva1i0, дело не в коде функции... каким образом вы заполняете массив
Delphi
1
a: array[0..10] of TObject
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.07.2015, 12:01 6
Цитата Сообщение от deva1i0 Посмотреть сообщение
прошу не цепляться к ClassName
Чтой-то вдруг не цепляться ?
Ты же ни словом не обмолвился о том могут ли в массиве a[] присутствовать более одного объекта одного и того же класса)
0
6 / 6 / 5
Регистрация: 17.03.2015
Сообщений: 60
27.07.2015, 17:31  [ТС] 7
Да дофига может чего присутствовать, уважаемые читатели!
Спасибо, что хоть в этой теме не цеплялись к моему неаристократическому происхождению :P
а ответы у вас у всех неправильные и копаете вы все не в ту сторону!

при чем здесь, как заполняешь массив? да никак не заполняю! и не буду!
ОШИБКА И БЕЗ НЕГО ЕСТЬ!!!

а ошибка в том, что инициализации переменной b нет! и не будет!

тема закрыта
1
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.07.2015, 20:08 8
Какого же лешего тогда ты обращается к неинициализированной переменной ?)
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
27.07.2015, 20:37 9
Цитата Сообщение от deva1i0 Посмотреть сообщение
а ошибка в том, что инициализации переменной b нет!
Чушь не пори очередную. Глобальные переменные и без твоей помощи инициализируются прекрасно.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,254
28.07.2015, 00:41 10
Цитата Сообщение от FIL Посмотреть сообщение
Чушь не пори очередную. Глобальные переменные и без твоей помощи инициализируются прекрасно.
ТС порет чушь в другом месте. Он (она) сдуру передаёт в функцию переменную Obj с классификатором var, а результат функции возвращается как Boolean.
0
6 / 6 / 5
Регистрация: 17.03.2015
Сообщений: 60
28.07.2015, 06:00  [ТС] 11
Да почему сдуру? Че все такие предвзятые?!
Конечно сдуру! Это ведь код с заранее существующей ошибкой!
Весь текст необходимо считать абстрактным, т.е. переменная может быть и не глобальной.
Чтобы код корректно работал нужно в функцию GetObject первым делом вставить Obj := nil;
И чего не нравится в результате функции?

кто-нибудь знает о функции в модуле System:
Delphi
1
function TObject.GetInterface(const IID: TGUID; out Obj): Boolean;
чет ее никто не критикует, а ее принцип тот же: если найден интерфейс, функция возвращает TRUE
в самой первой строке ф-ции
Delphi
1
Pointer(Obj) := nil;
, в самой последней
Delphi
1
Result := Pointer(Obj) <> nil;
или разработчики Delphi тоже дураки? (как я )

Добавлено через 2 минуты
Глобальные переменные и без твоей помощи инициализируются прекрасно.
угу, может и так, но ты не будешь отрицать, что
Delphi
1
2
3
4
if GetObject( 'TEdit', b ) then b.Free;
if GetObject( 'TComboBox', b ) then b.Free;
if GetObject( 'TMemo', b ) then b.Free;
if GetObject( 'TCheckBox', b ) then b.Free;
если первая проверка найдет объект, то все последующие проверки выдадут TRUE, даже если ничего не нашли
из-за неправильной реализации функции поиска
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
28.07.2015, 08:09 12
Цитата Сообщение от deva1i0 Посмотреть сообщение
Чтобы код корректно работал нужно в функцию GetObject первым делом вставить Obj := nil;
Первым делом нужно не Obj обнилять (его там вообще не нужно трогать, если ф-ция намерена вернуть False), а задать правильное условие досрочного выхода из for-цикла.
Сейчас у тебя цикл хреначит по всем эл-там массива a[], вне зависимости от выполнения условия в if-выражении, что попросту лишено смысла.
0
6 / 6 / 5
Регистрация: 17.03.2015
Сообщений: 60
28.07.2015, 08:35  [ТС] 13
вот это лишено смысла:
Цитата Сообщение от mss Посмотреть сообщение
Первым делом нужно не Obj обнилять
первым делом нужно Obj обнилять
если ты против, жалуйся в Embarcadero
оптимизация - дело следующее после устранения ошибок

Добавлено через 1 минуту
тема закрыта, всем спасибо
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
28.07.2015, 08:55 14
Цитата Сообщение от deva1i0 Посмотреть сообщение
первым делом нужно Obj обнилять
Да за коим лешим его обнилять-то ?)

Включи мозг - если вызываемая ф-ция поиска вернула False, то нафига вызвавщему ее коду обращаться (неважно зачем и как) после этого к переменной Obj, каким бы ни было ее содержимое ?

А если тебе нужно обнилить/удалить какой-то эл-т массива, к коему обращается ф-ция поиска, то для этого следует либо предусмотреть отдельную ф-цию а-ля RemoveObject(AObject: TObject) либо в ф-ции GetObject возвращать по ссылке не сам объект, а адрес хранящего его элемента массива.
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
28.07.2015, 09:17 15
Цитата Сообщение от deva1i0 Посмотреть сообщение
если первая проверка найдет объект, то все последующие проверки выдадут TRUE
Об этом я еще в посте #4 написал, поэтому отрицать не буду)

В твоем примере (абстрактный он или еще какой) в переменной b вообще нет особого смысла, т.к. объект можно уничтожить и внутри ф-ции.

А вообще, осмысленность кода можно оценивать лишь зная решаемую им задачу, которую ты не потрудился озвучить. Поэтому рассуждать тут можно долго, но все это будет не о чем.

Добавлено через 7 минут
Цитата Сообщение от mss Посмотреть сообщение
если вызываемая ф-ция поиска вернула False
В данной реализации она вернет Тру, если переменную не обнулять.
0
mss
28.07.2015, 09:37
  #16

Не по теме:

Цитата Сообщение от FIL Посмотреть сообщение
В данной реализации она вернет Тру
Неважно что она вернет.
Важно внутри подобной по логике вызываемой ф-ции не трогать переменную, переданную по ссылке, если ф-ция планирует вернуть Фолс.

0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
28.07.2015, 11:30 17
я вот не знаю, программирует ли так кто-то вообще ибо на свой "нубо"взгляд, такие коды лишены смысла быть вообще.

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

За коем фигом так искать элементы в массиве? В цикле если даже чего и найдется, то ничего с этим произведено все равно не будет, а будет лишь проверено последнее нахождение на nil, ну а оно уж каким будет таким и будет, зачем весь спектакль с циклами?

Почему именно искать по имени класса? Почему не произвести просверку на тип класса? if a[nn] is TEdit then ...

чтобы в b что-то положить, надо сначало иметь годную для использования b, ибо адрес возвращать некуда

ну все это уже и до меня было описано, я просто свою точку зрения выдал

да и все вопросы от ТС какие-то непонятные, непонятные в плане зачем весь этот огород, поспорить? Доказать что-то? Чем-то померяться? Или как ТС писал в некой теме, что вакансии открываются на место дельфиста... Может работника подыскивает , а не статистику собрает, как он выразился в той некой теме
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
28.07.2015, 12:02 18
Цитата Сообщение от mss Посмотреть сообщение
Важно внутри подобной по логике вызываемой ф-ции
Внутри подобной по логике вызываемой ф-ции не должно быть ничего из того, что там написал ТС)
Ф-ция возвращает указатель на эл-т массива, коим является некий объект, который может быть спокойно уничтожен вне данной ф-ции (что мы и видим в коде ТС), а в массиве останется эл-т, указывающий на мусор, и при следующем вызове ф-ции - AV.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
28.07.2015, 12:19 19
Цитата Сообщение от FIL Посмотреть сообщение
внутри подобной по логике вызываемой ф-ции не должно быть ничего из того, что там написал ТС
Эт точно)
Ф-цию в топку ..Либо передавать ей нужно ссылку на данные типа ^TObject, а не ссылку на TObject.
Только в этом случае у вызывающего кода появляется возможность обнилить эл-т массива или что-то там еще с ним отчудить.
0
AllFree
25.07.2016, 18:41     Поиск ошибки в коде
  #20

Не по теме:

Какое отношение к топикстартеру?.. Эх, заблокировал бы Вас всех.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2016, 18:41

Ошибки в коде
Помогите пожалуйста с кодом программы, не могу никак устранить данные ошибки.ndows,...

ошибки в коде
Нашел код чтоб снифферы закрывал но ошибки показывает( unit Unit1; interface uses ...

Ошибки в коде
Здравствуйте. Я уже голову сломал с этим примером. Нашел в интернете решение на свой вопрос, в виде...

Исправить ошибки в коде
делаю в делфи прогу находит ашипку в 12 строке, пачиму так? procedure...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru