Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите найти ошибку! Копирование строк. 
V
    Опции темы
Codegrammer
Дата 1.4.2008, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 1.4.2008

Репутация: нет
Всего: нет



Люди, помогите найти ошибку. При входе в цикл выполняется только первая его строчка, потом управление передается в конец программы. Заранее благодарен.

Код

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

  var
    j:integer;
    s,s1:string;
begin
    j:=1;
    s:='233423.';
    while s[j]<>'.' do
    begin
      s1[j]:=s[j];
      inc(j);
    end;
end.

PM MAIL   Вверх
bems
Дата 1.4.2008, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



сделай SetLength(s1,length(s)) перед циклом


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Данкинг
Дата 1.4.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



А если так?

Код

...
 j:=1;
 s:='233423.';
 s1:='      ';
...

Т.е. задать начальное значение S1.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Codegrammer
Дата 1.4.2008, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 1.4.2008

Репутация: нет
Всего: нет



bems, спасибо! Все работает.
Насколько я понял, проблема в том, что длина строки нулевая сначала и компилятор запрещает пользоваться теми данными, которые выходят за эту длину. Я правильно понял?
PM MAIL   Вверх
Данкинг
Дата 1.4.2008, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Да, я тоже так понял, что ошибка из-за этого.  У меня вообще программа слетает, не то что цикл не работает. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
bems
Дата 1.4.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Codegrammer @  1.4.2008,  20:24 Найти цитируемый пост)
Насколько я понял, проблема в том, что длина строки нулевая сначала и компилятор запрещает пользоваться теми данными, которые выходят за эту длину. Я правильно понял? 
Не совсем. Строка нулевой длины это указатель, равный nil. Обращение к первому символу строки это запись в ячейку памяти с адресом 00000000. Этот адрес принадлежит области доступ к которой запрещен всем приложениям, и система (а не компилятор) возбуждает исключение access violation. Если включена range checking, то код проверяющий корректность индекса встраивается в твоею прогу и уже он (а не компилятор) во время выполнения возбуждает исключение ERangeError

Добавлено @ 20:39
и вообще проще так:
Код

s1:=Copy(s,1,MaxInt);


Это сообщение отредактировал(а) bems - 2.4.2008, 17:21


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Codegrammer
Дата 1.4.2008, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 1.4.2008

Репутация: нет
Всего: нет



Цитата(bems @  1.4.2008,  20:35 Найти цитируемый пост)
Этот адрес принадлежит области доступ к которой запрещен всем приложениям


Разве при объявлении переменной, не выделяется необходимый объем памяти? Насколько я понимаю, должно выделится 255 байт, которые могут быть использованы в данной программе.

Цитата(bems @  1.4.2008,  20:35 Найти цитируемый пост)
 Строка нулевой длины это указатель, равный nil.


Получается все объявленные строки при входе в программный блок еще не определены в памяти? Ведь все строки имеют сначала нулевую длину. Или я чего-то не понял ...

PM MAIL   Вверх
bems
Дата 1.4.2008, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Codegrammer @  1.4.2008,  20:51 Найти цитируемый пост)
Разве при объявлении переменной, не выделяется необходимый объем памяти? Насколько я понимаю, должно выделится 255 байт, которые могут быть использованы в данной программе.
При объявлении переменной выделяется необходимый объем памяти. Для типа ShortString это 256 байт, для AnsiString - 4 байта для хранения указателя на саму строку, а место под символы выделяется при присваивании.В дельфи (в отличии от ТП) зарезервированое слово String по умолчанию означает AnsiString.

Цитата(Codegrammer @  1.4.2008,  20:51 Найти цитируемый пост)
Получается все объявленные строки при входе в программный блок еще не определены в памяти? Ведь все строки имеют сначала нулевую длину
Nil как раз и означает нулевую длину. При присваивании или SetLength выделяется блок памяти (если это еще не сделано) и изменяется переменная, так чтобы указывала на этот блок.
Плюс ко всему есть еще счетчик ссылок на строку (чтобы не хранить в памяти две копии одной строки. Две переменные типа AnsiString могут указывать на один блок памяти)



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Codegrammer
Дата 1.4.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 1.4.2008

Репутация: нет
Всего: нет



Огромное спасибо за ответ  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0749 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.