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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2015, 06:55   #21
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В смысле быдло код?
В том смысле что ты возвращаешь из функции указатель на запрошенную в функции память. Но пока не видно что ты эту память освобождаешь.
Можтбть это кнечно и не быдлокод, но утечки память, если не будешь контролировать то что вернет твоя функция тебе обеспечены.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.04.2015, 22:08   #22
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
В том смысле что ты возвращаешь из функции указатель на запрошенную в функции память. Но пока не видно что ты эту память освобождаешь.
Можтбть это кнечно и не быдлокод, но утечки память, если не будешь контролировать то что вернет твоя функция тебе обеспечены.
Ха) вот значит в каком смысле. Нет, ничего освобождать не надо))Вы же имели введу через SetLength ? ну вот) если через нее освободить прям в функции, то я не получу конечный результат где надо, потому что переменная будет освобождена
Должно быть имя? вне форума Ответить с цитированием
Старый 26.04.2015, 08:46   #23
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вы же имели введу через SetLength ?
Нет )
Цитата:
если через нее освободить прям в функции
Не в функции а после функции
Ну не важно уже. Делай как делаешь. Лишь бы не для больниц и самолетостроителей.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.04.2015, 19:14   #24
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Нет )

Не в функции а после функции
Ну не важно уже. Делай как делаешь. Лишь бы не для больниц и самолетостроителей.
И чем же тогда освобождать? али примером наградите ?
Должно быть имя? вне форума Ответить с цитированием
Старый 27.04.2015, 19:32   #25
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А освобождать за пределами функции.
Примером? Ну я даже не знаю...
Что -то типа
Код:
var s:PChar;
...
s:=ТвояФункция();
...
s:='';
Или FreeMem(s);
Т.е. за пределами функции любым правильным способом.
Ведь паскалевский менеджер памяти, управляющий массивами и строками он для чего сделан? Именно чтоб избегать открыто работать с указателями, которые немало принесли бед в Си программистам с недостаточно полным пониманием работы с памятью. Именно на это тебе и намекают.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.04.2015, 20:15   #26
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,767
По умолчанию

Цитата:
Сообщение от Должно быть имя? Посмотреть сообщение
али примером наградите ?
Правильный пример -- тупо удалить эти функции. Именно это я и советовал. Внутри кода на Delphi они не нужны. Для строк должна быть всего одна функция:
Код:
function ZValueToString(const Source: zvalue_value): AnsiString;
var
  R: RawByteString;
begin
  SetString(R, Source.Val, Source.Len);
  SetCodePage(R, CP_UTF8, not IsUTF8String(R));
  Result := R;
end;
Эта функция используется везде, где нужны AnsiString, UnicodeString или PAnsiChar:
Код:
var
  A: AnsiString;
  U: UnicodeString;
  P: PAnsiChar;
begin
  A := ZValueToString(...);
  U := A; // работает магия компилятора
  P := Pointer(A); // имеет смысл в пределах процедуры, где описана A
end;
Автору темы плюс за желание разобраться. Только так из начинающих становятся профи.

Последний раз редактировалось Vapaamies; 27.04.2015 в 20:18.
Vapaamies на форуме Ответить с цитированием
Старый 01.05.2015, 15:21   #27
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Правильный пример -- тупо удалить эти функции. Именно это я и советовал. Внутри кода на Delphi они не нужны. Для строк должна быть всего одна функция:
Код:
function ZValueToString(const Source: zvalue_value): AnsiString;
var
  R: RawByteString;
begin
  SetString(R, Source.Val, Source.Len);
  SetCodePage(R, CP_UTF8, not IsUTF8String(R));
  Result := R;
end;
Эта функция используется везде, где нужны AnsiString, UnicodeString или PAnsiChar:
Код:
var
  A: AnsiString;
  U: UnicodeString;
  P: PAnsiChar;
begin
  A := ZValueToString(...);
  U := A; // работает магия компилятора
  P := Pointer(A); // имеет смысл в пределах процедуры, где описана A
end;
Автору темы плюс за желание разобраться. Только так из начинающих становятся профи.


Спасибо большое! сделал так как вы и сказали, удалил и в правду не нужны

Благодаря этой функции я налепил этакое

Цитата:
Код:
function GetStringZval(z:zval):RawByteString;
begin
  Result := '';
  case z._type of
    IS_STRING : begin
      SetString(Result, z.value.str.val, z.value.str.len);
      SetCodePage(Result, CP_UTF8, not IsUTF8String(Result));
    end;
    IS_BOOL, IS_LONG   : Result := RawByteString(inttostr(z.value.lval));
    IS_DOUBLE          : Result := RawByteString(FloatToStr(z.value.dval));
  end;
end;

function ZValueToString(z:zval):WideString;
begin
  Result := WideString(GetStringZval(z));
end;

function ZValueToStringA(z:zval):AnsiString;
begin
  Result := GetStringZval(z);
end;
C PAnsiChar все равно русская кодировка не сохраняется(( По этому я решил что приоритетней будет функция ZValueToString. Которая будет возвращать WideString... Как в общем и сделано везде в XE7, например в LoadLibrary.

Насчет разобраться ДА! я люблю копаться в коде, и учиться.. тем более когда смотрю на свой же код, который буквально был написан пару дней назад, появляется адское желания его выкинуть, он выглядит дико из за того что додумался до более легкого варианта. К примеру вот этот код

Цитата:
Код:
function VarinatTypes(n:Integer; arr:array of string):string;
begin
  if (n mod 10 = 1) and (n mod 100 <> 11) then
    Result := arr[0]
  else begin
    if (n mod 10 >= 2) and (n mod 10<=4) and ((n mod 100 < 10) or (n mod 100 >= 20)) then
      Result := arr[1]
    else
      Result := arr[2];
  end;
end;
Выглядел в километр строк он поваляет подобрать правильное окончания числу.

VarinatTypes(45745745634, ['День', 'Дня', 'Дней']); - дней
VarinatTypes(34, ['День', 'Дня', 'Дней']); - Дня
Должно быть имя? вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отобразить русские буквы. InkBlack Помощь студентам 2 29.09.2011 20:12
Русские буквы в case YourLastSong Общие вопросы C/C++ 2 05.05.2011 17:50
Русские буквы morgan97 Паскаль, Turbo Pascal, PascalABC.NET 4 10.03.2011 10:15
Не видно русские буквы. Go.away.noir SQL, базы данных 2 08.09.2009 12:16