FreeBasic
Главная
Вход
Регистрация
Воскресенье, 22.12.2024, 05:35Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Перевод справки
VitaminДата: Понедельник, 05.06.2017, 19:13 | Сообщение # 16
Лейтенант
Группа: Пользователи
Сообщений: 59
Репутация: 4
Статус: Offline
Ошибка в примере по функции Reallocate:
Код
....
a = Allocate ...
....
b = Reallocate (a, ...)
....
Deallocate a   ' Очистка
Нужно заменить "Deallocate a" на "Deallocate b"


Сообщение отредактировал Vitamin - Понедельник, 05.06.2017, 19:15
 
haavДата: Вторник, 06.06.2017, 11:04 | Сообщение # 17
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Цитата Vitamin ()
Ошибка в примере по функции Reallocate:

Нет никакой ошибки. Эти указатели на один и тот же адрес. Внимательнее смотри пример.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
VitaminДата: Вторник, 06.06.2017, 12:44 | Сообщение # 18
Лейтенант
Группа: Пользователи
Сообщений: 59
Репутация: 4
Статус: Offline
Эта ошибка есть и в английской версии справки. Действительно в примере из справки адреса указателей "a" и "b" получаются одинаковые, видимо из-за небольших размеров участка памяти. Но стоит увеличить размер выделяемой памяти и картина меняется: указатели становятся разными.
 Вот пример:
 
Код
Dim a As Integer Ptr, b As Integer Ptr

?:?WStr("Исходное состояние; Память = "),, Fre\1000000; WStr(" МБ")
a = Allocate(100000000 * SizeOf(Integer)) ' Выделение памяти
For i As Integer =0 To 100000000-1 ' заполняем
   a [i]= 1
Next

b = Reallocate(a, 1.5 * 100000000 * SizeOf(Integer)) ' Перераспределяем память: увеличиваем в 1.5 раза

?:?WStr("указатели (a,b) = ");a;", ";b ' куда указывают указатели 

?:?WStr("Память до Deallocate(a) = "),,, Fre\1000000; WStr(" МБ")
Deallocate a   ' Очистка a
?:?WStr("Память после Deallocate(a) = "),, Fre\1000000; WStr(" МБ")
Sleep

Deallocate b   ' Очистка b
?:?WStr("Память после Deallocate(b) = "),, Fre\1000000; WStr(" МБ")
Sleep

'      Вывод на экран:
'
' Исходное состояние; Память =                            1937 МБ
'
' указатели (a,b) = 4325408, 404357152
'
' Память до Deallocate(a) =                    1536 МБ
'
' Память после Deallocate(a) =                            1536 МБ
'
' Память после Deallocate(b) =                            1937 МБ
 
haavДата: Вторник, 06.06.2017, 13:24 | Сообщение # 19
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Экий ты невнимательный smile Я ведь не случайно написал:

Цитата haav ()
Внимательнее смотри пример.


И что же у нас в примере?


Код
b = Reallocate( a, 10 * SizeOf(Integer) )   ' Перераспределяем память для 5 дополнительных integers

If b <> 0 Then

    a = b

Как видишь, переменной a присваивается значение из переменной b . То есть получается, без разницы какую переменную подсовывать  в deallocate , они по сути указывают на один адрес smile


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
VitaminДата: Вторник, 06.06.2017, 13:50 | Сообщение # 20
Лейтенант
Группа: Пользователи
Сообщений: 59
Репутация: 4
Статус: Offline
Точно, не обратил внимание. Зря только шум поднял.
 
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск: