Форум: "Основная";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
ВнизНесовместимость String и Char Найти похожие ветки
← →
TDionis (2005-08-03 13:22) [0]Никогда не занимался Char`ом. И вот, решил написать транслитор (ну, чтобы русский текст был английскими буквами). Вот код:
var
S,now_bykva: string;
Flags: TReplaceFlags;
nom: integer;
bykva: array["а".."я"] of string;
begin
bykva["а"] := "a";
bykva["б"] := "b";
bykva["в"] := "v";
bykva["г"] := "g";
bykva["д"] := "d";
bykva["е"] := "e";
bykva["ж"] := "j";
bykva["з"] := "z";
bykva["и"] := "i";
bykva["й"] := "i";
bykva["к"] := "k";
bykva["л"] := "l";
bykva["м"] := "m";
bykva["н"] := "n";
bykva["о"] := "o";
bykva["п"] := "p";
bykva["р"] := "r";
bykva["с"] := "s";
bykva["т"] := "t";
bykva["у"] := "u";
bykva["ф"] := "ph";
bykva["х"] := "x";
bykva["ц"] := "z";
bykva["ч"] := "ch";
bykva["ш"] := "sh";
bykva["щ"] := "sh";
bykva["ъ"] := "";
bykva["ы"] := "i";
bykva["ь"] := "";
bykva["э"] := "e";
bykva["ю"] := "iy";
bykva["я"] := "ia";
nom := 0;
Flags:= [ rfReplaceAll, rfIgnoreCase ];
S:= memo1.Text;
while nom < length(memo1.Text) do begin
now_bykva := copy(s,nom,1);
S:= StringReplace( S, now_bykva, bykva[copy(s,nom,1)], Flags);
nom := nom + 1;
end;
memo1.Text := s;
Тут вылезает ошибка, что bykva[copy(s,nom,1)] ему не ндравися, и что я раздолбай хочу ему подсунуть в индекс string.
Отсюда вопрос: надо либо как-то перевести string в Char либо может найти аналог Copy но в char...
← →
Чапаев © (2005-08-03 13:24) [1]bykva[copy(s,nom,1)[1]]
← →
Думкин © (2005-08-03 13:26) [2]ДОСТУП К БУКВЕ В СТРИНГЕ - КАК В МАССИВЕ.
Оп, капс не вырубил. Звиняюсь.
← →
TDionis (2005-08-03 13:28) [3]Сорри за мега тупой вопрос: что в данном случае означает bykva[copy(s,nom,1)[1]] ??
← →
DiamondShark © (2005-08-03 13:29) [4]Это означает первый символ в строке, возвращаемой функцией copy
← →
TDionis (2005-08-03 13:29) [5]ага но вылетает с ошибкой. почему?
← →
TDionis (2005-08-03 13:30) [6]Хм.. а что, в стринге отсчет идет с 1 а не с нуля ?
← →
Digitman © (2005-08-03 13:32) [7]
> Хм.. а что, в стринге отсчет идет с 1 а не с нуля ?
здрасть-приехали !
конечно с 1 !
← →
Ega23 © (2005-08-03 13:33) [8]2 TDionis (03.08.05 13:30) [6]
Хм.. а что, в стринге отсчет идет с 1 а не с нуля ?
Есть мнение, что кое-кому не мешает почитать про тип String и Char, прежде чем вопросы задавать, нес па?
← →
TDionis (2005-08-03 13:35) [9]ага
Вопрос в том почему больше 1 буквы вылетает EAccessViolation
← →
Думкин © (2005-08-03 13:39) [10]> [9] TDionis (03.08.05 13:35)
1. ты бы моим воспользовался s[nom]
2. А как больше 1 если у тебя строка получается с одним символом?
3. Читать основы Паскаля. А то при таком темпе, следующей твоей программой будет DOOM4 не меньше. А вопросы уровня "в трей".
← →
Digitman © (2005-08-03 13:39) [11]
> почему больше 1 буквы вылетает
потому что все то что больше 1 буквы любит летать
← →
Ega23 © (2005-08-03 14:10) [12]
procedure TForm1.Button2Click(Sender: TObject);
const
Liters:array[224..255] of string=("a", "b", "v", "g", "d", "e", "j", "z", "i", "i",
"k", "l", "m", "n", "o", "p", "r", "s", "t", "u",
"ph", "x", "z", "ch", "sh", "sh", "", "i", "",
"e", "iy", "ya" );
var
i:Integer;
res:string;
begin
res:="";
Edit1.Text:=AnsiLowerCase(Edit1.Text);
for i:=1 to Length(Edit1.Text) do
begin
res:=res+Liters[Ord(Edit1.Text[i])];
end;
Label1.Caption:=res;
end;
← →
evvcom © (2005-08-03 14:26) [13]
> array[224..255]
лучше тогда array[Ord("а")..Ord("я")] нагляднее.
> for i:=1 to Length(Edit1.Text) do
> begin
> res:=res+Liters[Ord(Edit1.Text[i])];
> end;
+ проверку на принадлежность символа в Edit1 диапазону от а до я
← →
Ega23 © (2005-08-03 14:28) [14]Не, ну это пусть сам уже думает и делает. Я идею подкинул? :о)
← →
TDionis (2005-08-03 14:29) [15]Спасибо теперь только большие буквы надо проработать
← →
Ega23 © (2005-08-03 14:31) [16]Спасибо теперь только большие буквы надо проработать
Не вопрос!
procedure TForm1.Button2Click(Sender: TObject);
const
Liters:array[224..255] of string=("a", "b", "v", "g", "d", "e", "j", "z", "i", "i",
"k", "l", "m", "n", "o", "p", "r", "s", "t", "u",
"ph", "x", "z", "ch", "sh", "sh", "", "i", "",
"e", "iy", "ya" );
var
i:Integer;
res:string;
begin
res:="";
Edit1.Text:=AnsiUpperCase(Edit1.Text);
for i:=1 to Length(Edit1.Text) do
begin
res:=res+ANSIUpperCase(Liters[Ord(Edit1.Text[i])]);
end;
Label1.Caption:=res;
end;
:-)))))))))))))))
← →
Ega23 © (2005-08-03 14:33) [17]2 Ega23 © (03.08.05 14:31) [16]
Не, фигу... Так не получится...
← →
TDionis (2005-08-03 16:11) [18]ну ладно, идем по варварский:
AnsiLowerCase(edit1.Text[i]) = edit1.Text[i] - значит число маленькое. ))
а на самомо деле проще проработать 192 - 224 элементы массива
вобщем всем спасибо за помощь
← →
begin...end © (2005-08-03 17:35) [19]> evvcom © (03.08.05 14:26) [13]
> лучше тогда array[Ord("а")..Ord("я")] нагляднее.
array["а".."я"]. Ещё нагляднее.
:-)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.035 c