Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
labron
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 9
1

Нуль-терминальные строки PChar, StrCopy() ошибка.

19.12.2012, 05:17. Просмотров 2336. Ответов 11

Собсна необходимо сложить несколько PChar строк, решил заюзать strcat, синтакс. ошибок не было никаких, но при запуске вылетает ошибка.
Изначально все пилил на полном winapi думал что тут где то накосепорил, но после проверки аналогичного кода с включеным rtl ошибка не пропала, вся работа встала не знаю что может быть!
вот кодес аналогичный моему:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
program Project1;
uses
  SysUtils;
var
a:PAnsiChar;
b:PAnsiChar;
z:PAnsiChar;
begin
a:='wert';
b:='wertt';
z:=Strcopy(a,b);
end.
при написании на winapi
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function StrCopy(Dest: PChar; const Source: PChar): PChar;
asm
        PUSH    EDI
        PUSH    ESI
        MOV     ESI,EAX
        MOV     EDI,EDX
        MOV     ECX,0FFFFFFFFH
        XOR     AL,AL
        REPNE   SCASB
        NOT     ECX
        MOV     EDI,ESI
        MOV     ESI,EDX
        MOV     EDX,ECX
        MOV     EAX,EDI
        SHR     ECX,2
        REP     MOVSD
        MOV     ECX,EDX
        AND     ECX,3
        REP     MOVSB
        POP     ESI
        POP     EDI
end;
REP MOVSD <---тут бага

что может быть?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2012, 05:17
Ответы с готовыми решениями:

Ошибка при делении нуль на нуль
Всем привет! Имеется функция которая вычисляет математическое уравнение введённое в поле Edit. Всё...

Нуль-терминальные строки. C++
Помогите решить задачи: 1) Дан текст проверить, правильно ли записаны буквосочетания &quot;ча&quot; и &quot;ща&quot;,...

Длина строки и нуль-терминатор
Всем привет. Выполняю небольшую лабораторную на строки, давно не занимался! что-то забыл:), что-то...

Нуль-символ в начале строки
Здравствуйте, буду признателен если разъясните следующую вешь. От сервера приходит строка формата:...

ошибка 200(деление на нуль)?
Добрый день!)Подскажите пожалуйста, почему при работе с графикой в паскаль,при попытке компиляции...

11
angstrom
2474 / 1850 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
19.12.2012, 12:28 2
Есть функции API - lstrcpy, lstrcpyn, lstrcat
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
program Project1;
 
uses
  Windows;
 
var
  a, b : AnsiString;
  z : array[Byte] of AnsiChar;
 
begin
  a := 'wert';
  b := 'wertt';
  lstrcpyA(z, PAnsiChar(a));
  lstrcatA(z, PAnsiChar(b));
end.
0
labron
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 9
19.12.2012, 21:46  [ТС] 3
Да уже разобрался, спасиб, запилил так
Pascal
1
2
3
4
5
6
function lstrcat(lpString1, lpString2: PChar): PChar; stdcall; external 'kernel32.dll' name 'lstrcatA';
var
header: array[0..255] of char;
begin
header:='lolka';
lstrcat(header,#13#10);
Правда теперь новая головная боль, функция pos, блин, что только не перепробывал на её место вставить, все летит к чертям! дебагер обсирается, когда юзаю аналоги на asm! руки опять упали(
0
labron
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 9
27.12.2012, 21:09  [ТС] 4
UP! UP! UP!
0
27.12.2012, 21:09
Mawrat
12880 / 5782 / 1704
Регистрация: 19.09.2009
Сообщений: 8,807
28.12.2012, 01:03 5
Ребята, а здесь не нужно никакие функции импортировать - всё уже есть в Delphi. И надо не забывать выделять/освобождать память.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
uses
  SysUtils;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  A, B, C, P : PChar;
begin
  A := '1234';
  B := '5678';
  //Выделяем память для строки C, исходя из длин A и B
  //и с учётом терминального нуля (+1).
  C := StrAlloc( StrLen(A) + StrLen(B) + 1 );
  //Складываем строку C из строк A и B.
  StrCopy(C, A);
  StrCat(C, B);
  ShowMessage('A + B = ' + C);
 
  //Ищем подстроку "56" в строке C.
  P := StrPos(C, '56');
  if P <> nil then
    ShowMessage('Подстрока "56" найдена на позиции: ' + IntToStr(P - C + 1))
  else
    ShowMessage('Подстрока "56" не найдена.');
 
  //Освобождаем память, выделенную для строки C.
  StrDispose(C);
end;
0
labron
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 9
28.12.2012, 01:21  [ТС] 6
модер, сори ну если ты не догодался, то я тут на winapi пытаюсь писать, у меня rtl вырублено в delphi! так что никакова uses нету =)
0
Mawrat
12880 / 5782 / 1704
Регистрация: 19.09.2009
Сообщений: 8,807
28.12.2012, 01:32 7
А, понятно. А я думал, что код на WinAPI из-за того, что обычным путём не получилось сделать.
0
angstrom
2474 / 1850 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
28.12.2012, 01:35 8
Цитата Сообщение от labron Посмотреть сообщение
... так что никакова uses нету =)
Так ты все функции хочешь сам подключать? Windows.pas размер добавляет? Ну давай дерзай.
0
mss
2641 / 2265 / 277
Регистрация: 24.12.2010
Сообщений: 13,725
28.12.2012, 09:52 9
Цитата Сообщение от labron Посмотреть сообщение
Собсна необходимо сложить несколько PChar строк
И для этого обязательно нужно мордовать себя премудростями winapi и ассемблера ?

Код
function ConcatenateTwoStrings(FirstString, SecondString: PChar): PChar;
begin
  Result :=StrNew (PChar(String(FirstString) + String(SecondString)));
end;
1
labron
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 9
28.12.2012, 16:40  [ТС] 10
ох, а посмотреть на старые посты не судьба? строки я сложил, заюзал
Delphi
1
2
3
4
5
6
function lstrcat(lpString1, lpString2: PChar): PChar; stdcall; external 'kernel32.dll' name 'lstrcatA';
var
header: array[0..255] of char;
begin
header:='lolka';
lstrcat(header,#13#10);
Теперь проблема стоит в функции Pos, надо тоже запилить её на winapi и проблем бы не было, только asm нельзя тут использовать ибо нифига он не работает тут почему не знаю и не хочу знать ибо пишу я на делфи =)
А что касается вопросу angstrom, да хочу и делаю, а что касается windows.pas, то да добавляет! я с отключеным ртл пишу проги в 3.5кб, а по твоей методике в 15кб все вылазило бы!
P.S. Ну очень деликатен к вопросу размеров программ =)
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
28666 / 18966 / 7465
Регистрация: 22.10.2011
Сообщений: 33,121
Записей в блоге: 6
02.01.2013, 14:08 11
Цитата Сообщение от labron Посмотреть сообщение
я с отключеным ртл пишу проги в 3.5кб
Ну я вот из твоих предыдущих сообщений как раз увидел, что ты пишешь. Проги по 3.5 кб, которые не работают? Спасибо, лучше 15К, но чтоб работало, тебе не кажется?

Delphi
1
2
3
4
5
6
7
8
function lstrcat(lpString1, lpString2: PAnsiChar): PAnsiChar; stdcall; external 'kernel32.dll' name 'lstrcatA';
function lstrcpy(lpString1, lpString2: PAnsiChar): PAnsiChar; stdcall; external 'kernel32.dll' name 'lstrcpyA';
 
var
   header: array[0..255] of AnsiChar;
begin
   lstrcpy(header, PAnsiChar('lolka'));
   lstrcat(header, #13#10);
прекрасно добавляет одну строку к другой, если что... Продолжай придумывать велосипед, в то время, как другие будут занимать твоё место на рынке

P.S.
Цитата Сообщение от labron Посмотреть сообщение
Теперь проблема стоит в функции Pos
StrStr в помощь.
1
labron
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 9
02.01.2013, 17:46  [ТС] 12
Нет не кажется, я написал же что для меня очень важен размер exe, ибо среда где будет использоваться файл требовательна к этому критерию, кстате, тему можно закрывать ибо прога переписана уже на fasm'e
P.S. Вес 1.5кб в отличие от delpih без ртл 3.5 и тем более с ртл+вкл 15+
0
02.01.2013, 17:46
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2013, 17:46

Ошибка 200. Деление на нуль
Подскажите, что не так??? uses crt, graph; procedure kvad(a,x,y,r:integer); var x1,y1:integer;...

strcopy & strcut
Написать функцию copy и cut на С++

Реализовать пользовательскую функцию StrCopy
Помогите пожалуйста решить задачу. Реализовать пользовательскую функцию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.