Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
h_wolf
9 / 9 / 2
Регистрация: 24.01.2013
Сообщений: 212
1

Ошибка при работе со структурой

03.09.2013, 15:09. Просмотров 1039. Ответов 20
Метки нет (Все метки)

Доброго времени суток!
возник очередной глупый вопрос - ЧТДН?

Объявил массив указателей на структуру, но при попытке внести в структуру данные при компиляции вылезает вот такая ошибка на каждую строку:
error: base operand of '->' has non-pointer type 'bop'

Компилятор - GCC.

В книге ответа на вопрос найти не смог. Уверен в том что так можно, ибо есть работающий код (другое "упражнение" в котором такой способ внесения данных работает без проблем.)

Заранее благодарен!


Код:
Кликните здесь для просмотра всего текста
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
struct bop{
    char FullName[80];
    char Title[80];
    char BopName[80];
    int preference; // 0- FullName, 1- Title, 2- BopName
};
 
int main()
{
    setlocale(LC_CTYPE, "");
 
    bop* Arr=new bop[3];
 
    Arr[0]->FullName="Charli Parker";
    Arr[0]->Title="God";
    Arr[0]->BopName="Frick";
    Arr[0]->preference=0;
 
    Arr[1]->FullName="John Bim";
    Arr[1]->Title="Love";
    Arr[1]->BopName="White";
    Arr[1]->preference=1;
 
    Arr[2]->FullName="Eric Pirce";
    Arr[2]->Title="Sec";
    Arr[2]->BopName="Black";
    Arr[2]->preference=2;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2013, 15:09
Ответы с готовыми решениями:

Ошибка при работе со структурой
#include <iostream.h> #include <conio.h> #pragma argsused float v; struct...

Не могу найти ошибку в работе со структурой студентов
не могу найти ошибку. помогите! #include <stdio.h> #include <io.h> #include...

Не является внутренней или внешней командой - ошибка не при компиляции а при работе программы
В VS скомпилировал код #include <iostream> using namespace std; int main()...

В работе необходимо организовать однонапрямлений список структурой с именем AEROFLOT, что содержит следующие поля:
помогите переделать задачу. вот условие. В работе необходимо организовать...

Ошибка при работе деструктора
#include<iostream> #include<time.h> #include<Windows.h> #include <stdio.h>...

20
Kuzia domovenok
2338 / 2079 / 488
Регистрация: 25.03.2012
Сообщений: 7,447
Записей в блоге: 1
03.09.2013, 15:13 2
оператор -> применяется только к указателям. К самим объектам следует применять точку.

Добавлено через 1 минуту
Цитата Сообщение от h_wolf Посмотреть сообщение
Объявил массив указателей на структуру
нет, ты объявил массив структур. Точнее указатель, указывающий на массив структур.
Элементы же массива это сами структуры, а не какие-то указатели, к которым можно применить ->
0
h_wolf
9 / 9 / 2
Регистрация: 24.01.2013
Сообщений: 212
03.09.2013, 15:13  [ТС] 3
Kuzia domovenok, тогда ругается на несоотвествие типов:

error: incompatible types in assignment of 'const char [14]' to 'char [80]'
0
Hugra
49 / 49 / 9
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
03.09.2013, 15:16 4
Цитата Сообщение от h_wolf Посмотреть сообщение
Kuzia domovenok, тогда ругается на несоотвествие типов:

error: incompatible types in assignment of 'const char [14]' to 'char [80]'
Замени на string и не "парся", или используй strcpy()
1
h_wolf
9 / 9 / 2
Регистрация: 24.01.2013
Сообщений: 212
03.09.2013, 15:18  [ТС] 5
Цитата Сообщение от Hugra Посмотреть сообщение
Замени на string и не "парся", или используй strcpy()
Пробовал -

error: incompatible types in assignment of 'const char [14]' to 'std::string [80] {aka std::basic_string<char> [80]}'
0
Rogov
8 / 8 / 1
Регистрация: 06.07.2013
Сообщений: 21
03.09.2013, 15:18 6
тут 2 варианта, либо в структуре строки обьявить коснт)))

либо почитай про функцию копирования strcpy.
0
h_wolf
9 / 9 / 2
Регистрация: 24.01.2013
Сообщений: 212
03.09.2013, 15:20  [ТС] 7
Цитата Сообщение от Rogov Посмотреть сообщение
тут 2 варианта, либо в структуре строки обьявить коснт)))

либо почитай про функцию копирования strcpy.
Можно более подробнее, я не очень понимаю.
0
Kuzia domovenok
2338 / 2079 / 488
Регистрация: 25.03.2012
Сообщений: 7,447
Записей в блоге: 1
03.09.2013, 15:21 8
strcpy однозначно!

Добавлено через 41 секунду
Цитата Сообщение от h_wolf Посмотреть сообщение
Можно более подробнее, я не очень понимаю.
http://www.cplusplus.com/reference/cstring/strcpy/
А = использовать нельзя.
0
h_wolf
9 / 9 / 2
Регистрация: 24.01.2013
Сообщений: 212
03.09.2013, 15:24  [ТС] 9
Последний вопрос остается в силе, а вто замена char на string помогла. (Протупил, забыл потереть [] в объявлении структуры)

Добавлено через 1 минуту
Kuzia domovenok, Rogov,

C++
1
strcpy(Arr[0].FullName, "Charli Parker")
Так?
0
Rogov
8 / 8 / 1
Регистрация: 06.07.2013
Сообщений: 21
03.09.2013, 15:28 10
да. у тебя не работает?
0
h_wolf
9 / 9 / 2
Регистрация: 24.01.2013
Сообщений: 212
03.09.2013, 15:31  [ТС] 11
Rogov, со string работает, с strcpy нет, пока ковыряюсь. Доделаю с char+strcpy - выложу сюда полное задание и работающий код.
0
Rogov
8 / 8 / 1
Регистрация: 06.07.2013
Сообщений: 21
03.09.2013, 15:42 12
h_wolf, на что ругается??
<string.h> подключен?
0
h_wolf
9 / 9 / 2
Регистрация: 24.01.2013
Сообщений: 212
03.09.2013, 15:51  [ТС] 13
В общем это очередное упражнение из учебника С. Прата "С++ Лекции и упражнения"
Выложу полное решение, вдруг кому пригодится.

Задача:
Кликните здесь для просмотра всего текста
написать программу, которая может выводить списки членов по реальным именам, должностям, секретным именам, либо по предпочтению самого члена. В основу положите структуру:

C++
1
2
3
4
5
6
struct bop{
    string FullName;
    string Title;
    string BopName;
    int preference; // 0- FullName, 1- Title, 2- BopName
};
В этой программе создайте небольшой массив структур и инициализируйте его соответствующими значениями. Пусть программа запустит цикл, который даст возможность пользователю выбирать разные альтернативы:
a. display by name
b. display by title
c. display by bopname
d. display by preference
q. exit

обратите внимание на то, что "by preference" означает что нужно отобразить параметр соответствующий указанному значению prefernce.


Код с применением string:
Кликните здесь для просмотра всего текста
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <string>
 
using namespace std;
 
//int StrSize=80; осталось после попыток с char
 
struct bop{
    string FullName;
    string Title;
    string BopName;
    int preference; // 0- FullName, 1- Title, 2- BopName
};
 
int main()
{
    setlocale(LC_CTYPE, "");
 
    bop* Arr=new bop[3];
 
    Arr[0].FullName="Charli Parker";
    Arr[0].Title="God";
    Arr[0].BopName="Frick";
    Arr[0].preference=0;
 
    Arr[1].FullName="John Bim";
    Arr[1].Title="Love";
    Arr[1].BopName="White";
    Arr[1].preference=1;
 
    Arr[2].FullName="Eric Pirce";
    Arr[2].Title="Sec";
    Arr[2].BopName="Black";
    Arr[2].preference=2;
 
    cout<<"Выберите способ отобрадения:"<<endl;
    cout<<"a) Отобразить имена\t\tb) Отобразить титул"<<endl;
    cout<<"c) отобразить имя БОП\t\td) Отобразить по предпочтинию"<<endl;
    char Sw;
    while(Sw!='q'){
 
    cin>>Sw;
 
    switch(Sw)
    {
    case 'a':
        for(int i=0; i<3; i++)
            cout<<Arr[i].FullName<<endl;
        break;
    case 'b':
        for(int i=0; i<3; i++)
            cout<<Arr[i].Title<<endl;
        break;
    case 'c':
        for(int i=0; i<3; i++)
            cout<<Arr[i].BopName<<endl;
        break;
    case 'd':
        for(int i=0; i<3; i++){
            if(Arr[i].preference==0)
                cout<<Arr[i].FullName<<endl;
            else if(Arr[i].preference==1)
                    cout<<Arr[i].Title<<endl;
            else cout<<Arr[i].BopName<<endl;
        }
        break;
    }
    }
    cout<<"Bye\n";
 
    delete [] Arr;
 
    return 0;
}


С радостью выслушаю все замечания по данному творению.

А вот с массивом char увы запустить это дело не удалось через strcpy:

error: invalid conversion from 'char' to 'char*' [-fpermissive]
error: initializing argument 1 of 'char* strcpy(char*, const char*)' [-fpermissive]

Пока пытаюсь нагуглить ответ.

Добавлено через 1 минуту
Rogov,
error: invalid conversion from 'char' to 'char*' [-fpermissive]
error: initializing argument 1 of 'char* strcpy(char*, const char*)' [-fpermissive]

подключен cstring, он описывает strcpy.
0
Raali
639 / 343 / 74
Регистрация: 06.07.2013
Сообщений: 1,107
Завершенные тесты: 1
03.09.2013, 15:53 14
Цитата Сообщение от h_wolf Посмотреть сообщение
error: invalid conversion from 'char' to 'char*' [-fpermissive]
тут вы где то точно намудрили, надо участок кода с этой ошибкой
0
h_wolf
9 / 9 / 2
Регистрация: 24.01.2013
Сообщений: 212
03.09.2013, 15:54  [ТС] 15
Raali,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <cstring>
 
 
using namespace std;
 
int StrSize=80;
 
struct bop{
    char FullName;
    char Title;
    char BopName;
    int preference; // 0- FullName, 1- Title, 2- BopName
};
 
int main()
{
    setlocale(LC_CTYPE, "");
 
    bop* Arr=new bop[3];
 
    strcpy(Arr[0].FullName,"Charli Parker"); // ошибка тут
0
Raali
639 / 343 / 74
Регистрация: 06.07.2013
Сообщений: 1,107
Завершенные тесты: 1
03.09.2013, 15:55 16
Цитата Сообщение от h_wolf Посмотреть сообщение
char FullName;
ну вот это у вас для имени один char, а нужен массив для стоки, например char fullName[64]; ...- в данном случае 64 символа на имя
1
Rogov
8 / 8 / 1
Регистрация: 06.07.2013
Сообщений: 21
03.09.2013, 15:57 17
C++
1
2
3
 char FullName;
    char Title;
    char BopName;
на самом деле ошибка тут.
Размер чара укажите и все будет ок
1
eXtream
24 / 24 / 0
Регистрация: 10.03.2010
Сообщений: 164
03.09.2013, 16:00 18
весь листинг в студию!
0
h_wolf
9 / 9 / 2
Регистрация: 24.01.2013
Сообщений: 212
03.09.2013, 16:02  [ТС] 19
Rogov, Raali, я -балбес! конечно! Забыл вернуть размер после изменения на string!
0
eXtream
24 / 24 / 0
Регистрация: 10.03.2010
Сообщений: 164
03.09.2013, 16:04 20
C++
1
2
3
4
5
6
struct bop{
    char FullName[MAX_PATH];
    char Title[MAX_PATH];
    char BopName[MAX_PATH];
    int preference; // 0- FullName, 1- Title, 2- BopName
};
0
03.09.2013, 16:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2013, 16:04

ошибка при работе со стуктурами
Возникает проблема при передаче структурных переменных в ф-цию Например: void...

Ошибка при работе с шаблонами
задача: надо создать связанный список . решил посмотреть пример в книге,но там...

Ошибка при работе программы
Помогите найти ошибку Код: #include &lt;iostream&gt; #include &lt;windows.h&gt; ...


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

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

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