2010-04-05 3 views
1

В моем приложении я создал список типов TList, где я храню указатели на 1 строку и 2 значения поплавка (реальные) для каждых 3 элементов.Как получить значение с плавающей точкой, на которое указывает указатель?

aList.Add(@sName); //string 
aList.Add(@x1); //float 
aList.Add(@x2); //float 

Тогда, я хочу, чтобы получить значения из списка, но я мог бы сделать только то, что для строки

sStr := string(lList.items[i]); 

Но я не мог получить значение с плавающей точкой, как a := real(lList...) приведет к неверная ошибка при отправке.

Так что же мне делать, чтобы получить значения поплавка?
Конечно, у меня есть вопрос, действительно ли это строковое кастинг даст мне строковое значение. Я плохо разбираюсь в материалах указателя, поэтому я не знаю, как это сделать.

+0

Отсутствуют данные, но выполнение такого рода присвоения может привести к нарушению доступа. При нажатии строки на указатель, это не будет увеличивать количество ссылок. Поэтому, когда sName выходит за пределы области видимости, ваш указатель может стать недействительным. То же самое относится к вашим значениям float. Когда переменная X1 и X2 выходит из области действия, указатели уже недействительны. Что касается недопустимого типа, вы можете сделать подобный тип, вы, вероятно, просто забыли разыменовать указатель. Двойной (lList [I] ^) –

ответ

5

Я бы рекомендовал создать запись:

TMyRecord = record 
    sName: String 
    x1: Double; 
    x2: Double; 
end; 

, а затем создать общий список этого типа:

var 
    MyRecordList: TList<MyRecord>; 

и оттуда, вы должны быть в состоянии легко получить доступ к данных в списке.

Попытка хранения данных в TList с конкретными типами данных в определенных положениях, как это, является еще большей проблемой, которая должна быть.

+1

+1. Я собирался сказать то же самое, но Ник избил меня. Вы можете найти общий TList в модуле «Generics.Collections». Но у него есть некоторые странные причуды компилятора в Delphi 2009 и могут не всегда работать правильно. Если у вас есть проблемы с этим, я бы рекомендовал перейти на Delphi 2010, что намного более стабильно, когда дело доходит до дженериков. –

2

Я согласен с Ником. Но вы все равно можете делать то, что делаете.

Если 'а' типа 'Real',

a := Real(aList.Items[i]^); 

или если 'а' указатель на Real (^ Real),

a := aList.Items[i]; 

для строк, хранить адрес первого элемента (конечно, вы должны проверить для пустых строк),

s := 'Hello World'; 
aList.Add(@S[1]); 
[...] 
s1 := string(aList[i]); 

или использовать «PChar» и сохранить адрес, где он указывает на,

s := 'Hello World'; 
aList.Add(@s^); 
[...] 
s1 := PChar(aList[i]); 
Смежные вопросы