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
|
|
« Ответ #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
Спокойный
Администратор
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
Постоялец
Offline
Пол:
Yellow
|
|
« Ответ #4 : 01-03-2008 17:14 » |
|
void edit (struct *point, int num) //сама функция ... Подскажите, что не так?
А че странного? Идентификатор структуры не указан же. Откуда компилятору знать, что ты имеешь ввиду имеено struct city* point, а не другую структуру? Просто пиши void edit(city* point, int num) ...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 01-03-2008 17:32 » |
|
а зачем вообще в аргументах "struct" присутствует ?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #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 Кб - загружено 938 раз.)
|
« Последнее редактирование: 01-03-2008 17:51 от cooler_3105 »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
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
Постоялец
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 подключить 3) сигнатуру ф-ии edit() изменить на void edit(struct city* point, int num)... Вот
|
|
|
Записан
|
|
|
|
Aveic
Постоялец
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 »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #12 : 02-03-2008 09:29 » |
|
cooler_3105, зря решил не мучаться. Если планируешь заниматься программированием и дальше, то привыкай использовать локальные переменные и передачу параметров в функции, как положено А если у тебя хотя бы сотня-другая функций в куче разных модулей будет?
|
|
« Последнее редактирование: 02-03-2008 09:56 от Вад »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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 - выполняется какая-то функция
|
|
|
Записан
|
|
|
|
Артем
Опытный
Offline
Пол:
Beware the wolf in sheep's clothing.
|
|
« Ответ #15 : 03-03-2008 11:55 » |
|
- если кнопка не нажата - обычное выполнение программы - если нажимается F2 - выполняется какая-то функция
Наверное что-то вроде kbhit(). Поищи, где-то на форуме уже было про эту функцию
|
|
|
Записан
|
|
|
|
|