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

Вниз

PChar и string - не срабатывает приведение типов   Найти похожие ветки 

 
BigDaddy   (2003-05-30 14:25) [0]

Привет All,
странная возникла проблема: есть функция, аргумент которой имеет тип PChar.

Делаю так:

var
s:string;
q:string;

begin
s:="AAAAAA";
q:=s+"BBB";
myfunction(PChar(q));

myfunction вилетает с ошибкой. (Какой - не важно, см. далее)

Если делаю так:

var
q:string;

begin
q:="AAAAAA"+"BBB";
myfunction(PChar(q));


все работает нормально.
Я в недоумении - где грабли???


 
Альф   (2003-05-30 14:41) [1]

А вот так не пробовал ?
myfunction(PChar( @q));


 
Serginio   (2003-05-30 14:45) [2]

Лучше
myfunction(PChar(@q[1]));


 
Внук   (2003-05-30 14:46) [3]

А так?
myfunction(PChar(&q[1]));



 
reonid   (2003-05-30 14:53) [4]

Вообще-то, Дельфи прекрасно справляется с конвертацией строки в пчар.
(а у строки, кстати, может и не быть первого символа)

Вопрос: ф-я myfunction не экспортируется ли случайно из ДЛЛ?
Если да - то согласованы ли соглашения о вызове
(прошу прощения за каламбур)?


 
Anatoly Podgoretsky   (2003-05-30 15:02) [5]

А зачем прятать от нас сообщение об ошибке, может в нем и зарыта твоя причина. Ты что не доверяешь нам? Не бойся мы никому не расскажем. Потом как указал reonid есть неизвестная величина "myfunction" нам догадаться как оно объявлено, где оно расположено или как?


 
Zz_   (2003-05-30 15:07) [6]

>>(а у строки, кстати, может и не быть первого символа)

А терминирующий нуль будет ?


 
Внук   (2003-05-30 15:17) [7]

Будет, если это AnsiString


 
reonid   (2003-05-30 15:27) [8]

Внук © (30.05.03 15:17)
Это если она не пустая.
Иначе она просто равна nil - какие уж тут завершающие нули.


 
Внук   (2003-05-30 15:39) [9]

>>reonid
Я думаю, с проверкой на пустоту автор справится :)


 
BigDaddy   (2003-05-30 16:56) [10]

Ого, активный форум. Итак, отвечаю по-порядку:
2Альф & Serginio: пробовал myfunction(PChar(@q[1])). Результат тот же.
2Внук: & - это из С :-)
2reonid: так и есть. Пытаюсь юзать АРI функции мускл. Как на самом деле описана функция (в смысле сорса) я не знаю, поэтому и не приводил сообщение об ошибке. Но если это поможет - Command is out of sync. Функция, которую выдает ее - mysql_query();
В файле инклуда описана так:
mysql_query: function(_mysql: PMYSQL; const q: pChar): longint; stdcall;
я вызываю ее так:
mysql_real_query(m,PChar(query));

Всем остальным: строка 100% не пустая. Тестовый пример, данные забиваю прямо в коде. Никаких внешних источников...
Опять же, если в переменную стринг забить весь запрос сразу, он выполняется. Если пытаться слепить запрос из двух строк - ругается....




 
BigDaddy   (2003-05-30 16:59) [11]

PS: Command out of sync - неверная последовательность выполнения комманд.


 
Verg   (2003-05-30 17:03) [12]

mysql_query: function(_mysql: PMYSQL; const q: pChar): longint; stdcall;

Сдается мне, что где-то тут что-то зарыто, ведь const - читай var, просто который трогать нельзя.

Т.о. получаем,
Что

var P : pchar;
S : string;
Q : string;
begin
S:="AAAA";
Q:=S+"bbb";
P:=pchar(Q);
myfunction(m, P);
end;


 
WarLord   (2003-05-30 17:07) [13]


> BigDaddy © (30.05.03 16:56)

попробуй по-простому:
param:=AllocMem(255);
strpcopy(q,param);
freemem(param,255);


 
WarLord   (2003-05-30 17:09) [14]

сорри

> param:=AllocMem(255);
> strpcopy(q,param);
myfunction(m, q);
> freemem(param,255);



 
BigDaddy   (2003-05-30 17:36) [15]

Я сдаюсь...
2Verg & WarLord: пробовал оба варианта. Нифига. Самое обидное, что ошибка, наверное, где-то на поверхности. Но я ее не вижу... Или проблема в компиляторе? И пора съезжать на Д5?....
Всем спасибо за поддержку, пошел искать другие компоненты работы с мускл...


 
Skier   (2003-05-30 17:44) [16]

>BigDaddy

> я вызываю ее так:
> mysql_real_query(m,PChar(query));

- Как объявлена mysql_real_query у тебя в вызывающей программе ?
- Что есть m ?


 
Владислав   (2003-05-30 17:57) [17]

> BigDaddy © (30.05.03 16:59)

А при чем здесь String to PChar? Не задумывался?


 
Anatoly Podgoretsky   (2003-05-30 18:05) [18]

Наверно межжу s и q не хватает пробела и тогда как раз может быть Command out of sync


 
BigDaddy   (2003-05-30 18:18) [19]

2Skier: Сорри, недоисправил при копировании на форум - я пробовал и mysql_query и mysql_real_query. Результат тот же. Реал квери отличается только тем, что там надо еще длинну запроса указать (в байтах).
m - это такая структура, которая держит всю инфу о мускл соединении. Там хост, юзера, ошибки и тд.

2Владислав: почитай мой вопрос. Если ты о том, зачем связываться с стрингом, а делать все на пчарах, то проблема в том, что если я _любым_ способом сооружаю запрос из отдельных составляющих, каждая из которых находится в переменной, то функция не работает. Если я сооружаю запрос явно, все работает.

то есть (повторюсь):
если
query: PChar;
q: PChar;
begin
.......
q:="aaaaa";
GetMem(query,255);
q:="INSERT INTO tbl (_test) VALUES ("";
StrCopy(query,q);
StrCat(query, "")");
// Сейчас query содержит строку INSERT INTO tbl (_test) VALUES ("aaaa") Проверял watch и добавлением в Мемо
mysql_query(m, query);
Вылезает ошибка.

Если сделать просто
query:="INSERT INTO tbl (_test) VALUES ("aaaa");
mysql_query(m, query);
Все работает.


 
BigDaddy   (2003-05-30 18:37) [20]

Мда... Склоняюсь к проблемам компилятора:

q:PChar;
query: PChar;

........
q:="INSERT INTO tbl (_test) VALUES ("aaaa");
query:=q;
mysql_query(m,query); //Работает!!!!

..............
q:="INSERT INTO tbl (_test) VALUES ("aaaa");
GetMem(query, 255);
StrCopy(query,q);
mysql_query(m, query); //Не работает!!!

Более того!!!!
q:="INSERT INTO tbl (_test) VALUES ("aaaa");
GetMem(query, 255);
StrCopy(query,q);
mysql_query(m, q); //Не работает!!!????? Почему???? Я в шоке...




 
Skier   (2003-05-30 18:41) [21]

q:="INSERT INTO tbl (_test) VALUES ("aaaa")";
GetMem(query, StrLen(q) + 1);
StrCopy(query,q);
mysql_query(m, query);
Не поможет ?


 
Serginio   (2003-05-30 18:42) [22]

GetMem(query, 255);
FillChar(query^,255,0);


 
Aladin   (2003-05-30 20:46) [23]

Может пробела не хватает? Q:=S+" bbb"


 
AbrosimovA   (2003-06-02 10:57) [24]

Попробуй так:

var
s:string;
q:PChar;
begin
s:="AAAAAA";
q:=PChar(s+"BBB");
myfunction(q);

end;


 
pasha_golub   (2003-06-02 11:17) [25]

Советую компоненты для МуСКЛ:

ZeosDBO - free;
MySQLDAC - shareware;



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

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

Наверх





Память: 0.5 MB
Время: 0.009 c
14-34998
DiamondShark
2003-05-26 16:44
2003.06.12
Чего-то многовато тем из спец. разделов


14-35029
Juster~
2003-05-27 09:01
2003.06.12
Рассылка


14-35073
Kaktuss
2003-05-28 08:26
2003.06.12
InstallShield Express и BDE


4-35103
Clickmaker
2003-04-13 17:28
2003.06.12
Удаление ключа из HKEY_CLASSES_ROOT без прав админа


3-34708
Weare
2003-05-22 15:56
2003.06.12
Непонятный глюк у TTable





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский