Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: C: указатель на структуру  (Прочитано 25049 раз)
0 Пользователей и 1 Гость смотрят эту тему.
cooler_3105
Гость
« : 01-03-2008 16:11 » 

Господа программисты! Прошу вашей помощи! Помогите передать функции в качестве аргумента указатель на структуру.
Вот что есть:
struct city
{
char name[15];
int people;
int S;
int year;
int school;
} list [20], *point;
/*массив структур инициализируется с клавы, пока все ок*/
point=&list[0];
edit (point, n); //вызов функции
void edit (struct *point, int num) //сама функция
{...}
Выдает ошибку на строке с описанием функции:error C2664: 'edit' : cannot convert parameter 1 from 'struct data::city *' to 'struct $S25 *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Подскажите, что не так?
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #1 : 01-03-2008 16:15 » 

может не использовать файл *.c а использовать *.cpp
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
cooler_3105
Гость
« Ответ #2 : 01-03-2008 16:17 » 

На самом деле все это лежит в *.h Улыбаюсь Но сам main() лежит в *.cpp
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 01-03-2008 16:43 » 

Вот так вот попробуй
Код:
struct city
{
char name[15];
int people;
int S;
int year;
int school;
} ;

void edit (struct city *point, int num) //сама функция
{
}

#define num 20

int main()
{
  city list[num];
  edit(list, num);
  return 0;
}
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Aveic
Постоялец

ru
Offline Offline
Пол: Мужской
Yellow


« Ответ #4 : 01-03-2008 17:14 » 

void edit (struct *point, int num) //сама функция
...
Подскажите, что не так?
А че странного? Идентификатор структуры не указан же. Откуда компилятору знать, что ты имеешь ввиду имеено struct city* point, а не другую структуру?
Просто пиши
Код:
void edit(city* point, int num) ...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 01-03-2008 17:32 » 

а зачем вообще в аргументах "struct" присутствует ?
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 01-03-2008 17:44 » 

Алексей1153++, это "C-style". В С надо указывать в типах struct, enum и т.п. В С++ достаточно имени типа.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
cooler_3105
Гость
« Ответ #7 : 01-03-2008 17:49 » 

Предложенные методы не помогли Жаль Выкладываю исходники...
Вызов функции и инициализация структуры - в data.h
Сама функция - в rus.h

* 10.zip (12.68 Кб - загружено 942 раз.)
« Последнее редактирование: 01-03-2008 17:51 от cooler_3105 » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 01-03-2008 18:07 » 

cooler_3105, В хедерах держать исполнение функций, плохой тон. Это допустимо, но в довольно редких или специфичных случаях. Второй момент, попробуй где нибудь еше подключить твои хедеры. Сразу поймаеш ошибку линковки. Паскальный стиль построения программ не подходит для С/С++.
Теперь, выведи из функции void data (void) объевление типа city. И сделай это все таки объявлением типа. А уже в самой функции определяй так city list [20], *point;
Функцию void edit (struct *point, int num) определи так, void edit (struct city *point, int num) и в начале файла rus.h сделай #include "data.h".
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Aveic
Постоялец

ru
Offline Offline
Пол: Мужской
Yellow


« Ответ #9 : 01-03-2008 18:14 » 

уууу, мдя...
в общем страшно все там Улыбаюсь
1) rus.h не подключает data.h Улыбаюсь значит в пределах rus.h struct city не определена
2) далее даже если бы rus.h подключила data.h, это структура все равно не была видна. Причина — структура определена внутри функции Улыбаюсь т.е. ее область видимости ограничивается только этой функцией.
Чтобы все работало, надо:
1) в файле data.h сделать определение структуры вне функции data()
2) в файле rus.h подключить
Код:
#include "data.h"
3) сигнатуру ф-ии edit() изменить на
Код:
void edit(struct city* point, int num)...
Вот Улыбаюсь
Записан
Aveic
Постоялец

ru
Offline Offline
Пол: Мужской
Yellow


« Ответ #10 : 01-03-2008 18:15 » 

Finch, сорри Улыбаюсь не прочитал, что ты написал Жаль
Записан
cooler_3105
Гость
« Ответ #11 : 02-03-2008 08:03 » 

Все, сделал... Решил не мучаться и сделал указатель на массив структу глобальным
Еще один вопросец если можно... Как управлять программой с клавиатуры в ЛЮБОЙ момент времени? Например, запускается программа. Выводится запрос "Введите ко-во записей". Если нажимается F1 тогда сразу все записи берутся из файла. Если F1 не нажимается программа будет ждать пока мы не введем кол-во записей. Насколько я понимаю конструкция вида
while (1)
{...}
здесь неприменима.
« Последнее редактирование: 02-03-2008 08:12 от cooler_3105 » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 02-03-2008 09:29 » 

cooler_3105, зря решил не мучаться. Если планируешь заниматься программированием и дальше, то привыкай использовать локальные переменные и передачу параметров в функции, как положено Улыбаюсь А если у тебя хотя бы сотня-другая функций в куче разных модулей будет? Улыбаюсь
« Последнее редактирование: 02-03-2008 09:56 от Вад » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 02-03-2008 09:30 » 

cooler_3105, не нужно глобальных переменных, чем параметр то не устроил ? Улыбаюсь Удобнее в 10013 с половиной раз...

Про ввод - (если винда) - если есть оконная процедура, то ловить сообщение WM_CHAR . А иначе - только опрос в цикле, думается, только можно не while(1) , а

Код:
for(;;)
{
   //проверяем, вводили ли символ
   ...

   //в зависимости от результата - обработка символа (строки символов) или выполнение части задач
}
Записан

cooler_3105
Гость
« Ответ #14 : 02-03-2008 10:38 » 

cooler_3105, зря решил не мучаться. Если планируешь заниматься программированием и дальше, то привыкай использовать локальные переменные и передачу параметров в функции, как положено Улыбаюсь А если у тебя хотя бы сотня-другая функций в куче разных модулей будет? Улыбаюсь
Просто мне еще это не объясняли, а лабу надо по зарез быстро сдавать чтоб от экзамена освободится Улыбаюсь Насчет передачи указателя на массив структур - буду практиковаться, препода помучаю Улыбаюсь
Алексей1153++, прога консольная. Бесконечные циклы нельзя использовать, т.к. программа будет ждать пока не нажата кнопка. А мне надо:
- если кнопка не нажата - обычное выполнение программы
- если нажимается F2 - выполняется какая-то функция
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #15 : 03-03-2008 11:55 » 

- если кнопка не нажата - обычное выполнение программы
- если нажимается F2 - выполняется какая-то функция

Наверное что-то вроде kbhit(). Поищи, где-то на форуме уже было про эту функцию
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines