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

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

Войти
Регистрация
Восстановить пароль
 
KostyaKulakov
Заблокирован
#1

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

19.02.2013, 18:25. Просмотров 290. Ответов 5
Метки нет (Все метки)

Есть область памяти (строка), условно поделенная на две части 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++
C++ Определить, является ли введенное значение года високосным, если введено корректное значение
C++ Вывести начальные индексы всех елементов массива, значение которых превышает заданое значение А.
Замена всех элементов массива, значение которых превышает среднее значение, максимальным элементом C++
Найти значение t, при котором значение функции максимально C++
C++ Вывести на экран значение t при котором функция x(t) принимает максимальное значение
C++ Переполнение знаковых целых чисел: почему значение переменной обнуляется, а не записывается младшее значение?
C++ Вычислить среднеарифметическое значение элементов массива и определить минимальное положительное значение
C++ Ввести с клавиатуры вещественное (double) значение x, вывести соответствующее значение y для функции y = f(x)
Найти наименьшее положительное значение функции и соответствующее значение аргумента C++
Вычислить значение у, где. Значение переменной х введите с клавиатуры C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
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++
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
Кодер
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     Не присваевается значение
Ответ Создать тему
Опции темы

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