Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
9 / 5 / 0
Регистрация: 19.01.2013
Сообщений: 74
1

Что такое псевдо-функции?

19.01.2013, 16:16. Показов 4961. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые форумчане, у меня возник вопрос, что это такое(псевдо функции) и с чем его едят=)
у меня есть такая строка:

C
1
#define read_byte()  (stored_byte_status?stored_byte_status=FALSE,(unsigned char)stored_byte_val:(unsigned char)fgetc(source_file))
как можно ее записать в виде обычной функции на языке С.

P.S.
stored_byte_status и stored_byte_val это переменные
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.01.2013, 16:16
Ответы с готовыми решениями:

Кто сможет объяснить что означает в этом коде 0x55555, что это такое, для чего предназначено?
#include "stdafx.h" #pragma warning(disable : 4996) #include <stdio.h> #include <conio.h>...

что такое псевод класс и псевдо элемент?
читал спецификацию w3org и никак не пойму псевод классы и псевдо элементы являются селекторами...

Что такое Функции в C++
Можете объяснить что такое функции в C++, только подробно. Я не понимаю как они работают и да...

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

28
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
19.01.2013, 16:34 2
Вот тебе псевдофункция нахождения минимума.
C
1
#define min(n1, n2) (((n1) < (n2)) ? (n1) : (n2))
есть два параметра, есть условие (n1) < (n2), есть оператор ? есть ответ если условие верно(это выражение идет после ?), и есть выражение в других случаях (после : идет)

C
1
2
3
4
5
6
7
8
9
10
11
#define min(n1, n2) (((n1) < (n2)) ? (n1) : (n2))
 
int main()
{
       printf("%d",min(1,2));
       //то же самое что и if
       printf("\nif'om\n");
       if(1<2) printf("%d\n",1);
       else printf("%d",2);
    return 0;
}
if-ом больше писанины. Это одно из первых преимуществ оператора ?
и второе преимущество, это то что его можно написать в функциях(операторах), как в примере у printf("%d",min(1,2)); вот так:
printf("%d",((1 < 2) ? 1 : 2));.
If сюда же не засунешь..

А у вас, простите меня, хз что написано. и не компилируется.
Изображения
 
1
9 / 5 / 0
Регистрация: 19.01.2013
Сообщений: 74
19.01.2013, 16:37  [ТС] 3
я вообще чайник в этих делах, но это все компилируется в коде программы. мне как то нужно переписать это в обычную функцию. если поможет могу скинуть весь код=)


то есть как я понял ": " означает - или?
0
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
19.01.2013, 16:42 4
Цитата Сообщение от Pokemon_93 Посмотреть сообщение
то есть как я понял ": " означает - или?
да, но если не будет знака вопроса, то и : не сработает.
Выгладит так:
условие?значени_True : значение_False


Да, скиньте код.
0
9 / 5 / 0
Регистрация: 19.01.2013
Сообщений: 74
19.01.2013, 16:46  [ТС] 5
поместил код в архиве, буду очень благодарен если поможете с этим разобраться.
Вложения
Тип файла: rar kod.rar (3.3 Кб, 4 просмотров)
0
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
19.01.2013, 17:06 6
Я такого не встречал.
C
1
2
3
4
5
int main(argc,argv)
 
int argc;
char *argv[];
{
Дужка для внутренности main идет после объявления параметров функции.
Должно же быть так
C
1
2
int main(int argc,char *argv[])
{
И первый вариант не компилируется.

P.S. Я ещё не все ошибки выправил. Объясните первый пример кто-то)))))
0
9 / 5 / 0
Регистрация: 19.01.2013
Сообщений: 74
19.01.2013, 17:10  [ТС] 7
да, извиняюсь. так оно и должно быть просто этот код пишется ночами(т.к. днем сдаются другие предметы). и возможно что не все оформлено синтаксически правильно. но код работает это проверено. только я не могу подружиться с этими самыми псевдо функциями.

P.S. Компилятор С++Builder
0
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
19.01.2013, 17:13 8
Pokemon_93, у тебя все функции так реализованы. Я попытаюсь сосредоточится на псевдофункциях.
0
9 / 5 / 0
Регистрация: 19.01.2013
Сообщений: 74
19.01.2013, 17:15  [ТС] 9
помоему только 4)) с первой begining of data я разобрался. заменил ее на:
C
1
2
3
4
5
void beginning_of_data()
{
rewind(source_file);
stored_byte_status=FALSE;
}
а вот с остальными проблема.
0
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
19.01.2013, 17:19 10
C
1
#define read_byte()  (stored_byte_status?stored_byte_status=FALSE,(unsigned char)stored_byte_val:(unsigned char)fgetc(source_file))
По идеи оно должно быть так:
C
1
2
3
4
5
6
7
8
9
10
int read_byte1()
{
    if(stored_byte_status)
    {
        stored_byte_status=FALSE;
        return (unsigned char)stored_byte_val;
    }
    else
        return (unsigned char)fgetc(source_file)
}
Но код у меня не компилируется, так что проверить не могу. Поскольку есть fgetc значит тип должен быть int. и если запятая есть, то значит два сразу в первом ифе
C
1
2
stored_byte_status=FALSE;
        return (unsigned char)stored_byte_val;
1
9 / 5 / 0
Регистрация: 19.01.2013
Сообщений: 74
19.01.2013, 17:31  [ТС] 11
а ее вызов в коде:

C
1
2
3
if (read_byte1())
{
}
Добавлено через 10 минут
к сожалению данная замена ни к чему хорошему не приводит. после компиляции возникла ошибка на строке с номером
216. WEIGHT_OF_TREE(occurrences_table[i])++;
0
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
19.01.2013, 17:42 12
Вот так вызывают псевдофункцию
byte_read = read_byte();

Сам по себе byte_read Объявлен как неотрицательный код символа:
C
1
unsigned char byte_read;
Значит ему нежен символ.
я вот написал мини программу по данному случаю.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int stored_byte_status = 0;
int stored_byte_val;
FILE *source_file;
char read_byte()
{
    if(stored_byte_status)
    {
        stored_byte_status=0;
        return (unsigned char)stored_byte_val;
    }
    else
        return (unsigned char) fgetc(source_file);
}
int main(void)
{    
    unsigned char byte_read;
    if (!(source_file=fopen("task1.txt", "r"))) return -1;
      
    byte_read=read_byte(); 
}
и возвращает символ из файла, если stored_byte_status=0, т.е. false


Цитата Сообщение от Pokemon_93 Посмотреть сообщение
if (read_byte1())
{
}
Единичку убери.read_byte1
1
9 / 5 / 0
Регистрация: 19.01.2013
Сообщений: 74
19.01.2013, 17:45  [ТС] 13
да, спасибо. на счет 1 я понял, немного доработав ваш вариант функции я добился корректной ее работы. не могли бы вы помочь еще и с остальными функциями? пожалуйста, очень нужно))
0
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
19.01.2013, 17:48 14
Цитата Сообщение от Pokemon_93 Посмотреть сообщение
остальными функциями
скинь сюда, ато их там три, а ты писал 4.
Цитата Сообщение от Pokemon_93 Посмотреть сообщение
я добился корректной ее работы
это так здорово звучит, что я уже ваш фанат))) Ну значит вы шарите))
0
9 / 5 / 0
Регистрация: 19.01.2013
Сообщений: 74
19.01.2013, 17:52  [ТС] 15
пожалуйста не смейтесь на до мной))))
теперь их две осталось
C
1
2
3
#define end_of_data()  (stored_byte_status?FALSE:!(stored_byte_status=((stored_byte_val=fgetc(source_file))!=EOF)))
 
#define write_byte(byte)  ((void)fputc((byte),dest_file))
помогите пожалуйста.
0
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
19.01.2013, 18:05 16
Со второй то вот так:
C
1
2
3
4
5
6
//#define write_byte(byte)  ((void)fputc((byte),dest_file))
//unsigned int byte;
void write_byte(unsigned int byte)
{
    fputc(byte,dest_file);//ничего не вовращает, просто запись в файл.
}
Вторая пожеще))
C
1
2
3
4
5
6
7
8
//#define end_of_data()  (stored_byte_status?FALSE:!(stored_byte_status=((stored_byte_val=fgetc(source_file))!=EOF)))
//Вызов вот так там делали
//if (!end_of_data())
int end_of_data()
{
    if(stored_byte_status) return 0;//у меня FALSE не компилируется, оно равно 0, я пишу 0
    else return !(stored_byte_status=((stored_byte_val=fgetc(source_file))!=EOF));
}
та это кописаст, все просто) Наверно
1
9 / 5 / 0
Регистрация: 19.01.2013
Сообщений: 74
19.01.2013, 18:09  [ТС] 17
спасибо огромное, вы мне жизнь спасли))) как я могу вас отблагодарить?))
0
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
19.01.2013, 18:15 18
Pokemon_93, не смешите, я здесь не для этого)))
Желаю успехов!
1
9 / 5 / 0
Регистрация: 19.01.2013
Сообщений: 74
20.01.2013, 17:56  [ТС] 19
огромное вам спасибо еще раз))) и вам всего самого наилучшего)

Добавлено через 21 час 28 минут
Доброго времени суток)) это сново я. Уважаемый CVB, не могли бы вы мне еще немного помочь по примерно той же тематике? как можно расшифровать вот эту строку?
C
1
#define BYTE_OF_TREE(ptr_tree)  ((*(ptr_tree)).byte)
если учитывать что byte это переменная типа unsigned int
а ptr_tree я не знаю что это такое))))

Добавлено через 2 часа 10 минут
пожалуйста, спасите меня еще раз)) посмотрите что можно сделать с этими строками.
C
1
2
3
4
#define BYTE_OF_TREE(ptr_tree)  ((*(ptr_tree)).byte)
#define WEIGHT_OF_TREE(ptr_tree)  ((*(ptr_tree)).weight)
#define LEFTPTR_OF_TREE(ptr_tree)  ((*(ptr_tree)).left_ptr)
#define RIGHTPTR_OF_TREE(ptr_tree)  ((*(ptr_tree)).right_ptr)
это все тот же код)))
0
101 / 92 / 53
Регистрация: 22.03.2011
Сообщений: 226
22.01.2013, 16:47 20
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
#include <stdio.h>
#include <stdlib.h>
 
typedef struct s_tree 
{
    unsigned int byte;
/*  Кодируем байт как unsigned integer*/
/*  что позволит узлу иметь значение больше 255 */
    unsigned long int weight;
    struct s_tree *left_ptr,
                  *right_ptr;
}t_tree,*p_tree;
 
//#define BYTE_OF_TREE(ptr_tree)  ((*(ptr_tree)).byte)
//#define WEIGHT_OF_TREE(ptr_tree)  ((*(ptr_tree)).weight)
//#define LEFTPTR_OF_TREE(ptr_tree)  ((*(ptr_tree)).left_ptr)
//#define RIGHTPTR_OF_TREE(ptr_tree)  ((*(ptr_tree)).right_ptr)
// 
void BYTE_OF_TREE (p_tree ptr_tree,unsigned int k)  {
    ptr_tree->byte=k;}
void WEIGHT_OF_TREE(p_tree ptr_tree, unsigned long int k){
    ptr_tree->weight=k;}
void LEFTPTR_OF_TREE(p_tree ptr_tree, p_tree k)  {
    ptr_tree->left_ptr=k;}
void RIGHTPTR_OF_TREE(p_tree ptr_tree, p_tree k )  {
    ptr_tree->right_ptr=k;}
 
int main(void)
{
    register unsigned int i;
    p_tree occurrences_table[257],      ptr_fictive_tree;
    for (i = 0;i <= 256;i++)
    {
        if ((occurrences_table[i] = (p_tree)malloc(sizeof(t_tree))) == NULL)    {for (;i;i--)free(occurrences_table[i - 1]);}//exit(BAD_MEM_ALLOC);
        
        BYTE_OF_TREE(occurrences_table[i],i);//BYTE_OF_TREE(occurrences_table[i]) = i;
        WEIGHT_OF_TREE(occurrences_table[i],0);//WEIGHT_OF_TREE(occurrences_table[i]) = 0;
        LEFTPTR_OF_TREE(occurrences_table[i], NULL);//LEFTPTR_OF_TREE(occurrences_table[i]) = NULL;
        RIGHTPTR_OF_TREE(occurrences_table[i],NULL);//RIGHTPTR_OF_TREE(occurrences_table[i]) = NULL;
    }
    return 0;
}
Это уже так просто не вышло. Нужно перелопатить то что имеем, по такому принципу как в коде выше. Т.е. значение заносить в дужки через кому.
0
22.01.2013, 16:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2013, 16:47
Помогаю со студенческими работами здесь

Что такое IIS и что такое PWS? Почему одно без другого не работает?
вот уже второй день пытаюсь немного разобраться в АСП. накидал небольшую тестовую страничку. но с...

Что такое ссылки на функции?
Хай. Вопрос в заголовке. Можно, пожалуйста с примером. Спасибо.

Что такое прототип функции?
Зачем нужен прототип функции ведь она и без него прекрасно работает? Если можете объясните как...

Что такое лямбда функции?
Добрый вечер, что такое лямбда функции? Что значит запись: (lambda (w) (and (member a1 w)...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru