powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция на С++. Передача массива
5 сообщений из 5, страница 1 из 1
Функция на С++. Передача массива
    #38745855
Symantek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Свел задачу к минимуму. Нужно передать массив из 5 элементов и вывести значение, например, 4-го.

Код C++

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#define _CRT_SECURE_NO_WARNINGS
#include "postgres.h"
#include "fmgr.h"
#include "stdio.h"
#include "math.h"
 
#define WIN32_LEAN_AND_MEAN
#define NOCOMM
 
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
 
#if defined(_WIN32)
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT
#endif
 
DLLEXPORT
int approx(int anyarr1[]) {
    return anyarr1[3];
}



Скомпилировал, выполняю запрос
select approx(array[1,3,4,21,8])

Результат 23.
Стал разбираться, начал смотреть значение каждого индекса, в итоге собрался массив вида
{176, 1, 0, 23, 5, 1, 3, 4, 21, 8, 7}
Последний 5 элементов совпадают с тем, что передано, а первые 5 не пойму откуда берутся.
Помогите разобраться.
...
Рейтинг: 0 / 0
Функция на С++. Передача массива
    #38745856
Symantek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В дополнение.
CREATE OR REPLACE FUNCTION approx(integer[])
RETURNS integer AS
'$libdir/approx', 'approx'
LANGUAGE c
COST 1;
ALTER FUNCTION approx(integer[])
OWNER TO postgres;
...
Рейтинг: 0 / 0
Функция на С++. Передача массива
    #38746162
жопка3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Symantek,
Чисто подозрение - тип array из postgresql не соответствует POD array в c++. Например, весьма подозрительным выглядит число 5 перед самими значениями - как будто размер самого массива. Собственно первые ссылки из гугла, вроде бы как, подтверждают гипотезу. Решение - правильная конвертация из типа array в postgresql в тот тип данных в полюсах, что вам нужен. Опять же, не имею никакого опыта работы с postgresql, просто наблюдение. Т.е. вместо указателя на into там лежит более хитрая структура.
...
Рейтинг: 0 / 0
Функция на С++. Передача массива
    #38746195
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Symantek,
посмотрите:

1)
http://www.postgresql.org/docs/9.3/static/xfunc-c.html

35.9.4. Version 1 Calling Conventions

PG_FUNCTION_ARGS
PG_GETARG_*
PG_RETURN_*

2)
http://doxygen.postgresql.org/array_8h_source.html

ArrayType
PG_GETARG_ARRAYTYPE_P
ARR_DATA_PTR

3) вариант получения сылки на значения в контрибе intarray
http://www.postgresql.org/docs/9.3/static/intarray.html

http://doxygen.postgresql.org/__int_8h.html
#define ARRPTR ( x ) ( (int32 *) ARR_DATA_PTR(x) )
...
Рейтинг: 0 / 0
Функция на С++. Передача массива
    #38751064
Гость_5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция на С++. Передача массива
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]