Аналог сишной функции
Модератор: Модераторы
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
По-моему документация умалчивает про то с памятью становится после GetMem, а компилятора сейчас под рукой нету 
Вообще если я правльно понял алгоритм дожен быть примерно такой :
1. Выделить память с помощью GetMem
2. Обнулить с помощью FillChar например
Поправьте меня если что, я со знаниями C++ пытаюсь с недавнего времени овладеть фрипаскалем
Вообще если я правльно понял алгоритм дожен быть примерно такой :
1. Выделить память с помощью GetMem
2. Обнулить с помощью FillChar например
Поправьте меня если что, я со знаниями C++ пытаюсь с недавнего времени овладеть фрипаскалем
-
SovNarKom
- постоялец
- Сообщения: 389
- Зарегистрирован: 28.05.2005 10:37:39
- Откуда: Воронеж [vrn] [36]
- Контактная информация:
Вот например в ReAllocMem написано, что если память была увеличена, то нулями это пространство НЕ заполняется.
Понял ты правильно.
<span style='color:red'>Вот ниже пример, я забыл залогинится, пардон.</span>
и ещё я наврал
FillChar(byteptr,100,0); ---> FillChar(byteptr^,100,0);
FillChar(@byteArr[0],100,0); ---> FillChar(byteArr[0],100,0);
Понял ты правильно.
<span style='color:red'>Вот ниже пример, я забыл залогинится, пардон.</span>
и ещё я наврал
FillChar(byteptr,100,0); ---> FillChar(byteptr^,100,0);
FillChar(@byteArr[0],100,0); ---> FillChar(byteArr[0],100,0);
-
Guest
IUnknown
СТОООП, Какой SetLength??? Это же для динамических массивов, не надо тебе его!
Как с ним вообще это работать может?
Вот пример
С SetLength это будет выглядеть так
СТОООП, Какой SetLength??? Это же для динамических массивов, не надо тебе его!
Как с ним вообще это работать может?
Вот пример
Код: Выделить всё
type
pByte = ^Byte;
var
byteptr: pByte;
begin
byteptr:=GetMem(100);
FillChar(byteptr,100,0);
byteptr[25]:=224;
FreeMem(byteptr);
end;
С SetLength это будет выглядеть так
Код: Выделить всё
type
TByteArr = Array of Byte;
var
byteArr: TByteArr;
begin
SetLength(byteArr,100);
FillChar(@byteArr[0],100,0);
byteArr[25]:=224;
SetLength(byteArr,0);
end;
насчет освобождения памяти.
у меня такой случай был
so (DLL в линуксе) написана на си.
она возвращала указатель на выделеную ейю нутри себя память,
которую я должен был в программе освобождать.
так вот при стандартном паскалевском FreeMem постоянно выленала ошибка,
решили это только использованием Libc
Libc.Free(ptr);
у меня такой случай был
so (DLL в линуксе) написана на си.
она возвращала указатель на выделеную ейю нутри себя память,
которую я должен был в программе освобождать.
так вот при стандартном паскалевском FreeMem постоянно выленала ошибка,
решили это только использованием Libc
Libc.Free(ptr);
Что-то я совсем запутался. Какой-то дремучий лес этот паскаль
FillChar опасно использовать... В С я могу так сделать
Хотелось бы сделать функцию которую можно примерно также использовать в паскале, если это возможно
Код: Выделить всё
char* arr;
arr = (char *)calloc( 10, sizeof( char ) );
Хотелось бы сделать функцию которую можно примерно также использовать в паскале, если это возможно
-
Nikolay
только к динамическим массивам не стоит применять FillChar и тп., т.к. разные части массива могут находится в разных местах.
Абалдеть
Вот, если бы у Вас был массив указателей на что-то, то да - это что-то в разных частях. А динамический массив по определению выделяется одним куском на один указатель. Если Вы захотите его увеличить, то выделится новый кусок, все скопируется, и удалится старый.
char* arr;
arr = (char *)calloc( 10, sizeof( char ) );
var arr ^Char;
...
GetMem(Arr, 10*Sizeof(Char));
// FillChar ? Надо посмотреть. По моему не надо этого
отсюда function MyGetMem(Count, Size: Integer): pointer;
begin
GetMem(Result, Count, Size);
end;
А вообще, расслабьтесь и пишите на паскале - используйте AnsiString и SetLenght
