Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель на массив структур, Вопрос о работе с массивами структур 
V
    Опции темы
profi80
Дата 28.11.2006, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.11.2006

Репутация: нет
Всего: нет



Добрый день,

не могу получить доступ к членам массива структур из функции main. Дело в том, что для main оказывается видимой только первая структура в массиве (индекс 0), а две другие (1 и 2) - нет. Подскажите пожалуйста в чём дело?

Код:

Заголовок (объявление массива структур)
Код

struct mailingListRecord {
        char firstName[20];
        char lastName[20];
        int zip;
} *rec[3];

void DisplayRecord (int);
void ClearMemory ();
mailingListRecord* InputRecord ();
mailingListRecord GetRecord(int);


Инициализация массива:
Код

mailingListRecord* InputRecord ()
{
        char buff[20];
        int index = 0;
        do {
                rec[index] = new mailingListRecord;

                cout << "First Name :";
                cin.getline(rec[index]->firstName, sizeof(rec[index]->firstName) - 1);
                cout << "Last Name :";
                cin.getline(rec[index]->lastName, sizeof(rec[index]->lastName) - 1);
                cout << "ZIP code :";
                cin.getline(buff, sizeof(buff) - 1);
                rec[index]->zip = atoi (buff);
                index ++;
                cout << endl;
        } while (index < 3);
        return *rec;
}

void DisplayRecord (int num) {

        mailingListRecord *tmp = rec[num];

        cout << "Record " << num << " :" << endl;
        cout << "Name :" << tmp->firstName << " " << tmp->lastName << endl;
        cout << "ZIP code :" << tmp->zip << endl << endl;
        getch();
}

void ClearMemory () {
        for (int i = 0; i < 3; i++) delete rec[i];
        cout << "Memory cleared" << endl;
}


Функция main:
Код

int main(int argc, char* argv[])
{
        char num;
        //получаю указатель на массив структур
        mailingListRecord *tmp = InputRecord();
        clrscr();
        for (int i = 0; i < 3; i++) {
                DisplayRecord(i);
        }
        cout << "Choose a record:";

        do {
                num = getch();
                num -= '1';
        } while (num < 0 || num > 2);

        clrscr();

        cout << endl;

        DisplayRecord (num);

        cout << endl << "Press any key to continue..." << endl;

        //попытаюсь получить доступ к третей структуре массива структур
        mailingListRecord tmpa = tmp[2];

        //НЕ РАБОТАЕТ!!!!
        cout << "Record " << "1" << " from MAIN():" << endl;
        cout << "Name :" << tmpa.firstName << " " << tmpa.lastName << endl;
        cout << "ZIP code :" << tmpa.zip << endl << endl;

        ClearMemory ();
        
        getch();
        return 0;

}


Дело в том, что DisplayRecord показывает содержимое всех структур, а вот из main напрямую показать не получается. Возможно это связано с тем, что я неправильно обращаюсь к массиву структур?

Добавлено @ 13:21 
Да, ещё вот что: main() и функции для работы со структурами находятся в разных файлах .cpp
PM MAIL   Вверх
JackYF
Дата 28.11.2006, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Ты объявляешь не массив структур, а массив указателей на структуры.
Попробуй:
Код

struct mailingListRecord {
        char firstName[20];
        char lastName[20];
        int zip;
} rec[3]; // здесь убрана "*"



Либо, если не хочешь переписывать остальные функции, то в main() тебе придется делать так:
Код

...
//попытаюсь получить доступ к третей структуре массива структур
        mailingListRecord tmpa = *(tmp[2]); // поставил "*"
        
        cout << "Record " << "1" << " from MAIN():" << endl;
        cout << "Name :" << tmpa.firstName << " " << tmpa.lastName << endl;
        cout << "ZIP code :" << tmpa.zip << endl << endl;
...




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
GrayCardinal
Дата 28.11.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



profi80, 
mailingListRecord tmpa;
Перед "tmpa" звездочку забыли smile Нельзя там дальше использовать точку. У вас тупо работа с указателями (в народе - PTR'ы). Не тот случай, в общем.
А вообще стиль хромает сильно, оттого и такие баги. Что возвращает InputRecord непонятно. И ради Бога, отделите *rec[3] от описания структуры.

Добавлено @ 16:23 
JackYF, 
Ну можно и так. Но я бы не стал _структуры_ приравнивать.


--------------------
PM MAIL WWW   Вверх
JackYF
Дата 28.11.2006, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(GrayCardinal @  28.11.2006,  16:22 Найти цитируемый пост)
Ну можно и так. Но я бы не стал _структуры_ приравнивать. 


У тебя будет быстрее работать, согласен smile
Зато у меня надо сделать 1 исправление, а у тебя 1 + 3 = аж целых 4 smile

Цитата(GrayCardinal @  28.11.2006,  16:22 Найти цитируемый пост)
А вообще стиль хромает сильно, оттого и такие баги. Что возвращает InputRecord непонятно. И ради Бога, отделите *rec[3] от описания структуры.


Это точно. 
У тебя привязка функций DisplayRecord и InputRecord к конкретным объявленных структурам. Зачем?
Передавай указатели на структуры в эти функции.
Тогда и rec[3] сможешь объявить в main().

А вообще, где выделение памяти под эти самые 3 структуры? В изначальном коде только 3 указателя, и больше ничего.
Поэтому создавай не массив указателей, а просто массив структур.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
profi80
Дата 29.11.2006, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.11.2006

Репутация: нет
Всего: нет



Вот так:
Код

mailingListRecord *tmpa = *(tmp[2]);

не работает! Выдаёт [C++ Error] Unit1.cpp(37): E2093 'operator*' not implemented in type 'mailingListRecord' for arguments of the same type

Цитата(JackYF @  28.11.2006,  16:30 Найти цитируемый пост)
А вообще, где выделение памяти под эти самые 3 структуры? В изначальном коде только 3 указателя, и больше ничего.Поэтому создавай не массив указателей, а просто массив структур.


Вот где выделяется память (InputRecord):
Код

rec[index] = new mailingListRecord;


Массив указателей нужен потому, что нужно разместить структуры в динамической памяти.

Таким образом, получается что оба предложенных решения не решают проблему. Остаётся только 
Цитата(JackYF @  28.11.2006,  16:30 Найти цитируемый пост)
Передавай указатели на структуры в эти функции.Тогда и rec[3] сможешь объявить в main().
 но вообще говоря, это не решение проблемы, т.к. структуры должны создаваться где-то в процессе работы программы (в реальном проекте), и нужен доступ к ним из функции main().


PM MAIL   Вверх
GrayCardinal
Дата 29.11.2006, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



profi80, 
LOL  smile 
Ты меня конечно извини, но ты ... smile 
Вот ну совсем не надо было ОБА варианта применять одновременно. Надо было ОДИН юзить. И еще неплохо бы подумать ЧТО мы имели в виду прежде чем :

Цитата

Таким образом, получается что оба предложенных решения не решают проблем

А вот это ты зря  smile Могем ведь и обидеться  smile  

Это сообщение отредактировал(а) GrayCardinal - 29.11.2006, 10:18


--------------------
PM MAIL WWW   Вверх
Vyacheslav
Дата 29.11.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Код

mailingListRecord* InputRecord ()
{
....
    return *rec; 
}

Функция возвращает указатель на структуру. Причем только на первую smile

А должна возращать  указатель на массив указателей

Код

mailingListRecord** InputRecord ()
{
  ...

  return rec;
} 

Тогда 
Код


  mailingListRecord ** tmp = InputRecord();

  mailingListRecord tmpa = *(tmp[2]); 
  cout << "Record " << "1" << " from MAIN():" << endl;
  cout << "Name :" << tmpa.firstName << " " << tmpa.lastName << endl;
  cout << "ZIP code :" << tmpa.zip << endl << endl;


//....





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
profi80
Дата 29.11.2006, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.11.2006

Репутация: нет
Всего: нет



Цитата(GrayCardinal @  29.11.2006,  10:17 Найти цитируемый пост)
Ты меня конечно извини, но ты ...  Вот ну совсем не надо было ОБА варианта применять одновременно. Надо было ОДИН юзить.

Ну зачем же так сразу... я тоже могу ведь обидеться. smile  Я не применял оба варианта сразу, речь шла о том, что короче, а именно:
Цитата(JackYF @  28.11.2006,  16:16 Найти цитируемый пост)
Либо, если не хочешь переписывать остальные функции, то в main() тебе придется делать так

так попробовал - не получилось, о чём и сообщил.


Цитата(Vyacheslav @  29.11.2006,  11:39 Найти цитируемый пост)
Функция возвращает указатель на структуру. Причем только на первую А должна возращать  указатель на массив указателей


А вот это - действительно решение проблемы! Спасибо! Запутался немного с этими указателями...  smile 

+1 to Vyacheslav !!! smile


Это сообщение отредактировал(а) profi80 - 29.11.2006, 13:26
PM MAIL   Вверх
profi80
Дата 29.11.2006, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.11.2006

Репутация: нет
Всего: нет



В общем, всем спасибо. Вопрос решён, тема закрыта.

To GrayCardinal : по-деликатнее с новичками на форуме....  smile 
PM MAIL   Вверх
GrayCardinal
Дата 29.11.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Цитата

To GrayCardinal : по-деликатнее с новичками на форуме..

Прости Господи   smile 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.