@ahtam, первый символ строки при наличии директивы {$string_nullbased+} будет 0-евым её элементом. Если же использована {$string_nullbased-}, то эффект противоположный, и индексация начинается с 1-цы. По умолчанию (без явного указания данных директив) используется индексация с 1-цы. Дополнительную информацию о директивах компилятора можно посмотреть в: Справка > Справочник по языку > Директивы компилятора.
Если ничего не вводить в поле, то Ваша программа упадёт с ошибкой: Unit1.pas(30) : Ошибка времени выполнения: Индекс находился вне границ массива. Требуется проверка на выход индекса за границы строки:
procedure Form1.button1_Click(sender: Object; e: EventArgs);
begin
var c:=textbox1.Text;
if c.Length < 1 then
exit;
label1.Text := c[1];
end;
, но лучше не молча обрабатывать ошибочные случаи ввода, а сообщать пользователю об этом. Ниже приведены ссылки, по которым Вы можете узнать как это делать.
Только что понял что форум выдал мне права переноса даже админских тем в другие разделы (раньше только созданные не_админами разрешало). И вот помнится эту тему хотели перенести в раздел паскаля, но @Admin не нашёл как…
Остаётся только вопрос - стоит ли это делать? Эту тему не отображает если с сайта перейти на форум, потому что она находится в разделе разное. Но в самоволку это делать не очень хочется.
Все указанные вами способ я уже до этого экспериментировал, использовал другие функции COPY, SUBSTR, … Но результата для меня то, чтобы можно было затем использовать другие функции, например ord. label1.Text := ord(c[1]) или другая форма вҷдаёт тоже самую ошибку.
Потому что типы надо преобразовывать! Copy и s.Substring возвращают строку, а не символ. А вот Convert.ToChar или обращение к символу через индексатор строки как раз вернёт char. Обратно присвоить строке символ вроде можно без преобразований, там есть неявное приведение Но если так нужно, можно использовать c.ToString.
Часто переключаюсь между языками программирования и довольно часто попадается задачка по переворачиванию числа Х без строк/символов на подобии
if x=0...
if x<0 then begin минус:=true; x:=abs(x) end;
...
var y := 0;
while x > 0 do
begin
y := (y * 10) + (x mod 10);
x := x div 10;
end;
// if минус then y:=-y;
где нужно учитывать как переполнение, так и запятую.
Но вот как можно упростить
var i := pi.ToString.Reverse;
чтобы возвращало не перечисление через foreach var v in i do write(v), а просто строку ? Предопределение i:string:=… естественно выбивает ошибку, а i:=string(…) молча очищает консоль, игнорируя следующую строку println(i,i.Length)
А теперь по русски, не проглатывая 70% своей мысли.
На это по крайней мере неприятно смотреть. Ну если уже лень открывать редактор чтоб в нём набрать, откомпилировать и скопировать сюда - компилируйте хотя бы в уме.
Даже если вы не знаете что такое return, если не можете догадаться что делать с полученным new string - поможет уже только морг.
Если я правильно понял машинный перевод, у разных пользователей результаты отличаются и у одних быстрее Array, у других StringBuilder, а у третьих разница непринципиальна. В статье на stackoverflow указано иначе ?
Советую Вам пользоваться следующими ресурсами для изучения английского, вместо чтения машинных переводов, которые могут изменять смысл изначально заложенный в статьи и иные материалы:
Зубрить слова и грамматику не требуется, при частом чтении материалов на английском языке новые слова постепенно будут запоминаться сами, просто обращайте внимание на проблемные для Вас места в лексике и грамматике.
Смотрите ещё на размер строк, это много на что влияет. Что вижу я - в той теме на StackOverflow слишком разорванные данные, некоторые тесты были для больших, некоторые для маленьких строк. А в некоторых вообще не сказали какой размер.
Ну, могу предположить что дело в первую очередь в версии .Net . Потому что раньше StringBuilder работал точно так же как List<char>, за исключением пары полюшек. А сейчас у него внутри вроде как связный список, в котором каждая следующая нода - содержит array of char, размером в 2 раза больше массива предыдущей ноды.
Вот только если указать размер буфера при создании StringBuilder - и раньше и сейчас создаётся всего 1 внутренний массив, сразу правильного размера. Поэтому если указывать размер - разницы скорости между Array.Reverse и StringBuilder практически не должно быть (единственное - StringBuilder сразу заполняется в правильном порядке, а в случае с массивом надо ещё вызывать сам Array.Reverse).
А я от себя порекомендую использовать контекстный перевод, сам использую этот сайт.
И переводить что получается - своей головой, а сайты использовать чтоб понять что могут значить отдельные непонятные слова.
Если переводить весь сайт программно - большая часть смысла всё равно теряется, даже если использовать что то лучше гугл переводчика.