Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2010, 11:37   #1
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию Передача параметров функции

Обкатывая идею создания карты из тайлов, где каждый раз считывание ведётся из бинарника, я пытался максимально упростить интерфейс и наступил на следующие грабли:
  1. Хотелось бы каким-нибудь образом передавать открытый с помощью ifstream файл в качестве параметра функции. В прототипе функции всё описано так (кратко):

    Код:
    tile* TileInit(ifstream file){
        tile* pt = new tile;
        file >> pt->type >> pt->solid;
        return pt;
    }
    tile - написанная мною структура.

    На что Dev-C++ нецензурно ругается и выдаёт длиннющую ошибку:
    no match for 'operator>>' in '(+((std::basic_istream<char, std::char_traits<char> >*) и т.д.

    В main этот самый file и открывается, и я хотел бы сохранять позицию указателя в файле, чтобы не считывать каждый раз данные сначала. Или же есть какой-нибудь способ управления позицией указателя?

  2. Впрочем, этой неловкости можно было бы избежать, если бы не вылезла ещё одна:
    По замыслу создавался двумерный массив указателей на tile - map[height][width]. width и height считываются в main из того же file, что я хотел передать функции, описанной в первой проблеме. Считывание там идёт без проблем.
    Так вот, прототипу функции, которому нужно передавать массив, просто позарез нужно знать его размеры. Но кол-во элементов может варьироваться! Сколько будет указано в файле, столько будет и в массиве.
    В любом случае, прототип ф-ии отказывается иметь в качестве параметра массив неопределённых проблем.
    Но если бы я смог передать его ей, тогда и первая проблема отпала бы.

    Вот такие вот дела...

Последний раз редактировалось Кипящий чайник; 10.08.2010 в 14:29.
Кипящий чайник вне форума Ответить с цитированием
Старый 10.08.2010, 12:30   #2
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

fstream file для чтения лучше передать ifstream file.
tile* pt = new tile;
file >> tile->type >> tile->solid;
Здесь ошибка. Надо не tile использовать а указатель на tile *pt;
Код:
file >> pt->type >> pt->solid;
А вообще если ваша структура состоит из двух полей то запись и чтение можно производить блоками:
Через указатель это как-то так
Код:
file.write ((char*) &(*pt), sizeof(*pt));//запись
file.read ((char*) &(*pt), sizeof(*pt));//чтение
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 10.08.2010, 12:38   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2Hacker19_90
Код:
file.write ((char*) &(*pt), sizeof(*pt));//запись
господи.... ну разыменуй еще пару раз, и пару раз возьми адрес

+ tile* TileInit(fstream &file)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 10.08.2010, 12:43   #4
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Цитата:
господи.... ну разыменуй еще пару раз, и пару раз возьми адрес
Так смотрится красиво!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 10.08.2010, 14:32   #5
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

hacker19_90. Спасибо, что заметили ошибки в приведённом коде - будете смеяться, но в настоящем коде, с которым я работаю, этих ошибок нет - всё также, как описано в ваших исправлениях.
Плюс ко всему, структура состоит более чем из двух полей, так что, боюсь, вышеописанные методы не действенны - ведь следующие поля заполняются уже отдельной функцией, а не читаются из файла.

Последний раз редактировалось Кипящий чайник; 10.08.2010 в 14:35.
Кипящий чайник вне форума Ответить с цитированием
Старый 10.08.2010, 15:45   #6
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Цитата:
Сообщение от Кипящий чайник Посмотреть сообщение
О
Код:
tile* TileInit(ifstream file){
Передавайте по ссылке
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 10.08.2010, 16:59   #7
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Код:
*tile TileInit(ifstream &file){
Увы, даже с ссылкой ошибка осталась по-прежнему.
Кипящий чайник вне форума Ответить с цитированием
Старый 10.08.2010, 19:17   #8
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Цитата:
Сообщение от Кипящий чайник Посмотреть сообщение
Код:
*tile TileInit(ifstream &file){
Увы, даже с ссылкой ошибка осталась по-прежнему.
Так стоп а зачем в функцию передавать обьект типа ifstream.
Передавай имя файла (string: filename);
а уже в функции создавай файловый поток
Код:
ifstream read_file(filename);
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 10.08.2010, 19:40   #9
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Просто если я каждый раз в этой функции буду открывать файл, то считывание начнётся сначала, а не там, где мне нужно. А мне хотелось бы, чтобы позиция указателя в файле сохранялась. Есть возможность по крайней мере им управлять?
Кипящий чайник вне форума Ответить с цитированием
Старый 10.08.2010, 19:57   #10
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Цитата:
Сообщение от Кипящий чайник Посмотреть сообщение
Просто если я каждый раз в этой функции буду открывать файл, то считывание начнётся сначала, а не там, где мне нужно. А мне хотелось бы, чтобы позиция указателя в файле сохранялась. Есть возможность по крайней мере им управлять?
Передавать поток по ссылке
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров в DLL -Flasher- Общие вопросы Delphi 2 04.06.2010 18:05
Передача параметров программе Granus Общие вопросы C/C++ 3 02.03.2010 17:49
Передача параметров aesoem Общие вопросы Delphi 8 15.07.2008 21:51
CDialog передача параметров! mahsus Общие вопросы .NET 4 09.03.2008 17:40
Передача параметров Gudzon Общие вопросы Delphi 12 08.02.2007 08:19