Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
boobonick
Встал на лапы
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Re: Вопросы по С/С++ (СИ)

Сообщение 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); // вызов функции, которая выводит символы на индикатор
     
  };


Функция будильник вполне работает, если в бесконечный цикл помещаю, но как мне записать ее в структуру :dont_know:. Как я понимаю - здесь проблема, которая связана с с вызовом функции внутри функции. Такое в структуре возможно, как это описывается вообще?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

ну так вы уже поместили функцию в структуру:
boobonick писал(а):

Код: Выделить всё

struct typeMenu menu[2]={
  {"BUDI",&budilnik}, // вот это разве не функция?
  {"HOUR",&set_time}
};
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
boobonick
Встал на лапы
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Re: Вопросы по С/С++ (СИ)

Сообщение boobonick »

Да, функция, но она не работает, при условии, если в этой функции вызываю еще одну функцию! В этом случае надо как-то по-другому делать указатель на функцию в структуре? Получается, что если я закидываю в цикл - функция все выводит на индикатор
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

не знаю, как там в вашем компиляторе, но если при определении функции вы не указали тип ее результата, то по умолчанию считается, что результат int - а вы в структуре указали void. смотрите внимательно на варнинги компилятора - есть по этой теме?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
boobonick
Встал на лапы
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Re: Вопросы по С/С++ (СИ)

Сообщение boobonick »

Компилятор выдает : 1. typedef name required 2. expression with possibly no effect
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

ну здесь правильно написали, что возвращаемый тип - воид, а не инт, еще - я бы не пользовался лейблом структуры, а ее именем (снес бы название вниз), расположил бы все это во флешь, чтобы оперативку не пользовать зря и объявил бы функции вверху дополнительно.
выложите проект, так проще.
ellioh
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

Re: Вопросы по С/С++ (СИ)

Сообщение ellioh »

boobonick писал(а):1. typedef name required

Ну, просто некорректность налицо:

Код: Выделить всё

typedef struct typeMenu{ 
char *punkt_menu;
void (*funct) (void);
};

Это пишется либо как

Код: Выделить всё

struct typeMenu{ 
char *punkt_menu;
void (*funct) (void);
};

И тогда надо при использовании писать

Код: Выделить всё

struct typeMenu menu[2];


Либо, если хочется typedef, что иногда имеет смысл, то:

Код: Выделить всё

typedef struct { 
char *punkt_menu;
void (*funct) (void);
} typeMenu;

В этом случае объявляется структура без имени, и тут же она становится типом typeMenu. Плюс в том, что можно впоследствии не писать слово struct при объявлениях:

Код: Выделить всё

typeMenu menu[2];
Клоподавер упрыгхт
Аватара пользователя
boobonick
Встал на лапы
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

Re: Вопросы по С/С++ (СИ)

Сообщение boobonick »

Спасибо за советы!) Ковырял-ковырял и оп работает :)) :)) :))
Аватара пользователя
sergeys
Поставщик валерьянки для Кота
Сообщения: 1946
Зарегистрирован: Сб сен 11, 2010 13:45:01
Откуда: Екатеринбург

Вопросы по С.

Сообщение sergeys »

Решил пока тут, ну если модеры перенесут, так перенесут. В темке МЯЯЯУ! уже задавл пару вопросов, но было решено там не срать :)))

Вообщем вопрос: книжку читал, но не увидел, может пропустил, как объявить символьную переменную? И это ее значение может быть например + - * / ? И будет ли с такими значениями работать switch?
Пока вроде все, изучаю :)



Перенес сюда.


aen
Ко мне можно на "ты", так даже лучше!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С.

Сообщение ARV »

символьная переменная описывается так:

Код: Выделить всё

char var; // var - это переменная

вообще-то это азы Си... я пытался очень кратко их изложить в первых главах своих статей попробуйте прочесть - может, станет меньше вопросов...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
sergeys
Поставщик валерьянки для Кота
Сообщения: 1946
Зарегистрирован: Сб сен 11, 2010 13:45:01
Откуда: Екатеринбург

Re: Вопросы по С/С++ (СИ)

Сообщение 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);

     }

 }

Не ругайте если что, я Си со вчерашнего вечера изучаю :)
Ко мне можно на "ты", так даже лучше!
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение urry »

scanf("%char"
и что здесь должно получиться ?
Аватара пользователя
sergeys
Поставщик валерьянки для Кота
Сообщения: 1946
Зарегистрирован: Сб сен 11, 2010 13:45:01
Откуда: Екатеринбург

Re: Вопросы по С/С++ (СИ)

Сообщение sergeys »

urry писал(а):scanf("%char"
и что здесь должно получиться ?

Ээээээ, scanf("%c" ? как правильно, нужно прочитать введенную с клавы симв. переменную :dont_know:
Ко мне можно на "ты", так даже лучше!
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

sergeys писал(а):Блин, все таки switch не работает с символьной переменной?
...
Не ругайте если что, я Си со вчерашнего вечера изучаю :)

А где в приведенном коде сам switch ? :shock:

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

Упс!!!


Пардон, что-то глаза совсем. Отвык неформатированный код читать :-)
Но букварь почитайте. switch работает только с целочисленными типами, а ему тут в case строку подсунули. Дайте ему символ '+', а не строку "+" (точнее, в case попадает указатель на строку)
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
sergeys
Поставщик валерьянки для Кота
Сообщения: 1946
Зарегистрирован: Сб сен 11, 2010 13:45:01
Откуда: Екатеринбург

Re: Вопросы по С/С++ (СИ)

Сообщение sergeys »

Букварь читаю, но об этом не знал, там код есть, но скан хреновейший, невидно :)

Блин, щас все компилит, но доходит до Введите знак, вожу и фсе, ни суммы ни разности :dont_know:

Код: Выделить всё

#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);
     }

 }

Ко мне можно на "ты", так даже лучше!
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

Re: Вопросы по С/С++ (СИ)

Сообщение Roman Venom »

посоветуйте нормальный компилятор для пик10-пик18. Поставил PIC-C, он какой-то странный. :(
Успех - императив!
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Re: Вопросы по С/С++ (СИ)

Сообщение 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);
     }

}

Аватара пользователя
sergeys
Поставщик валерьянки для Кота
Сообщения: 1946
Зарегистрирован: Сб сен 11, 2010 13:45:01
Откуда: Екатеринбург

Re: Вопросы по С/С++ (СИ)

Сообщение sergeys »

Так работает, но:
getchar(); // вычитываем из входного потока символ перевода строки
// который оставила предыдущая scanf
Не понял, зачем его вычитывать, и почему только для одной scanf?
break; - прерывание выполнения оператора?
default: - иначе писать ..... ?
Ко мне можно на "ты", так даже лучше!
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение DX168B »

getchar(); читает только один символ клавы. Есть ещё cin getch() или _getch()
Обе эти функции возвращают значение нажатой клавиши. А если возвращают, то записать надо так, как я учил :)))

Код: Выделить всё

char s;
s = getch();
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
sergeys
Поставщик валерьянки для Кота
Сообщения: 1946
Зарегистрирован: Сб сен 11, 2010 13:45:01
Откуда: Екатеринбург

Re: Вопросы по С/С++ (СИ)

Сообщение sergeys »

Нет, так а почему с ним работает а без него нет? Ведь scanf тоже читает :dont_know:
Ко мне можно на "ты", так даже лучше!
Ответить

Вернуться в «Разные вопросы по МК»