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

как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
02.04.2012, 13:25     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? #1
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
const int size = 256;
 
struct MARKER
{
    char mark[size];
}
 
void processing(MARKER struct_m)
{
    //тут какие-то изменения в массиве
}
 
void function(MARKER *struct_m)
{
    struct_m->mark[] = "String"; //какой-то массив
    //мне надо изменить часть массива, для удобства я и сделал эту функцию processing(это действие, к тому же, 
    //несколько раз надо будет выполнять в ходе работы программы), но как туда передать    
    //массив, чтобы после выполнения функции он вернулся измененным?
    processing(*strict_m); //если так предавать, то он не изменяется после выполнения функции
}
 
int main()
{
    MARKER struct_m;
    function(&struct_m);
}
Заранее спасибо за помощь и уделенное внимание моей проблеме
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2012, 13:25     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным?
Посмотрите здесь:

[C++]Теория.Почему в данном случае copy() не работает после reserve(),но работает после resize()? C++
Как передать в функцию строку и инициализировать ею структуру? C++
Как передать в функцию число и структуру побайтно? C++
C++ Как передать указатель на структуру в функцию
C++ Как передать в функцию указатель на структуру, если эта структура не определена глобально?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 13:27     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? #2
Kirill Losev, передавайте по ссылке
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
02.04.2012, 13:29     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? #3
По ссылке
C++
1
2
3
4
5
void processing(MARKER &struct_m)
{
     cout << struct_m.mark << endl;
    //тут какие-то изменения в массиве
}
или по указателю
C++
1
2
3
4
5
void processing(MARKER *struct_m)
{
    cout << (*struct_m).mark << endl;
    //тут какие-то изменения в массиве
}
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 13:30     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? #4
Цитата Сообщение от dimcoder Посмотреть сообщение
cout << (*struct_m).mark << endl;
C++
1
cout << struct_m -> mark << endl;
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
02.04.2012, 13:42  [ТС]     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? #5
soon, dimcoder, спасибо. как всегда на этом форуме - оперативно и качественно
еще раз спасибо

Добавлено через 5 минут
dimcoder, soon, а как это исправить не подскажете:
версия.cpp:62: error: conversion from ‘MARKER*’ to non-scalar type ‘MARKER’ requested ?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 13:43     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? #6
Kirill Losev, код функции и вызова покажите.
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
02.04.2012, 13:48  [ТС]     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? #7
soon,
функция обработки массива(вызывается из функции function, если как в первом сообщении):
C++
1
2
3
4
5
6
7
8
9
10
11
void fun1_left(MARKER &struct_m, int index, int len_mark, int len_proc, int len_slovo)
{
    while(len_slovo != 0)
    {
        for(int q = len_mark - len_proc; q < len_mark; q++)
        {
            struct_m.mark[q] = struct_m.mark[q + 1];
        }
        len_slovo--;
    }
}
из этой функции вызвается fun1_left() (место вызова отмечено комментарием):
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
void marker_marker(ifstream &input_marker, ofstream &output, MARKER *struct_m)
{
    char slovo[size], zamena[size], *proc;
    int i = 0,
        pos = 0,
        len_mark = 0;
    struct_m->marker = '*';
    while(!input_marker.eof() && struct_m->mark)
    {
        input_marker.get(struct_m->mark[i]);
        if(struct_m->mark[i] == struct_m->marker)
            pos = i;
        i++;
    }
    struct_m->mark[pos] = '\0';
    cout << "Исходная строка: " << struct_m->mark << endl;
    choise_of_words(slovo, zamena);
    proc = strstr(struct_m->mark, slovo);
    if(proc == NULL)
    {
        cout << slovo << " в строке не найдено." << endl;
    }
    len_mark = strlen(struct_m->mark);
    int len_slovo = strlen(slovo);
    for(int b = 0; b < len_mark; b++)
    {
        proc = strstr(struct_m->mark, slovo);
        if(proc == NULL)
            break;
        int len_proc = strlen(proc);
        int index = len_mark - len_proc + 1;
        if(struct_m->mark[index - 1] != ' ')
            fun1_left(struct_m, index, len_mark, len_proc, len_slovo); // вызов функции
    }
    cout << "Обработанная строка: " << struct_m->mark << endl;
}
и это 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
int main()
{
    MARKER struct_m;
    LEN struct_l;
    int Menu = 0;
    ifstream input_marker("/media/wind/forlabs/2_sem/l3/input_marker.txt");
    ifstream input_length("/media/wind/forlabs/2_sem/l3/input_length.txt");
    ofstream output("/media/wind/forlabs/2_sem/l3/output.txt");
    input_length.getline(struct_l.len, size);
    cout << "1. Маркер -> Маркер." << endl
         << "2. Маркер -> Длина." << endl
         << "3. Длина -> Маркер." << endl
         << "4. Длина -> Длина." << endl
         << "Выбор: ";
    cin >> Menu;
    switch(Menu)
    {
        case 1:
            marker_marker(input_marker, output, &struct_m);
            break;
        case 2:
            marker_length(input_marker, output, &struct_m);
            break;
        case 3:
            length_marker(input_length, output, &struct_l);
            break;
        case 4:
            length_length(input_length, output, &struct_l);
            break;
    }
}
то есть в main() вызывается marker_marker(), а из marker_marker() вызывается fun1_left()
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 13:53     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? #8
Цитата Сообщение от Kirill Losev Посмотреть сообщение
fun1_left(struct_m, index, len_mark, len_proc, len_slovo);
C++
1
fun1_left(*struct_m, index, len_mark, len_proc, len_slovo);
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
02.04.2012, 14:14  [ТС]     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? #9
soon, теперь появилось такое сообщение (см. во вложениях скриншот)
Миниатюры
как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным?  
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
02.04.2012, 14:27  [ТС]     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? #10
удалось всё исправить следующим образом: я убрал '*' из функции marker_marker(). и поменял, соответственно все '->' на '.' в месте вызова функции fun1_left() поставил '&', т.е.:
C++
1
fun1_left(&struct_m, index, len_mark, len_proc, len_slovo);
и поднял функцию fun1_left() вверх
теперь все обрабатывает нормально.
еще раз спасибо soon за помощь
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 14:27     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? #11
поднял функцию fun1_left() вверх
А она была ниже места вызова?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2012, 14:34     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным?
Еще ссылки по теме:

C++ Как передать массив в функцию так, чтобы при выходе из функции он не изменялся?
Как правильно передать динамический массив в функцию, увеличивающую его размер, чтобы изменения сохранились C++
Передать массив в функцию и вернуть из функции C++

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

Или воспользуйтесь поиском по форуму:
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
02.04.2012, 14:34  [ТС]     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? #12
а, и вот код в процессе его создания(т.е. основную задачу не выполняет еще и работают не все функции), может кому пригодится решение:
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
119
120
121
122
123
#include <iostream>
#include <fstream>
#include <cstring>
#define size 256
using namespace std;
 
struct MARKER
{
    char mark[size];
    char marker;
};
 
struct LEN
{
    char len[size];
    unsigned lenght;
};
 
void fun1_left(struct MARKER *struct_m, int index, int len_mark, int len_proc, int len_slovo)
{
    while(len_slovo != 0)
    {
        for(int q = len_mark - len_proc; q < len_proc; q++)
        {
            struct_m->mark[q] = struct_m->mark[q + 1];
        }
        len_slovo--;
    }
}
 
void choise_of_words(char *slovo, char *zamena)
{
    cout << "Буду менять слово ";
    cin >> slovo;
    cout << "Поменять на слово ";
    cin >> zamena; 
    cout << "Меняем слово '" << slovo << "' на '" << zamena << "'." << endl;
}
 
void marker_marker(ifstream &input_marker, ofstream &output, struct MARKER struct_m)
{
    char slovo[size], zamena[size], *proc;
    int i = 0,
        pos = 0,
        len_mark = 0;
    struct_m.marker = '*';
    while(!input_marker.eof() && struct_m.mark)
    {
        input_marker.get(struct_m.mark[i]);
        if(struct_m.mark[i] == struct_m.marker)
            pos = i;
        i++;
    }
    struct_m.mark[pos] = '\0';
    cout << "Исходная строка: " << struct_m.mark << endl;
    choise_of_words(slovo, zamena);
    proc = strstr(struct_m.mark, slovo);
    if(proc == NULL)
    {
        cout << slovo << " в строке не найдено." << endl;
    }
    len_mark = strlen(struct_m.mark);
    int len_slovo = strlen(slovo);
    for(int b = 0; b < len_mark; b++)
    {
        proc = strstr(struct_m.mark, slovo);
        if(proc == NULL)
            break;
        int len_proc = strlen(proc);
        int index = len_mark - len_proc + 1;
        if(struct_m.mark[index - 1] != ' ')
            fun1_left(&struct_m, index, len_mark, len_proc, len_slovo);
        
    }
    cout << "Обработанная строка: " << struct_m.mark << endl;
}
 
void marker_length(ifstream &input_marker, ofstream &output, struct MARKER struct_m)
{
    
}
 
void length_marker(ifstream &input_length, ofstream &output, struct LEN struct_l)
{
    
}
 
void length_length(ifstream &input_length, ofstream &output, struct LEN struct_l)
{
    
}
 
int main()
{
    MARKER struct_m;
    LEN struct_l;
    int Menu = 0;
    ifstream input_marker("/media/wind/forlabs/2_sem/l3/input_marker.txt");
    ifstream input_length("/media/wind/forlabs/2_sem/l3/input_length.txt");
    ofstream output("/media/wind/forlabs/2_sem/l3/output.txt");
    input_length.getline(struct_l.len, size);
    cout << "1. Маркер -> Маркер." << endl
         << "2. Маркер -> Длина." << endl
         << "3. Длина -> Маркер." << endl
         << "4. Длина -> Длина." << endl
         << "Выбор: ";
    cin >> Menu;
    switch(Menu)
    {
        case 1:
            marker_marker(input_marker, output, struct_m);
            break;
        case 2:
            marker_length(input_marker, output, struct_m);
            break;
        case 3:
            length_marker(input_length, output, struct_l);
            break;
        case 4:
            length_length(input_length, output, struct_l);
            break;
    }
}
Добавлено через 4 минуты
soon, да

то есть там(выше места вызова) была эта штуковина void f1_left(...........) - протокол вроде бы называется, я не помню
Yandex
Объявления
02.04.2012, 14:34     как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным?
Ответ Создать тему
Опции темы

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