Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Вниз

Опять вопрос про качественный код:   Найти похожие ветки 

 
Dust ©   (2005-07-20 17:49) [0]

2 han_malign
Зачем выкинул WideCharToString()?  Поменять местами байты во входном буфере я мог и сам.
Почему же без var? Если len возвращает действительную длинну строки после преобразования? Да, согласен что насчёт области видимости - действительно ошибка.

Procedure ConvertStr (str : Pchar; len : dword);//!!! без var
var pwch   : PWORD absolute str;
begin
len:=len div 2;
for len := 0 to len-1 do begin
     pwch^:= htons(pwch^);
     inc(pwch);
end;
end;

Ниже приведена обычная Unicode-строка (в нормальном порядке байт). Видно, что просто первернуть байты нельзя. И как вручную конвертировать тоже непонятно.
3004 3104 3204 2000 4004 3004 3104 3E04 4204 3004 2000 3D04 3504 2000 3204 3E04 3B04 3A04 2000 3204 2000 3B04 3504 4104 2000 3D04 3504 2000 4304 3104 3504 3604 3804 4204 0D00 0A00 6800 6F00 7700 2000 6100 7200 6500 2000 7900 6F00 7500 0D00 0A00
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
2 Alexander Panov
Я думал, насчёт try ..... except; И пришёл к следующему выводу - уж лучше программа вылетит с ошибкой обращения к памяти, чем будет работать неправильно. В любом случае весь код в try .. except не затолкаешь, я не считаю это способом защиты.

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

По функциям выделения и освобождения - я до сих пор пользуюсь D5, иногда, когда нужно воспользоваться компонентами ADO мне приходится залазить в D7. Да, и ещё (по функции StrAlloc).


.....
A 32-bit number giving the total amount of memory allocated is stored in the four bytes preceding the first character; it is equal to Size + 4. If space for a string is allocated with StrAlloc, it should be deallocated via StrDispose.
..
просто я как-то смотрел как получается из Pchara AnsiString.

Оцените теперь, только пожалуйста обратите внимание, на то, что длинна строки возвращается обратно.


Procedure ConvertStr (const str : Pchar; var len : dword);
var pwch   : PWORD;
   tmpstr : String;
begin
len:=len div 2;
pwch := Pointer(str);
for len := len-1 downto 0 do begin
       pwch^:= htons(pwch^);
       inc (pwch);
       end;
tmpstr :=WideCharToString(PWideChar(str));
StrPCopy (str, tmpstr);
end;


 
Dust ©   (2005-07-20 17:57) [1]

сорри,
Procedure ConvertStr (const str : Pchar; var len : dword);
var pwch   : PWORD;
   tmpstr : String;
   ln     : Integer;
begin
len:=len div 2;
pwch := Pointer(str);
for ln := len-1 downto 0 do begin
       pwch^:= htons(pwch^);
       inc (pwch);
       end;
tmpstr :=WideCharToString(PWideChar(str));
StrPCopy (str, tmpstr);
end;


 
Alexander Panov ©   (2005-07-20 17:59) [2]

Dust ©   (20.07.05 17:49)
уж лучше программа вылетит с ошибкой обращения к памяти, чем будет работать неправильно.


Совершенно неверный подход.
Ошибки должны быть обработаны.
Если программа вылетает с AV - это ошибка программиста.

Заметь, что естьне только try..except, а еще и try..finally.

Dust ©   (20.07.05 17:49)
В любом случае весь код в try .. except не затолкаешь, я не считаю это способом защиты.


Это практически единственный(не считая Application.OnException, и низкоуровневую обработку) способ обеспечить нормальную работоспособность программы.

Программа, которая будет постоянно выдавать AV, вместо того, чтобы обрабатывать и локализовать ошибку, можно выкидывать на свалку не задумываясь.


 
arhis   (2005-07-20 18:02) [3]

Alexander Panov ©
Ошибка программиста это не отработавший до конца код и к качеству блоки try finally никакого отношения не имеют. Это просто хорошая мина при плохой игре.


 
Alexander Panov ©   (2005-07-20 18:06) [4]

arhis   (20.07.05 18:02) [3]
Ошибка программиста это не отработавший до конца код и к качеству блоки try finally никакого отношения не имеют.


Пора бы уже осознать простую истину, что программ без ошибок не бывает.
Как раз к качественному написанию программы и относится одна из основных составляющих - обработка ошибок.
(Думаю, что прописные истины даже разжевывать не стоит).

arhis   (20.07.05 18:02) [3]
Это просто хорошая мина при плохой игре.


Это показатель профессионализма программиста.


 
arhis   (2005-07-20 18:15) [5]

Alexander Panov ©
Поздравляю! Вместо АV мы получили  благородную надпись о том, что AV таки произошло в 99% случаев с последующий аварийным остановом, но под контролем пользователя.


 
Digitman ©   (2005-07-20 18:16) [6]


> Если len возвращает действительную длинну строки после преобразования?
>


она (как один из рез-тов твоего преобразования) как правило попросту не нужна, так как актуальную длину нуль-терминированной строки всегда можно получить с пом. StrLen()

и почему ты так зациклился на P[Wide]Char - тоже малопонятно.

ибо когда тебе вдруг потребуется передать в ВинАПИ-ф-цию некую AnsiString-строку, это в любой секунд можно сделать получив актуальный адрес начала ANSI-строкового буфера с пом. P[Wide]Char(ANSI-строка)

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


 
Alexander Panov ©   (2005-07-20 18:19) [7]

arhis   (20.07.05 18:15) [5]
Поздравляю! Вместо АV мы получили  благородную надпись о том, что AV таки произошло в 99% случаев с последующий аварийным остановом, но под контролем пользователя.


Бред не надо нести.
Мы обрабатываем ошибку, записываем в лог/сообщаем пользователю, затем разработчик с этим логом уже может найти свою ошибку.


 
Alexander Panov ©   (2005-07-20 18:22) [8]

Хоть и оффтопик, но выскажу одну мысль.

Вот это

Я думал, насчёт try ..... except; И пришёл к следующему выводу - уж лучше программа вылетит с ошибкой обращения к памяти, чем будет работать неправильно. В любом случае весь код в try .. except не затолкаешь, я не считаю это способом защиты.

и вот это [3] [5]

Я бы отнес как минимум к начинающим программистам.

А если б такое сказал человек с опытом программирования, то
иначе как ламеризмом это не назвать.


 
arhis   (2005-07-20 18:30) [9]

Alexander Panov ©   (20.07.05 18:22) [8]
С точки зрения лидера огромного проекта да. Но на мелком уровне это выглядит как потокание разгильдяйству.


 
Digitman ©   (2005-07-20 18:32) [10]


> В любом случае весь код в try .. except не затолкаешь, я
> не считаю это способом защиты


ну и глупо, что не считаешь...

ВЕСЬ код, разумеется, не "запихаешь", но ты вправе (и обязан !)предусмотреть наиболее вероятные отказы (зачастую даже не по вине юзера) в защищаемом блоком коде !


 
Digitman ©   (2005-07-20 18:38) [11]


> Dust ©   (20.07.05 17:49)  


а вдруг файл подкачки маловат у юзера ?

а ты расчитываешь на его достаточность в неких операциях аллокирования/использования вирт.памяти ?

и при этом ты не защитил try..except-блоком такие свои операции ?

в результате юзер получит что-то наподобие Out Of Memory (условно) и, не увидев в сообщении о явно необработанном тобой исключении никаких твоих рекомендаций к преодолению проблемы, скорей всего выкинет твой софт на свалку.. хотя проблема-то на самом деле была цыплячьей


 
arhis   (2005-07-20 18:41) [12]

Да он же автоматом получит out of memory. Или путаю? Да к тому же ставить в блок любой запрос к куче?


 
Digitman ©   (2005-07-20 18:47) [13]


> Или путаю?


путаешь.

тот же out of memory есть результат штатного отказа ряда АПИ-ф-ций, а оные не возбуждают никаких исключений - оные просто возвращают код ошибки


> к тому же ставить в блок любой запрос к куче?


вовсе не обязательно любой ..

только критичные к успешности/неуспешности выполнения ..

прочие (некритичные с т.з. контекста применения) защищаются глобальной обработкой потенциально прогнозируемых отказов

то же Application.OnException - оно не для Пушкина было введено Борландом


 
arhis   (2005-07-20 18:50) [14]


> только критичные к успешности/неуспешности выполнения ..

Не понял. Что значит критичные? Если я беру память, значит она мне нужна. А если я ее не получил, то приехали. Они все критичные.


 
Гаврила ©   (2005-07-20 18:51) [15]


> В любом случае весь код в try .. except не затолкаешь


Ты будешь смеяться, но весь код уже в try - except

А то, что втихаря неправильно отработавшая программа есть зло несоизмеримо большее ,чем неперехваченное AV - да, я тоже так считаю.


 
Dust ©   (2005-07-20 19:24) [16]

Иногда не только не получил, а получил меньше чем рассчитывал.
А потому в этом случае гораздо выгоднее анализировать сколько памяти получено.
И ещё, выделяя память функцие StrAlloc(), и не получив её, вы гарантированно получите "Out of memory"
открывая файл функцие fh:= CreateFile(...) значительно выгоднее проверять
if fh<> INVALID_HANDLE_VALUE ....
опять таки нежели заталкивать всё это в Try ... Except


 
Alexander Panov ©   (2005-07-20 19:44) [17]

Dust ©   (20.07.05 19:24) [16]

1. CreateFile
CreateFile не вызывет исключений.

2. StrAlloc.

- Если память выделяется большими кусками(например  по 100Мб), думаю, что в этом случае проверять необходимо.

- Если выделение памяти используется очень интенсивно небольшими кусками, то, опять же, выделение памяти тоже надо проверять и обрабатывать корректно исключение.


 
Dust ©   (2005-07-21 11:52) [18]

Я обнаружил точно такую же ошибку. Господа подскажите ВАШ способ её исправления.


Function SMSfrom_deliver_smCMD (const cmd, size : DWORD):Data_from_deliver_sm;
var smska : Data_from_deliver_sm;
.....
begin
....
Result := smska;
end;


 
Digitman ©   (2005-07-21 11:55) [19]

ты вообще-то вник в то что тебе тут долдонили про локальные переменные и их время жизни ?

ей богу, как об стенку горох ...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.041 c
1-1121844884
VasRog
2005-07-20 11:34
2005.08.07
LoadFromFile or Stream


14-1121400496
БарЛог
2005-07-15 08:08
2005.08.07
Заработок в интернет. Пробывали?


1-1121667918
rus9
2005-07-18 10:25
2005.08.07
Управление доступом


14-1121706889
Ajax
2005-07-18 21:14
2005.08.07
"Жди меня и я вернусь..."


14-1121412168
Ega23
2005-07-15 11:22
2005.08.07
Китай проснулся





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский