![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Интересное поведение функции Length() [D7, XP]
pavel_guzhanov © (2006-11-15 12:01:00)В программе для определения пола человека использую такую вещь:
i:=Length(MIDDL_NAME);
s:=copy(MIDDL_NAME, i-1, 1);
if uppercase(s)='А' then
SEX:='Жен'
else
SEX:='Муж';
где MIDDL_NAME - отчество. вроде все работает. Переменные i и s введены для контроля. Так вот, в какие-то дни этот код работает нормально, а в какие-то - s получается равным не последней букве MIDDL_NAME, а предпоследней. Тогда я меняю второй параметр функции copy с i-1 на i, и опять какое-то время все работает нормально. Но, в какой-то день s начинает принимать значение ''. Опять меняю i на i-1, и опять все работает. И так бесконечно. Программка написана только для меня, поэтому как-то справляюсь, но есть опасение, что такое же может возникнуть и в других программах. Подскажите, отчего такое происходит, и как с этим бороться?
ps если использовать MIDDl_NAME[length(MIDDL_NAME)] - та же картина.
KilkennyCat (2006-11-15 13:51:00) [21]> [44] Игорь Шевченко © (15.11.06 13:47)
в смысле "не дает" ? :)))
Игорь Шевченко (2006-11-15 13:47:00) [22]Я почему говорю, что проще спросить - в файле может быть информация с ошибками ввода...
> > SEX := 'Н/д';
>
> это кто?
Это недоступный
Anatoly Podgoretsky (2006-11-15 13:41:00) [23]> pavel_guzhanov (15.11.2006 13:37:40) [40]
Ты смотришь?
Почему тогда утаиваешь эту важную часть кода?
Что еще ты утаиваешь?
Ну например мы от тебя не смогли добиться определения Middl_name, а без этого разговор бессмысленен.
KilkennyCat (2006-11-15 13:40:00) [24]> Что-то я никак не придумаю женское отчество, оканчивающее
> на "я"...
Как-то зашел я в магазин, тарелку купить (неудобно из банки кушать). Читаю ценники... "Яйцорезка". Забавно, думаю. И тут слышу диалог двух продавщиц, пишущих новый ценник:
- Ты неправильно написала, надо "крысаловка", а не "крысоловка".
- почему?
- Проверочное слово: "Крыса".
И пишущая верит и исправляет...
Вот так-то. Надо всегда предполагать, что пользователь всякий бывает, может и "я" написать...
Anatoly Podgoretsky (2006-11-15 13:37:00) [25]> pavel_guzhanov (15.11.2006 13:25:37) [37]
А оканчивающее на пробел можешь представить?
pavel_guzhanov (2006-11-15 13:37:00) [26]
> Но поскольку это Эксель, то там может быть любая ерунда,
> включая отсутствие
Я смотрю значение переменной Middl_name, если она равна пустой строке, это уже другой разговор, а вот когда она не пустая... получается описаная в вопросе ерунда...
Anatoly Podgoretsky (2006-11-15 13:35:00) [27]> KilkennyCat (15.11.2006 13:21:35) [35]
Ну это и не задача вовсе, тем более для человека который программирует более года.
Anatoly Podgoretsky (2006-11-15 13:34:00) [28]> pavel_guzhanov (15.11.2006 13:18:34) [34]
Это все понятно и это надо было писать в вопросе.
Но поскольку это Эксель, то там может быть любая ерунда, включая отсутствие
pavel_guzhanov (2006-11-15 13:25:00) [29]
> Думается мне что в MIDDL_NAME отчество не попадает. А проверку
> на пустоту конечно делать надо
см [34]
> определить последнюю букву.
> Сравнить ее с русскими А,а,Я,я и английскими А,а
Что-то я никак не придумаю женское отчество, оканчивающее на "я"...
Elen (2006-11-15 13:21:00) [30]
> Если отчество не указано
Думается мне что в MIDDL_NAME отчество не попадает. А проверку на пустоту конечно делать надо
KilkennyCat (2006-11-15 13:21:00) [31]Странно, как много обсуждения у простой задачи.
Все, что надо:
определить последнюю букву.
Сравнить ее с русскими А,а,Я,я и английскими А,а (учитываем способности пользователя, однако).
Можно добавить проверку на наличие точки и одной буквы ваще (если какой-то особенный пользователь ограничился инициалами).
pavel_guzhanov (2006-11-15 13:18:00) [32]
> По-моему ему как раз нужна последняя иначе по его логике
> Алина и Лика разнополые.
Я думаю, что отчество будет и у Алины и у Лики - ИвановнА, так что по моей логике они однополые.
посмотри название процедуры, в которой Ты это делаешь.
procedure TMainForm.BImportDataOPSClick(Sender: TObject);
> Слушай, а может у тебя не строки, поскольку в строке это
> все таки Length=High
> Ты не говоришь нам всю правду. А может у тебя вообще Length
> не имеет отношения к последней букве строки.
> Нельзя же быть таким молчаливым, хотя тебе можно.
В экселевском файле в первом столбце, например "Иванов", во втором "Иван", в третьем "Иванович"
Вторая строка: Первый столбец - "Иванова", второй столбец - "Елена", третий столбец - "Ивановна"
Переменной LAST_NAME присваивается значение из первого столбца, переменной First_Name - из второго столбца, а переменной Middl_name - из третьего. Все переменные типа String
Anatoly Podgoretsky (2006-11-15 13:02:00) [33]> Elen (15.11.2006 12:57:32) [32]
Если отчество не указано, то Сopy вернет строку и если предпоследний символ не А, то считается что это мужик, а какая предпоследнея буква у пустой строки?
Elen (2006-11-15 12:57:00) [34]
> Но он то пытается по предпоследней букве и если отчетство
> не указано, то пол мужской.
>
Разве? :
> где MIDDL_NAME - отчество. вроде все работает. Переменные
> i и s введены для контроля. Так вот, в какие-то дни этот
> код работает нормально, а в какие-то - s получается равным
> не последней букве MIDDL_NAME, а предпоследней.
По-моему ему как раз нужна последняя иначе по его логике Алина и Лика разнополые.
Автору совет - склепать список имен (хотя бы корней имен) и по ней проверять
Anatoly Podgoretsky (2006-11-15 12:56:00) [35]> Jeer (15.11.2006 12:43:29) [29]
Сплошная астрология.
Значит астрологи не врут.
Anatoly Podgoretsky (2006-11-15 12:56:00) [36]> KilkennyCat (15.11.2006 12:40:27) [27]
> негр?
Это сокращение?
Jeer (2006-11-15 12:43:00) [37]
> Anatoly Podgoretsky © (15.11.06 12:35) [23]
От тебе это по почте сообщил?
Так звезды сложились.:)
Percent (2006-11-15 12:42:00) [38]Ли Иванович Иванов
Сражу говорю - это женщина.
Трансвестит?
KilkennyCat (2006-11-15 12:40:00) [39]> [24] Anatoly Podgoretsky © (15.11.06 12:37)
негр?
Андрей Сенченко (2006-11-15 12:39:00) [40]Дай более общирный кусок кода или сам посмотри название процедуры, в которой Ты это делаешь.
У меня была похожая история, когда я "перекрыл" своей процедурой аналогичную VCL-ную, но в моей индексация параметра начиналась с "0", а в штатной - с "1". В итоге в теле программы работала моя процедура, а в юнитах - цеплялась дельфийская и я получал OutOfRange.