Страница 23 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 05, 2011 07:04:27
boobonick
А подскажите, пожалуйста, вот
Код: Выделить всё
typedef struct typeMenu{
char *punkt_menu;
void (*funct) (void);
};
.....................
struct typeMenu menu[2]={
{"BUDI",&budilnik} ,
{"HOUR",&set_time}
};
.....................
budilnik (void){
if (++tmin>59) { tmin=0; if (++thour>24) {thour=0;} }
buff[0]=thour/10;
buff[1]=thour%10;
buff[2]=tmin/10;
buff[3]=tmin%10;
char_out(buff); // вызов функции, которая выводит символы на индикатор
};
Функция будильник вполне работает, если в бесконечный цикл помещаю, но как мне записать ее в структуру

. Как я понимаю - здесь проблема, которая связана с с вызовом функции внутри функции. Такое в структуре возможно, как это описывается вообще?
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 05, 2011 07:30:17
ARV
ну так вы уже поместили функцию в структуру:
boobonick писал(а):Код: Выделить всё
struct typeMenu menu[2]={
{"BUDI",&budilnik}, // вот это разве не функция?
{"HOUR",&set_time}
};
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 05, 2011 08:01:53
boobonick
Да, функция, но она не работает, при условии, если в этой функции вызываю еще одну функцию! В этом случае надо как-то по-другому делать указатель на функцию в структуре? Получается, что если я закидываю в цикл - функция все выводит на индикатор
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 05, 2011 08:06:54
ARV
не знаю, как там в вашем компиляторе, но если при определении функции вы не указали тип ее результата, то по умолчанию считается, что результат int - а вы в структуре указали void. смотрите внимательно на варнинги компилятора - есть по этой теме?
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 05, 2011 10:06:22
boobonick
Компилятор выдает : 1. typedef name required 2. expression with possibly no effect
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 05, 2011 11:14:23
urry
ну здесь правильно написали, что возвращаемый тип - воид, а не инт, еще - я бы не пользовался лейблом структуры, а ее именем (снес бы название вниз), расположил бы все это во флешь, чтобы оперативку не пользовать зря и объявил бы функции вверху дополнительно.
выложите проект, так проще.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 05, 2011 13:03:29
ellioh
boobonick писал(а):1. typedef name required
Ну, просто некорректность налицо:
Код: Выделить всё
typedef struct typeMenu{
char *punkt_menu;
void (*funct) (void);
};
Это пишется либо как
Код: Выделить всё
struct typeMenu{
char *punkt_menu;
void (*funct) (void);
};
И тогда надо при использовании писать
Либо, если хочется typedef, что иногда имеет смысл, то:
Код: Выделить всё
typedef struct {
char *punkt_menu;
void (*funct) (void);
} typeMenu;
В этом случае объявляется структура без имени, и тут же она становится типом typeMenu. Плюс в том, что можно впоследствии не писать слово struct при объявлениях:
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 06, 2011 09:17:43
boobonick
Вопросы по С.
Добавлено: Пт май 06, 2011 13:32:33
sergeys
Решил пока тут, ну если модеры перенесут, так перенесут. В темке МЯЯЯУ! уже задавл пару вопросов, но было решено там не срать
Вообщем вопрос: книжку читал, но не увидел, может пропустил, как объявить символьную переменную? И это ее значение может быть например + - * / ? И будет ли с такими значениями работать switch?
Пока вроде все, изучаю
Перенес сюда.
aen
Re: Вопросы по С.
Добавлено: Пт май 06, 2011 13:38:33
ARV
символьная переменная описывается так:
вообще-то это азы Си... я пытался очень кратко их изложить в первых главах
своих статей попробуйте прочесть - может, станет меньше вопросов...
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 06, 2011 14:28:32
sergeys
Блин, все таки switch не работает с символьной переменной? Или я не тот тип взял, мне нужно распозновать действия по знакам тобиш прочитал + складывать, - вычитать, ну понятно
Код: Выделить всё
#include <stdio.h>
main()
{
float a, b, rez;
char znak;
printf("КАЛЬКУЛЯТОР ");
printf("Введите первое число: ");
scanf("%f" , &a);
printf("Введите второе число: ");
scanf("%f" , &b);
printf("Введите знак: ");
scanf("%char" , &znak); /*тип верно написал? char? наугад ткнул :))) */
switch (znak) {
case "+" : /*тут ругается*/
rez = a + b;
printf("Сумма = ", rez);
}
}
Не ругайте если что, я Си со вчерашнего вечера изучаю

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 06, 2011 14:58:28
urry
scanf("%char"
и что здесь должно получиться ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 06, 2011 15:03:23
sergeys
urry писал(а):scanf("%char"
и что здесь должно получиться ?
Ээээээ, scanf("%c" ? как правильно, нужно прочитать введенную с клавы симв. переменную

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 06, 2011 15:44:45
avreal
sergeys писал(а):Блин, все таки switch не работает с символьной переменной?
...
Не ругайте если что, я Си со вчерашнего вечера изучаю

А где в приведенном коде сам switch ?
Голый case никому не нужен. Вы бы всё же какой-то букварь по С прочитали до конца.
Хоть бы этот
http://publ.lib.ru/ARCHIVES/B/BOLSKI_M. ... M._I..html , если на более толстое нет сил.
Упс!!!
Пардон, что-то глаза совсем. Отвык неформатированный код читать

Но букварь почитайте. switch работает только с целочисленными типами, а ему тут в case строку подсунули. Дайте ему символ '+', а не строку "+" (точнее, в case попадает указатель на строку)
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 06, 2011 16:09:10
sergeys
Букварь читаю, но об этом не знал, там код есть, но скан хреновейший, невидно
Блин, щас все компилит, но доходит до Введите знак, вожу и фсе, ни суммы ни разности

Код: Выделить всё
#include <stdio.h>
main()
{
int a, b, rez;
char znak;
printf("КАЛЬКУЛЯТОР \n");
printf("Введите первое число: ");
scanf("%d" , &a);
printf("Введите второе число: ");
scanf("%d" , &b);
printf("Введите знак: ");
scanf("%char" , &znak);
switch (znak) {
case '+' :
rez = a + b;
printf("Сумма %d\n", rez);
case '-' :
rez = a-b;
printf("Разность %d\n ", rez);
}
}
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 06, 2011 16:39:24
Roman Venom
посоветуйте нормальный компилятор для пик10-пик18. Поставил PIC-C, он какой-то странный.

Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 06, 2011 17:06:03
lix
sergeys, вот код с небольшими комментами
Код: Выделить всё
main()
{
int a, b, rez;
char znak;
printf("КАЛЬКУЛЯТОР \n");
printf("Введите первое число: ");
scanf("%d" , &a);
printf("Введите второе число: ");
scanf("%d" , &b);
printf("Введите знак: ");
getchar(); // вычитываем из входного потока символ перевода строки
// который оставила предыдущая scanf
scanf("%c" , &znak);
switch (znak) {
case '+' :
rez = a + b;
printf("Сумма %d\n", rez);
break; // обрати внимание на эти брейки, без них
// поведение программы будет странным для тебя ;)
case '-' :
rez = a-b;
printf("Разность %d\n ", rez);
break; // и на этот тоже
default:
printf("Непонятный знак :( %d\n", znak);
}
}
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 06, 2011 17:27:46
sergeys
Так работает, но:
getchar(); // вычитываем из входного потока символ перевода строки
// который оставила предыдущая scanf
Не понял, зачем его вычитывать, и почему только для одной scanf?
break; - прерывание выполнения оператора?
default: - иначе писать ..... ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 06, 2011 18:14:57
DX168B
getchar(); читает только один символ клавы. Есть ещё cin getch() или _getch()
Обе эти функции возвращают значение нажатой клавиши. А если возвращают, то записать надо так, как я учил
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт май 06, 2011 18:22:34
sergeys
Нет, так а почему с ним работает а без него нет? Ведь scanf тоже читает
