IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> AnsiString, длинна
сообщение
Сообщение #1


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


есть программки
шаблон
var
point: pointer;
PointInt: ^Longint;
i : Longint;
const
s: Ansistring = 'Ansistring';
begin
{программа}
end.

программа1
writeln(length(s));

получаем exit code =216 (General Protection fault)
Цитата
The application tried to access invalid memory space. This can be caused by several problems:
1. Deferencing a nil pointer //не может быть, строка не пуста
2. Trying to access memory which is out of bounds (for example, calling move with an invalid length).

значет мы вышли за границы.. Чего?

читая
Цитата
If the string is empty (’’), then the internal pointer representation of the string pointer is Nil. If the string is not empty, then the pointer points to a structure in heap memory.
зайдем с другой стороны
программа2
	point:=s[0];
PointInt:=point;
i:=PointInt^;
writeln(i);

но опять получаем ошибку(правда теперь еще при компиляции)
Цитата
Element zero of an ansi/wide- or longstring can't be accessed, use (set)length instead
но теперь вообще ничего не понимаем wacko.gif

Добавлено через 9 мин.
есть идея...
может надо от того что находится на point отнимать point^?
бредовая идея...

Добавлено через 3 мин.
тобиш както так
 i:=PointInt^-@(s[0]);


Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Ты будешь смеяться, но первая программа у меня отрабатывает как положено (печатает 10), и ни о каких ошибках не заикается...

А насчет второй - я всегда говорил - не пользуйтесь нестандартными средствами (в частности, это касается использования s[0] вместо Length(s)), вот тебе результат - нельзя теперь обращаться к нулевому символу строки.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 18.07.2007 20:09) *
Ты будешь смеяться, но первая программа у меня отрабатывает как положено (печатает 10), и ни о каких ошибках не заикается...
скорее плакать...
с {$mode Delphi} у меня тоже все работает, но у меня ж не {$mode Delphi}...
Цитата(volvo @ 18.07.2007 20:09) *
А насчет второй - я всегда говорил - не пользуйтесь нестандартными средствами (в частности, это касается использования s[0] вместо Length(s)), вот тебе результат - нельзя теперь обращаться к нулевому символу строки.
дык, стандартные не работают, кстате еще одна бредвая идея i:=(@Point-@(s[0]))/SizeOf(char);


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Я не говорил, что в {$mode delphi}

Я теперь при запуске твоих программ всегда добавляю {$mode ObjFPC}

Цитата
кстате еще одна бредвая идея
Да ты как хочешь пытайся, тебе компилятор не даст обратиться к нулевому символу строки.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 18.07.2007 20:20) *
Я теперь при запуске твоих программ всегда добавляю {$mode ObjFPC}
хм.. так тоже компилируется, но если в компиляторе поставить галочку на диалекте...
Цитата(volvo @ 18.07.2007 20:20) *
Да ты как хочешь пытайся, тебе компилятор не даст обратиться к нулевому символу строки.
очень даже обидно... никакой фантазии smile.gif


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


собственно проблема решена Bоkul-ом
Цитата
В документации написано что сначала надо установить ее длину функцией SetLength..
Код:
const
s: Ansistring = 'Ansistring';
begin
SetLength(s,length('Ansistring'));
writeln(length(s));
readln;
end.


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата
В документации написано что сначала надо установить ее длину функцией SetLength..

Ссылку на точное место в документации можно? Я не нашел этого... Все, что написано - это:
Цитата
To set the length of an ansistring, the SetLength function must be used.
, а это, простите, имеет совсем другой смысл... То есть, если надо установить длину AnsiString, то необходимо использовать SetLength (а не любимым всеми способом с s[0], например), но нигде не сказано, что я обязан перед использованием AnsiString-а пользоваться SetLength
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 21.09.2020 19:26
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name