Почему не работает эта функция подкачки? (замена строк в C)
Я пытаюсь поменять местами 2 записи в массиве строк, но моя функция swap не меняет местами при вызове.
Может ли кто-нибудь определить и объяснить мою ошибку?
3 ответа
C строго передается по значению. Вы передаете значения ptsr[0] и pstr[1] в swap . Он меняет местами, где хранятся эти два значения, но это не влияет на вызывающую функцию. Рассматривать:
Это то же самое, что и ваша функция подкачки, только вместо этого используется int . Должно быть довольно ясно, что если вы вызываете swap(1,2); , функция swap просто помещает 2 туда, где он хранил 1 , и наоборот, но это не влияет на что-нибудь в звонилке.
То же самое, если вы сделаете это:
Поскольку все, что вы передали в swap , это значения 2 и 3 , это никак не может повлиять на значения i и j .
И то же самое с вашей функцией обмена, если вы сделаете это:
Функция получает «привет» и «мир» и меняет местами, где хранятся эти два указателя. Это не влияет на j или k в вызывающей стороне.
C строго передается по значению. Какие бы параметры вы ни передали функции, функция получает только значения.
Функция в вопросе меняет местами только значения своего аргумента. Аргументы являются копиями элементов массива, поэтому функция swap не действует.
Чтобы поменять местами указатели в массиве, вы должны передать их адреса и изменить прототип функции подкачки:
Функции принимают свои аргументы по значению.
Это функция swap (для которой вы забыли указать тип возврата void )
Работает с копиями значений выражений ptsr[0] и ptsr[1] . Изменение копий не влияет на исходные указатели.
Вы можете представить себе определение функции и ее вызов следующим образом
Как видите, переменные и ptsr[0] и ptsr[1] не были изменены.
Чтобы изменить объект (который, в частности, может иметь тип указателя) в функции, вам необходимо передать его функции по ссылке.
В C передача по ссылке означает передачу объекта косвенно через указатель на него.
Таким образом, функция swap будет выглядеть так
И функция должна вызываться. like
Или как то же самое
Разыменуя указатели на указатели t1 и t2 , функция получает прямой доступ к исходному указателю ptsr[0] и ptsr[1] меняя местами их значения.
Источник
Есть ли встроенная функция swap в C?
есть ли встроенная функция swap в C, которая работает без использования третьей переменной?
11 ответов
нет.
В C++, но он работает как c = a;a = b; b = c;
C++ встроенная функция swap: swap(first,second);
Проверьте это: http://www.cplusplus.com/reference/algorithm/swap/
вы можете использовать это для замены двух значений переменных без использования третьей переменной:
вы также можете проверить это:
почему вы не хотите использовать третью переменную? Это самый быстрый способ на подавляющем большинстве архитектур.
на алгоритм подкачки XOR работает без третьей переменной, но это проблематично в двух направлениях:
- переменные должны быть различны, т. е. swap(&a, &a) не будет работать.
- это медленнее в целом.
иногда может быть предпочтительнее использовать своп XOR, если использование третьей переменной приведет к тому, что стек выкладывай, но обычно ты не в том положении, чтобы звонить.
чтобы ответить на ваш вопрос напрямую, нет никакой функции подкачки в стандартном C, хотя было бы тривиально писать.
если вы хотите C solotion, а не C++ один, вы можете сделать его макросом, по крайней мере, используя расширение GCC, чтобы он был достаточно общим, что-то вроде
остерегайтесь трюков, таких как заклинания swap(t[i++],i) ; чтобы избежать их, используйте оператор адресу & . И вам лучше использовать временный (для целых чисел есть известный и бесполезный трюк с exclusive-or).
PS: я использую две локальные переменные _x и _y (но я мог бы использовать только одну локальную переменную) для лучшей читаемости, а также, возможно, для включения дополнительных оптимизаций компилятора.
Источник
Реализация метода обмена значениями (Swap)
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Функция swap для обмена данных между переменными
Всем здравствуйте, начал писать на java недавно, для удобства решил написать функцию, чтоб меня.
Существует ли в Лазарусе процедура Swap для обмена объектов местами?
Есть ли процедура как в делфи (procedure Swap) для lazarus? Требуется вспомогательная процедура.
Здравствуйте. Как реализовать функцию swap в python? Пишу вот такой код: def swap(list, i.
Решение
Потому что int является значимым типом, следовательно переменные этого типа копируются по значению: при передаче в метод и присваивании другой переменной создается копия.
Передавая в метод элементы массива array[i] и array[i+1], вы передаете их копии и все, что происходит с ними внутри метода, не затрагивает оригиналы.
Решение предложено выше: при использовании модификатора ref переменные будут передаваться по ссылке.
kolorotur, Спасибо! А можно это засунуть в универсальную Swap() , чтобы вместо (LongCSharpParametrNameA,LongCSharpParametrNameB) = (LongCSharpParametrNameB, LongCSharpParametrNameA) использовать Swap(LongCSharpParametrNameA,LongCSharpParametrNameB) ?
Потому что в предложенном варианте
Нет, т.к. аргументом не всегда является переменная.
Собственно, именно в тех случаях, когда нельзя через ref.
Может и можно что-то придумать через лямбды/захваты или рефлексию, но тогда уж лучше писать длинные имена параметров.
Составление метода выбора и метода обмена
Расположить в порядке убывания четные элементы левого нижнего треугольника матрицы.
Нужно перевести программу из паскаль в делфи . Сама программа этот реализация метода гауса и метода зейделя
Это все в паскале сделано. В программе идет в начале описание меня а аотом сама подпрограмма.
Процедура обмена значениями
У меня проблема: не работает процедура, если использую массив. Что делаю не так? procedure.
Помогите написать программу на, pascal полностью
Программа обмена значениями двух переменных a и b
3.8 Составить программу обмена значениями двух переменных a и b. Разработать два варианта решения.
Составить программу обмена значениями 2-х переменных.
Источник
Функция SWAP
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Реализуйте функцию swap(t, x, y) в виде макроса, который осуществляет обмен значениями указанного.
Swap
Введите одно целое число n в первой строке (n 4
Надеюсь, регистр поменялся из-за не правильного тэга.
В таком виде код смотреть бессмысленно.
А ты хочешь, чтобы эту прелесть тебе отладили?
А чтобы дополнили, подробно опиши, что это за оператор SWAP. В С++ такого нет и бэйсик ради тебя наврятли учить будут.
Оператор обменивает величины двух переменных.
Формат: SWAP V1,V2
V1 и V2 — переменные действительного, целого или строкового типа.
Тип обеих переменных должен совпадать.
на экране: А= 500 В= 5
(Да регистр поменялся из-за не правильного тэга)
700 строк кода отбрасывают всякое желание разбираться, тебе наверное надо будет во фираланс.
Проблемы с функцией swap
Я написал код для симметрии матрицы относительно побочной диагонали, на он ругается на void.
Чума на оба Ваши swap-а!
Во-первых, продолжаю пополнять ликбезную копилку (надеюсь, заданные мною топики имеют эту ценность.
/** * Заполнить массив из 10 элементов случайными чис-лами в интервале и отсортировать первую.
Нужно обменять содержимое двух строк. Я так понимаю в main мы создаем две константных строки s1,s2.
Источник
Функция swap c не работает
Помощь в написании контрольных, курсовых и дипломных работ здесь.
swap
Cи подчеркивает swap и говорит что он не определен! в данном случаи а это массив, а i и j индексы.
swap
max, swap, min входят в это стандартные функции?
SWAP
Кто может объяснить как выходит (10 10) #include using namespace std; void Swap(int.
Функция swap()
А что выгоднее с точке зрения быстродействия — использование стандартной функции или «ручной» обмен.
Ошибка в Swap
Написано на С++ Не могу разобраться в ошибки. Раньше не пользовался Swap альтернативы не вижу.
Столкнулся с данной программой, и не совсем понимаю, как тут работает оператор swap. #include.
Не работает swap
k.name.swap(s); s — строка, k — массив структур
Функция swap
Всем привет. У меня проблема, при чем проблема не с самими указателями, а с функцией swap.
Атомарный swap
Добрый день, я правильно понимаю что в плюсах нету функции атомарного обмена двух переменных .
Доброго времени суток! Задался вопросом о реализации алгоритмов обмена двух переменных, но кроме.
Источник