информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыSpanning Tree Protocol: недокументированное применениеСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach