Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kapitan79
3 / 3 / 0
Регистрация: 13.10.2013
Сообщений: 152
#1

Возвращение массива в качестве результата выполнения метода класса (Kubuntu, netBeans, g++) - C++

23.11.2014, 17:25. Просмотров 250. Ответов 2
Метки нет (Все метки)

Всем привет.

Пытаюсь написать свой первый демон на C++ по образу и подобию сделанного на PHP.

Столкнулся со следующей проблемой.

В PHP у меня был универсальный класс, методы которого принимали массивы параметров запроса к mysql (поля, таблицы и т.д.), после чего выполняли операции над базой данных по этим параметрам.

Пытаюсь сейчас воспроизвести это в с++.

Вроде всё уже осилил, но осталась одна проблема - мне никак не удаётся передать обратно в функцию main получившийся после select массив.

На различных форумах вообще советуют не передавать массивы между функциями.
Посоветуйте с какой стороны лучше подойти и как реализовать данную задачу.

Сейчас код следующий

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* 
 * File:   query_class.h
 * Author: fedoseev
 *
 * Created on 22 Ноябрь 2014 г., 18:11
 */
 
#ifndef QUERY_CLASS_H
#define QUERY_CLASS_H
 
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
 
#include <mysql/mysql_connection.h>
 
#include <mysql/cppconn/driver.h>
#include <mysql/cppconn/exception.h>
#include <mysql/cppconn/resultset.h>
#include <mysql/cppconn/statement.h>
#include <string>
 
using namespace std;
 
class query_class {
public:
    query_class();
    int i;
    int j;
    typedef string arr_string[1000][1000]; 
    arr_string     select()                    ;
    int     num_arr_dict                ;
    int     num_arr_field               ;
    string *addr_arr_dict = new string[num_arr_dict];
    string *addr_arr_field = new string[num_arr_field];    
 
private:
    
 
    
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* 
 * File:   query_class.cpp
 * Author: fedoseev
 * 
 * Created on 22 Ноябрь 2014 г., 18:11
 */
 
#include "query_class.h"
 
using namespace std;
 
query_class::query_class() 
{
    
}
 
query_class::arr_string query_class::select()
{    
 
    sql::Driver     *driver ;
    sql::Connection *con    ;
    sql::Statement  *stmt   ;
    sql::ResultSet  *res    ;
    query_class     q       ;
    string          field = ""  ;
    string          dict  = ""  ;
    string          select= "select";
    string          from  = "from";
    string          query = ""  ;      
    /* Создание соединения */
    driver = get_driver_instance();
    con = driver->connect("tcp://192.168.0.98:3306", "developer", "yfc#O7tt");
    
    /* Подключение к базе данных mysql */
    con->setSchema("scada");
    
    /* Создание строки со списком полей для запроса */
    int num_field = sizeof(q.addr_arr_field)/sizeof(string);
    for (int i=0; i<(num_field); i++)
    {
        if (field == "") {field = q.addr_arr_field[i];}
        if (field != "") {field += q.addr_arr_field[i];}
        
        
    }
    
        for (int i=0; i<sizeof(q.addr_arr_dict); i++)
    {
        if (dict == "") {dict = q.addr_arr_dict[i];}
        if (dict != "") {dict += q.addr_arr_dict[i];}
    }
    
    query = select + field + from + dict;
    stmt = con->createStatement();
    res = stmt->executeQuery(query);
    int num_res = (sizeof res)/sizeof(string);//получение длины массива делением длины массива в байтах на размер памяти, выделяемой для переменной данного типа
    string addr_arr_result[num_field][num_res] ; 
    int j = 0;
    while (res->next())
    {
        for (int i=0; i<num_field; i++)
            {
              addr_arr_result[j][i] = res->getInt(q.addr_arr_field[i]);
              j++;
            }
    }
 
    delete res;
    delete stmt;
    delete con;
 
 
return addr_arr_result;
}
Добавлено через 2 часа 54 минуты
Возможно я не отразил суть вопроса.

Массив, который необходимо возвратить формируется внутри метода.
В зависимости от результатов запроса его размер разный, а значит определить тип возвращаемого значения функции трудно. Не знаю как к этому подступиться.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2014, 17:25     Возвращение массива в качестве результата выполнения метода класса (Kubuntu, netBeans, g++)
Посмотрите здесь:

C++ [C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc()
C++ Передача метода класса в качестве параметра для метода другого класса
C++ двумерный массив в качестве параметра метода класса
C++ Передача enum в качестве аргумента метода класса
C++ Странности с неразрешёнными файлами include (Kubuntu, NetBeans)
C++ #include <exception> (kubuntu, NetBeans, g++)
Возвращение временного объекта из метода C++
C++ Передача члена класса в качестве параметра метода
C++ Использование динамического массива в качестве переменной класса
C++ Возвращение объекта класса из i-го элемента массива
C++ Передача метода класса в качестве аргумента внешней функции

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
23.11.2014, 18:52     Возвращение массива в качестве результата выполнения метода класса (Kubuntu, netBeans, g++) #2
Kapitan79,
Этот ужас нужно убрать:
C++
1
2
3
4
    int     num_arr_dict                ;
    int     num_arr_field               ;
    string *addr_arr_dict = new string[num_arr_dict];
    string *addr_arr_field = new string[num_arr_field];
Как ты думаешь, каков будет размер массива выделенного здесь?

Цитата Сообщение от Kapitan79 Посмотреть сообщение
C++
1
sizeof(q.addr_arr_dict);
Этот код получается размер указателя, а не массива.

Цитата Сообщение от Kapitan79 Посмотреть сообщение
C++
1
sizeof res
Это опять же размер указателя res.

Цитата Сообщение от Kapitan79 Посмотреть сообщение
Массив, который необходимо возвратить формируется внутри метода.
В С++ массивы нельзя возвращать по значению.
Используй std::vector.
Kapitan79
3 / 3 / 0
Регистрация: 13.10.2013
Сообщений: 152
23.11.2014, 20:17  [ТС]     Возвращение массива в качестве результата выполнения метода класса (Kubuntu, netBeans, g++) #3
Спасибо!
Похоже вектор -то что мне было нужно.
Yandex
Объявления
23.11.2014, 20:17     Возвращение массива в качестве результата выполнения метода класса (Kubuntu, netBeans, g++)
Ответ Создать тему
Опции темы

Текущее время: 06:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru