Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2009, 15:23   #1
Jora_Kornev
Пользователь
 
Аватар для Jora_Kornev
 
Регистрация: 06.01.2009
Сообщений: 72
Вопрос Помогите найти ошибку в коде

Доброго времени суток, уважаемые товарищи программисты!
Есть следующий код:
Код:
{...}
var
 f : TextFile;
 x, y, z, i : integer;
 s : string;
 massiv : array [1..28, 1..15, 1..25] of string;
begin
 AssignFile(f, 'mas.txt');
 {$I-}
 Reset(f);
 {$I+}
 for z:=1 to 28 do
  for x:=1 to 15 do
   for y:=1 to 25 do
    begin
     readln(f, massiv[z, x, y]);
     if x<>1 then
      begin
       s:=massiv[z,x,y];
       s[pos('.', s)]:=',';
       massiv[z,x,y]:=s;
      end;
    end;
 CloseFile(f);
end;
{...}
Данный код позволяет прочитать массив из файла
Цитата:
'mas.txt'
и заменить символ
Цитата:
'.'
на
Цитата:
','
.
Но, к сожалению, не работает почемуто... Может я где-то что-то упустил? Подскажите, пожалуйста.
ася: тристадевяносто 068 ноль восемь шесть
Jora_Kornev вне форума Ответить с цитированием
Старый 10.01.2009, 15:36   #2
dadaye
 
Регистрация: 10.01.2009
Сообщений: 6
По умолчанию

Вообще странный код какой-то...
откуда эти цифры 1..28, 1..15, 1..2 ??
dadaye вне форума Ответить с цитированием
Старый 10.01.2009, 15:50   #3
DelDev
Пользователь
 
Аватар для DelDev
 
Регистрация: 09.01.2009
Сообщений: 24
По умолчанию

dadaye, вообще-то это многомерный массив

Jora_Kornev, а покажи файл который пытаешься обработать?
DelDev вне форума Ответить с цитированием
Старый 10.01.2009, 15:58   #4
ViktorXP
Форумчанин
 
Аватар для ViktorXP
 
Регистрация: 24.11.2006
Сообщений: 108
По умолчанию

:D этот код работать не будет 100%
Для этого нужно почитать про тип String. А там сказано что переменная этого типа является ссылкой на масив бай. Посему масив massiv является масивом Pointer-ов. так что либо зделай более совершенную загрузку выгрузку либо переделай масив под другой тип.
например
Код:
massiv : array [1..28, 1..15, 1..25, 0..300] of Char;
massiv : array [1..28, 1..15, 1..25] of String[255]; //ShortString
пс. программисты считают от нуля а не от еденицы
ViktorXP вне форума Ответить с цитированием
Старый 10.01.2009, 16:04   #5
ViktorXP
Форумчанин
 
Аватар для ViktorXP
 
Регистрация: 24.11.2006
Сообщений: 108
По умолчанию

Забираю слова обратно. я чето не заметил что это через AssignFile
ViktorXP вне форума Ответить с цитированием
Старый 10.01.2009, 16:04   #6
Levhik
Пользователь
 
Регистрация: 13.12.2008
Сообщений: 33
По умолчанию

Jora_Kornev! А ты точно знаешь, что у тебя в файле 'mas.txt' будет столько строк, сколько у тебя элементов в массиве: 28*15*25? Это в твоем файле должно быть 10500 строк
Levhik вне форума Ответить с цитированием
Старый 10.01.2009, 16:17   #7
Jora_Kornev
Пользователь
 
Аватар для Jora_Kornev
 
Регистрация: 06.01.2009
Сообщений: 72
По умолчанию

Levhik Да, я этот файл создаю другой процедурой (если быть точным - там 28 файлов, но не важно).

ViktorXP Дело, я так полагаю, не в типе String, да и алгоритм кажись правильный... но тем не менее...

DelDev А зачем Вам файл? В нем просто куча символов, среди которых встречаются '.' которые нужно заменить на ','


Да, забыл уточнить: проблема именно в замене, остальное все работает.
ася: тристадевяносто 068 ноль восемь шесть

Последний раз редактировалось Jora_Kornev; 10.01.2009 в 16:20.
Jora_Kornev вне форума Ответить с цитированием
Старый 10.01.2009, 16:34   #8
DelDev
Пользователь
 
Аватар для DelDev
 
Регистрация: 09.01.2009
Сообщений: 24
По умолчанию

Ладно, не надо файл - просто лень создавать было самому

Если кратко - ошибка тут:

Код:
s[pos('.', s)]:=',';
Подробнее, ViktorXP отчасти был прав, в том, что надо почитать про тип string.

Дело в том , что если символа для замены нет, то pos вернет 0, a s[0] - это не первый символ как в массиве, а длинна строки, отсюда и ошибка нарушения доступа к памяти. Исправляем так и все работает:

Код:
tmp := pos('.', s);
if tmp > 0 then
  s[tmp]:=',';

Последний раз редактировалось DelDev; 10.01.2009 в 16:39.
DelDev вне форума Ответить с цитированием
Старый 10.01.2009, 16:48   #9
Jora_Kornev
Пользователь
 
Аватар для Jora_Kornev
 
Регистрация: 06.01.2009
Сообщений: 72
По умолчанию

Спасибо, разобрался! Впредь буду более внимателен!
ася: тристадевяносто 068 ноль восемь шесть
Jora_Kornev вне форума Ответить с цитированием
Старый 10.01.2009, 16:56   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вот эту строчку:
s[pos('.', s)]:=',';
поменяйте на:
Код:
while pos('.', s)>0 do
s[pos('.', s)]:=',';
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку в коде! alex2008ean Паскаль, Turbo Pascal, PascalABC.NET 1 27.12.2008 18:31
Помогите найти ошибку в коде, пожалуйста Gobl1n Паскаль, Turbo Pascal, PascalABC.NET 3 30.11.2008 17:44
Помогите найти ошибку в коде C++ Жека:) Помощь студентам 15 29.10.2008 11:32
помогите найти ошибку в коде плиз Айат Помощь студентам 2 01.10.2008 17:43
помогите найти ошибку в коде Joker88 Помощь студентам 1 04.03.2008 12:43