Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2009, 16:43   #1
tony2009
 
Регистрация: 26.03.2009
Сообщений: 8
По умолчанию Помогите компилировать программу

Есть программа Фролова, клиент-сервер, уже 3 дня пытаюсь скомпилировать - непонятные ошибки. Как всегда у Фролова не фига не компилируется. Использую Borland C++ 3.1 (как и рекомендуется в книге) Помогите пожалуйста, кто нибудь!!!

Последний раз редактировалось tony2009; 26.03.2009 в 18:51.
tony2009 вне форума Ответить с цитированием
Старый 26.03.2009, 17:46   #2
tony2009
 
Регистрация: 26.03.2009
Сообщений: 8
По умолчанию

закоментил временно функции вызывающие ошибки, но всё равно не создается EXE-файл - ругается на строку "}" warning: functions containing some if statements are not expanded inline. В чем может быть проблема?
tony2009 вне форума Ответить с цитированием
Старый 26.03.2009, 18:17   #3
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Модератор: Код программы и ошибок нужно выкладывать текстом а не файлами. Атачи удалил.
MaTBeu вне форума Ответить с цитированием
Старый 26.03.2009, 18:39   #4
tony2009
 
Регистрация: 26.03.2009
Сообщений: 8
По умолчанию

Код:
// ===================================================
// Листинг 22. Сервер NETBIOS, вариант с
//             использованием каналов
//
// Файл nbserver.cpp
//
// (C) A. Frolov, 1993
// ===================================================

#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.h>
#include <mem.h>
#include <string.h>
#include "netbios.hpp"

// Класс серверов NETBIOS

class NETBIOS_SESSION_SERVER {

        unsigned errno;
        void interrupt ( *int5C)(...);

public:

// Здесь хранится имя сервера и номер этого имени

        char OurName[16];
        unsigned NetworkNameNumber;

// Блок NCB, который будет использован при добавлении имени

        NCB AddNameNCB;

// Конструктор, проверяет наличие NETBIOS и добавляет имя

        NETBIOS_SESSION_SERVER(char *Name) {

// Проверяем длину имени имя

                if(strlen(Name) > 15) {
                        errno = 0xff;
                        return;
                }
                strcpy(OurName, Name);

// Проверяем наличие интерфейса NETBIOS

                int5C = getvect(0x5c);
                errno = 0;
                if(FP_SEG(int5C) == 0x0000 || FP_SEG(int5C) == 0xF000) {
                        errno=0xff;
                        exit(-1);
                }

// Добавляем имя

                AddNameNCB.WAddName(OurName);

// Запоминаем полученный номер имени

                NetworkNameNumber = AddNameNCB.GetNetworkNameNumber();
                errno = AddNameNCB.Error();
                if(errno) return;

// Устанавливаем "*" в поле CallName, это означает,
// что сервер будет обрабатывать запросы на создание
// канала от любого имени

                AddNameNCB.SetCallName("*");

// Устанавливаем время тайм-аута для команд
// приема и передачи данных по каналу

                AddNameNCB.SetRtoSto(20,20);

// Создаем канал с принимающей стороны

                AddNameNCB.WListen();
        }

// Деструктор, удаляет канал и имя.

        ~NETBIOS_SESSION_SERVER() {

// Удаление канала

                AddNameNCB.WHangUp();

// Удаление имени

                AddNameNCB.WDeleteName(OurName);
                errno = AddNameNCB.Error();
        }

// Функция для проверки кода ошибки

        int Error(void) {return errno;}

// Функция для приема данных по каналу

        void Receive(char *ReceiveBuffer, unsigned BufferSize) {

// Записываем в NCB адрес и длину буфера

                AddNameNCB.SetBuffer(ReceiveBuffer, BufferSize);

// Выполняем прием датаграммы с ожиданием

                AddNameNCB.WReceive();

        }
};

void main(void) {

// Наш сервер с именем "NETBIOS Server"

        NETBIOS_SESSION_SERVER Server("NETBIOS Server");
        char ReceiveBuffer[512];

// Проверяем, были ли ошибки на этапе инициализации сервера.

        if(Server.Error()) {
                printf("Ошибка %02.2X\n", Server.Error());
                return;
        }
        printf("Инициализация завершена.\n");
        printf("Ожидаем сообщение от клиента.\n");

// Принимаем сообщение от клиента по каналу, который был создан 
// конструктором класса NETBIOS_SESSION_SERVER

        Server.Receive(ReceiveBuffer, 512);
        printf("Принято: >%s<\n",ReceiveBuffer);
}
Ошибку вылажую картинкой (много набирать):

Последний раз редактировалось MaTBeu; 27.03.2009 в 23:58.
tony2009 вне форума Ответить с цитированием
Старый 26.03.2009, 18:57   #5
tony2009
 
Регистрация: 26.03.2009
Сообщений: 8
По умолчанию

+
Код:
// ===================================================
// Листинг 24. Классы для работы с NETBIOS
//
// Файл netbios.hpp
//
// (C) A. Frolov, 1993
// ===================================================

// Команды NETBIOS

// Команды для работы с именами

#define NB_WAddName 0x30
#define NB_AddName 0xb0
#define NB_WAddGroupName 0x36
#define NB_AddGroupName 0xb6
#define NB_WDeleteName 0x31
#define NB_DeleteName 0xb1

// Команды для передачи датаграмм

#define NB_WSendDatagram 0x20
#define NB_SendDatagram 0xa0
#define NB_WSendBroadcastDatagram 0x22
#define NB_SendBroadcastDatagram 0xa2

// Команды для приема датаграмм

#define NB_WReceiveDatagram 0x21
#define NB_ReceiveDatagram 0xa1
#define NB_WReceiveBroadcastDatagram 0x23
#define NB_ReceiveBroadcastDatagram 0xa3

// Команды для работы с каналами

#define NB_WCall 0x10
#define NB_Call 0x90
#define NB_WListen 0x11
#define NB_Listen 0x91
#define NB_WHangUp 0x12
#define NB_HangUp 0x92

// Команды для передачи данных по каналу

#define NB_WSend 0x14
#define NB_Send 0x94
#define NB_WSendNoAck 0x71
#define NB_SendNoAck 0xf1

#define NB_WChainSend 0x17
#define NB_ChainSend 0x97
#define NB_WChainSendNoAck 0x72
#define NB_ChainSendNoAck 0xf2

// Команды для приема данных по каналу

#define NB_WReceive 0x15
#define NB_Receive 0x95
#define NB_WReceiveAny 0x16
#define NB_ReceiveAny 0x96

// Прочие команды

#define NB_WResetAdapter 0x32
#define NB_WCancel 0x35
#define NB_WSessionStatus 0x34
#define NB_SessionStatus 0xb4


// Класс NCB для работы с командами NETBIOS

class NCB {

// Стандартный блок NCB в формате NETBIOS

	struct _NCB {
		unsigned char Cmd;
		unsigned char CCode;
		unsigned char LocalSessionNumber;
		unsigned char NetworkNameNumber;
		void far *Buffer;
		unsigned Size;
		char CallName[16];
		char OurName[16];
		unsigned char ReceiveTimeout;
		unsigned char SendTimeout;
		void interrupt (*PostRoutine)(void);
		unsigned char AdapterNumber;
		unsigned char FinalCCode;
		unsigned char Reserved[14];
	} ncb;
	struct SREGS sregs;
	union REGS regs;
	unsigned errno;

// Функция для вызова NETBIOS

	void NetBios(void) {
		sregs.es = FP_SEG(&ncb);
		regs.x.bx = FP_OFF(&ncb);
		int86x(0x5c, &regs, &regs, &sregs);
	}

public:

// Конструктор, расписывает ncb нулями

	NCB() {
		memset(&ncb, 0, sizeof(ncb));
		errno = 0;
	}

// Функция возвращает код ошибки

	int Error(void) {return errno;}

// Функция для добавления имени

	void WAddName(char *name);

// Функция для удаления имени

	void WDeleteName(char *name);

// Функция для определения номера имени

	unsigned GetNetworkNameNumber(void)
		{ return(ncb.NetworkNameNumber); }

// Функция для установки адреса и размера буфера

	void SetBuffer(char far *Buf,	unsigned BufSize) {
		ncb.Buffer = Buf;
		ncb.Size = BufSize;
	}

// Установка в NCB таймаута

	void SetRtoSto(int rto, int sto) {
		ncb.ReceiveTimeout = rto;
		ncb.SendTimeout = sto;
	}

// Установка в ncb имени вызываемого партнера

	void SetCallName(char *name);

// Установка в ncb имени нашей станции

	void SetOurName(char *name);

// Прием датаграмм с ожиданием

	void WReceiveDatagram(int NetwrkNameNumber) {

// Заполняем поле номера своего имени

		ncb.NetworkNameNumber = NetwrkNameNumber;

// Вызываем NETBIOS

		ncb.Cmd = NB_WReceiveDatagram;
		NetBios();
	}

// Передача датаграмм с ожиданием

	void WSendDatagram(int NetwrkNameNumber) {

// Заполняем поле номера своего имени

		ncb.NetworkNameNumber = NetwrkNameNumber;
		ncb.Cmd = NB_WSendDatagram;

// Вызываем NETBIOS

		NetBios();
	}

// Создание канала с принимающей стороны

	void WListen(void) {
		ncb.Cmd = NB_WListen;
		NetBios();
	}

// Создание канала с передающей стороны

	void WCall(void) {
		ncb.Cmd = NB_WCall;
		NetBios();
	}

// Удаление канала

	void WHangUp(void) {
		ncb.Cmd = NB_WHangUp;
		NetBios();
	}

// Прием из канала с ожиданием

	void WReceive(void) {
		ncb.Cmd = NB_WReceive;
		NetBios();
	}

// Передача в канал с ожиданием

	void WSend(void) {
		ncb.Cmd = NB_WSend;
		NetBios();
	}


};
tony2009 вне форума Ответить с цитированием
Старый 27.03.2009, 01:02   #6
tony2009
 
Регистрация: 26.03.2009
Сообщений: 8
По умолчанию

Неужели напугал?
tony2009 вне форума Ответить с цитированием
Старый 27.03.2009, 18:34   #7
tony2009
 
Регистрация: 26.03.2009
Сообщений: 8
По умолчанию

Остались warnings: Functions containing some if statements are not expanded inline

ругается похоже на if:
Код:
 // Џа®ўҐа塞 **«ЁзЁҐ Ё*вҐа䥩б* NETBIOS

		int5C = getvect(0x5c);
		errno = 0;
	       	if(FP_SEG(int5C) == 0x0000 || FP_SEG(int5C) == 0xF000) {
		 	errno=0xff;
		  //     	return;
	       	}

// „®Ў*ў«пҐ¬ Ё¬п

		AddNameNCB.WAddName(OurName);

// ‡*Ї®¬Ё**Ґ¬ Ї®«гзҐ**л© *®¬Ґа Ё¬Ґ*Ё

		NetworkNameNumber = AddNameNCB.GetNetworkNameNumber();
		errno = AddNameNCB.Error();
	       //	if(errno) return;
а именно на return;
в чем проблема может быть? Может хоть это кто то знает?
tony2009 вне форума Ответить с цитированием
Старый 27.03.2009, 23:11   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от tony2009 Посмотреть сообщение
в чем проблема может быть? Может хоть это кто то знает?
Вероятно у Вас функция описана как inline, а компилятор не смог её таковой сделать, т.к. есть if'ы с return'ами, и сообщил, что функция не была собрана как inline
ЗЫ. Ни к чему этот выпендрежь. Сами прогу скомпилить не в силах, а всё туда же. Для справки: учебники созданы для обучения, но читатели любят код тупо копировать и ума у них от этого не прибавляется. Поэтому многие авторы специально приводят код с ошибками, чтобы люди голову всеже поломали.
pu4koff вне форума Ответить с цитированием
Старый 27.03.2009, 23:14   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от tony2009 Посмотреть сообщение
Решил я те ошибки, этих братьев фроловых, гандоны хреновы!
За это Вам минус выставил, ибо некрасиво.
Цитата:
Сообщение от tony2009 Посмотреть сообщение
Кто подскажет какой директивой подключить файл с функциями?
#include "ваш_файл.h"
pu4koff вне форума Ответить с цитированием
Старый 27.03.2009, 23:30   #10
tony2009
 
Регистрация: 26.03.2009
Сообщений: 8
По умолчанию

pu4koff я понимаю что специально ну там помоему перебор, ошибок сильно много... //матерная речь

Цитата:
Сообщение от pu4koff Посмотреть сообщение
#include "ваш_файл.h"
Я тоже так думал, не подключается: multiple declaration for 'NCB'. Может потому что там функции с методами? Например:

Код:
// Добавляем имя

	void NCB::WAddName(char *name) {
		char buf[16];

// Проверяем длину имени

		if(strlen(name) > 15) {
			errno = 0xff;
			return;
		}
		strcpy(buf, name);

// При необходимости дополняем имя пробелами

		while (strlen(buf) < 15) strcat(buf, " ");

// Вызываем NETBIOS

		ncb.Cmd = NB_WAddName;
		strcpy(ncb.OurName, buf);
		NetBios();
		errno = ncb.FinalCCode;
	}
pu4koff что значит функция описана как inline? Как лучше вылечить эту ошибку? Это что return какой то особый надо?

UPD by MaTBeu

Последний раз редактировалось MaTBeu; 28.03.2009 в 00:00.
tony2009 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как компилировать программы в TASM? Roof Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 22.12.2011 10:33
Как компилировать в Си? Bogood Общие вопросы C/C++ 10 22.02.2009 20:23
компилировать не выходит 3.14oner Общие вопросы по Java, Java SE, Kotlin 5 08.11.2008 18:36
как компилировать программы написанные на ассемблере??? wwworm Помощь студентам 3 04.03.2008 07:38
научите компилировать в borland для с DOS Помощь студентам 23 28.10.2007 14:29