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

Передача массивов и параметров с одной функции в другую - C++

Восстановить пароль Регистрация
 
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 40
17.03.2013, 23:06     Передача массивов и параметров с одной функции в другую #1
Здравствуйте. Я пишу программу, она состоит из множества функций. И у меня возникло море вопросов. Чур камнями не бросаться.
1)Как правильно определять выходные данные? их тоже надо прописывать в аргументах?
2)Я описала VectorArray, Gradient, tab как глобальные значения, потому что если их делать как локальные в main он выдает что ошибка, и они не определены, а они определяются уже далее в функциях, как лучше?

Каждая функция в отдельности работает, а вот когда я пытаюсь их поставить в одну программу не выходит. Подскажите позязя!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using namespace std;
 
double* Gradient;
vector<double> VectorArray;
double* tab;
 
void ReadData(char*, vector<double>, int&, int&);
void ConvertVectorToDoubleArray(vector<double>, double*, int, int);
void WriteData(char*, double*, int, int);
int EdgeDetection(double*, double*, int, int);
 
int main()
{
    int raw=1;
    int column=0;
    ReadData("EdgeInput.txt",VectorArray, raw, column);/* открывает файл считывает данные в вектор, определяет значения raw и column - используются значения далее во всех функциях ()*/
    ConvertVectorToDoubleArray(VectorArray, tab, raw, column);/*конвертор из вектора который мы определяем в предыдущей функции в массив указателей*/
    EdgeDetection(tab, Gradient, raw, column);/*с массивом tab проделывается ряд мат действий получаем массив Gradient*/
    WriteData("EdgeResult.txt", Gradient, raw, column);/* просто записывается Gradient в файл*/
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2013, 23:06     Передача массивов и параметров с одной функции в другую
Посмотрите здесь:

C++ Передача массивов в качесте параметров
C++ Передача элементов массива из одной функции в другую
Передача размерности массива как параметр из одной функции в другую. C++
C++ Передача значения переменной из одной формы в другую
Передача массива из одной функции в другую, и сложение его элементов. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.03.2013, 00:06     Передача массивов и параметров с одной функции в другую #2
Цитата Сообщение от Eumi Посмотреть сообщение
Я описала VectorArray, Gradient, tab как глобальные значения
Не обязательно. Передавайте вектор по ссылке в функции. Остальное должно работать.
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 40
18.03.2013, 01:07  [ТС]     Передача массивов и параметров с одной функции в другую #3
хм, он мне выдает что так же массив tab не определен.

А если таким образом как я задала, выходные значения из одной функции передаются в след функцию?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
18.03.2013, 01:22     Передача массивов и параметров с одной функции в другую #4
глобальные - это плохо. голые массивы - тоже. лучше вектора.
входные параметры передаются по значению или константной ссылке, выходные - по неконстантной ссылке или ко указателю. (если выходной параметр - указатель, то в функцию нужно отдавать указатель на указатель в общем лучше пользоваться ссылками)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void convert(const std::vector<int>& source, std::vector<int>& result)
{
   result = source; // ну тут конверсия - это простое копирование.
}
 
int main()
{
    std::vector<int> data;
    // тут заполняем вектор data
    std::vector<int> convertedData;
    convert(data, convertedData);
 
   // вот тут после такой конверсии вектора станут одинаковыми.
 
   return 0;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.03.2013, 01:45     Передача массивов и параметров с одной функции в другую #5
Цитата Сообщение от Eumi Посмотреть сообщение
А если таким образом как я задала, выходные значения из одной функции передаются в след функцию?
Вектор нет. И покажите, что у вас в функциях делается.

Добавлено через 7 минут
Цитата Сообщение от Eumi Посмотреть сообщение
хм, он мне выдает что так же массив tab не определен.
С tab и Gradient у вас непонятно, что это... Если это указатели на массивы указателей ("конвертор из вектора который мы определяем в предыдущей функции в массив указателей"), то тогда:
C++
1
2
double **Gradient
double **tab;
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 40
18.03.2013, 02:09  [ТС]     Передача массивов и параметров с одной функции в другую #6
Цитата Сообщение от DU Посмотреть сообщение
глобальные - это плохо. голые массивы - тоже. лучше вектора.
входные параметры передаются по значению или константной ссылке, выходные - по неконстантной ссылке или ко указателю. (если выходной параметр - указатель, то в функцию нужно отдавать указатель на указатель в общем лучше пользоваться ссылками)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void convert(const std::vector<int>& source, std::vector<int>& result)
{
   result = source; // ну тут конверсия - это простое копирование.
}
 
int main()
{
    std::vector<int> data;
    // тут заполняем вектор data
    std::vector<int> convertedData;
    convert(data, convertedData);
 
   // вот тут после такой конверсии вектора станут одинаковыми.
 
   return 0;
}
Вектора к сожалению тут не проконают, нужен динамический массив. Попробую использовать ссылку, спасибо=)

Цитата Сообщение от alsav22 Посмотреть сообщение
Вектор нет. И покажите, что у вас в функциях делается.

Добавлено через 7 минут
С tab и Gradient у вас непонятно, что это... Если это указатели на массивы указателей ("конвертор из вектора который мы определяем в предыдущей функции в массив указателей"), то тогда:
C++
1
2
double **Gradient
double **tab;
тут вся прога, к сожалению без комментариев, прошу прощения =) сил писать их нет пока что=) в общем тут файл, считываются данные с файла в вектор, определяется размер, далее идет конвертор, с вектора в динамический массив, и этот массив обрабатывается методом градиентов. получаем результирующую матрицу, которая так же записывается в файл. Каждая функция по отдельности работает. Компилирую, ошибок нет, но файл с результирующей матрицей пустой.

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>
 
using namespace std;
 
double* Gradient;
vector<double> VectorArray;
double* tab;
 
void ReadData(char*, vector<double>, int&, int&);
void ConvertVectorToDoubleArray(vector<double>, double*, int, int);
void WriteData(char*, double*, int, int);
int EdgeDetection(double*, double*, int, int);
 
int main()
{
    int raw=1;
    int column=0;
    ReadData("EdgeInput.txt",VectorArray, raw, column);
    ConvertVectorToDoubleArray(VectorArray, tab, raw, column);
    EdgeDetection(tab, Gradient, raw, column);
    WriteData("EdgeResult.txt", Gradient, raw, column);
}
 
void ReadData(char* filename, vector<double> OutputVector, int& raw, int& column)
{
    ifstream EdgeInputData(filename);
    if (!EdgeInputData) 
        cerr << "Error! Can't open the input file.\n";
    double InterveningVariable=0;
    while (!EdgeInputData.eof())
    {
        EdgeInputData>>InterveningVariable;
        OutputVector.push_back(InterveningVariable);
        char c;
        EdgeInputData.get(c);
        if (c=='\n')
            raw++;
        column=OutputVector.size()/raw;
    }
    EdgeInputData.close();
}
 
void WriteData(char* filename, double* matrix, int raw, int column)
{
    ofstream EdgeResultFile(filename); //Open a file for output
    if (!EdgeResultFile) 
        cerr << "Error! Can't open the output file.\n";
    int i=0;
    int j=0;
    for (i=0; i<raw; i++)
    {
        for(j=0; j<column; j++)
            EdgeResultFile<<matrix[i*column+j]<<" ";
        EdgeResultFile<<"\n";
    }
    EdgeResultFile.close(); 
    delete []matrix;
}
 
 
void ConvertVectorToDoubleArray(vector<double> InputVector, double* OutputArray, int raw, int column)
{
    OutputArray=new double[raw*column];
    int i=0;
    int j=0;
    for (i=0; i<raw; i++)
        for (j=0; j<column; j++)
            OutputArray[i*column + j] = InputVector[i*column + j];
}
 
int EdgeDetection(double* InputArray, double* G, int raw, int column)
{
    int i=0;
    int j=0;
    double *GC;
    GC=new double[raw*column];
    for (i=0; i<raw; i++)
        for(j=0; j<column; j++)
        {
            if (j==column-1)
                GC[i*column+j] = InputArray[i*column+j] - InputArray[i*column+j-1];//The boundary
            else 
                GC[i*column+j] = InputArray[i*column+j] - InputArray[i*column+j+1];
        }
    /*Forming array inlude raw gradients*/
    double *GR;
    GR=new double[raw*column];
    for (j=0; j<column; j++)
        for(i=raw-1; i>=0; i--)
        {
            if (i==0)
                GR[i*column+j] = InputArray[i*column+j] - InputArray[(i+1)*column+j];//The boundary
            else
                GR[i*column+j] = InputArray[i*column+j] - InputArray[(i-1)*column+j];//The row gradient
                
        }
    /*The edge gradient and saving the data in file*/
    double *G;
    G=new double[raw*column];
    for (i=0; i<raw; i++)
        for(j=0; j<column; j++)
            G[i*column+j] = abs(GC[i*column + j]) + abs(GR[i*column + j]);
    WriteData("EdgeResult.txt", G, raw, column);
    delete []GR;
    delete []GC;
    delete []InputArray;
    return 0;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.03.2013, 02:29     Передача массивов и параметров с одной функции в другую #7
Данные в файле как выглядят? А лучше выложите файл.
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 40
18.03.2013, 03:06  [ТС]     Передача массивов и параметров с одной функции в другую #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Данные в файле как выглядят? А лучше выложите файл.
Вот так.

в выходном мы определяем границу:

0 0 0 0 0
0 0 0 0 0
0 1 1 1 1
0 1 0 0 0
0 1 0 0 0
Вложения
Тип файла: txt EdgeInput.txt (53 байт, 2 просмотров)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.03.2013, 04:52     Передача массивов и параметров с одной функции в другую #9
Так работает:
Кликните здесь для просмотра всего текста
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include <fstream>
#include <vector>
 
using namespace std;
 
void ReadData(const char*, vector<double>&, int&, int&);
void ConvertVectorToDoubleArray(vector<double>&, double*&, int, int);
int EdgeDetection(double*&, double*&, int, int);
void WriteData(const char*, double*&, int, int);
 
 
int main()
{
    double* Gradient;
    vector<double> VectorArray;
    double* tab;
    
    int raw=1;
    int column=0;
    
    ReadData("EdgeInput.txt", VectorArray, raw, column);
    ConvertVectorToDoubleArray(VectorArray, tab, raw, column);
    EdgeDetection(tab, Gradient, raw, column);
    WriteData("EdgeResult.txt", Gradient, raw, column);
 
    cin.get();
}
 
void ReadData(const char* filename, vector<double> &OutputVector, int& raw, int& column)
{
    ifstream EdgeInputData(filename);
    if (!EdgeInputData) 
        cerr << "Error! Can't open the input file.\n";
    double InterveningVariable=0;
    while (!EdgeInputData.eof())
    {
        EdgeInputData>>InterveningVariable;
        OutputVector.push_back(InterveningVariable);
        char c;
        EdgeInputData.get(c);
        if (c=='\n')
            raw++;
        column=OutputVector.size()/raw;
    }
    EdgeInputData.close();
}
 
 
void ConvertVectorToDoubleArray(vector<double> &InputVector, double* &OutputArray, int raw, int column)
{
    OutputArray=new double[raw*column];
    int i=0;
    int j=0;
    for (i=0; i<raw; i++)
        for (j=0; j<column; j++)
            OutputArray[i*column + j] = InputVector[i*column + j];
}
 
int EdgeDetection(double* &InputArray, double* &G, int raw, int column)
{
    int i=0;
    int j=0;
    double *GC;
    GC=new double[raw*column];
    for (i=0; i<raw; i++)
        for(j=0; j<column; j++)
        {
            if (j==column-1)
                GC[i*column+j] = InputArray[i*column+j] - InputArray[i*column+j-1];//The boundary
            else 
                GC[i*column+j] = InputArray[i*column+j] - InputArray[i*column+j+1];
        }
    /*Forming array inlude raw gradients*/
    double *GR;
    GR=new double[raw*column];
    for (j=0; j<column; j++)
        for(i=raw-1; i>=0; i--)
        {
            if (i==0)
                GR[i*column+j] = InputArray[i*column+j] - InputArray[(i+1)*column+j];//The boundary
            else
                GR[i*column+j] = InputArray[i*column+j] - InputArray[(i-1)*column+j];//The row gradient
                
        }
    /*The edge gradient and saving the data in file*/
    //double *G;
    G=new double[raw*column];
    for (i=0; i<raw; i++)
        for(j=0; j<column; j++)
            G[i*column+j] = abs(GC[i*column + j]) + abs(GR[i*column + j]);
    
    delete [] GR;
    delete [] GC;
    delete [] InputArray;
    
    return 0;
}
 
 
void WriteData(const char* filename, double* &matrix, int raw, int column)
{
    ofstream EdgeResultFile(filename); //Open a file for output
    if (!EdgeResultFile) 
        cerr << "Error! Can't open the output file.\n";
    int i=0;
    int j=0;
    for (i=0; i<raw; i++)
    {
        for(j=0; j<column; j++)
            EdgeResultFile<<matrix[i*column+j]<<" ";
        EdgeResultFile<<"\n";
    }
    EdgeResultFile.close(); 
    delete []matrix;
}


Добавлено через 34 минуты
Немного дополненный код (чтобы входной и выходной файлы были идентичны по формату: в конце строк нет пробелов и в конце последней строки нет символа новой строки):
Кликните здесь для просмотра всего текста
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <iostream>
#include <fstream>
#include <vector>
 
using namespace std;
 
void ReadData(const char*, vector<double>&, int&, int&);
void ConvertVectorToDoubleArray(vector<double>&, double*&, int, int);
int EdgeDetection(double*&, double*&, int, int);
void WriteData(const char*, double*&, int, int);
 
 
int main()
{
    double* Gradient;
    vector<double> VectorArray;
    double* tab;
    
    int raw=0;
    int column=0;
    
    ReadData("EdgeInput.txt", VectorArray, raw, column);
    ConvertVectorToDoubleArray(VectorArray, tab, raw, column);
    EdgeDetection(tab, Gradient, raw, column);
    WriteData("EdgeResult.txt", Gradient, raw, column);
 
}
 
void ReadData(const char* filename, vector<double> &OutputVector, int& raw, int& column)
{
    ifstream EdgeInputData(filename);
    if (!EdgeInputData) 
        cerr << "Error! Can't open the input file.\n";
    double InterveningVariable=0;
    while (!EdgeInputData.eof())
    {
        EdgeInputData>>InterveningVariable;
        OutputVector.push_back(InterveningVariable);
        
        if (EdgeInputData.peek() =='\n' || EdgeInputData.peek() == EOF)
            raw++;
    }
    column = OutputVector.size()/raw;
    
    EdgeInputData.close();
}
 
 
void ConvertVectorToDoubleArray(vector<double> &InputVector, double* &OutputArray, int raw, int column)
{
    OutputArray=new double[raw*column];
    int i=0;
    int j=0;
    for (i=0; i<raw; i++)
        for (j=0; j<column; j++)
            OutputArray[i*column + j] = InputVector[i*column + j];
}
 
int EdgeDetection(double* &InputArray, double* &G, int raw, int column)
{
    int i=0;
    int j=0;
    double *GC;
    GC=new double[raw*column];
    for (i=0; i<raw; i++)
        for(j=0; j<column; j++)
        {
            if (j==column-1)
                GC[i*column+j] = InputArray[i*column+j] - InputArray[i*column+j-1];//The boundary
            else 
                GC[i*column+j] = InputArray[i*column+j] - InputArray[i*column+j+1];
        }
    /*Forming array inlude raw gradients*/
    double *GR;
    GR=new double[raw*column];
    for (j=0; j<column; j++)
        for(i=raw-1; i>=0; i--)
        {
            if (i==0)
                GR[i*column+j] = InputArray[i*column+j] - InputArray[(i+1)*column+j];//The boundary
            else
                GR[i*column+j] = InputArray[i*column+j] - InputArray[(i-1)*column+j];//The row gradient
                
        }
    /*The edge gradient and saving the data in file*/
    G=new double[raw*column];
    for (i=0; i<raw; i++)
        for(j=0; j<column; j++)
            G[i*column+j] = abs(GC[i*column + j]) + abs(GR[i*column + j]);
    
    delete [] GR;
    delete [] GC;
    delete [] InputArray;
    
    return 0;
}
 
 
void WriteData(const char* filename, double* &matrix, int raw, int column)
{
    ofstream EdgeResultFile(filename); //Open a file for output
    if (!EdgeResultFile) 
        cerr << "Error! Can't open the output file.\n";
    int i=0;
    int j=0;
    for (i=0; i<raw; i++)
    {
        for(j=0; j<column; j++)
        {
            EdgeResultFile << matrix[i*column+j];
            if (j < column - 1) EdgeResultFile << " ";
        }
        if (i < raw - 1) EdgeResultFile << "\n";
    }
    EdgeResultFile.close(); 
    
    delete []matrix;
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
18.03.2013, 09:41     Передача массивов и параметров с одной функции в другую #10
C++
1
Вектора к сожалению тут не проконают, нужен динамический массив. Попробую использовать ссылку, спасибо=)
Вот это вот неправда. Вектор сделан специально так, чтобы заменить собой динамические массивы.

Добавлено через 8 минут
допустим заранее вам нужно вызвать функию, которая принимает указатель на массив, чтобы его заполнить. И изменить сигнатуру этой функции нельзя:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 // вот эта функция, изменить которую вы не можете.
void libFunction(int* arr, unsigned arrSize);
 
void myFunction(std::vector<int>& v)
{
   v.resize(100);
   libFunction(&v[0], v.size()); // вектор подходит
}
 
int main()
{
   std::vector<int> v;
   myFunction(v);
}
Второй вариант, когда функция, изменить которую вы не можете сама выделяет массивы динамически:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// вот эта функция, изменить которую вы не можете.
// она выделяет массив. на выходе указатель на этот массив и его размер
void libFunction(int** arr, unsigned* arrSize);
 
void myFunction(std::vector<int>& v)
{
   int* arr = 0;
   unsigned size = 0;
   libFunction(&arr, &size);
   v.assign(arr, arr + size); // да, тут получается лишнее копирование, но код с векторами проще.
   delete [] arr;                // не нужно везде следить за тем, что нужно удалить, а что не нужно.
}
 
int main()
{
   std::vector<int> v;
   myFunction(v);
}
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 40
18.03.2013, 12:54  [ТС]     Передача массивов и параметров с одной функции в другую #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Так работает:
Кликните здесь для просмотра всего текста
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include <fstream>
#include <vector>
 
using namespace std;
 
void ReadData(const char*, vector<double>&, int&, int&);
void ConvertVectorToDoubleArray(vector<double>&, double*&, int, int);
int EdgeDetection(double*&, double*&, int, int);
void WriteData(const char*, double*&, int, int);
 
 
int main()
{
    double* Gradient;
    vector<double> VectorArray;
    double* tab;
    
    int raw=1;
    int column=0;
    
    ReadData("EdgeInput.txt", VectorArray, raw, column);
    ConvertVectorToDoubleArray(VectorArray, tab, raw, column);
    EdgeDetection(tab, Gradient, raw, column);
    WriteData("EdgeResult.txt", Gradient, raw, column);
 
    cin.get();
}
 
void ReadData(const char* filename, vector<double> &OutputVector, int& raw, int& column)
{
    ifstream EdgeInputData(filename);
    if (!EdgeInputData) 
        cerr << "Error! Can't open the input file.\n";
    double InterveningVariable=0;
    while (!EdgeInputData.eof())
    {
        EdgeInputData>>InterveningVariable;
        OutputVector.push_back(InterveningVariable);
        char c;
        EdgeInputData.get(c);
        if (c=='\n')
            raw++;
        column=OutputVector.size()/raw;
    }
    EdgeInputData.close();
}
 
 
void ConvertVectorToDoubleArray(vector<double> &InputVector, double* &OutputArray, int raw, int column)
{
    OutputArray=new double[raw*column];
    int i=0;
    int j=0;
    for (i=0; i<raw; i++)
        for (j=0; j<column; j++)
            OutputArray[i*column + j] = InputVector[i*column + j];
}
 
int EdgeDetection(double* &InputArray, double* &G, int raw, int column)
{
    int i=0;
    int j=0;
    double *GC;
    GC=new double[raw*column];
    for (i=0; i<raw; i++)
        for(j=0; j<column; j++)
        {
            if (j==column-1)
                GC[i*column+j] = InputArray[i*column+j] - InputArray[i*column+j-1];//The boundary
            else 
                GC[i*column+j] = InputArray[i*column+j] - InputArray[i*column+j+1];
        }
    /*Forming array inlude raw gradients*/
    double *GR;
    GR=new double[raw*column];
    for (j=0; j<column; j++)
        for(i=raw-1; i>=0; i--)
        {
            if (i==0)
                GR[i*column+j] = InputArray[i*column+j] - InputArray[(i+1)*column+j];//The boundary
            else
                GR[i*column+j] = InputArray[i*column+j] - InputArray[(i-1)*column+j];//The row gradient
                
        }
    /*The edge gradient and saving the data in file*/
    //double *G;
    G=new double[raw*column];
    for (i=0; i<raw; i++)
        for(j=0; j<column; j++)
            G[i*column+j] = abs(GC[i*column + j]) + abs(GR[i*column + j]);
    
    delete [] GR;
    delete [] GC;
    delete [] InputArray;
    
    return 0;
}
 
 
void WriteData(const char* filename, double* &matrix, int raw, int column)
{
    ofstream EdgeResultFile(filename); //Open a file for output
    if (!EdgeResultFile) 
        cerr << "Error! Can't open the output file.\n";
    int i=0;
    int j=0;
    for (i=0; i<raw; i++)
    {
        for(j=0; j<column; j++)
            EdgeResultFile<<matrix[i*column+j]<<" ";
        EdgeResultFile<<"\n";
    }
    EdgeResultFile.close(); 
    delete []matrix;
}


Добавлено через 34 минуты
Немного дополненный код (чтобы входной и выходной файлы были идентичны по формату: в конце строк нет пробелов и в конце последней строки нет символа новой строки):
Кликните здесь для просмотра всего текста
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <iostream>
#include <fstream>
#include <vector>
 
using namespace std;
 
void ReadData(const char*, vector<double>&, int&, int&);
void ConvertVectorToDoubleArray(vector<double>&, double*&, int, int);
int EdgeDetection(double*&, double*&, int, int);
void WriteData(const char*, double*&, int, int);
 
 
int main()
{
    double* Gradient;
    vector<double> VectorArray;
    double* tab;
    
    int raw=0;
    int column=0;
    
    ReadData("EdgeInput.txt", VectorArray, raw, column);
    ConvertVectorToDoubleArray(VectorArray, tab, raw, column);
    EdgeDetection(tab, Gradient, raw, column);
    WriteData("EdgeResult.txt", Gradient, raw, column);
 
}
 
void ReadData(const char* filename, vector<double> &OutputVector, int& raw, int& column)
{
    ifstream EdgeInputData(filename);
    if (!EdgeInputData) 
        cerr << "Error! Can't open the input file.\n";
    double InterveningVariable=0;
    while (!EdgeInputData.eof())
    {
        EdgeInputData>>InterveningVariable;
        OutputVector.push_back(InterveningVariable);
        
        if (EdgeInputData.peek() =='\n' || EdgeInputData.peek() == EOF)
            raw++;
    }
    column = OutputVector.size()/raw;
    
    EdgeInputData.close();
}
 
 
void ConvertVectorToDoubleArray(vector<double> &InputVector, double* &OutputArray, int raw, int column)
{
    OutputArray=new double[raw*column];
    int i=0;
    int j=0;
    for (i=0; i<raw; i++)
        for (j=0; j<column; j++)
            OutputArray[i*column + j] = InputVector[i*column + j];
}
 
int EdgeDetection(double* &InputArray, double* &G, int raw, int column)
{
    int i=0;
    int j=0;
    double *GC;
    GC=new double[raw*column];
    for (i=0; i<raw; i++)
        for(j=0; j<column; j++)
        {
            if (j==column-1)
                GC[i*column+j] = InputArray[i*column+j] - InputArray[i*column+j-1];//The boundary
            else 
                GC[i*column+j] = InputArray[i*column+j] - InputArray[i*column+j+1];
        }
    /*Forming array inlude raw gradients*/
    double *GR;
    GR=new double[raw*column];
    for (j=0; j<column; j++)
        for(i=raw-1; i>=0; i--)
        {
            if (i==0)
                GR[i*column+j] = InputArray[i*column+j] - InputArray[(i+1)*column+j];//The boundary
            else
                GR[i*column+j] = InputArray[i*column+j] - InputArray[(i-1)*column+j];//The row gradient
                
        }
    /*The edge gradient and saving the data in file*/
    G=new double[raw*column];
    for (i=0; i<raw; i++)
        for(j=0; j<column; j++)
            G[i*column+j] = abs(GC[i*column + j]) + abs(GR[i*column + j]);
    
    delete [] GR;
    delete [] GC;
    delete [] InputArray;
    
    return 0;
}
 
 
void WriteData(const char* filename, double* &matrix, int raw, int column)
{
    ofstream EdgeResultFile(filename); //Open a file for output
    if (!EdgeResultFile) 
        cerr << "Error! Can't open the output file.\n";
    int i=0;
    int j=0;
    for (i=0; i<raw; i++)
    {
        for(j=0; j<column; j++)
        {
            EdgeResultFile << matrix[i*column+j];
            if (j < column - 1) EdgeResultFile << " ";
        }
        if (i < raw - 1) EdgeResultFile << "\n";
    }
    EdgeResultFile.close(); 
    
    delete []matrix;
}
я тут почитала справочник и посмотрела ваши исправления, получается когда мы прописываем аргументы в функциях, и обозначаем аргумент как ссылку, то он будет изменяться после вызова функции, а в обратном случае нет?
Спасибо большое, за дополнение к коду и исправления! я попытаюсь разобраться во всем! Спасибо за помощь!

Добавлено через 4 минуты
DU, понятно, в некотором роде, код вышел бы даже проще чем то что я наворотила. Но тут было требование дипломного руководителя, я не знаю зачем, так как задание мне выдают частями! Но спасибо за пояснения. Я попытаюсь для себя сделать таким образом=)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.03.2013, 13:33     Передача массивов и параметров с одной функции в другую #12
Цитата Сообщение от Eumi Посмотреть сообщение
получается когда мы прописываем аргументы в функциях, и обозначаем аргумент как ссылку, то он будет изменяться после вызова функции, а в обратном случае нет?
Да. Есть передача аргументов по занчению и тогда в функцию передаётся не сама переменная, а созданная компилятором копия. Всё что происходит в функции с этой копией не влияет на саму переменную. Но можно возвратить значение этой копии и присвоить её значение самой переменной (тогда изменения сохранятся). Если же переменная передаётся по ссылке, то функция работает с самой этой переменной, только имя у неё другое (ссылка - псевдоним переменной, который и передаётся в функцию). Поэтому тут можно ничего не взвращать из функции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2013, 14:03     Передача массивов и параметров с одной функции в другую
Еще ссылки по теме:

C++ Передача массивов указателей в качестве параметров функции
Передача параметров функции в main() C++
C++ Передача параметров функции

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

Или воспользуйтесь поиском по форуму:
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 40
18.03.2013, 14:03  [ТС]     Передача массивов и параметров с одной функции в другую #13
alsav22, спасибо за пояснения и за помощь!
Yandex
Объявления
18.03.2013, 14:03     Передача массивов и параметров с одной функции в другую
Ответ Создать тему
Опции темы

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