Форум «Всё о Паскале» _ Ада и другие языки _ Передача и возврат ссылок из функции
Автор: Rocket 16.03.2008 18:46
Объявил структуру Student, которая содержит четыре поля(фамилию, имя и отчество студента и год рождения), при этом строковые значения храню в виде массивов,а не указателей. Описал и инициализировал переменную st типа Student фамилией, именем и отчеством, не задавая год его рождения.
int main() { Student st; st.Surname='Ivanov'; st.Name='Ivan'; st.Patronymic='Ivanovich'; trunc(st); }
Проблемы возникли с написанием функции Student& trunc(Student& X), которая сокращает в структуре имя и отчество до инициалов (с точкой) и возвращает структуру X. Помогите пожалуйста с реализацией этой функции! Проверка работы функции нужно осуществить, передав ей переменную st, и воспользоваться возвращаемым значением функции для задания года рождения.
Автор: volvo 16.03.2008 18:53
Проблема у тебя начинается с того, что ты пытаешься одному символу присвоить значение строки (и Surname, и Name, и Patronymic - это char-ы, а не строки)...
Кстати, компилятор тебя предупреждал об этом, почему это было проигнорировано?
Ну, и свою попытку - в студию...
Автор: Rocket 16.03.2008 19:01
Цитата(volvo @ 16.03.2008 14:53)
Проблема у тебя начинается с того, что ты пытаешься одному символу присвоить значение строки (и Surname, и Name, и Patronymic - это char-ы, а не строки)...
Кстати, компилятор тебя предупреждал об этом, почему это было проигнорировано?
Ну, ты же опять совершаешь ту же самую ошибку... С массивами символов надо работать, а не с символами, чтоб строку представить... Кроме того, строку нельзя копировать через "=", нужно использовать для этого strcpy...
Кстати, тебе обязательно извращаться с возвратом ссылки? Не проще вернуть новый объект из функции:
Так нужно всё-таки реализовать финкцию "Student& trunc(Student& X)", и чтобы возращалась структура Х, при этом можно было задать год, воспользовавшись возвращаемым значением функции. И ещё два вопроса: 1. Возможно реализовать без использования конструктора? 2. Как работает "sprintf"?
Автор: volvo 16.03.2008 20:52
Цитата
Возможно реализовать без использования конструктора?
"Возможно ездить на автомобиле задним ходом?" Возможно, но не все же время! Далеко не уедешь. Вот так же и здесь: если ты используешь С++ - так используй, его. А нужен непонятно как урезанный функционал - так пиши на чистых Сях, без конструкторов, ссылок и многих других вещей...
Цитата
Как работает "sprintf"?
Точно так же, как и printf, только печатает в строку, заданную первым параметром. В MSDN написано...
Цитата
Так нужно всё-таки реализовать финкцию "Student& trunc(Student& X)", и чтобы возращалась структура Х
Чтоб возвращалась "структура X" надо делать так, как я написал выше. А то, что хочешь ты - это сделать, чтобы возвращалась "ссылка на структуру X", пойми это наконец! Отсюда до ошибки - одно движение. Ну, извращайся, дело твое:
Отсюда до ошибки - одно движение. Ну, извращайся, дело твое:
Да так в задание написано. Тут ещё нужно проверить работу функции, если: i) структура передается и возвращается по ссылке ii) структура передается в функцию по ссылке, а возвращается по значению iii) структура передается по значению, а возвращается по ссылке iv) и передача, и возврат из функции производятся по значению
, потому как будет создаваться временный объект, и здесь-то точно не будет сокращаться имя и отчество. Для того, чтобы поймать создание временного объекта - опиши еще один конструктор:
struct Student { // ...
Student(Student &s) { // вот этот cout << "X(X&) constructor" << endl; }
// ... };
, и запусти программу с trunc3...
Цитата(Rocket @ 16.03.2008 16:16)
Да так в задание написано. Тут ещё нужно проверить работу функции, если:iv) и передача, и возврат из функции производятся по значению
А здесь вообще дважды будет создаваться временный объект.
Я не понял, тебе что, нужны 4 разные функции, которые работали бы для 4-х пунктов задания? Или прото написать одну и проверить на ней остальные варианты?
Автор: Rocket 17.03.2008 1:34
Цитата(volvo @ 16.03.2008 19:29)
Я не понял, тебе что, нужны 4 разные функции, которые работали бы для 4-х пунктов задания? Или прото написать одну и проверить на ней остальные варианты?
Да это нужно на одной все варианты проверить, когда будут изменятся поля, когда нет. В общем разобрался я. Ещё раз спасибо за помощь!