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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2010, 14:29   #1
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию Где мой кося в динамическом массиве?

Собственно строки:
Код:
x:=Data[Count].Name;
Data[i].Name:=x;
Слегка перегрелся на солнце, вот и не могу найти проблему
Это элемент копирования, вызывающий Access Violation.
Даю вводные:
Массив динамический
x - String;
Name - String;
Count в данной точке равен 2, всего элементов в массиве 3 (пока что).
i в данной точке равен нулю.
Оба элемента (Data[Count].Name и Data[i].Name) существуют на данный момент и в бреакпоинте видны их значения (запланированные).
Вопрос: Па-а-а-чему? Почему при выполнении второй строки возникает такая кама-сутра?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 09.07.2010, 14:36   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Что такое Data?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.07.2010, 14:39   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Цитата:
type
TVector = record
Data: Array of TVectorElem;
Name: String; // Имя вектора
Link: Integer; // Количество ссылок на данный вектор
end;
Такая вот беда

Цитата:
type
TVectorElem = record
AType: Boolean; // Тип элемента - False строка, True вектор
Link: Integer; // Сыслка на соответствующий элемент
Index: String; // Обозначение индекса элемента
end;
Чисто на всякий случай...

Смысл возни - эта сложная структура и ее тяжело удалить без крови. Вот я его и пытаюсь перекопировать из любого участка массива в конец, что бы там уже над ним надругаться по полной программе. И все бы ничего, но при переписывании имени такая вот оказия.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 09.07.2010 в 14:42.
Utkin вне форума Ответить с цитированием
Старый 09.07.2010, 14:41   #4
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Косяк в названии темы
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 09.07.2010, 14:44   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Цитата:
Сообщение от zumm Посмотреть сообщение
Косяк в названии темы
Это я знаю, и надеюсь на Стилета . Меня больше интересует динамический массив.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 09.07.2010, 14:45   #6
mid
Пользователь
 
Регистрация: 29.01.2008
Сообщений: 12
По умолчанию

http://www.delphibasics.ru/SetLength.php

такую бяку использовал?
Код:
type
  TData = record
    Name : String;
  end;

var
  X : String;
  Data : array of TData;

begin
    X:= 'hello';
    SetLength(Data,1);
    Data[1].Name:= X;
end.
Выполняется без ошибок.
mid вне форума Ответить с цитированием
Старый 09.07.2010, 14:49   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Да, у меня почти в каждой процедуре такие игры .
Смысл в том, что в данной процедуре они еще не наступили . Я уже объяснил, что сначала элемент должен быть переписан из любого участка в конец, вся структура будет проинициализирована, и только тогда наступит SetLength.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 09.07.2010, 14:50   #8
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Какие то косячные эти динамические массивы...У меня вот только что тоже возник странный глюк, значение вообще не присваивается, хотя ясно написано ':='...будем бить в бубен...
В планах порабощение вселенной...

Последний раз редактировалось zumm; 09.07.2010 в 14:55.
zumm вне форума Ответить с цитированием
Старый 09.07.2010, 14:59   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Цитата:
Сообщение от zumm Посмотреть сообщение
Какие то косячные эти динамические массивы...У меня вот только что тоже возник странный глюк, значение вообще не присваивается, хотя ясно написано ':='...будем бить в бубен...
Уже проверил пути к модулям в *.dpr (знаю, такой прикольный косячок, когда правишь один модуль, а подключен другой, одноименный ). Аномалия не прошла . Я не знаю чей это глюк, мой или Дельфи и главное как ето победить?
Самое обидное, поля-то одинаковые. Из последнего элемента я могу читать поле, а в первом элементе переписать не судьба.

ЗЫ. Попробовал такой фокус с другим элементом. Прошло на ура. Чувствую постепенное изменение мировозрения....

ДОБАВЛЕНО:
На тот случай если это все же я, вот полный код
Код:
// Удаляем все вектора, ненужные в системе
procedure TVectors.EraseDust();
var
      i, Count: Integer;
      x: String;
begin

      // Определим общее число векторов
      Count:=Length(Data);

      // В системе есть вектора?
      if Count<1 then Exit;

      // Сканим линки векторов
      Dec(Count);
      for I := 0 to Count do
      begin

            // Вектор нужен?
            if ((Data[i].Name='') and (Data[i].Link=0) or (Data[i].Link<0)) then
            begin

                  // Внесем новое имя
                  x:=Data[Count].Name;
                  Data[i].Name:=x;

                  // Сделаем данный вектор нулевым
                  ZeroVector(i);

                  // Скопируем на его место последний из векторов
                  CopyVector2(Count, i); 
                  
                  // Уничтожим последний вектор
                  EraseLastVector();
            end;
      end;

end;
////////////////////////////////////////////////////////////////////////////////
Пока не дописано, но собственно дальнейшие действия на артефакт влиять уже не должны (там должны следовать обновления ссылок в структурах).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 09.07.2010 в 15:09.
Utkin вне форума Ответить с цитированием
Старый 09.07.2010, 15:35   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Код:
procedure TVectors.EraseDust();
var
      i, Count: Integer;
      x: String;
begin

      for I := Low(data) to high(data) do
      begin

            // Вектор нужен?
            if ((Data[i].Name='') and (Data[i].Link=0) or (Data[i].Link<0)) then
            begin

                  // Внесем новое имя
{$o-}
                  x:=Data[Count].Name;
                  Data[i].Name:=x;
{$o+}
                  // Сделаем данный вектор нулевым
                  ZeroVector(i);

                  // Скопируем на его место последний из векторов
                  CopyVector2(Count, i); 
                  
                  // Уничтожим последний вектор
                  EraseLastVector();
            end;
      end;

end;
Цитата:
Это я знаю, и надеюсь на Стилета
А зря. Я сейчас не солидарен с тобой.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
могут ли взломать мой компьютер (IP) и совершить допустим регистрацию где-нибудь? Crazy1986 Безопасность, Шифрование 15 17.05.2010 07:23
Где прописан путь к папке Мой компьютер в реестре ? aha Общие вопросы Delphi 10 18.04.2010 21:45
C++ указатель в динамическом двумерном масие TheZvir Помощь студентам 3 26.03.2010 00:03
Как узнать путь где щас мой exe zotox Помощь студентам 2 26.03.2009 23:38
Количество элементов в динамическом массиве lytkin Общие вопросы Delphi 8 21.02.2007 14:50