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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
#1

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

02.04.2012, 13:25. Просмотров 2232. Ответов 11
Метки нет (Все метки)

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);
}
Заранее спасибо за помощь и уделенное внимание моей проблеме
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2012, 13:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным? (C++):

Как передать массив структур в функцию в качестве параметра, чтобы изменения в функции меняли исходный массив? - C++
Допустим есть структура struct Base { int a; int b; int c; }; В основном методе main() объявим массив...

Как передать массив в функцию так, чтобы при выходе из функции он не изменялся? - C++
Задачка: есть строка, которая состоит из символов. Символы соединяються в слова, которые оттделены друг от друга одним или несколькими...

Не могу разобраться как передать корректно передать массив из функции в функцию - C++
//--------------------------------------------------------------------------- #pragma hdrstop ...

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

Как передать динамический массив из функции в другую функцию - C++
Здравствуйте.Не могу передать массив из функции в функцию сортировки. Подскажите как переделать программу : #include "stdafx.h" ...

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

11
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 13:27 #2
Kirill Losev, передавайте по ссылке
1
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,137
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;
    //тут какие-то изменения в массиве
}
1
soon
2542 / 1307 / 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;
1
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 ?
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 13:43 #6
Kirill Losev, код функции и вызова покажите.
1
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()
0
soon
2542 / 1307 / 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);
1
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
02.04.2012, 14:14  [ТС] #9
soon, теперь появилось такое сообщение (см. во вложениях скриншот)
0
Миниатюры
как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным?  
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 за помощь
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 14:27 #11
поднял функцию fun1_left() вверх
А она была ниже места вызова?
0
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(...........) - протокол вроде бы называется, я не помню
0
02.04.2012, 14:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2012, 14:34
Привет! Вот еще темы с ответами:

Как передать в функцию два односвязных списка так, чтобы внутри функции можно было эти списки редактировать? - C++
Мне нужно редактировать в функции два односвязных списка, как их передать в функцию, один получается, два не понимаю как сделать....

Как передать указатель на структуру в функцию - C++
Подскажите как передать указатель *arr на структуру в функцию2, чтобы в ней использовать уже заполненные массивы: void func1() ...

Как передать в функцию ссылку на структуру? - C++
Добрый вечер, помогите пожалуйста разобраться. Нужно чтобы функция myProc принимала не структуру, а ссылку на структуру.struct vs { long...

Как передать в функцию строку и инициализировать ею структуру? - C++
#include &lt;iostream&gt; using namespace std; struct bar { char name; double ves; int kollors; }; void funk(bar&amp; konf, char...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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