информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяВсе любят медSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[delphi] А попробуй ка ты потестить свой самокат! :-) 23.04.03 16:34  Число просмотров: 1153
Автор: Cyril <sc> Статус: Member
<"чистая" ссылка>
> Я вообщето в курсе, что такое PChar, и что подочто надо
> выделять
>
> > Function GetWindowsDir: String;
> > Begin
> > //Заставляем компилер выделить память в строку...
> > SetLength(Result, MAX_PATH);
> > //Помедитируй немного над этой строкой
> > SetLength(Result,
> GetWindowsDirectory(PChar(Result),
> > MAX_PATH+1));
> > //Всё, и нет велосипеда ;-)
> > End;
>
> С получением GetWindowsDirectory у меня велосипедов нет
> (Хотя у себя я не выделял память под PChar, т.к., не
> поверешь, с выделением он мне не возвращает ровным счетом
> ничего, кроме @#$ни какойто и к стате твой пример тоже не
> работает). Вот потом идут глюки. И опять же проверял дома
> подобную штуку - все работает, на работе нифига.
> Может что с тачилой? (i845G шатл + celeron 1.7, 128DDR +
> 98-е), она еще любит сама по себе перегружаться.
Интересно, а у тебя что раньше вопросов не возникало, почему это тачка сама по себе перегружается. Думаю лучше оторваться на некоторое время от программирования и потестить тачилу, например память и проц,
а то скоро даже программа hello world перестанет выполняться :-)
<programming>
[delphi] Конкатенация 22.04.03 15:49  
Автор: ASJinx Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Делаю премерно такую фигню
dir:='';
getwindowsdirectory(dir,MAX_PATH);
StrDir:=string(dir);
StrDir:=''StrDir'\notepad.exe';
После чего в StrDir возвращает груду мусора.
dir объявлял как и Pchar и array [1..max_path] of char, одна фигня.

Еще интересней:
после getwindowsdirectory(dir,MAX_PATH);
получаю dir='C:\WINDOWS', делаю StrDir:=string(dir); dir:=pchar(strdir) и имею
значение dir вместо 'C:\WINDOWS' чуть другое dir='C:\WJNDOWS' (вместо i стоит j). Тут я вообще не въехал.

А конкатенацию делал и через + и через concat, одна фигня.
Потом просто проверил без PChar-ов со стрингами, типа strdir:='aaa'+'bbb' - дает мусор. :(
Получается нормально только если сначала strdir:='aaa'+'bbb' , а потом str='zzzz'+'xxx' и во второи случае получаю все нормально :).
Глюк?
[delphi] Вот только не надо велосипедов ;-) 23.04.03 03:53  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 23.04.03 04:13  Количество правок: 2
<"чистая" ссылка>
> Делаю премерно такую фигню
> dir:='';
> getwindowsdirectory(dir,MAX_PATH);
> StrDir:=string(dir);
> StrDir:=''StrDir'\notepad.exe';
> После чего в StrDir возвращает груду мусора.
> dir объявлял как и Pchar и array [1..max_path] of char,
> одна фигня.

Что-то у тебя всё фигня, да фигня ;-))) Не надо юзать PChar, если не знаешь как его юзать. Этож память надо под него выделять, потом с ним (с PChar) работать корректно, потом не забыть память освободить... ANSI string можно и даже нужно юзать для системных вызовов, компилер сам за тобой всё подотрёт. Итак, вот пример проги, для тебя эксклюзивно писанной ;-)...

Program NewProg;
{$APPTYPE CONSOLE}
Uses Windows;
  
  Function GetWindowsDir: String;
  Begin
    //Заставляем компилер выделить память в строку...
    SetLength(Result, MAX_PATH);
    //Помедитируй немного над этой строкой
    SetLength(Result, GetWindowsDirectory(PChar(Result), MAX_PATH+1));
    //Всё, и нет велосипеда ;-)
  End;
  
  // А вот на PChar, но больше гемора. Зачем работать за компилер?
  Function GetWindowsDir2: String;
  Var aStr: PChar;
  Begin
    GetMem(aStr, MAX_PATH + 1);
    GetWindowsDirectory(aStr, MAX_PATH + 1);
    Result := aStr;
    FreeMem(aStr);
  End;

  Function GetOEMString(Const aStr: String): String;
  Begin
    Result := aStr;
    //Ты слышал что-нибудь про то, что string он немножко того, reference-counted?
    //Если нет, то помедитируй и над этой строкой (ниже), 
    UniqueString(Result); //И подумай над тем, чтобы было бы, если бы её не было ;-)
    ANSItoOEM(PChar(Result), PChar(Result));
  End;

Begin
  WriteLn(GetWindowsDir + GetOEMString(' - Моя конкатенация работает ;-))))))'));
  WriteLn(GetWindowsDir2 + GetOEMString(' - И эта работает ;-))))))'));
End.

---
[delphi] У меня самокат! :) 23.04.03 09:02  
Автор: ASJinx Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Я вообщето в курсе, что такое PChar, и что подочто надо выделять

> Function GetWindowsDir: String;
> Begin
> //Заставляем компилер выделить память в строку...
> SetLength(Result, MAX_PATH);
> //Помедитируй немного над этой строкой
> SetLength(Result, GetWindowsDirectory(PChar(Result),
> MAX_PATH+1));
> //Всё, и нет велосипеда ;-)
> End;

С получением GetWindowsDirectory у меня велосипедов нет (Хотя у себя я не выделял память под PChar, т.к., не поверешь, с выделением он мне не возвращает ровным счетом ничего, кроме @#$ни какойто и к стате твой пример тоже не работает). Вот потом идут глюки. И опять же проверял дома подобную штуку - все работает, на работе нифига.
Может что с тачилой? (i845G шатл + celeron 1.7, 128DDR + 98-е), она еще любит сама по себе перегружаться.
[delphi] А попробуй ка ты потестить свой самокат! :-) 23.04.03 16:34  
Автор: Cyril <sc> Статус: Member
<"чистая" ссылка>
> Я вообщето в курсе, что такое PChar, и что подочто надо
> выделять
>
> > Function GetWindowsDir: String;
> > Begin
> > //Заставляем компилер выделить память в строку...
> > SetLength(Result, MAX_PATH);
> > //Помедитируй немного над этой строкой
> > SetLength(Result,
> GetWindowsDirectory(PChar(Result),
> > MAX_PATH+1));
> > //Всё, и нет велосипеда ;-)
> > End;
>
> С получением GetWindowsDirectory у меня велосипедов нет
> (Хотя у себя я не выделял память под PChar, т.к., не
> поверешь, с выделением он мне не возвращает ровным счетом
> ничего, кроме @#$ни какойто и к стате твой пример тоже не
> работает). Вот потом идут глюки. И опять же проверял дома
> подобную штуку - все работает, на работе нифига.
> Может что с тачилой? (i845G шатл + celeron 1.7, 128DDR +
> 98-е), она еще любит сама по себе перегружаться.
Интересно, а у тебя что раньше вопросов не возникало, почему это тачка сама по себе перегружается. Думаю лучше оторваться на некоторое время от программирования и потестить тачилу, например память и проц,
а то скоро даже программа hello world перестанет выполняться :-)
[delphi] Попробовал, колеса отвалились :-) 24.04.03 19:13  
Автор: ASJinx Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > а то скоро даже программа hello world перестанет выполняться :-)
Пошутил, да?
А на счет тестов ты прав, запустил сандру 2002, непошла, висим и т.д. Перезагрузка, повторный запуск - ошибка там и там, до скорых встречь. На соседних компах идет, тут нет. Завтра молот принесу, никто возражать не будет, все равно все дерьмо. (хотя похоже ддрка глючит)
А на счет суммы двух стрингов - мусор.
сумма двух PChar'ов == указатель на мусор 24.04.03 21:09  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
[delphi] Конкатенация 22.04.03 18:58  
Автор: Cyril <sc> Статус: Member
<"чистая" ссылка>
> Делаю премерно такую фигню
> dir:='';
> getwindowsdirectory(dir,MAX_PATH);
> StrDir:=string(dir);
> StrDir:=''StrDir'\notepad.exe';
> После чего в StrDir возвращает груду мусора.
> dir объявлял как и Pchar и array [1..max_path] of char,
> одна фигня.
>
> Еще интересней:
> после getwindowsdirectory(dir,MAX_PATH);
> получаю dir='C:\WINDOWS', делаю StrDir:=string(dir);
> dir:=pchar(strdir) и имею
> значение dir вместо 'C:\WINDOWS' чуть другое
> dir='C:\WJNDOWS' (вместо i стоит j). Тут я вообще не
> въехал.
>
> А конкатенацию делал и через + и через concat, одна фигня.
> Потом просто проверил без PChar-ов со стрингами, типа
> strdir:='aaa'+'bbb' - дает мусор. :(
> Получается нормально только если сначала
> strdir:='aaa'+'bbb' , а потом str='zzzz'+'xxx' и во второи
> случае получаю все нормально :).
> Глюк?
Чтобы сказать есть ли у тебя глюк в процедуре или нет
хотелось бы взглянуть на полностью функциональный пример
с нормально объявленными переменными, посмотреть как ты
проверяешь значения, как выделяешь память под строки и. т. д.
а то очень тяжело отвечать на вопросы:
у всех 2+2=4 а у меня 2+2 = 5, Глюк ???

// например вот этот пример должен замечательно работать
procedure TForm1.Button1Click(Sender: TObject);
var
strdir : string;
begin
strdir := 'aaa'+'bbb';
ShowMessage(strdir);
strdir := 'zzz'+'xxx';
showmessage(strdir);
end;
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach