Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Интересное поведение функции Length() [D7, XP]


Страницы:   1 2 3 4

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.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо