Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2] 3  Все   Вниз
  Печать  
Автор Тема: sqlplus  (Прочитано 43879 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #30 : 29-07-2008 13:38 » 

хотя, насчёт k+1 , от тебя требуется уточнение - параметр Field - это zb индекс ?
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #31 : 29-07-2008 13:40 » 

Алексей1153++,

Код:
==20503== Process terminating with default action of signal 11 (SIGSEGV)
==20503==  Bad permissions for mapped region at address 0x4010DC0
==20503==    at 0x8049754: c_sqlplus::f_execute() (main.cpp:72)
==20503==    by 0x8049BBB: main (main.cpp:7)

мне массивы все равно переделывать и собственно пока заморачиваться не охото над их размером и размещением в памяти, пусть будут вектора, но я сделал что ты просил ошибка выше! Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #32 : 29-07-2008 13:42 » 

Алексей1153++, на счет к+1 думаю ты не прав, так как до создания отдельной функции рисования все работало, проблемы начались именно с появлением функции. Что за zb индекс ?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #33 : 29-07-2008 13:49 » 

Макс, а вот это чё за фигня Улыбаюсь

Код:
void c_sqlplus::f_draw(SACommand* cmd_in)
{
    cmd_in = new SACommand; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

? ты же снаружи создал уже объект, а тут снова создаёшь
« Последнее редактирование: 29-07-2008 13:51 от Алексей1153++ » Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #34 : 29-07-2008 13:51 » 

Алексей1153++, у меня там уже все закоменчено Улыбаюсь ВСЯ ФУНКЦИЯ!!!
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #35 : 29-07-2008 13:59 » 

Макс, вот это работает, я проверил
(вылетало чисто изза к+1 - у тебя в двух местах это. И изза неинициализированных массивов Улыбаюсь )

Код:
class c_sqlplus
{
    public:
            void f_execute();
            void f_draw(/*SACommand*/BYTE* cmd_in);

            int len_f[1024];
            int len_v[1024];
            const char* buff_value[1024];
            const char* buff_field[1024];

            c_sqlplus();
            ~c_sqlplus();
};

c_sqlplus::c_sqlplus()
{
}

c_sqlplus::~c_sqlplus()
{
}

void c_sqlplus::f_draw(/*SACommand*/BYTE* cmd_in)
{
    //cmd_in = new SACommand;
//    using namespace std;

    for(int k=0; k+1<10/*cmd_in->FieldCount()*/; k++) //
    {
        len_f[k] = strlen(buff_field[k]);
        len_v[k] = strlen(buff_value[k]);
//        cout << "+";

        if(len_f[k] > len_v[k])
        {
            for(int i=0; i<len_f[k]; i++);
                //cout << "-";
        }

        if(len_f[k] < len_v[k])
        {
            for(int i=0; i<len_v[k]; i++);
                //cout << "-";
        }

                //cout << "+";
    }
}



void c_sqlplus::f_execute()
{

/*SACommand*/BYTE* cmd = new BYTE/*SACommand*/; // create command object

try
    {
       // con.Connect(instance, user, passwd, SA_Oracle_Client);
       // cmd->setConnection(&con);


// while(cmd->FetchNext())
    //    {
            for(int k = 0; k+1 < 10/*cmd->FieldCount()*/; k++)
            {
                buff_field[k] = "111";//cmd->Field(k+1).Name();
                buff_value[k] = "222";//cmd->Field(k+1).asString();
            }
//-----------------------------------------------------
            f_draw(cmd);
//-----------------------------------------------------
}
catch(...)
{
int iii=1;
}
int iii=1;

}


c_sqlplus ttt;
ttt.f_execute();



ещё я не использовал класс SACommand , может в нём дело
« Последнее редактирование: 30-07-2008 06:19 от Алексей1153++ » Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #36 : 29-07-2008 14:06 » 

если все закоментить оставить лишь выше описанное подключение, которое 100% рабочее и вот это

Код:
while(cmd.FetchNext())
        {
            for(int k = 0; k+1 < cmd.FieldCount(); k++)
            {
                cout << ok << endl;
                 //field[k] = "11";//cmd.Field(k+1).Name();
                //value[k] = "222";
                //field.push_back((const char*)cmd.Field(k+1).Name());
                //value.push_back((const char*)cmd.Field(k+1).asString());
            }
        }

то все гуд, работает, а если сделать вот так:

Код:
while(cmd.FetchNext())
        {
            for(int k = 0; k+1 < cmd.FieldCount(); k++)
            {
                 field[k] = "11";//cmd.Field(k+1).Name();
                //value[k] = "222";
                //field.push_back((const char*)cmd.Field(k+1).Name());
                //value.push_back((const char*)cmd.Field(k+1).asString());
            }
        }

то падает вот так:

Код:
==21886== Process terminating with default action of signal 11 (SIGSEGV)
==21886==  Bad permissions for mapped region at address 0x400FDC0
==21886==    at 0x804974D: c_sqlplus::f_execute() (main.cpp:72)
==21886==    by 0x80499C3: main (main.cpp:7)
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #37 : 29-07-2008 14:16 » 

останавливайся брекпоинтом на строке
field[k] = "11";//
и показывай значения:
к== ?
field[k] ==?
*field[k] ==?
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #38 : 29-07-2008 14:18 » 

Какое значение возвращает cmd.FieldCount()? Кстати, то, что он вызывается каждую итерацию - это нормально?
Какая размерность у field?
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #39 : 29-07-2008 15:08 » 

Алексей1153++Улыбаюсь) я же говорю что не могу воспользоваться дебагером.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #40 : 29-07-2008 15:12 » 

McZim, ну а твой любимый cout для чего ? )
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #41 : 29-07-2008 15:12 » 

Вад,
1. значение возвращается равное количеству стобцов в одной записи.
2. а что тут не нормального, проверяем в цткле "к" больше оно общего количества или нет. обычный цикл.
3. размерность 1024. это для тестов.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #42 : 29-07-2008 15:13 » 

Алексей1153++, зачем cout когда есть хороший инструмент как valgrind, который любезно ссобщает что я херово работаю с памятью.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #43 : 29-07-2008 15:22 » 

просто ты как-то неправильно используешь указатель field+k , я сейчас не могу понять

то есть значение &(field[k]) при некотором k указывает на память, которую уже нельзя пользовать
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #44 : 29-07-2008 15:28 » 

Алексей1153++, да возможно, ночекром буду разбираться.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #45 : 29-07-2008 18:44 » 

В общем проблема решилась, оказалось дело в моей не внимательности.

Код:
c_sqlplus* sql;
sql->f_execute();

а нужно:

Код:
c_sqlplus* sql = new c_sqlplus();
sql->f_execute();

Алексей1153++, скажи почему ты такой упор делаешь на k+1 я никак не пойму в чем ошибка?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #46 : 30-07-2008 04:33 » 

ну смотри:
к примеру, Counter() у тебя вернёт 10.

у тебя в цикле:
Код:
for(k=0;k<10;k++)
{
   GetField(k+1);
}

если GetField() должно принимать zb индекс, то оно на последней итерации получит 10 (а можно только 0...9)
По.тому условие должно быть

k<10 && k+1<10

или просто

k+1<10
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #47 : 30-07-2008 05:59 » 

Алексей1153++, не ты не прав Улыбаюсь GetField(k+1), а в моем случае cmd.Field(k+1) это номер столбца в таблице из которой я вынимаю имена столбцов и значения столбцов. Если я укажу просто cmd.Field(k), то программа упадет при первом проходе в цикле, потому как нумерация столбцов начинается не с 0 а с 1. А цикл остается обычный чтобы пройти по всем значениям. от 0 до 9 (допустим).
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #48 : 30-07-2008 06:16 » 

ну тогда всё правильно, значит индекс передаётся как не zb
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #49 : 30-07-2008 06:58 » 

Вад,
2. а что тут не нормального, проверяем в цткле "к" больше оно общего количества или нет. обычный цикл.

Ну, если там inline-подстановка выполнится, то ничего такого. Если же там идёт, скажем, трансляция вызова дальше, чтобы получить-таки общее количество откуда-то "из глубин", то, возможно, выполняется лишняя работа. Поэтому и спросил Улыбаюсь
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #50 : 30-07-2008 07:46 » 

Все работает Улыбаюсь Пока использую для хранения имен полей и значений полей:

Код:
std::vector<std::string> value;
std::vector<std::string> field;

для длин этих полей:

Код:
unsigned int len_f[1024];
unsigned int len_v[1024];

пока не определился что нужно, STL не очень люблю, но пока освобождает от думы про размерность Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #51 : 30-07-2008 08:28 » 

тоже не люблю STL, но сделал бы так

Код:
struct sNL
{
  std::string name;
  unsigned int len;
  sNL()
  {
     name="";
     len=0;
  }
};

std::vector<sNL> values;
std::vector<sNL> fields;

(не компилил, правда, проверить не могу Улыбаюсь) )
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #52 : 08-08-2008 08:31 » 

Всем привет. В продолжение проекту. Я работаю с ораклом используя библиотеку libsqlapi.so и вот что странно. Создан проект, в линкере указана эта библиотека, все работало, я удалил эту библиотеку из списка подключаемых в проекте, не пересобирая проект, тут же ее добавил, начал собирать проект и посывались ошибки:

Код:
||=== sqlplus-new, Debug ===|
/lib/../lib/libsqlapi.so||undefined reference to `dlsym'|
/lib/../lib/libsqlapi.so||undefined reference to `dlerror'|
/lib/../lib/libsqlapi.so||undefined reference to `dlopen'|
/lib/../lib/libsqlapi.so||undefined reference to `dlclose'|
||=== Build finished: 4 errors, 0 warnings ===|

т.е. видно что проблема не в библиотеки и не в том что ее линкер не находит. После этого иду в консоль, выполняю:

Код:
gcc main.cpp -l /lib/libsqlapi

и вижу вот такую ошибку:

Код:
/usr/bin/ld: cannot find -l/lib/libsqlapi
collect2: выполнение ld завершилось с кодом возврата 1

никак не могу понять, как оно только что работало а теперь не работает.

причем заметьте, когда выполняю компиляцию в консоле линкер не может найти библиотеку, очень странно.

З.Ы.: пробовал собирать под рутом, та же ситуация.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #53 : 08-08-2008 08:42 » 

McZim, подключи библиотеку libdl (dynamic library --  -ldl) и добавь в сборку ключик -shared.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #54 : 08-08-2008 08:47 » 

RXL, 5+ спасибо, оно самое, ключик -shared не понадобился.

Вот только не понятно почему поведение разное??? Работало-работало, потом не работает?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #55 : 08-08-2008 09:30 » 

В процессе работы делай копии и потом сравнивай, что изменилось - только так.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #56 : 26-08-2008 10:23 » 

Предыстория:

вектор мне нужно иметь обязательно string, положить я в него в чистом виде из Field(k+1).Name() немогу, могу через преобразование в const char*. Все хорошо, но как только мне в БД встречаются строки состоящие из русских букв, у меня рисование рамки начинает смещаться, все потому что длина русских и английских разная, т.е. мне нужно уметь работать со строками, пока что мной было принято решение воспользоваться не string а wstring, соответственно, в такой вектор я могу положить тип const wchar_t*, но его не понимает Field(k+1).Name(), вот и решил делать через преобразование типов, конечно понимаю что лучше всего это избежать, но пока не знаю как, не работал я с кодировками и символами, может кто подскажет по лучше способ, а пока что:

Вот так все замечательно работает:

Код:
typedef std::vector<std::string> column_t;

Код:
column_t col;
                col.push_back((const char*)cmd.Field(k+1).Name());

а вот так не работает, т.е. работает но на выходе я получаю не значения а адреса памяти, где то запарился с указателями, не могу понять где?

Код:
typedef std::vector<std::wstring> column_t;

Код:
column_t col;
                col.push_back(static_cast<const wchar_t*>(static_cast<const void*>(cmd.Field(k+1).Name())));
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #57 : 26-08-2008 10:32 » 

McZim, Oracle у тебя возвращает в какой кодировке? Строка NLS какая? Я так понял, что utf-8.

Соотв., в wchar_t != utf-8 - это unicode 16 бит.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #58 : 26-08-2008 10:35 » 

ага utf-8, вот гадство блин Улыбаюсь

кстате не знаешь как можно раотать с разными кодировками? У меня могут встречать кодировки, utf-8, koi8-r
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #59 : 26-08-2008 17:50 » 

итак:

Код:
int main()
{
string str1;
cin >> str1;
cout << endl << "You print string: " << str1 << endl;
cout << "length string: " << str1.length() << endl;

    return 0;
}

результат:

Код:
mczim@mczim-desktop:# ./1
Input string:
qwerty

You print string: qwerty
length string: 6

mczim@mczim-desktop:# ./1
Input string
йцукен

You print string: йцукен
length string: 12

применимо к моей прграмме (sqlplus), если я считываю из базы строку состоящую из русских символов, то при том же количестве символов я получаю совершенно другую длину строки, в следствии чего у меня происходит смещение рисования таблицы, основанное на длине строки.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Страниц: 1 [2] 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines