Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
обработка строк в С функции
|
|||
|---|---|---|---|
|
#18+
написал функцию на С, котрая парсит строки. Когда выполняю функцию в консоли Linux, все работает отлично, когда инсталирую ее в PostgreSQL, сишные функции для работы со строками выдают неверные результаты. Например, strlen() всегда выдает 1, strcpy() копирует пустую строку. strchr() возвращает пустой указатель. Я подозреваю, что проблема с передачей переменных во внутрь функции. Вот несколько простых примеров, демонстрируующих проблему: int strfunc(char * st1) { return strlen(st1); } возвращает 1, должно возвращать реальную длину стоки char *strfunc2(char * st1) { static char res[20] = ""; strcpy(res, st1); return res; } возвращает пустую строку char *strfunc3(char * st1) { return st1; } это работает правильно int strfunc4() { static char res[20] = "test this"; return strlen(res); } это тоже работает правильно Функцию инсталировал таким образом: CREATE FUNCTION strfunc(varchar) RETURNS integer AS '/var/lib/pgsql/strfunc.so' , 'strfunc' LANGUAGE 'C'; Пробовал на PostgreSQL 7.3.2 и 7.3.4 Помогите, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2005, 19:58 |
|
||
|
обработка строк в С функции
|
|||
|---|---|---|---|
|
#18+
доки читай ... там совсем по другому надо передовать и возврящать параметры.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2005, 11:47 |
|
||
|
обработка строк в С функции
|
|||
|---|---|---|---|
|
#18+
_Arthur_написал функцию на С, котрая парсит строки..... int strfunc(char * st1) { return strlen(st1); } char *strfunc2(char * st1) { return res; } char *strfunc3(char * st1) { return st1; } int strfunc4() { return strlen(res); } ...CREATE FUNCTION strfunc(varchar) RETURNS integer..... 1) если примеры "боевые", то они возвращают РАЗНЫЕ типы - что есть уже неправильно (см. креате фанкшион). Если типы не совпадают (особенно при возврате) - обращение куда нить не туда практически гарантирован (ну и падёж, как следствие). 2) постгрес использует своё, внутреннее представление данных. И оно отличаеться от сишного (ищите DATUM). 3) Время жизни данных (особенно тех, которые по размерам превышают регистры проца) - очень актуально ! Не забывайте, что память выделена НЕ Вами ! с уважением (круглый) ЗЫ Пример в доке по постгрессу (серверный пример) - рабочий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2005, 16:06 |
|
||
|
обработка строк в С функции
|
|||
|---|---|---|---|
|
#18+
спасибо за помощь, перечитал еще раз доки. дело в передаче параметров. вот такой код работает: text * copytext(text *t) { /* * VARSIZE is the total size of the struct in bytes. */ text *new_t = (text *) palloc(VARSIZE(t)); VARATT_SIZEP(new_t) = VARSIZE(t); /* * VARDATA is a pointer to the data region of the struct. */ memcpy((void *) VARDATA(new_t), /* destination */ (void *) VARDATA(t), /* source */ VARSIZE(t)-VARHDRSZ); /* how many bytes */ return new_t; } text * concat_text(text *arg1, text *arg2) { int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ; text *new_text = (text *) palloc(new_text_size); VARATT_SIZEP(new_text) = new_text_size; memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1)-VARHDRSZ); memcpy(VARDATA(new_text) + (VARSIZE(arg1)-VARHDRSZ), VARDATA(arg2), VARSIZE(arg2)-VARHDRSZ); return new_text; } строки передаются как тип text, а это - структура struct varlena { int32 vl_len; char vl_dat[1]; } typedef struct varlena text; буду теперь пытаться всю эту красоту скармливать строковым функциям. посмотрим что получится :-) 2 kolobok0 спасибо за советы, особенно про время жизни переменных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2005, 21:24 |
|
||
|
|

start [/forum/topic.php?fid=53&tid=2007054]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
152ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 278ms |
| total: | 538ms |

| 0 / 0 |
