Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lazarus
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
1

Динамические массивы через указатели

03.05.2011, 08:35. Просмотров 1023. Ответов 1
Метки нет (Все метки)

GetMem выделяет именно байты в указаанном количесте, не зависимо от типа указаетля?
Выделил я память, предположим, по указателю
Delphi
1
var p:^integer;
на n элементов типа integer, а как теперь в i-тый элмент (индексируя с ноля) записать значение перменной
Delphi
1
b:integer;
?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2011, 08:35
Ответы с готовыми решениями:

Динамические массивы
Помогите с задачами плиз 1. Дан динамический массив целых чисел. Вставить...

Большие динамические массивы
При работе с динамическими массивами сталкнулся вот с такой ошибкой (нехватка...

динамические массивы.
Здравствуйте! Недавно решил попробовать покодить на Delphi Prism... и возникла...

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

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

1
taras atavin
4205 / 1768 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
10.05.2011, 10:43  [ТС] 2
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
function SubString(s:string; i1, i2:integer):string;
var r:string;
    i:integer;
begin
     r:='';
     for i:=i1 to i2 do
         r:=r+s[i];
     SubString:=r;
end;
 
procedure Parser(var book:TBook);
var f:textfile;
    c:char;
    tegs,s, old, main:string;
    apartment:TApartment;
    buffer:TBook;
    i:integer;
    size:integer;
function ToPrevTeg(tegs:string):string;
var p:integer;
begin
     p:=LastDelimiter('>', SubString(tegs,1, Length(tegs)-1));
     if p>0 then ToPrevTeg:=SubString(tegs,1, p) else ToPrevTeg:='';
end;
begin
     AssignFile(f,'data.xml');
     ReSet(f);
     main:='';
     tegs:='';
     s:='';
     old:='';
     while not eof (f) do
     begin
          Read(f,c);
          if c>=' ' then begin
                              if c='<' then begin
                                                 old:=s;
                                                 s:=c;
                                            end
                                       else s:=s+c;
                              if s<>'' then if (s[1]='<') and (s[length(s)]='>') then if s[2]<>'/' then begin
                                                                                                             if main='' then main:=s else tegs:=tegs+s;
                                                                                                             s:='';
                                                                                                        end else begin
                                                                                                                      if tegs='<book><street>' then begin
                                                                                                                                                         buffer.StreetsCount:=book.StreetsCount+1;
                                                                                                                                                         size:=buffer.StreetsCount*sizeof(string);
                                                                                                                                                         GetMem(buffer.StreetsData, size);
                                                                                                                                                         if buffer.StreetsData<>nil then begin
                                                                                                                                                                                              for i:=0 to book.StreetsCount-1 do
                                                                                                                                                                                              begin
                                                                                                                                                                                                   (Buffer.StreetsData+i)^:=(book.StreetsData+i)^;
                                                                                                                                                                                              end;
                                                                                                                                                                                              (buffer.StreetsData+book.StreetsCount)^:=old;
                                                                                                                                                                                              if book.StreetsData<> nil then FreeMem(book.StreetsData);
                                                                                                                                                                                              book.StreetsData:=buffer.StreetsData;
                                                                                                                                                                                              book.StreetsCount:=buffer.StreetsCount;
                                                                                                                                                                                              buffer.StreetsData:=nil;
                                                                                                                                                                                         end;
                                                                                                                                                    end;
                                                                                                                      if tegs='<book><apartment><code>'   then apartment.code  :=StrToInt(old);
                                                                                                                      if tegs='<book><apartment><street>' then apartment.street:=StrToInt(old);
                                                                                                                      if tegs='<book><apartment><house>'  then apartment.house :=StrToInt(old);
                                                                                                                      if tegs='<book><apartment><number>' then apartment.number:=StrToInt(old);
                                                                                                                      if tegs='<book><apartment>' then begin
                                                                                                                                                            buffer.ApartmentsCount:=book.ApartmentsCount+1;
                                                                                                                                                            size:=buffer.ApartmentsCount*sizeof(TApartment);
                                                                                                                                                            GetMem(buffer.ApartmentsData, size);
                                                                                                                                                            if buffer.ApartmentsData<>nil then begin
                                                                                                                                                                                                    for i:=0 to book.ApartmentsCount-1 do
                                                                                                                                                                                                    begin
                                                                                                                                                                                                         (Buffer.ApartmentsData+i)^:=(book.ApartmentsData+i)^;
                                                                                                                                                                                                    end;
                                                                                                                                                                                                    (buffer.ApartmentsData+book.ApartmentsCount)^:=apartment;
                                                                                                                                                                                                    if book.ApartmentsData<> nil then FreeMem(book.ApartmentsData);
                                                                                                                                                                                                    book.ApartmentsData:=buffer.ApartmentsData;
                                                                                                                                                                                                    book.ApartmentsCount:=buffer.ApartmentsCount;
                                                                                                                                                                                                    buffer.ApartmentsData:=nil;
                                                                                                                                                                                               end;
                                                                                                                                                       end;
                                                                                                                      tegs:=ToPrevTeg(tegs);
                                                                                                                 end;
                         end;
     end;
     CloseFile(f);
end;
,
Код
<?xml version="1.0" encoding="UTF-8"?>
<book>
<street>
Кирова
</street>
<street>
Орджоникидзе
</street>
<apartment>
<code>1</code>
<street>1</street>
<house>12</house>
<number>73</number>
</apartment>
<apartment>
<code>2</code>
<street>2</street>
<house>8</house>
<number>46</number>
</apartment>
<apartment>
<code>3</code>
<street>1</street>
<house>52</house>
<number>144</number>
</apartment>
</book>
.

Добавлено через 1 минуту
Глюк вылетает в 52-й строке (
Delphi
1
(Buffer.StreetsData+i)^:=(book.StreetsData+i)^;
) при book.StreetsCount=1.

Добавлено через 18 минут
Нашёл другое решение.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2011, 10:43

Вычислить время падения тела с высоты H с начальной скоростью V (через динамические переменные)
решить задачу,используя динамические переменные. Вычислить время падения тела с...

Динамические двумерные массивы через указатели. Как это происходит?
Вот типичная идентификация двумерного массива (NxM): int** mass = new int*; ...

Указатели и массивы. Индексация с помощью указателей. Передача массивов в функции. Динамические массивы (обработка матриц)
Для каждого элемента , bij, i= 1,...,n , j=1,...,n определяется свой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru