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

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

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

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

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

Найти значение 3-го по величине элемента и значение всех элементов массива, которые его превышают, заменить на найденное значение - C++
Работа с массивами:

Переменной всегда присваевается значение 2, даже когда она инициализированна - C++ WinAPI
Ребят, прошу помоч с косяком, который мешает дальшейшему созданию программы. имеется код: /*Формируется окно редактирования,...

Не присваевается :nth-child - HTML, CSS
Вечер в хату, господа Есть вот такая разметка &lt;div class=&quot;row&quot;&gt; &lt;div class=&quot;col-lg-3 col-xs-12 col-md-4 col-sm-6...

USB HDD после установки Windows To Go не присваевается буква - Windows 8, 8.1
USB HDD после покупки присваивалась буква. Затем установил на USB HDD Windows To Go. Немного поработал с ним, потом удалил на нем разделы,...

Присвоить логической переменной T значение true, если значение d-цифра, и значение false в противном случае - Pascal ABC
Имеется символьная переменная d, присвоить логической переменной T значение true, если значение d-цифра, и значение false в противном...

Описать процедуру ShiftLeft3(A, B, C), выполняющую левый циклический сдвиг: значение A переходит в C, значение C — в B, значение В-в А - Visual Basic
Описать функцию ShiftLeft3(A, B, C), выполняющую левый циклический сдвиг: значение A переходит в C, значение C — в B, значение B — в A...

5
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);
Это решит проблему

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

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

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

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

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

всётаки мне так и не ясна причина недоступности ответа.
0
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 осталась нетронутой, но память, адрес на которую мы имели внутри функции поменяла свое содержимое. Ффуууух.
1
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 осталась нетронутой, но память, адрес на которую мы имели внутри функции поменяла свое содержимое. Ффуууух.

всё спасибо, понял
0
n00b.vcxproj
Кодер
47 / 46 / 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];
Писанины, конечно, больше, однако вполне работоспособно!
0
19.02.2013, 20:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2013, 20:21
Привет! Вот еще темы с ответами:

В одномерном массиве определить среднее значение всех элементов,значение которых превышает среднее значение - C++
в произвольно заданном одномерном массиве определить среднее значение всех элементов,значение которых превышает среднее значение

определить среднее значение всех элементов, значение которых превышает среднее значение - Pascal
в произвольно заданном одномерном массиве определить среднее значение всех элементов, значение которых превышает среднее значение....

Вычислить среднее значение элементов массива. Вывести на дисплей полученное значение - Pascal
Вычислить среднее значение элементов массива. Вывести на дисплей полученное значение. После этого изменить исходный массив следующим...

Вычислить минимальное по абсолютной величине значение функции и соответствующее значение аргумента - Pascal ABC
Составить программу табулирования и исследования функции f(x) на заданном диапазоне изменения аргумента c шагом hx.Вычислить...


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

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

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