Главная страница
    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.008 c
1-34806
Genik
2003-06-02 11:55
2003.06.12
Задержка


14-35057
Pat
2003-05-20 19:46
2003.06.12
25 кадр


4-35109
Anonimus
2003-04-14 10:21
2003.06.12
Обработка событий от мыши..


1-34795
Fuelfire
2003-06-02 13:32
2003.06.12
Как экспортнуть данные из таблицы Paradox??


4-35098
Gayrus
2003-04-10 03:10
2003.06.12
Связь с DLL





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