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

Не присваевается значение - C++

Восстановить пароль Регистрация
 
KostyaKulakov
Заблокирован
19.02.2013, 18:25     Не присваевается значение #1
Есть область памяти (строка), условно поделенная на две части A и B. Область
B идет сразу после A. Заданы длины обоих частей. Используйте рекурсивный
reverse(), чтобы поменять a и b местами. Решение не требует рекурсии, кроме
той, что в reverse().

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
#include <iostream>
#include <string.h>
#include <string>
 
void reverse(char* s, size_t arg_a, size_t arg_b);
 
 
int main()
{
    char test[] = "1234567";
 
    reverse(test,2,3);
 
    std::cout << test << std::endl;
}
 
void reverse(char* s, size_t arg_a, size_t arg_b)
{
    const size_t len = (strlen(s)/sizeof(s[1]));
 
    char* a = new char[arg_a+1];
    char* b = new char[arg_b+1];
    char* c = new char[len];            //остаток
 
    for(size_t i=0; i < arg_a; ++i)
        a[i] = s[i];
 
    a[arg_a] = '\0';
 
    for(size_t i=0; i < arg_b; ++i)
        b[i] = s[i+arg_a];
 
    b[arg_b] = '\0';
 
    size_t arg_c = arg_a+arg_b;
 
    for(size_t i=0; i < arg_c;++i)
        c[i] = s[arg_c+i];
 
    c[arg_c] = '\0';
 
    strcat(b,a);
    strcat(b,c);
 
    std::cout << b << std::endl;
 
    s = b;
    
}

в
C++
1
s = b;
должно происходить присваивание, но оно не происходит.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2013, 18:25     Не присваевается значение
Посмотрите здесь:

C++ Для данного вещественного х найти значение следущей функции f, принимающей значение целого типа:
В квадратной матрицы поменять местами столбик, содержащий наибольшее значение со столбиком, который содержит наименьшее значение C++
Найти значение 3-го по величине элемента и значение всех элементов массива, которые его превышают, заменить на найденное значение C++
C++ Вывести начальные индексы всех елементов массива, значение которых превышает заданое значение А.
C++ В квадратной действительной матрице порядка N поменять местами строку, содержащую наибольшее значение, со строкой, содержащей наименьшее значение
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
19.02.2013, 19:35     Не присваевается значение #2
KostyaKulakov, присваивание происходит. s и b - это адреса, это не строки. После выполнения строки, которую ты выделил, s получает новое значение - адрес строки, на которую указывает b.

Не совсем понял, для входных данных "1234567" что должно получиться на выходе? Попробую помочь.

Добавлено через 7 минут
Хм, впрочем, если я правильно понял, ответ, который должен быть на выходе у тебя внутри функции reverse в конце выводится.
Но он недоступен после выхода из неё. Если это так, замени строку свою "нерабочую" с присваиванием на следующую:

C++
1
strcpy(s,b);
Это решит проблему

Если неясна причина былой недоступности полученного ответа после выхода из функции - дай знать - объясню
KostyaKulakov
Заблокирован
19.02.2013, 19:43  [ТС]     Не присваевается значение #3
Цитата Сообщение от ITcrusader Посмотреть сообщение
KostyaKulakov, присваивание происходит. s и b - это адреса, это не строки. После выполнения строки, которую ты выделил, s получает новое значение - адрес строки, на которую указывает b.

Не совсем понял, для входных данных "1234567" что должно получиться на выходе? Попробую помочь.

Добавлено через 7 минут
Хм, впрочем, если я правильно понял, ответ, который должен быть на выходе у тебя внутри функции reverse в конце выводится.
Но он недоступен после выхода из неё. Если это так, замени строку свою "нерабочую" с присваиванием на следующую:

C++
1
strcpy(s,b);
Это решит проблему

Если неясна причина былой недоступности полученного ответа после выхода из функции - дай знать - объясню
я сегодня тебе уже ставил "спасибку" по этому она больше не доступна, завтра обязательно поставлю.

всётаки мне так и не ясна причина недоступности ответа.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
19.02.2013, 20:07     Не присваевается значение #4
Ну так вот:

Функция объявляется так
C++
1
void reverse(char* s, size_t arg_a, size_t arg_b);
Т.е. при её вызове предоставляется значение s, которое - адрес начала области памяти, хранящей строку, которую следует подвергнуть обработке (но s - не сама строка). Далее, C++ по умолчанию осуществляет передачу значений в функцию по значению. Это означает, что внутри функции работа осуществляется не над самим передаваемым объектом, а над его копией, которая к началу выполнения функции идентична переданному параметру и которая уничтожается по завершении функции.

Т.е. внутри reverse работа происходит с копией указателя на область памяти. В итоге ты формируешь строку, на которую указывает b и осуществляешь присваивание s = b, тем самым делая так, что s теперь указывает на ту область памяти, которую ты хотел бы использовать в качестве ответа, НО s - внутри reverse уничтожится при выходе из неё, а та s, которую передавал не претерпит изменений.

Моя замена делает же следующее. Она копирует содержимое памяти, на которую указывает b в память, на которую указывает копия s. И после выхода из функции сама s осталась нетронутой, но память, адрес на которую мы имели внутри функции поменяла свое содержимое. Ффуууух.
KostyaKulakov
Заблокирован
19.02.2013, 20:09  [ТС]     Не присваевается значение #5
Цитата Сообщение от ITcrusader Посмотреть сообщение
Ну так вот:

Функция объявляется так
C++
1
void reverse(char* s, size_t arg_a, size_t arg_b);
Т.е. при её вызове предоставляется значение s, которое - адрес начала области памяти, хранящей строку, которую следует подвергнуть обработке (но s - не сама строка). Далее, C++ по умолчанию осуществляет передачу значений в функцию по значению. Это означает, что внутри функции работа осуществляется не над самим передаваемым объектом, а над его копией, которая к началу выполнения функции идентична переданному параметру и которая уничтожается по завершении функции.

Т.е. внутри reverse работа происходит с копией указателя на область памяти. В итоге ты формируешь строку, на которую указывает b и осуществляешь присваивание s = b, тем самым делая так, что s теперь указывает на ту область памяти, которую ты хотел бы использовать в качестве ответа, НО s - внутри reverse уничтожится при выходе из неё, а та s, которую передавал не претерпит изменений.

Моя замена делает же следующее. Она копирует содержимое памяти, на которую указывает b в память, на которую указывает копия s. И после выхода из функции сама s осталась нетронутой, но память, адрес на которую мы имели внутри функции поменяла свое содержимое. Ффуууух.

всё спасибо, понял
n00b.vcxproj
Кодер
 Аватар для n00b.vcxproj
46 / 45 / 2
Регистрация: 10.10.2010
Сообщений: 229
19.02.2013, 20:21     Не присваевается значение #6
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
Код C++
1
s = b;
должно происходить присваивание, но оно не происходит.
Оно происходит.
Если в конце функции напишешь
C++
1
std::cout << s << std::endl;
то получишь то, чего ожидал.
Как я понимаю, тебе это не совсем так хотелось бы видеть. Есть один нехороший способ:
C++
1
*s = *b;
не рекомендую пользоваться им, если работаешь с массивами. В твоем случае он опять же выдает совсем не то.
Если ты не мастер по стрельбе из лука, лучше не стоит пробовать сбить яблоко с головы приятеля, будут большие проблемы с безопасностью. Здесь практически такой же случай.
Если ты уверен во входных данных и размерах, то можно элементарно каждый элемент одного массива присвоить соответствующему элементу другого циклом. Пример частного случая:
C++
1
2
3
int i;
for(i=0;i<7;++i)
        s[i]=b[i];
Писанины, конечно, больше, однако вполне работоспособно!
Yandex
Объявления
19.02.2013, 20:21     Не присваевается значение
Ответ Создать тему
Опции темы

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