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

Передать двумерный массив в функцию - C++

Восстановить пароль Регистрация
 
dioxyde
0 / 0 / 0
Регистрация: 06.01.2012
Сообщений: 7
13.07.2012, 10:48     Передать двумерный массив в функцию #1
Доброе утро! Подскажите пожалуйста как можно передать двумерный массив из функции в main().
к примеру функция dataFromFile() в ней создаётся двумерный массив со строками, как передать весь массив в функцию main()?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
13.07.2012, 10:51     Передать двумерный массив в функцию #2
напиши код, как создается массив. предполагаю, ф-я dataFromFile() вызывается из main()?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
13.07.2012, 10:53     Передать двумерный массив в функцию #3
Да нет ничего легче :-)
Варианты:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class stringMatrix { ... };  // двумерный массив (матрица) строк
 
stringMatrix dataFromFile() 
{
    stringMatrix temp;
 
    // тут как-то заполняем матрицу строк....
    temp[0][0] = .... ;
 
    return temp;
}
 
int main()
{
    stringMatrix data = dataFromFile();
    // обрабатываем.....
 
    return 0;
}
dioxyde
0 / 0 / 0
Регистрация: 06.01.2012
Сообщений: 7
13.07.2012, 10:56  [ТС]     Передать двумерный массив в функцию #4
да. верно, вызывается из main. Не понимаю я пока что эти функции...
Вот код:
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
void readDataFromFile()
{
    char cString[255];
    ifstream infile;
    infile.open("task.txt");
    char cTemp[50];
    char cTaskArray[100][50];
    unsigned int i;
 
    int a,b,j,z,iSeparator,x;
    z=0;a=0;j=0;b=0;x=0;iSeparator=0;
 
    while(!infile.eof())
    {
        infile.getline(cString,255);
        for(i=0;i<strlen(cString);i++)
        {   
            if(iSeparator == 2)
            {
                if(j>0)
                {
                    z=j+1;
                    j=0;
                }
 
                if(isalpha(cString[i]) || cString[i] == ' ')
                {
                    cTemp[0][z] = cString[i];
                    z++;
                }
            }
 
            if(cString[i] == ';')
            {   
                if(iSeparator == 1)
                {
                    if(x<15)
                    {
                        while(x<=15)
                        {
                            cTemp[0][j] = '9';
                            x++;j++;
                        }
                        cTemp[0][j] = cString[i];
                        iSeparator = 2;
                        continue;
                    }
                    else
                    {
                        cTemp[0][j] = cString[i];
                        iSeparator = 2;
                        continue;
                    }
                }
                if(iSeparator == 0)
                {
                    if(z<15)
                    {
                        while(z<=15)
                        {
                            cTemp[0][z] = '0';
                            z++;
                        }
                        cTemp[0][z] = cString[i];
                        iSeparator = 1;
                        continue;
                    }
                    else
                    {
                        cTemp[0][z] = cString[i];
                        iSeparator = 1;
                        continue;
                    }
                }
            }
            if(iSeparator == 1)
            {
                if(z>0)
                {
                    j=z+1;
                    z=0;
                }
                    
                if(isdigit(cString[i]))
                {
                    if(i!=';')
                    {
                        cTemp[0][j] = cString[i];
                        j++;x++;
                        continue;
                    }               
                }
            }
            if(isdigit(cString[i]))
            {
                cTemp[0][i] = cString[i];
                z++;
            }
        }
 
        cTemp[0][z] = '\0';
        iSeparator=0;j=0;x=0;z=0;
 
        for (b=0;b<sizeof(cTemp);b++)
        {
            cTaskArray[a][b] = cTemp[0][b];
        }
 
        if(a<99)
        {
            a++;
        }       
    }
        infile.close();
                
}
параметры и возвращаемое значение не написаны так как я попросту не понимаю что туда писать...
в итоге функция должна в мэин вернуть массив cTaskArray
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
13.07.2012, 11:35     Передать двумерный массив в функцию #5
перемести char cTaskArray[100][50]; из этой фии в main(), и передай указатель (или ссылку) в ф-ю как параметр. там набей данными. подумай еще, как тебе вернуть информацию о том, сколько данных удалось набить.
способ, предложенный CheshireCat, работать не будет, т.к. нельзя из ф-ии возвращать что-то, созданное этой ф-ей в стеке. сразу после возврата из ф-ии эта память будет переписана новыми данными. если хочется именно "вернуть массив", ты должен его создать в heap и вернуть указатель на него. не забудь потом удалить его в main().
matepuhko
20 / 20 / 6
Регистрация: 05.06.2011
Сообщений: 119
13.07.2012, 11:46     Передать двумерный массив в функцию #6
Можно огласить массив в ф-и как static , и спокойно возвращать по ссылке ну или указатель.
Но novi4ok прав лутше передать в функцию массив , и там набивать данными
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
13.07.2012, 12:15     Передать двумерный массив в функцию #7
Цитата Сообщение от novi4ok Посмотреть сообщение
способ, предложенный CheshireCat, работать не будет, т.к. нельзя из ф-ии возвращать что-то, созданное этой ф-ей в стеке.
Эммм.... ???
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
#include <iostream>
#include <cstring>
using namespace std;
 
// двумерный массив (матрица) строк
class stringMatrix
{
public:
    char cTaskArray[100][50];
    stringMatrix()
    { memset(cTaskArray, 0, sizeof(cTaskArray)); }
};
 
stringMatrix dataFromFile()
{
    stringMatrix temp;
 
    // тут как-то заполняем матрицу строк....
    strcpy(temp.cTaskArray[0], "first");
    strcpy(temp.cTaskArray[1], "second");
    strcpy(temp.cTaskArray[2], "third");
    strcpy(temp.cTaskArray[3], "fourth");
    strcpy(temp.cTaskArray[4], "fifth");
    strcpy(temp.cTaskArray[5], "sixth");
 
    return temp;
}
 
int main()
{
    stringMatrix data = dataFromFile();
    // обрабатываем - выводим валидные элементы
    int i = 0;
    while(data.cTaskArray[i][0] != '\0')
        cout << data.cTaskArray[i++] << endl;
 
    return 0;
}
first
second
third
fourth
fifth
sixth

Process returned 0 (0x0) execution time : 0.016 s
Press any key to continue.
GCC 4.7.1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2012, 12:35     Передать двумерный массив в функцию
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
13.07.2012, 12:35     Передать двумерный массив в функцию #8
CheshireCat, я недодумал сперва. в твоем примере при возврате создается копия объекта, и память тупо копируется туда, ссылка на эту копию возвращается. все ли в копии хорошо - зависит от того, что за класс. нужно принять во внимание, что может понадобиться copy-constructor для возвращаемого класса.
Yandex
Объявления
13.07.2012, 12:35     Передать двумерный массив в функцию
Ответ Создать тему
Опции темы

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