● C/C++ (BM: thebestone)

饮水思源站 ● C/C++ (BM: thebestone) 精华区离线浏览

版权所有：BBS饮水思源站

Copyright © 2001 SJTUBBS, All Rights Reserved. 版权所有上海交大BBS饮水思源站
类型 | 标题 | 长度 | 时间
目录 | 源代码 | 9项 | 00/03/11 01:43
目录 | C语言讨论 | 6项 | 00/03/31 20:17
目录 | 技术与应用 | 9项 | 00/04/06 19:25
目录 | Turbo C | 4项 | 00/03/11 01:43
目录 | C语言教室 | 11项 | 00/04/29 13:44
目录 | 帮助 | 3项 | 00/03/11 01:43
目录 | 有问有答 | 14项 | 00/04/29 14:41
文件 | 历任板主 thebestone | 127 | 01/03/26 18:02
目录 | 临时目录（尚未整理的文档） | 15项 | 01/03/28 19:14
文件 | 711 thebestone | 108 | 01/03/26 19:49


● C/C++ (BM: thebestone)

饮水思源站 ● C/C++ (BM: thebestone) 精华区离线浏览
Copyright © 2001 SJTUBBS, All Rights Reserved. 版权所有上海交大BBS饮水思源站
类型 | 标题 | 长度 | 时间
目录 | 源代码 | 9项 | 00/03/11 01:43
目录 | C语言讨论 | 6项 | 00/03/31 20:17
目录 | 技术与应用 | 9项 | 00/04/06 19:25
目录 | Turbo C | 4项 | 00/03/11 01:43
目录 | C语言教室 | 11项 | 00/04/29 13:44
目录 | 帮助 | 3项 | 00/03/11 01:43
目录 | 有问有答 | 14项 | 00/04/29 14:41
文件 | 历任板主 thebestone | 127 | 01/03/26 18:02
目录 | 临时目录（尚未整理的文档） | 15项 | 01/03/28 19:14
文件 | 711 thebestone | 108 | 01/03/26 19:49


源代码

饮水思源站 源代码 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 用C++建立图形图像类(一) shield | 2410 | 00/03/11 01:43
文件 | 用C++建立图形图像类(二) shield | 1947 | 00/03/11 01:43
文件 | 用C++建立图形图像类(三) shield | 2425 | 00/03/11 01:43
文件 | c源代码(一)attrib.c jia | 6008 | 00/03/11 01:43
文件 | c源代码(二)--deltree.c jia | 6818 | 00/03/11 01:43
文件 | SMTP/POP3 Delphi范例 jia | 17185 | 00/03/11 01:43
文件 | c程序共享 jia | 9463 | 00/03/11 01:43
文件 | c程序共享(2) jia | 6093 | 00/03/11 01:43
文件 | c程序分享(3) jia | 75992 | 00/03/11 01:43

返回

Copyright © 2001 SJTUBBS, All Rights Reserved.

版权所有上海交大BBS饮水思源站


饮水思源精华区

饮水思源站 文章阅读 精华区离线浏览
发信人: wql.bbs@bbs.swjtu.edu.cn (晖), 信区: C
标 题: 用C++建立图形图像类(一)
发信站: 锦城驿站 (Mon Jul 7 03:04:29 1997)
转信站: sjtubbs!sjtunews!swjtunews!swjtubbs
Origin: xnjd21.swjtu.edu.cn

#include <typedef.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <mem.h>
#include <math.h>
#include <graphics.h>
#include <time.h>

#define BC_640_480_16 0x12 //普通16色模式
#define VESA_640_480 0x101 //640*480*256
#define VESA_800_600 0x103 //800*600*256
#define VESA_1024_768 0x105 //1024*768*16
#define VESA_1280_1024 0x107 //1024*768*256

#define NOT_SURPOT_VESA 1 //错误信息:不支持VESA协议
#define NOT_ENOUGH_VRAM 2 //错误信息:没有足够的显存

#define EXTERN_MODE 1 //扩展模式(此处指指VESA模式)
#define BASE_MODE 2 //基本模式

// VESA SVGA 信息块数据结构定义(由 VESA BIOS 功能调用 00H 返回)
struct ywVesaInfo
{
char * vesa_flag; //字符串"VESA"
char * vesa_ver; //VESA 版本号
char * OEM_ptr; //指向OEM厂商的标志串的指针
char * resered; //保留的远指针
unsigned int * videmode_ptr; //指向所支持显示模式列表的指针
unsigned int v_mem_size; //显示内存大小,单位为 64KB
ywVesaInfo(void);
~ywVesaInfo(void);
};

//VESA 特定模式信息块数据结构定义( VESA BIOS 功能调用 01H 返回 )
struct ywVesaModeInfo
{
unsigned int mode_attr; //模式的属性
unsigned char win_a_attr, win_b_attr; //窗口A,B 的属性
unsigned win_gran; //窗口页粒度
unsigned win_size; //窗口大小
unsigned win_a_seg, win_b_seg; //窗口 A,B 在内存中的段址
char * page_entry; //换页调用入口
unsigned int bytes_per_line; //每条水平扫描线所占的字节数
unsigned int hor_res; //水平方向的分辨率
unsigned int ver_res; //垂直方向的分辨率
unsigned char char_x, char_y;
unsigned char planes_number; //颜色平面个数
unsigned char bit_per_pixel; //每像素的位数
unsigned char pages_number; //页面数
unsigned char memory_mode;
unsigned char page_size; //页面尺寸
unsigned char image_pages_number;
ywVesaModeInfo(void);
~ywVesaModeInfo(void);
};

--
※ 来源:．锦城驿站 bbs.swjtu.edu.cn．[FROM: 202.115.65.101]


发信人: wql.bbs@bbs.swjtu.edu.cn (晖), 信区: C
标 题: 用C++建立图形图像类(二)
发信站: 锦城驿站 (Mon Jul 7 03:06:20 1997)
转信站: sjtubbs!sjtunews!swjtunews!swjtubbs
Origin: xnjd21.swjtu.edu.cn

class ywGraph
{
private:
char error_code;
char graph_mode;
unsigned int vram_size; //显存大小, 单位为 KB
unsigned hor_res; //水平方向分辨率
unsigned ver_res; //垂直方向分辨率
char old_mode, old_page; //原显示模式号及页面号
struct ywVesaInfo * vesa_info; // VESA, SVGA 信息块数据
struct ywVesaModeInfo * vesa_mode_info; // VESA 特定模式信息块数据
unsigned int current_page;
unsigned long * lines;
struct REGPACK regs;

public:
Boolean init_success;
ywGraph(unsigned int mode = VESA_640_480 );
~ywGraph(void);
void SetPage( unsigned int seg_num );
Boolean InitGraph( unsigned int mode );
int GetPixel(int x, int y);
void PutPixel(int x, int y, unsigned char color,char mode=COPY_PUT);
void Line(int x1, int y1, int x2, int y2,unsigned char color,char mode =COPY_PUT);
void VirtualLine(int x1, int y1, int x2, int y2,unsigned char color,char line_mask=0xff,char mode =COPY_PUT);
void Rectangle(int left, int top, int right, int bottom,unsigned char color,char mode =COPY_PUT);
void Bar(int left, int top, int right, int bottom, unsigned char color);
void Bar(int left, int top, int right, int bottom, unsigned char color,char mode);
unsigned int ImageSize(unsigned int left,unsigned int top,unsigned int right,unsigned int bottom);
void GetImage(int left, int top, int right, int bottom, char * buffer);
void PutImage(int left, int top, char * buffer);
void CloseGraph(void);
};

--
※ 来源:．锦城驿站 bbs.swjtu.edu.cn．[FROM: 202.115.65.101]


发信人: wql.bbs@bbs.swjtu.edu.cn (晖), 信区: C
标 题: 用C++建立图形图像类(三)
发信站: 锦城驿站 (Mon Jul 7 03:08:14 1997)
转信站: sjtubbs!sjtunews!swjtunews!swjtubbs
Origin: xnjd21.swjtu.edu.cn
ywVesaInfo::ywVesaInfo(void)
{
vesa_flag = new char[5];
vesa_ver = new char[3];
}

ywVesaInfo::~ywVesaInfo(void)
{
if( vesa_flag ) delete vesa_flag;
if( vesa_ver ) delete vesa_ver;
}

ywVesaModeInfo::ywVesaModeInfo(void)
{
}

ywVesaModeInfo::~ywVesaModeInfo(void)
{
}

ywGraph::ywGraph( unsigned int mode )
{
if( mode != BC_640_480_16 )
{
vesa_info = new struct ywVesaInfo;
vesa_mode_info = new struct ywVesaModeInfo;
if( vesa_info==NULL || vesa_mode_info==NULL )
{
init_success = FALSE;
error_code = NOENOUGHMEMORY;
return;
}
Boolean init_mode = InitGraph( mode );
if( init_mode || ( (!init_mode)&&InitGraph( VESA_640_480 ) ) )
{
unsigned tmp = vesa_mode_info->ver_res;
lines = new unsigned long[tmp];
if( lines == NULL ) //初始化写点
{
init_success = FALSE;
error_code = NOENOUGHMEMORY;
return;
}
for( int i=0; i<vesa_mode_info->ver_res; i++ )
lines[i] = vesa_mode_info->hor_res * (long)i;
init_success = SUCCESS;
current_page = 0;
graph_mode = EXTERN_MODE;
return;
}
}

int gdriver = VGA, gmode=VGAHI;
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver, &gmode, "");
if( graphresult() )
{
init_success = FALSE;
return;
}
init_success = SUCCESS;
graph_mode = BASE_MODE;
return;
}

ywGraph::~ywGraph(void)
{
CloseGraph();
if( graph_mode == EXTERN_MODE )
{
if(vesa_info) delete vesa_info;
if(vesa_mode_info) delete vesa_mode_info;
if(lines) delete lines;
}
}

--
※ 来源:．锦城驿站 bbs.swjtu.edu.cn．[FROM: 202.115.65.101]


发信人: daihao.bbs@210.34.48.50 (不死鸟), 信区: C
标 题: c源代码(一)attrib.c
发信站: FZU_BBS (Wed Feb 25 20:38:17 1998)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn

/*
* attrib - Change file attributes
*
* Copyright (C) 1994 Troy Rollo <troy@cbme.unsw.EDU.AU>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdlib.h>
#include <io.h>
#include <dir.h>
#include <dos.h>

static char *
expand_wildcards(char *s)
{
static struct find_t info;
char wildcard[80];
static char directory[256];
static char filename[256];
unsigned attrib;
char *c1, *c2;

if (s)
{
strcpy(wildcard, s);
strcpy(directory, wildcard);
if ((c1 = strrchr(directory, '/')) != 0 ||
(c2 = strrchr(directory, '\\')) != 0)
{
if (c1 > c2)
c1[1] = '\0';
else
c2[1] = '\0';
}
else
directory[0] = '\0';
if (! strchr(wildcard, '.'))
strcat(wildcard, "*.*");
attrib = _A_HIDDEN | _A_HIDDEN | _A_ARCH | _A_NORMAL | _A_SUBDIR | _A_RDONLY;
if (_dos_findfirst(wildcard, attrib, &info) != 0)
return NULL;
while (!strcmp(info.name, ".") || !strcmp(info.name, ".."))
if (_dos_findnext(&info))
return NULL;
}
else
{
if (_dos_findnext(&info) != 0)
return NULL;
}
strcpy(filename, directory);
strcat(filename, info.name);
return filename;
}

int
main( int argc,
char **argv)
{
char *pchFile;
int on = 0;
int off = 0;
int turn_on;
unsigned value;

while (--argc)
{
argv++;
if (**argv == '-' ||
**argv == '+')
{
while (**argv)
{
switch(**argv)
{
case '+':
turn_on = 1;
value = 0;
break;

case '-':
turn_on = 0;
value = 0;
break;

case 'r':
case 'R':
value = _A_RDONLY;
break;

case 'a':
case 'A':
value = _A_ARCH;
break;

case 's':
case 'S':
value = _A_SYSTEM;
break;

case 'h':
case 'H':
value = _A_HIDDEN;
break;

default:
fprintf(stderr, "Usage: attrib [{+-}{ahrs}] file ...\n");
return 1;
}
if (turn_on)
{
on |= value;
off &= ~value;
}
else
{
off |= value;
on &= ~value;
}
++*argv;
}
}
else
{
for (pchFile = expand_wildcards(*argv);
pchFile;
pchFile = expand_wildcards(0))
{
if (_dos_getfileattr(pchFile, &value))
{
fprintf(stderr, "%s: %s\n", pchFile, sys_errlist[errno]);
return 1;
}
value &= ~off;
value |= on;
if (_dos_setfileattr(pchFile, value))
{
fprintf(stderr, "%s: %s\n", pchFile, sys_errlist[errno]);
return 1;
}
}
}
}
return 0;
}

--
※ 来源:．庭芳苑 bbs.fzu.edu.cn．[FROM: 210.34.49.170]


发信人: daihao.bbs@210.34.48.50 (不死鸟), 信区: C
标 题: c源代码(二)--deltree.c
发信站: FZU_BBS (Wed Feb 25 20:42:18 1998)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
/*
* deltree - Delete a directory tree
*
* Copyright (C) 1994 Troy Rollo <troy@cbme.unsw.EDU.AU>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdlib.h>
#include <io.h>
#include <dir.h>
#include <dos.h>

extern int _rtl_chmod(const char *pchPath, int mode, ...);

static char *
expand_wildcards(char *s)
{
static struct find_t info;
char wildcard[80];
static char directory[256];
static char filename[256];
unsigned attrib;
char *c1, *c2;

if (s)
{
strcpy(wildcard, s);
strcpy(directory, wildcard);
if ((c1 = strrchr(directory, '/')) != 0 ||
(c2 = strrchr(directory, '\\')) != 0)
{
if (c1 > c2)
c1[1] = '\0';
else
c2[1] = '\0';
}
else
directory[0] = '\0';
if (! strchr(wildcard, '.'))
strcat(wildcard, "*.*");
attrib = _A_NORMAL | _A_SUBDIR | _A_RDONLY;
if (_dos_findfirst(wildcard, attrib, &info) != 0)
return NULL;
while (!strcmp(info.name, ".") || !strcmp(info.name, ".."))
if (_dos_findnext(&info))
return NULL;
}
else
{
if (_dos_findnext(&info) != 0)
return NULL;
}
strcpy(filename, directory);
strcat(filename, info.name);
return filename;
}

FILE *fpOut;

void
deltree(char *pchFile,
int yes)
{
struct find_t info;
char wildcard[256];
char filename[256];
char achLine[256];
int result;
struct stat sbuf;

if (*pchFile == '.')
{
fprintf(stderr, "Cannot remove %s\n", pchFile);
exit(1);
}
if (stat(pchFile, &sbuf) == -1)
{
fprintf(stderr, "%s: %s\n", pchFile, sys_errlist[errno]);
exit(1);
}
if (!(sbuf.st_mode & S_IFDIR))
{
fprintf(stderr, "%s: Not a directory\n", pchFile);
exit(1);
}
if (!yes && fpOut)
{
fprintf(fpOut, "Delete %s and all its subdirectories? (y/N) ", pchFile);
gets(achLine);
if (*achLine != 'Y' && *achLine != 'y')
return;
}
strcpy(wildcard, pchFile);
strcat(wildcard, "\\*.*");
for (result = _dos_findfirst(wildcard,
_A_NORMAL |
_A_RDONLY |
_A_HIDDEN |
_A_SYSTEM |
_A_SUBDIR |
_A_ARCH,
&info);
result == 0;
result = _dos_findnext(&info))
{
if (*info.name == '.')
continue;
strcpy(filename, pchFile);
strcat(filename, "\\");
strcat(filename, info.name);
if (info.attrib & _A_SUBDIR)
{
deltree(filename, 1);
}
else
{
if (_rtl_chmod(filename, 1, 0) == -1 ||
unlink(filename) == -1)
{
fprintf(stderr, "%s: %s\n",
filename,
sys_errlist[errno]);
exit(1);
}
}
}
if (_rtl_chmod(pchFile, 1, 0) == -1 ||
rmdir(pchFile) == -1)
{
fprintf(stderr, "%s: %s\n",
pchFile,
sys_errlist[errno]);
exit(1);
}
}

int
main( int argc,
char **argv)
{
int yes = 0;
char *pchFile;

if (!isatty(0) ||
(!isatty(1) &&
!isatty(2)))
yes = 1;

if (isatty(1))
fpOut = stdout;
else if (isatty(2))
fpOut = stderr;
else
fpOut = 0;

while (--argc)
{
argv++;
if (**argv == '/' ||
**argv == '-')
{
while (*++*argv)
{
switch(**argv)
{
case 'y':
case 'Y':
yes = 1;
break;

case 'i':
case 'I':
yes = 0;
break;

default:
fprintf(stderr, "Usage: deltree [-{yi}] directory ...\n");
return 1;
}
}
}
else
{
for (pchFile = expand_wildcards(*argv);
pchFile;
pchFile = expand_wildcards(0))
{
deltree(pchFile, yes);
}
}
}
return 0;
}

--
※ 来源:．庭芳苑 bbs.fzu.edu.cn．[FROM: 210.34.49.170]


发信人: mudfish (mudfish), 信区: C
标 题: SMTP/POP3 Delphi范例
发信站: 饮水思源站 (Sat Feb 14 10:08:15 1998) , 站内信件
呵呵，巨大的程序。可是有关Simpmail的Form文件不是文本的，没法贴给你。不过
应该也够了。C++ Builder居然使用的是Delphi 2.0的VCL，让人不可忍受。恐怕程序你
在C++ Builder下是无法编译的，好象只有Delphi 3.0才有Internet控件。
程序中SMTP控件的名字是Smtp1，POP3控件的名字是POP1，其它的Label、EditBox
基本都是输入收件人地址什么的，应该能看懂。你要是在C++ Builder下能搞定这个程序
的话请告诉我一声，我其实正烦着Delphi的Object Pascal语言呢，巴不得有C语言的编译
器可以取而代之。

unit Main;

interface

uses Windows, SysUtils, Classes, Graphics, Forms, Controls, Menus,
StdCtrls, Dialogs, Buttons, Messages, ExtCtrls, ComCtrls, OleCtrls,
ISP3;

type

TMainForm = class(TForm)
OpenDialog: TOpenDialog;
SMTP1: TSMTP;
POP1: TPOP;
PageControl1: TPageControl;
SendPage: TTabSheet;
RecvPage: TTabSheet;
ConPage: TTabSheet;
Panel1: TPanel;
Label1: TLabel;
Label3: TLabel;
Label2: TLabel;
eTo: TEdit;
eCC: TEdit;
eSubject: TEdit;
SendBtn: TButton;
ClearBtn: TButton;
reMessageText: TRichEdit;
SMTPStatus: TStatusBar;
Panel3: TPanel;
mReadMessage: TMemo;
POPStatus: TStatusBar;
cbSendFile: TCheckBox;
GroupBox1: TGroupBox;
ePOPServer: TEdit;
Label6: TLabel;
Label5: TLabel;
eUserName: TEdit;
ePassword: TEdit;
Label4: TLabel;
GroupBox2: TGroupBox;
Label7: TLabel;
eSMTPServer: TEdit;
SMTPConnectBtn: TButton;
POPConnectBtn: TButton;
eHomeAddr: TEdit;
Label8: TLabel;
Panel2: TPanel;
Label9: TLabel;
lMessageCount: TLabel;
Label10: TLabel;
eCurMessage: TEdit;
udCurMessage: TUpDown;
ConnectStatus: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure POP1StateChanged(Sender: TObject; State: Smallint);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure SMTP1StateChanged(Sender: TObject; State: Smallint);
procedure FormResize(Sender: TObject);
procedure ClearBtnClick(Sender: TObject);
procedure SMTP1Verify(Sender: TObject);
procedure SendBtnClick(Sender: TObject);
procedure POP1ProtocolStateChanged(Sender: TObject;
ProtocolState: Smallint);
procedure SMTPConnectBtnClick(Sender: TObject);
procedure POPConnectBtnClick(Sender: TObject);
procedure eSMTPServerChange(Sender: TObject);
procedure ePOPServerChange(Sender: TObject);
procedure cbSendFileClick(Sender: TObject);
procedure udCurMessageClick(Sender: TObject; Button: TUDBtnType);
procedure POP1RefreshMessageCount(Sender: TObject; Number: Integer);
procedure POP1DocOutput(Sender: TObject; const DocOutput: DocOutput);
procedure POP1Error(Sender: TObject; Number: Smallint;
var Description: WideString; Scode: Integer; const Source,
HelpFile: WideString; HelpContext: Integer;
var CancelDisplay: WordBool);
procedure SMTP1DocInput(Sender: TObject; const DocInput: DocInput);
procedure SMTP1Error(Sender: TObject; Number: Smallint;
var Description: WideString; Scode: Integer; const Source,
HelpFile: WideString; HelpContext: Integer;
var CancelDisplay: WordBool);
procedure eToChange(Sender: TObject);
private
RecvVerified,
SMTPError,
POPError: Boolean;
FMessageCount: Integer;
procedure SendFile(Filename: string);
procedure SendMessage;
procedure CreateHeaders;
end;

var
MainForm: TMainForm;

implementation

{$R *.DFM}

const
icDocBegin = 1;
icDocHeaders = 2;
icDocData = 3;
icDocEnd = 5;

{When calling a component method which maps onto an OLE call, NoParam substitutes
for an optional parameter. As an alternative to calling the component method, you
may access the component's OLEObject directly -
i.e., Component.OLEObject.MethodName(,Foo,,Bar)}
function NoParam: Variant;
begin
TVarData(Result).VType := varError;
TVarData(Result).VError := DISP_E_PARAMNOTFOUND;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
SMTPError := False;
POPError := False;
FMessageCount := 0;
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if POP1.State = prcConnected then POP1.Quit;
if SMTP1.State = prcConnected then SMTP1.Quit;
end;

procedure TMainForm.FormResize(Sender: TObject);
begin
SendBtn.Left := ClientWidth - SendBtn.Width - 10;
ClearBtn.Left := ClientWidth - ClearBtn.Width - 10;
cbSendFile.Left := ClientWidth - cbSendFile.Width - 10;
eTo.Width := SendBtn.Left - eTo.Left - 10;
eCC.Width := SendBtn.Left - eCC.Left - 10;
eSubject.Width := SendBtn.Left - eSubject.Left - 10;
end;

procedure TMainForm.ClearBtnClick(Sender: TObject);
begin
eTo.Text := '';
eCC.Text := '';
eSubject.Text := '';
OpenDialog.Filename := '';
reMessageText.Lines.Clear;
end;

procedure TMainForm.eSMTPServerChange(Sender: TObject);
begin
SMTPConnectBtn.Enabled := (eSMTPServer.Text <> '') and (eHomeAddr.Text <> '');
end;

procedure TMainForm.ePOPServerChange(Sender: TObject);
begin
POPConnectBtn.Enabled := (ePOPServer.Text <> '') and (eUsername.Text <> '')
and (ePassword.Text <> '');
end;

procedure TMainForm.cbSendFileClick(Sender: TObject);
begin
if cbSendFile.Checked then
begin
if OpenDialog.Execute then
cbSendFile.Caption := cbSendFile.Caption + ': '+OpenDialog.Filename
else
cbSendFile.Checked := False;
end else
cbSendFile.Caption := '&Attach Text File';
end;

{Clear and repopulate MIME headers, using the component's DocInput property. A
separate DocInput OLE object could also be used. See RFC1521/1522 for complete
information on MIME types.}
procedure TMainForm.CreateHeaders;
begin
with SMTP1 do
begin
DocInput.Headers.Clear;
DocInput.Headers.Add('To', eTo.Text);
DocInput.Headers.Add('From', eHomeAddr.Text);
DocInput.Headers.Add('CC', eCC.Text);
DocInput.Headers.Add('Subject', eSubject.Text);
DocInput.Headers.Add('Message-Id', Format('%s_%s_%s', [Application.Title,
DateTimeToStr(Now), eHomeAddr.Text]));
DocInput.Headers.Add('Content-Type', 'TEXT/PLAIN charset=US-ASCII');
end;
end;

{Send a simple mail message}
procedure TMainForm.SendMessage;
begin
CreateHeaders;
with SMTP1 do
SendDoc(NoParam, DocInput.Headers, reMessageText.Text, '', '');
end;

{Send a disk file. Leave SendDoc's InputData parameter blank and
specify a filename for InputFile to send the contents of a disk file. You can
use the DocInput event and GetData methods to do custom encoding (Base64, UUEncode, etc.) }
procedure TMainForm.SendFile(Filename: string);
begin
CreateHeaders;
with SMTP1 do
begin
DocInput.Filename := FileName;
SendDoc(NoParam, DocInput.Headers, NoParam, DocInput.FileName, '');
end;
end;

{Set global flag indicating recipients are addressable (this only ensures that the
address is in the correct format, not that it exists and is deliverable), then
send the text part of the message}
procedure TMainForm.SMTP1Verify(Sender: TObject);
begin
SendMessage;
RecvVerified := True;
end;

{Verify addressees, send text message in the Verify event, and if an attachment is
specified, send it}
procedure TMainForm.SendBtnClick(Sender: TObject);
var
Addressees: string;
begin
if SMTP1.State = prcConnected then
begin
RecvVerified := False;
SMTPError := False;
Addressees := eTo.Text;

if eCC.Text <> '' then
Addressees := Addressees + ', '+ eCC.Text;
SMTP1.Verify(Addressees);

{wait for completion of Verify-Text message send}
while SMTP1.Busy do
Application.ProcessMessages;

{Check global flag indicating addresses are in the correct format - if true,
the text part of the message has been sent}
if not RecvVerified then
begin
MessageDlg('Incorrect address format', mtError, [mbOK], 0);
Exit;
end
else
if cbSendFile.Checked then
SendFile(OpenDialog.Filename);
end
else
MessageDlg('Not connected to SMTP server', mtError, [mbOK], 0);
end;

{SMTP component will call this event every time its connection state changes}
procedure TMainForm.SMTP1StateChanged(Sender: TObject; State: Smallint);
begin
case State of
prcConnecting:
ConnectStatus.SimpleText := 'Connecting to SMTP server: '+SMTP1.RemoteHost+'...';
prcResolvingHost:
ConnectStatus.SimpleText := 'Resolving Host';
prcHostResolved:
ConnectStatus.SimpleText := 'Host Resolved';
prcConnected:
begin
ConnectStatus.SimpleText := 'Connected to SMTP server: '+SMTP1.RemoteHost;
SMTPConnectBtn.Caption := 'Disconnect';
end;
prcDisconnecting:
ConnectStatus.SimpleText := 'Disconnecting from SMTP server: '+SMTP1.RemoteHost+'...';
prcDisconnected:
begin
ConnectStatus.SimpleText := 'Disconnected from SMTP server: '+SMTP1.RemoteHost;
SMTPConnectBtn.Caption := 'Connect';
end;
end;
eSMTPServer.Enabled := not (State = prcConnected);
eHomeAddr.Enabled := not (State = prcConnected);
end;

{The DocInput event is called each time the DocInput state changes during a mail transfer.
DocInput holds all the information about the current transfer, including the headers, the
number of bytes transferred, and the message data itself. Although not shown in this example,
you may call DocInput's SetData method if DocInput.State = icDocData to encode the data before
each block is sent.}
procedure TMainForm.SMTP1DocInput(Sender: TObject;
const DocInput: DocInput);
begin
case DocInput.State of
icDocBegin:
SMTPStatus.SimpleText := 'Initiating document transfer';
icDocHeaders:
SMTPStatus.SimpleText := 'Sending headers';
icDocData:
if DocInput.BytesTotal > 0 then
SMTPStatus.SimpleText := Format('Sending data: %d of %d bytes (%d%%)',
[Trunc(DocInput.BytesTransferred), Trunc(DocInput.BytesTotal),
Trunc(DocInput.BytesTransferred/DocInput.BytesTotal*100)])
else
SMTPStatus.SimpleText := 'Sending...';
icDocEnd:
if SMTPError then
SMTPStatus.SimpleText := 'Transfer aborted'
else
SMTPStatus.SimpleText := Format('Mail sent to %s (%d bytes data)', [eTo.Text,
Trunc(DocInput.BytesTransferred)]);
end;
SMTPStatus.Update;
end;

{The Error event is called whenever an error occurs in the background processing. In
addition to providing an error code and brief description, you can also access the SMTP
component's Errors property (of type icErrors, an OLE object) to get more detailed
information}
procedure TMainForm.SMTP1Error(Sender: TObject; Number: Smallint;
var Description: WideString; Scode: Integer; const Source,
HelpFile: WideString; HelpContext: Integer; var CancelDisplay: WordBool);
var
I: Integer;
ErrorStr: string;
begin
SMTPError := True;
CancelDisplay := True;
{Get extended error information}
for I := 1 to SMTP1.Errors.Count do
ErrorStr := Format(#13'(%s)', [SMTP1.Errors.Item(I).Description]);
{Display error code, short and long error description}
MessageDlg(Format('%d - %s%s', [Number, Description, Trim(ErrorStr)]), mtError, [mbOK], 0);
end;

{Unlike POP, SMTP does not require a user account on the host machine, so no user
authorization is necessary}
procedure TMainForm.SMTPConnectBtnClick(Sender: TObject);
begin
if SMTP1.State = prcConnected then
SMTP1.Quit
else
if SMTP1.State = prcDisconnected then
begin
SMTP1.RemoteHost := eSMTPServer.Text;
SMTPError := False;
SMTP1.Connect(NoParam, NoParam);
end;
end;

{Unlike SMTP, users must be authorized on the POP server. The component defines
a special protocol state, popAuthorization, when it requests authorization. If
authorization is successful, the protocol state changes to popTransaction and
POP commands can be issued. Note that server connection is independent of the
authorization state.}
procedure TMainForm.POP1ProtocolStateChanged(Sender: TObject;
ProtocolState: Smallint);
begin
case ProtocolState of
popAuthorization:
POP1.Authenticate(POP1.UserID, POP1.Password);
popTransaction:
ConnectStatus.SimpleText := Format('User %s authorized on server %s', [eUsername.Text,
ePOPServer.Text]);
end;
end;

{This event is called every time the connection status of the POP server changes}
procedure TMainForm.POP1StateChanged(Sender: TObject; State: Smallint);
begin
case State of
prcConnecting:
ConnectStatus.SimpleText := 'Connecting to POP server: '+POP1.RemoteHost+'...';
prcResolvingHost:
ConnectStatus.SimpleText := 'Resolving Host';
prcHostResolved:
ConnectStatus.SimpleText := 'Host Resolved';
prcConnected:
begin
ConnectStatus.SimpleText := 'Connected to POP server: '+POP1.RemoteHost;
POPConnectBtn.Caption := 'Disconnect';
end;
prcDisconnecting:
ConnectStatus.SimpleText := 'Disconnecting from POP server: '+POP1.RemoteHost+'...';
prcDisconnected:
begin
ConnectStatus.SimpleText := 'Disconnected from POP server: '+POP1.RemoteHost;
POPConnectBtn.Caption := 'Connect';
end;
end;
ePOPServer.Enabled := not (State = prcConnected);
eUsername.Enabled := not (State = prcConnected);
ePassword.Enabled := not (State = prcConnected);
end;

{The Error event is called whenever an error occurs in the background processing. In
addition to providing an error code and brief description, you can also access the POP
component's Errors property (of type icErrors, an OLE object) to get more detailed
information}
procedure TMainForm.POP1Error(Sender: TObject; Number: Smallint;
var Description: WideString; Scode: Integer; const Source,
HelpFile: WideString; HelpContext: Integer; var CancelDisplay: WordBool);
var
I: Integer;
ErrorStr: string;
begin
POPError := True;
CancelDisplay := True;
if POP1.ProtocolState = popAuthorization then
ConnectStatus.SimpleText := 'Authorization error';
{Get extended error information}
for I := 1 to POP1.Errors.Count do
ErrorStr := Format(#13'(%s)', [POP1.Errors.Item(I).Description]);
{Display error code, short and long error description}
MessageDlg(Format('%d - %s%s', [Number, Description, Trim(ErrorStr)]), mtError, [mbOK], 0);
end;

{POP requires a valid user account on the host machine}
procedure TMainForm.POPConnectBtnClick(Sender: TObject);
begin
if (POP1.State = prcConnected) and (POP1.ProtocolState = popTransaction)
and not POP1.Busy then
begin
mReadMessage.Lines.Clear;
POP1.Quit;
end
else
if POP1.State = prcDisconnected then
begin
POP1.RemoteHost := ePOPServer.Text;
POP1.UserID := eUserName.Text;
POP1.Password := ePassword.Text;
POP1.Connect(NoParam, NoParam);
end;
end;

{The DocOutput event is the just like the DocInput event in 'reverse'. It is called each time
the component's DocOutput state changes during retrieval of mail from the server. When the
state = icDocData, you can call DocOutput.GetData to decode each data block based on the MIME
content type specified in the headers.}
procedure TMainForm.POP1DocOutput(Sender: TObject; const DocOutput: DocOutput);
var
Buffer: WideString;
I: Integer;
begin
case DocOutput.State of
icDocBegin:
POPStatus.SimpleText := 'Initiating document transfer';
icDocHeaders:
begin
POPStatus.SimpleText := 'Retrieving headers';
for I := 1 to DocOutput.Headers.Count do
mReadMessage.Lines.Add(DocOutput.Headers.Item(I).Name+': '+
DocOutput.Headers.Item(I).Value);
end;
icDocData:
begin
POPStatus.SimpleText := Format('Retrieving data - %d bytes',
[Trunc(DocOutput.BytesTransferred)]);
Buffer := DocOutput.DataString;
mReadMessage.Text := mReadMessage.Text + Buffer;
end;
icDocEnd:
if POPError then
POPStatus.SimpleText := 'Transfer aborted'
else
POPStatus.SimpleText := Format('Retrieval complete (%d bytes data)',
[Trunc(DocOutput.BytesTransferred)]);
end;
POPStatus.Update;
end;

{Retrieve message from the server}
procedure TMainForm.udCurMessageClick(Sender: TObject; Button: TUDBtnType);
begin
if (POP1.State = prcConnected) and (POP1.ProtocolState = popTransaction) then
begin
POPError := False;
mReadMessage.Lines.Clear;
POP1.RetrieveMessage(udCurMessage.Position);
end;
end;

{The RefreshMessageCount event is called whenever the RefreshMessageCount method is
called, and also when a connection to the POP server is first made}
procedure TMainForm.POP1RefreshMessageCount(Sender: TObject;
Number: Integer);
begin
FMessageCount := Number;
udCurMessage.Max := Number;
udCurMessage.Enabled := Number <> 0;
lMessageCount.Caption := IntToStr(Number);
if Number > 0 then
begin
udCurMessage.Min := 1;
udCurMessage.Position := 1;
POP1.RetrieveMessage(udCurMessage.Position);
end;
end;

procedure TMainForm.eToChange(Sender: TObject);
begin

end;

end.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: bbs.njupt.edu.c]


发信人: que.bbs@210.34.48.50 (无语), 信区: C
标 题: c程序共享
发信站: FZU_BBS (Fri Dec 12 20:09:07 1997)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
/************************************************/
/* */
/* SuperVGA utility routines */
/* Copyright (c) 1991 */
/* Jordan Hargraphix Software */
/* */
/************************************************/

#include <dos.h>
#include <graphics.h>
#include "svgautil.h"
#include "svga16.h"
#include "svga256.h"
#include "svga32k.h"
#include "svga64k.h"
#include "svgatc.h"
#include "svgas3.h"
#include "twk16.h"
#include "twk256.h"

/************************************************************************/
/* */
/* Enhanced color setting functions */
/* */
/* These functions are used to set the colors for the 32k/64k/TrueColor */
/* modes, as the BGI kernel can only handle 8-bit color values. */
/* */
/************************************************************************/

/********************************************************/
/* long RGB(char rVal, char gVal, char bVal); */
/* */
/* Purpose: Returns the color value for a R,G,B triple */
/* based on the current graphics mode. */
/* */
/* Input: */
/* char rVal - Red value [0..255] */
/* char gVal - Green value [0..255] */
/* char bVal - Blue value [0..255] */
/* */
/* Returns: */
/* long - Color value for this mode. */
/* */
/********************************************************/
long RGB(char rVal, char gVal, char bVal)
{
__rColor xColor;

switch(getmaxcolor()) {
case 32767:
xColor.c15.rVal = (rVal >> 3) & 0x1F;
xColor.c15.gVal = (gVal >> 3) & 0x1F;
xColor.c15.bVal = (bVal >> 3) & 0x1F;
break;
case 65535:
xColor.c16.rVal = (rVal >> 3) & 0x1F;
xColor.c16.gVal = (gVal >> 2) & 0x1F;
xColor.c16.bVal = (bVal >> 3) & 0x1F;
break;
case 16777:
xColor.c24.rVal = rVal;
xColor.c24.gVal = gVal;
xColor.c24.bVal = bVal;
break;
}
return (xColor.cval);
}

/****************************************************************/
/* long RealDrawColor(long color); */
/* */
/* Purpose: Sets the current drawing color for HC/TC modes. */
/* Used for 'setcolor' */
/* */
/* Input: */
/* long color - Color value */
/* */
/* Returns: */
/* long - Color value */
/* */
/****************************************************************/
long RealDrawColor(long color)
{
__rColor xColor;

xColor.cval = color;
/* Do color set hacks for hicolor/truecolor modes */
switch(getmaxcolor()) {
case 32767:
setrgbpalette(1024,xColor.c15.rVal,xColor.c15.gVal,xColor.c15.bVal);
break;
case 65535:
setrgbpalette(1024,xColor.c16.rVal,xColor.c16.gVal,xColor.c16.bVal);
break;
case 16777:
setrgbpalette(1024,xColor.c24.rVal,xColor.c24.gVal,xColor.c24.bVal);
break;
};
return color;
}

/****************************************************************/
/* long RealFillColor(long color); */
/* */
/* Purpose: Sets the current fill color for HC/TC modes. */
/* Used for 'setfillstyle' and 'setfillpattern' */
/* */
/* Input: */
/* long color - Color value */
/* */
/* Returns: */
/* long - Color value */
/* */
/****************************************************************/
long RealFillColor(long color)
{
__rColor xColor;

xColor.cval = color;
/* Do color set hacks for hicolor/truecolor modes */
switch(getmaxcolor()) {
case 32767:
setrgbpalette(1025,xColor.c15.rVal,xColor.c15.gVal,xColor.c15.bVal);
break;
case 65535:
setrgbpalette(1025,xColor.c16.rVal,xColor.c16.gVal,xColor.c16.bVal);
break;
case 16777:
setrgbpalette(1025,xColor.c24.rVal,xColor.c24.gVal,xColor.c24.bVal);
break;
};
return color;
}

/****************************************************************/
/* long RealColor(long color); */
/* */
/* Purpose: Sets the current color for HC/TC modes. */
/* Used for 'putpixel' and 'floodfill' */
/* */
/* Input: */
/* long color - Color value */
/* */
/* Returns: */
/* long - Color value */
/* */
/****************************************************************/
long RealColor(long color)
{
__rColor xColor;

xColor.cval = color;
/* Do color set hacks for hicolor/truecolor modes */
switch(getmaxcolor()) {
case 32767:
setrgbpalette(1026,xColor.c15.rVal,xColor.c15.gVal,xColor.c15.bVal);
break;
case 65535:
setrgbpalette(1026,xColor.c16.rVal,xColor.c16.gVal,xColor.c16.bVal);
break;
case 16777:
setrgbpalette(1026,xColor.c24.rVal,xColor.c24.gVal,xColor.c24.bVal);
break;
};
return color;
}

/* Getvgapalette16 gets the entire 16 color palette */
/* PalBuf contains RGB values for all 16 colors */
/* R,G,B values range from 0 to 63 */
/* Usage: */
/* DacPalette16 dac16; */
/* */
/* getvgapalette(&dac16); */
void getvgapalette16(DacPalette16 *PalBuf)
{
struct REGPACK reg;

reg.r_ax = 0x1017;
reg.r_bx = 0;
reg.r_cx = 16;
reg.r_es = FP_SEG(PalBuf);
reg.r_dx = FP_OFF(PalBuf);
intr(0x10,&reg);
}

/* Getvgapalette256 gets the entire 256 color palette */
/* PalBuf contains RGB values for all 256 colors */
/* R,G,B values range from 0 to 63 */
/* Usage: */
/* DacPalette256 dac256; */
/* */
/* getvgapalette256(&dac256); */
void getvgapalette256(DacPalette256 *PalBuf)
{
struct REGPACK reg;

reg.r_ax = 0x1017;
reg.r_bx = 0;
reg.r_cx = 256;
reg.r_es = FP_SEG(PalBuf);
reg.r_dx = FP_OFF(PalBuf);
intr(0x10,&reg);
}

/* Setvgapalette16 sets the entire 16 color palette */
/* PalBuf contains RGB values for all 16 colors */
/* R,G,B values range from 0 to 63 */
/* Usage: */
/* DacPalette16 dac16; */
/* */
/* setvgapalette(&dac16); */
void setvgapalette16(DacPalette16 *PalBuf)
{
struct REGPACK reg;

reg.r_ax = 0x1012;
reg.r_bx = 0;
reg.r_cx = 16;
reg.r_es = FP_SEG(PalBuf);
reg.r_dx = FP_OFF(PalBuf);
intr(0x10,&reg);
}

/* Setvgapalette256 sets the entire 256 color palette */
/* PalBuf contains RGB values for all 256 colors */
/* R,G,B values range from 0 to 63 */
/* Usage: */
/* DacPalette256 dac256; */
/* */
/* setvgapalette256(&dac256); */
void setvgapalette256(DacPalette256 *PalBuf)
{
struct REGPACK reg;

reg.r_ax = 0x1012;
reg.r_bx = 0;
reg.r_cx = 256;
reg.r_es = FP_SEG(PalBuf);
reg.r_dx = FP_OFF(PalBuf);
intr(0x10,&reg);
}

--
※ 来源:．庭芳苑 bbs.fzu.edu.cn．[FROM: 210.34.87.10]


发信人: que.bbs@210.34.48.50 (无语), 信区: C
标 题: c程序共享(2)
发信站: FZU_BBS (Fri Dec 12 20:14:14 1997)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
/* Sample program that initializes the SuperVGA driver */

#include <stdio.h>
#include <conio.h>
#include <graphics.h>

#include "svgautil.h"
#include "svga16.h"
#include "twk16.h"
#include "twk256.h"
#include "svga256.h"
#include "svga32k.h"
#include "svga64k.h"
#include "svgatc.h"
#include "svgas3.h"

/* Returns the color for white */
long WhitePixel()
{
switch(getmaxcolor()) {
case 32768: return 0x7fffL;
case 65535: return 0xffffL;
case 16777: return 0xffffffL;
default : return 15;
};
}

int huge DetectVGA256()
{
int Vid;

printf("Which video mode would you like to use? \n");
printf(" 0) 320x200x256\n");
printf(" 1) 640x400x256\n");
printf(" 2) 640x480x256\n");
printf(" 3) 800x600x256\n");
printf(" 4) 1024x768x256\n");
printf(" 5) 640x480x256\n");
printf(" 6) 1280x1024x256\n");
printf("\n> ");
scanf("%d",&Vid);
return Vid;
}

int huge DetectS3()
{
int Vid;

printf("Which video mode would you like to use?\n");
printf(" 0) 640x480x256\n");
printf(" 1) 800x600x256\n");
printf(" 2) 1024x768x256\n");
printf(" 3) 800x600x16\n");
printf(" 4) 1024x768x16\n");
printf(" 5) 1280x960x16\n");
printf(" 6) 1280x1024x16\n");
printf(" 7) 640x480x32768\n");
printf("> ");
scanf("%d",&Vid);
return Vid;
}
int huge DetectVGA64k()
{
int Vid;

printf("Which video mode would you like to use? \n");
printf(" 0) 320x200x65536\n");
printf(" 1) 640x350x65536\n");
printf(" 2) 640x400x65536\n");
printf(" 3) 640x480x65536\n");
printf(" 4) 800x600x65536\n");
printf(" 5) 1024x768x65536\n");
printf(" 6) 1280x1024x65536\n");
printf("\n> ");
scanf("%d",&Vid);
return Vid;
}

int huge DetectVGA24bit()
{
int Vid;

printf("Which video mode would you like to use? \n");
printf(" 0) 320x200x24-bit\n");
printf(" 1) 640x350x24-bit\n");
printf(" 2) 640x400x24-bit\n");
printf(" 3) 640x480x24-bit\n");
printf(" 4) 800x600x24-bit\n");
printf(" 5) 1024x768x24-bit\n");
printf(" 6) 1280x1024x24-bit\n");
printf("\n> ");
scanf("%d",&Vid);
return Vid;
}

int huge DetectVGA32k()
{
int Vid;

printf("Which video mode would you like to use? \n");
printf(" 0) 320x200x32768\n");
printf(" 1) 640x350x32768\n");
printf(" 2) 640x400x32768\n");
printf(" 3) 640x480x32768\n");
printf(" 4) 800x600x32768\n");
printf(" 5) 1024x768x32768\n");
printf(" 6) 1280x1024x32768\n");
printf("\n> ");
scanf("%d",&Vid);
return Vid;
}

int huge DetectVGA16()
{
int Vid;

printf("Which video mode would you like to use? \n");
printf(" 0) 320x200x16\n");
printf(" 1) 640x200x16\n");
printf(" 2) 640x350x16\n");
printf(" 3) 640x480x256\n");
printf(" 4) 800x600x16\n");
printf(" 5) 1024x768x16\n");
printf(" 6) 1280x1024x16\n");
printf("\n> ");
scanf("%d",&Vid);
return Vid;
}

int huge DetectTwk16()
{
int Vid;

printf("Which video mode would you like to use? \n");
printf(" 0) 704x528x16\n");
printf(" 1) 720x540x16\n");
printf(" 2) 736x552x16\n");
printf(" 3) 752x564x16\n");
printf(" 4) 768x576x16\n");
printf(" 5) 784x588x16\n");
printf(" 6) 800x600x16\n");
printf("\n> ");
scanf("%d",&Vid);
return Vid;
};

int huge DetectTwk256()
{
int Vid;

printf("Which video mode would you like to use? \n");
printf(" 0) 320x400x256\n");
printf(" 1) 320x480x256\n");
printf(" 2) 360x480x256\n");
printf(" 3) 376x564x256\n");
printf(" 4) 400x564x256\n");
printf(" 5) 400x600x256\n");
printf(" 6) 320x240x256\n");
printf("\n> ");
scanf("%d",&Vid);
return Vid;
};

void main()
{
int Gd = DETECT, Gm;
int Drv;
char GrErr;

/* Find out which driver the user wants */
printf("Which driver would you like to use?\n");
printf(" 0) Svga16\n");
printf(" 1) Svga256\n");
printf(" 2) Svga32k\n");
printf(" 3) Svga64k\n");
printf(" 4) SvgaTC\n");
printf(" 5) SvgaS3\n");
printf(" 6) Tweak256\n");
printf(" 7) Tweak16\n");
printf("\n> ");
scanf("%d",&Drv);
switch(Drv)
{
case 0: installuserdriver("Svga16",DetectVGA16);
/* If driver is linked with file, remove comments */
/* registerfarbgidriver(Svga16_fdriver); */
break;

case 1: installuserdriver("Svga256",DetectVGA256);
/* If driver is linked with file, remove comments */
/* registerfarbgidriver(Svga256_fdriver); */
break;

case 2: installuserdriver("Svga32k",DetectVGA32k);
/* If driver is linked with file, remove comments */
/* registerfarbgidriver(Svga32k_fdriver); */
break;

case 3: installuserdriver("Svga64k",DetectVGA64k);
/* If driver is linked with file, remove comments */
/* registerfarbgidriver(Svga64k_fdriver); */
break;

case 4: installuserdriver("SvgaTC",DetectVGA24bit);
/* If driver is linked with file, remove comments */
/* registerfarbgidriver(SvgaTC_fdriver); */
break;

case 5: installuserdriver("SvgaS3",DetectVGAS3);
/* If driver is linked with file, remove comments */
/* registerfarbgidriver(SvgaS3_fdriver); */
break;

case 6: installuserdriver("Twk16",DetectTwk16);
/* If driver is linked with file, remove comments */
/* registerfarbgidriver(Twk16_fdriver); */
break;

case 7: installuserdriver("Twk256",DetectTwk256);
/* If driver is linked with file, remove comments */
/* registerfarbgidriver(Twk256_fdriver); */
break;
}
initgraph(&Gd,&Gm,"");

/* Test if mode was initialized successfully */
GrErr = graphresult();
if (GrErr != grOk) {
printf("Graphics error: %s\n",grapherrormsg(GrErr));
exit(1);
}

/* Draw an 'X' on the screen */
setcolor(RealDrawColor(WhitePixel()));
line(0,0,getmaxx(),getmaxy());
line(0,getmaxy(),getmaxx(),0);
getch();
closegraph();
}

--
※ 来源:．庭芳苑 bbs.fzu.edu.cn．[FROM: 210.34.87.10]


发信人: que.bbs@210.34.48.50 (无语), 信区: C
标 题: c程序分享(3)
发信站: FZU_BBS (Sat Dec 13 14:28:14 1997)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
#ifndef _STDDEF
#define _STDDEF
#ifndef _PTRDIFF_T
#define _PTRDIFF_T
#if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
typedef long ptrdiff_t;
#else
typedef int ptrdiff_t;
#endif
#endif
#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned size_t;
#endif
#endif

#ifndef NULL
#if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
#define NULL 0
#else
#define NULL 0L
#endif
#endif

int _Cdecl brk (void *addr);
void *_Cdecl calloc (size_t nitems, size_t size);

#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
unsigned long _Cdecl coreleft (void);
#else
unsigned _Cdecl coreleft (void);
#endif

void _Cdecl free (void *block);
void *_Cdecl malloc (size_t size);
void *_Cdecl realloc (void *block, size_t size);
void *_Cdecl sbrk (int incr);

#if !__STDC__
void far * _Cdecl farcalloc (unsigned long nunits, unsigned long unitsz);
unsigned long _Cdecl farcoreleft(void);
void _Cdecl farfree (void far *block);
void far *_Cdecl farmalloc (unsigned long nbytes);
void far *_Cdecl farrealloc (void far *oldblock, unsigned long nbytes);
#endif
/* assert.h

assert macro

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/

#include <stdio.h> /* fprintf() prototype & 'stderr' definition */
#include <stdlib.h> /* abort() prototype */

#if !defined(NDEBUG)
#define assert(p) if(!(p)){fprintf(stderr,\
"Assertion failed: %s, file %s, line %d\n",\
#p, __FILE__, __LINE__);abort();}
#else
#define assert(p)
#endif
/* bios.h

Access to bios services.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

int _Cdecl bioscom(int cmd, char abyte, int port);
int _Cdecl biosdisk(int cmd, int drive, int head, int track, int sector,
int nsects, void *buffer);
int _Cdecl biosequip(void);
int _Cdecl bioskey(int cmd);
int _Cdecl biosmemory(void);
int _Cdecl biosprint(int cmd, int abyte, int port);
long _Cdecl biostime(int cmd, long newtime);
/* conio.h

Direct MSDOS console input/output.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if !defined(__VIDEO)
#define __VIDEO

#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#ifndef __OLDCONIO__

struct text_info {
unsigned char winleft;
unsigned char wintop;
unsigned char winright;
unsigned char winbottom;
unsigned char attribute;
unsigned char normattr;
unsigned char currmode;
unsigned char screenheight;
unsigned char screenwidth;
unsigned char curx;
unsigned char cury;
};

enum text_modes { LASTMODE=-1, BW40=0, C40, BW80, C80, MONO=7 };

#if !defined(__COLORS)
#define __COLORS

enum COLORS {
BLACK, /* dark colors */
BLUE,
GREEN,
CYAN,
RED,
MAGENTA,
BROWN,
LIGHTGRAY,
DARKGRAY, /* light colors */
LIGHTBLUE,
LIGHTGREEN,
LIGHTCYAN,
LIGHTRED,
LIGHTMAGENTA,
YELLOW,
WHITE
};
#endif

#define BLINK 128 /* blink bit */

extern int _Cdecl directvideo;

void _Cdecl clreol (void);
void _Cdecl clrscr (void);
void _Cdecl delline (void);
int _Cdecl gettext (int left, int top, int right, int bottom,
void *destin);
void _Cdecl gettextinfo (struct text_info *r);
void _Cdecl gotoxy (int x, int y);
void _Cdecl highvideo (void);
void _Cdecl insline (void);
void _Cdecl lowvideo (void);
int _Cdecl movetext (int left, int top, int right, int bottom,
int destleft, int desttop);
void _Cdecl normvideo (void);
int _Cdecl puttext (int left, int top, int right, int bottom,
void *source);
void _Cdecl textattr (int newattr);
void _Cdecl textbackground (int newcolor);
void _Cdecl textcolor (int newcolor);
void _Cdecl textmode (int newmode);
int _Cdecl wherex (void);
int _Cdecl wherey (void);
void _Cdecl window (int left, int top, int right, int bottom);
#endif

char *_Cdecl cgets (char *str);
int _Cdecl cprintf (const char *format, ...);
int _Cdecl cputs (const char *str);
int _Cdecl cscanf (const char *format, ...);
int _Cdecl getch (void);
int _Cdecl getche (void);
char *_Cdecl getpass (const char *prompt);
int _Cdecl kbhit (void);
int _Cdecl putch (int c);
int _Cdecl ungetch (int ch);

#endif
/* ctype.h

Defines the ctype macros.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#define _IS_SP 1 /* is space */
#define _IS_DIG 2 /* is digit indicator */
#define _IS_UPP 4 /* is upper case */
#define _IS_LOW 8 /* is lower case */
#define _IS_HEX 16 /* [A-F or [a-f] */
#define _IS_CTL 32 /* Control */
#define _IS_PUN 64 /* punctuation */

extern char _Cdecl _ctype[]; /* Character type array */

#define isalnum(c) (_ctype[(c) + 1] & (_IS_DIG | _IS_UPP | _IS_LOW))
#define isalpha(c) (_ctype[(c) + 1] & (_IS_UPP | _IS_LOW))
#define isascii(c) ((unsigned)(c) < 128)
#define iscntrl(c) (_ctype[(c) + 1] & _IS_CTL)
#define isdigit(c) (_ctype[(c) + 1] & _IS_DIG)
#define isgraph(c) ((c) >= 0x21 && (c) <= 0x7e)
#define islower(c) (_ctype[(c) + 1] & _IS_LOW)
#define isprint(c) ((c) >= 0x20 && (c) <= 0x7e)
#define ispunct(c) (_ctype[(c) + 1] & _IS_PUN)
#define isspace(c) (_ctype[(c) + 1] & _IS_SP)
#define isupper(c) (_ctype[(c) + 1] & _IS_UPP)
#define isxdigit(c) (_ctype[(c) + 1] & (_IS_DIG | _IS_HEX))

#define _toupper(c) ((c) + 'A' - 'a')
#define _tolower(c) ((c) + 'a' - 'A')
#define toascii(c) ((c) & 0x7f)

int _Cdecl tolower(int ch);
int _Cdecl toupper(int ch);
/* dir.h

Defines structures, macros, and functions for dealing with
directories and pathnames.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#if !defined(__DIR_DEF_)
#define __DIR_DEF_

struct ffblk {
char ff_reserved[21];
char ff_attrib;
unsigned ff_ftime;
unsigned ff_fdate;
long ff_fsize;
char ff_name[13];
};

#define WILDCARDS 0x01
#define EXTENSION 0x02
#define FILENAME 0x04
#define DIRECTORY 0x08
#define DRIVE 0x10

#define MAXPATH 80
#define MAXDRIVE 3
#define MAXDIR 66
#define MAXFILE 9
#define MAXEXT 5

int _Cdecl chdir (const char *path);
int _Cdecl findfirst (const char *path, struct ffblk *ffblk,
int attrib);
int _Cdecl findnext (struct ffblk *ffblk);
void _Cdecl fnmerge (char *path,const char *drive,const char *dir,
const char *name, const char *ext);
int _Cdecl fnsplit (const char *path, char *drive, char *dir,
char *name, char *ext);
int _Cdecl getcurdir (int drive, char *directory);
char *_Cdecl getcwd (char *buf, int buflen);
int _Cdecl getdisk (void);
int _Cdecl mkdir (const char *path);
char *_Cdecl mktemp (char *template);
int _Cdecl rmdir (const char *path);
char *_Cdecl searchpath (const char *file);
int _Cdecl setdisk (int drive);

#endif
/* dos.h

Defines structs, unions, macros, and functions for dealing
with MSDOS and the Intel iAPX86 microprocessor family.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#if !defined(__DOS_DEF_)
#define __DOS_DEF_

/* Variables */
extern int _Cdecl _8087;
extern int _Cdecl _argc;
extern char **_Cdecl _argv;
extern char **_Cdecl environ;
extern int _Cdecl _doserrno;
extern unsigned _Cdecl _heaplen;
extern unsigned char _Cdecl _osmajor;
extern unsigned char _Cdecl _osminor;
extern unsigned _Cdecl _psp;
extern unsigned _Cdecl _stklen;
extern unsigned _Cdecl _version;

#define FA_RDONLY 0x01 /* Read only attribute */
#define FA_HIDDEN 0x02 /* Hidden file */
#define FA_SYSTEM 0x04 /* System file */
#define FA_LABEL 0x08 /* Volume label */
#define FA_DIREC 0x10 /* Directory */
#define FA_ARCH 0x20 /* Archive */

#define NFDS 20 /* Maximum number of fds */

struct fcb {
char fcb_drive; /* 0 = default, 1 = A, 2 = B */
char fcb_name[8]; /* File name */
char fcb_ext[3]; /* File extension */
short fcb_curblk; /* Current block number */
short fcb_recsize; /* Logical record size in bytes */
long fcb_filsize; /* File size in bytes */
short fcb_date; /* Date file was last written */
char fcb_resv[10]; /* Reserved for DOS */
char fcb_currec; /* Current record in block */
long fcb_random; /* Random record number */
};

struct xfcb {
char xfcb_flag; /* Contains 0xff to indicate xfcb */
char xfcb_resv[5]; /* Reserved for DOS */
char xfcb_attr; /* Search attribute */
struct fcb xfcb_fcb; /* The standard fcb */
};

struct country {
int co_date;
char co_curr[5];
char co_thsep[2];
char co_desep[2];
char co_dtsep[2];
char co_tmsep[2];
char co_currstyle;
char co_digits;
char co_time;
long co_case;
char co_dasep[2];
char co_fill[10];
};

struct DOSERROR {
int exterror;
char class;
char action;
char locus;
};

struct dfree {
unsigned df_avail;
unsigned df_total;
unsigned df_bsec;
unsigned df_sclus;
};

struct fatinfo {
char fi_sclus;
char fi_fatid;
int fi_nclus;
int fi_bysec;
};

struct devhdr {
long dh_next; /* Next device pointer */
short dh_attr; /* Attributes */
unsigned short dh_strat; /* Driver strategy routine */
unsigned short dh_inter; /* Driver interrupt routine */
char dh_name[8]; /* Device name */
};

struct time {
unsigned char ti_min; /* Minutes */
unsigned char ti_hour; /* Hours */
unsigned char ti_hund; /* Hundredths of seconds */
unsigned char ti_sec; /* Seconds */
};

struct date {
int da_year; /* Year - 1980 */
char da_day; /* Day of the month */
char da_mon; /* Month (1 = Jan) */
};

struct WORDREGS {
unsigned int ax, bx, cx, dx, si, di, cflag, flags;
};

struct BYTEREGS {
unsigned char al, ah, bl, bh, cl, ch, dl, dh;
};

union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};

struct SREGS {
unsigned int es;
unsigned int cs;
unsigned int ss;
unsigned int ds;
};

struct REGPACK {
unsigned r_ax, r_bx, r_cx, r_dx;
unsigned r_bp, r_si, r_di, r_ds, r_es, r_flags;
};

#define FP_OFF(fp) ((unsigned)(fp))
#define FP_SEG(fp) ((unsigned)((unsigned long)(fp) >> 16))

typedef struct {
char drive; /* do not change */
char pattern [13]; /* these fields, */
char reserved [7]; /* Microsoft reserved */
char attrib;
short time;
short date;
long size;
char nameZ [13]; /* result of the search, asciiz */
} dosSearchInfo; /* used with DOS functions 4E, 4F */

int _Cdecl absread (int drive, int nsects, int lsect, void *buffer);
int _Cdecl abswrite(int drive, int nsects, int lsect, void *buffer);
int _Cdecl allocmem(unsigned size, unsigned *segp);
int _Cdecl bdos (int dosfun, unsigned dosdx, unsigned dosal);
int _Cdecl bdosptr (int dosfun, void *argument, unsigned dosal);
struct country *_Cdecl country (int xcode, struct country *cp);
void _Cdecl ctrlbrk (int _Cdecl (*handler)(void));
void _Cdecl delay (unsigned milliseconds);
void _Cdecl disable (void);
int _Cdecl dosexterr (struct DOSERROR *eblkp);
long _Cdecl dostounix (struct date *d, struct time *t);
void __emit__();
void _Cdecl enable (void);
int _Cdecl freemem (unsigned segx);
int _Cdecl getcbrk (void);
void _Cdecl getdate (struct date *datep);
void _Cdecl getdfree(unsigned char drive, struct dfree *dtable);
void _Cdecl getfat (unsigned char drive, struct fatinfo *dtable);
void _Cdecl getfatd (struct fatinfo *dtable);
unsigned _Cdecl getpsp (void);
int _Cdecl getswitchar (void);
void _Cdecl gettime (struct time *timep);
void interrupt (* _Cdecl getvect(int interruptno)) ();
int _Cdecl getverify (void);
void _Cdecl harderr (int _Cdecl (*handler)());
void _Cdecl hardresume (int axret);
void _Cdecl hardretn(int retn);
int _Cdecl inport (int portid);
unsigned char _Cdecl inportb(int portid);
int _Cdecl int86 (int intno, union REGS *inregs, union REGS *outregs);
int _Cdecl int86x (int intno, union REGS *inregs, union REGS *outregs,
struct SREGS *segregs);
int _Cdecl intdos (union REGS *inregs, union REGS *outregs);
int _Cdecl intdosx (union REGS *inregs, union REGS *outregs,
struct SREGS *segregs);
void _Cdecl intr (int intno, struct REGPACK *preg);
void _Cdecl keep (unsigned char status, unsigned size);
void _Cdecl nosound (void);
void _Cdecl outport (int portid, int value);
void _Cdecl outportb(int portid, unsigned char value);
char *_Cdecl parsfnm (const char *cmdline, struct fcb *fcb, int opt);
int _Cdecl peek (unsigned segment, unsigned offset);
char _Cdecl peekb (unsigned segment, unsigned offset);
void _Cdecl poke (unsigned segment, unsigned offset, int value);
void _Cdecl pokeb (unsigned segment, unsigned offset, char value);
int _Cdecl randbrd (struct fcb *fcb, int rcnt);
int _Cdecl randbwr (struct fcb *fcb, int rcnt);
void _Cdecl segread (struct SREGS *segp);
int _Cdecl setblock(unsigned segx, unsigned newsize);
int _Cdecl setcbrk (int cbrkvalue);
void _Cdecl setdate (struct date *datep);
void _Cdecl setswitchar (char ch);
void _Cdecl settime (struct time *timep);
void _Cdecl setvect (int interruptno, void interrupt (*isr) ());
void _Cdecl setverify (int value);
void _Cdecl sleep (unsigned seconds);
void _Cdecl sound (unsigned frequency);
void _Cdecl unixtodos (long time, struct date *d, struct time *t);
int _Cdecl unlink (const char *path);

/* These are in-line functions. These prototypes just clean up
some syntax checks and code generation.
*/

void _Cdecl __cli__ (void);
void _Cdecl __sti__ (void);
unsigned char _Cdecl __inportb__(int portid);
void _Cdecl __outportb__ (int portid, unsigned char value);
void _Cdecl __int__ (int interruptnum);

#define disable() __cli__() /* Clear interrupt flag */
#define enable() __sti__() /* Set interrupt flag */
#define inportb(portid) __inportb__(portid) /* Byte IN instruction */
#define outportb(portid, v) __outportb__(portid,v)/* Byte OUT instruction */
#define geninterrupt(i) __int__(i) /* Interrupt instruction */

/* some other compilers use inp, outp for inportb, outportb */
#define inp(portid) inportb(portid)
#define outp(portid,v) outportb(portid,v)

#if !__STDC__
char far *cdecl getdta(void);
void cdecl setdta(char far *dta);

#define MK_FP(seg,ofs) ((void far *) \
(((unsigned long)(seg) << 16) | (unsigned)(ofs)))

#define poke(a,b,c) (*((int far*)MK_FP((a),(b))) = (int)(c))
#define pokeb(a,b,c) (*((char far*)MK_FP((a),(b))) = (char)(c))
#define peek(a,b) (*((int far*)MK_FP((a),(b))))
#define peekb(a,b) (*((char far*)MK_FP((a),(b))))
#endif

#endif
/* errno.h

Defines the system error variable errno and the error
numbers set by system calls. Errors which exist in Unix(tm)
but not MSDOS have value -1.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

/* Dos Error Codes */

#define EZERO 0 /* Error 0 */
#define EINVFNC 1 /* Invalid function number */
#define ENOFILE 2 /* File not found */
#define ENOPATH 3 /* Path not found */
#define ECONTR 7 /* Memory blocks destroyed */
#define EINVMEM 9 /* Invalid memory block address */
#define EINVENV 10 /* Invalid environment */
#define EINVFMT 11 /* Invalid format */
#define EINVACC 12 /* Invalid access code */
#define EINVDAT 13 /* Invalid data */
#define EINVDRV 15 /* Invalid drive specified */
#define ECURDIR 16 /* Attempt to remove CurDir */
#define ENOTSAM 17 /* Not same device */
#define ENMFILE 18 /* No more files */

#define ENOENT 2 /* No such file or directory */
#define EMFILE 4 /* Too many open files */
#define EACCES 5 /* Permission denied */
#define EBADF 6 /* Bad file number */
#define ENOMEM 8 /* Not enough core */
#define ENODEV 15 /* No such device */
#define EINVAL 19 /* Invalid argument */
#define E2BIG 20 /* Arg list too long */
#define ENOEXEC 21 /* Exec format error */
#define EXDEV 22 /* Cross-device link */
#define EDOM 33 /* Math argument */
#define ERANGE 34 /* Result too large */
#define EEXIST 35 /* File already exists */

#define EFAULT -1 /* Unknown error */
#define EPERM -1 /* UNIX - not MSDOS */
#define ESRCH -1 /* UNIX - not MSDOS */
#define EINTR -1 /* UNIX - not MSDOS */
#define EIO -1 /* UNIX - not MSDOS */
#define ENXIO -1 /* UNIX - not MSDOS */
#define ECHILD -1 /* UNIX - not MSDOS */
#define EAGAIN -1 /* UNIX - not MSDOS */
#define ENOTBLK -1 /* UNIX - not MSDOS */
#define EBUSY -1 /* UNIX - not MSDOS */
#define ENOTDIR -1 /* UNIX - not MSDOS */
#define EISDIR -1 /* UNIX - not MSDOS */
#define ENFILE -1 /* UNIX - not MSDOS */
#define ENOTTY -1 /* UNIX - not MSDOS */
#define ETXTBSY -1 /* UNIX - not MSDOS */
#define EFBIG -1 /* UNIX - not MSDOS */
#define ENOSPC -1 /* UNIX - not MSDOS */
#define ESPIPE -1 /* UNIX - not MSDOS */
#define EROFS -1 /* UNIX - not MSDOS */
#define EMLINK -1 /* UNIX - not MSDOS */
#define EPIPE -1 /* UNIX - not MSDOS */
#define EUCLEAN -1 /* UNIX - not MSDOS */

#define _sys_nerr 35 /* highest defined system error number */

extern int _Cdecl errno;
extern int _Cdecl _doserrno;
/* fcntl.h

Define flag values accessible to open.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

extern int _Cdecl _fmode;

/* The first three can only be set by open */

#define O_RDONLY 1
#define O_WRONLY 2
#define O_RDWR 4

/* Flag values for open only */

#define O_CREAT 0x0100 /* create and open file */
#define O_TRUNC 0x0200 /* open with truncation */
#define O_EXCL 0x0400 /* exclusive open */

/* The "open flags" defined above are not needed after open, hence they
are re-used for other purposes when the file is running. Sorry, its
getting crowded !
*/
#define _O_RUNFLAGS 0x0700
#define _O_EOF 0x0200 /* set when text file hits ^Z */

/* a file in append mode may be written to only at its end.
*/
#define O_APPEND 0x0800 /* to end of file */

/* MSDOS special bits */

#define O_CHANGED 0x1000 /* user may read these bits, but */
#define O_DEVICE 0x2000 /* only RTL\io functions may touch. */
#define O_TEXT 0x4000 /* CR-LF translation */
#define O_BINARY 0x8000 /* no translation */

/* DOS 3.x options */

#define O_NOINHERIT 0x80
#define O_DENYALL 0x10
#define O_DENYWRITE 0x20
#define O_DENYREAD 0x30
#define O_DENYNONE 0x40
/* float.h

Defines implementation specific macros for dealing with
floating point.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#define FLT_RADIX 2
#define FLT_ROUNDS 1
#define FLT_GUARD 1
#define FLT_NORMALIZE 1

#define DBL_DIG 15
#define FLT_DIG 6
#define LDBL_DIG 19

#define DBL_MANT_DIG 53
#define FLT_MANT_DIG 24
#define LDBL_MANT_DIG 64

#define DBL_EPSILON 2.2204460492503131E-16
#define FLT_EPSILON 1.19209290E-07F
#define LDBL_EPSILON 1.084202172485504E-19

/* smallest positive IEEE normal numbers */
#define DBL_MIN 2.2250738585072014E-308
#define FLT_MIN 1.17549435E-38F
#define LDBL_MIN _tiny_ldble

#define DBL_MAX _huge_dble
#define FLT_MAX _huge_flt
#define LDBL_MAX _huge_ldble

#define DBL_MAX_EXP +1024
#define FLT_MAX_EXP +128
#define LDBL_MAX_EXP +16384

#define DBL_MAX_10_EXP +308
#define FLT_MAX_10_EXP +38
#define LDBL_MAX_10_EXP +4932

#define DBL_MIN_10_EXP -307
#define FLT_MIN_10_EXP -37
#define LDBL_MIN_10_EXP -4931

#define DBL_MIN_EXP -1021
#define FLT_MIN_EXP -125
#define LDBL_MIN_EXP -16381

extern float _Cdecl _huge_flt;
extern double _Cdecl _huge_dble;
extern long double _Cdecl _huge_ldble;
extern long double _Cdecl _tiny_ldble;

unsigned int _Cdecl _clear87(void);
unsigned int _Cdecl _control87(unsigned int new, unsigned int mask);
void _Cdecl _fpreset(void);
unsigned int _Cdecl _status87(void);

/* 8087/80287 Status Word format */

#define SW_INVALID 0x0001 /* Invalid operation */
#define SW_DENORMAL 0x0002 /* Denormalized operand */
#define SW_ZERODIVIDE 0x0004 /* Zero divide */
#define SW_OVERFLOW 0x0008 /* Overflow */
#define SW_UNDERFLOW 0x0010 /* Underflow */
#define SW_INEXACT 0x0020 /* Precision (Inexact result) */

/* 8087/80287 Control Word format */

#define MCW_EM 0x003f /* interrupt Exception Masks */
#define EM_INVALID 0x0001 /* invalid */
#define EM_DENORMAL 0x0002 /* denormal */
#define EM_ZERODIVIDE 0x0004 /* zero divide */
#define EM_OVERFLOW 0x0008 /* overflow */
#define EM_UNDERFLOW 0x0010 /* underflow */
#define EM_INEXACT 0x0020 /* inexact (precision) */

#define MCW_IC 0x1000 /* Infinity Control */
#define IC_AFFINE 0x1000 /* affine */
#define IC_PROJECTIVE 0x0000 /* projective */

#define MCW_RC 0x0c00 /* Rounding Control */
#define RC_CHOP 0x0c00 /* chop */
#define RC_UP 0x0800 /* up */
#define RC_DOWN 0x0400 /* down */
#define RC_NEAR 0x0000 /* near */

#define MCW_PC 0x0300 /* Precision Control */
#define PC_24 0x0000 /* 24 bits */
#define PC_53 0x0200 /* 53 bits */
#define PC_64 0x0300 /* 64 bits */

/* 8087/80287 Initial Control Word */
/* use affine infinity, mask underflow and precision exceptions */

#define CW_DEFAULT (RC_NEAR+PC_64+IC_AFFINE+EM_UNDERFLOW+EM_INEXACT)

/*
SIGFPE signal error types (for integer & float exceptions).
*/
#define FPE_INTOVFLOW 126 /* 80x86 Interrupt on overflow */
#define FPE_INTDIV0 127 /* 80x86 Integer divide by zero */

#define FPE_INVALID 129 /* 80x87 invalid operation */
#define FPE_ZERODIVIDE 131 /* 80x87 divide by zero */
#define FPE_OVERFLOW 132 /* 80x87 arithmetic overflow */
#define FPE_UNDERFLOW 133 /* 80x87 arithmetic underflow */
#define FPE_INEXACT 134 /* 80x87 precision loss */
#define FPE_EXPLICITGEN 140 /* When SIGFPE is raise()'d */

/*
SIGSEGV signal error types.
*/
#define SEGV_BOUND 10 /* A BOUND violation (SIGSEGV) */
#define SEGV_EXPLICITGEN 11 /* When SIGSEGV is raise()'d */

/*
SIGILL signal error types.
*/
#define ILL_EXECUTION 20 /* Illegal operation exception */
#define ILL_EXPLICITGEN 21 /* When SIGILL is raise()'d */

/* graphics.h

Definitions for Graphics Package.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/

#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#if !defined(__GRAPHX_DEF_)
#define __GRAPHX_DEF_

enum graphics_errors { /* graphresult error return codes */
grOk = 0,
grNoInitGraph = -1,
grNotDetected = -2,
grFileNotFound = -3,
grInvalidDriver = -4,
grNoLoadMem = -5,
grNoScanMem = -6,
grNoFloodMem = -7,
grFontNotFound = -8,
grNoFontMem = -9,
grInvalidMode = -10,
grError = -11, /* generic error */
grIOerror = -12,
grInvalidFont = -13,
grInvalidFontNum = -14,
grInvalidVersion = -18
};

enum graphics_drivers { /* define graphics drivers */
DETECT, /* requests autodetection */
CGA, MCGA, EGA, EGA64, EGAMONO, IBM8514, /* 1 - 6 */
HERCMONO, ATT400, VGA, PC3270, /* 7 - 10 */
CURRENT_DRIVER = -1
};

enum graphics_modes { /* graphics modes for each driver */
CGAC0 = 0, /* 320x200 palette 0; 1 page */
CGAC1 = 1, /* 320x200 palette 1; 1 page */
CGAC2 = 2, /* 320x200 palette 2: 1 page */
CGAC3 = 3, /* 320x200 palette 3; 1 page */
CGAHI = 4, /* 640x200 1 page */
MCGAC0 = 0, /* 320x200 palette 0; 1 page */
MCGAC1 = 1, /* 320x200 palette 1; 1 page */
MCGAC2 = 2, /* 320x200 palette 2; 1 page */
MCGAC3 = 3, /* 320x200 palette 3; 1 page */
MCGAMED = 4, /* 640x200 1 page */
MCGAHI = 5, /* 640x480 1 page */
EGALO = 0, /* 640x200 16 color 4 pages */
EGAHI = 1, /* 640x350 16 color 2 pages */
EGA64LO = 0, /* 640x200 16 color 1 page */
EGA64HI = 1, /* 640x350 4 color 1 page */
EGAMONOHI = 0, /* 640x350 64K on card, 1 page - 256K on card, 4 pages */
HERCMONOHI = 0, /* 720x348 2 pages */
ATT400C0 = 0, /* 320x200 palette 0; 1 page */
ATT400C1 = 1, /* 320x200 palette 1; 1 page */
ATT400C2 = 2, /* 320x200 palette 2; 1 page */
ATT400C3 = 3, /* 320x200 palette 3; 1 page */
ATT400MED = 4, /* 640x200 1 page */
ATT400HI = 5, /* 640x400 1 page */
VGALO = 0, /* 640x200 16 color 4 pages */
VGAMED = 1, /* 640x350 16 color 2 pages */
VGAHI = 2, /* 640x480 16 color 1 page */
PC3270HI = 0, /* 720x350 1 page */
IBM8514LO = 0, /* 640x480 256 colors */
IBM8514HI = 1 /*1024x768 256 colors */
};

/* Colors for setpalette and setallpalette */

#if !defined(__COLORS)
#define __COLORS

enum COLORS {
BLACK, /* dark colors */
BLUE,
GREEN,
CYAN,
RED,
MAGENTA,
BROWN,
LIGHTGRAY,
DARKGRAY, /* light colors */
LIGHTBLUE,
LIGHTGREEN,
LIGHTCYAN,
LIGHTRED,
LIGHTMAGENTA,
YELLOW,
WHITE
};
#endif

enum CGA_COLORS {
CGA_LIGHTGREEN = 1, /* Palette C0 Color Names */
CGA_LIGHTRED = 2,
CGA_YELLOW = 3,

CGA_LIGHTCYAN = 1, /* Palette C1 Color Names */
CGA_LIGHTMAGENTA = 2,
CGA_WHITE = 3,

CGA_GREEN = 1, /* Palette C2 Color Names */
CGA_RED = 2,
CGA_BROWN = 3,

CGA_CYAN = 1, /* Palette C3 Color Names */
CGA_MAGENTA = 2,
CGA_LIGHTGRAY = 3
};

enum EGA_COLORS {
EGA_BLACK = 0, /* dark colors */
EGA_BLUE = 1,
EGA_GREEN = 2,
EGA_CYAN = 3,
EGA_RED = 4,
EGA_MAGENTA = 5,
EGA_BROWN = 20,
EGA_LIGHTGRAY = 7,
EGA_DARKGRAY = 56, /* light colors */
EGA_LIGHTBLUE = 57,
EGA_LIGHTGREEN = 58,
EGA_LIGHTCYAN = 59,
EGA_LIGHTRED = 60,
EGA_LIGHTMAGENTA = 61,
EGA_YELLOW = 62,
EGA_WHITE = 63
};

enum line_styles { /* Line styles for get/setlinestyle */
SOLID_LINE = 0,
DOTTED_LINE = 1,
CENTER_LINE = 2,
DASHED_LINE = 3,
USERBIT_LINE = 4, /* User defined line style */
};

enum line_widths { /* Line widths for get/setlinestyle */
NORM_WIDTH = 1,
THICK_WIDTH = 3,
};

enum font_names {
DEFAULT_FONT = 0, /* 8x8 bit mapped font */
TRIPLEX_FONT = 1, /* "Stroked" fonts */
SMALL_FONT = 2,
SANS_SERIF_FONT = 3,
GOTHIC_FONT = 4
};

#define HORIZ_DIR 0 /* left to right */
#define VERT_DIR 1 /* bottom to top */

#define USER_CHAR_SIZE 0 /* user-defined char size */

enum fill_patterns { /* Fill patterns for get/setfillstyle */
EMPTY_FILL, /* fills area in background color */
SOLID_FILL, /* fills area in solid fill color */
LINE_FILL, /* --- fill */
LTSLASH_FILL, /* /// fill */
SLASH_FILL, /* /// fill with thick lines */
BKSLASH_FILL, /* \\\ fill with thick lines */
LTBKSLASH_FILL, /* \\\ fill */
HATCH_FILL, /* light hatch fill */
XHATCH_FILL, /* heavy cross hatch fill */
INTERLEAVE_FILL, /* interleaving line fill */
WIDE_DOT_FILL, /* Widely spaced dot fill */
CLOSE_DOT_FILL, /* Closely spaced dot fill */
USER_FILL /* user defined fill */
};

enum putimage_ops { /* BitBlt operators for putimage */
COPY_PUT, /* MOV */
XOR_PUT, /* XOR */
OR_PUT, /* OR */
AND_PUT, /* AND */
NOT_PUT /* NOT */
};

enum text_just { /* Horizontal and vertical justification
for settextjustify */
LEFT_TEXT = 0,
CENTER_TEXT = 1,
RIGHT_TEXT = 2,

BOTTOM_TEXT = 0,
/* CENTER_TEXT = 1, already defined above */
TOP_TEXT = 2
};

#define MAXCOLORS 15

struct palettetype {
unsigned char size;
signed char colors[MAXCOLORS+1];
};

struct linesettingstype {
int linestyle;
unsigned upattern;
int thickness;
};

struct textsettingstype {
int font;
int direction;
int charsize;
int horiz;
int vert;
};

struct fillsettingstype {
int pattern;
int color;
};

struct pointtype {
int x, y;
};

struct viewporttype {
int left, top, right, bottom;
int clip;
};

struct arccoordstype {
int x, y;
int xstart, ystart, xend, yend;
};

void far _Cdecl arc(int x, int y, int stangle, int endangle,
int radius);
void far _Cdecl bar(int left, int top, int right, int bottom);
void far _Cdecl bar3d(int left, int top, int right, int bottom,
int depth, int topflag);
void far _Cdecl circle(int x, int y, int radius);
void far _Cdecl cleardevice(void);
void far _Cdecl clearviewport(void);
void far _Cdecl closegraph(void);
void far _Cdecl detectgraph(int far *graphdriver,int far *graphmode);
void far _Cdecl drawpoly(int numpoints, int far *polypoints);
void far _Cdecl ellipse(int x, int y, int stangle, int endangle,
int xradius, int yradius);
void far _Cdecl fillellipse( int x, int y, int xradius, int yradius );
void far _Cdecl fillpoly(int numpoints, int far *polypoints);
void far _Cdecl floodfill(int x, int y, int border);
void far _Cdecl getarccoords(struct arccoordstype far *arccoords);
void far _Cdecl getaspectratio(int far *xasp, int far *yasp);
int far _Cdecl getbkcolor(void);
int far _Cdecl getcolor(void);
struct palettetype * far _Cdecl getdefaultpalette( void );
char * far _Cdecl getdrivername( void );
void far _Cdecl getfillpattern(char far *pattern);
void far _Cdecl getfillsettings(struct fillsettingstype far *fillinfo);
int far _Cdecl getgraphmode(void);
void far _Cdecl getimage(int left, int top, int right, int bottom,
void far *bitmap);
void far _Cdecl getlinesettings(struct linesettingstype far *lineinfo);
int far _Cdecl getmaxcolor(void);
int far _Cdecl getmaxmode(void);
int far _Cdecl getmaxx(void);
int far _Cdecl getmaxy(void);
char * far _Cdecl getmodename( int mode_number );
void far _Cdecl getmoderange(int graphdriver, int far *lomode,
int far *himode);
unsigned far _Cdecl getpixel(int x, int y);
void far _Cdecl getpalette(struct palettetype far *palette);
int far _Cdecl getpalettesize( void );
void far _Cdecl gettextsettings(struct textsettingstype far *texttypeinfo);
void far _Cdecl getviewsettings(struct viewporttype far *viewport);
int far _Cdecl getx(void);
int far _Cdecl gety(void);
void far _Cdecl graphdefaults(void);
char * far _Cdecl grapherrormsg(int errorcode);
void far _Cdecl _graphfreemem(void far *ptr, unsigned size);
void far * far _Cdecl _graphgetmem(unsigned size);
int far _Cdecl graphresult(void);
unsigned far _Cdecl imagesize(int left, int top, int right, int bottom);
void far _Cdecl initgraph(int far *graphdriver,
int far *graphmode,
char far *pathtodriver);
int far _Cdecl installuserdriver( char far *name, int huge (*detect)(void) );
int far _Cdecl installuserfont( char far *name );
void far _Cdecl line(int x1, int y1, int x2, int y2);
void far _Cdecl linerel(int dx, int dy);
void far _Cdecl lineto(int x, int y);
void far _Cdecl moverel(int dx, int dy);
void far _Cdecl moveto(int x, int y);
void far _Cdecl outtext(char far *textstring);
void far _Cdecl outtextxy(int x, int y, char far *textstring);
void far _Cdecl pieslice(int x, int y, int stangle, int endangle,
int radius);
void far _Cdecl putimage(int left, int top, void far *bitmap, int op);
void far _Cdecl putpixel(int x, int y, int color);
void far _Cdecl rectangle(int left, int top, int right, int bottom);
void far _Cdecl restorecrtmode(void);
void far _Cdecl sector( int X, int Y, int StAngle, int EndAngle,
int XRadius, int YRadius );
void far _Cdecl setactivepage(int page);
void far _Cdecl setallpalette(struct palettetype far *palette);
void far _Cdecl setaspectratio( int xasp, int yasp );
void far _Cdecl setbkcolor(int color);
void far _Cdecl setcolor(int color);
void far _Cdecl setfillpattern(char far *upattern, int color);
void far _Cdecl setfillstyle(int pattern, int color);
unsigned far _Cdecl setgraphbufsize(unsigned bufsize);
void far _Cdecl setgraphmode(int mode);
void far _Cdecl setlinestyle(int linestyle, unsigned upattern,
int thickness);
void far _Cdecl setpalette(int colornum, int color);
void far _Cdecl setrgbpalette(int colornum,
int red, int green, int blue);
void far _Cdecl settextjustify(int horiz, int vert);
void far _Cdecl settextstyle(int font, int direction, int charsize);
void far _Cdecl setusercharsize(int multx, int divx,
int multy, int divy);
void far _Cdecl setviewport(int left, int top, int right, int bottom,
int clip);
void far _Cdecl setvisualpage(int page);
void far _Cdecl setwritemode( int mode );
int far _Cdecl textheight(char far *textstring);
int far _Cdecl textwidth(char far *textstring);

/***** graphics drivers *****/

int _Cdecl registerbgidriver(void (*driver)(void));
int far _Cdecl registerfarbgidriver(void far *driver);

/* !! These "functions" are NOT user-callable !! */
/* !! They are there just so you can link in graphics drivers !! */

void _Cdecl CGA_driver(void);
void _Cdecl EGAVGA_driver(void);
void _Cdecl IBM8514_driver(void);
void _Cdecl Herc_driver(void);
void _Cdecl ATT_driver(void);
void _Cdecl PC3270_driver(void);

extern int far _Cdecl CGA_driver_far[];
extern int far _Cdecl EGAVGA_driver_far[];
extern int far _Cdecl IBM8514_driver_far[];
extern int far _Cdecl Herc_driver_far[];
extern int far _Cdecl ATT_driver_far[];
extern int far _Cdecl PC3270_driver_far[];

/***** graphics fonts *****/

int _Cdecl registerbgifont(void (*font)(void));
int far _Cdecl registerfarbgifont(void far *font);

/* !! These "functions" are NOT user-callable, !! */
/* !! they are there just so you can link in fonts !! */

void _Cdecl triplex_font(void);
void _Cdecl small_font(void);
void _Cdecl sansserif_font(void);
void _Cdecl gothic_font(void);

extern int far _Cdecl triplex_font_far[];
extern int far _Cdecl small_font_far[];
extern int far _Cdecl sansserif_font_far[];
extern int far _Cdecl gothic_font_far[];

#endif
#define dcolor 8
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <graphics.h>
#include <Conio.h>
#include <process.h>

int GetBit(unsigned char c,int n);
int handle;

int OpenHz(char* HzPath)
{
return handle=open(HzPath,O_RDONLY|O_BINARY);
}

int Wrt16Hz(int x, int y,int z,int color,char *p)
{
unsigned int i,c1,c2,f=0; /*x,y:write at (x,y);*/
int rec,i1,i2,i3; /*z:space between; */
long l; /*color:txt color */
char by[32]; /*p:HZ str */

if( handle<0 ) return -1;

while((i=*p++)!=0){
if(i>0xa1)
if(f==0){
c1=(i-0xa1)&0x07f;
f=1;
}
else{
c2=(i-0xa1)&0x07f;
f=0;
rec=c1*94+c2;
l=rec*32L;
lseek(handle,l,SEEK_SET);
read(handle,by,32);
for(i1=0;i1<16;i1++)
for(i2=0;i2<2;i2++)
for(i3=0;i3<8;i3++)
if(GetBit(by[i1*2+i2],7-i3))
putpixel(x+i2*8+i3,y+i1,color);
x=x+z+16;
}
}
return(x);
}

int Wrt24Hz(int x,int y,int z,int color,int m,int n,char *p)
{
unsigned int i,c1,c2,f=0; /*z:space between two HZ */
int i1,i2,i3,i4,i5,rec; /*x,y:position(x,y) to locate */
long l; /*color:from 0 to 15 */
char by[72]; /*m:x scale */
/*n:y scale */
if( handle<0 ) return -1;

while((i=*p++)!=0){ /*p:HZ str */
if(i>0xa1)
if(f==0){
c1=(i-0xa1)&0x7f;
f=1;
}
else{
c2=(i-0xa1)&0x7f;
f=0;
rec=(c1-15)*94+c2;
l=rec*72L;
lseek(handle,l,SEEK_SET);
read(handle,by,72);
for(i1=0;i1<24*m;i1=i1+m)
for(i4=0;i4<m;i4++)
for(i2=0;i2<=2;i2++)
for(i3=0;i3<8;i3++)
if(GetBit(by[i1/m*3+i2],7-i3))
for(i5=0;i5<n;i5++)
putpixel(x+i1+i4,y+i2*8*n+i3*n+i5,color);
x=x+24*m+z;
}
}
return(x);
}

int GetBit(unsigned char c,int n)
{
if( handle<0 ) return 0;

return((c>>n)&1);
}

void CloseHz(void){
close( handle );
}
/******************** Program *****************************/
main ()
{
int driver=DETECT,mode,g_error;
if(registerbgidriver(EGAVGA_driver)<0)exit(1);
initgraph(&driver,&mode," ");
g_error=graphresult();
if(g_error<0)
{printf("initgaph error:%s\n",grapherrormsg(g_error));
exit(1);}
setbkcolor(8);F:\TC\INCLUDE\FCNTL.H�/* io.h

Definitions for low level I/O functions.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#ifndef _IO_H
#define _IO_H 1

#define HANDLE_MAX 20U

extern unsigned int _Cdecl _openfd[];

struct ftime {
unsigned ft_tsec : 5; /* Two second interval */
unsigned ft_min : 6; /* Minutes */
unsigned ft_hour : 5; /* Hours */
unsigned ft_day : 5; /* Days */
unsigned ft_month : 4; /* Months */
unsigned ft_year : 7; /* Year */
};

#define SEEK_CUR 1
#define SEEK_END 2
#define SEEK_SET 0

int _Cdecl access (const char *path, int amode);
int _Cdecl _chmod (const char *path, int func, ... /* int attr */);
int _Cdecl chmod (const char *path, int amode);
int _Cdecl chsize (int handle, long size);
int _Cdecl _close (int handle);
int _Cdecl close (int handle);
int _Cdecl _creat (const char *path, int attribute);
int _Cdecl creat (const char *path, int amode);
int _Cdecl creatnew (const char *path, int mode); /* DOS 3.0 or later */
int _Cdecl creattemp (char *path, int amode); /* DOS 3.0 or later */
int _Cdecl dup (int handle);
int _Cdecl dup2 (int oldhandle, int newhandle);
int _Cdecl eof (int handle);
long _Cdecl filelength (int handle);
int _Cdecl getftime (int handle, struct ftime *ftimep);
int _Cdecl ioctl (int handle, int func, ...);
/* optional 3rd and 4th args are: void * argdx, int argcx */
int _Cdecl isatty (int handle);
int _Cdecl lock (int handle, long offset, long length);
long _Cdecl lseek (int handle, long offset, int fromwhere);
int _Cdecl _open (const char *path, int oflags);
int _Cdecl open (const char *path, int access,... /*unsigned mode*/);
int _Cdecl _read (int handle, void *buf, unsigned len);
int _Cdecl read (int handle, void *buf, unsigned len);
int _Cdecl setftime (int handle, struct ftime *ftimep);
int _Cdecl setmode (int handle, int amode);
long _Cdecl tell (int handle);
unsigned _Cdecl umask (unsigned cmask);
int _Cdecl unlink (const char *path);
int _Cdecl unlock (int handle, long offset, long length);
int _Cdecl _write (int handle, void *buf, unsigned len);
int _Cdecl write (int handle, void *buf, unsigned len);

/* macros for compatibility with earlier versions & other compilers. */
#define sopen(path,access,shflag,mode) open (path, (access)|(shflag), mode)

#endif /* _IO_H */
/* limits.h

Defines implementation specific limits on type values.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#define CHAR_BIT 8

#if (((int)((char)0x80)) < 0)
#define CHAR_MAX 0x7F
#define CHAR_MIN 0x80
#else
#define CHAR_MAX 0xFFU
#define CHAR_MIN 0x00
#endif

#define SCHAR_MAX 0x7F
#define SCHAR_MIN -128
#define UCHAR_MAX 0xFFU

#define SHRT_MAX 0x7FFF
#define SHRT_MIN ((int)0x8000)
#define USHRT_MAX 0xFFFFU

#define INT_MAX 0x7FFF
#define INT_MIN ((int)0x8000)
#define UINT_MAX 0xFFFFU

#define LONG_MAX 0x7FFFFFFFL
#define LONG_MIN ((long)0x80000000L)
#define ULONG_MAX 0xFFFFFFFFUL
/* alloc.h

memory management functions and variables.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#ifndef _STDDEF
#define _STDDEF
#ifndef _PTRDIFF_T
#define _PTRDIFF_T
#if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
typedef long ptrdiff_t;
#else
typedef int ptrdiff_t;
#endif
#endif
#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned size_t;
#endif
#endif

#ifndef NULL
#if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
#define NULL 0
#else
#define NULL 0L
#endif
#endif

int _Cdecl brk (void *addr);
void *_Cdecl calloc (size_t nitems, size_t size);

#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
unsigned long _Cdecl coreleft (void);
#else
unsigned _Cdecl coreleft (void);
#endif

void _Cdecl free (void *block);
void *_Cdecl malloc (size_t size);
void *_Cdecl realloc (void *block, size_t size);
void *_Cdecl sbrk (int incr);

#if !__STDC__
void far * _Cdecl farcalloc (unsigned long nunits, unsigned long unitsz);
unsigned long _Cdecl farcoreleft(void);
void _Cdecl farfree (void far *block);
void far *_Cdecl farmalloc (unsigned long nbytes);
void far *_Cdecl farrealloc (void far *oldblock, unsigned long nbytes);
#endif
/* math.h

Definitions for the math floating point package.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#ifndef _MATH_H
#define _MATH_H 1

#define EDOM 33 /* Math argument */
#define ERANGE 34 /* Result too large */

#define HUGE_VAL _huge_dble
extern double _Cdecl _huge_dble;

int _Cdecl abs (int x);
double _Cdecl acos (double x);
double _Cdecl asin (double x);
double _Cdecl atan (double x);
double _Cdecl atan2 (double y, double x);
double _Cdecl atof (const char *s);
double _Cdecl ceil (double x);
double _Cdecl cos (double x);
double _Cdecl cosh (double x);
double _Cdecl exp (double x);
double _Cdecl fabs (double x);
double _Cdecl floor (double x);
double _Cdecl fmod (double x, double y);
double _Cdecl frexp (double x, int *exponent);
long _Cdecl labs (long x);
double _Cdecl ldexp (double x, int exponent);
double _Cdecl log (double x);
double _Cdecl log10 (double x);
double _Cdecl modf (double x, double *ipart);
double _Cdecl pow (double x, double y);
double _Cdecl sin (double x);
double _Cdecl sinh (double x);
double _Cdecl sqrt (double x);
double _Cdecl tan (double x);
double _Cdecl tanh (double x);

struct exception
{
int type;
char *name;
double arg1, arg2, retval;
};

int _Cdecl matherr (struct exception *e);

#if !__STDC__
double cdecl hypot (double x, double y);
double cdecl poly (double x, int degree, double coeffs []);
double cdecl pow10 (int p);

struct complex /* as used by "cabs" function */
{
double x, y;
};

#define cabs(z) (hypot ((z).x, (z).y))

/* The customary matherr() exception handler for maths functions is
not compatible with the x3j11 draft standard for C. _matherr() is
provided as a compromise.
*/

typedef enum
{
DOMAIN = 1, /* argument domain error -- log (-1) */
SING, /* argument singularity -- pow (0,-2)) */
OVERFLOW, /* overflow range error -- exp (1000) */
UNDERFLOW, /* underflow range error -- exp (-1000) */
TLOSS, /* total loss of significance -- sin(10e70) */
PLOSS, /* partial loss of signif. -- not used */
} _mexcep;

double _Cdecl _matherr (_mexcep why, char *fun, double *arg1p,
double *arg2p, double retval);

/* Constants rounded for 21 decimals. */
#define M_E 2.71828182845904523536
#define M_LOG2E 1.44269504088896340736
#define M_LOG10E 0.434294481903251827651
#define M_LN2 0.693147180559945309417
#define M_LN10 2.30258509299404568402
#define M_PI 3.14159265358979323846
#define M_PI_2 1.57079632679489661923
#define M_PI_4 0.785398163397448309116
#define M_1_PI 0.318309886183790671538
#define M_2_PI 0.636619772367581343076
#define M_1_SQRTPI 0.564189583547756286948
#define M_2_SQRTPI 1.12837916709551257390
#define M_SQRT2 1.41421356237309504880
#define M_SQRT_2 0.707106781186547524401

#endif /* __STDC__ */

#endif
/* mem.h

Memory manipulation functions

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#ifndef _STDDEF
#define _STDDEF
#ifndef _PTRDIFF_T
#define _PTRDIFF_T
#if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
typedef long ptrdiff_t;
#else
typedef int ptrdiff_t;
#endif
#endif
#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned size_t;
#endif
#endif

#ifndef NULL
#if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
#define NULL 0
#else
#define NULL 0L
#endif
#endif

void *_Cdecl memccpy(void *dest, const void *src, int c, size_t n);
void *_Cdecl memchr (const void *s, int c, size_t n);
int _Cdecl memcmp (const void *s1, const void *s2, size_t n);
void *_Cdecl memcpy (void *dest, const void *src, size_t n);
int _Cdecl memicmp (const void *s1, const void *s2, size_t n);
void *_Cdecl memmove (void *dest, const void *src, size_t n);
void *_Cdecl memset (void *s, int c, size_t n);
void _Cdecl movedata (unsigned srcseg, unsigned srcoff, unsigned dstseg,
unsigned dstoff, size_t n);
void _Cdecl movmem (void *src, void *dest, unsigned length);
void _Cdecl setmem (void *dest, unsigned length, char value);
/* process.h

Symbols and structures for process management.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

/* Modes available as first argument to the spawnxx functions. */

#define P_WAIT 0 /* child runs separately, parent waits until exit */
#define P_NOWAIT 1 /* both concurrent -- not implemented */
#define P_OVERLAY 2 /* child replaces parent, parent no longer exists */

/* MSDOS does not have any abstract identifier for a process, but the
process Program Segment Prefix location provides a similar token.
*/

#ifndef _psp
extern unsigned _Cdecl _psp; /* provided unconditionally in dos.h */
#endif

#define getpid() (_psp)

void _Cdecl abort(void);
int _Cdecl execl(char *path, char *arg0, ...);
int _Cdecl execle(char *path, char *arg0, ...);
int _Cdecl execlp(char *path, char *arg0, ...);
int _Cdecl execlpe(char *path, char *arg0, ...);
int _Cdecl execv(char *path, char *argv[]);
int _Cdecl execve(char *path, char *argv[], char **env);
int _Cdecl execvp(char *path, char *argv[]);
int _Cdecl execvpe(char *path, char *argv[], char **env);
void _Cdecl exit(int status);
void _Cdecl _exit(int status);
int _Cdecl spawnl(int mode, char *path, char *arg0, ...);
int _Cdecl spawnle(int mode, char *path, char *arg0, ...);
int _Cdecl spawnlp(int mode, char *path, char *arg0, ...);
int _Cdecl spawnlpe(int mode, char *path, char *arg0, ...);
int _Cdecl spawnv(int mode, char *path, char *argv[]);
int _Cdecl spawnve(int mode, char *path, char *argv[], char **env);
int _Cdecl spawnvp(int mode, char *path, char *argv[]);
int _Cdecl spawnvpe(int mode, char *path, char *argv[], char **env);
int _Cdecl system(const char *command);

/* setjmp.h

Defines typedef and functions for setjmp/longjmp.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#ifndef _SETJMP
#define _SETJMP
typedef struct {
unsigned j_sp;
unsigned j_ss;
unsigned j_flag;
unsigned j_cs;
unsigned j_ip;
unsigned j_bp;
unsigned j_di;
unsigned j_es;
unsigned j_si;
unsigned j_ds;
} jmp_buf[1];

void _Cdecl longjmp(jmp_buf jmpb, int retval);
int _Cdecl setjmp(jmp_buf jmpb);
#endif

/* share.h

File sharing mode for use with sopen.
See DOS function 3Dh for definition.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#define SH_COMPAT 0x0000
#define SH_DENYRW 0x0010
#define SH_DENYWR 0x0020
#define SH_DENYRD 0x0030
#define SH_DENYNONE 0x0040

#define SH_DENYNO SH_DENYNONE /* MS documentation uses both */
/* signal.h

Definitions for ANSI defined signaling capability

Copyright (c) Borland International 1988
All Rights Reserved.
*/

#ifndef __SIGNAL_H
#define __SIGNAL_H

#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

typedef int sig_atomic_t; /* Atomic entity type (ANSI) */

#define SIG_DFL ((void (* _Cdecl)(int))0) /* Default action */
#define SIG_IGN ((void (* _Cdecl)(int))1) /* Ignore action */

#ifdef __OS2__
#define SIG_SGE ((void (* _Cdecl)(int))3) /* Signal gets error */
#define SIG_ACK ((void (* _Cdecl)(int))4) /* Signal acknowlege */
#endif

#define SIG_ERR ((void (* _Cdecl)(int))-1) /* Error return */

#define SIGABRT 22
#define SIGFPE 8 /* Floating point trap */
#define SIGILL 4 /* Illegal instruction */
#define SIGINT 2
#define SIGSEGV 11 /* Memory access violation */
#define SIGTERM 15

#ifdef __OS2__
#define SIGBREAK 21 /* OS/2 Ctrl-Brk signal */
#define SIGUSR1 16 /* OS/2 process flag A */
#define SIGUSR2 17 /* OS/2 process flag B */
#define SIGUSR3 20 /* OS/2 process flag C */
#endif

int _Cdecl raise(int sig);
void (* _Cdecl signal(int sig, void (*func)(/* int */))) (int);

#endif
/* stdarg.h

Definitions for accessing parameters in functions that accept
a variable number of arguments.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#if !defined(__STDARG)
#define __STDARG

typedef void *va_list;

#define va_start(ap, parmN) (ap = ...)
#define va_arg(ap, type) (*((type *)(ap))++)
#define va_end(ap)
#define _va_ptr (...)
#endif
/* stddef.h

Definitions for common types, NULL, and errno.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#ifndef _STDDEF
#define _STDDEF
#ifndef _PTRDIFF_T
#define _PTRDIFF_T
#if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
typedef long ptrdiff_t;
#else
typedef int ptrdiff_t;
#endif
#endif
#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned size_t;
#endif

#ifndef NULL
#if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
#define NULL 0
#else
#define NULL 0L
#endif
#endif

extern int _Cdecl errno;

#endif
/* stdio.h

Definitions for stream input/output.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#if !defined(__STDIO_DEF_)
#define __STDIO_DEF_

#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned size_t;
#endif
#ifndef NULL
# if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
# define NULL 0
# else
# define NULL 0L
# endif
#endif

#if !defined(__STDARG)
#include <stdarg.h>
#endif

/* Definition of the file position type
*/
typedef long fpos_t;

/* Definition of the control structure for streams
*/
typedef struct {
short level; /* fill/empty level of buffer */
unsigned flags; /* File status flags */
char fd; /* File descriptor */
unsigned char hold; /* Ungetc char if no buffer */
short bsize; /* Buffer size */
unsigned char *buffer; /* Data transfer buffer */
unsigned char *curp; /* Current active pointer */
unsigned istemp; /* Temporary file indicator */
short token; /* Used for validity checking */
} FILE; /* This is the FILE object */

/* Bufferisation type to be used as 3rd argument for "setvbuf" function
*/
#define _IOFBF 0
#define _IOLBF 1
#define _IONBF 2

/* "flags" bits definitions
*/
#define _F_RDWR 0x0003 /* Read/write flag */
#define _F_READ 0x0001 /* Read only file */
#define _F_WRIT 0x0002 /* Write only file */
#define _F_BUF 0x0004 /* Malloc'ed Buffer data */
#define _F_LBUF 0x0008 /* line-buffered file */
#define _F_ERR 0x0010 /* Error indicator */
#define _F_EOF 0x0020 /* EOF indicator */
#define _F_BIN 0x0040 /* Binary file indicator */
#define _F_IN 0x0080 /* Data is incoming */
#define _F_OUT 0x0100 /* Data is outgoing */
#define _F_TERM 0x0200 /* File is a terminal */

/* End-of-file constant definition
*/
#define EOF (-1) /* End of file indicator */

/* Number of files that can be open simultaneously
*/
#define OPEN_MAX 20 /* Total of 20 open files */
#define SYS_OPEN 20

/* Default buffer size use by "setbuf" function
*/
#define BUFSIZ 512 /* Buffer size for stdio */

/* Size of an arry large enough to hold a temporary file name string
*/
#define L_ctermid 5 /* CON: plus null byte */
#define L_tmpnam 13 /* tmpnam buffer size */

/* Constants to be used as 3rd argument for "fseek" function
*/
#define SEEK_CUR 1
#define SEEK_END 2
#define SEEK_SET 0

/* Number of unique file names that shall be generated by "tmpnam" function
*/
#define TMP_MAX 0xFFFF

/* Standard I/O predefined streams
*/
extern FILE _Cdecl _streams[];

#define stdin (&_streams[0])
#define stdout (&_streams[1])
#define stderr (&_streams[2])
#define stdaux (&_streams[3])
#define stdprn (&_streams[4])

void _Cdecl clearerr (FILE *stream);
int _Cdecl fclose (FILE *stream);
int _Cdecl fflush (FILE *stream);
int _Cdecl fgetc (FILE *stream);
int _Cdecl fgetpos (FILE *stream, fpos_t *pos);
char *_Cdecl fgets (char *s, int n, FILE *stream);
FILE *_Cdecl fopen (const char *path, const char *mode);
int _Cdecl fprintf (FILE *stream, const char *format, ...);
int _Cdecl fputc (int c, FILE *stream);
int _Cdecl fputs (const char *s, FILE *stream);
size_t _Cdecl fread (void *ptr, size_t size, size_t n, FILE *stream);
FILE *_Cdecl freopen (const char *path, const char *mode,
FILE *stream);
int _Cdecl fscanf (FILE *stream, const char *format, ...);
int _Cdecl fseek (FILE *stream, long offset, int whence);
int _Cdecl fsetpos (FILE *stream, const fpos_t *pos);
long _Cdecl ftell (FILE *stream);
size_t _Cdecl fwrite (const void *ptr, size_t size, size_t n,
FILE *stream);
char *_Cdecl gets (char *s);
void _Cdecl perror (const char *s);
int _Cdecl printf (const char *format, ...);
int _Cdecl puts (const char *s);
int _Cdecl rename (const char *oldname, const char *newname);
void _Cdecl rewind (FILE *stream);
int _Cdecl scanf (const char *format, ...);
void _Cdecl setbuf (FILE *stream, char *buf);
int _Cdecl setvbuf (FILE *stream, char *buf, int type, size_t size);
int _Cdecl sprintf (char *buffer, const char *format, ...);
int _Cdecl sscanf (const char *buffer, const char *format, ...);
char *_Cdecl strerror (int errnum);
FILE *_Cdecl tmpfile (void);
char *_Cdecl tmpnam (char *s);
int _Cdecl ungetc (int c, FILE *stream);
int _Cdecl vfprintf (FILE *stream, const char *format, va_list arglist);
int _Cdecl vfscanf (FILE *stream, const char *format, va_list arglist);
int _Cdecl vprintf (const char *format, va_list arglist);
int _Cdecl vscanf (const char *format, va_list arglist);
int _Cdecl vsprintf (char *buffer, const char *format, va_list arglist);
int _Cdecl vsscanf (const char *buffer, const char *format, va_list arglist);

#if !__STDC__
int _Cdecl fcloseall(void);
FILE *_Cdecl fdopen (int handle, char *type);
int _Cdecl fgetchar (void);
int _Cdecl flushall (void);
int _Cdecl fputchar (int c);
int _Cdecl getw (FILE *stream);
int _Cdecl putw (int w, FILE *stream);
char *_Cdecl _strerror(const char *s);
int _Cdecl unlink (const char *path);

#endif

int _Cdecl _fgetc (FILE *stream); /* used by getc() macro */
int _Cdecl _fputc (char c, FILE *stream); /* used by putc() macro */

/* The following macros provide for common functions */

#define ferror(f) ((f)->flags & _F_ERR)
#define feof(f) ((f)->flags & _F_EOF)
#define fileno(f) ((f)->fd)
#define remove(path) unlink(path)

#define getc(f) \
((--((f)->level) >= 0) ? (unsigned char)(++(f)->curp)[-1] : \
_fgetc (f))
#define putc(c,f) \
((++((f)->level) < 0) ? (unsigned char)((++(f)->curp)[-1]=(c)) : \
_fputc ((c),f))

#define getchar() getc(stdin)
#define putchar(c) putc((c), stdout)

#define ungetc(c,f) ungetc((c),f) /* traditionally a macro */

#endif

/* stdlib.h

Definitions for common types, variables, and functions.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#if !defined(__STDLIB)
#define __STDLIB

#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned size_t;
#endif

#ifndef _DIV_T
#define _DIV_T
typedef struct {
int quot;
int rem;
} div_t;
#endif

#ifndef _LDIV_T
#define _LDIV_T
typedef struct {
long quot;
long rem;
} ldiv_t;
#endif

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

/* Maximum value returned by "rand" function
*/
#define RAND_MAX 0x7FFF

typedef void _Cdecl (* atexit_t)(void);

void _Cdecl abort (void);
int _Cdecl abs (int x);
int _Cdecl atexit (atexit_t func);
double _Cdecl atof (const char *s);
int _Cdecl atoi (const char *s);
long _Cdecl atol (const char *s);
void *_Cdecl bsearch(const void *key, const void *base,
size_t nelem, size_t width,
int _Cdecl (*fcmp)(/* const void *, const void * */));
void *_Cdecl calloc (size_t nitems, size_t size);
div_t _Cdecl div (int numer, int denom);
void _Cdecl exit (int status);
void _Cdecl free (void *block);
char *_Cdecl getenv (const char *name);
long _Cdecl labs (long x);
ldiv_t _Cdecl ldiv (long numer, long denom);
void *_Cdecl malloc (size_t size);
void _Cdecl qsort (void *base, size_t nelem, size_t width,
int _Cdecl (*fcmp)(/* const void *, const void * */));
int _Cdecl rand (void);
void *_Cdecl realloc(void *block, size_t size);
void _Cdecl srand (unsigned seed);
double _Cdecl strtod (const char *s, char **endptr);
long _Cdecl strtol (const char *s, char **endptr, int radix);
unsigned long _Cdecl strtoul (const char *s, char **endptr, int radix);
int _Cdecl system (const char *command);

#if !__STDC__

#ifndef NULL
#if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
#define NULL 0
#else
#define NULL 0L
#endif
#endif

/* Variables */
extern int _Cdecl _doserrno;
extern char **_Cdecl environ;
extern int _Cdecl errno;
extern int _Cdecl _fmode;
extern unsigned char _Cdecl _osmajor;
extern unsigned char _Cdecl _osminor;
extern unsigned _Cdecl _psp;
extern char *_Cdecl sys_errlist[];
extern int _Cdecl sys_nerr;
extern unsigned int _Cdecl _version;

int _Cdecl __abs__(int x); /* This is an in-line function */
#define abs(x) __abs__(x)
#define atoi(s) ((int) atol (s))

#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))

#define random(num) (rand() % (num))
#define randomize() srand((unsigned)time(NULL))

char *_Cdecl ecvt (double value, int ndig, int *dec, int *sign);
void _Cdecl _exit (int status);
char *_Cdecl fcvt (double value, int ndig, int *dec, int *sign);
char *_Cdecl gcvt (double value, int ndec, char *buf);
char *_Cdecl itoa (int value, char *string, int radix);
void *_Cdecl lfind (const void *key, const void *base,
size_t *num, size_t width,
int _Cdecl (*fcmp)(/* const void *, const void * */));

unsigned long _Cdecl _lrotl(unsigned long val, int count);
unsigned long _Cdecl _lrotr(unsigned long val, int count);

void *_Cdecl lsearch (const void *key, void *base,
size_t *num, size_t width,
int _Cdecl (*fcmp)(/* const void *, const void * */));
char *_Cdecl ltoa (long value, char *string, int radix);
int _Cdecl putenv (const char *name);

unsigned _Cdecl _rotl (unsigned value, int count);
unsigned _Cdecl _rotr (unsigned value, int count);

void _Cdecl swab (char *from, char *to, int nbytes);
char *_Cdecl ultoa (unsigned long value, char *string, int radix);
#endif

#endif
/* string.h

Definitions for memory and string functions.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned size_t;
#endif

void *_Cdecl memccpy (void *dest, const void *src, int c, size_t n);
void *_Cdecl memchr (const void *s, int c, size_t n);
int _Cdecl memcmp (const void *s1, const void *s2, size_t n);
void *_Cdecl memcpy (void *dest, const void *src, size_t n);
int _Cdecl memicmp (const void *s1, const void *s2, size_t n);
void *_Cdecl memmove (void *dest, const void *src, size_t n);
void *_Cdecl memset (void *s, int c, size_t n);
void _Cdecl movedata(unsigned srcseg, unsigned srcoff, unsigned dstseg,
unsigned dstoff, size_t n);
char *_Cdecl stpcpy (char *dest, const char *src);
char *_Cdecl strcat (char *dest, const char *src);
char *_Cdecl strchr (const char *s, int c);
int _Cdecl strcmp (const char *s1, const char *s2);
char *_Cdecl strcpy (char *dest, const char *src);
size_t _Cdecl strcspn (const char *s1, const char *s2);
char *_Cdecl strdup (const char *s);
char *_Cdecl strerror(int errnum);
int _Cdecl stricmp (const char *s1, const char *s2);
size_t _Cdecl strlen (const char *s);
char *_Cdecl strlwr (char *s);
char *_Cdecl strncat (char *dest, const char *src, size_t maxlen);
int _Cdecl strncmp (const char *s1, const char *s2, size_t maxlen);
char *_Cdecl strncpy (char *dest, const char *src, size_t maxlen);
int _Cdecl strnicmp(const char *s1, const char *s2, size_t maxlen);
char *_Cdecl strnset (char *s, int ch, size_t n);
char *_Cdecl strpbrk (const char *s1, const char *s2);
char *_Cdecl strrchr (const char *s, int c);
char *_Cdecl strrev (char *s);
char *_Cdecl strset (char *s, int ch);
size_t _Cdecl strspn (const char *s1, const char *s2);
char *_Cdecl strstr (const char *s1, const char *s2);
char *_Cdecl strtok (char *s1, const char *s2);
char *_Cdecl strupr (char *s);

/* compatibility with other compilers */

#define strcmpi(s1,s2) stricmp(s1,s2)
#define strncmpi(s1,s2,n) strnicmp(s1,s2,n)

#if !__STDC__
char *_Cdecl _strerror (const char *s);
#endif
/* time.h

Struct and function declarations for dealing with time.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#ifndef _TM_DEFINED
#define _TM_DEFINED

#ifndef __TIME_T
#define __TIME_T
typedef long time_t;
#endif

#ifndef __CLOCK_T
#define __CLOCK_T
typedef long clock_t;
#define CLK_TCK 18.2
#endif

struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};

char *_Cdecl asctime (const struct tm *tblock);
char *_Cdecl ctime (const time_t *time);
double _Cdecl difftime(time_t time2, time_t time1);
struct tm *_Cdecl gmtime(const time_t *timer);
struct tm *_Cdecl localtime(const time_t *timer);
time_t _Cdecl time (time_t *timer);
clock_t _Cdecl clock(void);

#if !__STDC__
extern int _Cdecl daylight;
extern long _Cdecl timezone;

int _Cdecl stime(time_t *tp);
void _Cdecl tzset(void);
#endif

#endif
/* values.h

Symbolic names for important constants, including machine
dependencies. A System V compatible header.

Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

#ifndef _VALUES_H
#define _VALUES_H

#define BITSPERBYTE 8
#define MAXSHORT 0x7FFF
#define MAXINT 0x7FFF
#define MAXLONG 0x7FFFFFFFL
#define HIBITS 0x8000
#define HIBITI 0x8000
#define HIBITL 0x80000000

#define DMAXEXP 308
#define FMAXEXP 38
#define DMINEXP -307
#define FMINEXP -37

#define MAXDOUBLE 1.797693E+308
#define MAXFLOAT 3.37E+38
#define MINDOUBLE 2.225074E-308
#define MINFLOAT 8.43E-37

#define DSIGNIF 53
#define FSIGNIF 24

#define DMAXPOWTWO 0x3FF
#define FMAXPOWTWO 0x7F
#define _DEXPLEN 11
#define _FEXPLEN 8
#define _EXPBASE 2
#define _IEEE 1
#define _LENBASE 1
#define HIDDENBIT 1
#define LN_MAXDOUBLE 7.0978E+2
#define LN_MINDOUBLE -7.0840E+2

#endif

WrtHz24(100,100,12,14,11,2,"飞飞F:\TC\INCLUDE\STDARG.H硤�");
getch();F:\TC\INCLUDE\STDIO.H鲌�
TC86 Borland Turbo C 2.0 鼒閄9HZ.H&堥losegraph();

--
※ 修改:．que 于 Dec 13 14:28:14 修改本文．[FROM: 210.34.87.10]
※ 来源:．庭芳苑 bbs.fzu.edu.cn．[FROM: 210.34.87.10]


C语言讨论

饮水思源站 C语言讨论 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 小议C/C++语言编译器 jia | 3031 | 00/03/11 01:43
文件 | C 语言的特点 jia | 1298 | 00/03/11 01:43
文件 | 各种C的比较 jia | 2094 | 00/03/11 01:43
文件 | 让人恼火的破C和C++!!!!!!!!!!!!!!!!!!! Passer | 435 | 00/03/11 01:43
文件 | Re: 让人恼火的破C和C++!!!!!!!!!!!!!!!! hhfeng | 659 | 00/03/11 01:43
文件 | 我真的不知咋办? jia | 9365 | 00/03/31 20:17


发信人: LuYunFeng.bbs@210.34.48.50 (Pencil end), 信区: C
标 题: 小议C/C++语言编译器
发信站: FZU_BBS (Tue Apr 7 09:35:47 1998)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
今天的心情非常好，就说一点关于C/C++编译器的事：

我只是进入过BC 5.0一次,运行过WATCOM C 11ver. 的安装程序一次，对于
MSC/C++ 7.0只是用到它的C部分,但TC2.0 与TC++ 3.0就用的比较多---至少在前一
段时间内.但现在我似乎更喜爱MSC/C++ 7.0.因为它支持SVGA的图形模式.

有关于4WIN类的如VC,VB.....我都没有接触过.所以,若你在看这篇小议时,
若你是可视化+4WIN编程的高手请不要发冷笑.

在更久的以前,我试着在TC,TC++中用大模式下分配超过64K的静态数组,可以说,
它们让我摸不着头脑,或失望.后来我的机子LEVEL-UP后,我装了MSC/C++ 7.0,我发现
我的想象力得到了发挥,虽然一开始不太习惯于它的编译器.它被我中意的原因在于
它可以在HUGE模式下分配大于64K的静态数组,我在那次通过后觉的无比高兴.很好,
在一段时间后,我喜爱上了它的编译器.我对它在如:
__ASM
{
....
LES DI,STRING ;STRING为C的数组名
...
}
中的表现非常欣赏.要知道,以上内链的一句,在TC++中就不会通过.

像这样的好处还有好多,它对汇编的内链语句支持的更多,更广,胜于TURBO系列.
总之,对于我对MSC/C++的评价是:支持SVGA图形模式,支持更科学的汇编内链.这实
际上是对游戏的人来说是比较得利的.但是说起它的缺点也不少,比如前几天在编改
变MOUSE的形状这样EASY的东东上,它就表现的非常差,同样的一段程序在TC++上就可
以通过的在它这儿也可以通过,但却不是我所希望的结果-----一块16X16的乱七八糟
的MOUSE图标.还有就是它的编辑器PWB的编辑不是太好用,比较笨.

对于TC,TC++,BC/C++的编译器,它们写的还不错(个人认为),比较简明,不似PWB
那么多的选项(但PWB的选项多却不觉的烦),在TC++有一个BUG就是这样:
ASM{ ASM
{
.... ....
} }
上面看似相似的左右两个内链ASM组结构,在左边的可以通过,而右边的就不行------
这曾经让我苦恼了好久.这似乎显得很好笑.

有关于BC的编译器我就不是常用,因为它的体积太大,3.1版18HD,当初我在花钱
买盘COPY时就是因为这点所以选择了MSC7因为它只要11HD,但后来在MSC7的使用初期
给我带来了一些不便,如它在DOS启动时要使用DPMI,这便使我差不多浪费了一个暑假,
因为我在买MSC时不知,所以没有连386MAX这样的软件一同买.我的家不在FZ,所以在下
学期的寒假前我就在上次买MSC的计算机系楼一层的研究所买了386MAX.这时我不禁想
到那儿昂贵的拷贝费和上机费5元/3小时,还只是4/80.有了MSC的使用,寒假过的既痛
苦又幸福,就像恋爱,与MSC.

总之,如果你要用MSC7的话,就必须先安装如:386MAX这类的DPMI.然后,也许你的
机子不要太烂,要想编一点SVGA下的东东,就用它的一些图形库,但你别指望它的图形
库能编出如WOLF3D这么快的GAMES,但你可以利用它的内链汇编写,也就就会更好.但
如果你只是编一些C的东东,就用TC,它比较快,而且简单,不需要很好的机器.至于BC
就是TC/TC++的扩展深入,我了解不多,没有资格发言.

--
※ 来源:．庭芳苑 bbs.fzu.edu.cn．[FROM: 210.34.51.184]


发信人: jia (小木头), 信区: C
标 题: C 语言的特点
发信站: 饮水思源站 (Fri Nov 19 21:10:20 1999) , 站内信件

C 语言发展如此迅速, 而且成为最受欢迎的语言之一, 主要因为它具有强大的
功能。许多著名的系统软件, 如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 语言编写的。
用C 语言加上一些汇编语言子程序, 就更能显示C 语言的优势了, 象PC- DOS 、
WORDSTAR等就是用这种方法编写的。归纳起来C 语言具有下列特点:
1. C是中级语言
它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以象
汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。
2. C是结构式语言
结构式语言的显著特点是代码及数据的分隔化, 即程序的各个部分除了必要的
信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调
试。C 语言是以函数形式提供给用户的, 这些函数可方便的调用, 并具有多种循
环、条件语句控制程序流向, 从而使程序完全结构化。
3. C语言功能齐全
C 语言具有各种各样的数据类型, 并引入了指针概念, 可使程序效率更高。另
外C 语言也具有强大的图形功能, 支持多种显示器和驱动器。而且计算功能、逻辑
判断功能也比较强大, 可以实现决策目的。
4. C语言适用范围大
C 语言还有一个突出的优点就是适合于多种操作系统, 如DOS、UNIX,也适用于
多种机型。

--
再见！
相逢在下一个路口！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.162]


发信人: jia (小木头), 信区: C
标 题: 各种C的比较
发信站: 饮水思源站 (Thu Nov 4 18:11:58 1999) , 站内信件
各种C的比较
lone
在Windows的世界里, BC,VC, Symantec C, Watcom C等都有各自的
开发环境(IDE, Integral Development Enviornment), 就我个人
的体会而言, Visual C++ 4.X的环境最好用. Debug, Resource Editor,
Version Control, Help等都集成在一起, 使用方便. 就C/C++本身而言,
它们相互之间大同小异, 都向最新的AT&T C++标准看齐. 当然, 代码
生成质量相差较大. 据BYTE杂志测试, WatComm C/C++的代码质量最好,
Borland C/C++最差, MS Visual C++居中. 这是Borland C 5.0和Visual C++ 4.0
推出之前的结果, 有兴趣的话可参阅95年的BYTE(WWW Server, http://www.byte.com)
在Windows(包括Win3x, Win95, NT)下, 一个重要问题是做界面. C++的
类库在这里发挥着极大的影响. BC的类库(OWL)最全, 层次较高, 界面编程
的体会而言, Visual C++ 4.X的环境最好用. Debug, Resource Editor,
Version Control, Help等都集成在一起, 使用方便. 就C/C++本身而言,
它们相互之间大同小异, 都向最新的AT&T C++标准看齐. 当然, 代码
生成质量相差较大. 据BYTE杂志测试, WatComm C/C++的代码质量最好,
Borland C/C++最差, MS Visual C++居中. 这是Borland C 5.0和Visual C++ 4.0
推出之前的结果, 有兴趣的话可参阅95年的BYTE(WWW Server, http://www.byte.com)
在Windows(包括Win3x, Win95, NT)下, 一个重要问题是做界面. C++的
类库在这里发挥着极大的影响. BC的类库(OWL)最全, 层次较高, 界面编程
方便. VC的MFC则较为逊色, 与SDK接近. WatCom C则仅采用低版本的MFC
作为类库.
如果界面不是主要问题, 则我推荐使用UNIX环境下的gcc/g++, 这是GNU
的完全free的software之一. 可在大多数main stream的UNIX版本和硬件
平台下使用. 比如SunOS/Solaris, IBM AIX, BSD Unix, Sco UNIX, Linux
等等等等. 代码生成质量高. UNIX的稳定性和代码级的夸平台可移植性早已
为大家所公认. 但有一个user friendly的问题, 你只能用命令行加Makefile
的方式做开发, 对用惯了PC机的用户而言, 是极不习惯的. 对于老UNIX用户,
则feel at home. IBM的AIX有个开发环境, 但实在不敢恭维.
在UNIX下做界面, 一个是字符的curses, 另外就是X Window了. 不如Windows
下方便, 但也差强人意了. 看一看X Window下Motif风格的Netscape就知道了.

--
再见！
相逢在下一个路口！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: Passer (匆匆过客), 信区: C
标 题: 让人恼火的破C和C++!!!!!!!!!!!!!!!!!!!
发信站: 饮水思源站 (Sun Jun 28 19:57:31 1998) , 站内信件
这两天竟拿他们编程许了，破玩意，灵活简洁高效的表达方式确实让我欣喜了一阵，
不过那破动动的纠错能力也太差劲了，没有越界检查，而我的很多程序错误不是出在
逻辑，偏偏在这该死的边界上，一越界就容易死机，不止各位大侠感觉如何？

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.118.5.134]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: 让人恼火的破C和C++!!!!!!!!!!!!!!!!!!!
发信站: 饮水思源站 (Sun Jun 28 20:39:09 1998) , 站内信件
【 在 Passer (匆匆过客) 的大作中提到: 】
: 这两天竟拿他们编程许了，破玩意，灵活简洁高效的表达方式确实让我欣喜了一阵，
: 不过那破动动的纠错能力也太差劲了，没有越界检查，而我的很多程序错误不是出在
: 逻辑，偏偏在这该死的边界上，一越界就容易死机，不止各位大侠感觉如何？

这是 C / C++ 最大的缺陷, 另一方面也是最大的好处.

我认为 C / C++ 最大的缺陷在于:

1. 没有边界判断. 类型转化不严格.

2. 用户要自己管理内存.

但是, 换来的就是效率和灵活性.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


open: Permission denied
发信人: huangjielei (庐山大侠), 信区: C
标 题: 我真的不知咋办?
发信站: 饮水思源站 (Tue Mar 21 13:17:09 2000), 转信
我学完C的语法和库函数.
又将学<<数据结构>>
越学越独孤!
仿佛成了古人!迷惘迷惘,将不知去想何方!现在的舆论导向和我的老师
都让我学VC,可我想朝程序员的方向走,(要考C)
又不想成为古人!!我咋办????

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.35.243.28]
open: Permission denied
发信人: laodao (FoolCat), 信区: C
标 题: Re: 我真的不知咋办?
发信站: 饮水思源站 (Tue Mar 21 13:22:22 2000), 转信

怕什么？有了C的基础和面向对象的概念，VC上手是很快的，
要精通的话，只是熟能生巧罢了！
【 在 huangjielei 的大作中提到: 】
: 我学完C的语法和库函数.
: 又将学<<数据结构>>
: 越学越独孤!
: 仿佛成了古人!迷惘迷惘,将不知去想何方!现在的舆论导向和我的老师
: 都让我学VC,可我想朝程序员的方向走,(要考C)
: 又不想成为古人!!我咋办????

--

你在看我!
你还在看我!
你再看我!
我就把你喝掉!
哈哈!

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.113.116]
发信人: luckyfang (老K), 信区: C
标 题: Re: 我真的不知咋办?
发信站: 饮水思源站 (Tue Mar 21 15:22:31 2000), 转信

VC有一个月就可以搞定的, 如果你C++很熟悉的话.
其实不冲突的.

【 在 huangjielei 的大作中提到: 】
: 我学完C的语法和库函数.
: 又将学<<数据结构>>
: 越学越独孤!
: 仿佛成了古人!迷惘迷惘,将不知去想何方!现在的舆论导向和我的老师
: 都让我学VC,可我想朝程序员的方向走,(要考C)
: 又不想成为古人!!我咋办????

--

我的心中早已不再有火花,

就让网事都随风去吧!

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.197]
发信人: scene (风云), 信区: C
标 题: Re: 我真的不知咋办?
发信站: 饮水思源站 (Tue Mar 21 15:59:34 2000), 站内信件

【 在 luckyfang (老K) 的大作中提到: 】
: VC有一个月就可以搞定的, 如果你C++很熟悉的话.
~~佩服，偶学了一年，却越来越觉得VC浩翰如海
: 其实不冲突的.
: 【 在 huangjielei 的大作中提到: 】
: : 我学完C的语法和库函数.
: : 又将学<<数据结构>>
: : 越学越独孤!
: : 仿佛成了古人!迷惘迷惘,将不知去想何方!现在的舆论导向和我的老师
: : 都让我学VC,可我想朝程序员的方向走,(要考C)
: : 又不想成为古人!!我咋办????

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.112.140.166]
发信人: Brierbird (荆棘鸟★知音难遇), 信区: C
标 题: Re: 我真的不知咋办?
发信站: 饮水思源站 (Tue Mar 21 16:40:25 2000), 转信

这位仁兄好厉害。能不能交个朋友。本人学VC也有近一年的时间了。可是越学越觉
得VC博大精深，恐怕我看近年之内是很难精研之。
如果仁兄有什么高招，请赐教。小弟千恩万谢。

【 在 luckyfang (老K) 的大作中提到: 】
: VC有一个月就可以搞定的, 如果你C++很熟悉的话.
: 其实不冲突的.
: 【 在 huangjielei 的大作中提到: 】
: : 我学完C的语法和库函数.
: : 又将学<<数据结构>>
: : 越学越独孤!
: : 仿佛成了古人!迷惘迷惘,将不知去想何方!现在的舆论导向和我的老师
: : 都让我学VC,可我想朝程序员的方向走,(要考C)
: : 又不想成为古人!!我咋办????

--
Brierbird(荆棘鸟★知音难遇)

知音如不赏，归卧故山丘。

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 166.111.162.98]
发信人: luckyfang (老K), 信区: C
标 题: Re: 我真的不知咋办?
发信站: 饮水思源站 (Tue Mar 21 20:39:22 2000), 转信

VC里用的主要是继承和多态性， 理解上还是容易的。
如果要编什么大程序，自然很难，但那就不属于VC本身的范畴了。
你用VB,JAVA实现起来照样是难的。

【 在 Brierbird (荆棘鸟★知音难遇) 的大作中提到: 】
: 这位仁兄好厉害。能不能交个朋友。本人学VC也有近一年的时间了。可是越学越觉
: 得VC博大精深，恐怕我看近年之内是很难精研之。
: 如果仁兄有什么高招，请赐教。小弟千恩万谢。
: 【 在 luckyfang (老K) 的大作中提到: 】
: : VC有一个月就可以搞定的, 如果你C++很熟悉的话.
: : 其实不冲突的.

--

我的心中早已不再有火花,

就让网事都随风去吧!

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.220]
发信人: huangjielei (庐山大侠), 信区: C
标 题: Re: 我真的不知咋办?
发信站: 饮水思源站 (Wed Mar 22 12:19:27 2000), 转信

昨日老师又狂轰烂炸一番，
说他是过来人，学C的思维和学VC是两吗事
就是说学C越迷，到时转VC难度越大，
把他学这的经历一说，说饿哦心寒，（叫我不要执迷不误了）
他说C只要了解了解就可以了，
呜。。（我还是迷惘，没主见，到时一事无成！）【 在 huangjielei 的大作中提到: 】
: 我学完C的语法和库函数.
: 又将学<<数据结构>>
: 越学越独孤!
: 仿佛成了古人!迷惘迷惘,将不知去想何方!现在的舆论导向和我的老师
: 都让我学VC,可我想朝程序员的方向走,(要考C)
: 又不想成为古人!!我咋办????

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.35.243.28]
发信人: akey (魔蓝), 信区: C
标 题: Re: 我真的不知咋办?
发信站: 饮水思源站 (Wed Mar 22 16:39:37 2000), 转信

别听他瞎说, 拿VC和C比就说明他语言没学好, C/C++是语言基础, VC只是C/C++的一个
实现, 有什么矛盾的? 把C学好了再学C++, 以后找工作随便用什么编译器都是一样的.
【 在 huangjielei (庐山大侠) 的大作中提到: 】
: 昨日老师又狂轰烂炸一番，
: 说他是过来人，学C的思维和学VC是两吗事
: 就是说学C越迷，到时转VC难度越大，
: 把他学这的经历一说，说饿哦心寒，（叫我不要执迷不误了）
: 他说C只要了解了解就可以了，
: 呜。。（我还是迷惘，没主见，到时一事无成！）【 在 huangjielei 的大作中提到: 】
: : 我学完C的语法和库函数.
: : 又将学<<数据结构>>
: : 越学越独孤!
: : 仿佛成了古人!迷惘迷惘,将不知去想何方!现在的舆论导向和我的老师
: : 都让我学VC,可我想朝程序员的方向走,(要考C)
: : 又不想成为古人!!我咋办????

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.240.52]
发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 我真的不知咋办?
发信站: 饮水思源站 (Sat Mar 25 03:21:20 2000), 转信

有理，你老师是谁，这么捣浆糊，这么烂都在交大上课？
C和VC对比，真可以上笑话版了。
C同C++有不同，主要是C++引入面向对象的概念。而这概念
的深化需要时间和经验。但是C是基础。从未听说过有C++高手
不是C高手的。VC只不过是一个工具而已。其精华部分是MFC，
提供了比较方便的编程工具。你不用VC，也可以用Inprise(前身
是Borland)的C++ Builder。我入这行已有十年，还第一次
听人将C和VC对比的。
你老师估计是位滥竽充数的哥们。兄弟们还是自己看看书，不要
给他给误了。
akey的话很对，这才是真正懂程序的人。

【 在 akey (魔蓝) 的大作中提到: 】
: 标 题: Re: 我真的不知咋办?
: 发信站: 饮水思源站 (Wed Mar 22 16:39:37 2000), 转信
:
: 别听他瞎说, 拿VC和C比就说明他语言没学好, C/C++是语言基础, VC只是C/C++的一个
: 实现, 有什么矛盾的? 把C学好了再学C++, 以后找工作随便用什么编译器都是一样的.
: 【 在 huangjielei (庐山大侠) 的大作中提到: 】
: : 昨日老师又狂轰烂炸一番，
: : 说他是过来人，学C的思维和学VC是两吗事
: : 就是说学C越迷，到时转VC难度越大，
: : 把他学这的经历一说，说饿哦心寒，（叫我不要执迷不误了）
: : 他说C只要了解了解就可以了，
: : 呜。。（我还是迷惘，没主见，到时一事无成！）【 在 huangjielei 的大作中提到: 】
: : : 我学完C的语法和库函数.
: : : 又将学<<数据结构>>
: : : 越学越独孤!
: : : 仿佛成了古人!迷惘迷惘,将不知去想何方!现在的舆论导向和我的老师
: : : 都让我学VC,可我想朝程序员的方向走,(要考C)
: : : 又不想成为古人!!我咋办????
:
:
: --
: ※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.240.52]

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 206.86.196.155]
发信人: huangjielei (庐山大侠), 信区: C
标 题: Re: 我真的不知咋办?
发信站: 饮水思源站 (Sat Mar 25 13:21:19 2000), 转信

感激涕泠，犹如拨云见日！【 在 tonyxu (无斋主人) 的大作中提到: 】
: 有理，你老师是谁，这么捣浆糊，这么烂都在交大上课？
: C和VC对比，真可以上笑话版了。
: C同C++有不同，主要是C++引入面向对象的概念。而这概念
: 的深化需要时间和经验。但是C是基础。从未听说过有C++高手
: 不是C高手的。VC只不过是一个工具而已。其精华部分是MFC，
: 提供了比较方便的编程工具。你不用VC，也可以用Inprise(前身
: 是Borland)的C++ Builder。我入这行已有十年，还第一次
: 听人将C和VC对比的。
: 你老师估计是位滥竽充数的哥们。兄弟们还是自己看看书，不要
: 给他给误了。
: akey的话很对，这才是真正懂程序的人。
: 【 在 akey (魔蓝) 的大作中提到: 】
: : 标 题: Re: 我真的不知咋办?
: : 发信站: 饮水思源站 (Wed Mar 22 16:39:37 2000), 转信
: : 别听他瞎说, 拿VC和C比就说明他语言没学好, C/C++是语言基础, VC只是C/C++的一个
: : 实现, 有什么矛盾的? 把C学好了再学C++, 以后找工作随便用什么编译器都是一样的.
: : --
: : ※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.240.52]

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.35.243.27]
发信人: iice (ice), 信区: C
标 题: Re: 我真的不知咋办?
发信站: 饮水思源站 (Sat Mar 25 17:31:14 2000), 转信

我觉得也是，
要想学好VC，
C还是要学好的，
当然C++也是必须学好的，
因为VC中即使MFC也必须能看懂。

【 在 tonyxu (无斋主人) 的大作中提到: 】
: 有理，你老师是谁，这么捣浆糊，这么烂都在交大上课？
: C和VC对比，真可以上笑话版了。
: C同C++有不同，主要是C++引入面向对象的概念。而这概念
: 的深化需要时间和经验。但是C是基础。从未听说过有C++高手
: 不是C高手的。VC只不过是一个工具而已。其精华部分是MFC，
: 提供了比较方便的编程工具。你不用VC，也可以用Inprise(前身
: 是Borland)的C++ Builder。我入这行已有十年，还第一次
: 听人将C和VC对比的。
: 你老师估计是位滥竽充数的哥们。兄弟们还是自己看看书，不要
: 给他给误了。
: akey的话很对，这才是真正懂程序的人。
: 【 在 akey (魔蓝) 的大作中提到: 】
: : 标 题: Re: 我真的不知咋办?
: : 发信站: 饮水思源站 (Wed Mar 22 16:39:37 2000), 转信
: : 别听他瞎说, 拿VC和C比就说明他语言没学好, C/C++是语言基础, VC只是C/C++的一个
: : 实现, 有什么矛盾的? 把C学好了再学C++, 以后找工作随便用什么编译器都是一样的.
: : --
: : ※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.240.52]

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


技术与应用

饮水思源站 技术与应用 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 汉字处理（C FOR DOS） jia | 2727 | 00/03/11 01:43
文件 | 图像平移 jia | 4124 | 00/03/11 01:43
文件 | C语言“switch语句”的使用技巧 jia | 5206 | 00/03/11 01:43
文件 | 用C编文件加密程序 jia | 1588 | 00/03/11 01:43
文件 | 高斯消去法解n维的线性方程组的小程序 jia | 2156 | 00/03/11 01:43
文件 | 自编程挽救软盘数据 hunt. | 1826 | 00/03/11 01:43
文件 | 我们来做日历 huangjielei | 6658 | 00/04/06 19:24
文件 | 用C做的加密程序 huangjielei | 3122 | 00/04/06 19:25
文件 | 自解密的程序制作 huangjielei | 3300 | 00/04/06 19:25


发信人: huafeng.bbs@210.34.48.50 (华枫), 信区: C
标 题: 汉字处理（C FOR DOS）
发信站: FZU_BBS (Mon Apr 13 19:07:33 1998)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
作为一名中国人,在学了C语言的基础后,编程的过程中渐渐开始关注汉字的
处理,怎样在西文下处理汉字?
1.如何在西文下显示UCDOS汉字库(16X或24X汉字库)?
A. 汉字机内码与区位码的换算
区码=汉字的第一字节机内码-0XFFA0/0XA0
位码=汉字的第二字节机内码-0XFFA0/0XA0
注: 因16X汉字库与24X的结构不同,其实0XFFA1与0XA1的意义是一样的.只是
0XFFA1是针对16X汉字库的.也是16X与24X汉字的区别所在.
B. 汉字首地址的计算
汉字首地址=((区码+1-汉字库偏移区)*94+位码+1)*汉字字模字节数
注:16X汉字库的偏移区为0,24X除了HZK24T为0外其余的汉字库偏移为15.
加1表示为:区位码表是从第一区开始的.
C.汉字字模字节的显示
16X字模32字节的排列 24X字模72字节的排列
┌ 8bit ┐
----1---- ----2---- ┌ | |||||| |||||||| ||||||||
----3---- ----4---- 8bit 1 4......................70
----5---- ----6---- └ | |||||| |||||||| ||||||||
----7---- ----.---- 2 5......................71
----.---- ----.---- | |||||| |||||||| ||||||||
----.---- ----.---- 3 6......................72
----15--- ----16--- |||||||| |||||||| ||||||||

/******* 下面以16X为例的程序段 *******/
for(i=0;i<2;i++)
for(j=0;j<16;j++)
for(k=0;k<8;k++)
if(font[j*2+i]&(0x80>>k)) // font[]为存放字模的数组
putpixel(x+i*8+k,y+j,color);

附:24X可参照16X的例子按照字节的排列不同而编出相应的程序.
2. 如何使界面程序完全脱离汉字系统?
第一种方法:
将所需汉字字模通过一定手段从各种汉字库提取,以工程文件或
用C命令行' #include"存放字模的文件" '进行包含到程序中.这样就可.
但速度方面会比较慢.
第二种方法:
事先借助汉字系统造完整个界面.再借助抓图软件将其抓成一个图像
文件,而后编一程序将图像文件显示出来.(最好用PCX.因其解码较简单)

<<---- 待 续 ---->>

--
沧海横流，方显英雄本色。——华 枫
** ** ** ** ** ****** ***** ** ** ***
** ** ** ** ** ** ** ** ** * ** ** **
******** ** ** ******* ****** ***** ** *** **
** ** ** ** ** ** ** ** ** ** ** ***
** ** *** ** ** ** ***** ** ** *** *

※ 来源:．庭芳苑 bbs.fzu.edu.cn．[FROM: 210.34.51.188]


发信人: jia (小木头), 信区: C
标 题: 图像平移
发信站: 饮水思源站 (Sat Nov 20 19:28:40 1999) , 站内信件
图像平移只是改变图像在屏幕上的位置，图像本身并不发生变化。

    假设原图像区域左上角坐标为(x0, y0)，右下角坐标为(x1, y1)，将图像分别沿
x和y轴平移dx和dy，则新图像的左上角坐标为(x0 ＋ dx, y0 ＋ dy)，右下角坐标为(x
1 ＋ dx, y1 ＋ dy)。坐标平移变换公式为：

    x′ = x ＋ dx

    y′ = y ＋ dy

    在屏幕上实现图像的移动分为四个步骤：

    ⑴ 保存原图像到缓冲区。

    ⑵ 擦除原图像。

    ⑶ 计算平移后的新坐标。

    ⑷ 在新的坐标位置重新显示原图像。

    其中，擦除原图像的方法与图形变换中擦除原图形的方法一致，在实现中仍采用
XOR异或方式画图擦除原图像。对于新坐标值的计算还需要考虑边界情况，不要在图像平
移后超出允许的屏幕范围。此外，如果采用C函数getimage()和putimage()来保存和恢复
图像，则图像的大小不能超过64K。

    2．图像颠倒

    图像颠倒是指把定义好的图像区域上下翻转地显示在屏幕上。分析图像颠倒的过
程，可发现每行的图像信息都保持不变，而只是改变了行的顺序，将第一行与最后的第
n行相互交换，第二行与第n － 1行交换……，依此类推，从而实现了图像的颠倒。只需
采用按行交换的方式，即可方便地修改缓冲区内容，实现图像的颠倒。基本步骤如下：

    (1) 用getimage()保存原图像，并擦除原图像。

    (2) 计算图像的高度，即行数height；计算图像宽度width；计算保存一行图像信
息

     height = bottom － top ＋ 1;

    width = right － left ＋ 1;

    linebytes = (width ＋ 7) ／ 8 ＊ 4;

    (3)利用行交换缓冲区linebuf在图像内存缓冲区中进行信息交换，即把第一行与
最末行交换，第2行与第n－1行交换……，依此类推，直至全部交换完毕。

   (4)把交换后的图像缓冲区内容重新显示在屏幕上。

    3．图像镜像变换

    镜像变换是指将指定区域的图像左右翻转地显示在屏幕。分析镜像变换过程可以
发现：每行图像信息的处理方式是相同的，而且行顺序不发生变化，只是每一行的像素
信息按从左到右的顺序进行了左右颠倒，从而实现了镜像变换。因此，采用按行逐点变
换的方式实现图像的镜像。

    首先，对于左上角为（left, top)，右下角为（right, bottom)矩形区域图像，
给出其中任意点（x0, y0）镜像变换后的新坐标（x′, y′）的坐标变换公式：

    x′ = right － x0 ＋ left

    y′ = y0

    根据以上公式，对各个像素点计算新坐标后，直接把它显示在屏幕的相应位置上
。

    如果完全逐点地进行交换，处理一个像素点就要读取一次像素值，从而降低了变
换速度。由于像素点是顺序存放在各个bit位上，每读取一个字节就包含了8个像素点的
信息，只需设置不同的位屏值bitmask，就可以获得不同像素点的信息。因此采用按行逐
字节变换的方式，每读一次就进行8个像素点的变换，以提高变换速度。

    将一矩形区域的图像进行镜像变换的基本步骤如下：

    (1) 用getimage()把图像保存到内存缓冲区，并擦除原图像。

    (2) 计算图像高度，即行数高度height和宽度width；计算保存一行图像信息占用
的字节数linebytes。计算公式如下：

    height = bottom － top ＋ 1;

    width = right － left ＋ 1;

    linebyte = (width ＋ 7) ／ 8 ＊4;

    (3) 对图像进行镜像。

    (4)释放内存图像缓冲区。

    4．图像旋转

    图像旋转是指把定义的图像绕某一点以逆时针或顺时针方向旋转一定的角度，通
常是指绕图像的中心以逆时针方向旋转。

    假设图像的左上角为（left, top),右下角为（right, bottom)，则图像上任意点
（x0, y0）绕其中心（xcenter, ycenter)逆时针旋转angle角度后，新的坐标位置（x′
, y′）的计算公式为：

xcenter = (right － left ＋ 1) ／ 2 ＋ left;

ycenter = (bottom － top ＋ 1) ／ 2 ＋ top;

x′ = (x0 － xcenter) cosθ － (y0 － ycenter) sinθ ＋ xcenter;

y′ = (x0 － xcenter) sinθ ＋ (y0 － ycenter) cosθ ＋ ycenter;

    与图像的镜像变换相类似，也采用按行逐点变换的方式实现图像的旋转，其步骤
如下：

    (1) 用getimage（）把图像保存到内存缓冲区，并擦除原图像。

    (2) 计算图像高度height，宽度width，及保存一行图像信息占用的字节数lineb
ytes，计算公式与镜像变换的计算公式相同。

    (3) 对图像逐行进行旋转变换。

    (4) 释放内存图像缓冲区。

    值得指出的是，这种处理方法不够。为此可以采用另一种方法：先在图像变换缓
冲区中处理完毕后，再将变换后的图像一次显示在屏幕上。这样可以取得较好的显示效
果。

--
再见！
相逢在下一个路口！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.30]


发信人: jia (小木头), 信区: C
标 题: C语言“switch语句”的使用技巧
发信站: 饮水思源站 (Mon Nov 1 16:00:29 1999) , 站内信件
C语言“switch语句”的使用技巧
steve
C语言作为国际上流行的计算机语言已经和正在被广大
的计算机用户使用。凡是使用过的人都会有同样的感觉——C语
言的使用灵活这个特点既是优点又是缺点，因为对精通C语言的
用户来讲，灵活就意味着编程可以无拘无束，甚至随心所欲；
但对初学者或者是尚未摸着规律的用户来说，有时候就会觉得C
程序设计有点象雾里看花，摸不着头脑。因为灵活就意味着没有
一个标准。而实际上，C语言和其它计算机语言一样，只要你真
正掌握了该语言的每一个语句的特点，理解、运用就不难掌握了。
下面就C语言中switch语句的使用特点谈谈自己的体会。

switch语句的格式如下：

switch（表达式）
{case 常量表达式1:语句1
case 常量表达式2:语句2
case 常量表达式3:语句3

case 常量表达式n:语句n
default :语句n+1
}

从表面上看来，switch语句与PASCAL语言中的case语句
以及FOXBASE中的do case语句非常类似，只是关键字有所不同：
一个是switch；而另一个是case或do case。但如果仔细阅读过
教材或有关参考书的话，就绝不会有此想法。从语句的功能上来
看，PASCAL和case语句或FOXBASE的do case语句中的常量表达式
是用来与case后面的表达式比较以确定执行哪一个语句，一旦执
行了某一语句，则会自动地结束这一case后的语句；而C的switch
语句则不然。首先，switch语句中的常量表达式只是起到一个入
口作用，一旦执行了相应的语句后，只要没有强迫中断语句
（break），它就会一直按顺序继续执行下去，也就是会执行其它
case后面的语句，直到遇到“}”符号才停止。乍看觉得有点不可
事议，但若仔细回味且切身编程体会，那么就会感司到C的switch
语句的独到之处。接下来就几个具体例子来剖析：switch语句的
特点以及区别于其它语言中的相应语句的妙处。

----第一个例子：根据输入的百分制成绩，然后给出‘A’～‘E’
相应的等级符（90-100为‘A’、80-89为‘B’、70-79为‘B’、
60-69为‘C’、0-59为‘E’）。主要的处理程序段如下：（temp、
score、grade皆为整型变量）

temp=score/10;
switch（temp）
{case9：grade=‘A’；
case8：grade=‘B’；
case7：grade=‘C’；
case6：grade=‘D’；
case5：grade=‘E’；
}
printf（“thegradeis%c”,grade）；

仔细阅读这段程序（根据C语言的特点），就会发现有很
多错误。首先，对100分和低于50分的情况没有考虑；其次，C语
言的switch特点是顺序执行，那么这段程序不输入的分数如何，
最后的输出都将是‘E’。因此，修改这段程序，可以得到一个正
确答案是：

temp=score/10；
switch（temp）
{case10：
case9：grade=‘A’；break；
case8：grade=‘B’；break；
case7：grade=‘C’；break；
case6：grade=‘D’；break；
case5：
case4：
case3：
case2：
case1：
case0：grade=‘E’；
}
printf（“thegradeis%c,grade”）；

但这么一个结果还不算是一个好的C程序，因为它只是
能得到正确的解，没有真正用到C的特点。如果将C的特点运用到
这段程序中，则程序将优化成如下：

grade=‘A’；
temp=score/10；
switch（temp）
{case0：
case1：
case2：
case3：
case4：
case5：grade++；
case6：grade++；
case7：grade++；
case8：grade++；
case9：
case10：
}
printf（“thegradeis%c,grade”）；

从这段程序中，我们可以体会到前面所说的该语句的特点。

----第二个例子：运输公司对用户计算运费。距离（s）越远，每
公里运费越低。具体标准如下：

s<250 （km） 没有折扣
250<=s<500 （km） 2%折扣
500<=s<1000（km） 5%折扣
1000<=s<2000（km） 8%折扣
2000<=s<3000（km） 10%折扣
3000<=s （km） 15%折扣

设每公里每吨货物的基本运费为p，货物重为w，距离为
s，折扣为d，则总运费计算公式为：

f=p*w*s*(1-d)

分析此问题，折扣的变化是有规律的：折扣的“变化点”
都是250的倍数（250，500，1000，2000，3000）。利用这一特点
，可以再设一变量c，它代表250的倍数。当c<1时，无折扣；
1<=c<2时，折扣为d=2%；2<=c<4时，d=5%；4<=c<8时，d=8%；
8<=c<12时，d=10%；c>=12时，d=15%。所以可以有如下没有错误
的程序段：

scanf（“%f,%f,%d”,&p,&w,&s）；
if（s>=3000）c=12
elsec=s/250
switch（c）
{case0：d=0；break；
case1：d=2；break；
case2：
case3：d=5；break；
case4：
case5：
case6：
case7：d=8；break；
case8：
case9：
case10：
case11：d=10；break；
case12：d=15；
}
f=p*w*s*（1-d/100.0）；
printf（“freight%15.f”,f）；

如同前一个题目，这个程序段也完全可以利用switch特
点，改进优化得到如下程序段：

d=0
scanf（“%f,%f,%k”,&p,&w,&s）；
if（s>=3000）c=12
elsec=s/250
switch（c）
{case12：d+=5；
case11：
case10：
case9：
case8：d+=2；
case7：
case6：
case5：
case4：d+=3；
case3：
case2：d+=3；
case1：d+=2；
case0：
}
f=p*w*s*（1-d/100.0）；
printf（“freight%15.4f”,f）；

从上面两个例子分析，使我们可以比较清楚地看见C语
言中switch语句与其它语言中相应语句的区别。尽管在学习和教
计算机语言的过程中，我们始终认为语言是相通的，这样便于学
习一门新的语言。但是真正要把某一门计算机语言学好，非得掌
握它的特点。

这里仅仅是自己在编程实践过程中的一点体会，有错误
的地方恳请批评指正。

中国计算机世界出版服务公司版权所有

--
★再见！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: zhyy.bbs@bbs.swjtu.edu.cn (知昂), 信区: C
标 题: 用C编文件加密程序
发信站: 锦城驿站 (Thu Jan 15 14:19:41 1998)
转信站: sjtubbs!sjtunews!swjtunews!swjtubbs
Origin: xnjd21.swjtu.edu.cn
在你建入本程序名字后面,建入想加密的文件名和加密后的文件名,
应用此文件时再运行一次即可
#include"stdlib.h"
#include<stdio.h>
main(int n,char *arg[])
{FILE *fp1,fp2;
char c,ch;
long j;
if(n!=3){printf("Error commond\n");
exit(0);}
if((fp1=fopen(arg[1],"rb"))==NULL)
{printf("Can't open file\n");exit(0);}
if((fp2=fopen(arg[2],"wb"))==NULL)
{printf("Can't open file\n");exit(0);}
printf("Enter password:");
scanf("%l",&j);
srand(j);ch=fgetc(fp1);
while(!feof(fp1)){c=rand();ch=ch^c;fputc(ch,fp2);ch=fgetc(fp1);}
fclose(fp1);fclose(fp2);exit(0);

}

--
##########################################
# #
# 生命诚可贵,爱情价更高 #
# 若为自由故,二者皆可抛 #
# #
##########################################

※ 来源:．锦城驿站 bbs.swjtu.edu.cn．[FROM: 202.115.83.27]


发信人: wisi (誓心), 信区: C
标 题: 高斯消去法解n维的线性方程组的小程序
发信站: 饮水思源站 (Fri Dec 10 18:02:32 1999) , 转信
偶不才，各位c语言高手不要笑俺。编了一个用高斯
消去法解n维的线性方程组的小程序，要用要改悉听尊便，
：-）要发表赚钱可得分我一笔。
运行时先输入阶数n,再输入系数行列式p[n][n]，然后是输
入常数列向量b[n].屏幕会输出消元前后的增广矩阵和解。
该程序Turbo C2.0通过。
#include <stdlib.h>
double tabs(double x)
{
x=x>0?x:-x;
return x;
}
main()
{
int n,h,i,j,k;
double *x,*b,**p,*temp,t,sum;
do{ printf("\nInput n:");
scanf("%d",&n);
}while(n<=0||n>=200);
b=(double*)malloc(sizeof(double)*n);
x=(double*)malloc(sizeof(double)*n);
p=(double**)malloc(sizeof(double*)*n);
for(i=0;i<n;i++)
p[i]=(double*)malloc(sizeof(double)*n);
printf("Input p[i][j]:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{ printf("a[%d][%d]:",i+1,j+1);
scanf("%lf",&t);
p[i][j]=t; }/*偶这样写不是自找麻烦，这是turbo c的BUG*/
printf("\n");/*直接写scanf("%lf",&p[i][j]);会出错*/
}
printf("Input b[n]:\n");
for(i=0;i<n;i++)
{ printf("b[%d]:",i);
scanf("%lf",&b[i]); }
for(i=0;i<n;i++)
{ printf("\n");
for(j=0;j<n;j++)
printf("\t%g",p[i][j]);
printf("\t%g",b[i]); }
for(i=0;i<n-1;i++)
{
k=i;
for(j=i;j<n;j++)
{
if(tabs(p[k][i])<tabs(p[j][i]))
k=j;
}
temp=p[i];p[i]=p[k];p[k]=temp;
t=b[i];b[i]=b[k];b[k]=t;
if(p[i][i]==0)
{pintf("\nError!Can't be calculated!");
exit(1);}
for(j=i+1;j<n;j++)
{
b[j]=b[j]-b[i]*(p[j][i]/p[i][i]);
for(h=n-1;h>=i;h--)
p[j][h]-=p[i][h]*p[j][i]/p[i][i];}
}
printf("\n\n");
for(i=0;i<n;i++)
{printf("\n");
for(j=0;j<n;j++)
printf("\t%g",p[i][j]); printf("\t%g",b[i]); }
for(i=n-1;i>=0;i--)
{
sum=b[i];
for(j=i+1;j<n;j++)
sum-=x[j]*(p[i][j]);
if(p[i][i]==0)
{printf("\nError!Can't be calculated! ");
exit(1);}
x[i]=sum/p[i][i];
}
for(i=0;i<n;i++)
printf("%cx[%d]=%.8g",(i%3==0?'\n':'\t'),(i+1),x[i]);
free(p);free(x);free(b);
}

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.189.34]


发信人: hunt.bbs@bbs.swjtu.edu.cn (阿浩), 信区: C
标 题: 自编程挽救软盘数据
发信站: 锦城驿站 (Tue Jul 15 16:16:53 1997)
转信站: sjtubbs!sjtunews!swjtunews!swjtubbs
Origin: xnjd21.swjtu.edu.cn
软盘的FAT表(文件分配表)被损坏时,计算机就不能从软盘上读取数据。
但是,在软盘中有两份完全相同的文件分配表,而DOS在读文件时并不使用
第二张文件分配表,因此,它被损坏的可能性较低。在计算机提示FAT表损
坏时,利用第二张分配表重写第一张文件分配表,往往能成功地挽回你的软
盘上的数据。文件分配表在磁盘中的具体位置及长度视磁盘的规格不同而
不同。
本文提供的程序,用Turbo C 2.0编写,于Dos6.22,UCDOS 3.1下通过。
按照程序的提示,可方便地完成这一工作。
#include [dos.h]
main ()
{int i,j,dh,ch;
a: printf ("Select drive/选定驱动器: (0->A/1->B) \n");
scanf(" %d",&ch);
if (1<ch||ch<0) /*判断输入的驱动器选择是否正确*/
goto a;
printf ("Slect disk/选定磁盘类型:");
printf(" (36->360KB/72->720KB/12->1.2MB/14->1.44MB) \n");
scanf(" %d" ,&dh);/*按选定的软盘类型进行处理*/
switch (dh)
{case 36:/*处理360KB软盘*/
for (i=1; i<3;i++)
{j=j+2
absread(ch,1,j,0);
abswrite (ch,1,i,0);}
break;
case 72: /*处理720KB软盘*/
for (i=1; i<4; i++)
{j=i+3;
absread (ch,1,j,0);
abswrite(ch,1,i,0);}
break;
case 12: /*处理1.2MB软盘*/
for (i=1; i<8; i++)
{j=i+7;
absread (ch,1,j,0);
abswrite (ch,1,i,0);
}
break;
case 14: /*处理1.44MB软盘*/
for (i=1; i<10; i++)
{
j=i+9;
absread (ch,1,j,0);
abswrite (ch,1,i,0);
}
break;
}
printf ("OK!");
}

※ 来源:．锦城驿站 bbs.swjtu.edu.cn．[FROM: 202.115.65.224]


发信人: huangjielei (庐山大侠), 信区: C
标 题: 我们来做日历
发信站: 饮水思源站 (Wed Apr 5 13:50:57 2000), 转信
#include "stdio.h" /* Required for MS-DOS use */
#define ENTER 0x1C0D /* Enter key */
int year, month, day;
static char *days[8] = {" ","Sunday ","Monday ","Tuesday ",
"Wednesday","Thursday ","Friday ","Saturday "};
struct TIMEDATE {
int year; /* year 1980..2099 */
int month; /* month 1=Jan 2=Feb, etc. */
int day; /* day of month 0..31 */
int hours; /* hour 0..23 */
int minutes; /* minute 0..59 */
int seconds; /* second 0..59 */
int hsecs; /* 1/100ths of second 0..99 */
char dateline[47]; /* date & time together */
};
static struct TIMEDATE today;
main()
{
char cmonth[3];
char cday[3];
char cyear[5];
double getdays();
double daynumb, numbnow;
int weekday, retcode, dayer, i;
dayer = datetime(&today);
clrscn();
for (i=0;i<3;++i)cmonth[i]='\0';
for (i=0;i<3;++i)cday[i]='\0';
for (i=0;i<5;++i)cyear[i]='\0';
putstr(5,8,14,"Enter date in MM DD YYYY format:");
while (retcode != ENTER)
{
retcode = bufinp(5,41,13,2,cmonth);
if (retcode != ENTER) retcode = bufinp(5,44,13,2,cday);
if (retcode != ENTER) retcode = bufinp(5,47,13,4,cyear);
}
year = atoi(&cyear);
month = atoi(&cmonth);
day = atoi(&cday);
daynumb = getdays(year, month, day);
numbnow = getdays(today.year, today.month, today.day);
weekday = weekdays(daynumb);
if (numbnow - daynumb == 0)
printf("\n\n%02d-%02d-%d is",month, day, year);
if (numbnow - daynumb > 0)
printf("\n\n%02d-%02d-%d was",month, day, year);
if (numbnow - daynumb < 0)
printf("\n\n%02d-%02d-%d will be",month, day, year);
printf(" a %s\n",days[weekday]);
} /* end MAIN */
/************************************************************
* GETDAYS - From integer values of year (YYYY), month *
* (MM) and day (DD) this subroutine returns a *
* double float number which represents the *
* number of days since Jan 1, 1980 (day 1). *
* This routine is the opposite of GETDATE. *
************************************************************/
double getdays(year, month, day)
int year, month, day;
{
int y,m;
double a,b,d, daynumb;
double floor(),intg();
/**********************************
** make correction for no year 0 **
**********************************/
if (year < 0) y = year + 1;
else y = year;
/*********************************************************
** Jan and Feb are months 13 and 14 in this calculation **
*********************************************************/
m = month;
if (month < 3)
{
m = m + 12;
y = y - 1;
}
/**************************
** calculate Julian days **
**************************/
d = floor(365.25 * y) + intg(30.6001 * (m + 1)) + day - 723244.0;
/**********************************************
** use Julian calendar if before Oct 5, 1582 **
**********************************************/
if (d < -145068.0) daynumb = d;
/*************************************
** otherwise use Gregorian calendar **
*************************************/
else
{
a = floor(y / 100.0);
b = 2 - a + floor(a / 4.0);
daynumb = d + b;
}
return(daynumb);
} /* end GETDAYS */
/********************************************************
* GETDATE - This routine takes a double float number *
* representing the number of days since Jan 1,*
* 1980 (day 1) and returns the year month and *
* day as pointer integers *
* This routine is the opposite of GETDAYS *
********************************************************/
getdate(numb)
double numb;
{
double a,aa,b,c,d,e,z;
double date;

date = numb;
z = intg(date + 2444239.0);
if (date < -145078.0) a = z;
else
{
aa = floor((z - 1867216.25) / 36524.25);
a = z + 1 + aa - floor(aa/4.0);
}
b = a + 1524.0;
c = intg((b - 122.1) / 365.25);
d = intg(365.25 * c);
e = intg((b - d) / 30.6001);
day = b - d - intg(30.6001 * e);
if (e > 13.5) month = e - 13.0;
else month = e - 1.0;
if (month > 2) year = c - 4716.0;
else year = c - 4715.0;
if (year < 1) --year;
return;
} /* end GETDATE */
/********************************************************
* WEEKDAYS - This routine takes a double float number *
* representing the number of days since Jan 1,*
* 1980 (day 1) and returns the day of the week*
* where 1 = Sunday, 2 = Tuesday, etc. *
********************************************************/
int weekdays(numb)
double numb;
{
double dd;
int day;

dd = numb;
while (dd > 28000.0) dd = dd - 28000.0;
while (dd < 0) dd = dd + 28000.0;
day = dd;
day = ((day + 1) % 7) + 1;
return(day);
}
/********************************************************
* FRACT - This routine takes a double float number *
* and returns the fractional part as a double *
* float number *
********************************************************/
double fract(numb)
double numb;
{
int inumb;
double fnumb;

while (numb < -32767) numb += 32767;
while (numb > 32767) numb -= 32767;
inumb = numb;
fnumb = inumb;
return(numb-fnumb);
} /* end FRACT */
/********************************************************
* FLOOR - This routine takes a double float number *
* and returns the next smallest integer *
********************************************************/
double floor(numb)
double numb;
{
double fract(), intg();
double out;
out = intg(numb);
if (numb < 0 && fract(numb) != 0) out -= 1.0;
return(out);
} /* end FLOOR */
/********************************************************
* INTG - This routine takes a double float number *
* and returns the integer part as a double *
* float number *
********************************************************/
double intg(numb)
double numb;
{
double fract();
return(numb - fract(numb));
} /* end INTG */

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.35.243.28]


发信人: huangjielei (庐山大侠), 信区: C
标 题: 用C做的加密程序
发信站: 饮水思源站 (Wed Apr 5 13:11:02 2000), 转信

    ＃include
    ＃include
    void main()
    {char＊password;
     char kl[9]=“88888888”;
     inti=0;
     FILE＊fpl;
     window(1,1,80,25); /＊屏幕背景清屏成蓝色＊/
     textbackground(1);
     clrscr();
     window(17,10,58,13);/＊开阴影窗口＊/
     textbackground(0);
     clrscr();
     for(i=0;i<=2;i＋＋)
    { window(16,9,56,12);
     textattr(14︳2<<4);
     clrscr();
     gotoxy(13,2);
     password=(char＊)getpass("请输入系统口令：");
     textcolor(4);
     /＊若口令文件KLK.CFG存在，则从中取出口令字＊/
     if((fp=fopen("KLK.CFG","rb＋"))!＋NULL)
     { fseek(fp,O,SEEK_SET);
     fgets(kl,9,fp);
     fclose(fp);}
     if(i==2＆＆strcmp(password,kl)!＋0)/＊三次口令无
效退出＊/
     { gotoxy(13,2);
     cputs("口令错误，退出!!");
     getch();exit(0);}
     if(stcmp(password,kl)!=0,
     { gotoxy(13,2);
     cputs("口令错误，重输!!");
     getch();}
     else
     break;
     }
     /＊进入主程序体＊/
     textbackground(1);
     window(1,1,80,25);
     clrscr();
     gotoxy(10,10);
     cputs("执行用户主体程序……按任意键进行更改口
令!");
     getch();
     changkl();/＊用户程序中调用修改口令函数＊/
    }
     changkl() /＊修改口令子函数＊/
    {char＊klk;
     char buf[1];
     FILE＊fp;
     window(17,16,58,19);/＊开阴影窗口＊/
     textbackground(0);
     clrscr();
     window(16,15,56,18);
     textattr(14︳4<<4);
     clrscr();
     gotoxy(8,4);
     cputs("请修改口令字，必须为八位字符");
     gotoxy(14,2);
     klk=(char＊)getpass("请输入新口令:");
     gotoxy(14,2);
     textcolor(2);
     if(srlen(klk)!=8
     {cputs("口令字无效，返回!!");
     getxh();
     return;}
     cputs("口令修改成功!!");
     if((fp=fopen("KLK,CFG"."w"))!=null)/＊保存口令到
文件KLK.CFG＊/
     {fputs(klk,fp);
     buf[0]=0xia;
     fwrite(＆buf[0],1,1,fp);
     fclose(fp); }
     getch();
     returm;
     }

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.35.243.28]


发信人: huangjielei (庐山大侠), 信区: C
标 题: 自解密的程序制作
发信站: 饮水思源站 (Wed Apr 5 13:14:38 2000), 转信

    为了保证自己的数据不被别人非法地窃取，有必要对数据文件进行适当地加密。
本程序采取一定的算法，对密码和数据进行加密，生成一个自解密的EXE文件。这个
自解密文件是由两部分组成的。第一部分为可执行代码部分，其作用是对密码进行
判断，对数据进行解密；后一部分是被加过密的密码和数据。
    本程序分两个模块进行编写。第一个是main.c，它是用来进行加密，产生EXE文
件的；第二个是main2.c，它是用来解密的。分别对它们进行编译生成main.exe和
main2.exe，再对其进行合并即可。
    合并方法如下：
    COPY /B main.EXE＋main2.EXE Key.EXE(注意main.EXET和main2.EXE的顺序)
    使用时请按下列格式键入。
    Key〈欲加密文件〉〈产生后的EXE文件名〉
    按提示输入密码后将生成指定的可执行文件。解密时运行这个可执行文件。输
入密码后(若输入三次都不正确，将退出解密程序)，即把原文件内容还原到你指定
的文件中。解密程序格式如下。
    可执行文件名 (filename)
    源程序如下：
    第一个源代码文件 main.c
    ＃include “stdio.h”
    main (int argc,char ＊argv[])
    {FILE ＊fp0, ＊fp1, ＊fp2;
    char ch,＊password,i,str[10];password=str;
    if(argc!=3)
    {printf(“usage:key ");
    exit(0);
    }
    if((fp0=fopen(argv[0],“rb"))=NULL)
    {printf(“can't open ％s",argv[0]);
    exit(0)
    }
    if((fp1=fopen(argv[1],“r"))=NULL)
    {printf(“can't open ％s")argv[1]);
    exit(0);
    }
    if((fp2=fopen(argv[2],“wb"))=NULL)
    {printf(“can't open ％s",argv[2]);
    }
    password=(char ＊)getpass(“please input password:");
    fseek(fp0,1394OL,SEEK_SET);/＊ 13940是main.exe文件的长度，不同的工作
环境会有不同的值。请以实际长度加以修改 ＊/
    while(!feOf(fp0))
    fputc(fgetc(fp0),fp2);/＊把main2.exe输入fp2指定的文件中＊/
    for(i=0;password[i]!=`10'；i＋＋)
    {fputc((i＋password[i])^i,fp2);/＊将密码加密后写入文件＊/
    }
    fputc(`10',fp2), /＊将“10”放入密码后 ＊/
    do{
    {for(i=0;password[i]!=`10',i＋＋
    {ch=fgetc(fp1) /＊从欲加密文件读一个字符＊/
    if(feof(fp1))break;
    ch=ch^password[i];
    ch＋=i;
    ch=nch; /＊将此字符同密码i值进行运算后写入fp2指定文件＊/
    fputc(ch,fp2)；
    }
    }While(!feof(fp1))；
    fcloseal(c);
    }
    第二个源代码文件main2.c
    ＃include “stdio.h"
    ＃include “string.h"
    main(int argc,char ＊argv[])
    {FILE ＊FP0,＊FP1;
    char ＊password,old password[10],str[10],ch,i;
    if(argc!=2)
    {printf(“Usage=％s",argv[0]);
    exit(o);
    }
    fseek(fp0,16888L,SEEK_SET); /＊同理16888也视实际情况而定＊/
    fgetc(fp0); /＊读掉一个无效字符＊/
    for(i=0;(oldpassword[i]=fget((fp0))!=`10';i＋＋)
    Oldpassword[i]=(oldpassword[i]^i)－i; /＊对密码进行还原＊/
    oldpassword[i]=`10'; /＊把“10”藏于密码后 ＊/
    password=(char ＊)getpass(“please input password:");
    for(i=0;i　　{if(strcmp(password,oldpassword))
    {password=(ch ＊)getpass(“\n password is wrong. \rplease input agai:");
    if(i==2)
    {printf(“\n press any Key to exit……\n");
    getch();exit(o)
    }
    }
    }/＊对密码进行判断，有三次机会，都不正确则返回到操作系统＊/
    do{
    for (i=0;password[i]!=`10';i＋＋)
    {ch=fgetc(fp0);
    if(feof(fp0))break;
    ch=nch;
    ch－=i;
    ch^=password[i];
    }
    }while(!feof(fp0);
    fcloseal(c);
    {

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.35.243.28]


Turbo C

饮水思源站 Turbo C 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Turbo C jia | 2722 | 00/03/11 01:43
文件 | Turbo C 2.0的配置文件 jia | 945 | 00/03/11 01:43
文件 | Turbo C 2.0的安装和启动 jia | 990 | 00/03/11 01:43
文件 | Turbo C 2.0集成开发环境的使用 jia | 13933 | 00/03/11 01:43


发信人: jia (小木头), 信区: C
标 题: Turbo C
发信站: 饮水思源站 (Fri Nov 19 21:12:28 1999) , 站内信件
Turbo C 的产生与发展

Turbo C 是美国Borland 公司的产品,Borland公司是一家专门从事软件开发、

研制的大公司。该公司相继推出了一套 Turbo系列软件, 如Turbo BASIC, Turbo

Pascal, Turbo Prolog, 这些软件很受用户欢迎。该公司在1987年首次推出Turbo

C 1.0 产品, 其中使用了全然一新的集成开发环境, 即使用了一系列下拉式菜单,

将文本编辑、程序编译、连接以及程序运行一体化, 大大方便了程序的开发。1988

年, Borland 公司又推出Turbo C1.5版本, 增加了图形库和文本窗口函数库等, 而

Turbo C 2.0 则是该公司1989年出版的。Turbo C2.0在原来集成开发环境的基础上

增加了查错功能, 并可以在Tiny模式下直接生成.COM (数据、代码、堆栈处在同一

64K 内存中) 文件。还可对数学协处理器 (支持8087/80287/80387等)进行仿真。

Borland 公司后来又推出了面向对象的程序软件包Turbo C++.它继承发展

Turbo C 2.0 的集成开发环境, 并包含了面向对象的基本思想和设计方法。

1991年为了适用Microsoft 公司的Windows 3.0 版本, Borland 公司又将Turbo

C++ 作了更新, 即Turbo C 的新一代产品Borlandc C++也已经问世了。

Turbo C 2.0基本配置要求

Turbo C 2.0可运行于IBM-PC系列微机, 包括XT, AT及IBM 兼容机。 此时要求

DOS 2.0或更高版本支持, 并至少需要448K的RAM, 可在任何彩、单色80列监视器上

运行。支持数学协处理器芯片, 也可进行浮点仿真, 这将加快程序的执行。

Turbo C 2.0内容简介

Turbo C 2.0有六张低密软盘(或两张高密软盘)。下面对Turbo C 2.0的主要文

件作一简单介绍:

INSTALL.EXE 安装程序文件

TC.EXE 集成编译

TCINST.EXE 集成开发环境的配置设置程序

TCHELP.TCH 帮助文件

THELP.COM 读取TCHELP.TCH的驻留程序

README 关于Turbo C的信息文件

TCCONFIG.EXE 配置文件转换程序

MAKE.EXE 项目管理工具

TCC.EXE 命令行编译

TLINK.EXE Turbo C系列连接器

TLIB.EXE Turbo C系列库管理工具

C0?.OBJ 不同模式启动代码

C?.LIB 不同模式运行库

GRAPHICS.LIB 图形库

EMU.LIB 8087仿真库

FP87.LIB 8087库

*.H Turbo C头文件

*.BGI 不同显示器图形驱动程序

*.C Turbo C例行程序(源文件)

其中: 上面的?分别为:

T Tiny(微型模式)

S Small(小模式)

C Compact(紧凑模式)

M Medium(中型模式)

L Large(大模式)

H Huge(巨大模式)

--
再见！
相逢在下一个路口！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.162]


发信人: jia (小木头), 信区: C
标 题: Turbo C 2.0的配置文件
发信站: 饮水思源站 (Fri Nov 19 21:18:05 1999) , 站内信件
所谓配置文件是包含Turbo C 2.0有关信息的文件, 其中存有编译、 连接的选
择和路径等信息。
可以用下述方法建立Turbo C 2.0的配置:
1. 建立用户自命名的配置文件
可以从Options菜单中选择Options/Save options命令, 将当前集成开发环境
的所有配置存入一个由用户命名的配置文件中。下次启动TC时只要在DOS下键入:
tc/c<用户命名的配置文件名>
就会按这个配置文件中的内容作为Turbo C 2.0的选择。
2. 若设置Options/Environment/Config auto save 为on, 则退出集成开发环
境时, 当前的设置会自动存放到Turbo C 2.0配置文件TCCONFIG.TC中。Turbo C 在
启动时会自动寻找这个配置文件。
3. 用TCINST设置Turbo C的有关配置, 并将结果存入TC.EXE中。Turbo C 在启
动时, 若没有找到配置文件, 则取TC.EXE中的缺省值。

--
再见！
相逢在下一个路口！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.162]


发信人: jia (小木头), 信区: C
标 题: Turbo C 2.0的安装和启动
发信站: 饮水思源站 (Fri Nov 19 21:18:50 1999) , 站内信件
Turbo C 2.0的安装非常简单, 只要将1#盘插入A驱动器中, 在DOS的"A>" 下键

入:

A>INSTALL

即可, 此时屏幕上显示三种选择:

1. 在硬盘上创造一个新目录来安装整个Turbo C 2.0系统。

2. 对Turbo C 1.5更新版本。

这样的安装将保留原来对选择项、颜色和编辑功能键的设置。

3. 为只有两个软盘而无硬盘的系统安装Turbo C 2.0。

这里假定按第一种选择进行安装, 只要在安装过程中按对盘号的提示, 顺序插

入各个软盘, 就可以顺利地进行安装, 安装完毕将在C盘根目录下建立一个TC 子目

录, TC下还建立了两个了目录LIB和INCLUDE, LIB子目录中存放库文件, &127;INCLUD
E

子目录中存放所有头文件。

运行Turbo C 2.0时, 只要在TC 子目录下键入TC并回车即可进入Turbo C 2. 0

集成开发环境。

--
再见！
相逢在下一个路口！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.162]


发信人: jia (小木头), 信区: C
标 题: Turbo C 2.0集成开发环境的使用
发信站: 饮水思源站 (Fri Nov 19 21:24:29 1999) , 站内信件

进入Turbo C 2.0集成开发环境中后, 屏幕上显示:

──────────────────────────────

File Edit Run Compile Project Options Debug Break/watch

┌────────────Edit──────────────┐

│ Line 1 Col 1 Insert Indent Tab File Unindent c:NONAME.C│

│ │

│ │

│ │

│ │

│ │

│ │

│ │

│─────────Message─────────────── │

│ │

│ │

└────────────────────────────┘

F1-Help F5-Zoom F6-Switch F7-Trace F8-Step F9-Make F10-Menu

───────────────────────────────

其中顶上一行为Turbo C 2.0 主菜单, 中间窗口为编辑区, 接下来是信息窗

口, 最底下一行为参考行。这四个窗口构成了Turbo C 2.0的主屏幕, 以后的编程、

编译、调试以及运行都将在这个主屏幕中进行。下面详细介绍主菜单的内容。

File(文件)菜单

按Alt+F可进入File菜单, 该菜单包括以下内容:

.Load(加载)

装入一个文件, 可用类似DOS的通配符(如*.C)来进行列表选择。也可装入其它

扩展名的文件, 只要给出文件名(或只给路径)即可。该项的热键为F3, 即只要在主

菜单中按F3即可进入该项, 而不需要先进入File菜单再选此项。

.Pick(选择)

将最近装入编辑窗口的8个文件列成一个表让用户选择, 选择后将该程序装入

编辑区, 并将光标置在上次修改过的地方。其热健为Alt-F3。

.New(新文件)

说明文件是新的, 缺省文件名为NONAME.C, 存盘时可改名。

.Save(存盘)

将编辑区中的文件存盘, 若文件名是NONAME.C时, 将询问是否更改文件名, 其

热键为F2。

.Write to(存盘)

可由用户给出文件名将编辑区中的文件存盘, 若该文件已存在, 则询问要不要

覆盖。

.Directory(目录)

显示目录及目录中的文件, 并可由用户选择。

.Change dir(改变目录)

显示当前目录, 用户可以改变显示的目录。

.Os shell(暂时退出)

暂时退出Turbo C 2.0到DOS提示符下, 此时可以运行DOS 命令, 若想回到

Turbo C 2.0中, 只要在DOS状态下键入EXIT即可。

.Quit(退出)

退出Turbo C 2.0, 返回到DOS操作系统中, 其热键为Alt+X。

说明:

以上各项可用光标键移动色棒进行选择, 回车则执行。也可用每一项的第一个

大写字母直接选择。若要退到主菜单或从它的下一级菜单列表框退回均可用Esc键,

Turbo C 2.0所有菜单均采用这种方法进行操作, 以下不再说明。

编辑界面

Edit(编辑)菜单

按Alt+E可进入编辑菜单, 若再回车, 则光标出现在编辑窗口, 此时用户可以

进行文本编辑。

编辑方法基本与wordstar相同, 可用F1键获得有关编辑方法的帮助信息。

与编辑有关的功能键如下:

F1 获得Turbo C 2.0编辑命令的帮助信息

F5 扩大编辑窗口到整个屏幕

F6 在编辑窗口与信息窗口之间进行切换

F10 从编辑窗口转到主菜单

编辑命令简介:

PageUp 向前翻页

PageDn 向后翻页

Home 将光标移到所在行的开始

End 将光标移到所在行的结尾

Ctrl+Y 删除光标所在的一行

Ctrl+T 删除光标所在处的一个词

Ctrl+KB 设置块开始

Ctrl+KK 设置块结尾

Ctrl+KV 块移动

Ctrl+KC 块拷贝

Ctrl+KY 块删除

Ctrl+KR 读文件

Ctrl+KW 存文件

Ctrl+KP 块文件打印

Ctrl+F1 如果光标所在处为Turbo C 2.0库函数, 则获得有关该函数的帮助

信息

Ctrl+Q[ 查找Turbo C 2.0双界符的后匹配符

Ctrl+Q] 查找Turbo C 2.0双界符的前匹配符

说明:

1. Turbo C 2.0的双界符包括以下几种符号:

花括符 {和}

尖括符 <和>

圆括符 (和)

方括符 [和]

注释符 /*和*/

双引号 "

单引号 '

2. Turbo C 2.0在编辑文件时还有一种功能, 就是能够自动缩进, 即光标定位

和上一个非空字符对齐。在编辑窗口中, Ctrl+OL为自动缩进开关的控制键。

编辑界面

Run(运行)菜单

按Alt+R可进入Run菜单, 该菜单有以下各项:

.Run(运行程序)

运行由Project/Project name项指定的文件名或当前编辑区的文件。如果对上

次编译后的源代码未做过修改,

将一个C源文件编译生成.OBJ目标文件, 同时显示生成的文件名。 其热键为

Alt+F9。

.Make EXE file(生成执行文件)

此命令生成一个.EXE的文件, 并显示生成的.EXE文件名。其中.EXE文件名是下

面几项之一。

1. 由Project/Project name说明的项目文件名。

2. 若没有项目文件名, 则由Primary C file说明的源文件。

3. 若以上两项都没有文件名, 则为当前窗口的文件名。

.Link EXE file(连接生成执行文件)

把当前.OBJ文件及库文件连接在一起生成.EXE文件。

.Build all(建立所有文件)

重新编译项目里的所有文件, 并进行装配生成.EXE文件。该命令不作过时检查

(上面的几条命令要作过时检查, 即如果目前项目里源文件的日期和时间与目标文

件相同或更早, 则拒绝对源文件进行编译)。

.Primary C file(主C文件)

当在该项中指定了主文件后, 在以后的编译中, 如没有项目文件名则编译此项

中规定的主C文件, 如果编译中有错误, 则将此文件调入编辑窗口, 不管目前窗口

中是不是主C文件。

.Get info(获得有关当前路径、源文件名、源文件字节大小、编译中的错误数

目、可用空间等信息。

编辑界面

Project(项目)菜单

按Alt+P可进入Project菜单, 该菜单包括以下内容:

.Project name(项目名)

项目名具有.PRJ的扩展名, 其中包括将要编译、连接的文件名。例如有一个程

序由file1.c, file2.c, file3.c组成, 要将这3个文件编译装配成一个file.exe的

执行文件, 可以先建立一个file.prj的项目文件, 其内容如下:

file1.c

file2.c

file3.c

此时将file.prj放入Project name项中, 以后进行编译时将自动对项目文件中

规定的三个源文件分别进行编译。然后连接成file.exe文件。

如果其中有些文件已经编译成.OBJ文件, 而又没有修改过, 可直接写上.OBJ扩

展名。此时将不再编译而只进行连接。

例如: file1.obj

file2.c

file3.c

将不对file1.c进行编译, 而直接连接。

说明:

当项目文件中的每个文件无扩展名时, 均按源文件对待, 另外, 其中的文件也

可以是库文件, 但必须写上扩展名.LIB。

.Break make on(中止编译)

由用户选择是否在有Warining(警告)、Errors(错误)、Fatal Errors( 致命错

误)时或Link(连接)之前退出Make编译。

.Auto dependencies(自动依赖)

当开关置为on, 编译时将检查源文件与对应的.OBJ文件日期和时间, 否则不进

行检查。

.Clear project(清除项目文件)

清除Project/Project name中的项目文件名。

.Remove messages(删除信息)

把错误信息从信息窗口中清除掉。

编辑界面

Options(选择菜单)

按Alt+O可进入Options菜单, 该菜单对初学者来说要谨慎使用。

.Compiler(编译器)

本项选择又有许多子菜单, 可以让用户选择硬件配置、存储模型、调试技术、

代码优化、对话信息控制和宏定义。这些子菜单如下:

Model

共有Tiny, small, medium, compact, large, huge 六种不同模式可由同户选

择。

Define

打开一个宏定义框, 同户可输入宏定义。多重定义可同分号, 赋值可用等号。

Code generation

它又有许多任选项, 这些任选项告诉编译器产生什么样的目标代码。

Calling convention 可选择C或Pascal方式传递参数。

Instruction set 可选择8088/8086或80186/80286指令系列。

Floating point 可选择仿真浮点、数学协处理器浮点或无浮点运算。

Default char type 规定char的类型。

Alignonent 规定地址对准原则。

Merge duplicate strings 作优化用, 将重复的字符串合并在一起。

Standard stack frame 产生一个标准的栈结构。

Test stack overflow 产生一段程序运行时检测堆栈溢出的代码。

Line number 在.OBJ文件中放进行号以供调试时用。

OBJ debug information 在.OBJ文件中产生调试信息。

Optimization

Optimize for 选择是对程序小型化还是对程序速度进行优

化处理。

Use register variable 用来选择是否允许使用寄存器变量。

Register optimization 尽可能使用寄存器变量以减少过多的取数操

作。

Jump optimization　　　 通过去除多余的跳转和调整循环与开关语句

的办法, 压缩代码。

Source

Indentifier length 说明标识符有效字符的个数, 默认为32个。

Nested comments 是否允许嵌套注释。

ANSI keywords only　　　是只允许ANSI关键字还是也允许Turbo C

2.0关键字

Error

Error stop after 多少个错误时停止编译, 默认为25个。

Warning stop after　　　多少个警告错误时停止编译, 默认为100个。

Display warning

Portability warning 移植性警告错误。

ANSI Violations 侵犯了ANSI关键字的警告错误。

Common error　　　 常见的警告错误。

Less common error 少见的警告错误。

Names 用于改变段(segment)、 组( group) 和类

(class)的名字, 默认值为CODE,DATA,BSS。

.Linker(连接器)

本菜单设置有关连接的选择项, 它有以下内容:

Map file menu 选择是否产生.MAP文件。

Initialize segments　　　是否在连接时初始化没有初始化的段。

Devault libraries 是否在连接其它编译程序产生的目标文件时去寻

找其缺省库。

Graphics library 是否连接graphics库中的函数。

Warn duplicate symbols 当有重复符号时产生警告信息。

Stack warinig 是否让连接程序产生No stack的警告信息。

Case-sensitive link 是否区分大、小写字。

.Environment(环境)

本菜单规定是否对某些文件自动存盘及制表键和屏幕大小的设置

Message tracking

Current file 跟踪在编辑窗口中的文件错误。

All files 跟踪所有文件错误。

Off 不跟踪。

Keep message 编译前是否清除Message窗口中的信息。

Config auto save 选on时, 在Run, Shell或退出集成开发环境之前,

如果Turbo C 2.0的配置被改过, 则所做的改动

将存入配置文件中。选off时不存。

Edit auto save 是否在Run或Shell之前, 自动存储编辑的源文件。

Backup file 是否在源文件存盘时产生后备文件(.BAK文件)。

Tab size 设置制表键大小, 默认为8。

Zoomed windows 将现行活动窗口放大到整个屏幕, 其热键为F5。

Screen size 设置屏幕文本大小。

.Directories(路径)

规定编译、连接所需文件的路径, 有下列各项:

Include directories 包含文件的路径, 多个子目录用";"分开。

Library directories 库文件路径, 多个子目录用";"分开。

Output directoried 输出文件(.OBJ, .EXE, .MAP文件)的目录。

Turbo C directoried Turbo C 所在的目录。

Pick file name 定义加载的pick文件名, 如不定义则从current

pick file中取。

.Arguments(命令行参数)

允许用户使用命令行参数。

.Save options(存储配置)

保存所有选择的编译、连接、调试和项目到配置文件中, 缺省的配置文件为

TCCONFIG.TC。

.Retrive options

装入一个配置文件到TC中, TC将使用该文件的选择项。

编辑界面

七、Debug(调试)菜单

按Alt+D可选择Debug菜单, 该菜单主要用于查错, 它包括以下内容:

Evaluate

Expression 要计算结果的表达式。

Result 显示表达式的计算结果。

New value 赋给新值。

Call stack 该项不可接触。而在Turbo C debuger 时用于检

查堆栈情况。

Find function 在运行Turbo C debugger时用于显示规定的函数。

Refresh display 如果编辑窗口偶然被用户窗口重写了可用此恢复

编辑窗口的内容。

编辑界面

Break/watch(断点及监视表达式)

按Alt+B可进入Break/watch菜单, 该菜单有以下内容:

Add watch 向监视窗口插入一监视表达式。

Delete watch 从监视窗口中删除当前的监视表达式。

Edit watch 在监视窗口中编辑一个监视表达式。

Remove all watches 从监视窗口中删除所有的监视表达式。

Toggle breakpoint 对光标所在的行设置或清除断点。

Clear all breakpoints 清除所有断点。

View next breakpoint 将光标移动到下一个断点处。

--
再见！
相逢在下一个路口！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.162]


C语言教室

饮水思源站 C语言教室 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | C语言教程(1) jia | 860 | 00/03/11 01:43
文件 | C语言教程(2) jia | 1087 | 00/03/11 01:43
文件 | C语言教程(3) jia | 1160 | 00/03/11 01:43
文件 | 编程中的细节--指针(fwd) jia | 3956 | 00/03/11 01:43
文件 | 基本数据类型 jia | 5320 | 00/03/11 01:43
文件 | 结构 jia | 8844 | 00/03/11 01:43
文件 | 枚举 jia | 5394 | 00/03/11 01:43
文件 | 联合 jia | 2522 | 00/03/11 01:43
文件 | 轻松学指针 huangjielei | 17219 | 00/04/06 19:25
文件 | 关于结构体 luckyfang | 495 | 00/04/15 18:43
文件 | Re: 学C是否要先学汇编？ wolfking. | 1247 | 00/04/29 13:44


发信人: jia (小木头), 信区: C
标 题: C语言教程(1)
发信站: 饮水思源站 (Thu Nov 4 18:02:53 1999) , 站内信件
C语言教程(1)
简介

1. 基本组成部分紧凑简洁:只有32个标准的关键字,45个标准的运算符
以及9个控制语句;
2. 数据结构丰富移植性好:提供编写结构化程序所需要的各种数据结构
和控制结构,与硬件操作有关的数据可通过调用系统提供的库函数实现,
方便程序的移植.

基本知识

一. 数据类型和算术表达式:
1. 数据类型及其常量:
(1).整型变量及其常量: 用来存放整型数据(即不带小数点的数).例
如: int i1 ; int abs ; int a,b,c,d ; 整型变量以三种数制
表示:
<1>. 十进制整型常量,取值 0-9 .
<2>. 十六进制整型常量,取值 0-F,以0x开头 .
<3>. 八进制整型常量,取值 0-7,以0开头 .

--
再见！
相逢在下一个路口！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: jia (小木头), 信区: C
标 题: C语言教程(2)
发信站: 饮水思源站 (Thu Nov 4 18:03:40 1999) , 站内信件
C语言教程(2)
2. 算术运算符.赋值运算符及其表达式:
(1).加 ( + ) (2).减 ( - ) (3).乘 ( * ) (4).除 ( \ )
(5).取模 ( % ) (6).增值 ( ++ ) (7).减值 ( -- )
(8).赋值 ( = )
其中有优先级的区别,也可在"="之前加上其他运算符构成复合运
算符: 如: "+=","-=","*=","\="和"%=".
3. 不同类型数据间的转换:
(1).自动类型转换:
<1> 当单.双精度浮点型数据赋给整型变量时,浮点数的小数部
分将被舍弃;
<2> 当整型数据赋给浮点型变量时,在数值上不发生变化,仅是
简单地转化为浮点型数据模式;
<3> 如果某个运算符的两个运算对象都是整型数,那么运算按照
整型数的运算规则,结果仍为整型数,然后赋予其他变量.
<4> 只要某个算术运算符的两个运算对象中有一个是浮点型数据,
则运算将按照浮点型格式来进行,即结果的小数部分被保留.

(2).强制类型转换: 形式类似为: 类型名 表达式,得到的是一个所需

--
再见！
相逢在下一个路口！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: jia (小木头), 信区: C
标 题: C语言教程(3)
发信站: 饮水思源站 (Thu Nov 4 18:04:23 1999) , 站内信件
C语言教程(3)
三. 数据的输入输出:
1. 数据的输入:
<1>.格式化输入函数scanf,调用格式为scanf(格式控制,地址表):
[1].格式控制,主要由"%"和格式字符组成.
%c:用来输入单个字符.
%d:用来输入十进制整数.{长整数时,使用%ld;短整数时,使用%hd}
%e:用来输入浮点数.
%f:同%e.
%o:用来输入八进制整数.{长整数时,使用%lo;短整数时,使用%ho}
%s:用来输入以'\0'为结束标志的字符串.
%x:用来输入十六进制整数.{长整数时,使用%lx;短整数时,使用%hx}
[2].地址表:由变量的地址组成,变量间用逗号隔开,地址可由取地址
运算符"&"得到.
[3].使用注意:每个格式符都应有一类型一致的变量与之相对应,若说
明符之间没有任何字符时,输入数据时,缺省用"空格"."TAB"."?"
和"回车"键作两个数据间的间隔,可在说明符前面加上数字指定输
入数据的列长.如: int a ; scanf("%5d",&a) ;
<2>.字符输入函数getchar,调用格式为char c ; c=getchar() ;

--
再见！
相逢在下一个路口！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: jia (小木头), 信区: C
标 题: 编程中的细节--指针(fwd)
发信站: 饮水思源站 (Thu Nov 4 18:07:47 1999) , 站内信件
编程中的细节--指针(fwd)
qgy
C中的指针是最方便和灵活的，也是最头疼的
。在链表的建立过程中，大家一般都用指针，那么请看
下面一段程序：

struct item_t {
typename Someinfo;
item_t * Next; //下一个结构的指针。
}

int built (item_t * head) //以head为头建立一个链表
{
item_t * Temp;

temp =Head;
for (int i=0;i<ITEMNUM;i++) {
temp =(item_t *) malloc (sizeof (item_t));
if (temp==NULL)
return 0;
temp =temp->Next;
}
return 1;
}
短短的一段程序，想当然的写成了这样，其中有将近四个错误
一是传进来的 head 在函数里没有任何改变。二是就算 head
在函数里被改变，可对于调用者 built (pointer) 来说，
在函数调用结束之后pointer的值并没有任何改变！！第三，
让我们来看看建立过程，先为temp分配一段空间，然后再将temp
置为temp->next,我们不妨在这儿将程序改为

temp1 =temp;//新增加的语句
temp =temp->next;
然后又循环过来，又给temp分配空间，注意！！temp1->next的
值并没有改变，程序所做的只是将temp重新赋了一个值而已！

这样的程序只有出毛病的份了。

现将上一次的程序加上一个函数

int add (item_t * obj);
功能是将obj指向的结构放在链表的尾端，函数体如下：

int add (item_t * obj)
{
item_t * Temp;

if (obj==NULL)
return 0;

Temp =head;//head为一全局变量，为队列的头指针。
while (Temp->Next!=NULL) {
Temp =Temp->Next;
}
Temp->Next =obj;
return 1;
}

这里首先有一个问题：如果队列为空如何处理？
于是需要加入如下程序段：

if (head==NULL) {
head =obj;
return 0;
}
可是运行这样的程序是要冒极大的风险的，因为函数包括
了以下的几个约定：

１：所有的item_t类型的元素被初始化时，他的
Next 指针必须被初始化为 NULL.
２：所有传递给 add (item_t *) 的指针必须是
    不同元素的地址！而且最好是用动态分配的。

如果这两条没有被很好的遵守的话，麻烦就来了，看如下
的调用：

:
:
for (int i=0;i<10;i++) {
item_t test;
test.Someinfo =make_a_new_info (.....);
test.Next =NULL;
add (&test);
}
:
:
你试着想象一下结果好吗？

再有如下的例子：
void add_some_item (void)
{
item_t test;
test.someinfo =make_a_new_info (....);
test.Next =NULL;
add (&test);
}
在函数执行完毕之后，test的内存将被释放掉，也就是说，在
以head为头的链表中，有一个悬空的指针！！！这会造成系统
的崩溃！！！
�
指针的错误是举不胜举的。
再看下面一个：
Ｃ语言里，数组名是被看作指针来使用的，
一维数组是指针，二维数组是指向指针的指针，三
维是.........

看下面的例子：

void show (int * * info,int x,int y)//打印一个x*y的数组的内容
{
int i,j;
for (i=0;i<x;i++) {
for (j=0;j<y;j++) {
printf ("%d ",info[i][j]);
}
printf ("\n");
}
}

在进行如下调用之后，你的系统有崩溃的可能！

void Function (void)
{
int as [10][10];
:
:
show (as,10,10);
:
:

--
再见！
相逢在下一个路口！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: jia (小木头), 信区: C
标 题: 基本数据类型
发信站: 饮水思源站 (Wed Jan 26 18:00:41 2000), 转信
整型(int)
一、整型数说明
加上不同的修饰符, 整型数有以下几种类型;
signed short int 有符号短整型数说明。简写为short或int, 字长为2
字节共16位二进制数, 数的范围是-32768~32767。
signed long int 有符号长整型数说明。简写为long, 字长为4字节共
32位二进制数, 数的范围是-2147483648~2147483647。
unsigned short int 无符号短整型数说明。简写为unsigned int, 字长
为2字节共16位二进制数, 数的范围是0~65535。
unsigned long int 无符号长整型数说明。简写为unsigned long, 字长
为4字节共32位二进制数, 数的范围是0~4294967295。
二、整型变量定义
可以用下列语句定义整型变量
int a, b; /*a、b被定义为有符号短整型变量*/
unsigned long c; /*c被定义为无符号长整型变量*/
三、整型常数表示
按不同的进制区分, 整型常数有三种表示方法:
十进制数: 以非0开始的数
如:220, -560, 45900
八进制数: 以0开始的数
如:06; 0106, 05788
十六进制数:以0X或0x开始的数
如:0X0D, 0XFF, 0x4e
另外, 可在整型常数后添加一个"L"或"l"字母表示该数为长整型数, 如22L,
0773L, 0Xae4l。
返回页首
浮点型(float)
一、浮点数说明
Turbo C中有以下两种类型的浮点数:
float 单浮点数。字长为4 个字节共32 位二进制数, 数的范围是
3.4x10-38E~3.4x10+38E。
double 双浮点数。字长为 8个字节共 64 位二进制数, 数的范围是
1.7x10-308E~1.7x10+308E。
说明:
浮点数均为有符号浮点数, 没有无符号浮点数。
二、浮点型变量定义
可以用下列语句定义浮点型变量:
float a, f; /*a, f被定义为单浮点型变量*/
double b; /*b被定义为双浮点型变量*/
三、浮点常数表示
例如: +29.56, -56.33, -6.8e-18, 6.365
说明:
1. 浮点常数只有一种进制(十进制)。
2. 所有浮点常数都被默认为double。
3. 绝对值小于1的浮点数, 其小数点前面的零可以省略。如:0.22可写为.22,
-0.0015E-3可写为-.0015E-3。
4. Turbo C默认格式输出浮点数时, 最多只保留小数点后六位。
返回页首
字符型(char)
加上不同的修饰符, 可以定义有符号和无符号两种类型的字符型变量, 例如:
char a: /*a被定义为有符号字符变量*/
unsigned char l; /*l被定义为无符号字符变量*/
字符在计算机中以其ASCII码方式表示, 其长度为1个字节, 有符号字符型数
取值范围为-128~127, 无符号字符型数到值范围是0~255。因此在Turbo C语言中,
字符型数据在操作时将按整型数处理, 如果某个变量定义成char, 则表明该变量
是有符号的, 即它将转换成有符号的整型数。
Turbo C中规定对ASCII码值大于0x80的字符将被认为是负数。例如ASCII 值
为0x8c的字符, 定义成char时, 被转换成十六进制的整数0xff8c 。 这是因当
ASCII码值大于0x80时, 该字节的最高位为1, 计算机会认为该数为负数, 对于
0x8c表示的数实际上是-74(8c的各位取反再加1), 而-74 转换成两字节整型数并
在计算机中表示时就是0xff8c( 对0074 各位取反再加1) 。 因此只有定义为
unsigned char 0x8c转换成整型数时才是8c。这一点在处理大于0x80的ASCII码
字符时(例如汉字码)要特别注意。一般汉字均定义为unsigned char(在以后的程
序中会经常碰到)。
另外, 也可以定义一个字符型数组(关于数组后面再作详细介绍), 此时该数
组表示一个字符串。
例如:
char str[10];
计算机在编译时, 将留出连续10个字符的空间, 即str[0]到str[9]共10个变
量, 但只有前9个供用户使用。第10个str[9]用来存放字符串终止符NULL即"\0",
但终止符是编编译程序自动加上的, 这一点应特别注意。
二、字符常数表示
能用符号表示的字符可直接用单引号括起来表示, 如'a', '9', 'Z', 也可用
该字符的ASCII码值表示, 例如十进制数85表示大写字母'U', 十六进制数0x5d表示
']', 八进制数0102表示大写字母'B'。
一些不能用符号表示的控制符, 只能用ASCII码值来表示, 如十进制数10 表示
换行, 下六进制数0x0d表示回车, 八进制数033表示Esc。Turbo C2.0中也有另外一
种表示表示方法, 如'\033'表示Esc, 这里'\ 0' 符号后面的数字表示十六进制的
ASCII值当然这种表示方法也适用于可睦接用符号表示的字符。
另外, Turbo C2.0中有些常用的字符用以下特殊规定来表示:
规定符 等价于 含义
'\f' '\X0C' 换页
'\r' '\X0D' 回车
'\t' '\X09' 制表键
'\n' '\X0A' 换行
'\\' '\X5C' \符
'\'' '\X27' '符
'\"' '\X22' "符
对于字符串常量, 一般用双引号括起来表示, 如"Hello Turbo C2.0"。
返回页首
指针型(*)
指针是一种特殊的数据类型, 在其它语言中一般没有。指针是指向变量的地址,
实质上指针就是存贮单元的地址。 根据所指的变量类型不同, 可以是整型指针
(int *)、浮点型指针(float *)、字符型指针(char *)、结构指针(struct *)和联
合指针(union *)(结构指针和联合指针将在第4节中介绍)。
返回页首

无值型(void)
无值型字节长度为0, 主要有两个用途: 一是明确地表示一个函数不返回任何
值; 一是产生一个同一类型指针(可根据需要动态分配给其内存)。
例如:
void *buffer; /*buffer被定义为无值型指针*/

--
jia2002@yahoo.com.cn

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: bbs.szptt.net.cn]


发信人: jia (小木头), 信区: C
标 题: 结构
发信站: 饮水思源站 (Wed Jan 26 18:02:02 2000), 转信

结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。
结构中可以使用不同的数据类型。
1. 结构说明和结构变量定义
在Turbo C中, 结构也是一种数据类型, 可以使用结构变量, 因此, 象其它
类型的变量一样, 在使用结构变量时要先对其定义。
定义结构变量的一般格式为:
struct 结构名
{
类型 变量名;
类型 变量名;
...
} 结构变量;
结构名是结构的标识符不是变量名。
类型为第二节中所讲述的五种数据类型(整型、浮点型、字符型、 指针型和
无值型)。
构成结构的每一个类型变量称为结构成员, 它象数组的元素一样, 但数组中
元素是以下标来访问的, 而结构是按变量名字来访问成员的。
下面举一个例子来说明怎样定义结构变量。
struct string
{
char name[8];
int age;
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
} person;
这个例子定义了一个结构名为string的结构变量person, 如果省略变量名
person, 则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义
时上例变成:
struct string
{
char name[8];
int age;
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
};
struct string person;
如果需要定义多个具有相同形式的结构变量时用这种方法比较方便, 它先作
结构说明, 再用结构名来定义变量。
例如:
struct string Tianyr, Liuqi, ...;
如果省略结构名, 则称之为无名结构, 这种情况常常出现在函数内部, 用这
种结构时前面的例子变成:
struct
{
char name[8];
int age;
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
} Tianyr, Liuqi;
2. 结构变量的使用
结构是一个新的数据类型, 因此结构变量也可以象其它类型的变量一样赋值、
运算, 不同的是结构变量以成员作为基本变量。
结构成员的表示方式为:
结构变量.成员名
如果将"结构变量.成员名"看成一个整体, 则这个整体的数据类型与结构中
该成员的数据类型相同, 这样就可象前面所讲的变量那样使用。
下面这个例子定义了一个结构变量, 其中每个成员都从键盘接收数据, 然后
对结构中的浮点数求和, 并显示运算结果, 同时将数据以文本方式存入一个名为
wage.dat的磁盘文件中。请注意这个例子中不同结构成员的访问。
例3:
#include <stdio.h>
main()
{
struct{ /*定义一个结构变量*/
char name[8];
int age;
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
}a;
FILE *fp;
float wage;
char c='Y';
fp=fopen("wage.dat", "w"); /*创建一个文件只写*/
while(c=='Y'||c=='y') /*判断是否继续循环*/
{
printf("\nName:");
scanf("%s", a.name); /*输入姓名*/
printf("Age:");
scanf("%d", &a.wage); /*输入年龄*/
printf("Sex:");
scanf("%d", a.sex);
printf("Dept:");
scanf("%s", a.depart);
printf("Wage1:");
scanf("%f", &a.wage1); /*输入工资*/
printf("Wage2:");
scanf("%f", &a.wage2);
printf("Wage3:");
scanf("%f", &a.wage3);
printf("Wage4:");
scanf("%f", &a.wage4);
printf("Wage5:");
scanf("%f", &a.wage5);
wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5;
printf("The sum of wage is %6.2f\n", wage);/*显示结果*/
fprintf(fp, "%10s%4d%4s%30s%10.2f\n", /*结果写入文件*/
a.name, a.age, a.sex, a.depart, wage);
while(1)
{
printf("Continue?<Y/N>");
c=getche();
if(c=='Y'||c=='y'||c=='N'||c=='n')
break;
}
}
fclose(fp);
}
3. 结构数组和结构指针
结构是一种新的数据类型, 同样可以有结构数组和结构指针。
一、结构数组
结构数组就是具有相同结构类型的变量集合。假如要定义一个班级40个同学
的姓名、性别、年龄和住址, 可以定义成一个结构数组。如下所示:
struct{
char name[8];
char sex[2];
int age;
char addr[40];
}student[40];
也可定义为:
struct string{
char name[8];
char sex[2];
int age;
char addr[40];
};
struct string student[40];
需要指出的是结构数组成员的访问是以数组元素为结构变量的, 其形式为:
结构数组元素.成员名
例如:
student[0].name
student[30].age
实际上结构数组相当于一个二维构造, 第一维是结构数组元素, 每个元素是
一个结构变量, 第二维是结构成员。
注意:
结构数组的成员也可以是数组变量。
例如:
struct a
{
int m[3][5];
float f;
char s[20];
}y[4];
为了访问结构a中结构变量y[2]的这个变量, 可写成
y[2].m[1][4]
二、结构指针
结构指针是指向结构的指针。它由一个加在结构变量名前的"*" 操作符来定
义, 例如用前面已说明的结构定义一个结构指针如下:
struct string{
char name[8];
char sex[2];
int age;
char addr[40];
}*student;
也可省略结构指针名只作结构说明, 然后再用下面的语句定义结构指针。
struct string *student;
使用结构指针对结构成员的访问, 与结构变量对结构成员的访问在表达方式
上有所不同。结构指针对结构成员的访问表示为:
结构指针名->结构成员
其中"->"是两个符号"-"和">"的组合, 好象一个箭头指向结构成员。例如要
给上面定义的结构中name和age赋值, 可以用下面语句:
strcpy(student->name, "Lu G.C");
student->age=18;
实际上, student->name就是(*student).name的缩写形式。
需要指出的是结构指针是指向结构的一个指针, 即结构中第一个成员的首地
址, 因此在使用之前应该对结构指针初始化, 即分配整个结构长度的字节空间,
这可用下面函数完成, 仍以上例来说明如下:
student=(struct string*)malloc(size of (struct string));
size of (struct string)自动求取string结构的字节长度, malloc() 函数
定义了一个大小为结构长度的内存区域, 然后将其诈地址作为结构指针返回。
注意:
1. 结构作为一种数据类型, 因此定义的结构变量或结构指针变量同样有局
部变量和全程变量, 视定义的位置而定。
2. 结构变量名不是指向该结构的地址, 这与数组名的含义不同, 因此若需
要求结构中第一个成员的首地址应该是&[结构变量名]。
4. 结构的复杂形式
一、嵌套结构
嵌套结构是指在一个结构成员中可以包括其它一个结构, Turbo C 允许这种
嵌套。
例如: 下面是一个有嵌套的结构
struct string{
char name[8];
int age;
struct addr address;
} student;
其中: addr为另一个结构的结构名, 必须要先进行, 说明, 即
struct addr{
char city[20];
unsigned lon zipcode;
char tel[14];
}
如果要给student结构中成员address结构中的zipcode赋值, 则可写成:
student.address.zipcode=200001;
每个结构成员名从最外层直到最内层逐个被列出, 即嵌套式结构成员的表达
方式是:
结构变量名.嵌套结构变量名.结构成员名
其中: 嵌套结构可以有很多, 结构成员名为最内层结构中不是结构的成员名。

二、位结构
位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构
比按位运算符更加方便。
位结构定义的一般形式为:
struct位结构名{
数据类型 变量名: 整型常数;
数据类型 变量名: 整型常数;
} 位结构变量;
其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整
数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。
变量名是选择项, 可以不命名, 这样规定是为了排列需要。
例如: 下面定义了一个位结构。
struct{
unsigned incon: 8; /*incon占用低字节的0~7共8位*/
unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
unsigned blink: 1; /*blink占用高字节的第7位*/
}ch;
位结构成员的访问与结构成员的访问相同。
例如: 访问上例位结构中的bgcolor成员可写成:
ch.bgcolor

注意:
1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长
度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,
如果是指针, 其成员访问方式同结构指针。
3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字
节。
4. 位结构成员可以与其它结构成员一起使用。
例如:
struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned state: 1;
unsigned pay: 1;
}workers;'
上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结
构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工
人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间.

--
jia2002@yahoo.com.cn

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: bbs.szptt.net.cn]


发信人: jia (小木头), 信区: C
标 题: 枚举
发信站: 饮水思源站 (Wed Jan 26 18:03:02 2000), 转信

枚举是一个被命名的整型常数的集合, 枚举在日常生活中很常见。
例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,
SATURDAY, 就是一个枚举。
枚举的说明与结构和联合相似, 其形式为:
enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],
...
标识符[=整型常数],
} 枚举变量;
如果枚举没有初始化, 即省掉"=整型常数"时, 则从第一个标识符开始, 顺
次赋给标识符0, 1, 2, ...。但当枚举中的某个成员赋值后, 其后的成员按依次
加1的规则确定其值。
例如下列枚举说明后, x1, x2, x3, x4的值分别为0, 1, 2, 3。
enum string{x1, x2, x3, x4}x;
当定义改变成:
enum string
{
x1,
x2=0,
x3=50,
x4,
}x;
则x1=0, x2=0, x3=50, x4=51
注意:
1. 枚举中每个成员(标识符)结束符是",", 不是";", 最后一个成员可省略
","。
2. 初始化时可以赋负数, 以后的标识符仍依次加1。
3. 枚举变量只能取枚举说明结构中的某个标识符常量。
例如:
enum string
{
x1=5,
x2,
x3,
x4,
};
enum strig x=x3;
此时, 枚举变量x实际上是7。

类 型 说 明
类型说明的格式为:
typedef 类型 定义名;
类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型。这
里类型是Turbo C许可的任何一种数据类型。定义名表示这个类型的新名字。
例如: 用下面语句定义整型数的新名字:
typedef int SIGNED_INT;
使用说明后, SIGNED_INT就成为int的同义词了, 此时可以用SIGNED_INT 定
义整型变量。
例如: SIGNED_INT i, j;(与int i, j等效)。
但 long SIGNED_INT i, j; 是非法的。
typedef同样可用来说明结构、联合以及枚举。
说明一个结构的格式为:
typedef struct{
数据类型 成员名;
数据类型 成员名;
...
} 结构名;
此时可直接用结构名定义结构变量了。例如:
typedef struct{
char name[8];
int class;
char subclass[6];
float math, phys, chem, engl, biol;
} student;
student Liuqi;
则Liuqi被定义为结构数组和结构指针。
在第二节讲过的文件操作中, 用到的FILE就是一个已被说明的结构, 其说明
如下:
typedef struct
{
short level;
unsigned flags;
char fd;
unsigned char hold;
short bsize;
unsigned char *buffer;
unsigned char *curp;
unsigned istemp;
short token;
} FILE
这个结构说明已包含在stdio.h中, 用户只要直接用FILE 定义文件指针变量
就可以。事实上, 引入类型说明的目的并非为了方便, 而是为了便于程序的移植。

预 处 理 指 令
由ANSI的标准规定, 预处理指令主要包括:
#define
#error
#if
#else
#elif
#endif
#ifdef
#ifndef
#undef
#line
#pragma
由上述指令可以看出, 每个预处理指令均带有符号"#"。下面只介绍一些常
用指令。
1. #define 指令
#define指令是一个宏定义指令, 定义的一般形式是:
#define 宏替换名字符串(或数值)
由#define指令定义后, 在程序中每次遇到该宏替换名时就用所定义的字符
串(或数值)代替它。
例如: 可用下面语句定义TRUE表示数值1, FALSE表示0。
#define TRUE 1
#define FALSE 0
一旦在源程序中使用了TRUE和FALSE, 编译时会自动的用1和0代替。
注意:
1. 在宏定义语名后没有";"
2. 在Turbo C程序中习惯上用大写字符作为宏替换名, 而且常放在程序开头。
3. 宏定义还有一个特点, 就是宏替换名可以带有形式参数, 在程序中用到
时, 实际参数会代替这些形式参数。
例如:
#define MAX(x, y) (x>y)?x:y
main()
{
int i=10, j=15;
printf("The Maxmum is %d", MAX(i, j);
}
上例宏定义语句的含义是用宏替换名MAX(x, y)代替x, y中较大者, 同样也
可定义:
#define MIN(x, y) (x<y)?x:y
表示用宏替换名MIN(x, y)代替x, y中较小者。
2. #error指令
该指令用于程序的调试, 当编译中遇到#error指令就停止编译。其一般形式
为:
#error 出错信息
出错信息不加引号, 当编译器遇到这个指令时, 显示下列信息并停止编译。
Fatal: filename linename error directive
3. #include 指令
#include 指令的作用是指示编译器将该指令所指出的另一个源文件嵌入
#include指令所在的程序中, 文件应使用双引号或尖括号括起来。Turbo C 库函
数的头文件一般用#include指令在程序开关说明。
例如:
#include <stdio.h>
程序也允许嵌入其它文件, 例如:
main()
{
#include <help.c>
}
其中help.c为另一个文件, 内容可为
printf("Glad to meet you here!");
上例编译时将按集成开发环境的Options/Directories/Include directories
中指定的包含文件路径查找被嵌入文件。

4. #if、#else、#endif指令
#if、#els和#endif指令为条件编择指令, 它的一般形式为:
#if 常数表达式
语句段;
#else
语句段;
#endif
上述结构的含义是: 若#if指令后的常数表达式为真, 则编译#if到#else 之
间的程序段; 否则编译#else到#endif之间的程序段。
例如:
#define MAX 200
main()
{
#if MAX>999
printf("compiled for bigger\n");
#else
printf("compiled for small\n");
#endif
}

5. #undef指令
#undef指令用来删除事先定义的宏定义, 其一般形式为:
#undef 宏替换名
例如:
#define TRUE 1
...
#undef TURE
#undef主要用来使宏替换名只限定在需要使用它们的程序段中

--
jia2002@yahoo.com.cn

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: bbs.szptt.net.cn]


发信人: jia (小木头), 信区: C
标 题: 联合
发信站: 饮水思源站 (Wed Jan 26 18:03:45 2000), 转信
. 联合说明和联合变量定义
联合也是一种新的数据类型, 它是一种特殊形式的变量。
联合说明和联合变量定义与结构十分相似。其形式为:
union 联合名{
数据类型 成员名;
数据类型 成员名;
...
} 联合变量名;
联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型
和不同长度的变量。
下例表示说明一个联合a_bc:
union a_bc{
int i;
char mm;
};
再用已说明的联合可定义联合变量。
例如用上面说明的联合定义一个名为lgc的联合变量, 可写成:
union a_bc lgc;
在联合变量lgc中, 整型量i和字符mm公用同一内存位置。
当一个联合被说明时, 编译程序自动地产生一个变量, 其长度为联合中最大
的变量长度。
联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,
但定义为指针时, 也要用"->"符号, 此时联合访问成员可表示成:
联合名->成员名
另外, 联合既可以出现在结构内, 它的成员也可以是结构。
例如:
struct{
int age;
char *addr;
union{
int i;
char *ch;
}x;
}y[10];
若要访问结构变量y[1]中联合x的成员i, 可以写成:
y[1].x.i;
若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成:
*y[2].x.ch;
若写成"y[2].x.*ch;"是错误的。
2. 结构和联合的区别
结构和联合有下列区别:
1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻,
联合中只存放了一个被选中的成员, 而结构的所有成员都存在。
2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存
在了, 而对于结构的不同成员赋值是互不影响的。
下面举一个例了来加对深联合的理解。
例4:
main()
{
union{ /*定义一个联合*/
int i;
struct{ /*在联合中定义一个结构*/
char first;
char second;
}half;
}number;
number.i=0x4241; /*联合成员赋值*/
printf("%c%c\n", number.half.first, mumber.half.second);
number.half.first='a'; /*联合中结构成员赋值*/
number.half.second='b';
printf("%x\n", number.i);
getch();
}
输出结果为:
AB
6261
从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值;
当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高八
位.

--
jia2002@yahoo.com.cn

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: bbs.szptt.net.cn]


发信人: huangjielei (庐山大侠), 信区: C
标 题: 轻松学指针
发信站: 饮水思源站 (Wed Apr 5 13:30:46 2000), 转信

为初学者服务。这是我的帖子的宗旨。我也是个初学者（强调了无数遍了）
，我以我的理解把初学者觉得难懂的东西用浅显的语言写出来。由于小学时语文
没学好，所以竭尽全力也未必能达到这个目的。尽力而为吧。
指针是c和c++中的难点和重点。我只精通dos下的basic。c语言的其它各种特
性，在basic中都有类似的东西。只有指针，是baisc所不具备的。指针是c的灵魂
。
我不想重复大多数书上说得很清楚的东西，我只是把我看过的书中说得不清
楚或没有说，而我又觉得我理解得有点道理的东西写出来。我的目的
是：
1。通过写这些东西，把我脑袋中关于c的模糊的知识清晰化。
2。给初学者们一点提示。
3。赚几个经验值。（因为贴这些东西没有灌水之嫌啊）

第一章。指针的概念

指针是一个特殊的变量，它里面存储的数值被解释成为内存里的一个地址。

要搞清一个指针需要搞清指针的四方面的内容：指针的类型，指针所指向的
类型，指针的值或者叫指针所指向的内存区，还有指针本身所占据的
内存区。让
我们分别说明。
先声明几个指针放着做例子：
例一：
(1)int*ptr;
(2)char*ptr;
(3)int**ptr;
(4)int(*ptr)[3];
(5)int*(*ptr)[4];
如果看不懂后几个例子的话，请参阅我前段时间贴出的文章<<如何
理解c和c
++的复杂类型声明>>。

1。指针的类型。
从语法的角度看，你只要把指针声明语句里的指针名字去掉，剩下的部分就
是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的
类型：
(1)int*ptr;//指针的类型是int*
(2)char*ptr;//指针的类型是char*
(3)int**ptr;//指针的类型是int**
(4)int(*ptr)[3];//指针的类型是int(*)[3]
(5)int*(*ptr)[4];//指针的类型是int*(*)[4]
怎么样？找出指针的类型的方法是不是很简单？

2。指针所指向的类型。
当你通过指针来访问指针所指向的内存区时，指针所指向的类型决定了编译
器将把那片内存区里的内容当做什么来看待。
从语法上看，你只须把指针声明语句中的指针名字和名字左边的指针声明符
*去掉，剩下的就是指针所指向的类型。例如：
(1)int*ptr;//指针所指向的类型是int
(2)char*ptr;//指针所指向的的类型是char
(3)int**ptr;//指针所指向的的类型是int*
(4)int(*ptr)[3];//指针所指向的的类型是int()[3]
(5)int*(*ptr)[4];//指针所指向的的类型是int*()[4]
在指针的算术运算中，指针所指向的类型有很大的作用。
指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越
来越熟悉时，你会发现，把与指针搅和在一起的"类型"这个概念分成"指针的
类型"和"指针所指向的类型"两个概念，是精通指针的关键点之一。我看了不
少书，发现有些写得差的书中，就把指针的这两个概念搅在一起了，所以看起书
来前后矛盾，越看越糊涂。

3。指针的值，或者叫指针所指向的内存区或地址。
指针的值是指针本身存储的数值，这个值将被编译器当作一个地址，而不是
一个一般的数值。在32位程序里，所有类型的指针的值都是一个32位整数，因为
32位程序里内存地址全都是32位长。
指针所指向的内存区就是从指针的值所代表的那个内存地址开始，长度为si
zeof(指针所指向的类型)的一片内存区。以后，我们说一个指针的值是XX，就相
当于说该指针指向了以XX为首地址的一片内存区域；我们说一个指针指向了某块
内存区域，就相当于说该指针的值是这块内存区域的首地址。
指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中
，指针所指向的类型已经有了，但由于指针还未初始化，所以它所指向的内存区
是不存在的，或者说是无意义的。
以后，每遇到一个指针，都应该问问：这个指针的类型是什么？指针指向的
类型是什么？该指针指向了哪里？
4。指针本身所占据的内存区。
指针本身占了多大的内存？你只要用函数sizeof(指针的类型)测一下就知道
了。在32位平台里，指针本身占据了4个字节的长度。
指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。

第二章。指针的算术运算

指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减
运算的意义是不一样的。例如：
例二：
1。chara[20];
2。int*ptr=a;
...
...
3。ptr++;
在上例中，指针ptr的类型是int*,它指向的类型是int，它被初始化为指向整
形变量a。接下来的第3句中，指针ptr被加了1，编译器是这样处理的：它把指针
ptr的值加上了sizeof(int)，在32位程序中，是被加上了4。由于地址是用字节做
单位的，故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。
由于char类型的长度是一个字节，所以，原来ptr是指向数组a的第0号单元开始的
四个字节，此时指向了数组a中从第4号单元开始的四个字节。
我们可以用一个指针和一个循环来遍历一个数组，看例子：
例三：
例三：
intarray[20];
int*ptr=array;
...
//此处略去为整型数组赋值的代码。
...
for(i=0;i<20;i++)
{
(*ptr)++;
ptr++；
}
这个例子将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1，所
以每次循环都能访问数组的下一个单元。
再看例子：
例四：
1。chara[20];
2。int*ptr=a;
...
...
3。ptr+=5;
在这个例子中，ptr被加上了5，编译器是这样处理的：将指针ptr的值加上5
乘sizeof(int)，在32位程序中就是加上了5乘4=20。由于地址的单位是字节，故
现在的ptr所指向的地址比起加5后的ptr所指向的地址来说，向高地址方向移动了
20个字节。在这个例子中，没加5前的ptr指向数组a的第0号单元开始的四个字节
，加5后，ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问
题，但在语法上却是可以的。这也体现出了指针的灵活性。
如果上例中，ptr是被减去5，那么处理过程大同小异，只不过ptr的值是被减
去5乘sizeof(int)，新的ptr指向的地址将比原来的ptr所指向的地址向低地址方
向移动了20个字节。

总结一下，一个指针ptrold加上一个整数n后，结果是一个新的指针ptrnew，
ptrnew的类型和ptrold的类型相同，ptrnew所指向的类型和ptrold所指向的类型
也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字
节。就是说，ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移
动了n乘sizeof(ptrold所指向的类型)个字节。
一个指针ptrold减去一个整数n后，结果是一个新的指针ptrnew，ptrnew的类
型和ptrold的类型相同，ptrnew所指向的类型和ptrold所指向的类型也相同。pt
rnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节，就是说
，ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘siz
eof(ptrold所指向的类型)个字节。

第三章。运算符&和*

这里&是取地址运算符，*是...书上叫做"间接运算符"。
&a的运算结果是一个指针，指针的类型是a的类型加个*，指针所指向的类型
是a的类型，指针所指向的地址嘛，那就是a的地址。
*p的运算结果就五花八门了。总之*p的结果是p所指向的东西，这个东西有这
些特点：它的类型是p指向的类型，它所占用的地址是p所指向的地址。
例五：
inta=12;
intb;
int*p;
int**ptr;
p=&a;//&a的结果是一个指针，类型是int*，指向的类型是int，指向的地址
是a的地址。
*p=24;//*p的结果，在这里它的类型是int，它所占用的地址是p所指向的地
址，显然，*p就是变量a。
ptr=&p;//&p的结果是个指针，该指针的类型是p的类型加个*，在这里是int
**。该指针所指向的类型是p的类型，这里是int*。该指针所指向的地址就是指针
p自己的地址。
*ptr=&b;//*ptr是个指针，&b的结果也是个指针，且这两个指针的类型和所
指向的类型是一样的，所以用&b来给*ptr赋值就是毫无问题的了。
**ptr=34;//*ptr的结果是ptr所指向的东西，在这里是一个指针，对这个指
针再做一次*运算，结果就是一个int类型的变量。

第四章。指针表达式。

一个表达式的最后结果如果是一个指针，那么这个表达式就叫指针表达式。
下面是一些指针表达式的例子：
例六：
inta,b;
intarray[10];
int*pa;
pa=&a;//&a是一个指针表达式。
int**ptr=&pa;//&pa也是一个指针表达式。
*ptr=&b;//*ptr和&b都是指针表达式。
pa=array;
pa++;//这也是指针表达式。
例七：
char*arr[20];
char**parr=arr;//如果把arr看作指针的话，arr也是指针表达式
char*str;
str=*parr;//*parr是指针表达式
str=*(parr+1);//*(parr+1)是指针表达式
str=*(parr+2);//*(parr+2)是指针表达式

由于指针表达式的结果是一个指针，所以指针表达式也具有指针所具有的四
个要素：指针的类型，指针所指向的类型，指针指向的内存区，指针自身占据的
内存。
好了，当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存
的话，这个指针表达式就是一个左值，否则就不是一个左值。
在例七中，&a不是一个左值，因为它还没有占据明确的内存。*ptr是一个左
值，因为*ptr这个指针已经占据了内存，其实*ptr就是指针pa，既然pa已经在内
存中有了自己的位置，那么*ptr当然也有了自己的位置。

第五章。数组和指针的关系

如果对声明数组的语句不太明白的话，请参阅我前段时间贴出的文章<<如何
理解c和c++的复杂类型声明>>。
数组的数组名其实可以看作一个指针。看下例：
例八：
intarray[10]={0,1,2,3,4,5,6,7,8,9},value;
...
...
value=array[0];//也可写成：value=*array;
value=array[3];//也可写成：value=*(array+3);
value=array[4];//也可写成：value=*(array+4);
上例中，一般而言数组名array代表数组本身，类型是int[10]，但如果把a
rray看做指针的话，它指向数组的第0个单元，类型是int*，所指向的类型是数
组单元的类型即int。因此*array等于0就一点也不奇怪了。同理，array+3是一个
指向数组第3个单元的指针，所以*(array+3)等于3。其它依此类推。

例九：
例九：
char*str[3]={
"Hello,thisisasample!",
"Hi,goodmorning.",
"Helloworld"
};
chars[80]；
strcpy(s,str[0]);//也可写成strcpy(s,*str);
strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));
strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));
上例中，str是一个三单元的数组，该数组的每个单元都是一个指针，这些指
针各指向一个字符串。把指针数组名str当作一个指针的话，它指向数组的第0号
单元，它的类型是char**，它指向的类型是char*。
*str也是一个指针，它的类型是char*，它所指向的类型是char，它指向的地
址是字符串"Hello,thisisasample!"的第一个字符的地址，即'H'的地址。
str+1也是一个指针，它指向数组的第1号单元，它的类型是char**，它指向
的类型是char*。
*(str+1)也是一个指针，它的类型是char*，它所指向的类型是char，它指向
"Hi,goodmorning."的第一个字符'H'，等等。

下面总结一下数组的数组名的问题。声明了一个数组TYPEarray[n]，则数组
名称array就有了两重含义：第一，它代表整个数组，它的类型是TYPE[n]；第二
，它是一个指针，该指针的类型是TYPE*，该指针指向的类型是TYPE，也就是数组
单元的类型，该指针指向的内存区就是数组第0号单元，该指针自己占有单独的内
存区，注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的
，即类似array++的表达式是错误的。
在不同的表达式中数组名array可以扮演不同的角色。
在表达式sizeof(array)中，数组名array代表数组本身，故这时sizeof函数
测出的是整个数组的大小。
在表达式*array中，array扮演的是指针，因此这个表达式的结果就是数组第
0号单元的值。sizeof(*array)测出的是数组单元的大小。
表达式array+n（其中n=0，1，2，....。）中，array扮演的是指针，故arr
ay+n的结果是一个指针，它的类型是TYPE*，它指向的类型是TYPE，它指向数组第
n号单元。故sizeof(array+n)测出的是指针类型的大小。
例十：
intarray[10];
int(*ptr)[10];
ptr=&array;
上例中ptr是一个指针，它的类型是int(*)[10]，他指向的类型是int[10]
，我们用整个数组的首地址来初始化它。在语句ptr=&array中，array代表数组本
身。

本节中提到了函数sizeof()，那么我来问一问，sizeof(指针名称)测出的究
竟是指针自身类型的大小呢还是指针所指向的类型的大小？答案是前者。例如：

int(*ptr)[10];
则在32位程序中，有：
sizeof(int(*)[10])==4
sizeof(int[10])==40
sizeof(ptr)==4
实际上，sizeof(对象)测出的都是对象自身的类型的大小，而不是别的什么
类型的大小。
第六章。指针和结构类型的关系

可以声明一个指向结构类型对象的指针。
例十一：
structMyStruct
{
inta;
intb;
intc;
}
MyStructss={20,30,40};//声明了结构对象ss，并把ss的三个成员初始
化为20，30和40。
MyStruct*ptr=&ss;//声明了一个指向结构对象ss的指针。它的类型是
MyStruct*,它指向的类型是MyStruct。
int*pstr=(int*)&ss;//声明了一个指向结构对象ss的指针。但是它的
类型和它指向的类型和ptr是不同的。

请问怎样通过指针ptr来访问ss的三个成员变量？
答案：
ptr->a;
ptr->b;
ptr->c;
又请问怎样通过指针pstr来访问ss的三个成员变量？
答案：
*pstr；//访问了ss的成员a。
*(pstr+1);//访问了ss的成员b。
*(pstr+2)//访问了ss的成员c。
呵呵，虽然我在我的MSVC++6.0上调式过上述代码，但是要知道，这样使用p
str来访问结构成员是不正规的，为了说明为什么不正规，让我们看看怎样通过指
针来访问数组的各个单元：
例十二：
intarray[3]={35,56,37};
int*pa=array;
通过指针pa访问数组array的三个单元的方法是：
*pa;//访问了第0号单元
*(pa+1);//访问了第1号单元
*(pa+2);//访问了第2号单元
从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样。
所有的C/C++编译器在排列数组的单元时，总是把各个数组单元存放在连续的
存储区里，单元和单元之间没有空隙。但在存放结构对象的各个成员时，在某种
编译环境下，可能会需要字对齐或双字对齐或者是别的什么对齐，需要在相邻两
个成员之间加若干个"填充字节"，这就导致各个成员之间可能会有若干个字节
的空隙。
所以，在例十二中，即使*pstr访问到了结构对象ss的第一个成员变量a，也
不能保证*(pstr+1)就一定能访问到结构成员b。因为成员a和成员b之间可能会有
若干填充字节，说不定*(pstr+1)就正好访问到了这些填充字节呢。这也证明了指
针的灵活性。要是你的目的就是想看看各个结构成员之间到底有没有填充字节，
嘿，这倒是个不错的方法。
通过指针访问结构成员的正确方法应该是象例十二中使用指针ptr的方法。

第七章。指针和函数的关系

可以把一个指针声明成为一个指向函数的指针。
intfun1(char*,int);
int(*pfun1)(char*,int);
pfun1=fun1;
....
....
inta=(*pfun1)("abcdefg",7);//通过函数指针调用函数。
可以把指针作为函数的形参。在函数调用语句中，可以用指针表达式来作为
实参。
例十三：
intfun(char*);
inta;
charstr[]="abcdefghijklmn";
a=fun(str);
...
...
intfun(char*s)
{
intnum=0;
for(inti=0;i{
num+=*s;s++;
}
returnnum;
}
这个例子中的函数fun统计一个字符串中各个字符的ASCII码值之和。前面说
了，数组的名字也是一个指针。在函数调用中，当把str作为实参传递给形参s后
，实际是把str的值传递给了s，s所指向的地址就和str所指向的地址一致，但是
str和s各自占用各自的存储空间。在函数体内对s进行自加1运算，并不意味着同
时对str进行了自加1运算。

第八章。指针类型转换

当我们初始化一个指针或给一个指针赋值时，赋值号的左边是一个指针，赋
值号的右边是一个指针表达式。在我们前面所举的例子中，绝大多数情况下，指
针的类型和指针表达式的类型是一样的，指针所指向的类型和指针表达式所指向
的类型是一样的。
例十四：
1。floatf=12.3;
2。float*fptr=&f;
3。int*p;
在上面的例子中，假如我们想让指针p指向实数f，应该怎么搞？是用下面的
语句吗？
p=&f;
不对。因为指针p的类型是int*，它指向的类型是int。表达式&f的结果是一
个指针，指针的类型是float*,它指向的类型是float。两者不一致，直接赋值的
方法是不行的。至少在我的MSVC++6.0上，对指针的赋值语句要求赋值号两边的类
型一致，所指向的类型也一致，其它的编译器上我没试过，大家可以试试。为了
实现我们的目的，需要进行"强制类型转换"：
p=(int*)&f;
如果有一个指针p，我们需要把它的类型和所指向的类型改为TYEP*和TYPE，
那么语法格式是：
(TYPE*)p；
这样强制类型转换的结果是一个新指针，该新指针的类型是TYPE*，它指向的
类型是TYPE，它指向的地址就是原指针指向的地址。而原来的指针p的一切属性都
没有被修改。

一个函数如果使用了指针作为形参，那么在函数调用语句的实参和形参的结
合过程中，也会发生指针类型的转换。
例十五：
voidfun(char*);
inta=125,b;
fun((char*)&a);
...
...
voidfun(char*s)
{
charc;
c=*(s+3);*(s+3)=*(s+0);*(s+0)=c;
c=*(s+2);*(s+2)=*(s+1);*(s+1)=c;
}
}
注意这是一个32位程序，故int类型占了四个字节，char类型占一个字节。函
数fun的作用是把一个整数的四个字节的顺序来个颠倒。注意到了吗？在函数调用
语句中，实参&a的结果是一个指针，它的类型是int*，它指向的类型是int。形
参这个指针的类型是char*，它指向的类型是char。这样，在实参和形参的结合过
程中，我们必须进行一次从int*类型到char*类型的转换。结合这个例子，我们可
以这样来想象编译器进行转换的过程：编译器先构造一个临时指针char*temp，
然后执行temp=(char*)&a，最后再把temp的值传递给s。所以最后的结果是：s的
类型是char*,它指向的类型是char，它指向的地址就是a的首地址。

我们已经知道，指针的值就是指针指向的地址，在32位程序中，指针的值其
实是一个32位整数。那可不可以把一个整数当作指针的值直接赋给指针呢？就象
下面的语句：
unsignedinta;
TYPE*ptr;//TYPE是int，char或结构类型等等类型。
...
...
a=20345686;
ptr=20345686;//我们的目的是要使指针ptr指向地址20345686（十进制
）
ptr=a;//我们的目的是要使指针ptr指向地址20345686（十进制）
编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能达到
了吗？不，还有办法：
unsignedinta;
TYPE*ptr;//TYPE是int，char或结构类型等等类型。
...
...
a=某个数，这个数必须代表一个合法的地址；
ptr=(TYPE*)a；//呵呵，这就可以了。
严格说来这里的(TYPE*)和指针类型转换中的(TYPE*)还不一样。这里的(TYP
E*)的意思是把无符号整数a的值当作一个地址来看待。
上面强调了a的值必须代表一个合法的地址，否则的话，在你使用ptr的时候
，就会出现非法操作错误。

想想能不能反过来，把指针指向的地址即指针的值当作一个整数取出来。完
全可以。下面的例子演示了把一个指针的值当作一个整数取出来，然后再把这个
整数当作一个地址赋给一个指针：
例十六：
inta=123,b;
int*ptr=&a;
char*str;
b=(int)ptr;//把指针ptr的值当作一个整数取出来。
str=(char*)b;//把这个整数的值当作一个地址赋给指针str。

好了，现在我们已经知道了，可以把指针的值当作一个整数取出来，也可以
把一个整数值当作地址赋给一个指针。

第九章。指针的安全问题

看下面的例子：
例十七：
chars='a';
int*ptr;
ptr=(int*)&s;
*ptr=1298；
指针ptr是一个int*类型的指针，它指向的类型是int。它指向的地址就是s的
首地址。在32位程序中，s占一个字节，int类型占四个字节。最后一条语句不但
改变了s所占的一个字节，还把和s相临的高地址方向的三个字节也改变了。这三
个字节是干什么的？只有编译程序知道，而写程序的人是不太可能知道的。也许
这三个字节里存储了非常重要的数据，也许这三个字节里正好是程序的一条代码
，而由于你对指针的马虎应用，这三个字节的值被改变了！这会造成崩溃性的错
误。
让我们再来看一例：
例十八：
1。chara;
2。int*ptr=&a;
...
...
3。ptr++;
4。*ptr=115;
该例子完全可以通过编译，并能执行。但是看到没有？第3句对指针ptr进行
自加1运算后，ptr指向了和整形变量a相邻的高地址方向的一块存储区。这块存储
区里是什么？我们不知道。有可能它是一个非常重要的数据，甚至可能是一条代
码。而第4句竟然往这片存储区里写入一个数据！这是严重的错误。所以在使用指
针时，程序员心里必须非常清楚：我的指针究竟指向了哪里。
在用指针访问数组的时候，也要注意不要超出数组的低端和高端界限，否则
也会造成类似的错误。
在指针的强制类型转换：ptr1=(TYPE*)ptr2中，如果sizeof(ptr2的类型)大
于sizeof(ptr1的类型)，那么在使用指针ptr1来访问ptr2所指向的存储区时是安
全的。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型)，那么在使用指针ptr1
来访问ptr2所指向的存储区时是不安全的。至于为什么，读者结合例十七来想一
想，应该会明白的。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.35.243.28]


发信人: luckyfang (老K), 信区: C
标 题: 关于结构体
发信站: 饮水思源站 (Sat Apr 15 16:24:37 2000), 转信
C中的结构体功能不及C++的强, 不能提供成员变量.
但是可以通过定义一个指向某函数的指针, 来实现它的面向对象(虽然比较不严格).

C++中的结构是为了与C兼容, 它是特殊的类, 所有的成员变量均为public型.
其实, 在C++中结构已经没有存在的必要, java就很明智的去除了结构的概念.

--

我的心中早已不再有火花,

就让网事都随风去吧!

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.9.173]


发信人: wolfking.bbs@bbs.dlut.edu.cn (想当斑竹了!hehe), 信区: C
标 题: Re: 学C是否要先学汇编？
发信站: 碧海青天 (Sun Aug 9 18:45:16 1998)
转信站: sjtubbs!sjtunews!ustcnews!DUT
Origin: rose.dlut.edu.cn
【 在 zhyong (大鱼) 的大作中提到: 】
: 【 在 holly.bbs@bbs.sjtu.edu.cn (Holly) 的大作中提到: 】
: : ... If you have not known assembler, you cannot master C
: ---------.........
: 我也是刚学c,不知何谓assembler
: 学c是否还要掌握相当的硬件知识？
: .望见教。

如果你是非电子或自动化专业的,暂时没有必要去学过多硬件知识,

你需要先熟悉c语言的语法和功能,在编普通计算程序的基础上

尝试编制小型实用软件,这对你熟悉函数的实用和提高编程技巧

及养成良好的编程习惯是有好处的.(建议你先编制文本(图形)编辑器)

这是计算机专业二年级的实习题目,对你了解熟悉运用c语言很有好处.

但作为电子、自动化专业学生，你应该注意学习硬件相关知识，和

汇编语言，对于你以后运用单片机开发有很大好处！！！！

good luck

--

天下英雄出我辈
一入江湖岁月催
皇图霸业谈笑中
不尽人生一场醉

※ 来源:．碧海青天 bbs.dlut.edu.cn．[FROM: 202.118.68.67]


帮助

饮水思源站 帮助 精华区离线浏览
类型 | 标题 | 长度 | 时间
目录 | 一些资源 | 2项 | 00/03/11 01:43
目录 | 全国计算机等级考 | 1项 | 00/03/11 01:43
文件 | 在VC中如何由DLL文件得到它的LIB文件 jia | 2061 | 00/03/11 01:43


一些资源

饮水思源站 一些资源 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | C源代码大放送--目录 jia | 19879 | 00/03/11 01:43
文件 | C源代码大放送--地址 jia | 341 | 00/03/11 01:43


发信人: daihao.bbs@210.34.48.50 (不死鸟), 信区: C
标 题: C源代码大放送--目录
发信站: FZU_BBS (Tue Apr 14 17:05:26 1998)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
2DB2CLIB 用C语言处理 DBASEIII 数据库
ACK3D ACK-3D三维动画C语言源程序包
ADVANCEC 高级C语言源程序范例
ALCKEY 在C语言中使用汇编语言设计边框范例
AN311X DOS系统下多任务列队处理C语言源程序
ANIMTE 动画模拟开发包,包括来自于著名游戏"盗宝贼"的生动范例
(需 WINDOWS 3.1 ,C语言编译器,鼠标)在WINDOWS下执行setup
API_SHAR 应用程序接口C语言共享工具
ARG C语言,显示使用 ARGC . ARGC 命令行参数的实例
ARG11 C++语言,显示使用 ARGV . ARGC 命令行参数的实例
AST40DOS 占星术4.0版C语言源程序
ASYNC13 异步通讯C语言例行子程序
ATOV_EX C/ASM混和语言编程检查ATOI()函数的溢出
AUTODILE TC语言编程简单的电话拨号功能
AUTOSCRN AUTOSCREEN v2.01便携式ANSI C用户界面开发程序库
B_PLUS C语言开发 BTREE 数据文件索引程序库
B_SORT BTREE C语言排序例行子程序库
BARCOD 表格线打印算法C语言源程序
BASIC_C 模仿 BASIC 函数的某些 C 语言函数
BATNET12 C 语言编缉神经网络工具
BAWK_NEW DOS版本的C语言文本处理 AWK 源程序
BCPORT BC4.0开发用于WIN3.1下通过系列关键词查找文件的小工具
BFI BRIGHT FUTURE 公司的C语言工具包
BITSTR 经过改进的C语言位操作功能
BITSTRG C语言中字符串处理功能
BLTC13A BULLET多用户数据库系统开发工具包(DOS环境C语言编译系统)
BOOTSEC WINDOWS下磁盘根区数据的显示(用WINDOWS3.1 SDK开发)
BOSSWIN1 BOSS窗口开发 C 语言程序库 (1988年6月15日版)
BOSSWIN2 BOSS窗口开发 C 语言程序库 (1988年8月15日版)
BOSSWIN3 BOSS窗口开发 C 语言程序库 (1990年7月1日版)
BOSS_C 使用 TURBO C 语言BOSS窗口开发程序库
BRACES C语言宏检查的C语言源程序
BTREES BTREE 树形文件处理系统
BUGLIST 纠正BORLAND公司TC++错误的C语言源程序
BYTESC88 SMALL C 语言数学库
C_ASMBLR C语言中的汇编子程序
C_CHECK 检查 C 源码中括号的匹配性
C_COMP PC机上小型的C语言文本编缉器
C_CONVER 数字转换的六个功能模块
C_COURSE Coronado 公司开发的 C 语言教程
C_EDIT Ed Ream's Red 开发的文本编缉器
C_ENVMT C 语言开发环境
C_FMT11 C 语言开发高速格式化工具
C_HINTS C 语言开发HNT格式数据库系统
C_KERMIT C 语言核心协议的 C 语言源代码
C_LIB 一些小工具的 C 语言源代码
C_PLUS C语言新版本的通讯协议
C_RESID 制作内存驻留工具的 C 语言帮助工具
C_RESIDE 内存驻留程序设计软件
C_SORT TURBO C 语言排序子程序
C_TALK BBS 公告牌关于 C 语言的讨论
C_TEXT 基于 BIOS 的屏幕开发 C 语言源程序
C_TOOLBX C 语言工具箱的源代码
C_WNDW TURBO C 和 QUICK C 的开发工具包
C_WNDWS C 语言WINDOWS源程序库
C_WORK C 语言教程
C2 使用C语言编程的重要信息
C2DBASE1 LATTICE C语言开发DBASE III 数据库
C2PAS C语言转换为Pascal语言转换器
C4WINDOW 使用C语言开发图形界面
CALC_CRC C语言的循环冗余校验
CB105 C语言源程序的美化
CBASE09 ISAM/BTREE 数据库系统 C 语言源程序
CBASE101 CBASE v1.01 数据库管理 C 语言源程序库
CBCPP CBASE v1.01 采用Borland公司TC++编写的数据库管理源程序库
CBOX 一个简单的C语言编写的菜单
CCC 优美的打印C语言源程序
CCC1053 完整的 C++ 面向对象编缉器
CCHECK 良好的C语言语法检查器
CDBMS A.STEVENS 用C语言开发的数据库系统
CDOC23 自动记录C语言源程序的功能
CDRAW 产生当前屏幕的源代码
CDROPIN1 计算机 BENCHMARK 测试值的工具包
CEDIT dr dobbs 编缉器升级版的 C 语言源程序
CENVID DOS环境下宏命令批处理增强工具包C语言解释器
CENVIW WINDOWS环境下宏命令批处理增强工具包C语言解释器
CFLOW 列出在 C 语言源代码中的所有子程序的功能
CGOODIES C 语言和 CLIPER 语言的接口源程序
CHGCOLOR 改变EGA调色板的颜色
CHIPS_C 测试 CPU和NDP 的型号
CHOAS TURBO C 语言编写的声响程序
CHSORT HEAP 文件排序 C 语言源程序
CIASM100 用C++语言开发数据库单用户系统
CINT16 中断驻留子程序范例
CKERMIT KERMIT C 语言源代码
CL C 语言源代码优美的列出
CLEAR_C 增强 C 源代码的可读性 C 语言源程序
CLJUNE86 PCTMK 1.0版程序开发工具
CLMFEB85 C 语言子例行子程序的增强库
CLNDR_C C 语言开发日历
CLR_BUFR BUFFER 内容的清除
CLR_LINE 清除 C 源代码的指定行
CLR_SCRN 清除屏幕的 C 语言源代码
CLT162 C语言源程序检查工具
CMDPARSE TURBO C 语言增强功能
CMERGE C 语言和汇编语言混合编程
CMOSCLK 访问AT机CMOS和时钟
CMOS_C 查看并修改CMOS内容的C语言源程序
CNEWS018 C 语言编写的小工具
COMM_C_2 串行口升级子程序支持1-4口的中断控制
COMPAR 控制系统的简单改进
COMPC 完整的 C 语言编制程序
COM_INT RS232 中断开发 C 语言源程序
COREGRAF CORE 图形系统 C 语言源程序
CPE60 类似于 Turbo C 编缉开发环境
CPORT20 C语言开发串行通讯程序库
CPP DECUS C 语言源程序预处理器
CPPL1 操作符重载C++教程
CPPLEARN 帮您学C++
CPPMENU C++语言编写菜单类库
CPPPARSE 分列类库C++语言源代码
CPPTUTOR 超级文本C++教程
CPRECDC C语言操作符预解释
CPRINT 打印出漂亮的 C 语言源代码
CPRINTER 打印机控制 C 语言例行子程序
CPRINTF MS C 5.1 打印功能bug的修复
CQUIRK 使用 C 语言文本编缉器的注意事项
CRC32 ANSI X3.66 的 32-bit 循环冗余校验的 C 语言源代码
CRC4MSC MS C 的循环冗余校验的子程序
CRCSET11 32-bit 循环冗余校验的 C和PASCAL 应用程序
CRDE10 C语言开发关系型数据库(包括80种功能)
CREF XREF C语言源代码
CRITERR 编制 C 语言源代码时可用的关键错误陷井
CROUTINES 帮助你学习 C 语言的几个 C 语言的子程序
CRT_DISK 将屏幕信息保存于磁盘的C语言源程序
CSAP208B 子目录排序整理的TURBOC源码2.08版
CSAP212 子目录排序整理的TURBOC源码2.12版
CSCOP C-SCOPE1.11;分析由多个文件组成的C语言源程序,仔细报告各
文件的功能.起始行等等
CSOURCE TURBO-C 教程的C语言源码
CSP0194B FIDO网超大文件传输的C语言源程序
CSR30 C 语言编程助手
CSR 光标控制 C 语言源程序
DWN 光标下移
LFT 光标左移
POS 光标定位
RT 光标右移
UP 光标上移
CSTUFFA INT86中断举例
CSUBRS C语言子程序集
CTABLES C语言编缉器的比较
CTAGS2 简易标签制作
CTASK22 DOS环境下的多任务系统的C语言源代码
CTHREAD C语言编程的在线帮助
CTONE 控制扬声器音调的 C 语言源码
CUJDEC93 12/93 C语言用户杂志(包括压缩.字符串处理等等源程序)
CUJNOV93 01/93 C语言用户杂志(包括计时器.视频终端处理等等源程序)
CVAR 列出C语言源码的所有的宏.定义.功能
CW_SRC Cyrillic字体开发源包程序代码
CXREF C语言模块检查(变量.常量列表,功能列表等等)
CXT212 CXT C语言32位强力开发工具
DATECLS C++语言开发的日期处理类库
DAY_ELAP 读算两个日期间的天数
DB12 数据库开发的 C 语言源代码
DB2_STRU 查看DBASE数据库的结构
DBFLIS 列出 TURBO C 文件的结构
DBF_TC 使用TURBO C读数据库文件
DDOS10_C TC.QC开发的DOS功能库
DEMO4350 TORBO C 开发43/50行文本模式源码
DES_PC DES 加密系统的 C 语言源代码
DEVDRIVE 设备驱动程序源代码
DFIRST 查找 .C .OBJ 通配符的 C 语言源代码
DIRECT02 文件列目录 TURBOC语言源代码
DIREXIST TURBO-C 测试子目录是否存在的功能模块
DISKSECT 查看磁盘分区信息的 C 语言源代码
DLGDSN41 BORLAND公司C语言对话框开发程序
DMALLOC HOLUB'S 内存再分配的 C 语言源代码
DOSTIME 控制 DOS 时间功能模块
DRYSTONE DRYSTONE benchmark 测试 C 语言源程序
DSCDOC07 DSC 文件系统升级版
DSTACK 目录路径压栈出栈 C 语言源码
DUPS 将所有复制的文件名送标准输出设备
DUTILITY 文件变属性和移动文件的 C 语言源代码
ELEMC 基本的 C 语言程序
EMIT 将 ASM 源程序变为 TURBO-C的内联模块
EMM_DEMO Intel 公司关于C.PAS.ASM语言的演示
EMS4C10 EMS C语言开发程序库
EMSIF24 EMSIF v2.4 具有良好界面的 EMS 使用功能的C语言源程序
EMSLIB ASM.C混合编程 LIM EMS 界面库
EMSTK C 语言开发者的 EMS 开发工具包
EPRNEW EPSON 打印机的列表功能 C 语言源代码
EXEC33A 内存映射程序,可以使用EMS.XMS.文件等作为交换文件
EXECOM 将.EXE文件转换为COM文件的 C 语言源代码
EXPLO203 焰火显示的 C 语言源代码
EXTDEV Windows环境下文本文件的载入保存编缉的C语言源程序
EZDB102 EZ-DB v1.02版 C 语言开发数据库功能
FASTVID2 高速屏显 C 语言源代码纠错版
FF 列出 C 源程序的功能模块
FFT 快速傅利叶变换 C 语言源代码
FLC2 能用于多种系统下的灵活列表功能 ANSI-C版
FLCPP2 能用于多种系统下的灵活列表功能 C++ 版
FLEXLIST 能用于多种系统下的灵活列表功能 C 语言工具包
FLOAT 浮点运算增强功能子程序可内联于 C 源码
FTAG12 数据库索引功能 C 语言源码
FUNC87 模拟协处理器功能的 C 语言源码
FUNCTBL C 语言使用矩阵范例
FONT_CMP 320x200x256VGA模式下的字体开发程序
FPCLIB36 FlashPac C 开发程序库(基于BIOS,包括VGA&EGA直接写屏,MOUSE开发
程序,基本DOS开发功能比如键盘开发等等)
GCP_23 基于 TCP/IP 协议 GCP++ Windows SDK开发程序包的C语言开发的
编缉程序软件
GIF_LIB GIF 处理功能 C 语言源程序库
GNUCDIFF GNU 文本处理终极版
GNURETC TURBOC 文本处理常规库
GNUZIP 采用 LZ77 运算规则 压缩及解压工具,该算法兼容几种算法
GSRC208A GESPI 2.0动态系统模拟工具
GRAFIX MSC TURBO-C图形库
GRASPEXT 文本截取功能 C PASCAL 源代码
GUI100 BC++ 开发的图形界面应用程序,使用为方便
HALLOC MSC v5.1库的补充
HANSON Hanson's 的 C 语言源程序库
HASH 计算 HASH 值的 C 语言源代码
HEAPCH 检查堆栈值的 C 语言源码
HEAPMNGR 堆栈管理器的 C 语言源代码
HIM 人机界面开发的 C 语言程序库
HSATXT 高速文本处理库4.02版
HYPE 超级文本 C 语言程序库
IDELNT 类TC++集成开发界面的 C 语言源代码
IMCJUNE91 测试 C 语言子模块运行速度的 C 语言源程序
ISSUE_51 几个小应用程序的 C 语言源代码
ISAM101A ISAM 数据库开发系统(可使用BC.VC系统编译)
ISC366 中断服务开发类库
ISM101 ISAM 数据库开发系统(可使用BC.VC系统编译)
IXE130 Icon/sprite 图标开发预处理源程序基于256和16色 VGA和EGA的32
位系统的C语言源程序
JPL_C 一些常用功能的 C 语言源代码
KAFSRT20 KAFS 2.0 完全文件处理及排序
KFS20 KEYED DOS系统版文件处理系统(使用MSC 6.0或7.0编译)
KFSOS220 KEYED OS/2系统版文件处理系统(使用MSC 6.0或7.0编译)
LE_C 优美的窗口菜单开发 C 语言源代码
LWINDWO 窗口开发 C 语言源程序
LZHSRC10 LZH算法压缩解压的TURBO-C源程序
L_LIST1 C++语言的列表类库
MC20 C语言的小编译器
MCLBK100 WINDOWS应用开发C++类库
MCOMM540 异步通讯的 C 语言程序库
MCOMM557 异步通讯的 C 语言程序库
MEMOLINE 控制按规定输出的 C 语言源程序
MENU_C 简单的文本的图形菜单
MFLMS101 Bob Stout's的 C 语言功能库1.01版
MFLMS103 Bob Stout's的 C 语言扩展功能库1.03版
MFP1MC 多格式数据录入库
MIDSTR 类似于 MSC 的字符串处理功能模块
MIKE40C 相当有用的 C 语言功能模块库
MISC 文件恢复及修补 C 语言源程序
MIXTSR TSR 驻留程序的演示
MKEXT MKEXT 文件处理升级版
MLINKTC 联接程序的 C 语言源代码
MODEM2 在WINDOW3.1下开发使用通讯软件
MODEX104 MODE X v1.04 256色开发汇编子程序库(可用开C语言)
MOUSE_C 鼠标功能开发 C 语言源程序
MOUSTR 鼠标中断高级开发功能
MOUSY 鼠标功能处理的 C 语言源程序
MPEGENC 32位操作系统OS/2的 PPM 工具箱
MPEGPLAY 32位操作系统OS/2的MPEG播放机
MSCERR MS C 5.1/6.0 中的BUG
MSPERLS PERL 注释器的 C 语言源代码
MSPERLX 插样调查的 C 语言的扩展版
MTL100JE 基于DOS系统下的多任务类库
NDP_TYPE C/ASM混合语言汇编的NDP类型的源程码
NEWEMACS MICROEMACS 编缉器新版本的 C 语言源码
NEWNEWS 自动生成不知所云文章的 C 语言源程序
NEWSTR 高速字符串处理功能的 C 语言源程序
NLMDL 统计模块的 C++源程序
NMAKE MS MAKE 的替代版
OOC 对象定位 C 语言源程序
ORGM131 ORGM131 编缉器的 C 语言源码
OWLGEN OWLGEN C++ 模板源代码生成器,能够生成BC++ OWL WINDOWS
应用程序
PARS 执行命令行字符串的 TURBO C 源程序
PARSER20 语法分析子程序
PAS2C PASCAL 源程序转 C 语言源程序
PATIDE TC++集成开发界面的补丁,使之能用CGA环境
PC_EQUIP 系统设备列表的 C 语言源码
PC_TOOL misc. C 语言工具包
PCL4C40 C语言通讯程序库DOS版,支持10个115200波特率的通讯口
PCL4W10 C语言通讯程序库windows版,支持10个115200波特率的通讯口
PCPILOT TSR 驻留程序开发 C 语言源码
PCRSRC 标准输出控制 C 语言源码
PCVMM1 虚拟内存控制 C 语言源码
PDUTILC 公开的磁盘应用 C 语言工具包
PLUCK 文本处理工具PLUCK.EXE 的 C 语言源程序
PRGC TURBO C BGI 图形开发库
PRJ2MAK2 转换TURBO C的综合开发环境
PRRNAM 定位一个字符串 C 语言源码
REGEXP C 程序的常规语言语法检查
REINDENT 美化 C 语言源程序
RES DOS RESTORE命令的替代者
RICHARD 文章中句子的处理与比较
RIE103 Rimrock 图标编缉器,创建 EGA/VGA 图标
RM 通配符的删除的 C 语言源码
ROMB2ENV 将BIOS字节数和日期读入开发环境中
RTTYDIAG QUICK-C声音开发程序库
S12014 MSC格式输出问题的纠正
SAVEIMAG 图形文件的保存和输出的TC源码
SBF3 C语言和ASM语言混和开发声卡源程序
SBLIB10 C语言开发声霸卡软件,能够播放后缀为.VOC的声音文件
SCD113 处理DBASE文件的TURBO C源程序库
SCRED12 屏幕设计的 C 语言源程序
SCRED17 Turbo 屏幕编缉器
SCREDIT2 Turbo C 的屏幕编缉功能
SCRN0 MSC 的快速屏幕更新
SCRN02 C和ASM混合屏幕开发
SCRN1 MSC窗口开发
SCRN11 文本屏幕开发的源程序库
SCR_COLR 屏幕颜色的设置的 C 语言源码
SC_22 小型的 C 语言编译器
SERCOM C 语言开发串行通讯
SER_TC C++ 开发系列小工具
SETARGV TC 开发的带参数的命令文件范例
SHELLASM 汇编语言的SHELL
SHELL_C 类似于Unix系统的SHELL
SHOWTSRS 显示内存驻留程序的信息
SHROUD C语言源码加密工具
SKYLIGHT Sky Light 交互式图形编缉器
SMALL_C C 语言编缉小工具模块
SMALL_C2 新版小型 C 语言编缉器
SMB_100 高速,高容量,多种网络之间E-MAIL电子邮件的储存.修补等的C语言
开发的软件,共有31种功能
SMTC20 STEVE的工具库的 C 语言源代码
SNAV121 屏幕处理C++语言类库
SOFTC2 DBASE 数据库开发 TC和MSC 源代码
SOUNDC 扬声器开发 C 语言源程序库
SPAWNO30 在 EMS/XMS/DISK 建立交换文件的MSC和TC源程序库
SPHERE 经过改进的屏幕保护程序
SPLITT 大型文件分割组合 C 语言源程序
SPRITZEN EGA/VGA动画模拟TC++源程序
SQUSQ C 语言源程序的压缩和解压
STATLINE 检查 CAPS-NUMLOCK 灯的状态
STRFILE 文件名分析的 C 语言源程序
SUBSTRM2 确定子字符串的位置
SVGACC20 MSC或BC开发的SVGA图形开发库(允许使用300x200,640x480,80x600
1024x768等多种模式
SWAP300 建立交换文件的 C 语言源代码
SWEEP 内存管理 TC 和 TP 源程序库
SYNTAX 检查 C 语言的源代码的语法
TABALT1 调整 C 语言源码中 TABS 的长度
TBSCREEN Turbo Basic屏幕保护子程序
TBXTIP 使用 TURBO 工具箱的小秘密
TC_COD TC 源码生成器
TC_COMM TC 通讯子程序
TC_DBF TC 处理 DABSE III 的工具
TC_DEBUG 复杂指令系统的 TC DEBUGGER
TC_DIR01 目录文件处理 TC 源代码
TC_EQUIP 主板设备检查的 TC 源代码
TC_ISAM 索引存储法文件处理系统的 TC 源代码
TC_MOUSE MOUSE 处理 TC 源代码
TC_PATCH TC 的补丁
TC_PLOT 简单的绘图子程序
TC_XMEM 使用扩展内存的 TC 源代码
TC21PT TC2.0的补丁
TC2BUGS TC2.0的BUG
TC2IOBUG TC 2.0 I/O的BUG
TC2VIDEO TC2.0 诺顿用户手册
TCCMNU TCC命令行编缉器菜单
TCDEB101 TURBO C DEBUG 1.01版
TCFLIST TURBO C 文件管理器
TCFM TURBO C 文件管理器及其源码
TCFUN1 TURBO C 文件处理功能
TCHK070 TURBO C 工具库 0.70版
TCHK20 TURBO C 工具库 2.0 版
TCHKC1 C 语言函数库
TCHKC3 TC 函数库
TCISAM 树形文件处理 TC 程序库
TCLIB TC 应用程序库
TCLIB1 SIMTEL 编写 TC 应用程序库
TCLIB13 TC 应用程序库
TCLITEBR TC 编写的下拉式菜单
TCMAC TC 语言的宏
TCMAKMAK TC.MSC MAKEFILE 生成器
TCMEMACS 高速内存通讯 TC 源码
TCOMM11 通讯库 TC 源代码
TCPAT629 TC 源码自动修补
TCPIP 关于TCP/IP协议的信息
TCPROF 测试复杂指令系统的 TC2.0 函数的执行时间
TCRES2 TC 开发内存驻留程序
TCSED SED 编缉器的 TC 源代码
TCTEMPFX 用 TC++ 定义 EPSON 打印机功能键
TCTUTR 功能强大的 TC 教程
TCWIN 窗口开发 TC 源码,简单的指令形式
TCWIND16 窗口开发 TC 源码库
TCXL WINDOWS 开发 TC 源程序库
TCXL21 TC 扩展库
TCXL2TO5 将 CXL5.2库转换为TCXL5.5库的内存驻留程序
TCXL32 TC 扩展功能库函数
TCXL55 用户界面开发系统的函数库
TDCNVT TC DEBUG 升级版
TDE31 PUBLIC DOMAIN 文本编缉器的 C 语言源程序
TGE130 图形加速引擎1.3版,VGA/SVGA图形加速库
TIMERH C-ASM混合编程的毫秒级计时器
TOUCH_C 类似于 UNIX 系统的简单模拟 C 源码
TTCD151 TC 调试程序源代码
TURBOC TC 源代码库(文本编缉.数据录入.窗口开发...)
TURBOCRC 快速画圆源代码
TURTLEC TURTLE 图形开发命令系统 TC 源代码
UCLIBTC UNICORN 图形开发 TC 源代码库
UN_RDIR 标准输出系统的重定向
UNARJNT ARJ解包C语言源代码(可用于DOS.WINDOWS.WIN-NT下)
USERENV 多任务系统的 C 语言源代码
VCSLID 滚动菜单条的开发
VIDIDENT 显卡的识别
VIEWFILE 源代码查看器
VISIONS2 文本显示定位处理程序库
VMED 文本编缉器的 C 语言源代码
WARPCOMM WARP COM 口通讯 C 语言源程序库
WARPGRAF WARPGRAF 图形开发库
WATC80PI 关于WATCOM C的信息
WCOMM120 WARP 通讯库 C++源代码
WDOLD 字处理源代码库
WGETLN 行编缉源程序
WILDF1 允许使用通配符的 C 语言源代码
WINDSMET DESMET 窗口函数
WINLIB1 WINDOWS 窗口开发程序库
WINOBJ 目标窗口开发 C++源程序库
WINSRCH 窗口的剪贴
WIZTOO (BCWIZ,ROSWIZ,REGWIZ)三种源代码生成器
WNDC21 Egale 窗口开发程序
WUNZ20SR WINDOWS下对解包ZIP文件的C语言源程序
WXWIN140 WXWIN 1.4版;C++图形用户界面开发工具包
XENIXGCC XENIX 系统开发 C 语言源程序
XLIB20 XLIB 2.0版 32位应用程序开发 ASM/C语言的DOS 扩展库
XMS11 XMS 开发 C 语言源程序
XRF11 文件处理 C 和 Pascal 混合语言编程
XSPAWN33 运行大型文件建立交换文件的范例
YALL11 YAWL窗口开发 C 语言源程序

--

凤 翅 天 翔

※ 来源:．庭芳苑 bbs.fzu.edu.cn．[FROM: 210.34.49.180]


发信人: daihao.bbs@210.34.48.50 (不死鸟), 信区: C
标 题: C源代码大放送--地址
发信站: FZU_BBS (Tue Apr 14 17:33:13 1998)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
ftp1.fzu.edu/incoming/lsk
太多了，其余以后我会upload
--

凤 翅 天 翔

※ 来源:．庭芳苑 bbs.fzu.edu.cn．[FROM: 210.34.49.180]


全国计算机等级考

饮水思源站 全国计算机等级考 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 全国等级考！！ gch | 485 | 00/03/11 01:43


发信人: gch (独孤求败), 信区: C
标 题: 全国等级考！！
发信站: 饮水思源站 (Wed Apr 8 17:32:12 1998) , 站内信件
听说全国等级考编程题的自动批改系统
仅仅批改一个*.out文件而测试数据也只放在
一个*.in文件中，不知是否真有此说，我一师兄
去年考三级时，怎么都没调时真确。情急之下
用tc打开了一个*.in文件从中读出了那个测试数据
口算出一组结果，然后自己EDIT了一个*.out(文件名
可在程序中找出）结果成绩出来，优秀的说！！

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.59.201]


发信人: wangsongw (牛牛), 信区: C
标 题: 在VC中如何由DLL文件得到它的LIB文件
发信站: 饮水思源站 (Sat Apr 11 21:03:55 1998) , 转信
这里有一

个比较土的办法，但经过偶的实践比较有效。
以win95的Toolhelp32函数之一Thread32First为例说明这个问题。
(btw:Toolhelp32函数由KERNEL32.DLL输出，vc5.0提供了头文件
但没有静态库，由此只有通过运行时动态连接得到函数的指针，如
果得到它的静态连接库则可以在装入时动态连接，使用起来比较方
便)首先使用vc5.0的使用工具dumpbin得到KERNEL32.DLL的输出
名表。命令行参数如下∶
dumpbin /EXPORTS c:\win95\system\kernel32.dll >tempfile
然后打开tempfile查找到Thread32First的引出序号为688，
然后自己写一个.def文件。(假设文件名为k32lib.def)格式如下∶

LIBRARY KERNEL32
EXPORTS
Thread32First@12 @688

第一个@后的12表示该函数有两个参数，win32的函数参数都是4字
节，再加上表示函数名的4字节参数，因此是12。类似的如果函数有
n个参数，则@后的数值为(n+1)*4 。
这里有一个比较土的办法，但经过偶的实践比较有效。
以win95的Toolhelp32函数之一Thread32First为例说明这个问题。
(btw:Toolhelp32函数由KERNEL32.DLL输出，vc5.0提供了头文件
但没有静态库，由此只有通过运行时动态连接得到函数的指针，如
果得到它的静态连接库则可以在装入时动态连接，使用起来比较方
便)首先使用vc5.0的使用工具dumpbin得到KERNEL32.DLL的输出
名表。命令行参数如下∶
dumpbin /EXPORTS c:\win95\system\kernel32.dll >tempfile
然后打开tempfile查找到Thread32First的引出序号为688，
然后自己写一个.def文件。(假设文件名为k32lib.def)格式如下∶

LIBRARY KERNEL32
EXPORTS
Thread32First@12 @688

然后用命令行:
lib /MACHINE:IX86 /DEF:K32LIB.DEF
得到静态库k32lib.lib，现在可以把k32lib.lib链入到自己的工程文件
中，就可以直接使用Thread32First函数了。
在使用前必须知道函数原形，可以包括头文件tlhelp32.h或自己声
明如下∶
BOOL WINAPI Thread32First( HNDLE,LPTHREADENTRY32 );
这样就不必使用GetModuleHandle()打开KERNEL32.DLL，再使用
GetProcAddress()得到Thread32First的指针就可以直接调用该函数
了。
综上所述，要得到DLL的静态库LIB，只要知道它的输出函数的原
形，将所有输出函数作上述处理就可以了。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.23]


有问有答

饮水思源站 有问有答 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Re: 请问如何在VC中COPY文件？ pwc | 1038 | 00/04/29 13:38
文件 | C 语言高手 cloudwu | 604 | 00/04/29 13:38
文件 | Re: C 语言高手 abbelf | 1716 | 00/04/29 13:38
文件 | Re: 内嵌汉字的一种方法 cloudwu | 1154 | 00/04/29 13:38
文件 | Re: 请教 howe | 965 | 00/04/29 13:39
文件 | Re: 请教HP工作站上编译生成的二进制数据 zonelf | 1875 | 00/04/29 13:39
文件 | C++ quiz 1 anwer sticker | 1190 | 00/04/29 13:39
文件 | Re: C++ quiz 1 anwer abbelf | 1764 | 00/04/29 13:39
文件 | C++ quiz 2 sticker | 1608 | 00/04/29 13:39
文件 | Re: C++ quiz 2 abbelf | 1918 | 00/04/29 13:39
文件 | Re: C++ quiz 2 sticker | 1244 | 00/04/29 13:40
文件 | Re: 怎样使用class stack? 请教 sticker | 572 | 00/04/29 13:43
文件 | Re: question lbs. | 1183 | 00/04/29 13:44
文件 | 小题一道（关于链表） jia | 15892 | 00/04/29 14:41


发信人: pwc (bbs), 信区: C
标 题: Re: 请问如何在VC中COPY文件？
发信站: 饮水思源站 (Mon Mar 23 20:41:38 1998) , 站内信件
【 在 pretty (pretty) 的大作中提到: 】
: 请问如何在VISUAL C++中COPY文件？
: 不能用system("copy..."); 因为这样会有DOS窗口闪现。
在Visual C++ 5.0 中有一个这样的WIN32 API 函数
WINSHELLAPI int WINAPI SHFileOperation( LPSHFILEOPSTRUCT lpFileOp );

lpFileOp
Pointer to an SHFILEOPSTRUCT structure that contains information the
function needs to carry out the operation.

Returns zero if successful or nonzero if an error occurs.

SHFILEOPSTRUCT struct as followed:

typedef struct _SHFILEOPSTRUCT { // shfos
HWND hwnd;
UINT wFunc;
LPCSTR pFrom;
LPCSTR pTo;
FILEOP_FLAGS fFlags;
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
LPCSTR lpszProgressTitle;
} SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;

For
For more information ,please turn to vc's help

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.240.246]


发信人: cloudwu (云风), 信区: C
标 题: C 语言高手
发信站: 饮水思源站 (Thu Apr 30 09:19:27 1998) , 转信
请问有没有人以为自己是C语言高手？
本来我认为自己算半个的，可是我还是不能在10分钟内看明白下面这个
程序.

main(v,c)char**c;{for(v[c++]="hello,world!\n";
(!!c)[*c]&&(v--||--c&&execlp(*c,*c,c[!!c]+
!!c,!c));**c=!c)write(!!*c,*c,!!**c);}

1985年 HP Jack Applin 所写.
如果你能一眼看明白这个程序，佩服佩服,
你已经完全掌握了这门语言的语法:)

--
http://www.nease.net/~cloudwu
http://computer.igd.edu.cn/~cloud
E-mail: cloudwu@163.net

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.197.71.12]


发信人: abbelf (神之擎), 信区: C
标 题: Re: C 语言高手
发信站: 饮水思源站 (Tue May 5 17:41:19 1998) , 站内信件
【 在 law (青铜时代) 的大作中提到: 】
: 这个程序是HP资深程序员写的。他写这个程序的目的是考验人们对C语言语法的熟悉
: 程度。我相信这个程序一定是符合ansi标准的，而且我相信他平时写程序的风格一定
: 也是很好的。

main(v,c)char**c;{for(v[c++]="hello,world!\n";
(!!c)[*c]&&(v--||--c&&execlp(*c,*c,c[!!c]+
!!c,!c));**c=!c)write(!!*c,*c,!!**c);}

整理一下

main( v, c )
char **c;
{
for ( v[c++] = "hello,world!\n";
(!!c)[*c] && ( v-- || --c && execlp( *c, *c, c[!!c] + !!c, !c ) );
**c = !c )
write( !!*c, *c, !!**c );
}

改写一下,
main( int v, char**c )
{
for ( c[v] = "hello,world!\n", c++;
c[0][1] && ( v-- || --c && execlp( *c, *c, c[1]+1, 0 ) );
**c = 0 )
write( 1, *c, c[0][0] ? 1 : 0 );
}

分析:(假设不带参数)
1. 刚开始: v = 1; c[0]是本身程序路径.(argv=1)
argv[1] = "hello,world!\n";
c[0][1] 为 argv[1][1] 是 'e';
v-- 为 1, "--c..."肯定不被执行
write( 1, "hello...", 1 ); 打印出'h'
argv[1][0] = '\0';
继续循环, 这时 v为0, 要执行 "--c &&..."
就是执行 execlp ( argv[0], argv[0], "ello,world!\n", 0 );

2.变成带一个参数执行, 这样 v = 2.
write会被执行两遍, 但是第二次没用.打印了0字节.
第一次打印乐argv[1][0].
然后再将执行 execlp( argv[0], argv[0], argv[1]+1, 0 );

这样递归下去, 打印出 e, l, l, o ....等等.

3. 当 argv[1] 只有一个字节的时候, 什么也不做.

总体效果: 打印出 hello,world! 不包括最后的会车,
程序本身被执行了若干次.

--
※ 修改:·abbelf 於 May 5 17:49:09 修改本文·[FROM: 202.120.16.15]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: cloudwu (云风), 信区: C
标 题: Re: 内嵌汉字的一种方法
发信站: 饮水思源站 (Fri May 8 12:14:35 1998) , 站内信件
【 在 airforceone (jack) 的大作中提到: 】
: 我刚好去年写过一个中文阅读器，内嵌汉字用的方法是---------
: 不内嵌！！ 其实结果是嵌入了，但不是从写程序角度做的。
: 只要将字库以 二进制方式连入EXE文件尾，程序从文件尾开始
: 读字库就行了. (编译后的exe文件的长度很容易得到的）。
: 最简单的连接方式是-----用COPY 命令，别忘加/B 参数哦！
这个方法我也用过,在我写的一个中文阅读器的早期版本中
后来为何不用?有几点原因
当初我的设计是可以直接在软盘上运行的,我那样做
可以减少程序载入时间,(我在程序中内嵌cache)
但是后来,程序一般是在硬盘上载入的,就现在的硬盘速度
而言, 200K 的载入是一瞬间的事情
当时我希望给文本留下更大的内存,所以采取动态载入部分
字库的方法,而现在内存不成问题,而且我早以改用保护模式
编程了
其三,就目标程序大小而言,整个字库嵌入程序,便于压缩
而附加到程序末尾,如果想压缩的话还得自己写程序,麻烦:(
现在我用的办法是,直接将做好的字库 obj 文件link 到自己
需要字库的程序中

--
--
http://www.nease.net/~cloudwu
http://computer.igd.edu.cn/~cloud
E-mail: cloudwu@163.net

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.197.71.13]


发信人: howe (无痕), 信区: C
标 题: Re: 请教
发信站: 饮水思源站 (Tue May 26 15:28:21 1998) , 站内信件
【 在 pj (寂寞的鸵鸟) 的大作中提到: 】
: 有一个大数据文件ab.arj，我想把它复制为ab.bak
: 程序如下，但结果是ab.bak比ab.arj(约12M)大700K
: 请指教，多谢。
:
: # include
: # include
: # include
:
: void main()
: {
: FILE * f1, * f2;
: long size;
: char * buf;
:
: f1=fopen("ab.arj","r");
: f2=fopen("ab.bak","w");
:
: fseek(f1,0,SEEK_END);
: size=ftell(f1);
: buf=(char *)malloc(size);
: fseek(f1,0,SEEK_SET);
:
: fread(buf,size,1,f1);
: fwrite(buf,size,1,f2);
:
: fcloseall();
: }
:
这样写比较好，可以避免危险的指针操作:
(你的动态申请的内存没释放)
void main()
{
FILE *f1,*f2;
Char buf[60000];
long size;
f1=fopen("ab.arj","rb");
f2=fopen("ab.bak,"wbr+");
while((size=fread(buf,60000,1,f1))>0)
fwrite(buf,size,1,f2);
fcloseall();
}

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www]


发信人: zonelf (狱之枢), 信区: C
标 题: Re: 请教HP工作站上编译生成的二进制数据文件格式?
发信站: 饮水思源站 (Tue Jul 7 14:35:31 1998) , 站内信件
【 在 master (共饮长江水) 的大作中提到: 】
: 程序由HP工作站编译器编译，其作用是：写一个数据文件(纯数据)。
: 现发现微机上的程序不能够读，原因是工作站二进制文件数据存放格式
: 为由高到低，例：1234在工作站二进制文件中存放顺序为00 00 04 D2;
: 而在微机程序所能读的顺序为D2 04 00 00,即由低到高。现想编一个转
: 换程序，使得工作站和微机之间能够互相读。想请教的是，工作站和微

这个和 CPU 有关, 主要涉及字长, 字节序和对齐方式.

以 32 位字长为例子: ( 现在主要都是 32 位 CPU )

字节序为低有效位在前的有 Intel x86, digital Alpha, 部分MIPS芯片
字节序为高有效位在前的是 Motorola 680x0, Sun Sparc, Power PC
和另外的一些 MIPS 芯片.
还有一些比如有 3412 之类的字节序, 如 PDP-11(?)之类. 不过现在这种结构
比较少, 可以不考虑.

还有就是字节对齐. 许多 CPU 不允许奇地址的访问, 如 Sparc 和 Motorola 680X0
这样就要填充不同字节来保持对齐. Intel X86 支持按字节对齐, 也可按照 2, 4
字节对弃. 按字节对齐会降低系统性能. 符点数也有字节序问题, 其字节序和整型
相同. 4 字节和八字节数满足 IEEE 754 标准, 10/12字节浮点数满足 IEEE 854
标准, 但是字节序按照主机字节序

为了各机器兼容, 可以有下面方法.

1. 全部变成 Internet 字节序 ( 高有效位在前 ), 并且
统一由一字节, (或者四字节 ) 对齐. 如果对齐方式和主机允许方式不同,
可以采用 memcpy, 或者从(字节)流中一个一个读取.

转换程序可以用 socket 库的 htons ntohs htonl ntohl.

2. 全部使用 ASC 码交换数据.

: 机的二进制文件有没有什么格式否？譬如，有无文件开始标志、文件结
: 束标志、数据之间的分隔符之类的东西...

文件和操作系统有关, 一般说来二进制文件没有这些标志和分隔符.
只要研究主流的 OS: DOS ( Windows/95/NT/OS/2) 和 Unix 的文件访问方式就可以了.

--
※ 修改:·zonelf 於 Jul 7 14:48:08 修改本文·[FROM: 202.120.16.57]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.57]


发信人: sticker (sticker), 信区: C
标 题: C++ quiz 1 anwer
发信站: 饮水思源站 (Tue Aug 11 09:14:47 1998) , 转信
the answer to quiz 1: A a(); is wrong.

the ideal and intuitive way to declare an object with
default constructor is
A a(); //1
not
A a; //2
line 1 is consistent with lines like
A a(3);
A a(3,"haha"); // etc
and line 2 is consistent with lines like
int i;
float f;

however, in our old C, line 1
is to declare a function named "a" that takes "void"
parameter and returns a "class A" type object, like
A func(void);

if line 1 passes your compiler, try this
A a(); // a is a function
A b; // b is an object
b=a; //wrong!
b=a(); //yes.

my compiler does not allow line 1 at all. so for compatibility
never use line 1. either
A a(void); //for function
or
A a; //for object.

also never say
int j(); // is it a function or an int object?
instead
int j(void); // function "j"
int j; // integer named j, uninitialized;
int j(0); // integer j with initial value 0;
int j=0; // another way to write the line above.

HINT: use "void" whenever and wherever you can.
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www]


发信人: abbelf (神之擎), 信区: C
标 题: Re: C++ quiz 1 anwer
发信站: 饮水思源站 (Tue Aug 11 12:09:16 1998) , 站内信件
对, A a(); 应是函数声明，倒是没注意到，从未试图用 A a();
来声明过对象。光那一句话编译是没问题的, 所以没注意。:)

不过关于 () 和 (void) 的区别确实也不大清楚，不知道各个版本 C++ 的标准
里是怎么写的？我最早看的书认为 () 等价于 (...)；好象有编译器这样做的。
不过后来好象都被解释成 (void), 我看很多类库就是这么用的。
不知道你用的什么编译器。要找一套标准太麻烦了，望指教。

【 在 sticker (sticker) 的大作中提到: 】
: the answer to quiz 1: A a(); is wrong.
: the ideal and intuitive way to declare an object with
: default constructor is
: A a(); //1
: not
: A a; //2
: line 1 is consistent with lines like
: A a(3);
: A a(3,"haha"); // etc
: and line 2 is consistent with lines like
: int i;
: float f;
: however, in our old C, line 1
: is to declare a function named "a" that takes "void"
: parameter and returns a "class A" type object, like
: A func(void);
: if line 1 passes your compiler, try this
: A a(); // a is a function
: A b; // b is an object
: b=a; //wrong!
: b=a(); //yes.
: my compiler does not allow line 1 at all. so for compatibility
: never use line 1. either
: A a(void); //for function
: or
: A a; //for object.
: also never say
: int j(); // is it a function or an int object?
: instead
: int j(void); // function "j"
: int j; // integer named j, uninitialized;
: int j(0); // integer j with initial value 0;
: int j=0; // another way to write the line above.
: HINT: use "void" whenever and wherever you can.

--
※ 修改:·abbelf 於 Aug 11 13:07:45 修改本文·[FROM: 202.120.16.15]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: sticker (sticker), 信区: C
标 题: C++ quiz 2
发信站: 饮水思源站 (Tue Aug 11 10:18:13 1998) , 转信
//what's wrong with class SpanishToChinese ?

//assume that nothing wrong with SpanishToEnglish
//and EnglishToChinese and class String.
//---------------------------------------------
class SpanishToEnglish{

public:

String _the_english;

//constructor: take a Spanish word and convert it
//to the English word and store it in "_the_english"

SpanishToEnglish (String a_spanish){};

};
//---------------------------------------------
class EnglishToChinese{

public:

String _the_chinese;

//constructor: take a English word and convert it
//to the Chinese word and store it in "_the_chinese"

EnglishToChinese (String a_english){};

};

//------------------------------------------------
//here comes the trick.

class SpanishToChinese{

public:

String _the_chinese;

//constructor: take a Spanish word and convert it
//to the Chinese word and store it in "_the_chinese"

SpanishToChinese (String a_spanish){};

private: // need to store them for some reason.
String _the_spanish;
SpanishToEnglish _tmp_english;
EnglishToChinese _tmp_chinese;

}; //still nothing wrong, en?

//implementation of the constructor
//the job is easy: Spanish -> English -> Chinese

SpanishToChinese :: SpanishToChinese (String a_spanish)
: _the_spanish ( a_spanish ) // initializations
, _tmp_english ( _the_spanish )
, _tmp_chinese ( _tmp_english . _the_english )
, _the_chinese ( _tmp_chinese . _the_chinese )

{
// null body.
}

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www]


发信人: abbelf (神之擎), 信区: C
标 题: Re: C++ quiz 2
发信站: 饮水思源站 (Tue Aug 11 13:03:03 1998) , 站内信件
【 在 sticker (sticker) 的大作中提到: 】
: //what's wrong with class SpanishToChinese ?
: //assume that nothing wrong with SpanishToEnglish
: //and EnglishToChinese and class String.
: //---------------------------------------------
: class SpanishToEnglish{
: public:
: String _the_english;
: //constructor: take a Spanish word and convert it
: //to the English word and store it in "_the_english"
: SpanishToEnglish (String a_spanish){};
: };
: //---------------------------------------------
: class EnglishToChinese{
: public:
: String _the_chinese;
: //constructor: take a English word and convert it
: //to the Chinese word and store it in "_the_chinese"
: EnglishToChinese (String a_english){};
: };
: //------------------------------------------------
: //here comes the trick.
: class SpanishToChinese{
: public:
: String _the_chinese;
: //constructor: take a Spanish word and convert it
: //to the Chinese word and store it in "_the_chinese"
: SpanishToChinese (String a_spanish){};
^^ 这个括号不要否则编译通不过。

: private: // need to store them for some reason.
: String _the_spanish;
: SpanishToEnglish _tmp_english;
: EnglishToChinese _tmp_chinese;
: }; //still nothing wrong, en?
: //implementation of the constructor
: //the job is easy: Spanish -> English -> Chinese
: SpanishToChinese :: SpanishToChinese (String a_spanish)
: , _tmp_english ( _the_spanish )
: , _tmp_chinese ( _tmp_english . _the_english )
: , _the_chinese ( _tmp_chinese . _the_chinese )

构造顺序并不是按照前后顺序。我的编译器是按照各个变量在定义
中出现的先后顺序构造的。(顺序是 4 1 2 3)，应该尽量避免在
构造基类的顺序相关性吧。不知道标准中有何描述。

: {
: // null body.
: }

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: sticker (sticker), 信区: C
标 题: Re: C++ quiz 2
发信站: 饮水思源站 (Tue Aug 11 14:43:10 1998) , 转信
: : SpanishToChinese (String a_spanish){};
: ^^ 这个括号不要否则编译通不过。
oops! you are right.

: : SpanishToChinese :: SpanishToChinese (String a_spanish)
: : , _tmp_english ( _the_spanish )
: : , _tmp_chinese ( _tmp_english . _the_english )
: : , _the_chinese ( _tmp_chinese . _the_chinese )
:
: 构造顺序并不是按照前后顺序。我的编译器是按照各个变量在定义
: 中出现的先后顺序构造的。(顺序是 4 1 2 3)，应该尽量避免在
: 构造基类的顺序相关性吧。不知道标准中有何描述。
:

yes. those initializations are executed in the order they
are declared. althought that's the standard, I think we'd
better not depend on that, as you said. someday you change
the order of the declarations and it can introduce a bug
that's hard to find.

a good compiler should give a warning
"_tmp_chinese used before initialized" for the last line.

although we may have as many construcors as we like, there's
only one destructor, so we can only have one kind of order
to destruct the member data, and the reversed order must be
used for all constructors.
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www]


发信人: sticker (sticker), 信区: C
标 题: Re: 怎样使用class stack? 请教
发信站: 饮水思源站 (Fri Aug 14 08:04:35 1998) , 转信
【 在 sticker (sticker) 的大作中提到: 】
: 【 在 small (晓) 的大作中提到: 】
: : 我在Borland C++ 3.1 中这样使用class stack：
: :
: : Stack s;
: : s.push(2); //error...－－4个错误
: :
: : 不知该怎样使用class stack。例如，一个int类型的栈。
: : 哪位大侠知道，请指教。
: : 多谢了。
: :

they are template classes.

Stack< int > si;
Stack< double > sd;

Stack< Stack< int > > ss;
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www]


发信人: lbs.bbs@bbs.dlut.edu.cn (iceberg), 信区: C
标 题: Re: question
发信站: 碧海青天 (Wed Aug 12 15:59:33 1998)
转信站: sjtubbs!sjtunews!ustcnews!DUT
Origin: rose.dlut.edu.cn
【 在 oldcat (moggy) 的大作中提到: 】
: 【 在 AirPort (天海一笑) 的大作中提到: 】
: : 要用最简格式打印输出一浮点数变量，请教各位该如何办。
: ******************************************************************************
: please to use printf("%m.nf",inv);

如下程序可以实现，只是略繁
在BC 3.1 For Dos下实现。原myprint并无char *s参数，但
不知为何返回结果字串稍长时被截断，故加之。
#include <math.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
char *myprint(double f,char *s)
{// char s[40];
int i;
sprintf(s,"%.14lf",f);
for (i=strlen(s)-1; i>0; i--)
if (s[i]!='0' && s[i]!='.') break;

s[i+1]=0;
return s;
}
void main(void)
{ double f1,f2,f3,f4;
char s[40];
f1 = 123;
f2 = 123.12;
f3 = 123.12345678912232;
f4 = 0;

printf("\n%s",myprint(f1,s));
printf("\n%s",myprint(f2,s));
printf("\n%s",myprint(f3,s));
printf("\n%s",myprint(f4,s));

getch();
}
--

遥知不是雪，惟有暗香来...

※ 来源:．碧海青天 bbs.dlut.edu.cn．[FROM: 202.118.68.10]


发信人: emcc (Tarzan), 信区: C
标 题: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 01:22:19 2000), 转信
将单向链表逆转，注意使用最少的内存。
最好不需额外内存。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.24.113.238]
发信人: emcc (Tarzan), 信区: C
标 题: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 01:22:19 2000), 转信

将单向链表逆转，注意使用最少的内存。
最好不需额外内存。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.24.113.238]
open: Permission denied
发信人: WKL (八哥), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 08:08:01 2000), 转信

【 在 emcc (Tarzan) 的大作中提到: 】
: 将单向链表逆转，注意使用最少的内存。
: 最好不需额外内存。

三个指针就够了

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.118.68.69]
发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 08:38:31 2000), 转信

我能想到的最好方法是需要一个额外内存。
算法如下，
1) nLen=CountLinkListLen(pLinkList)
2) 循环 (nLen/2)次
3) 在每一个循环中
交换(pLinkList+i)->Data和(pLinkList+nLen-1-i)->Data的值
循环结束
链表就倒转了。
需要一个额外内存存放pLinkList->Data，用于交换。算法是O(n)
的。

三个指针是如何实现的？请教！

【 在 WKL 的大作中提到: 】
: 发信人: WKL (八哥), 信区: C
: 标 题: Re: 小题一道（关于链表）
: 发信站: 饮水思源站 (Sat Apr 22 08:08:01 2000), 转信
:
: 【 在 emcc (Tarzan) 的大作中提到: 】
: : 将单向链表逆转，注意使用最少的内存。
: : 最好不需额外内存。
:
: 三个指针就够了
:
: --
: ※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.118.68.69]

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 206.86.196.155]
发信人: WKL (八哥), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 08:45:49 2000), 转信

【 在 tonyxu (无斋主人) 的大作中提到: 】
: 我能想到的最好方法是需要一个额外内存。
: 算法如下，
: 1) nLen=CountLinkListLen(pLinkList)
: 2) 循环 (nLen/2)次
: 3) 在每一个循环中
: 交换(pLinkList+i)->Data和(pLinkList+nLen-1-i)->Data的值
: 循环结束
: 链表就倒转了。
: 需要一个额外内存存放pLinkList->Data，用于交换。算法是O(n)
: 的。
: 三个指针是如何实现的？请教！

为什么要交换数据?
直接把指针改一下方向不就可以了.
三个指针分别指向当前节点,前一个节点和后一个节点

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.118.68.69]
发信人: truelance (兰斯洛), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 08:55:05 2000), 转信

【 在 tonyxu (无斋主人) 的大作中提到: 】
: 我能想到的最好方法是需要一个额外内存。
: 算法如下，
: 1) nLen=CountLinkListLen(pLinkList)
: 2) 循环 (nLen/2)次
: 3) 在每一个循环中
: 交换(pLinkList+i)->Data和(pLinkList+nLen-1-i)->Data的值
: 循环结束
: 链表就倒转了。
: 需要一个额外内存存放pLinkList->Data，用于交换。算法是O(n)
: 的。
: 三个指针是如何实现的？请教！
指针转向就可以了，交换数据是不对的!!!
单向链表无法从后向前遍历,nlen-1-i无法读取

--
我有迷魂招不得

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.216]
发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 08:55:24 2000), 转信

Right,想歪了。
pTemp = pList->next;
while(pTemp) {
pList = pTemp;
pTemp = pTemp->next;
pList->next = pList;
}
好象这就可以，一个指针就可以搞定。

【 在 WKL (八哥) 的大作中提到: 】
: 标 题: Re: 小题一道（关于链表）
: 发信站: 饮水思源站 (Sat Apr 22 08:45:49 2000), 转信
:
: 【 在 tonyxu (无斋主人) 的大作中提到: 】
: : 我能想到的最好方法是需要一个额外内存。
: : 算法如下，
: : 1) nLen=CountLinkListLen(pLinkList)
: : 2) 循环 (nLen/2)次
: : 3) 在每一个循环中
: : 交换(pLinkList+i)->Data和(pLinkList+nLen-1-i)->Data的值
: : 循环结束
: : 链表就倒转了。
: : 需要一个额外内存存放pLinkList->Data，用于交换。算法是O(n)
: : 的。
: : 三个指针是如何实现的？请教！
:
: 为什么要交换数据?
: 直接把指针改一下方向不就可以了.
: 三个指针分别指向当前节点,前一个节点和后一个节点
:
:
: --
: ※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.118.68.69]

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 206.86.196.155]
发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 09:00:37 2000), 转信

是想歪了，请看上一篇的解法。
我也出道题，假设有一个无限链表，告诉你一个指针，
指向该链表的某一个Member,请你删除该指针指向的
单元，不许用额外内存，链表是单向的。

【 在 truelance (兰斯洛) 的大作中提到: 】
: 【 在 tonyxu (无斋主人) 的大作中提到: 】
: : 我能想到的最好方法是需要一个额外内存。
: : 算法如下，
: : 1) nLen=CountLinkListLen(pLinkList)
: : 2) 循环 (nLen/2)次
: : 3) 在每一个循环中
: : 交换(pLinkList+i)->Data和(pLinkList+nLen-1-i)->Data的值
: : 循环结束
: : 链表就倒转了。
: : 需要一个额外内存存放pLinkList->Data，用于交换。算法是O(n)
: : 的。
: : 三个指针是如何实现的？请教！
: 指针转向就可以了，交换数据是不对的!!!
: 单向链表无法从后向前遍历,nlen-1-i无法读取

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 206.86.196.155]
open: Permission denied
发信人: ConeZXY (小鱼), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 14:01:34 2000), 转信

头节点还要专门处理一下
btw:这次高程考试多项式相乘的那道题就是用的这个方法

【 在 tonyxu (无斋主人) 的大作中提到: 】
: Right,想歪了。
: pTemp = pList->next;
: while(pTemp) {
: pList = pTemp;
: pTemp = pTemp->next;
: pList->next = pList;
: }
: 好象这就可以，一个指针就可以搞定。
: 【 在 WKL (八哥) 的大作中提到: 】
: : 标 题: Re: 小题一道（关于链表）
: : 发信站: 饮水思源站 (Sat Apr 22 08:45:49 2000), 转信
: : 为什么要交换数据?
: : 直接把指针改一下方向不就可以了.
: : 三个指针分别指向当前节点,前一个节点和后一个节点
: : --
: : ※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.118.68.69]

--

泉水白白流淌\
花朵为谁开放\
是这样美丽负伤的麦子\
吐着芬芳\
站在山冈上\

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.220]
发信人: ConeZXY (小鱼), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 14:11:40 2000), 转信

不知道你所说的删除是不是指free memory
如果是
好象无解吧
没有上一个节点的信息
你怎么把他的next连到下一个节点上去呢？

如果是指删除这个节点的信息
可以采用类似数组删除元素的方法
whlile(!member->next)
{
member->data = member->next->data;
member = member->next;
}
delete member;

【 在 tonyxu (无斋主人) 的大作中提到: 】
: 是想歪了，请看上一篇的解法。
: 我也出道题，假设有一个无限链表，告诉你一个指针，
: 指向该链表的某一个Member,请你删除该指针指向的
: 单元，不许用额外内存，链表是单向的。
: 【 在 truelance (兰斯洛) 的大作中提到: 】
: : 指针转向就可以了，交换数据是不对的!!!
: : 单向链表无法从后向前遍历,nlen-1-i无法读取

--

泉水白白流淌\
花朵为谁开放\
是这样美丽负伤的麦子\
吐着芬芳\
站在山冈上\

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.220]
发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 15:01:08 2000), 转信

就是此解法。两年前我去M$，interview时就被考了
这题，想了好一会儿才做出来。
所以前面一题，一开始就想到交换数据上去了。

【 在 ConeZXY (小鱼) 的大作中提到: 】
: 不知道你所说的删除是不是指free memory
: 如果是
: 好象无解吧
: 没有上一个节点的信息
: 你怎么把他的next连到下一个节点上去呢？
: 如果是指删除这个节点的信息
: 可以采用类似数组删除元素的方法
: whlile(!member->next)
: {
: member->data = member->next->data;
: member = member->next;
: }
: delete member;
: 【 在 tonyxu (无斋主人) 的大作中提到: 】
: : 是想歪了，请看上一篇的解法。
: : 我也出道题，假设有一个无限链表，告诉你一个指针，
: : 指向该链表的某一个Member,请你删除该指针指向的
: : 单元，不许用额外内存，链表是单向的。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 209.141.66.198]
发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 15:07:43 2000), 转信

不用，如果pList只有一个节点的话，pTemp就是NULL，
不会进行循环。当然pList不能为NULL。

【 在 ConeZXY 的大作中提到: 】
: 头节点还要专门处理一下
: btw:这次高程考试多项式相乘的那道题就是用的这个方法
: 【 在 tonyxu (无斋主人) 的大作中提到: 】
: : Right,想歪了。
: : pTemp = pList->next;
: : while(pTemp) {
: : pList = pTemp;
: : pTemp = pTemp->next;
: : pList->next = pList;
: : }
: : 好象这就可以，一个指针就可以搞定。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 209.141.66.198]
发信人: WKL (八哥), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 17:23:56 2000), 转信

【 在 tonyxu (无斋主人) 的大作中提到: 】
: Right,想歪了。
: pTemp = pList->next;
: while(pTemp) {
: pList = pTemp;
: pTemp = pTemp->next;
: pList->next = pList;
: }
: 好象这就可以，一个指针就可以搞定。

最后一条语句只会产生孤立节点
while循环应该是
pPrev=pList;
pList=pTemp;
pTemp=pTemp->next;
pList->next=pPrev;

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.118.68.69]
open: Permission denied
发信人: truelance (兰斯洛), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 18:11:43 2000), 转信

也就MS才会出这么馊的题目，用一个指针就可以使时间复杂度大大下降。
MS不会在开发时也卖弄这种技巧，才有那么多垃圾吧!

【 在 tonyxu (无斋主人) 的大作中提到: 】
: 就是此解法。两年前我去M$，interview时就被考了
: 这题，想了好一会儿才做出来。
: 所以前面一题，一开始就想到交换数据上去了。
: 【 在 ConeZXY (小鱼) 的大作中提到: 】
: : 不知道你所说的删除是不是指free memory
: : 如果是
: : 好象无解吧
: : 没有上一个节点的信息
: : 你怎么把他的next连到下一个节点上去呢？
: : 如果是指删除这个节点的信息
: : 可以采用类似数组删除元素的方法
: : whlile(!member->next)
: : {
: : member->data = member->next->data;
: : member = member->next;
: : }
: : delete member;

--
我有迷魂招不得

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.216]
发信人: emcc (Tarzan), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sat Apr 22 23:57:07 2000), 转信

听好了，无斋主人，继续做此题，
现在偶一个额外指针都不允许你用．

【 在 tonyxu (无斋主人) 的大作中提到: 】
: Right,想歪了。
: pTemp = pList->next;
: while(pTemp) {
: pList = pTemp;
: pTemp = pTemp->next;
: pList->next = pList;
: }
: 好象这就可以，一个指针就可以搞定。
: 【 在 WKL (八哥) 的大作中提到: 】
: : 标 题: Re: 小题一道（关于链表）
: : 发信站: 饮水思源站 (Sat Apr 22 08:45:49 2000), 转信
: : 为什么要交换数据?
: : 直接把指针改一下方向不就可以了.
: : 三个指针分别指向当前节点,前一个节点和后一个节点
: : --
: : ※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.118.68.69]

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: ppp12.dyn121.pacific]
open: Permission denied
发信人: ConeZXY (小鱼), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Sun Apr 23 14:19:33 2000), 转信

不
我是指原来的头节点现在变成尾节点了
它的next应该等于null

【 在 tonyxu (无斋主人) 的大作中提到: 】
: 不用，如果pList只有一个节点的话，pTemp就是NULL，
: 不会进行循环。当然pList不能为NULL。
: 【 在 ConeZXY 的大作中提到: 】
: : 头节点还要专门处理一下
: : btw:这次高程考试多项式相乘的那道题就是用的这个方法

--

泉水白白流淌\
花朵为谁开放\
是这样美丽负伤的麦子\
吐着芬芳\
站在山冈上\

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.220]
发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Tue Apr 25 01:25:14 2000), 转信

对，是这样。
谢谢。
【 在 ConeZXY 的大作中提到: 】
: 不
: 我是指原来的头节点现在变成尾节点了
: 它的next应该等于null
: 【 在 tonyxu (无斋主人) 的大作中提到: 】
: : 不用，如果pList只有一个节点的话，pTemp就是NULL，
: : 不会进行循环。当然pList不能为NULL。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 206.86.196.155]
发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Tue Apr 25 01:28:52 2000), 转信

想不出，不再想了。请告知答案。正好明天要
Interview一个号称有n年C/C++经验的老印。
就拿这题难难他。

【 在 emcc (Tarzan) 的大作中提到: 】
: 听好了，无斋主人，继续做此题，
: 现在偶一个额外指针都不允许你用．
: 【 在 tonyxu (无斋主人) 的大作中提到: 】
: : Right,想歪了。
: : pTemp = pList->next;
: : while(pTemp) {
: : pList = pTemp;
: : pTemp = pTemp->next;
: : pList->next = pList;
: : }
: : 好象这就可以，一个指针就可以搞定。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 206.86.196.155]
发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Tue Apr 25 01:33:58 2000), 转信

美国的Interview基本上就是这个路数。刚来美国时
很不习惯，很受羞辱一番。参加多了发现也就这么
一回事。关键不是看你做的出和做不错。关键是
看你The way of thinking and solving problem。而且
是否Smart。因为真要找了个很笨的家伙做teammate，
真是很难受。

【 在 truelance 的大作中提到: 】
: 也就MS才会出这么馊的题目，用一个指针就可以使时间复杂度大大下降。
: MS不会在开发时也卖弄这种技巧，才有那么多垃圾吧!
: 【 在 tonyxu (无斋主人) 的大作中提到: 】
: : 就是此解法。两年前我去M$，interview时就被考了
: : 这题，想了好一会儿才做出来。
: : 所以前面一题，一开始就想到交换数据上去了。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 206.86.196.155]
发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Tue Apr 25 05:45:03 2000), 转信

平心而论，M$的软件的质量并不差。你要看看MFC源
代码的话，可以发现他们的Design和coding的技巧是非常
高的。至少我个人觉得，要达到他们的coding的水平，
还是要花不少功夫和经验的。
M$的bug多，是因为他们的用户数量和使用频繁程度。
任何一个软件如果达到MS-Windows这样用户数量和
使用程度，也一定会有这么多Bug。
按照Silicon Valley的传统讲法，没有bug，就意味着
没有User。

【 在 truelance 的大作中提到: 】
: 也就MS才会出这么馊的题目，用一个指针就可以使时间复杂度大大下降。
: MS不会在开发时也卖弄这种技巧，才有那么多垃圾吧!
: 【 在 tonyxu (无斋主人) 的大作中提到: 】
: : 就是此解法。两年前我去M$，interview时就被考了
: : 这题，想了好一会儿才做出来。
: : 所以前面一题，一开始就想到交换数据上去了。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 206.86.196.155]
open: Permission denied
发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Wed Apr 26 08:26:37 2000), 转信

You are right, I am wrong. BTW,do you have any
ideas about how to do it without extra temp
pointers? As emcc mentioned.

Thanks.

【 在 WKL (八哥) 的大作中提到: 】
: 【 在 tonyxu (无斋主人) 的大作中提到: 】
: : Right,想歪了。
: : pTemp = pList->next;
: : while(pTemp) {
: : pList = pTemp;
: : pTemp = pTemp->next;
: : pList->next = pList;
: : }
: : 好象这就可以，一个指针就可以搞定。
: 最后一条语句只会产生孤立节点
: while循环应该是
: pPrev=pList;
: pList=pTemp;
: pTemp=pTemp->next;
: pList->next=pPrev;

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 206.86.196.155]
发信人: WKL (八哥), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Thu Apr 27 08:03:07 2000), 站内信件

【 在 tonyxu 的大作中提到: 】
: You are right, I am wrong. BTW,do you have any
: ideas about how to do it without extra temp
: pointers? As emcc mentioned.
: Thanks.

shake,我觉得那是不可能的.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.118.68.69]
发信人: emcc (Tarzan), 信区: C
标 题: Re: 小题一道（关于链表）
发信站: 饮水思源站 (Fri Apr 28 00:53:17 2000), 转信

【 在 WKL (八哥) 的大作中提到: 】
: 【 在 tonyxu 的大作中提到: 】
: : You are right, I am wrong. BTW,do you have any
: : ideas about how to do it without extra temp
: : pointers? As emcc mentioned.
: : Thanks.
: shake,我觉得那是不可能的.

对不起大家了，特别是无斋主人ｔｏｎｙｘｕ老人家，
在此向你道歉，浪费了您老的大好时光，（得知您老新婚不久）．
其实对于这个问题偶现在也倾向于认为至少需要一个额外指针，
至所以开这个玩笑是想充分发动大家的积极性，说不定能创造奇迹。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.24.109.163]


...
jia 1999.10.26 --- 2001.02.14
thebestone 2000.09.19 ---


临时目录（尚未整理的文档）

饮水思源站 临时目录（尚未整理的文档） 精华区离线浏览
类型 | 标题 | 长度 | 时间
目录 | 源代码 | 21项 | 01/03/28 21:14
目录 | Delphi | 1项 | 01/03/26 18:11
目录 | C 语言讨论 | 18项 | 01/03/28 20:02
目录 | 计算机等级考试和软件水平考试 | 3项 | 01/03/28 14:07
目录 | VC | 19项 | 01/03/28 21:11
目录 | 技术与应用 | 2项 | 01/03/27 20:49
目录 | Unknown | 3项 | 01/03/26 18:32
目录 | 休息一下 | 1项 | 01/03/26 18:34
目录 | TC / BC | 9项 | 01/03/28 12:59
目录 | Unix | 5项 | 01/03/28 13:30
目录 | C++ Builder | 5项 | 01/03/28 20:26
目录 | 小程序和小问题 | 8项 | 01/03/28 20:51
目录 | Others | 2项 | 01/03/27 19:14
目录 | C++ 语言讨论 | 8项 | 01/03/28 19:54
目录 | C 语言与其它语言混合编程 | 2项 | 01/03/28 19:14


源代码

饮水思源站 源代码 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 用C++建立图形图像类(一) wql. | 2410 | 01/03/26 18:08
文件 | 用C++建立图形图像类(二) wql. | 1947 | 01/03/26 18:08
文件 | 用C++建立图形图像类(三) wql. | 2425 | 01/03/26 18:08
文件 | 自编程挽救软盘数据 hunt. | 1826 | 01/03/26 18:09
文件 | c程序共享 que. | 9463 | 01/03/26 18:09
文件 | c程序共享(2) que. | 6093 | 01/03/26 18:09
文件 | c程序分享(3) que. | 75992 | 01/03/26 18:09
文件 | 用C编文件加密程序 zhyy. | 1588 | 01/03/26 18:09
文件 | c源代码(一)attrib.c daihao. | 6007 | 01/03/26 18:11
文件 | c源代码(二)--deltree.c daihao. | 6818 | 01/03/26 18:11
目录 | 网上资源 | 4项 | 01/03/27 21:37
目录 | Some codes | 20项 | 01/03/27 19:26
文件 | C常用算法（一）：ABAND alancao | 1793 | 01/03/27 20:04
文件 | C常用算法（二）：ABINT alancao | 1351 | 01/03/27 20:04
文件 | C常用算法（三）：ACGAS alancao | 2639 | 01/03/27 20:04
文件 | 计算对称阵谱分解式（源程序1� artin | 2500 | 01/03/27 21:03
文件 | 计算对称阵谱分解式（源程序2） artin | 1729 | 01/03/27 21:03
文件 | 用C做的加密程序 huangjielei | 3122 | 01/03/28 14:12
文件 | 自解密的程序制作 huangjielei | 3300 | 01/03/28 14:12
文件 | 我们来做日历 huangjielei | 6658 | 01/03/28 14:12
文件 | 冒泡 morass | 2774 | 01/03/28 21:14


网上资源

饮水思源站 网上资源 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | C源代码大放送--目录 daihao. | 19879 | 01/03/26 18:29
文件 | C源代码大放送--地址 daihao. | 341 | 01/03/26 18:29
文件 | Re: HELP:哪里有RS-232-C的应用程序宕？ xjzhou | 282 | 01/03/26 19:01
文件 | a very helpful site for c/c++ programm jia | 561 | 01/03/27 21:37


发信人: xjzhou (流浪者), 信区: C
标 题: Re: HELP:哪里有RS-232-C的应用程序宕？
发信站: 饮水思源站 (Sat Sep 12 14:59:48 1998) , 站内信件
http://www.lvr.com/spc.htm
【 在 zyongwang (旺旺) 的大作中提到: 】

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.96.185.59]


发信人: jia (小木头), 信区: C
标 题: a very helpful site for c/c++ programmer
发信站: 饮水思源站 (Fri Nov 12 10:32:07 1999) , 站内信件
texan
http://www.snippets.org. It is FREE!

It is a collection of over 700 assorted C and C++
language routines that contain the best answers to "How
do I ...?" programming questions.
Snippets has over 94,000 lines of public domain and
freeware source code that can be reused in your
applications.

--
再见！
相逢在下一个路口！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.6.34]


Some codes

饮水思源站 Some codes 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | some codes (1) caroly. | 15483 | 01/03/27 19:25
文件 | some codes (2) caroly. | 2649 | 01/03/27 19:25
文件 | some codes (3) caroly. | 8517 | 01/03/27 19:25
文件 | some codes(4) caroly. | 6922 | 01/03/27 19:25
文件 | some codes (5) caroly. | 3463 | 01/03/27 19:25
文件 | some codes (6) caroly. | 5797 | 01/03/27 19:25
文件 | some codes (7) caroly. | 2823 | 01/03/27 19:25
文件 | some codes (8) caroly. | 7558 | 01/03/27 19:25
文件 | some codes (11) caroly. | 8873 | 01/03/27 19:25
文件 | some codes(12) caroly. | 4858 | 01/03/27 19:25
文件 | some codes (13) caroly. | 2154 | 01/03/27 19:25
文件 | some code(14) caroly. | 14581 | 01/03/27 19:25
文件 | some codes (15) caroly. | 8184 | 01/03/27 19:25
文件 | some codes (16) caroly. | 3249 | 01/03/27 19:25
文件 | some codes (17) caroly. | 7004 | 01/03/27 19:25
文件 | some codes(18) caroly. | 10417 | 01/03/27 19:25
文件 | some codes (19) caroly. | 16465 | 01/03/27 19:25
文件 | some codes (20) caroly. | 18903 | 01/03/27 19:25
文件 | some codes (21) caroly. | 5697 | 01/03/27 19:26
文件 | some codes (30) caroly. | 14910 | 01/03/27 19:26


��ˮ˼Դ������

��ˮ˼Դվ �����Ķ� �������������
������: caroly.bbs@210.34.48.50 (jim), ����: C
�� ��: some codes (1)
����վ: FZU_BBS (Thu Dec 17 14:32:05 1998)
ת��վ: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
#include "dos.h"
#include "time.h"
#include "stdio.h"
#include "stdlib.h"
#include "alloc.h"
#include "process.h"
#define ESC 2700
#define ENTER 1300
#define UP 72
#define LEFT 75
#define DOWN 80
#define RIGHT 77
int MAXLEN;
#define SCR (char far *)0xb8000000
#define FIELD_START_X 10
#define FIELD_START_Y 12
#define FIELD_WIDTH 54
#define FIELD_HEIGHT 5
#define TEXTCOLOR 15
#define TEXTBACKGROUND 5
#define COL 18
#define COL_1 17
#define REL 8
#define COLOR 12
#define COLOR_Text1 15
#define COLOR_Text2 0
#define COLOR_B 11
#define COLOR_F 12
void interrupt(*oldintlch)();
double times,oldtimes; /* min */
double delt=((double)65536.0/(double)1193180.0);
char str[6];
int a,b;

char *Text[][9]={
{"�٣������豸���������豸���ǣ� ",
" ",
" [ ] ���̡� ",
" [ ] ��ӡ���� ",
" [ ] ������� ",
" [ ] ɨ���ǡ� ",
" ",
" ",
" "},

{"�ڣ�΢�ͼ����Ӳ��ϵͳ�й��ɼ�������봦����",
" ���ǣ� ",
" ",
" [ ] �ڴ洢���Ϳ������� ",
" [ ] ���洢������������ ",
" [ ] �ڴ洢������洢���� ",
" [ ] ���������������� ",
" ",
" "},

{"�ۣ�����������������ϴ��Ļ�������ǣ� ",
" ",
" [ ] DATE ",
" [ ] CLS ",
" [ ] TIME ",
" [ ] TREE ",
" ",
" ",
" "},

{"�ܣ���д���������̲���A��������,���������в�",
" ��ִ�е��ǣ� ",
" ",
" [ ] CLS ",
" [ ] COPY B: *.* A: ",
" [ ] DISKCOPY A: B: ",
" [ ] CD A:\MY ",
" ",
" "},
{"�ݣ�Ϊ��ɾ��A��WS��Ŀ¼�е�USER��Ŀ¼,������",
" ������ȷ���ǣ� ",
" ",
" [ ] C:\>CD A:\WS\USER ",
" [ ] C:\>RD A:\WS\USER ",
" [ ] A:\WS\USER>RD USER ",
" [ ] A:\WS>MD USER ",
" ",
" "},
{"�ޣ���DOS״̬��,������ʾ������ʾ�ļ����ݵ���",
" ���ǣ� ",
" ",
" [ ] DIR ",
" [ ] REN ",
" [ ] TYPE ",
" [ ] COPY ",
" ",
" "},

{"�ߣ�Ҫ��C����WS��Ŀ¼�е�A1.TXT�ļ�������A��",
" ��Ŀ¼�£�������������ȷ���ǣ� ",
" ",
" [ ] A:\>COPY C:\WS\A1.TXT ",
" [ ] C:\>COPY C:\WS\A1 A: ",
" [ ] C:\>COPY C:\WS\A1.TXT ",
" [ ] A:\>COPY A:\A1.TXT C:\WS ",
" ",
" "},

{"�࣮DOS�ṩ��DIR�������ڣ� ",
" ",
" [ ] ϵͳ������ⲿ��� ",
" [ ] �ڲ��������̲������ ",
" [ ] �ⲿ�����ƴ��̲������ ",
" [ ] �ڲ�������Ŀ¼������� ",
" ",
" ",
" "}
};

void Rectangle(int x1,int y1,int x2,int y2,int FrColor,int BgColor)
{
unsigned char c7='�',c9='�',c4='�',c1='�',c2='�',c3='�';
int i;
char far *p;
unsigned char color=BgColor*16+FrColor;

p=SCR+(y1*80+x1)*2; *p=c7;*(p+1)=color;
p=SCR+(y1*80+x2)*2; *p=c9;*(p+1)=color;
p=SCR+(y2*80+x1)*2; *p=c1;*(p+1)=color;
p=SCR+(y2*80+x2)*2; *p=c3;*(p+1)=color;
for(i=x1+1;i<x2;i++)
{
*(SCR+(y1*80+i)*2)=*(SCR+(y2*80+i)*2)=c2;
*(SCR+(y1*80+i)*2+1)=*(SCR+(y2*80+i)*2+1)=color;
}
for(i=y1+1;i<y2;i++)
{
*(SCR+(i*80+x1)*2)=*(SCR+(i*80+x2)*2)=c4;
*(SCR+(i*80+x1)*2+1)=*(SCR+(i*80+x2)*2+1)=color;
}
}

void DblLine(int x1,int y1,int x2,int FrColor,int BgColor)
{
unsigned char c4=199,c6=182,c2='�';
unsigned char color=BgColor*16+FrColor;
int i;

for(i=x1;i<=x2;i++)
{
if(i==x1) *(SCR+(y1*80+i)*2)=c4;
else if(i==x2) *(SCR+(y1*80+i)*2)=c6;
else *(SCR+(y1*80+i)*2)=c2;
*(SCR+(y1*80+i)*2+1)=color;
}
}

void DblRectangle(int x1,int y1,int x2,int y2,int FrColor,int BgColor)
{
/* unsigned char c7='�',c9='�',c4='�',c1='�',c2='�',c3='�';*/
unsigned char c7='�',c9='�',c4='�',c1='�',c8='�',c3='�',c2='�';
int i;
char far *p;
unsigned char color=BgColor*16+FrColor;

p=SCR+(y1*80+x1)*2; *p=c7;*(p+1)=color;
p=SCR+(y1*80+x2)*2; *p=c9;*(p+1)=color;
p=SCR+(y2*80+x1)*2; *p=c1;*(p+1)=color;
p=SCR+(y2*80+x2)*2; *p=c3;*(p+1)=color;
for(i=x1+1;i<x2;i++)
{
*(SCR+(y1*80+i)*2)=c8;
*(SCR+(y2*80+i)*2)=c2;
*(SCR+(y1*80+i)*2+1)=*(SCR+(y2*80+i)*2+1)=color;
}
for(i=y1+1;i<y2;i++)
{
*(SCR+(i*80+x1)*2)=*(SCR+(i*80+x2)*2)=c4;
*(SCR+(i*80+x1)*2+1)=*(SCR+(i*80+x2)*2+1)=color;
}
}

void DBLRectangle(int x1,int y1,int x2,int y2,int FrColor,int BgColor)
{
unsigned char c7='�',c9='�',c4='�',c1='�',c2='�',c3='�';
int i;
char far *p;
unsigned char color=BgColor*16+FrColor;

p=SCR+(y1*80+x1)*2; *p=c7;*(p+1)=color;
p=SCR+(y1*80+x2)*2; *p=c9;*(p+1)=color;
p=SCR+(y2*80+x1)*2; *p=c1;*(p+1)=color;
p=SCR+(y2*80+x2)*2; *p=c3;*(p+1)=color;
for(i=x1+1;i<x2;i++)
{
*(SCR+(y1*80+i)*2)=c2;
*(SCR+(y2*80+i)*2)=c2;
*(SCR+(y1*80+i)*2+1)=*(SCR+(y2*80+i)*2+1)=color;
}
for(i=y1+1;i<y2;i++)
{
*(SCR+(i*80+x1)*2)=*(SCR+(i*80+x2)*2)=c4;
*(SCR+(i*80+x1)*2+1)=*(SCR+(i*80+x2)*2+1)=color;
}
}

void Bar(int x1,int y1,int x2,int y2,int Color)
{
int i,j;

for(j=y1;j<=y2;j++)
for(i=x1;i<=x2;i++)
{
*(SCR+(j*80+i)*2)=' ';
*(SCR+(j*80+i)*2+1)=Color*16;
}
}

void ClearScreen(int FrColor,int BgColor,char ch)
{
int i,j;

for(j=0;j<25;j++)
for(i=0;i<80;i++)
{
*(SCR+j*160+i*2)=ch;
*(SCR+j*160+i*2+1)=BgColor*16+FrColor;
}
}

void ShadowRect(int x1,int y1,int x2,int y2)
{
int i,j;

for(j=0;j<2;j++)
for(i=y1+1;i<=y2+1;i++)
*(SCR+i*160+(x2+1+j)*2+1)=8;
for(i=x1+2;i<=x2+2;i++) *(SCR+(y2+1)*160+i*2+1)=8;
}

char *GetImage(int x1,int y1,int x2,int y2)
{
char *buf;
int i,j;

buf=(char *)malloc((x2-x1+1)*(y2-y1+1)*2);
for(j=y1;j<=y2;j++)
for(i=x1;i<=x2;i++)
{
buf[(j-y1)*(x2-x1+1)*2+(i-x1)*2]=*(SCR+(j*80+i)*2);
buf[(j-y1)*(x2-x1+1)*2+(i-x1)*2+1]=*(SCR+(j*80+i)*2+1);
}
return buf;
}

void PutImage(int x1,int y1,int x2,int y2,char *buf)
{
int i,j;

for(j=y1;j<=y2;j++)
for(i=x1;i<=x2;i++)
{
*(SCR+(j*80+i)*2)=buf[(j-y1)*(x2-x1+1)*2+(i-x1)*2];
*(SCR+(j*80+i)*2+1)=buf[(j-y1)*(x2-x1+1)*2+(i-x1)*2+1];
}
free(buf);
}
void Rectangle_2(int x1,int y1,int x2,int y2,int FrColor,int BgColor)
{
unsigned int c7=201,c9=187,c4=186,c1=200,c2=205,c3=188;
int i;
char far *p;
unsigned char color=BgColor*16+FrColor;

p=SCR+(y1*80+x1)*2; *p=c7;*(p+1)=color;
p=SCR+(y1*80+x2)*2; *p=c9;*(p+1)=color;
p=SCR+(y2*80+x1)*2; *p=c1;*(p+1)=color;
p=SCR+(y2*80+x2)*2; *p=c3;*(p+1)=color;
for(i=x1+1;i<x2;i++)
{
*(SCR+(y1*80+i)*2)=*(SCR+(y2*80+i)*2)=c2;
*(SCR+(y1*80+i)*2+1)=*(SCR+(y2*80+i)*2+1)=color;
}
for(i=y1+1;i<y2;i++)
{
*(SCR+(i*80+x1)*2)=*(SCR+(i*80+x2)*2)=c4;
*(SCR+(i*80+x1)*2+1)=*(SCR+(i*80+x2)*2+1)=color;
}
}

void Box(int x1,int y1,int x2,int y2,int FrColor,int BgColor,int Rel)
{
int i,X1,Y1,X2,Y2;
X1=x1+3;
Y1=y1+1;
X2=x2-3;

Bar(x1,y1,x2,y2,BgColor);
Rectangle_2(x1+3,y1+1,x2-3,y2-1,FrColor,BgColor);
textbackground(BgColor);
textcolor(FrColor);
gotoxy(X1+1,Y1+Rel);
putch(199);
gotoxy(X2+1,Y1+Rel);
putch(182);
gotoxy(X1+2,Y1+Rel);
for(i=0;i<=X2-X1-2;i++)
putch(196);

}

void PopBar(int x1,int y1,int x2,int y2,int Color,int flag)
{
int i,j;

if(x2-x1>y2-y1)
{
for(i=0;i<(x2-x1)/2;i+=1)
{
j=i*(y2-y1)/(x2-x1);
Bar((x1+x2)/2-i,(y1+y2)/2-j,(x1+x2)/2+i,(y1+y2)/2+j,Color);
delay(100);
}
}
else
{
for(j=0;j<(y2-y1)/2;j+=1)
{
i=j*(x2-x1)/(y2-y1);
Bar((x1+x2)/2-i,(y1+y2)/2-j,(x1+x2)/2+i,(y1+y2)/2+j,Color);
delay(200);
}
}
Bar(x1,y1,x2,y2,Color);
if(flag) ShadowRect(x1,y1,x2,y2);
}

int Edit(int x,int y,int FrColor,int BgColor,unsigned int *start,char *str)
{
unsigned char ch;
int i=0;
unsigned int ret=0;

gotoxy(x,y);
textcolor(FrColor);
textbackground(BgColor);
for(i=strlen(str);i<MAXLEN;i++) str[i]=' ';
str[i]=0;
cprintf("%s",str);

i=*start;
while(1)
{
gotoxy(x+i,y);
ch=getch();
if((ch>=32&&ch<128)||ch>=0xa0)
{
cprintf("%c",ch);
str[i]=ch;
if(i<MAXLEN-1) i++; else {ret=RIGHT;break;}
}
if(ch==13) {ret=1300;break;}
if(ch==27) {ret=2700;break;}
if(ch==0)
{
ch=getch();
if(ch==LEFT) if(i>0) i--; else {ret=LEFT;break;}
if(ch==RIGHT) if(i<MAXLEN-1) i++; else {ret=RIGHT;break;}
if(ch==UP||ch==DOWN) {ret=ch;break;}
}
}
*start=i;
return ret;
}

void cts(unsigned char ts[80])
{
int i;
int bg=7,fr1=4,fr2=0;

for(i=0;i<80;i++)
{
*(SCR+24*160+i*2)=' ';
*(SCR+24*160+i*2+1)=bg*16;
}
for(i=0;i<strlen(ts);i++)
{
*(SCR+24*160+i*2)=ts[i];
if(ts[i]<(unsigned char)0xa0) *(SCR+24*160+i*2+1)=bg*16+fr1;
else *(SCR+24*160+i*2+1)=bg*16+fr2;
}

}

void outTimes(float times)
{
char str[6];
int a=(int)times/60,b=(int)times%60;

if(a<10&&b<10) sprintf(str,"0%d:0%d",a,b);
if(a<10&&b>10) sprintf(str,"0%d:%d",a,b);
if(a>10&&b<10) sprintf(str,"%d:0%d",a,b);
if(a>10&&b>10) sprintf(str,"%d:%d",a,b);
for(a=0;a<5;a++)
{
*(SCR+24*160+(73+a)*2)=str[a];
*(SCR+24*160+(73+a)*2+1)=7*16+4;
}
}

void MyEdit(void)
{
char s[5][80+3];
unsigned int key,i=7,x=0,j=1,k=6,m=2;
int X1=k-1,Y1=m,X2=78-k,Y2=m+18;
int x1=k+6+2,y1=m+6;
int bg,fr;
int line=4;
char *str[]={
"Political leaders fought against slavery; they wanted",
"What's on at the cinema this week? \"Fight for Freedom\"",
"freedom. ����������ǿ��Ը��ƺʹ����ĳ�����ʱ���ǵ�",
"���ڲ���������֪�� "};
/*
char *str1[]={
"What time do you leave home every morning? How do you",
"come to school? What's on at the cinema this week? ",
"\"Fight for Freedom\".������λ���ļƵ��ˣ���С�ط���Լ��",
"���������ʱ����һ�㶼����ϧǮ�� "};
char *str2[]={
"Early European travellers to China took back to their",
"own ountries.What's on at the cinema this week? \"Fight",
"for Freedom\". ���ڵ��й����е�ŷ���˰�����û�м����Ĺ�",
"�����Ӵ��ص��Լ��Ĺ��ҡ� "};
*/

ClearScreen(1,7,176);
bg=7;fr=15;
MAXLEN=strlen(str[0]);
PopBar(X1,Y1,X2,Y2,bg,1);
DBLRectangle(X1+3,Y1+1,X2-3,Y2-1,fr,bg);
textcolor(fr);
textbackground(bg);
gotoxy(X1+21,Y1+2);
cputs(" ��. Ӣ�Ĵ��ּ�����¼���� ");

textcolor(1);
textbackground(7);
gotoxy(x1-3,y1-2);
cputs("�� ����������Ӣ������¼��һ��(��30��)");

for(i=0;i<line;i++)
{
for(j=0;j<MAXLEN;j++) s[i][j]=' ';
s[i][j]=0;
}

for(i=0;i<line;i++)
{
textbackground(bg);
gotoxy(x1,y1+3*i);
textcolor(0);
cprintf("%s",str[i]);

gotoxy(x1,y1+3*i+1);
textcolor(15);
textbackground(1);
cprintf("%s",s[i]);
gotoxy(x1-1,y1+3*i+1);cputs(" ");
gotoxy(x1+MAXLEN,y1+3*i+1);cputs(" ");
}
i=0;
bg=1;
cts(" F2 ���� ENTER ���̷��� ESC ���淵�� ����ʣ��ʱ�� 00:");
while(1)
{
key=Edit(x1,y1+3*i+1,10,bg,&x,s[i]);
if(key==LEFT) if(i>0) {i--;x=MAXLEN-1;} else x=0;
if(key==UP) if(i>0) i--;
if(key==DOWN) if(i<line-1) i++;
if(key==RIGHT) if(i<line-1) {i++;x=0;} else x=MAXLEN-1;
if(key==ESC||key==ENTER) break;
}

gotoxy(10,13);
textcolor(15);
textbackground(1);
for(i=0;i<4;i++)
{
gotoxy(10,19+i);
cprintf(s[i]);
}
}

int MainMenu(void)
{
int a=15,b=5,i;
int x1=a,x2=77-a,y1=b+1,y2=23-b;
int fr=14,bg=1;
char ch;
int mu=0,omu=0;
char *title=" �� �� �� ";
char *MyMenu[]={
" һ. �ģϣӲ���ϵͳѡ���� ",
" ��. ����¼�뼰Ӣ�Ĵ����� ",
" ��. �ףУӱ༭�Ű������ "};

ClearScreen(1,7,176);
PopBar(x1-2,y1-1,x2+2,y2-2+1,bg,1);
DBLRectangle(x1+3,y1+1,x2-3,y2-3,fr,bg);
DblLine(x1+3,y1+3,x2-3,fr,bg);
textbackground(bg);
textcolor(15);
gotoxy(x1+11,y1+3);
cputs(title);
textcolor(15);
for(i=0;i<3;i++)
{
gotoxy(x1+11,y1+6+i);
cputs(MyMenu[i]);
}

cts(" ENTER ȷ��

--
������վ [���ݴ�ѧͥ��ԷBBS bbs.fzu.edu.cn] �� FROM [210.34.53.223]

����

Copyright © 2001 SJTUBBS, All Rights Reserved.

��Ȩ�����Ϻ�����BBS��ˮ˼Դվ


��ˮ˼Դ������

��ˮ˼Դվ �����Ķ� �������������
������: caroly.bbs@210.34.48.50 (jim), ����: C
�� ��: some codes (3)
����վ: FZU_BBS (Thu Dec 17 14:44:33 1998)
ת��վ: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
/*
������������������������������������������������������������������������ͻ
� �
� Bounce �
� �
� �
������������������������������������������������������������������������ͼ
*/

#include "stdio.h"
#include "dos.h"
#include "math.h"
#include "defs.h"

#define piover180 0.01745

float SinD(Word a)
{
return sin(a * piover180);
}

typedef char name[32];

FILE *textdiskfile;
name filename;

Word xresolution = 160;
Word yresolution = 100;
Byte numberofframes = 30;

void writeheader()
{
fprintf(textdiskfile,"������������������������������������������������������������������������ͻ\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"� Bounce �\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"������������������������������������������������������������������������ͼ\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"STATS\n");
fprintf(textdiskfile," XRES = %d\n",xresolution);
fprintf(textdiskfile," YRES = %d\n",yresolution);
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"FRAMES\n");
fprintf(textdiskfile," NUMBER = %d\n",numberofframes);
}

void writestudio()
{
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"ENVIRONMENT\n");
fprintf(textdiskfile," LOCLWGT = 0.750 0.750 0.750\n");
fprintf(textdiskfile," REFLWGT = 0.250 0.250 0.250\n");
fprintf(textdiskfile," TRANWGT = 0.000 0.000 0.000\n");
fprintf(textdiskfile," MINWGT = 0.030 0.030 0.030\n");
fprintf(textdiskfile," MAXWGT = 1.000 1.000 1.000\n");
fprintf(textdiskfile," RDEPTH = 3\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMPS\n");
fprintf(textdiskfile," REFLAMP = FALSE\n");
fprintf(textdiskfile," LAMPREF = 0.000 0.000 0.000\n");
fprintf(textdiskfile," DISTEFF = 0.050\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"OBSERVER\n");
fprintf(textdiskfile," FLENGTH = 3.200\n");
fprintf(textdiskfile," OBSPOS = 0.000 -660.000 220.000\n");
fprintf(textdiskfile," ROTATE = 0.000\n");
fprintf(textdiskfile," TILT = 16.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"SKY\n");
fprintf(textdiskfile," HORCOL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," ZENCOL = 0.700 0.800 1.000\n");
fprintf(textdiskfile," CLOUDS = TRUE\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = PLASTICTILE\n");
fprintf(textdiskfile," TEXTURE = CHECKER\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.700 0.700 0.700\n");
fprintf(textdiskfile," SPCRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," GLOSS = 8.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile," TILE1 = 1.000 0.200 0.200\n");
fprintf(textdiskfile," TILE2 = 0.250 0.250 0.250\n");
fprintf(textdiskfile," TILE = 0.012\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = CHROME\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," DIFRFL = 0.500 0.500 0.500\n");
fprintf(textdiskfile," SPCRFL = 0.300 0.300 0.300\n");
fprintf(textdiskfile," GLOSS = 30.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = BRASS\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.300 0.300 0.300\n");
fprintf(textdiskfile," SPCRFL = 0.600 0.500 0.250\n");
fprintf(textdiskfile," GLOSS = 25.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = REDMIRROR\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.050 0.050\n");
fprintf(textdiskfile," DIFRFL = 0.500 0.100 0.100\n");
fprintf(textdiskfile," SPCRFL = 0.300 0.100 0.100\n");
fprintf(textdiskfile," GLOSS = 25.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"GROUND\n");
fprintf(textdiskfile," MATL = PLASTICTILE\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMP\n");
fprintf(textdiskfile," LOC = 350.000 -350.000 350.000\n");
fprintf(textdiskfile," RADIUS = 100.000\n");
fprintf(textdiskfile," INTENS = 0.950 0.950 0.910\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMP\n");
fprintf(textdiskfile," LOC = -350.000 -350.000 350.000\n");
fprintf(textdiskfile," RADIUS = 100.000\n");
fprintf(textdiskfile," INTENS = 0.950 0.950 0.910\n");
}

void make()
{
Word theta;
float x, y, z1;
float z2, z3;
float zoffset;
float rad;

theta = 0;
rad = 40.0;
zoffset = rad;
x = 0.0;
y = 0.0;
z1 = 0.0;
z2 = 0.0;
z3 = 0.0;
for (theta = 0; theta <= 180; theta++)
{
if (((theta % (180 / numberofframes)) == 0))
{
writestudio();
z1 = zoffset + 90 * SinD(theta);
z2 = zoffset + 70 * fabs(SinD(theta + 30));
z3 = zoffset + 50 * fabs(SinD(theta - 45));
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"SPHERE\n");
fprintf(textdiskfile," LOC = %3.3f %3.3f %3.3f\n",x,y,z1);
fprintf(textdiskfile," RADIUS = %3.3f\n",rad);
fprintf(textdiskfile," MATL = CHROME\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"SPHERE\n");
fprintf(textdiskfile," LOC = %3.3f %3.3f %3.3f\n",(x + 2.5 * rad),y,z2);
fprintf(textdiskfile," RADIUS = %3.3f\n",rad);
fprintf(textdiskfile," MATL = BRASS\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"SPHERE\n");
fprintf(textdiskfile," LOC = %3.3f %3.3f %3.3f\n",(x - 2.5 * rad),y,z3);
fprintf(textdiskfile," RADIUS = %3.3f\n",rad);
fprintf(textdiskfile," MATL = REDMIRROR\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"BOUNDINGSPHERETEST\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"ENDFRAME\n");
}
}
}

void main()
{
strcpy(filename,"BOUNCE.RT");
clrscr();
printf("Generating %s File\n",filename);
printf("\n");
printf("By Christopher D. Watkins\n");
printf("\n");
printf("\n");
printf("Writing %d frames\n",(int)numberofframes);
textdiskfile=fopen(filename, "wt");
writeheader();
make();
fclose(textdiskfile);

--
������վ [���ݴ�ѧͥ��ԷBBS bbs.fzu.edu.cn] �� FROM [210.34.53.223]

����

Copyright © 2001 SJTUBBS, All Rights Reserved.

��Ȩ�����Ϻ�����BBS��ˮ˼Դվ


��ˮ˼Դ������

��ˮ˼Դվ �����Ķ� �������������
������: caroly.bbs@210.34.48.50 (jim), ����: C
�� ��: some codes (6)
����վ: FZU_BBS (Thu Dec 17 15:01:32 1998)
ת��վ: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn

������������������������������������������������������������������������ͻ
� �
� 8 State Finite Closed 2-Dimensional Cellular Automation �
� �
� �
������������������������������������������������������������������������ͼ
*/

#include "stdio.h"
#include "dos.h"
#include "string.h"
#include "defs.h"
#include "globals.h"
#include "mathb.h"
#include "graphb.h"

#define MaxColumn 100
#define MaxRow 100
#define States 8
#define MaxState (States-1)
#define WorldTop (MaxColumn-1)
#define WorldSide (MaxRow-1)

typedef Byte WorldArray[WorldTop+1][WorldSide+1];
typedef Byte Rule[8][8][8][8][8];

WorldArray NewWorld;
WorldArray OldWorld;
WorldArray TempWorld;
Rule Rules;

void DoWorld()
{
Word i, j;
Byte col;
Boolean LowI, HighI;
Boolean LowJ, HighJ;

for(i=0; i<=WorldTop; i++)
{
LowI=(i==0);
HighI=(i==WorldTop);
for(j=0; j<=WorldSide; j++)
{
LowJ=(j==0);
HighJ=(j==WorldSide);
/* Mod operations can be used here - */
/* but the logical testing is faster */
if(!(LowI||HighI||LowJ||HighJ))
NewWorld[i][j]=Rules[OldWorld[i][j-1]]
[OldWorld[i-1][j]]
[OldWorld[i][j]]
[OldWorld[i+1][j]]
[OldWorld[i][j+1]];
else
{
if((LowI||HighI)&& !(LowJ||HighJ))
{
if (LowI)
NewWorld[i][j]=Rules[OldWorld[i][j-1]]
[OldWorld[WorldTop][j]][OldWorld[i][j]]
[OldWorld[i+1][j]]
[OldWorld[i][j+1]];
else
NewWorld[i][j]=Rules[OldWorld[i][j-1]]
[OldWorld[i-1][j]]
[OldWorld[i][j]]
[OldWorld[0][j]]
[OldWorld[i][j+1]];
}
else
{
if((LowJ||HighJ)&& !(LowI||HighI))
{
if(LowJ)
NewWorld[i][j]=Rules[OldWorld[i][WorldSide]]
[OldWorld[i-1][j]]
[OldWorld[i][j]]
[OldWorld[i+1][j]]
[OldWorld[i][j+1]];
else
NewWorld[i][j]=Rules[OldWorld[i][j-1]]
[OldWorld[i-1][j]]
[OldWorld[i][j]]
[OldWorld[i+1][j]]
[OldWorld[i][0]];
}
else
{
if(LowI&&LowJ)
NewWorld[i][j]=Rules[OldWorld[i][WorldSide]]
[OldWorld[i+1][WorldSide]]
[OldWorld[i][j]]
[OldWorld[i+1][j]]
[OldWorld[i][j+1]];
else
{
if(LowI&&HighJ)
NewWorld[i][j]=Rules[OldWorld[i][j-1]]
[OldWorld[WorldTop][j]]
[OldWorld[i][j]]
[OldWorld[i+1][j]]
[OldWorld[i][0]];
else
{
if(HighI&&LowJ)
NewWorld[i][j]=Rules[OldWorld[i][WorldSide]]
[OldWorld[i-1][j]]
[OldWorld[i][j]]
[OldWorld[0][j]]
[OldWorld[i][j+1]];
else
NewWorld[i][j]=Rules[OldWorld[i][j-1]]
[OldWorld[i-1][j]]
[OldWorld[i][j]]
[OldWorld[0][j]]
[OldWorld[i][0]];
}
}
}
}
}
Plot(i, j, (NewWorld[i][j]<<5)&0xFF);
}
}
memcpy(TempWorld, NewWorld, sizeof(NewWorld));
memcpy(NewWorld, OldWorld, sizeof(OldWorld));
memcpy(OldWorld, TempWorld, sizeof(TempWorld));
}

typedef char Name[33];

Name WorldFileName;
FILE *WorldFile;

void LoadWorld()
{
Word i, j;

fread(OldWorld, sizeof(OldWorld), 1, WorldFile);
fclose(WorldFile);
}

Name RulefileName;
FILE *Rulefile;

void LoadRules()
{
fread(Rules, sizeof(Rules), 1, Rulefile);
fclose(Rulefile);
}

void ClearMemory()
{
Word i, j, k, l, m;

for(i=0; i<=WorldTop; i++)
{
for(j=0; j<=WorldSide; j++)
{
NewWorld[i][j]=0;
OldWorld[i][j]=0;
TempWorld[i][j]=0;
}
}
for(i=0; i<=MaxState; i++)
{
for(j=0; j<=MaxState; j++)
{
for(k=0; k<=MaxState; k++)
{
for(l=0; l<=MaxState; l++)
{
for(m=0; m<=MaxState; m++)
Rules[i][j][k][l][m]=0;
}
}
}
}
}

Palette_Register PalArray;

void main()
{
ClearMemory();
strcpy(WorldFileName,"WORLD2D.CA");
strcpy(RulefileName,"RULE2D.CA");
WorldFile=fopen(WorldFileName, "rb");
Rulefile=fopen(RulefileName, "rb");
LoadRules();
LoadWorld();
Init_Graphics(19);
Init_Palette_2(PalArray);
Set_Palette(PalArray);
while(!kbhit())
DoWorld();
Exit_Graphics();
}

--
������վ [���ݴ�ѧͥ��ԷBBS bbs.fzu.edu.cn] �� FROM [210.34.53.223]

����

Copyright © 2001 SJTUBBS, All Rights Reserved.

��Ȩ�����Ϻ�����BBS��ˮ˼Դվ


发信人: caroly.bbs@210.34.48.50 (jim), 信区: C
标 题: some codes (7)
发信站: FZU_BBS (Thu Dec 17 15:07:29 1998)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
/* ***********************************************************************
* *
* Cone and Pyramid Database Generator *
* *
***********************************************************************
*/

#include "stdio.h"
#include "dos.h"
#include "conio.h"
#include "math.h"
#include "string.h"
#include "malloc.h"
#include "defs.h"
#include "globals.h"
#include "mathb.h"
#include "graphb.h"
#include "modelsup.h"
#include "shpmk.h"

int Theta, DTheta, HalfDTheta;

void SetupCone(int NumOfFacets)
{
VertexNum=1;
VertexNumInFacet=1;
LastFacet=NumOfFacets;
LastVertexNumInFacet=4;
LastVertex=LastFacet*LastVertexNumInFacet;
DTheta=360/LastFacet;
HalfDTheta=DTheta/2;
Theta=HalfDTheta;
}

int NumFacetsOnEndCap, T;

void EndCap()
{
int tmp;

NumFacetsOnEndCap=LastFacet/2-1;
tmp=NumFacetsOnEndCap&1;
if(tmp==1)
Theta=-90+HalfDTheta;
else
Theta=-90+DTheta;
if(LastFacet==4)
NumFacetsOnEndCap=2;
for(T=1; T<=NumFacetsOnEndCap; T++)
{
AddVertex(CosD(Theta+HalfDTheta), SinD(Theta+HalfDTheta), -1.0);
AddVertex(CosD(Theta-HalfDTheta), SinD(Theta-HalfDTheta), -1.0);
AddVertex(CosD(180-Theta+HalfDTheta), SinD(180-Theta+HalfDTheta), -1.0);
AddVertex(CosD(180-Theta-HalfDTheta), SinD(180-Theta-HalfDTheta), -1.0);
++FacetNum;
++LastFacet;
VertexNumInFacet=1;
Theta+=DTheta;
}
}

void MakeConeDatabase()
{
for(FacetNum=1; FacetNum<=LastFacet; FacetNum++)
{
AddVertex(CosD(Theta-HalfDTheta), SinD(Theta-HalfDTheta), -1.0);
AddVertex(CosD(Theta+HalfDTheta), SinD(Theta+HalfDTheta), -1.0);
AddVertex(0.0, 0.0, 1.0);
AddVertex(0.0, 0.0, 1.0);
Theta+=DTheta;
VertexNumInFacet=1;
}
EndCap();
}

/* ***********************************************************************
* *
* Main Program *
* *
***********************************************************************
*/

void main()
{
Facet=farcalloc(((MaxFacet+1)*(MaxVertexNumInFacet+1)), sizeof(int));
InitVertexMaker();
SetupCone(4);
MakeConeDatabase();
SaveData("PYRAMID.DAT");
SetupCone(180);
MakeConeDatabase();
SaveData("CONE.DAT");
Exit_Graphics();
farfree(Facet);
}

--
※发信站 [福州大学庭芳苑BBS bbs.fzu.edu.cn] · FROM [210.34.53.223]


��ˮ˼Դ������

��ˮ˼Դվ �����Ķ� �������������
������: caroly.bbs@210.34.48.50 (jim), ����: C
�� ��: some codes (11)
����վ: FZU_BBS (Thu Dec 17 15:55:25 1998)
ת��վ: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
/*
������������������������������������������������������������������������ͻ
� �
� Robot Walk �
� �
� �
������������������������������������������������������������������������ͼ
*/

#include "stdio.h"
#include "dos.h"
#include "math.h"
#include "defs.h"

#define Pi_Over_180 0.01745

float SinD(float a)
{
return (sin(a * Pi_Over_180));
}

float CosD(float a)
{
return (cos(a * Pi_Over_180));
}

typedef char name[33];

FILE *textdiskfile;
name filename;

Word xresolution = 160;
Word yresolution = 100;
Byte numberofframes = 30;

void writeheader()
{
fprintf(textdiskfile,"������������������������������������������������������������������������ͻ\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"� Robot Walk �\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"������������������������������������������������������������������������ͼ\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"STATS\n");
fprintf(textdiskfile," XRES = %d\n",xresolution);
fprintf(textdiskfile," YRES = %d\n",yresolution);
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"FRAMES\n");
fprintf(textdiskfile," NUMBER = %d\n",numberofframes);
}

float ypos;

void writestudio()
{
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"ENVIRONMENT\n");
fprintf(textdiskfile," LOCLWGT = 0.750 0.750 0.750\n");
fprintf(textdiskfile," REFLWGT = 0.250 0.250 0.250\n");
fprintf(textdiskfile," TRANWGT = 0.000 0.000 0.000\n");
fprintf(textdiskfile," MINWGT = 0.030 0.030 0.030\n");
fprintf(textdiskfile," MAXWGT = 1.000 1.000 1.000\n");
fprintf(textdiskfile," RDEPTH = 2\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMPS\n");
fprintf(textdiskfile," REFLAMP = FALSE\n");
fprintf(textdiskfile," LAMPREF = 0.000 0.000 0.000\n");
fprintf(textdiskfile," DISTEFF = 0.050\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"OBSERVER\n");
fprintf(textdiskfile," FLENGTH = 3.100\n");
fprintf(textdiskfile," OBSPOS = 0.000 %3.3f 220.000\n",ypos);
fprintf(textdiskfile," ROTATE = 0.000\n");
fprintf(textdiskfile," TILT = 16.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"SKY\n");
fprintf(textdiskfile," HORCOL = 0.500 0.600 0.700\n");
fprintf(textdiskfile," ZENCOL = 0.700 0.800 1.000\n");
fprintf(textdiskfile," CLOUDS = FALSE\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = PLASTICTILE\n");
fprintf(textdiskfile," TEXTURE = CHECKER\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.700 0.700 0.700\n");
fprintf(textdiskfile," SPCRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," GLOSS = 8.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile," TILE1 = 1.000 0.200 0.200\n");
fprintf(textdiskfile," TILE2 = 0.250 0.250 0.250\n");
fprintf(textdiskfile," TILE = 0.012\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = STEEL\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.600 0.600 0.600\n");
fprintf(textdiskfile," SPCRFL = 0.300 0.300 0.300\n");
fprintf(textdiskfile," GLOSS = 1.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"GROUND\n");
fprintf(textdiskfile," MATL = PLASTICTILE\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMP\n");
fprintf(textdiskfile," LOC = 150.000 %3.3f 350.000\n",ypos);
fprintf(textdiskfile," RADIUS = 100.000\n");
fprintf(textdiskfile," INTENS = 0.950 0.950 0.910\n");
}

float hgt;

void sph(float x, float y, float z, float rad)
{
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"SPHERE\n");
fprintf(textdiskfile," LOC = %3.3f %3.3f %3.3f\n",x,y + ypos + 660.0,z + hgt);
fprintf(textdiskfile," RADIUS = %3.3f\n",rad);
fprintf(textdiskfile," MATL = STEEL\n");
}

void cyl(float x1, float y1, float z1, float x2, float y2, float z2, float rad)
{
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"CYLINDER\n");
fprintf(textdiskfile," BASELOC = %3.3f %3.3f %3.3f\n",x1,y1 + ypos + 660.0,z1 + hgt);
fprintf(textdiskfile," BASERAD = %3.3f\n",rad);
fprintf(textdiskfile," APEXLOC = %3.3f %3.3f %3.3f\n",x2,y2 + ypos + 660.0,z2 + hgt);
fprintf(textdiskfile," MATL = STEEL\n");
}

void make()
{
Byte t;
float a, b;
float c, d;
float phase;

ypos = -660.0;
phase = 0.0;
for (t = 1; t <= numberofframes; t++)
{
writestudio();
hgt = -3 * CosD(phase * 2.0);

/* Body */

fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"BOX\n");
fprintf(textdiskfile," LOC = -50.000 %f %f\n",-200.000 + ypos + 660.0,50.0 + hgt);
fprintf(textdiskfile," V1 = 100.000 0.000 0.000\n");
fprintf(textdiskfile," V2 = 0.000 60.000 0.000\n");
fprintf(textdiskfile," V3 = 0.000 0.000 70.000\n");
fprintf(textdiskfile," MATL = STEEL\n");

/* Head */

cyl(0.0,-170.0,125.0,0.0,-170.0,155.0,20.0);
sph(0.0,-170.0,155.0,20.0);

/* Eyes */

a = 22.4 * CosD(270.0 + 12.0 * SinD(phase + 45.0) - 26.56);
b = -170.0 + 22.4 * SinD(270.0 + 12.0 * SinD(phase + 45.0) - 26.56);
c = 22.4 * CosD(270.0 + 12.0 * SinD(phase + 45.0) + 26.56);
d = -170.0 + 22.4 * SinD(270.0 + 12.0 * SinD(phase + 45.0) + 26.56);
sph(a,b,150.0,5.0);
sph(c,d,150.0,5.0);

/* Lips */

sph(a,b,135.0,5.0);
cyl(a,b,135.0,c,d,135.0,5.0);
sph(c,d,135.0,5.0);

/* Neck */

sph(0.0,-170.0,125.0,10.0);

/* Shoulders */

sph(-70.0,-170.0,105.0,12.0);
cyl(-70.0,-170.0,105.0,70.0,-170.0,105.0,12.0);
sph(70.0,-170.0,105.0,12.0);

/* Left Arm */

a = -170.0 + 15 * CosD(phase);
b = 50.0;
cyl(70.0,-170.0,105.0,70.0,a,b,12.0);
sph(70.0,a,b,12.0);

/* Right Arm */

a = -170.0 + 15 * CosD(phase + 180.0);
b = 50.0;
cyl(-70.0,-170.0,105.0,-70.0,a,b,12.0);
sph(-70.0,a,b,12.0);

/* Left Leg */

a = -170.0 + 15 * CosD(phase + 180.0);
b = 15.0;
cyl(25.0,-170.0,55.0,25.0,a,b,20.0);
sph(25.0,a,b,20.0);

/* Right Leg */

a = -170.0 + 15 * CosD(phase);
b = 15.0;
cyl(-25.0,-170.0,55.0,-25.0,a,b,20.0);
sph(-25.0,a,b,20.0);
ypos = ypos + (2.0 / 0.012) / numberofframes;
/* 0.012 = 1/2 tile size */

phase = phase + (360.0 / numberofframes);
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"BOUNDINGSPHERETEST\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"ENDFRAME\n");
}
}

void main()
{
strcpy(filename,"ROBOT.RT");
clrscr();
printf("Generating %s File\n",filename);
printf("\n");
printf("By Christopher D. Watkins\n");
printf("\n");
printf("\n");
printf("Writing %d frames\n",numberofframes);
textdiskfile=fopen(filename, "wt");
writeheader();
make();
fclose(textdiskfile);
}

--
������վ [���ݴ�ѧͥ��ԷBBS bbs.fzu.edu.cn] �� FROM [210.34.53.223]

����

Copyright © 2001 SJTUBBS, All Rights Reserved.

��Ȩ�����Ϻ�����BBS��ˮ˼Դվ


发信人: caroly.bbs@210.34.48.50 (jim), 信区: C
标 题: some codes(12)
发信站: FZU_BBS (Thu Dec 17 15:56:58 1998)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
/* ***********************************************************************
* *
* Solids of Revolution Database Generator *
* *
***********************************************************************
*/

#include "stdio.h"
#include "dos.h"
#include "conio.h"
#include "math.h"
#include "string.h"
#include "malloc.h"
#include "defs.h"
#include "globals.h"
#include "mathb.h"
#include "graphb.h"
#include "modelsup.h"
#include "shpmk.h"

/* ***********************************************************************
* *
* Radial Arrays *
* *
***********************************************************************
*/

int I;
float RS[62];

/*
char ObjF[]="LGBEADS.DAT";

void RadialArray()
{
for(I=1; I<=59; I++)
RS[I]=SinD(I*10)*0.5+0.5;
RS[60]=0.05;
}
*/

/*
char ObjF[]="BEADS.DAT";

void RadialArray()
{
for(I=1; I<=60; I++)
RS[I]=SinD((I-1)*9)*0.5;
}
*/

/*
char ObjF[]="FUNNELS.DAT";

void RadialArray()
{
for(I=1; I<=60; I++)
RS[I]=sin(sqrt(60.1-I)-0.5)*0.45+0.5;
}
*/

/*
char ObjF[]="MECHPART.DAT";

void RadialArray()
{
for(I=1; I<=6; I++)
RS[I]=(float)I/6*0.5+0.1;
for(I=7; I<=20; I++)
RS[I]=0.6;
for(I=21; I<=32; I++)
RS[I]=0.6+(float)(I-21)/32.0;
for(I=33; I<=53; I++)
RS[I]=1.0;
for(I=54; I<=60; I++)
RS[I]=0.1;
}
*/

/*
char ObjF[]="ROCKET.DAT";

void RadialArray()
{
for(I=60; I>=53; I--)
RS[I]=0.02;
for(I=52; I>=47; I--)
RS[I]=(float)(52-I)/52.0+0.05;
for(I=46; I>=35; I--)
RS[I]=0.16;
for(I=34; I>=27; I--)
RS[I]=(float)(34-I)/34.0+0.19;
for(I=26; I>=5; I--)
RS[I]=0.4;
for(I=4; I>=1; I--)
RS[I]=(float)(4-I)/22+0.4;
}
*/

char ObjF[]="CHESPAWN.DAT";

void RadialArray()
{
for(I=60; I>=44; I--)
RS[I]=SinD((60-I)*9)*0.6;
for(I=43; I>=11; I--)
RS[I]=0.2;
for(I=10; I>=1; I--)
RS[I]=0.2+SinD((10-I)*12)*0.5;
}

/* *********************************************************************** */

void DisplayRadialArray()
{
for(I=1; I<=60; I++)
Draw(260-Round(60.0*RS[I]), 150-I, 260+Round(60.0*RS[I]), 150-I, 35);
}

int Theta, DTheta, HalfDTheta;
float Zs, Dz, HalfDz;
int HorzLoop, VertLoop;

void SetupSolidOfRevolution(int Horizontal, int Vertical)
{
VertexNum=1;
VertexNumInFacet=1;
HorzLoop=Horizontal;
VertLoop=Vertical;
LastFacet=HorzLoop*(VertLoop-1);
LastVertexNumInFacet=MaxVertexNumInFacet;
LastVertex=LastFacet*LastVertexNumInFacet;
DTheta=360/HorzLoop;
HalfDTheta=DTheta/2;
Theta=HalfDTheta+90;
Dz=2.0/(float)VertLoop;
HalfDz=Dz/2.0;
Zs=HalfDz;
}

void MakeSolidOfRevolutionDatabase()
{
float CosThetaMinus, SinThetaMinus;
float CosThetaPlus, SinThetaPlus;
float ZMinus, ZPlus, x, y, z;

FacetNum=0;
for(I=1; I<=60; I++)
RS[I]=0.0;
RadialArray();
DisplayRadialArray();
do
{
I=1;
CosThetaMinus=CosD(Theta-HalfDTheta);
SinThetaMinus=SinD(Theta-HalfDTheta);
CosThetaPlus=CosD(Theta+HalfDTheta);
SinThetaPlus=SinD(Theta+HalfDTheta);
Zs=-1.0+HalfDz;
do
{
ZMinus=Zs-HalfDz;
ZPlus=Zs+HalfDz;
++FacetNum;
x=CosThetaMinus*RS[I];
y=SinThetaMinus*RS[I];
z=ZMinus;
AddVertex(x, y, z);
x=CosThetaPlus*RS[I];
y=SinThetaPlus*RS[I];
z=ZMinus;
AddVertex(x, y, z);
x=CosThetaPlus*RS[I+1];
y=SinThetaPlus*RS[I+1];
z=ZPlus;
AddVertex(x, y, z);
x=CosThetaMinus*RS[I+1];
y=SinThetaMinus*RS[I+1];
z=ZPlus;
AddVertex(x, y, z);
VertexNumInFacet=1;
++I;
Zs+=Dz;
}
while(I!=60);
Theta+=DTheta;
}
while(Theta<(360+HalfDTheta+90));
}

/* ***********************************************************************
* *
* Main Program *
* *
***********************************************************************
*/

void main()
{
Facet=farcalloc(((MaxFacet+1)*(MaxVertexNumInFacet+1)), sizeof(int));
InitVertexMaker();
SetupSolidOfRevolution(60, 60);
MakeSolidOfRevolutionDatabase();
SaveData(ObjF);
Exit_Graphics();
farfree(Facet);
}

--
※发信站 [福州大学庭芳苑BBS bbs.fzu.edu.cn] · FROM [210.34.53.223]


��ˮ˼Դ������

��ˮ˼Դվ �����Ķ� �������������
������: caroly.bbs@210.34.48.50 (jim), ����: C
�� ��: some code(14)
����վ: FZU_BBS (Thu Dec 17 16:02:16 1998)
ת��վ: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
/*

������������������������������������������������������������������������ͻ
� �
� Recursive Tetrahedrons �
� �
� �
������������������������������������������������������������������������ͼ

*/

#include "stdio.h"
#include "stdlib.h"
#include "dos.h"
#include "math.h"
#include "defs.h"
#include "globals.h"
#include "mathb.h"
#include "graphb.h"

typedef char name[33];

FILE *textdiskfile;
name filename;

Word xresolution = 1024;
Word yresolution = 768;
Byte numberofframes = 1;

void writeheader()
{
fprintf(textdiskfile,"������������������������������������������������������������������������ͻ\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"� Recursive Tetrahedrons �\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"������������������������������������������������������������������������ͼ\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"STATS\n");
fprintf(textdiskfile," XRES = %d\n",xresolution);
fprintf(textdiskfile," YRES = %d\n",yresolution);
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"FRAMES\n");
fprintf(textdiskfile," NUMBER = %d\n",numberofframes);
}

void writestudio()
{
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"ENVIRONMENT\n");
fprintf(textdiskfile," LOCLWGT = 0.750 0.750 0.750\n");
fprintf(textdiskfile," REFLWGT = 0.250 0.250 0.250\n");
fprintf(textdiskfile," TRANWGT = 0.000 0.000 0.000\n");
fprintf(textdiskfile," MINWGT = 0.030 0.030 0.030\n");
fprintf(textdiskfile," MAXWGT = 1.000 1.000 1.000\n");
fprintf(textdiskfile," RDEPTH = 3\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMPS\n");
fprintf(textdiskfile," REFLAMP = FALSE\n");
fprintf(textdiskfile," LAMPREF = 0.000 0.000 0.000\n");
fprintf(textdiskfile," DISTEFF = 0.050\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"OBSERVER\n");
fprintf(textdiskfile," FLENGTH = 3.500\n");
fprintf(textdiskfile," OBSPOS = -120.000 660.000 220.000\n");
fprintf(textdiskfile," ROTATE = 168.000\n");
fprintf(textdiskfile," TILT = 15.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"SKY\n");
fprintf(textdiskfile," HORCOL = 0.300 0.300 0.400\n");
fprintf(textdiskfile," ZENCOL = 0.700 0.800 1.000\n");
fprintf(textdiskfile," CLOUDS = FALSE\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = PLASTICTILE\n");
fprintf(textdiskfile," TEXTURE = CHECKER\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.700 0.700 0.700\n");
fprintf(textdiskfile," SPCRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," GLOSS = 8.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile," TILE1 = 1.000 0.200 0.200\n");
fprintf(textdiskfile," TILE2 = 0.250 0.250 0.250\n");
fprintf(textdiskfile," TILE = 0.012\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = CHROME\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," SPCRFL = 0.600 0.600 0.600\n");
fprintf(textdiskfile," GLOSS = 30.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = ITALIANMARBLE\n");
fprintf(textdiskfile," TEXTURE = MARBLE\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.700 0.700 0.700\n");
fprintf(textdiskfile," SPCRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," GLOSS = 10.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = OAKWOOD\n");
fprintf(textdiskfile," TEXTURE = WOOD\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," DIFRFL = 0.700 0.400 0.300\n");
fprintf(textdiskfile," SPCRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," GLOSS = 5.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = MIRROR\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.000 0.000 0.000\n");
fprintf(textdiskfile," DIFRFL = 0.700 0.700 0.700\n");
fprintf(textdiskfile," SPCRFL = 0.300 0.300 0.300\n");
fprintf(textdiskfile," GLOSS = 50.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = BRASS\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.300 0.300 0.300\n");
fprintf(textdiskfile," SPCRFL = 0.600 0.500 0.250\n");
fprintf(textdiskfile," GLOSS = 20.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"GROUND\n");
fprintf(textdiskfile," MATL = PLASTICTILE\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMP\n");
fprintf(textdiskfile," LOC = 350.000 150.000 300.000\n");
fprintf(textdiskfile," RADIUS = 100.000\n");
fprintf(textdiskfile," INTENS = 0.900 0.900 0.750\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMP\n");
fprintf(textdiskfile," LOC = -350.000 250.000 300.000\n");
fprintf(textdiskfile," RADIUS = 100.000\n");
fprintf(textdiskfile," INTENS = 0.910 0.700 0.910\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMP\n");
fprintf(textdiskfile," LOC = 0.000 -50.000 500.000\n");
fprintf(textdiskfile," RADIUS = 100.000\n");
fprintf(textdiskfile," INTENS = 0.810 0.800 0.910\n");
}

TDA v1, v2, avr, temp;

void guaranteeoutwardsurfacenormal(TDA pnt)
{
TDA outray, nrm;

VecSub(pnt,avr,outray);
VecCross(v1,v2,nrm);
if (!(VecDot(outray,nrm)>0.0))
{
VecCopy(v1,temp);
VecCopy(v2,v1);
VecCopy(temp,v2);
}
}

Byte mtlnum;

void getmaterialnum()
{
switch (mtlnum)
{
case 0: fprintf(textdiskfile," MATL = CHROME\n");
break;
case 1: fprintf(textdiskfile," MATL = ITALIANMARBLE\n");
break;
case 2: fprintf(textdiskfile," MATL = OAKWOOD\n");
break;
case 3: fprintf(textdiskfile," MATL = MIRROR\n");
break;
case 4: fprintf(textdiskfile," MATL = BRASS\n");
break;
}
}

Byte col;

void tetra(int x1, int y1, int z1,
int x2, int y2, int z2,
int x3, int y3, int z3,
int x4, int y4, int z4,
Byte level)
{
TDA pnt1, pnt2, pnt3, pnt4;

if ((level == 0))
{
mtlnum = random(5);
Vec(x1,y1,z1,pnt1);
Vec(x2,y2,z2,pnt2);
Vec(x3,y3,z3,pnt3);
Vec(x4,y4,z4,pnt4);
VecAdd3(pnt1,pnt2,pnt3,temp);
VecAdd(pnt4,temp,temp);
VecScalMult(0.25,temp,avr); /* center of tetrahedron */
VecSub(pnt1,pnt3,v1);
VecSub(pnt2,pnt3,v2);
guaranteeoutwardsurfacenormal(pnt3);
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"TRIANGLE\n");
fprintf(textdiskfile," LOC = %3.3f %3.3f %3.3f\n",pnt3[0],pnt3[1],pnt3[2]);
fprintf(textdiskfile," V1 = %3.3f %3.3f %3.3f\n",v1[0],v1[1],v1[2]);
fprintf(textdiskfile," V2 = %3.3f %3.3f %3.3f\n",v2[0],v2[1],v2[2]);
getmaterialnum();
VecSub(pnt1,pnt2,v1);
VecSub(pnt4,pnt2,v2);
guaranteeoutwardsurfacenormal(pnt2);
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"TRIANGLE\n");
fprintf(textdiskfile," LOC = %3.3f %3.3f %3.3f\n",pnt2[0],pnt2[1],pnt2[2]);
fprintf(textdiskfile," V1 = %3.3f %3.3f %3.3f\n",v1[0],v1[1],v1[2]);
fprintf(textdiskfile," V2 = %3.3f %3.3f %3.3f\n",v2[0],v2[1],v2[2]);
getmaterialnum();
VecSub(pnt1,pnt4,v1);
VecSub(pnt3,pnt4,v2);
guaranteeoutwardsurfacenormal(pnt4);
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"TRIANGLE\n");
fprintf(textdiskfile," LOC = %3.3f %3.3f %3.3f\n",pnt4[0],pnt4[1],pnt4[2]);
fprintf(textdiskfile," V1 = %3.3f %3.3f %3.3f\n",v1[0],v1[1],v1[2]);
fprintf(textdiskfile," V2 = %3.3f %3.3f %3.3f\n",v2[0],v2[1],v2[2]);
getmaterialnum();
VecSub(pnt2,pnt3,v1);
VecSub(pnt4,pnt3,v2);
guaranteeoutwardsurfacenormal(pnt3);
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"TRIANGLE\n");
fprintf(textdiskfile," LOC = %3.3f %3.3f %3.3f\n",pnt3[0],pnt3[1],pnt3[2]);
fprintf(textdiskfile," V1 = %3.3f %3.3f %3.3f\n",v1[0],v1[1],v1[2]);
fprintf(textdiskfile," V2 = %3.3f %3.3f %3.3f\n",v2[0],v2[1],v2[2]);
getmaterialnum();
Draw_Line_3D(pnt1,pnt2,col);
Draw_Line_3D(pnt2,pnt3,col);
Draw_Line_3D(pnt3,pnt1,col);
Draw_Line_3D(pnt1,pnt4,col);
Draw_Line_3D(pnt4,pnt2,col);
Draw_Line_3D(pnt3,pnt4,col);
}
else
{
tetra(x1,y1,z1,(x1 + x2) / 2,(y1 + y2) / 2,(z1 + z2) / 2,(x1 + x3) / 2,(y1 + y3) / 2,(z1 + z3) / 2,(x1 + x4) / 2,(y1 + y4) / 2,(z1 + z4) / 2,level - 1);
tetra(x2,y2,z2,(x2 + x3) / 2,(y2 + y3) / 2,(z2 + z3) / 2,(x2 + x4) / 2,(y2 + y4) / 2,(z2 + z4) / 2,(x2 + x1) / 2,(y2 + y1) / 2,(z2 + z1) / 2,level - 1);
tetra(x3,y3,z3,(x3 + x4) / 2,(y3 + y4) / 2,(z3 + z4) / 2,(x3 + x1) / 2,(y3 + y1) / 2,(z3 + z1) / 2,(x3 + x2) / 2,(y3 + y2) / 2,(z3 + z2) / 2,level - 1);
tetra(x4,y4,z4,(x4 + x1) / 2,(y4 + y1) / 2,(z4 + z1) / 2,(x4 + x2) / 2,(y4 + y2) / 2,(z4 + z2) / 2,(x4 + x3) / 2,(y4 + y3) / 2,(z4 + z3) / 2,level - 1);
col = (level % 6) * 36 + 35;
}
}

/*
������������������������������������������������������������������������ͻ
� M a i n P r o g r a m �
������������������������������������������������������������������������ͼ
*/

int x1, y1, z1;
int x2, y2, z2;
int x3, y3, z3;
int x4, y4, z4;

#define rot 0 /* rotation around z-axis 0 = x-direction */
#define ang1 0 + rot
#define ang2 120 + rot
#define ang3 240 + rot
#define scale 150 /* scaling */
#define xs scale
#define ys scale
#define zs scale
#define level 3 /* level of recursion */ /* 4^(Level+1) triangles */
/* 0 -> 4 triangles */
/* 1 -> 16 triangles */
/* 2 -> 64 triangles */
/* 3 -> 256 triangles */

void main()
{
randomize();
strcpy(filename,"TETRA.RT");
Title();
clrscr();
printf("Generating %s File\n",filename);
printf("\n");
printf("By Christopher D. Watkins\n");
printf("\n");
printf("\n");
printf("Writing %d frames\n",numberofframes);
printf("\n");
printf("\n");
printf("Depth of Recursion = %d\n",level);
printf("\n");
printf("This Depth yields %d triangles and %d tetrahedrons\n",IntPower(4,level + 1),IntPower(4,level));
printf("\n");
printf("\n");
printf("< Hit any Key >\n");
Wait_For_Key();
textdiskfile=fopen(filename, "wt");
Init_Graphics(45);
Init_Perspective(false,0,0,500,500);
Init_Plotting(20,10);
Put_Axis_And_Palette(true);
Axis_And_Palette();
col = 35;
x1 = Round(xs * CosD(ang1));
y1 = Round(ys * SinD(ang1));
z1 = 0;
x2 = Round(xs * CosD(ang2));
y2 = Round(ys * SinD(ang2));
z2 = 0;
x3 = Round(xs * CosD(ang3));
y3 = Round(ys * SinD(ang3));
z3 = 0;
x4 = 0;
y4 = 0;
z4 = zs;
writeheader();
writestudio();
tetra(x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4,level);
fprintf(textdiskfile,"\n"); /* extents for bounding tetrahedron */
fprintf(textdiskfile,"\n"); /* BoundingTetraTest automatically turned on */
fprintf(textdiskfile,"TETRAEXTENTS\n");
fprintf(textdiskfile," EXTENT1 = %d %d %d\n",x1,y1,z1);
fprintf(textdiskfile," EXTENT2 = %d %d %d\n",x2,y2,z2);
fprintf(textdiskfile," EXTENT3 = %d %d %d\n",x3,y3,z3);
fprintf(textdiskfile," EXTENT4 = %d %d %d\n",x4,y4,z4);
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"BOUNDINGSPHERETEST\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"ENDFRAME\n");
fclose(textdiskfile);
Exit_Graphics();
}

--
������վ [���ݴ�ѧͥ��ԷBBS bbs.fzu.edu.cn] �� FROM [210.34.53.223]

����

Copyright © 2001 SJTUBBS, All Rights Reserved.

��Ȩ�����Ϻ�����BBS��ˮ˼Դվ


发信人: caroly.bbs@210.34.48.50 (jim), 信区: C
标 题: some codes (16)
发信站: FZU_BBS (Thu Dec 17 16:06:59 1998)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
/* ***********************************************************************
* *
* Toroid Database Generator *
* *
***********************************************************************
*/

#include "stdio.h"
#include "dos.h"
#include "conio.h"
#include "math.h"
#include "string.h"
#include "malloc.h"
#include "defs.h"
#include "globals.h"
#include "mathb.h"
#include "graphb.h"
#include "modelsup.h"
#include "shpmk.h"

int Theta, DTheta, HalfDTheta;
int Phi, DPhi, HalfDPhi;
int HorzLoop, VertLoop;

void SetupToroid(int Horizontal, int Vertical)
{
VertexNum=1;
VertexNumInFacet=1;
HorzLoop=Horizontal;
VertLoop=Vertical;
LastFacet=HorzLoop*VertLoop;
LastVertexNumInFacet=MaxVertexNumInFacet;
LastVertex=LastFacet*LastVertexNumInFacet;
DTheta=360/HorzLoop;
HalfDTheta=DTheta/2;
Theta=HalfDTheta+45+45;
DPhi=360/VertLoop;
HalfDPhi=DPhi/2;
Phi=HalfDPhi;
}

void MakeToroidDatabase(float Rho, float R)
{
float CosThetaMinus, SinThetaMinus;
float CosThetaPlus, SinThetaPlus;
float RCosPhiMinus, RSinPhiMinus;
float RCosPhiPlus, RSinPhiPlus;
float x, y, z;

FacetNum=0;
do
{
Phi=HalfDPhi;
CosThetaMinus=CosD(Theta-HalfDTheta);
SinThetaMinus=SinD(Theta-HalfDTheta);
CosThetaPlus=CosD(Theta+HalfDTheta);
SinThetaPlus=SinD(Theta+HalfDTheta);
do
{
RCosPhiMinus=R*CosD(Phi-HalfDPhi);
RSinPhiMinus=R*SinD(Phi-HalfDPhi);
RCosPhiPlus=R*CosD(Phi+HalfDPhi);
RSinPhiPlus=R*SinD(Phi+HalfDPhi);
++FacetNum;
x=(Rho+RCosPhiMinus)*CosThetaMinus;
y=(Rho+RCosPhiMinus)*SinThetaMinus;
z=RSinPhiMinus;
AddVertex(x, y, z);
x=(Rho+RCosPhiMinus)*CosThetaPlus;
y=(Rho+RCosPhiMinus)*SinThetaPlus;
z=RSinPhiMinus;
AddVertex(x, y, z);
x=(Rho+RCosPhiPlus)*CosThetaPlus;
y=(Rho+RCosPhiPlus)*SinThetaPlus;
z=RSinPhiPlus;
AddVertex(x, y, z);
x=(Rho+RCosPhiPlus)*CosThetaMinus;
y=(Rho+RCosPhiPlus)*SinThetaMinus;
z=RSinPhiPlus;
AddVertex(x, y, z);
VertexNumInFacet=1;
Phi+=DPhi;
}
while(Phi<360+HalfDPhi);
Theta+=DTheta;
}
while(Theta<360+HalfDTheta+90);
}

/* ***********************************************************************
* *
* Main Program *
* *
***********************************************************************
*/

void main()
{
Facet=farcalloc(((MaxFacet+1)*(MaxVertexNumInFacet+1)), sizeof(int));
InitVertexMaker();
SetupToroid(60, 60);
MakeToroidDatabase(0.75, 0.25);
SaveData("TOROID.DAT");
Exit_Graphics();
farfree(Facet);
}

--
※发信站 [福州大学庭芳苑BBS bbs.fzu.edu.cn] · FROM [210.34.53.223]


��ˮ˼Դ������

��ˮ˼Դվ �����Ķ� �������������
������: caroly.bbs@210.34.48.50 (jim), ����: C
�� ��: some codes(18)
����վ: FZU_BBS (Thu Dec 17 16:13:21 1998)
ת��վ: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
/*
������������������������������������������������������������������������ͻ
� �
� DNA - deoxyribonucleic acid �
� �
� �
������������������������������������������������������������������������ͼ
*/

#include "stdio.h"
#include "stdlib.h"
#include "dos.h"
#include "math.h"
#include "defs.h"

#define piover180 0.01745

float cosd(Word a)
{
return cos(a * piover180);
}

float sind(Word a)
{
return sin(a * piover180);
}

typedef char name[13];

FILE *Out_File;
name filename;

Word xresolution = 160;
Word yresolution = 100;
Byte numberofframes = 30;

void writeheader()
{
fprintf(Out_File,"������������������������������������������������������������������������ͻ\n");
fprintf(Out_File,"� �\n");
fprintf(Out_File,"� DNA - deoxyribonucleic acid �\n");
fprintf(Out_File,"� �\n");
fprintf(Out_File,"� �\n");
fprintf(Out_File,"������������������������������������������������������������������������ͼ\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"STATS\n");
fprintf(Out_File," XRES = %d\n",xresolution);
fprintf(Out_File," YRES = %d\n",yresolution);
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"FRAMES\n");
fprintf(Out_File," NUMBER = %d\n",numberofframes);
}

void writestudio()
{
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"ENVIRONMENT\n");
fprintf(Out_File," LOCLWGT = 0.750 0.750 0.750\n");
fprintf(Out_File," REFLWGT = 0.250 0.250 0.250\n");
fprintf(Out_File," TRANWGT = 0.000 0.000 0.000\n");
fprintf(Out_File," MINWGT = 0.030 0.030 0.030\n");
fprintf(Out_File," MAXWGT = 1.000 1.000 1.000\n");
fprintf(Out_File," RDEPTH = 2\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"LAMPS\n");
fprintf(Out_File," REFLAMP = FALSE\n");
fprintf(Out_File," LAMPREF = 0.000 0.000 0.000\n");
fprintf(Out_File," DISTEFF = 0.050\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"OBSERVER\n");
fprintf(Out_File," FLENGTH = 2.900\n");
fprintf(Out_File," OBSPOS = -90.000 -950.000 230.000\n");
fprintf(Out_File," ROTATE = 5.800\n");
fprintf(Out_File," TILT = 3.000\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"MATERIAL\n");
fprintf(Out_File," TYPE = BLUEMATTE\n");
fprintf(Out_File," TEXTURE = SHEETROCK\n");
fprintf(Out_File," AMBRFL = 0.100 0.100 0.200\n");
fprintf(Out_File," DIFRFL = 0.600 0.600 0.900\n");
fprintf(Out_File," SPCRFL = 0.000 0.000 0.000\n");
fprintf(Out_File," GLOSS = 0.000\n");
fprintf(Out_File," TRANS = 0.000 0.000 0.000\n");
fprintf(Out_File," INDEX = 1.000\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"MATERIAL\n");
fprintf(Out_File," TYPE = PHOSPHATE\n");
fprintf(Out_File," TEXTURE = SMOOTH\n");
fprintf(Out_File," AMBRFL = 0.200 0.200 0.200\n");
fprintf(Out_File," DIFRFL = 0.600 0.600 0.600\n");
fprintf(Out_File," SPCRFL = 0.200 0.200 0.200\n");
fprintf(Out_File," GLOSS = 35.000\n");
fprintf(Out_File," TRANS = 0.000 0.000 0.000\n");
fprintf(Out_File," INDEX = 1.000\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"{ nitrogenous bases (pyrimidine and purine derivatives) }\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"MATERIAL\n");
fprintf(Out_File," TYPE = GUANINE\n");
fprintf(Out_File," TEXTURE = SMOOTH\n");
fprintf(Out_File," AMBRFL = 0.000 0.200 0.000\n");
fprintf(Out_File," DIFRFL = 0.000 0.600 0.000\n");
fprintf(Out_File," SPCRFL = 0.000 0.200 0.000\n");
fprintf(Out_File," GLOSS = 35.000\n");
fprintf(Out_File," TRANS = 0.000 0.000 0.000\n");
fprintf(Out_File," INDEX = 1.000\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"MATERIAL\n");
fprintf(Out_File," TYPE = CYTOSINE\n");
fprintf(Out_File," TEXTURE = SMOOTH\n");
fprintf(Out_File," AMBRFL = 0.000 0.000 0.200\n");
fprintf(Out_File," DIFRFL = 0.000 0.000 0.600\n");
fprintf(Out_File," SPCRFL = 0.000 0.000 0.200\n");
fprintf(Out_File," GLOSS = 35.000\n");
fprintf(Out_File," TRANS = 0.000 0.000 0.000\n");
fprintf(Out_File," INDEX = 1.000\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"MATERIAL\n");
fprintf(Out_File," TYPE = THYMINE\n");
fprintf(Out_File," TEXTURE = SMOOTH\n");
fprintf(Out_File," AMBRFL = 0.200 0.000 0.000\n");
fprintf(Out_File," DIFRFL = 0.600 0.000 0.000\n");
fprintf(Out_File," SPCRFL = 0.200 0.000 0.000\n");
fprintf(Out_File," GLOSS = 35.000\n");
fprintf(Out_File," TRANS = 0.000 0.000 0.000\n");
fprintf(Out_File," INDEX = 1.000\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"MATERIAL\n");
fprintf(Out_File," TYPE = ADENINE\n");
fprintf(Out_File," TEXTURE = SMOOTH\n");
fprintf(Out_File," AMBRFL = 0.200 0.000 0.200\n");
fprintf(Out_File," DIFRFL = 0.600 0.000 0.600\n");
fprintf(Out_File," SPCRFL = 0.200 0.000 0.200\n");
fprintf(Out_File," GLOSS = 35.000\n");
fprintf(Out_File," TRANS = 0.000 0.000 0.000\n");
fprintf(Out_File," INDEX = 1.000\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"{ floor }\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"GROUND\n");
fprintf(Out_File," MATL = BLUEMATTE\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"{ lights }\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"LAMP\n");
fprintf(Out_File," LOC = 400.000 -400.000 400.000\n");
fprintf(Out_File," RADIUS = 100.000\n");
fprintf(Out_File," INTENS = 0.950 0.950 0.950\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"LAMP\n");
fprintf(Out_File," LOC = -400.000 -400.000 400.000\n");
fprintf(Out_File," RADIUS = 100.000\n");
fprintf(Out_File," INTENS = 0.950 0.950 0.950\n");
fprintf(Out_File,"\n");
fprintf(Out_File,"\n");
}

Byte randnum[41];

void assignmoleculetypes()
{
Word i;

for (i = 0; i <= 40; i++)
randnum[i] = 0;
for (i = 0; i <= 40; i++)
randnum[i] = random(4);
}

void makedna()
{
Word theta;
Word theta2;
Word dtheta;
float x, y, z;
float dz;
Word level;
Word t;
float phase;
float rad;

assignmoleculetypes();
phase = 0.0;
for (t = 1; t <= numberofframes; t++)
{
writestudio();
theta = (int)(phase) & 0xFFFF;
theta2 = (int)(phase + 130) & 0xFFFF;
rad = 15.0;
x = 0.0;
y = 0.0;
z = rad;
dtheta = 25;
dz = 25.0;
level = 1;
do
{
x = 45 * cosd(theta);
y = 45 * sind(theta);
fprintf(Out_File,"SPHERE\n");
fprintf(Out_File," LOC = %3.3f %3.3f %3.3f\n",x,y,z);
fprintf(Out_File," RADIUS = %3.3f\n",rad);
fprintf(Out_File," MATL = PHOSPHATE\n");
fprintf(Out_File,"\n");
x = 45 * cosd(theta2);
y = 45 * sind(theta2);
fprintf(Out_File,"SPHERE\n");
fprintf(Out_File," LOC = %3.3f %3.3f %3.3f\n",x,y,z);
fprintf(Out_File," RADIUS = %3.3f\n",rad);
fprintf(Out_File," MATL = PHOSPHATE\n");
fprintf(Out_File,"\n");
if ((level % 2 == 0))
{
x = 15 * cosd(theta);
y = 15 * sind(theta);
fprintf(Out_File,"SPHERE\n");
fprintf(Out_File," LOC = %3.3f %3.3f %3.3f\n",x,y,z);
fprintf(Out_File," RADIUS = %3.3f\n",rad);
switch (randnum[(level - 1) / 2])
{
case 0 : fprintf(Out_File," MATL = GUANINE\n");
break;
case 1 : fprintf(Out_File," MATL = CYTOSINE\n");
break;
case 2 : fprintf(Out_File," MATL = THYMINE\n");
break;
case 3 : fprintf(Out_File," MATL = ADENINE\n");
break;
}
fprintf(Out_File,"\n");
x = 15 * cosd(theta2);
y = 15 * sind(theta2);
fprintf(Out_File,"SPHERE\n");
fprintf(Out_File," LOC = %3.3f %3.3f %3.3f\n",x,y,z);
fprintf(Out_File," RADIUS = %3.3f\n",rad);
switch (randnum[(level - 1) / 2])
{
case 0 : fprintf(Out_File," MATL = CYTOSINE\n");
break;
case 1 : fprintf(Out_File," MATL = GUANINE\n");
break;
case 2 : fprintf(Out_File," MATL = ADENINE\n");
break;
case 3 : fprintf(Out_File," MATL = THYMINE\n");
break;
}
fprintf(Out_File,"\n");
}
level = level + 1;
theta = theta + dtheta;
theta2 = theta2 + dtheta;
z = z + dz;
}
while (!(((int)(theta - phase) > 360)));
fprintf(Out_File,"");
fprintf(Out_File,"");
fprintf(Out_File,"ENDFRAME");
phase = phase + (360.0 / numberofframes);
}
}

void main()
{
strcpy(filename,"DNA.RT");
clrscr();
printf("Generating %s File\n",filename);
printf("\n");
printf("By Christopher D. Watkins\n");
printf("\n");
printf("\n");
printf("Writing %d frames\n",numberofframes);
Out_File=fopen(filename, "wt");
writeheader();
makedna();
fclose(Out_File);
}

--
������վ [���ݴ�ѧͥ��ԷBBS bbs.fzu.edu.cn] �� FROM [210.34.53.223]

����

Copyright © 2001 SJTUBBS, All Rights Reserved.

��Ȩ�����Ϻ�����BBS��ˮ˼Դվ


发信人: caroly.bbs@210.34.48.50 (jim), 信区: C
标 题: some codes (19)
发信站: FZU_BBS (Thu Dec 17 16:23:07 1998)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn

/* ******************************************************
* *
* Video Graphics Array Driver *
* *
******************************************************

Plot - place pixel to screen
Set_Palette - set palette register
Init_Palette - 64 levels of grey, red, green and blue
Init_Palette2 - 7 colors with 35 intensities each - use with Pixel
Cycle_Palette - cycle through palette
Circle - circle draw routine
Draw - line draw routine
Init_Graphics - initialize graphics
Wait_For_Key - wait for key press
Exit_Graphics - sound and wait for keypress before exiting graphics
Title - set up text screen colors
*/

#include "stdio.h"
#include "dos.h"
#include "conio.h"
#include "math.h"
#include "malloc.h"
#include "defs.h"
#include "mathb.h"
#include "graphb.h"

union REGS reg;
struct SREGS inreg;

void Set_Mode(int Mode)

{
reg.h.ah=0;
reg.h.al=Mode;
int86(0x10,&reg,&reg);
}

Word X_Off, Y_Off;
static Word far *Pre_Calc_Y1;
static DWord far *Pre_Calc_Y2;
static Byte Res;

#define Low_Res 1
#define Medium_Res 2
#define High_Res 3

#define MODE_C 0x13
#define MODE_E 0x5c
#define MODE_V 0x5d
#define MODE_S 0x5e
#define MODE_T 0x62
#define MODE_F 0x5c

void Calc_Offsets()
{
Word tmp, tmp2;

if(XRes<MaxXRes)
{
tmp=MaxXRes>>1;
tmp2=XRes>>1;
X_Off=tmp-tmp2;
}
else
X_Off=0;
if(YRes<MaxYRes)
{
tmp=MaxYRes>>1;
tmp2=YRes>>1;
Y_Off=tmp-tmp2;
}
else
Y_Off=0;
}

void Pre_Calc()
{
Word j;

for(j=0; j<=MaxYRes; j++)
{
if(Res==Medium_Res)
Pre_Calc_Y2[j]=(DWord)MaxXRes*(DWord)j;
else
Pre_Calc_Y1[j]=MaxXRes*j;
}
}

static Word Old_Page, Old_Page_2;

void Plot(Word x, Word y, Byte color)
{
long L_Offset;
Word Offset, Page;
char far *address;

if((x<XRes) && (y<YRes))
{
switch(Res)
{
case High_Res : Offset=Pre_Calc_Y1[y+Y_Off]+x+X_Off;
Page=y>>6;
if(Page!=Old_Page)
{
/*
outpw(0x3CD, Page|64);
*/
outportb(0x3c4, 0xE);
outportb(0x3c5, (Page&0xF)^0x2);
Old_Page=Page;
}
address=(char far *)(0xA0000000L+Offset);
*address=color;
break;
case Medium_Res : x+=X_Off;
y+=Y_Off;
L_Offset=Pre_Calc_Y2[y]+x;
Page=(L_Offset>>16);
Offset=L_Offset&65535;
if(Page!=Old_Page)
{
/*
outpw(0x3CD, Page|64);
*/
outportb(0x3c4, 0xE);
outportb(0x3c5, (Page&0xF)^0x2);
Old_Page=Page;
}
address=(char far *)(0xA0000000L+Offset);
*address=color;
break;
case Low_Res : Offset=Pre_Calc_Y1[y+Y_Off]+x+X_Off;
address=(char far *)(0xA0000000L+Offset);
*address=color;
break;
default : reg.h.ah = 12;
reg.x.dx = y;
reg.x.cx = x;
reg.h.al = color;
int86(0x10, &reg, &reg);
break;
}
}
}

static Palette_Register Color;

void Set_Palette(Palette_Register Hue)
{
reg.x.ax=0x1012;
segread(&inreg);
inreg.es=inreg.ds;
reg.x.bx=0;
reg.x.cx=256;
reg.x.dx=(int)&Hue[0];
int86x(0x10,&reg,&reg,&inreg);
}

void Init_Palette(Palette_Register Color)
{
Word i;

for(i=0; i<64; i++)
{
Color[i].Red=i;
Color[i].Grn=i;
Color[i].Blu=i;
}
for(i=64; i<128; i++)
{
Color[i].Red=i-64;
Color[i].Grn=0;
Color[i].Blu=0;
}
for(i=128; i<192; i++)
{
Color[i].Red=0;
Color[i].Grn=i-128;
Color[i].Blu=0;
}
for(i=192; i<=255; i++)
{
Color[i].Red=0;
Color[i].Grn=0;
Color[i].Blu=i-192;
}
}

void Init_Palette_2(Palette_Register Color)
{
Word i;

for(i=0; i<36; i++)
{
Color[i].Red=0;
Color[i].Grn=0;
Color[i].Blu=Round(1.8*i);
}
for(i=36; i<72; i++)
{
Color[i].Red=0;
Color[i].Grn=Round(1.8*(i-36));
Color[i].Blu=0;
}
for(i=72; i<108; i++)
{
Color[i].Red=0;
Color[i].Grn=Round(1.8*(i-72));
Color[i].Blu=Round(1.8*(i-72));
}
for(i=108; i<144; i++)
{
Color[i].Red=Round(1.8*(i-108));
Color[i].Grn=0;
Color[i].Blu=0;
}
for(i=144; i<180; i++)
{
Color[i].Red=Round(1.8*(i-144));
Color[i].Grn=0;
Color[i].Blu=Round(1.8*(i-144));
}
for(i=180; i<216; i++)
{
Color[i].Red=Round(1.8*(i-180));
Color[i].Grn=Round(1.8*(i-180));
Color[i].Blu=0;
}
for(i=216; i<252; i++)
{
Color[i].Red=Round(1.8*(i-216));
Color[i].Grn=Round(1.8*(i-216));
Color[i].Blu=Round(1.8*(i-216));
}
}

void Cycle_Palette(Palette_Register Hue)
{
Word i;
RGB tmp;

tmp=Hue[0];
memcpy(&Hue[0], &Hue[1], 765);
Hue[255]=tmp;
Set_Palette(Hue);
}

void Swap(int *first, int *second)
{
int temp;

temp=*first;
*first=*second;
*second=temp;
}

void Circle(Word x, Word y, Word radius, Byte color)
{
int a, af, b, bf, target, r2, asp;

if(Res==High_Res)
asp=100;
else
asp=120;
target=0;
a=radius;
b=0;
r2=Sqr(radius);
while(a>=b)
{
b=Round(sqrt(r2-Sqr(a)));
Swap(&target,&b);
while(b<target)
{
af=(asp*a)/100;
bf=(asp*b)/100;
Plot(x+af, y+b, color);
Plot(x+bf, y+a, color);
Plot(x-af, y+b, color);
Plot(x-bf, y+a, color);
Plot(x-af, y-b, color);
Plot(x-bf, y-a, color);
Plot(x+af, y-b, color);
Plot(x+bf, y-a, color);
++b;
}
--a;
}
}

void Draw(int xx1, int yy1, int xx2, int yy2, Byte color)
{
int LgDelta, ShDelta, Cycle, LgStep, ShStep, dtotal;

LgDelta=xx2-xx1;
ShDelta=yy2-yy1;
if(LgDelta<0)
{
LgDelta=-LgDelta;
LgStep=-1;
}
else
LgStep=1;
if(ShDelta<0)
{
ShDelta=-ShDelta;
ShStep=-1;
}
else
ShStep=1;
if(ShDelta<LgDelta)
{
Cycle=LgDelta>>1;
while(xx1!=xx2)
{
Plot(xx1, yy1, color);
Cycle+=ShDelta;
if(Cycle>LgDelta)
{
Cycle-=LgDelta;
yy1+=ShStep;
}
xx1+=LgStep;
}
Plot(xx1, yy1, color);
}
else
{
Cycle=ShDelta >> 1;
Swap(&LgDelta, &ShDelta);
Swap(&LgStep, &ShStep);
while(yy1 != yy2)
{
Plot(xx1, yy1, color);
Cycle+=ShDelta;
if(Cycle>LgDelta)
{
Cycle-=LgDelta;
xx1+=ShStep;
}
yy1+=LgStep;
}
Plot(xx1, yy1, color);
}
}

int CentreX, CentreY;

void Init_Graphics(Byte Mode)
{
switch(Mode)
{
case MODE_C : Res=Low_Res;
MaxXRes=320;
MaxYRes=200;
break;
/*
case MODE_E : Res=Medium_Res;
MaxXRes=640;
MaxYRes=350;
break;
*/
case MODE_F : Res=Medium_Res;
MaxXRes=640;
MaxYRes=400;
break;
case MODE_V : Res=Medium_Res;
MaxXRes=640;
MaxYRes=480;
break;
case MODE_S : Res=Medium_Res;
MaxXRes=800;
MaxYRes=600;
break;
case MODE_T : Res=High_Res;
MaxXRes=1024;
MaxYRes=768;
break;
default : printf("Mode %d is not a valid graphics mode\n\n",Mode);
puts("Hit any key to exit");
getch();
exit(1);
break;
}
MaxX=MaxXRes-1;
MaxY=MaxYRes-1;
if(XRes==0)
XRes=MaxXRes;
if(YRes==0)
YRes=MaxYRes;
Calc_Offsets();
if(Res==Medium_Res)
Pre_Calc_Y2=farcalloc(768, sizeof(DWord));
else
Pre_Calc_Y1=farcalloc(768, sizeof(Word));
CentreX=XRes/2;
CentreY=YRes/2;
Asp=(1024.0/768.0)*((float)YRes/(float)XRes);
Pre_Calc();
Set_Mode(Mode);
Init_Palette_2(Color);
Set_Palette(Color);
}

void Set_Graphics_Mode(Word xRes, Word yRes)
{
XRes=xRes;
YRes=yRes;
if((XRes<321) && (YRes<201))
Init_Graphics(MODE_C);
else if((XRes<641) && (YRes<351))
Init_Graphics(MODE_E);
else if((XRes<641) && (YRes<401))
Init_Graphics(MODE_F);
else if((XRes<641) && (YRes<481))
Init_Graphics(MODE_V);
else if((XRes<801) && (YRes<601))
Init_Graphics(MODE_S);
else
Init_Graphics(MODE_T);
}

void Wait_For_Key()
{
char k;

while(!(k=getch()));
}

void Exit_Graphics()
{
sound(1000);
delay(500);
nosound();
if(Pre_Calc_Y1>0)
farfree(Pre_Calc_Y1);
if(Pre_Calc_Y2>0)
farfree(Pre_Calc_Y2);
Wait_For_Key();
Set_Mode(3);
}

void Title()
{
textcolor(YELLOW);
textbackground(BLUE);
clrscr();
}

/* **********************************************************************
* *
* Three Dimensional Plotting Routines *
* *
**********************************************************************

InitPlotting - rotation and tilt angles
InitPerspective - observer location and distances
MapCoordinates - maps 3D space onto the 2D screen
CartesianPlot - plot a cartesian system point
CylindricalPlot3D - plot a cylindrical system point
SphericalPlot3D - plot a spherical system point
DrawLine3D - plots a line from 3D coordinates
*/

float CosA, SinA;
float CosB, SinB;
float CosACosB, SinASinB;
float CosASinB, SinACosB;

void Init_Plotting(int Ang, int Tlt)
{
CentreX=XRes/2;
CentreY=YRes/2;
Angl=Ang;
Tilt=Tlt;
CosA=CosD(Angl);
SinA=SinD(Angl);
CosB=CosD(Tilt);
SinB=SinD(Tilt);
CosACosB=CosA*CosB;
SinASinB=SinA*SinB;
CosASinB=CosA*SinB;
SinACosB=SinA*CosB;
}

void Init_Perspective(Boolean Perspective, float x, float y, float z, float m)
{
PerspectivePlot=Perspective;
Mx=x;
My=y;
Mz=z;
ds=m;
}

void Map_Coordinates(float X, float Y, float Z, int *Xp, int *Yp)
{
float Xt, Yt, Zt;
float OneOverZt;

Xt=(Mx+X*CosA-Y*SinA);
Yt=(My+X*SinASinB+Y*CosASinB+Z*CosB);
if(PerspectivePlot)
{
Zt=Mz+X*SinACosB+Y*CosACosB-Z*SinB;
OneOverZt=1.0/Zt;
*Xp=CentreX+Round(ds*Xt*OneOverZt);
if(Res!=Low_Res)
*Yp=CentreY-Round(ds*Yt*OneOverZt);
else
*Yp=CentreY-Round(ds*Yt*OneOverZt*Asp);
}
else
{
*Xp=CentreX+Round(Xt);
if(Res!=Low_Res)
*Yp=CentreY-Round(Yt);
else
*Yp=CentreY-Round(Yt*Asp);
}
}

void Cartesian_Plot_3D(float X, float Y, float Z, Byte Color)
{
int Xp, Yp;

Map_Coordinates(X, Y, Z, &Xp, &Yp);
Plot(Xp, Yp, Color);
}

void Cylindrical_Plot_3D(float Rho, float Theta, float Z, Byte Color)
{
float X, Y;

Theta=Radians(Theta);
X=Rho*cos(Theta);
Y=Rho*sin(Theta);
Cartesian_Plot_3D(X, Y, Z, Color);
}

void Spherical_Plot_3D(float R, float Theta, float Phi, Byte Color)
{
float X, Y, Z;

Theta=Radians(Theta);
Phi=Radians(Phi);
X=R*sin(Theta)*cos(Phi);
Y=R*sin(Theta)*sin(Phi);
Z=R*cos(Theta);
Cartesian_Plot_3D(X, Y, Z, Color);
}

void Draw_Line_3D(TDA Pnt1, TDA Pnt2, Byte Color)
{
int Xp1, Yp1;
int Xp2, Yp2;
float x1, y1, z1;
float x2, y2, z2;

UnVec(Pnt1, &x1, &y1, &z1);
UnVec(Pnt2, &x2, &y2, &z2);
Map_Coordinates(x1, y1, z1, &Xp1, &Yp1);
Map_Coordinates(x2, y2, z2, &Xp2, &Yp2);
Draw(Xp1, Yp1, Xp2, Yp2, Color);
}

/* ********************************************
* *
* Pixel *
* *
********************************************

PutPixel - plots pixel
GetPixel - gets pixel

Color 1 - Blue
2 - Green
3 - Cyan
4 - Red
5 - Magenta
6 - Brown/Yellow
7 - Gray Scale

Intensity levels (0..35) for each color
*/

void Put_Pixel(int x, int y, Byte Color, Byte Intensity)
{
Byte Col;

if(Intensity>MaxInten)
exit(1);
Col=((MaxInten+1)*(Color-1)+Intensity) & 255;
Plot(x, y, Col);
}

Byte Get_Pixel(Word x, Word y)
{
long L_Offset;
Word Offset, Page;
char far *address;
Byte color;

if((x<XRes) && (y<YRes))
{
switch(Res)
{
case High_Res : Offset=Pre_Calc_Y1[y+Y_Off]+x+X_Off;
Page=(y>>6)&15;
if(Page!=Old_Page_2)
{
/*
outpw(0x3CD, (Page<<4)|Old_Page);
*/
outportb(0x3c4, 0xE);
outportb(0x3c5, (Page&0xF)^0x2);
Old_Page_2=Page;
}
address=(char far *)(0xA0000000L+Offset);
color=*address;
break;
case Medium_Res : x+=X_Off;
y+=Y_Off;
L_Offset=Pre_Calc_Y2[y]+x;
Page=(L_Offset>>16);
Offset=L_Offset&65535;
if(Page!=Old_Page_2)
{
/*
outpw(0x3CD, (Page<<4)|Old_Page);
*/
outportb(0x3c4, 0xE);
outportb(0x3c5, (Page&0xF)^0x2);
Old_Page_2=Page;
}
address=(char far *)(0xA0000000L+Offset);
color=*address;
break;
case Low_Res : Offset=Pre_Calc_Y1[y+Y_Off]+x+X_Off;
address=(char far *)(0xA0000000L+Offset);
color=*address;
break;
}
}
return(color);
}

Byte Get_Pixel_2(Word x, Word y)
{
x+=X_Off;
y+=Y_Off;
reg.x.ax=3328;
reg.x.dx=y;
reg.x.cx=x;
int86(0x10,&reg,&reg);
/*
outpw(0x3CD, Old_Page|64);
*/
outportb(0x3c4, 0xE);
outportb(0x3c5, (Old_Page&0xF)^0x2);
return(reg.x.ax&255);
}

/* ****************************************************************
* *
* Setup of Coordinate Axes and Color Palette *
* *
****************************************************************

PutAxisAndPalette - toggle for Axis and Palette
AxisAndPalette - places Axis and Color Palette on screen
*/

void Put_Axis_And_Palette(Boolean PlaceOnScreen)
{
if(PlaceOnScreen)
Draw_Axis_And_Palette=true;
else
Draw_Axis_And_Palette=false;
}

void Display_Axis()
{
int x, y, z, sx, sy;

sx=XRes/320;
sy=YRes/200;
for(x=-100*sx; x<101*sx; x++)
{
Cartesian_Plot_3D(x, 0, 0, 35);
Cartesian_Plot_3D(100*sx, 0, 0, 251);
}
for(y=-100*sy; y<101*sy; y++)
{
Cartesian_Plot_3D(0, y, 0, 71);
Cartesian_Plot_3D(0, 100*sy, 0,251);
}
for(z=-100*sx; z<101*sx; z++)
{
Cartesian_Plot_3D(0, 0, z, 107);
Cartesian_Plot_3D(0, 0, 100*sx, 251);
}
}

void Display_Palette()
{
int X, Y, sx, sy;
Byte Color;
Byte Intensity;

sx=XRes/320;
sy=YRes/200;
for(Color=1; Color<=MaxCol; Color++)
{
for(Intensity=0; Intensity<=MaxInten; Intensity++)
{
for(X=0; X<4*sx; X++)
{
for(Y=0; Y<4*sy; Y++)
Put_Pixel(X+(5*sx)*Color,
(190*sy)-Y-(5*sy)*Intensity,
Color,
Intensity);
}
}
}
}

void Axis_And_Palette()
{
if(Draw_Axis_And_Palette)
{
Display_Axis();
Display_Palette();
}
}

--
※发信站 [福州大学庭芳苑BBS bbs.fzu.edu.cn] · FROM [210.34.53.223]


��ˮ˼Դ������

��ˮ˼Դվ �����Ķ� �������������
������: caroly.bbs@210.34.48.50 (jim), ����: C
�� ��: some codes (20)
����վ: FZU_BBS (Thu Dec 17 16:28:28 1998)
ת��վ: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
/*
������������������������������������������������������������������������ͻ
� �
� Pool Table with Cue and Balls �
� �
� �
������������������������������������������������������������������������ͼ
*/

#include "stdio.h"
#include "dos.h"
#include "math.h"
#include "defs.h"

#define Pi_Over_180 0.01745

float SinD(float a)
{
return (sin(a * Pi_Over_180));
}

float CosD(float a)
{
return (cos(a * Pi_Over_180));
}

typedef char name[13];

FILE *textdiskfile;
name filename;

Word xresolution = 1024;
Word yresolution = 768;
Byte numberofframes = 1;

void writeheader()
{
fprintf(textdiskfile,"������������������������������������������������������������������������ͻ\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"� Pool Table with Cue and Balls �\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"������������������������������������������������������������������������ͼ\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"STATS\n");
fprintf(textdiskfile," XRES = %d\n",xresolution);
fprintf(textdiskfile," YRES = %d\n",yresolution);
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"FRAMES\n");
fprintf(textdiskfile," NUMBER = %d\n",numberofframes);
}

void writestudio()
{
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"ENVIRONMENT\n");
fprintf(textdiskfile," LOCLWGT = 0.800 0.800 0.800\n");
fprintf(textdiskfile," REFLWGT = 0.200 0.200 0.200\n");
fprintf(textdiskfile," TRANWGT = 0.000 0.000 0.000\n");
fprintf(textdiskfile," MINWGT = 0.030 0.030 0.030\n");
fprintf(textdiskfile," MAXWGT = 1.000 1.000 1.000\n");
fprintf(textdiskfile," RDEPTH = 3\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMPS\n");
fprintf(textdiskfile," REFLAMP = FALSE\n");
fprintf(textdiskfile," LAMPREF = 0.000 0.000 0.000\n");
fprintf(textdiskfile," DISTEFF = 0.050\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"OBSERVER\n");
fprintf(textdiskfile," FLENGTH = 3.500\n");
fprintf(textdiskfile," OBSPOS = 0.000 -700.000 125.000\n");
fprintf(textdiskfile," ROTATE = 0.000\n");
fprintf(textdiskfile," TILT = 15.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = CARPET\n");
fprintf(textdiskfile," TEXTURE = SHEETROCK\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.450 0.800 0.490\n");
fprintf(textdiskfile," SPCRFL = 0.000 0.000 0.000\n");
fprintf(textdiskfile," GLOSS = 0.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = CUE\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.250 0.250 0.250\n");
fprintf(textdiskfile," DIFRFL = 0.600 0.300 0.200\n");
fprintf(textdiskfile," SPCRFL = 0.000 0.000 0.000\n");
fprintf(textdiskfile," GLOSS = 0.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = CUETIP\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," DIFRFL = 0.500 0.500 0.500\n");
fprintf(textdiskfile," SPCRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," GLOSS = 2.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = WHITE\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.300 0.300 0.300\n");
fprintf(textdiskfile," DIFRFL = 0.550 0.550 0.550\n");
fprintf(textdiskfile," SPCRFL = 0.150 0.150 0.150\n");
fprintf(textdiskfile," GLOSS = 15.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = BLACK\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," DIFRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," SPCRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," GLOSS = 15.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = RED\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.300 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.600 0.000 0.000\n");
fprintf(textdiskfile," SPCRFL = 0.150 0.000 0.000\n");
fprintf(textdiskfile," GLOSS = 15.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = YELLOW\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.200 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.600 0.600 0.000\n");
fprintf(textdiskfile," SPCRFL = 0.200 0.200 0.000\n");
fprintf(textdiskfile," GLOSS = 15.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = BLUE\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.200\n");
fprintf(textdiskfile," DIFRFL = 0.000 0.000 0.600\n");
fprintf(textdiskfile," SPCRFL = 0.000 0.000 0.200\n");
fprintf(textdiskfile," GLOSS = 15.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = GREEN\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.200 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.000 0.600 0.000\n");
fprintf(textdiskfile," SPCRFL = 0.000 0.200 0.000\n");
fprintf(textdiskfile," GLOSS = 15.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = PURPLE\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.200\n");
fprintf(textdiskfile," DIFRFL = 0.600 0.300 0.600\n");
fprintf(textdiskfile," SPCRFL = 0.200 0.100 0.200\n");
fprintf(textdiskfile," GLOSS = 15.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = MAROON\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.100 0.200\n");
fprintf(textdiskfile," DIFRFL = 0.600 0.250 0.350\n");
fprintf(textdiskfile," SPCRFL = 0.150 0.100 0.150\n");
fprintf(textdiskfile," GLOSS = 15.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = ORANGE\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.700 0.500 0.300\n");
fprintf(textdiskfile," SPCRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," GLOSS = 15.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = REDSTRIPE\n");
fprintf(textdiskfile," TEXTURE = WOOD\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.600 0.000 0.000\n");
fprintf(textdiskfile," SPCRFL = 0.200 0.000 0.000\n");
fprintf(textdiskfile," GLOSS = 10.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = YELLOWSTRIPE\n");
fprintf(textdiskfile," TEXTURE = WOOD\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.200 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.600 0.600 0.000\n");
fprintf(textdiskfile," SPCRFL = 0.200 0.200 0.000\n");
fprintf(textdiskfile," GLOSS = 10.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = BLUESTRIPE\n");
fprintf(textdiskfile," TEXTURE = WOOD\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.200\n");
fprintf(textdiskfile," DIFRFL = 0.000 0.000 0.600\n");
fprintf(textdiskfile," SPCRFL = 0.000 0.000 0.200\n");
fprintf(textdiskfile," GLOSS = 10.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = GREENSTRIPE\n");
fprintf(textdiskfile," TEXTURE = WOOD\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.200 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.000 0.600 0.000\n");
fprintf(textdiskfile," SPCRFL = 0.000 0.200 0.000\n");
fprintf(textdiskfile," GLOSS = 10.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = PURPLESTRIPE\n");
fprintf(textdiskfile," TEXTURE = WOOD\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.200\n");
fprintf(textdiskfile," DIFRFL = 0.600 0.300 0.600\n");
fprintf(textdiskfile," SPCRFL = 0.200 0.100 0.200\n");
fprintf(textdiskfile," GLOSS = 10.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = MAROONSTRIPE\n");
fprintf(textdiskfile," TEXTURE = WOOD\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.100 0.200\n");
fprintf(textdiskfile," DIFRFL = 0.600 0.250 0.350\n");
fprintf(textdiskfile," SPCRFL = 0.150 0.100 0.150\n");
fprintf(textdiskfile," GLOSS = 10.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = ORANGESTRIPE\n");
fprintf(textdiskfile," TEXTURE = WOOD\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.700 0.500 0.300\n");
fprintf(textdiskfile," SPCRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," GLOSS = 10.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"GROUND\n");
fprintf(textdiskfile," MATL = CARPET\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMP\n");
fprintf(textdiskfile," LOC = 0.000 350.000 350.000\n");
fprintf(textdiskfile," RADIUS = 120.000\n");
fprintf(textdiskfile," INTENS = 0.650 0.650 0.650\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMP\n");
fprintf(textdiskfile," LOC = 0.000 -500.000 350.000\n");
fprintf(textdiskfile," RADIUS = 120.000\n");
fprintf(textdiskfile," INTENS = 0.650 0.650 0.650\n");
}

void sph(float x, float y, float z, float rad, char * color)
{
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"SPHERE\n");
fprintf(textdiskfile," LOC = %3.3f %3.3f %3.3f\n",x,y,z);
fprintf(textdiskfile," RADIUS = %3.3f\n",rad);
fprintf(textdiskfile," MATL = %s\n",color);
}

void make()
{
Byte frame;
float phase;
float x1, y1, z1;
float x2, y2, z2;
float x3, y3, z3;
float x4, y4, z4;
float x5, y5, z5;
float x6, y6, z6;
float x7, y7, z7;
float x8, y8, z8;
float x9, y9, z9;
float x10, y10, z10;
float x11, y11, z11;
float x12, y12, z12;
float x13, y13, z13;
float x14, y14, z14;
float x15, y15, z15;
float rad, hgt;
float dx, dy;
float scale;

phase = -90.0;
rad = 16.0;
scale = rad * 5;
writestudio();

/* Caclulate the Positions of the Pool Balls */

hgt = rad;
dx = CosD(phase);
dy = SinD(phase);
x1 = scale * dx;
y1 = scale * dy;
z1 = hgt;
dx = CosD(phase + 120.0);
dy = SinD(phase + 120.0);
x15 = scale * dx;
y15 = scale * dy;
z15 = hgt;
dx = CosD(phase + 240.0);
dy = SinD(phase + 240.0);
x11 = scale * dx;
y11 = scale * dy;
z11 = hgt;
x6 = (x1 + x15) / 2.0; /* p6 = (p1 + p15) / 2 */
y6 = (y1 + y15) / 2.0;
z6 = hgt;
x13 = (x11 + x15) / 2.0; /* p13 = (p11 + p15) / 2 */
y13 = (y11 + y15) / 2.0;
z13 = hgt;
x4 = (x11 + x1) / 2.0; /* p4 = (p11 + p1) / 2 */
y4 = (y11 + y1) / 2.0;
z4 = hgt;
x2 = (x1 + x4) / 2.0; /* p2 = (p1 + p4) / 2 */
y2 = (y1 + y4) / 2.0;
z2 = hgt;
x3 = (x1 + x6) / 2.0; /* p3 = (p1 + p6) / 2 */
y3 = (y1 + y6) / 2.0;
z3 = hgt;
x5 = (x4 + x6) / 2.0; /* p5 = (p4 + p6) / 2 */
y5 = (y4 + y6) / 2.0;
z5 = hgt;
x7 = (x4 + x11) / 2.0; /* p7 = (p4 + p11) / 2 */
y7 = (y4 + y11) / 2.0;
z7 = hgt;
x8 = (x4 + x13) / 2.0; /* p8 = (p4 + p13) / 2 */
y8 = (y4 + y13) / 2.0;
z8 = hgt;
x9 = (x6 + x13) / 2.0; /* p9 = (p6 + p13) / 2 */
y9 = (y6 + y13) / 2.0;
z9 = hgt;
x10 = (x6 + x15) / 2.0; /* p10 = (p6 + p15) / 2 */
y10 = (y6 + y15) / 2.0;
z10 = hgt;
x12 = (x11 + x13) / 2.0; /* p12 = (p11 + p13) / 2 */
y12 = (y11 + y13) / 2.0;
z12 = hgt;
x14 = (x13 + x15) / 2.0; /* p14 = (p13 + p15) / 2 */
y14 = (y13 + y15) / 2.0;
z14 = hgt;

/* Cue */

fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"CYLINDER\n");
fprintf(textdiskfile," BASELOC = 0.000 -420.000 %3.3f\n",rad);
fprintf(textdiskfile," BASERAD = 4.000\n");
fprintf(textdiskfile," BASELOC = 0.000 -432.000 %3.3f\n",rad);
fprintf(textdiskfile," MATL = CUETIP\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"CYLINDER\n");
fprintf(textdiskfile," BASELOC = 0.000 -432.000 %3.3f\n",rad);
fprintf(textdiskfile," BASERAD = 4.000\n");
fprintf(textdiskfile," BASELOC = 0.000 -800.000 %3.3f\n",rad);
fprintf(textdiskfile," MATL = CUE\n");

/* Cue Ball */

sph(0.0,-390.0,hgt,rad,"WHITE");

/* Pool Balls */

sph(x1,y1,z1,rad,"RED");
sph(x2,y2,z2,rad,"YELLOW");
sph(x3,y3,z3,rad,"BLUE");
sph(x4,y4,z4,rad,"GREEN");
sph(x5,y5,z5,rad,"PURPLE");
sph(x6,y6,z6,rad,"MAROON");
sph(x7,y7,z7,rad,"ORANGE");
sph(x8,y8,z8,rad,"BLACK");
sph(x9,y9,z9,rad,"ORANGESTRIPE");
sph(x10,y10,z10,rad,"MAROONSTRIPE");
sph(x11,y11,z11,rad,"PURPLESTRIPE");
sph(x12,y12,z12,rad,"GREENSTRIPE");
sph(x13,y13,z13,rad,"BLUESTRIPE");
sph(x14,y14,z14,rad,"YELLOWSTRIPE");
sph(x15,y15,z15,rad,"REDSTRIPE");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"ENDFRAME\n");
}

void main()
{
strcpy(filename,"POOLTABL.RT");
clrscr();
printf("Generating %s File\n",filename);
printf("\n");
printf("By Christopher D. Watkins\n");
printf("\n");
printf("\n");
printf("Writing %d frames\n",numberofframes);
textdiskfile=fopen(filename, "wt");
writeheader();
make();
fclose(textdiskfile);
}

--
������վ [���ݴ�ѧͥ��ԷBBS bbs.fzu.edu.cn] �� FROM [210.34.53.223]

����

Copyright © 2001 SJTUBBS, All Rights Reserved.

��Ȩ�����Ϻ�����BBS��ˮ˼Դվ


发信人: caroly.bbs@210.34.48.50 (jim), 信区: C
标 题: some codes (21)
发信站: FZU_BBS (Thu Dec 17 16:36:31 1998)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
/* *************************************************
* *
* Three Particle Orbit Simulator *
* *
* *
*************************************************

increase time step "dt" to greater than zero to increase speed
*/

#include "stdio.h"
#include "conio.h"
#include "math.h"
#include "defs.h"
#include "globals.h"
#include "mathb.h"
#include "graphb.h"

float X1, Y1, Z1, Vx1, Vy1, Vz1, Ax1, Ay1, Az1;
float X2, Y2, Z2, Vx2, Vy2, Vz2, Ax2, Ay2, Az2;
float X3, Y3, Z3, Vx3, Vy3, Vz3, Ax3, Ay3, Az3;
float D12, D23, D31, dt;
float Dx12, Dx23, Dx31;
float Dy12, Dy23, Dy31;
float Dz12, Dz23, Dz31;
float Tx12, Tx23, Tx31;
float Ty12, Ty23, Ty31;
float Tz12, Tz23, Tz31;
int Xp1, Yp1, Zp1, Xp2, Yp2, Zp2, Xp3, Yp3, Zp3;
int M1, M2, M3;
float s;

void main()
{
Init_Graphics(19);
Init_Perspective(false, 0, 0, 500, 500);
Init_Plotting(245, 25);
Put_Axis_And_Palette(true);
Axis_And_Palette();

/* stable orbit */

M1=12;
M2=1;
M3=1;
X1=0.0; Y1=0.0; Z1= 0.0;
X2=0.0; Y2=0.0; Z2=-40.0;
X3=0.0; Y3=0.0; Z3= 40.0;
Vx1= 0.0000; Vy1= 0.0000; Vz1= 0.0000;
Vx2=-0.1000; Vy2=-0.1000; Vz2=-0.1000;
Vx3= 0.1000; Vy3= 0.1000; Vz3= 0.1000;
dt=0.2;
s=1.0;

/*
M1=1;
M2=10;
M3=3;
X1=-40.0; Y1=0.0; Z1=0.0;
X2= 00.0; Y2=0.0; Z2=0.0;
X3= 90.0; Y3=0.0; Z3=0.0;
Vx1= 0.1010; Vy1= 0.2500; Vz1=-0.0240;
Vx2= 0.0010; Vy2= 0.0010; Vz2= 0.0240;
Vx3=-0.0200; Vy3=-0.1010; Vz3= 0.1540;
dt=0.4;
s=1.0;
*/

/*
M1=5;
M2=1;
M3=10;
X1=-10.0; Y1=-90.0; Z1= 10.0;
X2= 0.0; Y2=-70.0; Z2=-40.0;
X3= 15.0; Y3=-90.0; Z3= 40.0;
Vx1= 0.2000; Vy1= 0.0300; Vz1= 0.0070;
Vx2=-0.1000; Vy2=-0.1020; Vz2=-0.1000;
Vx3= 0.1000; Vy3= 0.0991; Vz3= 0.1000;
dt=0.3;
s=1.0;
*/

/*
M1=1;
M2=6;
M3=4;
X1=-40.0; Y1= 0.0; Z1= 0.0;
X2= 0.0; Y2= 0.0; Z2= 0.0;
X3= 90.0; Y3= 0.0; Z3= 0.0;
Vx1= 0.1010; Vy1= 0.2500; Vz1=-0.0240;
Vx2= 0.0010; Vy2= 0.0010; Vz2=-0.0440;
Vx3=-0.0200; Vy3=-0.1010; Vz3= 0.1240;
dt=0.1;
s=1.0;
*/

/*
M1=5;
M2=7;
M3=12;
X1=-40.0; Y1= 16.0; Z1=-20.0;
X2= 0.0; Y2= 64.0; Z2= 2.0;
X3=-10.0; Y3=-20.0; Z3= 52.0;
Vx1= 0.2010; Vy1= 0.2600; Vz1=-0.1240;
Vx2= 0.2600; Vy2= 0.2010; Vz2=-0.1623;
Vx3=-0.0200; Vy3=-0.1010; Vz3= 0.3140;
dt=0.15;
s=0.5;
*/

/*
M1=6;
M2=1;
M3=16;
X1=-20.0; Y1=-16.0; Z1=-25.0;
X2= 20.0; Y2= 14.0; Z2= -2.0;
X3= 10.0; Y3= 20.0; Z3= 12.0;
Vx1= 0.2010; Vy1= 0.2200; Vz1=-0.1240;
Vx2= 0.1600; Vy2= 0.3010; Vz2=-0.2623;
Vx3=-0.1200; Vy3=-0.3910; Vz3=-0.1140;
dt=0.30;
s=0.25;
*/

/*
M1=35;
M2=2;
M3=4;
X1= 0.0; Y1= 0.0; Z1= 0.0;
X2= 0.0; Y2= 40.0; Z2= 0.0;
X3= 0.0; Y3= 80.0; Z3= 0.0;
Vx1= 0.0000; Vy1= 0.0000; Vz1= 0.0000;
Vx2= 0.0000; Vy2= 0.0000; Vz2= 1.0000;
Vx3= 0.0000; Vy3= 0.0000; Vz3=-0.6500;
dt=0.10;
s=1.0;
*/

/*
M1=35;
M2=2;
M3=4;
X1= 0.0; Y1= 0.0; Z1= 0.0;
X2= 0.0; Y2= 40.0; Z2= 0.0;
X3= 0.0; Y3=100.0; Z3= 0.0;
Vx1= 0.0000; Vy1= 0.0000; Vz1= 0.0000;
Vx2= 0.0010; Vy2= 0.0000; Vz2= 1.0000;
Vx3=-0.0010; Vy3= 0.0000; Vz3=-0.5000;
dt=0.10;
s=1.0;
*/

/*
M1=35;
M2=2;
M3=4;
X1= 0.0; Y1= 0.0; Z1= 0.0;
X2= 0.0; Y2= 40.0; Z2= 0.0;
X3= 0.0; Y3=100.0; Z3= 0.0;
Vx1= 0.0000; Vy1= 0.0000; Vz1= 0.0000;
Vx2= 0.0000; Vy2= 0.0000; Vz2= 1.0000;
Vx3= 0.6500; Vy3= 0.4000; Vz3=-0.0400;
dt=0.10;
s=1.0;
*/

do
{
Cartesian_Plot_3D(X1*s, Y1*s, Z1*s, 0);
Cartesian_Plot_3D(X2*s, Y2*s, Z2*s, 0);
Cartesian_Plot_3D(X3*s, Y3*s, Z3*s, 0);
X1+=Vx1*dt;
Y1+=Vy1*dt;
Z1+=Vz1*dt;
X2+=Vx2*dt;
Y2+=Vy2*dt;
Z2+=Vz2*dt;
X3+=Vx3*dt;
Y3+=Vy3*dt;
Z3+=Vz3*dt;
Cartesian_Plot_3D(X1*s, Y1*s, Z1*s, 143);
Cartesian_Plot_3D(X2*s, Y2*s, Z2*s, 169);
Cartesian_Plot_3D(X3*s, Y3*s, Z3*s, 205);
Dx12=X1-X2;
Dy12=Y1-Y2;
Dz12=Z1-Z2;
Dx23=X2-X3;
Dy23=Y2-Y3;
Dz23=Z2-Z3;
Dx31=X3-X1;
Dy31=Y3-Y1;
Dz31=Z3-Z1;
D12=sqrt(SqrFP(Dx12)+SqrFP(Dy12)+SqrFP(Dz12));
D12=1.0/(D12*D12*D12);
D23=sqrt(SqrFP(Dx23)+SqrFP(Dy23)+SqrFP(Dz23));
D23=1.0/(D23*D23*D23);
D31=sqrt(SqrFP(Dx31)+SqrFP(Dy31)+SqrFP(Dz31));
D31=1.0/(D31*D31*D31);
Tx31=Dx31*D31;
Ty31=Dy31*D31;
Tz31=Dz31*D31;
Tx12=Dx12*D12;
Ty12=Dy12*D12;
Tz12=Dz12*D12;
Tx23=Dx23*D23;
Ty23=Dy23*D23;
Tz23=Dz23*D23;
Ax1=(M3*Tx31-M2*Tx12);
Ay1=(M3*Ty31-M2*Ty12);
Az1=(M3*Tz31-M2*Tz12);
Ax2=(M1*Tx12-M3*Tx23);
Ay2=(M1*Ty12-M3*Ty23);
Az2=(M1*Tz12-M3*Tz23);
Ax3=(M2*Tx23-M1*Tx31);
Ay3=(M2*Ty23-M1*Ty31);
Az3=(M2*Tz23-M1*Tz31);
Vx1+=Ax1*dt;
Vy1+=Ay1*dt;
Vz1+=Az1*dt;
Vx2+=Ax2*dt;
Vy2+=Ay2*dt;
Vz2+=Az2*dt;
Vx3+=Ax3*dt;
Vy3+=Ay3*dt;
Vz3+=Az3*dt;
}
while(!(kbhit()));
Exit_Graphics();
}

--
※发信站 [福州大学庭芳苑BBS bbs.fzu.edu.cn] · FROM [210.34.53.223]


��ˮ˼Դ������

��ˮ˼Դվ �����Ķ� �������������
������: caroly.bbs@210.34.48.50 (jim), ����: C
�� ��: some codes (30)
����վ: FZU_BBS (Thu Dec 17 16:33:46 1998)
ת��վ: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
/*
������������������������������������������������������������������������ͻ
� �
� Desk Scene �
� �
� �
������������������������������������������������������������������������ͼ
*/

#include "stdio.h"
#include "dos.h"
#include "math.h"
#include "defs.h"

typedef char name[33];

FILE *textdiskfile;
name filename;

Word xresolution = 1024;
Word yresolution = 768;
Byte numberofframes = 1;

void writeheader()
{
fprintf(textdiskfile,"������������������������������������������������������������������������ͻ\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"� Desk Scene �\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"� �\n");
fprintf(textdiskfile,"������������������������������������������������������������������������ͼ\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"STATS\n");
fprintf(textdiskfile," XRES = %d\n",xresolution);
fprintf(textdiskfile," YRES = %d\n",yresolution);
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"FRAMES\n");
fprintf(textdiskfile," NUMBER = %d\n",numberofframes);
}

void writestudio()
{
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"ENVIRONMENT\n");
fprintf(textdiskfile," LOCLWGT = 0.750 0.750 0.750\n");
fprintf(textdiskfile," REFLWGT = 0.250 0.250 0.250\n");
fprintf(textdiskfile," TRANWGT = 0.950 0.950 0.950\n");
fprintf(textdiskfile," MINWGT = 0.030 0.030 0.030\n");
fprintf(textdiskfile," MAXWGT = 1.000 1.000 1.000\n");
fprintf(textdiskfile," RDEPTH = 5\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMPS\n");
fprintf(textdiskfile," REFLAMP = FALSE\n");
fprintf(textdiskfile," LAMPREF = 0.000 0.000 0.000\n");
fprintf(textdiskfile," DISTEFF = 0.300\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"OBSERVER\n");
fprintf(textdiskfile," FLENGTH = 1.400\n");
fprintf(textdiskfile," OBSPOS = 0.000 -295.000 290.000\n");
fprintf(textdiskfile," ROTATE = 0.000\n");
fprintf(textdiskfile," TILT = 28.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = MATTEWALL\n");
fprintf(textdiskfile," TEXTURE = SHEETROCK\n");
fprintf(textdiskfile," AMBRFL = 0.300 0.300 0.300\n");
fprintf(textdiskfile," DIFRFL = 0.700 0.700 0.700\n");
fprintf(textdiskfile," SPCRFL = 0.000 0.000 0.000\n");
fprintf(textdiskfile," GLOSS = 0.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = BLACKFELT\n");
fprintf(textdiskfile," TEXTURE = SHEETROCK\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.350 0.350 0.350\n");
fprintf(textdiskfile," SPCRFL = 0.000 0.000 0.000\n");
fprintf(textdiskfile," GLOSS = 0.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = CHROME\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," SPCRFL = 0.800 0.800 0.800\n");
fprintf(textdiskfile," GLOSS = 40.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = BRASS\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.300 0.300 0.300\n");
fprintf(textdiskfile," SPCRFL = 0.600 0.500 0.250\n");
fprintf(textdiskfile," GLOSS = 30.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = MIRROR\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," DIFRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," SPCRFL = 0.700 0.700 0.700\n");
fprintf(textdiskfile," GLOSS = 40.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = ITALIANMARBLE\n");
fprintf(textdiskfile," TEXTURE = MARBLE\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," DIFRFL = 0.600 0.600 0.600\n");
fprintf(textdiskfile," SPCRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," GLOSS = 10.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = OAKWOOD\n");
fprintf(textdiskfile," TEXTURE = WOOD\n");
fprintf(textdiskfile," AMBRFL = 0.200 0.200 0.200\n");
fprintf(textdiskfile," DIFRFL = 0.700 0.400 0.300\n");
fprintf(textdiskfile," SPCRFL = 0.100 0.100 0.100\n");
fprintf(textdiskfile," GLOSS = 5.000\n");
fprintf(textdiskfile," TRANS = 0.000 0.000 0.000\n");
fprintf(textdiskfile," INDEX = 1.000\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"MATERIAL\n");
fprintf(textdiskfile," TYPE = REDGLASS\n");
fprintf(textdiskfile," TEXTURE = SMOOTH\n");
fprintf(textdiskfile," AMBRFL = 0.050 0.050 0.050\n");
fprintf(textdiskfile," DIFRFL = 0.050 0.050 0.050\n");
fprintf(textdiskfile," SPCRFL = 0.300 0.200 0.200\n");
fprintf(textdiskfile," GLOSS = 70.000\n");
fprintf(textdiskfile," TRANS = 0.900 0.800 0.800\n");
fprintf(textdiskfile," INDEX = 1.510\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"GROUND\n");
fprintf(textdiskfile," MATL = OAKWOOD\n");
}

void make()
{
writestudio();
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"{ end wall }\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"PARALLELOGRAM\n");
fprintf(textdiskfile," LOC = -300.000 300.000 0.000\n");
fprintf(textdiskfile," V1 = 600.000 0.000 0.000\n");
fprintf(textdiskfile," V2 = 0.000 0.000 400.000\n");
fprintf(textdiskfile," MATL = MATTEWALL\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"{ left wall }\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"PARALLELOGRAM\n");
fprintf(textdiskfile," LOC = -300.000 -300.000 0.000\n");
fprintf(textdiskfile," V1 = 0.000 600.000 0.000\n");
fprintf(textdiskfile," V2 = 0.000 0.000 400.000\n");
fprintf(textdiskfile," MATL = MATTEWALL\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"{ right wall }\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"PARALLELOGRAM\n");
fprintf(textdiskfile," LOC = 300.000 300.000 0.000\n");
fprintf(textdiskfile," V1 = 0.000 -600.000 0.000\n");
fprintf(textdiskfile," V2 = 0.000 0.000 400.000\n");
fprintf(textdiskfile," MATL = MATTEWALL\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"{ ceiling }\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"PARALLELOGRAM\n");
fprintf(textdiskfile," LOC = -300.000 300.000 400.000\n");
fprintf(textdiskfile," V1 = 600.000 0.000 0.000\n");
fprintf(textdiskfile," V2 = 0.000 -600.000 0.000\n");
fprintf(textdiskfile," MATL = MATTEWALL\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"{ back wall }\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"PARALLELOGRAM\n");
fprintf(textdiskfile," LOC = 300.000 -300.000 400.000\n");
fprintf(textdiskfile," V1 = -600.000 0.000 0.000\n");
fprintf(textdiskfile," V2 = 0.000 600.000 0.000\n");
fprintf(textdiskfile," MATL = MATTEWALL\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"{ table }\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"BOX\n");
fprintf(textdiskfile," LOC = -150.000 -100.000 80.000\n");
fprintf(textdiskfile," V1 = 300.000 0.000 0.000\n");
fprintf(textdiskfile," V2 = 0.000 200.000 0.000\n");
fprintf(textdiskfile," V3 = 0.000 0.000 20.000\n");
fprintf(textdiskfile," MATL = ITALIANMARBLE\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"{ table stand }\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"BOX\n");
fprintf(textdiskfile," LOC = -125.000 -75.000 0.000\n");
fprintf(textdiskfile," V1 = 250.000 0.000 0.000\n");
fprintf(textdiskfile," V2 = 0.000 150.000 0.000\n");
fprintf(textdiskfile," V3 = 0.000 0.000 80.000\n");
fprintf(textdiskfile," MATL = ITALIANMARBLE\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"{ brass orb on table }\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"SPHERE\n");
fprintf(textdiskfile," LOC = -120.000 70.000 130.000\n");
fprintf(textdiskfile," RADIUS = 30.000\n");
fprintf(textdiskfile," MATL = BRASS\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"{ glass orb and base on table }\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"CYLINDER\n");
fprintf(textdiskfile," BASELOC = -115.000 -65.000 100.000\n");
fprintf(textdiskfile," BASERAD = 15.000\n");
fprintf(textdiskfile," APEXLOC = -115.000 -65.000 125.000\n");
fprintf(textdiskfile," MATL = CHROME\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"CIRCLE\n");
fprintf(textdiskfile," LOC = -115.000 -65.000 125.000\n");
fprintf(textdiskfile," V1 = 1.000 0.000 0.000\n");
fprintf(textdiskfile," V2 = 0.000 1.000 0.000\n");
fprintf(textdiskfile," RADIUS = 15.000\n");
fprintf(textdiskfile," MATL = BLACKFELT\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"SPHERE\n");
fprintf(textdiskfile," LOC = -115.000 -65.000 160.000\n");
fprintf(textdiskfile," RADIUS = 35.000\n");
fprintf(textdiskfile," MATL = REDGLASS\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"{ wooden pyramid on table }\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"PYRAMID\n");
fprintf(textdiskfile," LOC = 100.000 50.000 100.000\n");
fprintf(textdiskfile," V1 = 45.000 0.000 0.000\n");
fprintf(textdiskfile," V2 = 0.000 45.000 0.000\n");
fprintf(textdiskfile," HEIGHT = 135.000\n");
fprintf(textdiskfile," MATL = OAKWOOD\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"{ chrome box on table }\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"BOX\n");
fprintf(textdiskfile," LOC = 70.000 -70.000 100.000\n");
fprintf(textdiskfile," V1 = 70.000 0.000 0.000\n");
fprintf(textdiskfile," V2 = 0.000 40.000 0.000\n");
fprintf(textdiskfile," V3 = 0.000 0.000 40.000\n");
fprintf(textdiskfile," MATL = CHROME\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"{ mirror on wall }\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"PARALLELOGRAM\n");
fprintf(textdiskfile," LOC = -150.000 280.000 130.000\n");
fprintf(textdiskfile," V1 = 300.000 0.000 0.000\n");
fprintf(textdiskfile," V2 = 0.000 0.000 150.000\n");
fprintf(textdiskfile," MATL = MIRROR\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"{ lamps on ceiling }\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMP\n");
fprintf(textdiskfile," LOC = -100.000 -65.000 395.000\n");
fprintf(textdiskfile," RADIUS = 25.000\n");
fprintf(textdiskfile," INTENS = 0.600 0.600 0.550\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"LAMP\n");
fprintf(textdiskfile," LOC = 100.000 -65.000 395.000\n");
fprintf(textdiskfile," RADIUS = 25.000\n");
fprintf(textdiskfile," INTENS = 0.600 0.600 0.550\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"\n");
fprintf(textdiskfile,"ENDFRAME\n");
}

void main()
{
strcpy(filename,"DESK.RT");
clrscr();
printf("Generating %s File\n",filename);
printf("\n");
printf("By Christopher D. Watkins\n");
printf("\n");
printf("\n");
printf("Writing %d frames\n",numberofframes);
textdiskfile=fopen(filename, "wt");
writeheader();
make();
fclose(textdiskfile);
}

--
������վ [���ݴ�ѧͥ��ԷBBS bbs.fzu.edu.cn] �� FROM [210.34.53.223]

����

Copyright © 2001 SJTUBBS, All Rights Reserved.

��Ȩ�����Ϻ�����BBS��ˮ˼Դվ


发信人: alancao (alan), 信区: C
标 题: C常用算法（一）：ABAND
发信站: 饮水思源站 (Fri Mar 19 13:12:56 1999) , 站内信件

#include "math.h"
#include "stdio.h"
int aband(b,d,n,l,il,m)
int n,l,il,m;
double b[],d[];
{ int ls,k,i,j,is,u,v;
double p,t;
if (il!=(2*l+1))
{ printf("fail\n"); return(-2);}
ls=l;
for (k=0;k<=n-2;k++)
{ p=0.0;
for (i=k;i<=ls;i++)
{ t=fabs(b[i*il]);
if (t>p) {p=t; is=i;}
}
if (p+1.0==1.0)
{ printf("fail\n"); return(0);}
for (j=0;j<=m-1;j++)
{ u=k*m+j; v=is*m+j;
t=d[u]; d[u]=d[v]; d[v]=t;
}
for (j=0;j<=il-1;j++)
{ u=k*il+j; v=is*il+j;
t=b[u]; b[u]=b[v]; b[v]=t;
}
for (j=0;j<=m-1;j++)
{ u=k*m+j; d[u]=d[u]/b[k*il];}
for (j=1;j<=il-1;j++)
{ u=k*il+j; b[u]=b[u]/b[k*il];}
for (i=k+1;i<=ls;i++)
{ t=b[i*il];
for (j=0;j<=m-1;j++)
{ u=i*m+j; v=k*m+j;
d[u]=d[u]-t*d[v];
}
for (j=1;j<=il-1;j++)
{ u=i*il+j; v=k*il+j;
b[u-1]=b[u]-t*b[v];
}
u=i*il+il-1; b[u]=0.0;
}
if (ls!=(n-1)) ls=ls+1;
}
p=b[(n-1)*il];
if (fabs(p)+1.0==1.0)
{ printf("fail\n"); return(0);}
for (j=0;j<=m-1;j++)
{ u=(n-1)*m+j; d[u]=d[u]/p;}
ls=1;
for (i=n-2;i>=0;i--)
{ for (k=0;k<=m-1;k++)
{ u=i*m+k;
for (j=1;j<=ls;j++)
{ v=i*il+j; is=(i+j)*m+k;
d[u]=d[u]-b[v]*d[is];
}
}
if (ls!=(il-1)) ls=ls+1;
}
return(2);
}

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.220]


发信人: alancao (alan), 信区: C
标 题: C常用算法（二）：ABINT
发信站: 饮水思源站 (Fri Mar 19 13:14:23 1999) , 站内信件

#include "stdlib.h"
#include "math.h"
#include "stdio.h"
int abint(a,n,b,eps,x)
int n;
double a[],b[],x[],eps;
{ int i,j,k,kk;
double *p,*r,*e,q,qq;
extern int agaus();
extern void brmul();
p=malloc(n*n*sizeof(double));
r=malloc(n*sizeof(double));
e=malloc(n*sizeof(double));
i=60;
for (k=0; k<=n-1; k++)
for (j=0; j<=n-1; j++)
p[k*n+j]=a[k*n+j];
for (k=0; k<=n-1; k++) x[k]=b[k];
kk=agaus(p,x,n);
if (kk==0)
{ free(p); free(r); free(e); return(kk); }
q=1.0+eps;
while (q>=eps)
{ if (i==0)
{ free(p); free(r); free(e); return(i); }
i=i-1;
brmul(a,x,n,n,1,e);
for ( k=0; k<=n-1; k++) r[k]=b[k]-e[k];
for ( k=0; k<=n-1; k++)
for ( j=0; j<=n-1; j++)
p[k*n+j]=a[k*n+j];
kk=agaus(p,r,n);
if (kk==0)
{ free(p); free(r); free(e); return(kk); }
q=0.0;
for ( k=0; k<=n-1; k++)
{ qq=fabs(r[k])/(1.0+fabs(x[k]+r[k]));
if (qq>q) q=qq;
}
for ( k=0; k<=n-1; k++) x[k]=x[k]+r[k];
}
free(p); free(r); free(e); return(1);
}

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.220]


发信人: alancao (alan), 信区: C
标 题: C常用算法（三）：ACGAS
发信站: 饮水思源站 (Fri Mar 19 13:18:31 1999) , 站内信件

#include "stdlib.h"
#include "stdio.h"
int acgas(ar,ai,n,br,bi)
int n;
double ar[],ai[],br[],bi[];
{ int *js,l,k,i,j,is,u,v;
double p,q,s,d;
js=malloc(n*sizeof(int));
for (k=0;k<=n-2;k++)
{ d=0.0;
for (i=k;i<=n-1;i++)
for (j=k;j<=n-1;j++)
{ u=i*n+j;
p=ar[u]*ar[u]+ai[u]*ai[u];
if (p>d) {d=p;js[k]=j;is=i;}
}
if (d+1.0==1.0)
{ free(js); printf("err**fail\n");
return(0);
}
if (is!=k)
{ for (j=k;j<=n-1;j++)
{ u=k*n+j; v=is*n+j;
p=ar[u]; ar[u]=ar[v]; ar[v]=p;
p=ai[u]; ai[u]=ai[v]; ai[v]=p;
}
p=br[k]; br[k]=br[is]; br[is]=p;
p=bi[k]; bi[k]=bi[is]; bi[is]=p;
}
if (js[k]!=k)
for (i=0;i<=n-1;i++)
{ u=i*n+k; v=i*n+js[k];
p=ar[u]; ar[u]=ar[v]; ar[v]=p;
p=ai[u]; ai[u]=ai[v]; ai[v]=p;
}
v=k*n+k;
for (j=k+1;j<=n-1;j++)
{ u=k*n+j;
p=ar[u]*ar[v]; q=-ai[u]*ai[v];
s=(ar[v]-ai[v])*(ar[u]+ai[u]);
ar[u]=(p-q)/d; ai[u]=(s-p-q)/d;
}
p=br[k]*ar[v]; q=-bi[k]*ai[v];
s=(ar[v]-ai[v])*(br[k]+bi[k]);
br[k]=(p-q)/d; bi[k]=(s-p-q)/d;
for (i=k+1;i<=n-1;i++)
{ u=i*n+k;
for (j=k+1;j<=n-1;j++)
{ v=k*n+j; l=i*n+j;
p=ar[u]*ar[v]; q=ai[u]*ai[v];
s=(ar[u]+ai[u])*(ar[v]+ai[v]);
ar[l]=ar[l]-p+q;
ai[l]=ai[l]-s+p+q;
}
p=ar[u]*br[k]; q=ai[u]*bi[k];
s=(ar[u]+ai[u])*(br[k]+bi[k]);
br[i]=br[i]-p+q; bi[i]=bi[i]-s+p+q;
}
}
u=(n-1)*n+n-1;
d=ar[u]*ar[u]+ai[u]*ai[u];
if (d+1.0==1.0)
{ free(js); printf("err**fail\n");
return(0);
}
p=ar[u]*br[n-1]; q=-ai[u]*bi[n-1];
s=(ar[u]-ai[u])*(br[n-1]+bi[n-1]);
br[n-1]=(p-q)/d; bi[n-1]=(s-p-q)/d;
for (i=n-2;i>=0;i--)
for (j=i+1;j<=n-1;j++)
{ u=i*n+j;
p=ar[u]*br[j]; q=ai[u]*bi[j];
s=(ar[u]+ai[u])*(br[j]+bi[j]);
br[i]=br[i]-p+q;
bi[i]=bi[i]-s+p+q;
}
js[n-1]=n-1;
for (k=n-1;k>=0;k--)
if (js[k]!=k)
{ p=br[k]; br[k]=br[js[k]]; br[js[k]]=p;
p=bi[k]; bi[k]=bi[js[k]]; bi[js[k]]=p;
}
free(js);
return(1);
}

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.220]


发信人: artin (artin), 信区: C
标 题: 计算对称阵谱分解式（源程序1�
发信站: 饮水思源站 (Tue Aug 24 09:27:04 1999) , 站内信件
//这是对称阵谱分解的头文件,文件名是dsb.h
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define N 30 //待分解阵的最大阶数是30阶
int COUNT; //迭代次数
double Rresult[N][N]; //存放特征向量
int read_mat(char *st,double a[][N]) //读矩阵,返回阶数
{ int i,j,m;
FILE *fp;
if((fp=fopen(st,"r"))==NULL)
{ printf("can not open file!\n");
exit(1);
}
fscanf(fp,"%d",&m); //第一行为矩阵阶数
for(i=0;i<m;i++)
for(j=0;j<m;j++)
fscanf(fp,"%lf",&a[i][j]);
return m;
}
void prmat(double a[][N],int m) //输出m阶矩阵
{ int i,j;
printf("\n");
for(i=0;i<m;i++)
{ for(j=0;j<m;j++)
printf("%8.3lf",a[i][j]);
printf("\n");
}
}
void get_R(int m,double a[][N],double R[][N]) //获取旋转阵R
{ int i,j,max_i,max_j;
double fmax=0,sum=0;
for(i=0;i<m;i++) //记录主对角元平方和
sum+=a[i][i]*a[i][i];
for(i=0;i<m;i++) //选出非主对角元中绝对值的最大元素
for(j=i+1;j<m;j++)
{ if(j==m) break;
if(fabsl(a[i][j])>fabsl(fmax))
{ fmax=a[i][j];
max_i=i;
max_j=j;
}
}
//最大元足够小或迭代超过1000次则退出
if(fabsl(fmax)<1E-4||COUNT>1000)
{ printf("特征值\n");
prmat(a,m); //特征值矩阵
printf("对应的特征向量\n");
prmat(Rresult,m); //特征向量矩阵
exit(0);
}
//计算旋转角度alfa
double alfa;
if(fabs(a[max_j][max_j]-a[max_i][max_i])<1e-6)
alfa=3.14159265358979/4.0;
else
alfa=0.5*atan(2*fmax/(a[max_j][max_j]-a[max_i][max_i]));
//设置旋转阵R
for(i=0;i<m;i++)
{ for(j=0;j<m;j++)
R[i][j]=0;
R[i][i]=1;
}
R[max_i][max_i]=R[max_j][max_j]=cos(alfa);
R[max_i][max_j]=sin(alfa);
R[max_j][max_i]=-sin(alfa);
}
//m阶矩阵x,y的成绩放入result中
void mmult(int m,double x[][N],double y[][N],double result[][N])
{ int i,j,k;
double sum;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
{ sum=0;
for(k=0;k<m;k++)
sum+=x[i][k]*y[k][j];
result[i][j]=sum;
//printf("%3f\t",sum);
}
}
//转置
void transpose(int m,double R[][N])
{ int i,j;
double temp;
for(i=0;i<m;i++)
for(j=i+1;j<m;j++)
{ if(j==m) continue;
temp=R[i][j];
R[i][j]=R[j][i];
R[j][i]=temp;
}
}

--
※ 修改:·artin 於 Aug 24 16:17:38 修改本文·[FROM: 202.121.209.11]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.121.209.11]


发信人: artin (artin), 信区: C
标 题: 计算对称阵谱分解式（源程序2）
发信站: 饮水思源站 (Tue Aug 24 09:28:26 1999) , 站内信件
上学起我在做一个主成分分析时自己编了一个求谱分解的程序,现在贡献出来,
希望能被各位同好在需要的时候用上,当让,如果你用SPSS或SAS软件,也可以得到谱分解式.
以下为源程序:

//1999年6月12-13日完成,实现对称阵的谱分解,
//输出结果中的第一个矩阵是待分解阵,第二个矩阵是对角阵,对角元是求得的特征值.
//第三个矩阵是相应与第二个矩阵中各特征值的特征向量有了它,谱分解式就出来了.
#include "dsb.h" //头文件
void main()
{ int i,j,k=1,m; //m记录矩阵的阶数
double sum=0;
char filename[20];
//存放带分解阵的文件名,文件第一个元素是矩阵阶数
static double A[N][N],R[N][N],temp[N][N];
printf("\nInput filename: ");
scanf("%s",filename);
printf("\n");
m=read_mat(filename,A); //读入矩阵
prmat(A,m); // 输出第一个矩阵
for(i=0;i<m;i++) //设置单位阵,接受迭代的特征向量矩阵
Rresult[i][i]=temp[i][i]=1;
while(1)
{get_R(m,A,R); //获取旋转矩阵R
mmult(m,Rresult,R,temp); //Rresult 与R的积保存在temp阵中
for(i=0;i<m;i++) //将temp阵的值付给Rresult阵
for(j=0;j<m;j++)
Rresult[i][j]=temp[i][j];
mmult(m,A,R,temp); //对A进行旋转(右乘A)
transpose(m,R); //转置R阵
mmult(m,R,temp,A); //对A进行旋转(左乘A)
COUNT++; // 记录迭代次数
// prmat(A,m);
// sum=0;
/* for(i=0;i<m;i++)
sum+=A[i][i]*A[i][i];
printf("%f\n",sum/1e6);
prmat(A,m); */

};
}

--
※ 修改:·artin 於 Aug 24 16:16:59 修改本文·[FROM: 202.121.209.11]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.121.209.11]


发信人: morass (morass), 信区: C
标 题: 冒泡
发信站: 饮水思源站 (Thu Nov 16 18:40:49 2000), 站内信件
下面是我知道关于简单算法冒泡排序的三种写法
我比较了以下，欢迎大家进一步讨论
主要是比较了循环比较的次数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{

int array[10] = {9, 0, 1, 2, 3, 4, 5, 6, 7, 8};
int i, j, hold, count1 = 0, count2 = 0, change = 1;
printf("Before sorted:");
for(i = 0; i < 10; i++)
printf("%4d", array[i]);
printf("\n");
/* 每次交换都发生在固定的定点和变动的末点，中间可能不相邻 */
/* 这种算法不是最优的,其不能判断出一个数组是否已经是递增的，所以每次的循环比
较次数是一致的*/

for(i = 0; i < 9; i++)
{
for(j = i+1; j < 10; j++)
{
count1++;
if(array[i] > array[j])
{
count2++;
hold = array[i];
array[i] = array[j];
array[j] = hold;
}
}
}
/* 比较的是两个相邻的量，即可以判断是否数组已经是递增的*/
/* 但是，这种算法比较次数比上一种算法多，已经冒泡的数也参与比较 */
/* 不过我们可以优化来实现最优算法 */
/* for(i = 0; i < 9; i++)
for(j = 0; j < 9; j++)
{
count1++;
if(array[j] > array[j+1])
{
count2++;
hold = array[j];
array[j] = array[j+1];
array[j+1] = hold;
}
}
*/
/* 比较的是两个相邻的量，可以判断一个数组是否已经递增 */
/* 每一轮循环后，冒泡的数不在参与循环 */
/*
for(i = 9, change = 1; i > 0 && change; --i)
{
change = 0;
for(j = 0; j < i; ++j)
{
count1++;
if(array[j]>array[j+1])
{
count2++;
hold = array[j];
array[j] = array[j+1];
array[j+1] = hold;
change=1;
}
}
}
*/
printf("Compare %d times\nReplacement %d times\n", count1, count2);
printf("After sorted:");
for(i = 0; i < 10; i++)
printf("%4d", array[i]);
printf("\n");
return 1;
}

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 203.95.7.153]


Delphi

饮水思源站 Delphi 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | SMTP/POP3 Delphi范例 mudfish | 17185 | 01/03/26 18:11


C 语言讨论

饮水思源站 C 语言讨论 精华区离线浏览
类型 | 标题 | 长度 | 时间
目录 | 与硬件有关 | 2项 | 01/03/28 13:36
文件 | C 语言高手 cloudwu | 604 | 01/03/26 18:33
文件 | Re: C 语言高手 abbelf | 1716 | 01/03/26 18:33
文件 | 内嵌汉字的一种方法 airforceone | 541 | 01/03/26 18:33
文件 | Re: 内嵌汉字的一种方法 cloudwu | 1154 | 01/03/26 18:34
文件 | 让人恼火的破C和C++!!!!!!!!!!!!!!!!!!! Passer | 435 | 01/03/26 18:35
文件 | Re: 让人恼火的破C和C++!!!!!!!!!!!!!!!! hhfeng | 659 | 01/03/26 18:35
目录 | 问题讨论 | 6项 | 01/03/28 21:00
目录 | 学习 C 语言 | 16项 | 01/03/28 14:16
目录 | 请大下推荐经典C语言书籍 | 14项 | 01/03/27 18:58
文件 | Re: 关于可变长参数.. hhfeng | 568 | 01/03/27 19:15
目录 | 关于编译器的讨论 | 13项 | 01/03/27 19:20
文件 | 各种C的比较 jia | 2094 | 01/03/27 21:24
文件 | Re: 各种C的比较 magirl | 2211 | 01/03/27 21:30
文件 | C 语言的特点 jia | 1298 | 01/03/27 21:43
文件 | Re: 结构体能不能作为函数返回值？ blackwhite | 673 | 01/03/28 13:25
目录 | 《数据结构》要学多深？ | 10项 | 01/03/28 13:53
目录 | C programming faq | 22项 | 01/03/28 20:02


与硬件有关

饮水思源站 与硬件有关 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 这样控制8254行吗 mingming | 2075 | 01/03/26 18:30
文件 | 单片机C串口通信 cooliu | 2537 | 01/03/28 13:36


发信人: mingming (bonny), 信区: C
标 题: 这样控制8254行吗
发信站: 饮水思源站 (Thu Apr 23 16:03:01 1998) , 转信
各位：
小弟近日因做实验，需要毫秒级精确计时，所以使用了8254。下面是我的程序，不知可靠不？
谢谢！

#include<dos.h>
#include<bios.h>
struct BYTES
{unsigned char low,high;
};
union COUNTER
{unsigned int w;
struct BYTES b;
};
struct TIMER
{union COUNTER cnt;
long bt;
};

float count(int);
/*函数count()是计时程序,当使用参数0时表示开始计时,使用参数 1 表示计时
结束并返回以毫秒为单位的反应时间; count的参数是整型(int) , 返回值是
单精度浮点型(float)。
*/
void rest(int);
/*函数rest()是功能相当于delay()的延时程序，因采用8254计时，所以更精确。
使用的参数是以毫秒为单位的。
本程序在Turbo c++3.0上运行通过。
*/
float count(int i)
{static struct TIMER start;
static struct TIMER end;
if(i==0)
{do
{start.bt=biostime(0,0l);
outp(0x43,0xd2);
start.cnt.b.low=inp(0x40);
start.cnt.b.high=inp(0x40);
}while(start.bt!=biostime(0,0l));
}
else
if(i==1)
{do
{end.bt=biostime(0,0l);
outp(0x43,0xd2);
end.cnt.b.low=inp(0x40);
end.cnt.b.high=inp(0x40);
}while(end.bt!=biostime(0,0l));
return (float)((end.bt-start.bt)*65536l+start.cnt.w-end.cnt.w)/1193.18;
}
return 0;
}
void rest(int i)
{float deta_time;
struct TIMER start,end;
deta_time=(float)i*1193.18;
do
{start.bt=biostime(0,0l);
outp(0x43,0xd2);
start.cnt.b.low=inp(0x40);
start.cnt.b.high=inp(0x40);
}while(start.bt!=biostime(0,0l));
do
{do
{end.bt=biostime(0,0l);
outp(0x43,0xd2);
end.cnt.b.low=inp(0x40);
end.cnt.b.high=inp(0x40);
}while(end.bt!=biostime(0,0l));
}while(((end.bt-start.bt)*65536l+start.cnt.w-end.cnt.w)<deta_time);
return;
}

/*这是一个例子*/
#include<stdlib.h>
#include<iostream.h>
main(int argc,char *argv[])
{int i,j;
if(argc<2)
j=100;
else
j=atoi(argv[1]);
float t;
for(i=0;i<10;i++)
{count(0);
rest(j);
t=count(1);
cout<<t<<"\n";
}
return 0;
}
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www]


发信人: cooliu (苦瓜), 信区: C
标 题: 单片机C串口通信
发信站: 饮水思源站 (Fri Mar 10 23:13:12 2000), 转信
用C语言编写PC机串行口的通信程序一般可以通过BIOS中断调用或bioscom（int cmd,
char byte，int port),两种方法来实现。编写PC机与单片机通信程序首先要确定数据
传送格式，具体包括起始位，数据位（7位或8位），奇偶校验位（可有可无），还有停
止
位。另外通信前还需确定双方的数据传输率（即波特率），一般可有多种选择。具体通
信
过程如下：
1。初始化串行口。（int 14H，AH=0）主要是由用户自行设置串行口参数，如奇偶性，
停止止位数，波特率和数据
字长等。入口参数：AH=00H（功能调用号），AL=初始化参数代码，DX=要初始化的串行
口代代码（0：COM1；1：COM2）
程序可如下编制：
#define COM1 0
#define COM2 1
void Init_COM（int port，char code）
{
union REGS regs；
regs.x.dx=port;
regs.h.ah=0; /* 初始化串行口子功能号 */
regs.h.al=code; /* 串行口参数 */
int86(0x14,?s,?s);/* 调用INT 14 中断 */
}
初始化完毕后即可进行数据传送。
2。发送一个字符（int 14，AH=01）。入口参数如下：
AH=01 子功能调用号
AL=要发送字符的ASCII码；
DX=要发送字符的串行口代码（0：COM1；1：COM2）；
int Send_Byte(int port,char c)
{
union REGS regs;
regs.x.ah=1;
regs.x.al=c;
int86(0x14,?s,?s);
if(regs.h.ah&128) /*若返回AH最高位为1，发送出错 */
{
printf("send data error in serial port!\n");
return 1;
}
return 0;
}
3。检查串行口状态（INT 14，AH=03）
在接收数据前一般要先检查串行口的工作状态。
入口参数：
AH=03
DX=所检查的串行口的代码（0：COM1；1：COM2）
出口参数：
AH=传送线路状态代码，AL=调制解调器状态码；
int Check_Status(int port)
{
union REGS regs;
regs.x.dx=port;
regs.x.ah=3;
int86(0x14,?s.?s);
return regs.x.ax; /* 返回串行口状态代码 */
}
4。接收一个字符（INT 14，AH=02）入口参数如下：
AH=02
DX=要接收数据的串行口的代码（0：COM1；1：COM2）；
出口参数：
AL=接收到字符的ASCII码
AH=返回信息，若AH=0，表示接收成功，若AH第7位为1，则表示出错
char Receive_Data(int port)
{
union REGS regs;
while(!Check_Status(port)&0x100))
{
if(kbhit())
getch();
return 1;
}
regs.x.dx=port;
regs.h.ah=2;
int86(0x14,?s,?s);
if(regs.h.ah&128)
{
printf("receive data erroe in serial port!\n");
return 1;
}
else
return regs.h.al;
}
(TO be continued...)
--
;30;41;1m 。 饮 ;37;41;1m见 日 江30;41;1m ， 住 0m
瓜 ;30;41;1m 长
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.204.85.33]


发信人: airforceone (jack), 信区: C
标 题: 内嵌汉字的一种方法
发信站: 饮水思源站 (Fri May 8 04:08:25 1998) , 转信
我刚好去年写过一个中文阅读器，内嵌汉字用的方法是---------

不内嵌！！ 其实结果是嵌入了，但不是从写程序角度做的。

只要将字库以 二进制方式连入EXE文件尾，程序从文件尾开始
读字库就行了. (编译后的exe文件的长度很容易得到的）。

最简单的连接方式是-----用COPY 命令，别忘加/B 参数哦！

龙游沧海
其志在天

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.195.140.30]


问题讨论

饮水思源站 问题讨论 精华区离线浏览
类型 | 标题 | 长度 | 时间
目录 | 不能将数组名作为函数参数吗？ | 3项 | 01/03/27 18:54
目录 | 买书 | 4项 | 01/03/27 19:13
文件 | Re: 自学的难题（指针） wizzard | 914 | 01/03/27 19:33
目录 | 谁知道单精度浮点数的结构 | 7项 | 01/03/27 19:43
目录 | 结构体里放个函数也行吗? | 11项 | 01/03/28 14:27
文件 | Re: 高手请看进来 morass | 1187 | 01/03/28 21:00


不能将数组名作为函数参数吗？

饮水思源站 不能将数组名作为函数参数吗？ 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 求教：VC下不能将数组名作为函数参数吗？ colonel | 1415 | 01/03/27 18:54
文件 | Re: 求教：VC下不能将数组名作为函数参数 seagate | 666 | 01/03/27 18:54
文件 | Re: 求教：VC下不能将数组名作为函数参数 hhfeng | 2024 | 01/03/27 18:54


发信人: colonel (colonel), 信区: C
标 题: 求教：VC下不能将数组名作为函数参数吗？
发信站: 饮水思源站 (Fri Dec 4 20:26:35 1998) , 站内信件
我编了一矩阵程序，用动态生成的二维数组表示矩阵，
如：
double** initMatrix(int row, int col,const double** Matrixvar)
{
register i,j;
double** thisMatrix;
thisMatrix = new double* [row];
for (i = 0; i < row; i++)
thisMatrix[i] = new double [col];
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
thisMatrix[i][j] = Matrixvar[i][j];

return thisMatrix;
}

但在主程序中，为输入方便，利用二维数组初始化输入数据，
如：
double S1[30][2]={{1,-1},{1,1},{1,-1},{1,1},{1,-1},
{1,-1},{-1,1},{1,1},{-1,1},{1,1},
{1,-1},{1,1},{1,-1},{1,1},{1,-1},
{1,1},{-1,1},{1,1},{-1,1},{1,1},
{1,-1},{-1,1},{1,-1},{-1,1},{1,-1},
{1,-1},{1,1},{1,-1},{1,1},{1,-1}};

需将以上数组作为参数传进函数
用initMatrix(30, 2,（const double**）S1);
则单步调试发现进入函数体后，S1所指各内存内容均为0，
证明用数组名不能作为参数吗？

我只好在主程序中先也生成一动态二维数组s2，用循环使其与s1等值，
用s2作为参数传入，则毫无问题，但太不方便了。

是何原因？请指教！

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.11.1]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: 求教：VC下不能将数组名作为函数参数吗？
发信站: 饮水思源站 (Sat Dec 5 05:35:05 1998) , 站内信件
使用 (double **) MatrixVar， 说明 MatrixVar 中存的是 double *，而实际上 MatrixVar
中是 1，-1，... 因此用 debugger 看到的是 1,-1, ...的 (double *) 解释, 当然
不对了.

1. 要想在 C 中传递 2 维数组，必须指定列数
void main()
{
foo( ..., MatrixVar[][2], ...);
}

foo( ..., double MatrixVar[][2], ...)
{
}

2. 建议改为 double *, 而不是 double **。 实际上 C 总是传一个地址过去，
具体怎么解释，就看你的 type 了.

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: epipc2.tamu.edu]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: 求教：VC下不能将数组名作为函数参数吗？
发信站: 饮水思源站 (Sun Dec 6 11:17:17 1998) , 站内信件
double ** 和 double[][] 是不一样的。虽然double[] 可以赋给 double*
但是 double[][] 不能赋给 double**, 但是可以赋给double *.

double a[3][4];
直接引用 a, 实际上和 a[0] 一样，是数组的起始地址。

【 在 colonel (colonel) 的大作中提到: 】
: 我编了一矩阵程序，用动态生成的二维数组表示矩阵，
: 如：
: double** initMatrix(int row, int col,const double** Matrixvar)

解决的方案一：(对于列数不定的情况)
double *initMatrix(int row, int col,const double *Matrixvar)

预先定义一个宏:
#define GetMatrixCell(var,i,j,col) ((var)[(i)*(col)+(j)])
然后 Matrixvar[i][j] 变成 GetMaxtrixCell(Matrixvar,i,j,col)

: {
: register i,j;
: double** thisMatrix;
: thisMatrix = new double* [row];
: for (i = 0; i < row; i++)
: thisMatrix[i] = new double [col];
: for (i = 0; i < row; i++)
: for (j = 0; j < col; j++)
: thisMatrix[i][j] = Matrixvar[i][j];
: return thisMatrix;
: }
: 但在主程序中，为输入方便，利用二维数组初始化输入数据，
: 如：
: double S1[30][2]={{1,-1},{1,1},{1,-1},{1,1},{1,-1},
: {1,-1},{-1,1},{1,1},{-1,1},{1,1},
: {1,-1},{1,1},{1,-1},{1,1},{1,-1},
: {1,1},{-1,1},{1,1},{-1,1},{1,1},
: {1,-1},{-1,1},{1,-1},{-1,1},{1,-1},
: {1,-1},{1,1},{1,-1},{1,1},{1,-1}};
: 需将以上数组作为参数传进函数
: 用initMatrix(30, 2,（const double**）S1);
: 则单步调试发现进入函数体后，S1所指各内存内容均为0，
: 证明用数组名不能作为参数吗？
: 我只好在主程序中先也生成一动态二维数组s2，用循环使其与s1等值，
: 用s2作为参数传入，则毫无问题，但太不方便了。
: 是何原因？请指教！

--
※ 修改:·hhfeng 於 Dec 6 11:18:00 修改本文·[FROM: 202.120.16.15]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


买书

饮水思源站 买书 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | to tongxu and other big shrimps kai | 385 | 01/03/27 19:13
文件 | Re: to tongxu and other big shrimps tonyxu | 748 | 01/03/27 19:13
文件 | Re: to tongxu and other big shrimps seagate | 847 | 01/03/27 19:13
文件 | Re: to tongxu and other big shrimps tonyxu | 1344 | 01/03/27 19:13


发信人: kai (刘心), 信区: C
标 题: to tongxu and other big shrimps
发信站: 饮水思源站 (Sat Dec 12 14:26:29 1998) , 站内信件
I thank you very much to recommend books to me.
but where to get it?
internet or bookstore any available place?
thanx again.!!
--

是缪斯就注定要流浪,只有法利塞人才能平安一生.

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.119.21.251]


发信人: tonyxu (无斋主人), 信区: C
标 题: Re: to tongxu and other big shrimps
发信站: 饮水思源站 (Sun Dec 13 01:45:26 1998) , 站内信件
我不知道你是想个人保存还是公司买。公司买可以从Amazon直接买
从我主页上Link过去就行了。个人买，我觉得还是太贵了一点，
这两本书花了我80美刀。
Internet上的电子书籍我没见过，不过你可以到外文书店专门卖
盗版书的地方去碰碰运气。或到科技书店试试。我没见过这两
本书中译本，不过象这种技术书籍最好还是读原版的。

【 在 kai (刘心) 的大作中提到: 】
: I thank you very much to recommend books to me.
: but where to get it?
: internet or bookstore any available place?
: thanx again.!!

--
-----
宠辱不惊，闲看庭前花开花落
去留无意，漫随天外云卷云舒

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 125-ppp-a.tnt04]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: to tongxu and other big shrimps
发信站: 饮水思源站 (Sun Dec 13 05:05:38 1998) , 站内信件
【 在 tonyxu (无斋主人) 的大作中提到: 】
: 我不知道你是想个人保存还是公司买。公司买可以从Amazon直接买
: 从我主页上Link过去就行了。个人买，我觉得还是太贵了一点，
: 这两本书花了我80美刀。
tongxu 买书倒是该出手时就出手啊，哈哈，钱不少嘛

: Internet上的电子书籍我没见过，不过你可以到外文书店专门卖
: 盗版书的地方去碰碰运气。或到科技书店试试。我没见过这两
: 本书中译本，不过象这种技术书籍最好还是读原版的。

Undocumented Dos 和 Undocumented Windows 译的就不错

1. 美国的书也贵的有点出奇
2. 这种 C 语言的东西值得化那么多钱去买吗 ？ 老潭的书看一看，
然后上机动手，这就行了。毕竟就是一种语言嘛Ｒ谑导醒В�
同志们说对吗？�

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: eesun3.tamu.edu]


发信人: tonyxu (无斋主人), 信区: C
标 题: Re: to tongxu and other big shrimps
发信站: 饮水思源站 (Sun Dec 13 13:36:39 1998) , 站内信件
【 在 seagate (风雪夜归人) 的大作中提到: 】
: tongxu 买书倒是该出手时就出手啊，哈哈，钱不少嘛
倒不是钱多，实在是有买书和藏书的嗜好。在国内时，每月
都要花几百块钱在书上。到了米国，由于书太贵了，已经
节制不少了，但有时看到好书还是压抑不住冲动。前前后后
一年时间也花了将近500刀了。我一般让公司先买一本，如果
觉得好，自己再买一本放在家里。睡觉前翻翻，已经是十多
年的习惯了，睡前不看半小时书，一晚就会失眠。

: Undocumented Dos 和 Undocumented Windows 译的就不错
: 1. 美国的书也贵的有点出奇
: 2. 这种 C 语言的东西值得化那么多钱去买吗 ？ 老潭的书看一看，
: 然后上机动手，这就行了。毕竟就是一种语言嘛Ｒ谑导醒В�
: 同志们说对吗？�
此言有理，我看过的第一本C是教科书，尤老师写的《C语言简明教程》
而后是边干项目，边学。到写了几万行代码后才读到K&R的C。
不过如果你只准备在C方面买一本书，我还是建议买K&R版的。
我买K&R倒不是为了学C，而是在你有一定入门之后，再回头
读读一些最基本的概念，体会一下大师当年设计C的思想，的确
是感受到了一种艺术性，回味无穷。所以我说这是一本有
终身保存价值的书。虽然K&R的C七几年就出了第一版，但
直到现在还畅销，我本人也没见过超越K&R的C的有关C的书。

--
-----
宠辱不惊，闲看庭前花开花落
去留无意，漫随天外云卷云舒

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 17-ppp-a.tnt04.]


发信人: wizzard (新巫师), 信区: C
标 题: Re: 自学的难题（指针）
发信站: 饮水思源站 (Sun Dec 20 16:35:43 1998) , 转信
【 在 hugua (天才) 的大作中提到: 】
: 本人在学习c语言时，难以理解指针的概念，请各位高手加以指点

指针就是地址吗，也就是门牌号码，

TYPE *tp;
TYPE t;

tp = &t;

你看，tp这个指针就是内存中某一个TYPE类型的单元的地址
|-----------|
| T Y P E | <-- tp
|-----------|

执行了tp = &t;之后，tp 就是 t的内存地址了
|-----------|
| t | <-- tp
|-----------|

那么tp 自己在哪儿呢？其实tp也是一个内存单元，他的值就是
t 的地址
|-----------| |----------|
| t | <-- | tp |
|-----------| |----------|

当然，tp也有地址了，

TYPE **tpp;
tpp = &tp;

tpp就是tp的地址，它就是二重指针，可以这么看

(TYPE *) *tpp;

现在明白了吧！

至于数组，你把数组名看作一个不能修改值的指针就可以了，
也就是说，它是一个常量

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.32.132.223]


谁知道单精度浮点数的结构

饮水思源站 谁知道单精度浮点数的结构 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | float double 格式 cudo | 658 | 01/03/27 19:42
文件 | 谁知道单精度浮点数的结构哪里可查 (转载 txj | 386 | 01/03/27 19:43
文件 | Re: 谁知道单精度浮点数的结构哪里可查 ( hhfeng | 400 | 01/03/27 19:43
文件 | Re: 谁知道单精度浮点数的结构哪里可查 ( txj | 392 | 01/03/27 19:43
文件 | Re: 谁知道单精度浮点数的结构哪里可查 ( hhfeng | 763 | 01/03/27 19:43
文件 | Re: 谁知道单精度浮点数的结构哪里可查 ( txj | 845 | 01/03/27 19:43
文件 | Re: 谁知道单精度浮点数的结构哪里可查 ( hhfeng | 1659 | 01/03/27 19:43


发信人: cudo (amulet), 信区: C
标 题: float double 格式
发信站: 饮水思源站 (Mon Sep 21 11:24:57 1998) , 站内信件
【 在 Cyclone (小旋风) 的大作中提到: 】
: 在C中，float和double型数据是如何存放的？
: 就是在内存中的具体存放格式，及如何换算回十进制的？
: 还有float型数据转换成double型数据是如何转换的？
: double型数据转换成float型数据又是如何转换的？

float占了4字节，首位是符号位，然后有若干位精度和若干位指数。
double占8字节。
不知道你要知道这么具体干什么啊？如果是类型转换的话，C里面有
现成的函数的。而且如果在不同类型间赋值的话会自动转换的。

--
纵使长条似旧垂，也应攀折他人手。

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 166.111.64.166]


发信人: txj (flighter), 信区: C
标 题: 谁知道单精度浮点数的结构哪里可查 (转载)
发信站: 饮水思源站 (Mon Dec 21 16:58:30 1998) , 转信
【 以下文字转载自 CS 讨论区 】
【 原文由 txj 所发表 】
是IEEE754标准
--
※ 修改:·txj 於 Dec 21 16:54:09 修改本文·[FROM: 202.120.16.35]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.35]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: 谁知道单精度浮点数的结构哪里可查 (转载)
发信站: 饮水思源站 (Mon Dec 21 17:13:29 1998) , 站内信件
【 在 txj (flighter) 的大作中提到: 】
: 【 以下文字转载自 CS 讨论区 】
: 【 原文由 txj 所发表 】
: 是IEEE754标准

查 linux 的头文件可以知道一点。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: txj (flighter), 信区: C
标 题: Re: 谁知道单精度浮点数的结构哪里可查 (转载)
发信站: 饮水思源站 (Mon Dec 21 18:52:38 1998) , 转信
【 在 hhfeng (快乐的眼睛) 的大作中提到: 】
: 查 linux 的头文件可以知道一点。

我需要详细的说明文档�

--
※ 修改:·txj 於 Dec 21 19:04:06 修改本文·[FROM: 202.120.16.35]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.35]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: 谁知道单精度浮点数的结构哪里可查 (转载)
发信站: 饮水思源站 (Tue Dec 22 15:01:53 1998) , 站内信件
【 在 txj (flighter) 的大作中提到: 】
: 我需要详细的说明文档�

/usr/linux/ieeefp.h
union i387_float
{
float f;

/* This is the i387 single-precision format. */
struct
{
unsigned int mantissa:23;
unsigned int exponent:8;
unsigned int negative:1;
} i387;
/* This is for extracting information about NaNs. */
struct
{
unsigned int mantissa:22;
unsigned int quiet_nan:1;
unsigned int exponent:8;
unsigned int negative:1;
} i387_nan;
};

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: txj (flighter), 信区: C
标 题: Re: 谁知道单精度浮点数的结构哪里可查 (转载)
发信站: 饮水思源站 (Tue Dec 22 15:53:47 1998) , 转信
【 在 hhfeng (快乐的眼睛) 的大作中提到: 】
: /usr/linux/ieeefp.h
: union i387_float
: {
: float f;
: /* This is the i387 single-precision format. */
: struct
: {
: unsigned int mantissa:23;
: unsigned int exponent:8;
: unsigned int negative:1;
: } i387;
: /* This is for extracting information about NaNs. */
: struct
: {
: unsigned int mantissa:22;
: unsigned int quiet_nan:1;
: unsigned int exponent:8;
: unsigned int negative:1;
: } i387_nan;
: };

谢谢hhfeng，可是我需要这个结构与它表示的数的转换关系，
不知哪里有查的。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.35]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: 谁知道单精度浮点数的结构哪里可查 (转载)
发信站: 饮水思源站 (Tue Dec 22 22:02:23 1998) , 站内信件
【 在 txj (flighter) 的大作中提到: 】
: 【 在 hhfeng (快乐的眼睛) 的大作中提到: 】
: : /usr/linux/ieeefp.h
: : union i387_float
: : {
: : float f;
: : /* This is the i387 single-precision format. */
: : struct
: : {
: : unsigned int mantissa:23;
: : unsigned int exponent:8;
: : unsigned int negative:1;
: : } i387;
: : /* This is for extracting information about NaNs. */
: : struct
: : {
: : unsigned int mantissa:22;
: : unsigned int quiet_nan:1;
: : unsigned int exponent:8;
: : unsigned int negative:1;
: : } i387_nan;
: : };
:
: 谢谢hhfeng，可是我需要这个结构与它表示的数的转换关系，
: 不知哪里有查的。
:

这是linux/gcc的include文件；只要定义（我没试国）

union i387_float d;

d.f = a_float_num;

printf( "mantissa:%d, exponent:%d, negative:%d\n"
d.i387.mantissa, d.i387.exponent, d.i387.negative );

就可以打出对应的值。不过我不知道不同的编译器处理位元是否相同，
可能会和编译器有关。有了这个结构，在做点实验，我觉得就能弄清楚了。

这有两个结构，应该知道，尾数是：1.无符号的, 2.高位为1。
而阶码是有符号的补码，整个数的符号单独存放。另外一个结构可以
测试这个浮点数是否尾数高位为1（从这里我们知道这个编译器是把
位元从低位开始填写）。如果不是1, 那么它就是一个NaN（Not a Number）
如果BC++3.1调试过程序，应该经常发现非法的浮点数是+NaN或-NaN.

--
※ 修改:·hhfeng 於 Dec 22 22:04:11 修改本文·[FROM: 202.120.16.15]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


结构体里放个函数也行吗?

饮水思源站 结构体里放个函数也行吗? 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 结构体里放个函数也行吗? laichaoan | 343 | 01/03/28 14:27
文件 | Re: 结构体里放个函数也行吗? goalfirst | 531 | 01/03/28 14:27
文件 | Re: 结构体里放个函数也行吗? desen | 550 | 01/03/28 14:27
文件 | Re: 结构体里放个函数也行吗? ConeZXY | 794 | 01/03/28 14:27
文件 | Re: 结构体里放个函数也行吗? ini | 758 | 01/03/28 14:27
文件 | Re: 结构体里放个函数也行吗? howe | 477 | 01/03/28 14:27
文件 | Re: 结构体里放个函数也行吗? xiongzj | 437 | 01/03/28 14:27
文件 | Re: 结构体里放个函数也行吗? JohnForever | 677 | 01/03/28 14:27
文件 | Re: 结构体里放个函数也行吗? truelance | 734 | 01/03/28 14:27
文件 | Re: 结构体里放个函数也行吗? DarkSpy | 799 | 01/03/28 14:27
文件 | 关于结构体 luckyfang | 495 | 01/03/28 14:27


发信人: laichaoan (长安), 信区: C
标 题: 结构体里放个函数也行吗?
发信站: 饮水思源站 (Sat Apr 15 10:25:05 2000), 转信
我看见有个例子:
struct A
{
struct B;
struct C;
void XX();
}
这样也行吗？这个XX是不是这样用的? ： A .XX（）
还是直接用XX（）？
请指教，谢谢！！

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.38.203.33]


发信人: goalfirst (射手), 信区: C
标 题: Re: 结构体里放个函数也行吗?
发信站: 饮水思源站 (Sat Apr 15 10:40:41 2000), 转信
是c++吧？！
那就是类了。
【 在 laichaoan (长安) 的大作中提到: 】
: 我看见有个例子:
: struct A
: {
: struct B;
: struct C;
: void XX();
: }
: 这样也行吗？这个XX是不是这样用的? ： A .XX（）
: 还是直接用XX（）？
: 请指教，谢谢！！

--
射手本不是我真名；
我的真名叫水手,不过是善于在水坑里航行的那类!

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.13.13]


发信人: desen (desen), 信区: C
标 题: Re: 结构体里放个函数也行吗?
发信站: 饮水思源站 (Sat Apr 15 13:09:33 2000), 站内信件
struct 和 class 的显著区别之一就在于
struct 不可以拥有成员函数，而 class 允许

【 在 laichaoan (长安) 的大作中提到: 】
: 我看见有个例子:
: struct A
: {
: struct B;
: struct C;
: void XX();
: }
: 这样也行吗？这个XX是不是这样用的? ： A .XX（）
: 还是直接用XX（）？
: 请指教，谢谢！！

--
Desen's Personal Web Page
http://desen.126.com

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 61.129.140.70]


发信人: ConeZXY (小鱼), 信区: C
标 题: Re: 结构体里放个函数也行吗?
发信站: 饮水思源站 (Sat Apr 15 13:15:00 2000), 转信
错
结构不但可以有成员函数
而且可以有构造函数
你可以在c++的编译器里试试看
~~~~ （c 是没有这功能的）
和class的区别在于结构不能继承，而且没有public, private之分

【 在 desen (desen) 的大作中提到: 】
: struct 和 class 的显著区别之一就在于
: struct 不可以拥有成员函数，而 class 允许
: 【 在 laichaoan (长安) 的大作中提到: 】
: : 我看见有个例子:
: : struct A
: : {
: : struct B;
: : struct C;
: : void XX();
: : }
: : 这样也行吗？这个XX是不是这样用的? ： A .XX（）
: : 还是直接用XX（）？
: : 请指教，谢谢！！

--

泉水白白流淌\
花朵为谁开放\
是这样美丽负伤的麦子\
吐着芬芳\
站在山冈上\

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.220]


发信人: ini (run), 信区: C
标 题: Re: 结构体里放个函数也行吗?
发信站: 饮水思源站 (Sat Apr 15 15:39:53 2000), 转信
结构是可以继承的,结构成员也可以有
public,private,protected,不信你可以试试.

在一般的C++编译器中,struct 和 class
的区别很小,struct的成员缺省保护类别为public,
而class为private.

Ansi C++标准是否规定struct的其它限制不得而知.

【 在 ConeZXY (小鱼) 的大作中提到: 】
: 错
: 结构不但可以有成员函数
: 而且可以有构造函数
: 你可以在c++的编译器里试试看
: ~~~~ （c 是没有这功能的）
: 和class的区别在于结构不能继承，而且没有public, private之分
: 【 在 desen (desen) 的大作中提到: 】
: : struct 和 class 的显著区别之一就在于
: : struct 不可以拥有成员函数，而 class 允许

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.240.61]


open: Permission denied
发信人: howe (无痕), 信区: C
标 题: Re: 结构体里放个函数也行吗?
发信站: 饮水思源站 (Mon Apr 17 12:41:47 2000), 站内信件
【 在 laichaoan (长安) 的大作中提到: 】
C++里结构就是类，只不过确省成员属性为公有。

: 我看见有个例子:
: struct A
: {
: struct B;
: struct C;
: void XX();
: }
: 这样也行吗？这个XX是不是这样用的? ： A .XX（）
: 还是直接用XX（）？
: 请指教，谢谢！！

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.74.240.170]


发信人: xiongzj (jj), 信区: C
标 题: Re: 结构体里放个函数也行吗?
发信站: 饮水思源站 (Thu Apr 20 16:27:27 2000), 站内信件
if u are in the C++, u can.
【 在 laichaoan (长安) 的大作中提到: 】
: 我看见有个例子:
: struct A
: {
: struct B;
: struct C;
: void XX();
: }
: 这样也行吗？这个XX是不是这样用的? ： A .XX（）
: 还是直接用XX（）？
: 请指教，谢谢！！

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.35.250.223]


发信人: JohnForever (伤心客), 信区: C
标 题: Re: 结构体里放个函数也行吗?
发信站: 饮水思源站 (Thu Jun 1 15:04:07 2000) , 转信
desen老兄此言差矣,结构与类的区别仅仅是结构中的数据和函数都是共有的

【 在 desen (desen) 的大作中提到: 】
: struct 和 class 的显著区别之一就在于
: struct 不可以拥有成员函数，而 class 允许
:
: 【 在 laichaoan (长安) 的大作中提到: 】
: : 我看见有个例子:
: : struct A
: : {
: : struct B;
: : struct C;
: : void XX();
: : }
: : 这样也行吗？这个XX是不是这样用的? ： A .XX（）
: : 还是直接用XX（）？
: : 请指教，谢谢！！
:
:

--
JOhnforever,永远的约翰
※ 来源:．饮水思源站WWW bbs.sjtu.edu.cn. [FROM: 202.120.13.103]


发信人: truelance (兰斯洛), 信区: C
标 题: Re: 结构体里放个函数也行吗?
发信站: 饮水思源站 (Thu Jun 1 17:21:12 2000), 转信
struct中也可以是私有的，只要你用private定义了。
区别是class开始确省是private,struct确省是public
其实现在的class和struct是等价的
struct是为了和以前c中的struct兼容,
而class以后可以自由发展，不影响与老程序的兼容性
【 在 JohnForever (伤心客) 的大作中提到: 】
: desen老兄此言差矣,结构与类的区别仅仅是结构中的数据和函数都是共有的
:
:
: 【 在 desen (desen) 的大作中提到: 】
: : struct 和 class 的显著区别之一就在于
: : struct 不可以拥有成员函数，而 class 允许
: :
: : 【 在 laichaoan (长安) 的大作中提到: 】
: :
: :

--
我有迷魂招不得

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.216]


发信人: DarkSpy (DarkSpy), 信区: C
标 题: Re: 结构体里放个函数也行吗?
发信站: 饮水思源站 (Thu Jun 1 22:25:23 2000), 转信
struct A == class A
{ {
XX(); XX2();
public:
private:
XX2(); XX();
}B; }B;
B.XX(); B.XX();

【 在 JohnForever (伤心客) 的大作中提到: 】
: desen老兄此言差矣,结构与类的区别仅仅是结构中的数据和函数都是共有的
:
:
: 【 在 desen (desen) 的大作中提到: 】
: : struct 和 class 的显著区别之一就在于
: : struct 不可以拥有成员函数，而 class 允许
: :
: : 【 在 laichaoan (长安) 的大作中提到: 】
: :
: :

--
Don't Worry, Be Happy.
---------------------------------------------
http://www.coneos.com | http://coneos.126.com

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 61.130.250.94]


发信人: morass (morass), 信区: C
标 题: Re: 高手请看进来
发信站: 饮水思源站 (Sun Oct 15 22:24:15 2000), 转信
我想你用这样的一种方式来进行，或许是认为
如果定义float temp[n]数组，则temp为float *指针
那么如果定义float temp[m][n]，则类似的temp为float ** 指针

然而事实上并非如此，前面是正确的，但是后面的我认为不成立
这样的代码编译时出错(有些编译器出warning)，是不能通过的
float temp[10][10];
float ** p;
p = temp;
你在bcb5.0中出的warning就是这种错误

如果你要修改，可以这样
float * p = temp[0];
mytest(&p);
这样可以达到你的目的

希望我的猜测是对的，因为我曾经犯过类似的错误，：）

【 在 xujianqun (midi) 的大作中提到: 】
: 请看下面的一段程序
: 我的用意是通过函数mytest()对传进来的指针变量进行操作
: ＃include <stdio.h>
: ＃include <conio.h>
: void mytest(float **t)
: {
: t[0][0]=100;
: }
: main()
: {
: float temp[2][2]={4,3,3,3};
: mytest(temp);
: printf("\n %f,%f",temp[0][0],temp[0][1]);
: getch();
: return;
: }
: 在bc31环境下运行，结果为：0.0000 4
: 在BCB5.0下运行时死掉，编译时 mytest(temp) 这一句有警告错误：
: suspicious pointer conversion
: 请高手指点！！！

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 203.95.7.153]


学习 C 语言

饮水思源站 学习 C 语言 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Re: 学C是否要先学汇编？ wolfking. | 1247 | 01/03/26 18:51
文件 | Re: 学C是否要先学汇编？ wsl. | 605 | 01/03/26 18:51
文件 | Re: 学C是否要先学汇编？ wsl. | 834 | 01/03/26 18:51
文件 | Re: 情教！ Christopher. | 578 | 01/03/26 18:57
文件 | Re: 情教！ metaphase | 1290 | 01/03/26 18:58
文件 | Re: 情教！ Christopher. | 770 | 01/03/26 18:58
文件 | C语言“switch语句”的使用技巧 jia | 5206 | 01/03/27 21:21
文件 | C语言教程(1) jia | 860 | 01/03/27 21:22
文件 | C语言教程(2) jia | 1087 | 01/03/27 21:22
文件 | C语言教程(3) jia | 1160 | 01/03/27 21:22
文件 | 编程中的细节--指针(fwd) jia | 3956 | 01/03/27 21:24
文件 | 基本数据类型 jia | 5320 | 01/03/28 13:17
文件 | 结构 jia | 8844 | 01/03/28 13:17
文件 | 枚举 jia | 5394 | 01/03/28 13:17
文件 | 联合 jia | 2522 | 01/03/28 13:17
文件 | 轻松学指针 huangjielei | 17219 | 01/03/28 14:16


发信人: wsl.bbs@bbs.dlut.edu.cn (BlackSpider), 信区: C
标 题: Re: 学C是否要先学汇编？
发信站: 碧海青天 (Sat Aug 15 11:04:45 1998)
转信站: sjtubbs!sjtunews!ustcnews!DUT
Origin: rose.dlut.edu.cn
【 在 hotice.bbs@bbs.sjtu.edu.cn (ff) 的大作中提到: 】
: 我学过C，但却没学好！请问各位，how can i do?

先学汇编，还是先学C，这无所谓，但两者有

相同之处，算法，结构设计等，学好一个能给另

一个产生启发的作用。但并不是说学它们当中的

一门必须先掌握另一门。C没有学好你照样能学好

汇编语言。 ------祝你成功。

--
※ 来源:．碧海青天 bbs.dlut.edu.cn．[FROM: 202.118.70.208]


发信人: wsl.bbs@bbs.dlut.edu.cn (BlackSpider), 信区: C
标 题: Re: 学C是否要先学汇编？
发信站: 碧海青天 (Sat Aug 15 11:11:26 1998)
转信站: sjtubbs!sjtunews!ustcnews!DUT
Origin: rose.dlut.edu.cn
【 在 zhyong (大鱼) 的大作中提到: 】
: 【 在 holly.bbs@bbs.sjtu.edu.cn (Holly) 的大作中提到: 】
: : ... If you have not known assembler, you cannot master C
: ---------.........
: 我也是刚学c,不知何谓assembler
: 学c是否还要掌握相当的硬件知识？
: .望见教。

这就要看你学C是干什么用的，如果你的程序或工作
方向趋向于硬件，那你最好多学一点汇编，这对你有极大
的帮助，毕竟汇编最接近硬件，更容易接受些。相反，你
就不一定要非的学好汇编不可，当然学了对你有益无害。
其实硬件也不可怕，只是要求多用多看，跟上时代罢了。

--
※ 来源:．碧海青天 bbs.dlut.edu.cn．[FROM: 202.118.70.208]


发信人: Christopher.bbs@bbs.swjtu.edu.cn (Christopher), 信区: C
标 题: Re: 情教！
发信站: 锦城驿站 (Thu Sep 3 21:17:00 1998)
转信站: sjtubbs!sjtunews!ustcnews!news.zsu!swjtunews!swjtubbs
Origin: xnjd21.swjtu.edu.cn
turbo c++,ms c++ 可以不用考虑了
剩下的我倾向 vc
但是要是刚开始的话，还是从BC入手好些
而且BC的硬件编程比VC要好些 VC太庞大了
【 在 pts (ok,yeah!) 的大作中提到: 】
: tubro c++,ms c++,borland c++,visual c++.....
: 他们有什么区别与联系，在微机上运行，最好学哪种Ｃ语言。
: 情不吝指教。

--
※ 来源:．锦城驿站 bbs.swjtu.edu.cn．[FROM: 202.115.4.77]


发信人: metaphase (flame), 信区: C
标 题: Re: 情教！
发信站: 饮水思源站 (Sat Sep 5 10:01:00 1998) , 站内信件
【 在 pts.bbs@bbs.swjtu.edu.cn (ok,yeah!) 的大作中提到: 】
: tubro c++,ms c++,borland c++,visual c++.....
: 他们有什么区别与联系，在微机上运行，最好学哪种Ｃ语言。
: 情不吝指教。
这些都源于C++，都遵循C++的基本方法，即底层
是相同的，但他们在最基础的C++上进行了许多的
开发工作，有自己不同的包容类库，可以说是比
最基本C++更高级上些的一个开发平台。

目前，最有竞争力的是Visual C++和C++ Builder，
但作为一个初学者，如果一点C++的概念都没有的
话，最好先找本基础书看看，有本Borland C++书，
它的基础部分讲得十分透彻，值得一看。您也可以
找其他的基础书看看。
其中C++ Builder界面类似VB,使用起来也类似VB，
面向对象做得很好，又简单易学，是初学者较易
接受的。但Microsoft是不会放弃自己的阵地的，
因此Visual C++前途是不可低估的。虽然目前差
上些，但相信她会迎头赶上的，最近不是Visual
Studio 98有得卖么，其中VC已是第六版了。
学一个软件不光要看她是否易学，还要看她是否
有较好的前景。因为一旦选定一个软件去学，您
就很难再去换别的重新学习了。

--
-------------------------------------------
| Every time you go away , |
| You take a piece of me with you ! |
-------------------------------------------

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.11.206]


发信人: Christopher.bbs@bbs.swjtu.edu.cn (Christopher), 信区: C
标 题: Re: 情教！
发信站: 锦城驿站 (Mon Sep 7 23:39:29 1998)
转信站: sjtubbs!sjtunews!ustcnews!news.zsu!swjtunews!swjtubbs
Origin: xnjd21.swjtu.edu.cn
【 在 acerkiller (小方) 的大作中提到: 】
: 【 在 Christopher (Christopher) 的大作中提到: 】
: : turbo c++,ms c++ 可以不用考虑了
: : 剩下的我倾向 vc
: : 但是要是刚开始的话，还是从BC入手好些
: : 而且BC的硬件编程比VC要好些 VC太庞大了
: 谁说VC硬件编程不好?请说明.

这是援引我朋友的话
当时他在DOS下进行硬件编程
用BC31比用VC要好，在我感觉，BC在这些方面也要比VC好

DOS下用C的话
BC31应该是最好选择，

--
※ 修改:．Christopher 于 Sep 7 23:39:29 修改本文．[FROM: 202.115.4.77]
※ 来源:．锦城驿站 bbs.swjtu.edu.cn．[FROM: 202.115.4.77]


请大下推荐经典C语言书籍

饮水思源站 请大下推荐经典C语言书籍 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 请大下推荐经典C语言书籍 kai | 295 | 01/03/27 18:57
文件 | Re: 请大下推荐经典C语言书籍 seagate | 398 | 01/03/27 18:57
文件 | Re: 请大下推荐经典C语言书籍 Terminator | 307 | 01/03/27 18:57
文件 | Re: 请大下推荐经典C语言书籍 BigWhite | 363 | 01/03/27 18:57
文件 | Re: 请大下推荐经典C语言书籍 ruster | 279 | 01/03/27 18:57
文件 | Re: 请大下推荐经典C语言书籍 hpl | 350 | 01/03/27 18:57
文件 | Re: 请大下推荐经典C语言书籍 seecloud | 480 | 01/03/27 18:57
文件 | Re: 请大下推荐经典C语言书籍 kai | 415 | 01/03/27 18:57
文件 | Re: 请大下推荐经典C语言书籍 kai | 391 | 01/03/27 18:57
文件 | Re: 请大下推荐经典C语言书籍 kai | 422 | 01/03/27 18:57
文件 | Re: 请大下推荐经典C语言书籍 hhfeng | 540 | 01/03/27 18:57
文件 | Re: 请大下推荐经典C语言书籍 tonyxu | 735 | 01/03/27 18:57
文件 | Re: 请大下推荐经典C语言书籍 hpl | 274 | 01/03/27 18:58
文件 | Re: 请大下推荐经典C语言书籍 hhfeng | 623 | 01/03/27 18:58


发信人: kai (刘心), 信区: C
标 题: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Mon Dec 7 20:33:43 1998) , 转信
欲进一步学习C语言(包括C++),欲购如下书籍:
对指针有详尽的描述,有实例分析,有保存价值.
最好是翻译的外文经典书籍.
在此先谢过!
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Mon Dec 7 22:43:10 1998) , 站内信件
谭浩强的就行
【 在 kai (刘心) 的大作中提到: 】
: 欲进一步学习C语言(包括C++),欲购如下书籍:
: 对指针有详尽的描述,有实例分析,有保存价值.
: 最好是翻译的外文经典书籍.
: 在此先谢过!

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: eesun3.tamu.edu]


发信人: Terminator (魔鬼终结者), 信区: C
标 题: Re: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Tue Dec 8 01:02:20 1998) , 转信
Rithe, <<The C Programming Language>>

【 在 seagate (风雪夜归人) 的大作中提到: 】
: 谭浩强的就行

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: sg.zju.edu.cn]


发信人: BigWhite (大白), 信区: C
标 题: Re: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Tue Dec 8 08:55:17 1998) , 站内信件
【 在 Terminator (魔鬼终结者) 的大作中提到: 】
: Rithe, <<The C Programming Language>>

这可是C语言的经典书籍。作者好象是(David & Richard)
^^^^

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.32.132.223]


发信人: ruster (heart), 信区: C
标 题: Re: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Tue Dec 8 10:22:06 1998) , 站内信件
谭浩强根本不懂C
【 在 seagate (风雪夜归人) 的大作中提到: 】
: 谭浩强的就行

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.199.248.3]


发信人: hpl (坏鲁), 信区: C
标 题: Re: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Tue Dec 8 13:06:47 1998) , 站内信件
我推荐 汤姆斯旺

的书.

坏鲁乐呵呵说.
书中自有颜如玉.
【 在 ruster (heart) 的大作中提到: 】
: 谭浩强根本不懂C

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.199.24.45]


发信人: seecloud (小石头), 信区: C
标 题: Re: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Tue Dec 8 14:54:02 1998) , 站内信件
先用起来再说,不用要太好的书
【 在 kai (刘心) 的大作中提到: 】
: 欲进一步学习C语言(包括C++),欲购如下书籍:
: 对指针有详尽的描述,有实例分析,有保存价值.
: 最好是翻译的外文经典书籍.
: 在此先谢过!

--

——————听风饮甘露***********看云食柏松————————

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.222]


发信人: kai (刘心), 信区: C
标 题: Re: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Wed Dec 9 11:03:39 1998) , 站内信件
【 在 seagate (风雪夜归人) 的大作中提到: 】
: 谭浩强的就行

谭的书我有，感觉有点象纸上谈兵的事情。
考虑实际情况的不多。书生气比较浓。实用性似乎不大。
个人意见。
--

是缪斯就注定要流浪,只有法利塞人才能平安一生.

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.119.21.251]


发信人: kai (刘心), 信区: C
标 题: Re: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Wed Dec 9 11:04:22 1998) , 站内信件
【 在 Terminator (魔鬼终结者) 的大作中提到: 】
: Rithe, <<The C Programming Language>>

where go get it?
or any translated version yet?

--

是缪斯就注定要流浪,只有法利塞人才能平安一生.

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.119.21.251]


发信人: kai (刘心), 信区: C
标 题: Re: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Wed Dec 9 11:05:04 1998) , 站内信件
【 在 hpl (坏鲁) 的大作中提到: 】
: 我推荐 汤姆斯旺
: 的书.
: 坏鲁乐呵呵说.
: 书中自有颜如玉.

translated version pressed yet?

--

是缪斯就注定要流浪,只有法利塞人才能平安一生.

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.119.21.251]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Wed Dec 9 11:42:22 1998) , 站内信件
【 在 kai (刘心) 的大作中提到: 】
: 谭的书我有，感觉有点象纸上谈兵的事情。
: 考虑实际情况的不多。书生气比较浓。实用性似乎不大。
: 个人意见。

如果这样 K&R的<<The C programming language>>也差不多。

如果要实用，就看你现在要学什么环境的C, 用它来干什么。

--
※ 修改:·hhfeng 於 Dec 9 11:43:29 修改本文·[FROM: 202.120.16.15]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Fri Dec 11 10:06:27 1998) , 站内信件
自然是K&R的《The C programming Language》，可称C语言的圣经。
C++则为Stroustrp的《The C++ Programming Language》。
Kernighan 和 Richie的C的发明者。而Stroustrp是C++的
发明者。这两本书都有终生保存的价值。
详细请参阅我的主页。
http://www.geocities.com/SiliconValley/Horizon/5724/index.htm
然后选网上书店。

【 在 kai (刘心) 的大作中提到: 】
: 欲进一步学习C语言(包括C++),欲购如下书籍:
: 对指针有详尽的描述,有实例分析,有保存价值.
: 最好是翻译的外文经典书籍.
: 在此先谢过!

--
-----
宠辱不惊，闲看庭前花开花落
去留无意，漫随天外云卷云舒

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 205.219.46.129]


发信人: hpl (坏鲁), 信区: C
标 题: Re: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Fri Dec 11 19:02:06 1998) , 站内信件
yea.

【 在 kai (刘心) 的大作中提到: 】
: translated version pressed yet?

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.199.24.45]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: 请大下推荐经典C语言书籍
发信站: 饮水思源站 (Sat Dec 12 23:16:59 1998) , 站内信件
【 在 tonyxu (无斋主人) 的大作中提到: 】
: 自然是K&R的《The C programming Language》，可称C语言的圣经。
: C++则为Stroustrp的《The C++ Programming Language》。
: Kernighan 和 Richie的C的发明者。而Stroustrp是C++的
: 发明者。这两本书都有终生保存的价值。
: 详细请参阅我的主页。
: http://www.geocities.com/SiliconValley/Horizon/5724/index.htm
: 然后选网上书店。

有电子版吗？如<<Operating System>>和<<Computer Network>>

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: 关于可变长参数..
发信站: 饮水思源站 (Mon Dec 14 17:19:41 1998) , 站内信件
【 在 raysusan (**) 的大作中提到: 】
: 不知哪位仁兄愿具体讲一下可变长参数的用法。多谢。

#include <stdarg.h>

....
void varfunc( int num, ... )
{
va_list marker;
va_start( marker, num );
for ( i=0; i<num; i++ )
{
foo( va_arg( marker, int ) );
}
va_end( marker);
}

....
var_func( 3, 11, 12, 13 );
var_func( 4, 14, 15, 16, 17 );

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


关于编译器的讨论

饮水思源站 关于编译器的讨论 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 小议C/C++语言编译器 LuYunFeng. | 3031 | 01/03/27 19:20
文件 | compare seagate | 1615 | 01/03/27 19:20
文件 | Re: compare law | 2109 | 01/03/27 19:20
文件 | Re: compare ruster | 648 | 01/03/27 19:20
文件 | Re: compare law | 522 | 01/03/27 19:20
文件 | Re: compare ruster | 392 | 01/03/27 19:20
文件 | Re: compare law | 580 | 01/03/27 19:20
文件 | Re: compare pwc | 922 | 01/03/27 19:20
文件 | Re: compare ruster | 620 | 01/03/27 19:20
文件 | Re: compare ruster | 1581 | 01/03/27 19:20
文件 | Re: compare law | 749 | 01/03/27 19:20
文件 | Re: compare oldear | 1726 | 01/03/27 19:20
文件 | Re: compare ruster | 380 | 01/03/27 19:20


发信人: seagate (风雪夜归人), 信区: C
标 题: compare
发信站: 饮水思源站 (Tue Dec 15 01:34:04 1998) , 站内信件

同感 ！照我看，BC3.1 和 BC4.5 那可都是经典之作。TC2.0 和 BP系列也
都如此。Delphi 继承了BP 的编译速度。记得在“微软XX的秘密”那本书
上提到，MS Pascal 与 Borland Bascal 竞争， ... 哈哈， MS 再也不做
Pascal 编译器了。

VC 不过是 PWB 的另一种形式罢了，当然经过这么多年的"进化"，比PWB是
好用多了。采用PWB形式做IDE也有很多好处，比如：fortran, c, java 就
可以同用一个破 V Studio 了。再有那就是简单，容易集成。这和Borland
的思路可不一样。 MS 总是能赢得大多数人的欢心。
我相信，以后编译器将也成为 MS 的天下。照这样搞下去，可没什么好的。

另：

我最不喜欢 MS word了，尽搞一些花丽呼"骚" 的东西，从6.0 - 97 - 98
越来越难用:
Equation 光改 version number,
word中插入的 bitmap 到处乱跑，
俺喜欢的frame又取消了，
速度越来越慢.
既然，你的OLE/COM 技术那么好，doc的文件的格式好像就没必要老是变来变去。

MS 好像根本不把用户的硬盘当回事，到处拉屎，还搞成 Hidden 的(是不是
想欺骗老百姓不懂啊). 好好的 Help 文件格式越变越差，非要生成
*.gid 文件，我就不明白你help 文件里就不能带上索引啊？ 我都怀疑
是不是因为有 bluesky 这样的公司找出了 Help 文件的格式，所以 MS
才弄个新的格式。

IE4怎么会搞成那么大的体积？ 装完了还不算，还要专门开个目录
放 Uninstall Information ! 占了这么多地方，但如果你敢 uninstall 它，
哈哈... 我一般是干脆 deltree "Uninstall Information"。

另外MS在很多目录放一个 mscreate.dir 0 byte 文件。那位知道这个文
件有什么用？

不是因为 MS 的成功，才成为众矢之的, 最起码，我完全是因为伊对待
工作的态度才不喜欢伊的。

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: epipc2.tamu.edu]


发信人: law (海狼), 信区: C
标 题: Re: compare
发信站: 饮水思源站 (Tue Dec 15 14:34:47 1998) , 站内信件
【 在 seagate (风雪夜归人) 的大作中提到: 】
: 同感 ！照我看，BC3.1 和 BC4.5 那可都是经典之作。TC2.0 和 BP系列也
: 都如此。Delphi 继承了BP 的编译速度。记得在“微软XX的秘密”那本书
: 上提到，MS Pascal 与 Borland Bascal 竞争， ... 哈哈， MS 再也不做
: Pascal 编译器了�

I don't like BC4.5 indeed.
owl is dead.
few real world softwares are developed by it.

: VC 不过是 PWB 的另一种形式罢了，当然经过这么多年的"进化"，比PWB是
: 好用多了。采用PWB形式做IDE也有很多好处，比如：fortran, c, java 就
: 可以同用一个破 V Studio 了。再有那就是简单，容易集成。这和Borland
: 的思路可不一样。 MS 总是能赢得大多数人的欢心�

V Studio is good.
I don't like MS. but I have too say, VStudio & office are good
softwares.
Then with which software you write formal articles?
Wordferfect? Latex? WPS? UltraEdit?

: 我相信，以后编译器将也成为 MS 的天下。照这样搞下去，可没什么好的。
: 另：
: 我最不喜欢 MS word了，尽搞一些花丽呼"骚" 的东西，从6.0 - 97 - 98
: 越来越难用:
: Equation 光改 version number,
: word中插入的 bitmap 到处乱跑，
: 俺喜欢的frame又取消了，
: 速度越来越慢.
: 既然，你的OLE/COM 技术那么好，doc的文件的格式好像就没必要老是变来变去。
: MS 好像根本不把用户的硬盘当回事，到处拉屎，还搞成 Hidden 的(是不是
: 想欺骗老百姓不懂啊). 好好的 Help 文件格式越变越差，非要生成
: *.gid 文件，我就不明白你help 文件里就不能带上索引啊？ 我都怀疑
: 是不是因为有 bluesky 这样的公司找出了 Help 文件的格式，所以 MS
: 才弄个新的格式。
: IE4怎么会搞成那么大的体积？ 装完了还不算，还要专门开个目录
: 放 Uninstall Information ! 占了这么多地方，但如果你敢 uninstall 它，
: 哈哈... 我一般是干脆 deltree "Uninstall Information"。
: 另外MS在很多目录放一个 mscreate.dir 0 byte 文件。那位知道这个文
: 件有什么用？
: 不是因为 MS 的成功，才成为众矢之的, 最起码，我完全是因为伊对待
: 工作的态度才不喜欢伊的。

--

这虚无的城市，这飘渺的城市。
在拥挤的人群中，我已找不到我自己。

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.190]


发信人: ruster (heart), 信区: C
标 题: Re: compare
发信站: 饮水思源站 (Tue Dec 15 14:48:53 1998) , 站内信件
I only don't use VStudio,and MS don't use it too,
Windows 95 is not written by VC,and Office are not tooo
but ,Word is good

【 在 law (海狼) 的大作中提到: 】
: I don't like BC4.5 indeed.
: owl is dead.
: few real world softwares are developed by it.
: V Studio is good.
: I don't like MS. but I have too say, VStudio & office are good
: softwares.
: Then with which software you write formal articles?
: Wordferfect? Latex? WPS? UltraEdit?

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.199.248.3]


发信人: law (海狼), 信区: C
标 题: Re: compare
发信站: 饮水思源站 (Tue Dec 15 15:02:27 1998) , 站内信件
【 在 ruster (heart) 的大作中提到: 】
: I only don't use VStudio,and MS don't use it too,
: Windows 95 is not written by VC,and Office are not tooo
: but ,Word is good

yes, they are developed by MSC6.0 or 7.0.

--

这虚无的城市，这飘渺的城市。
在拥挤的人群中，我已找不到我自己。

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.190]


发信人: ruster (heart), 信区: C
标 题: Re: compare
发信站: 饮水思源站 (Tue Dec 15 15:34:29 1998) , 站内信件
Windows 95肯定不是,要不你去反汇编一下指令代码，MSC的编译器不是那样的
至于Office我没有跟踪过...
还有,FOxpro 也不是用MSC写的

【 在 law (海狼) 的大作中提到: 】
: yes, they are developed by MSC6.0 or 7.0.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.199.248.3]


发信人: law (海狼), 信区: C
标 题: Re: compare
发信站: 饮水思源站 (Tue Dec 15 15:44:40 1998) , 站内信件
【 在 ruster (heart) 的大作中提到: 】
: Windows 95肯定不是,要不你去反汇编一下指令代码，MSC的编译器不是那样的
: 至于Office我没有跟踪过...
: 还有,FOxpro 也不是用MSC写的

as I Know office is developed by MSC.
BTW: how can you determine the compiler from the assemble code?

--

这虚无的城市，这飘渺的城市。
在拥挤的人群中，我已找不到我自己。

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.190]


发信人: pwc (bbs), 信区: C
标 题: Re: compare
发信站: 饮水思源站 (Tue Dec 15 16:07:27 1998) , 站内信件
【 在 ruster (heart) 的大作中提到: 】
: I only don't use VStudio,and MS don't use it too,
: Windows 95 is not written by VC,and Office are not tooo
: but ,Word is good

VC is not only VStudio , i think VC including many many things,
such com /ole though they are only Component Object Model .
Though window 95 is not developed under VStudio , its compiler must

be C compiler . And you must be able to compiler windows 95 source
files under Vc compiler . these are like Netscape Source Files .
Netscape is written with c/c++ . and you can compile it under many
c/c++ compiler , I compile it under vc including command status and
IDE status . In fact once you get to a status , you need not
care about what compiler .
it's my opinion .

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.240.10]


发信人: ruster (heart), 信区: C
标 题: Re: compare
发信站: 饮水思源站 (Tue Dec 15 16:16:45 1998) , 站内信件
????How do you know?
我也听说过许多东西是MSC&VC写的,但是当我去反汇编目标代码是，总是和我
自己写出来的东西不一样,首先是启动代码(from start to main),然后是循环和跳转
代码的优化方式.据说Microsoft 是用C写程序,但是编译器和库函数都是保密的
可能是我水平太低,但是总不会连启动代码都不一样吧......
【 在 law (海狼) 的大作中提到: 】
: as I Know office is developed by MSC.
: BTW: how can you determine the compiler from the assemble code?

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.199.248.3]


发信人: ruster (heart), 信区: C
标 题: Re: compare
发信站: 饮水思源站 (Tue Dec 15 16:32:42 1998) , 站内信件
【 在 pwc (bbs) 的大作中提到: 】
: VC is not only VStudio , i think VC including many many things,
: such com /ole though they are only Component Object Model .
: Though window 95 is not developed under VStudio , its compiler must
: be C compiler . And you must be able to compiler windows 95 source
Sure you can compile Windows 95 with VC?

: files under Vc compiler . these are like Netscape Source Files .
: Netscape is written with c/c++ . and you can compile it under many
: c/c++ compiler , I compile it under vc including command status and
: IDE status . In fact once you get to a status , you need not
: care about what compiler .
if you can write all library yourself, and optimize all code manual,it is ture,
but I can't . I must use library as math / float the compiler given.
I am not a professional coder or designer,i am only a trainee.
I MSC 5,It has many error in file I/O,and there are many error in float point
at TC .When I use MSC 6,It put several wasted byte to align the data structure,
so I must write my own File I/O function.But I will not use such compiler for
ever
VC is better than BC ,Perhaps,But it left me too many problem as GPE or
Float Point Error,Sure they are all can solve,but I don't like that.
why i can write some code in BC & BCBuiklder but cause GPE in VC?
No develop can don't mind compiler,unless you are master

: it's my opinion .

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.199.248.3]


发信人: law (海狼), 信区: C
标 题: Re: compare
发信站: 饮水思源站 (Tue Dec 15 16:37:36 1998) , 站内信件
【 在 ruster (heart) 的大作中提到: 】
: ????How do you know?
: 我也听说过许多东西是MSC&VC写的,但是当我去反汇编目标代码是，总是和我
: 自己写出来的东西不一样,首先是启动代码(from start to main),然后是循环和跳转
: 代码的优化方式.据说Microsoft 是用C写程序,但是编译器和库函数都是保密的
: 可能是我水平太低,但是总不会连启动代码都不一样吧......

从MSC5.1开始就可以用自己的启动代码代替缺省的.
听说MS的程序有些关键部分是先用C生成。再用汇编重写的，

--

这虚无的城市，这飘渺的城市。
在拥挤的人群中，我已找不到我自己。

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.190]


发信人: oldear (老埃尔), 信区: C
标 题: Re: compare
发信站: 饮水思源站 (Wed Dec 16 00:02:51 1998) , 转信
呵呵，我知道你只爱敲键盘，使BC.
【 在 seagate (风雪夜归人) 的大作中提到: 】
: 同感 ！照我看，BC3.1 和 BC4.5 那可都是经典之作。TC2.0 和 BP系列也
: 都如此。Delphi 继承了BP 的编译速度。记得在“微软XX的秘密”那本书
: 上提到，MS Pascal 与 Borland Bascal 竞争， ... 哈哈， MS 再也不做
: Pascal 编译器了。
: VC 不过是 PWB 的另一种形式罢了，当然经过这么多年的"进化"，比PWB是
: 好用多了。采用PWB形式做IDE也有很多好处，比如：fortran, c, java 就
: 可以同用一个破 V Studio 了。再有那就是简单，容易集成。这和Borland
: 的思路可不一样。 MS 总是能赢得大多数人的欢心。
: 我相信，以后编译器将也成为 MS 的天下。照这样搞下去，可没什么好的。
: 另：
: 我最不喜欢 MS word了，尽搞一些花丽呼"骚" 的东西，从6.0 - 97 - 98
: 越来越难用:
: Equation 光改 version number,
: word中插入的 bitmap 到处乱跑，
: 俺喜欢的frame又取消了，
: 速度越来越慢.
: 既然，你的OLE/COM 技术那么好，doc的文件的格式好像就没必要老是变来变去。
: MS 好像根本不把用户的硬盘当回事，到处拉屎，还搞成 Hidden 的(是不是
: 想欺骗老百姓不懂啊). 好好的 Help 文件格式越变越差，非要生成
: *.gid 文件，我就不明白你help 文件里就不能带上索引啊？ 我都怀疑
: 是不是因为有 bluesky 这样的公司找出了 Help 文件的格式，所以 MS
: 才弄个新的格式。
: IE4怎么会搞成那么大的体积？ 装完了还不算，还要专门开个目录
: 放 Uninstall Information ! 占了这么多地方，但如果你敢 uninstall 它，
: 哈哈... 我一般是干脆 deltree "Uninstall Information"。
: 另外MS在很多目录放一个 mscreate.dir 0 byte 文件。那位知道这个文
: 件有什么用？
: 不是因为 MS 的成功，才成为众矢之的, 最起码，我完全是因为伊对待
: 工作的态度才不喜欢伊的。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.112.26.209]


发信人: ruster (heart), 信区: C
标 题: Re: compare
发信站: 饮水思源站 (Wed Dec 16 08:22:21 1998) , 站内信件
【 在 law (海狼) 的大作中提到: 】
: 从MSC5.1开始就可以用自己的启动代码代替缺省的.
: 听说MS的程序有些关键部分是先用C生成。再用汇编重写的，

后一条是有可能的,但更大的可能是MS使用内部的编译器

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.199.248.3]


发信人: magirl (水皮鱼), 信区: C
标 题: Re: 各种C的比较
发信站: 饮水思源站 (Sun Nov 7 13:27:33 1999) , 转信
做科学计算，Watcom C是最快的。
GCC 也能在windows下用。

【 在 jia (小木头) 的大作中提到: 】
: 各种C的比较
: lone
: 在Windows的世界里, BC,VC, Symantec C, Watcom C等都有各自的
: 开发环境(IDE, Integral Development Enviornment), 就我个人
: 的体会而言, Visual C++ 4.X的环境最好用. Debug, Resource Editor,
: Version Control, Help等都集成在一起, 使用方便. 就C/C++本身而言,
: 它们相互之间大同小异, 都向最新的AT&T C++标准看齐. 当然, 代码
: 生成质量相差较大. 据BYTE杂志测试, WatComm C/C++的代码质量最好,
: Borland C/C++最差, MS Visual C++居中. 这是Borland C 5.0和Visual C++ 4.0
: 推出之前的结果, 有兴趣的话可参阅95年的BYTE(WWW Server, http://www.byte.com)
: 在Windows(包括Win3x, Win95, NT)下, 一个重要问题是做界面. C++的
: 类库在这里发挥着极大的影响. BC的类库(OWL)最全, 层次较高, 界面编程
: 的体会而言, Visual C++ 4.X的环境最好用. Debug, Resource Editor,
: Version Control, Help等都集成在一起, 使用方便. 就C/C++本身而言,
: 它们相互之间大同小异, 都向最新的AT&T C++标准看齐. 当然, 代码
: 生成质量相差较大. 据BYTE杂志测试, WatComm C/C++的代码质量最好,
: Borland C/C++最差, MS Visual C++居中. 这是Borland C 5.0和Visual C++ 4.0
: 推出之前的结果, 有兴趣的话可参阅95年的BYTE(WWW Server, http://www.byte.com)
: 在Windows(包括Win3x, Win95, NT)下, 一个重要问题是做界面. C++的
: 类库在这里发挥着极大的影响. BC的类库(OWL)最全, 层次较高, 界面编程
: 方便. VC的MFC则较为逊色, 与SDK接近. WatCom C则仅采用低版本的MFC
: 作为类库.
: 如果界面不是主要问题, 则我推荐使用UNIX环境下的gcc/g++, 这是GNU
: 的完全free的software之一. 可在大多数main stream的UNIX版本和硬件
: 平台下使用. 比如SunOS/Solaris, IBM AIX, BSD Unix, Sco UNIX, Linux
: 等等等等. 代码生成质量高. UNIX的稳定性和代码级的夸平台可移植性早已
: 为大家所公认. 但有一个user friendly的问题, 你只能用命令行加Makefile
: 的方式做开发, 对用惯了PC机的用户而言, 是极不习惯的. 对于老UNIX用户,
: 则feel at home. IBM的AIX有个开发环境, 但实在不敢恭维.
: 在UNIX下做界面, 一个是字符的curses, 另外就是X Window了. 不如Windows
: 下方便, 但也差强人意了. 看一看X Window下Motif风格的Netscape就知道了.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 159.226.88.132]


发信人: blackwhite (BlackCracker), 信区: C
标 题: Re: 结构体能不能作为函数返回值？
发信站: 饮水思源站 (Sat Feb 26 11:36:38 2000), 转信
【 在 laichaoan (长安) 的大作中提到: 】
: 如题。急！谢谢！
: 如果不能，怎样将被调函数中的结构体值返回到主程序中？

C语言新标准允许函数以结构作参数，也允许函数返回结构。
Here is an example,

#include <stdio.h>
struct st {
int x;
int y;
};
struct st f(struct st n);

main()
{
struct st a,b;
a.x=123; a.y=456;
b=f(a);
printf("b.x=%d, b.y=%d\n", b.x, b.y);
}

struct st f(struct st n)
{
int t;
t=n.x;
n.x=n.y;
n.y=t;
return n;
}

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.32.146.100]


发信人: huangjielei (庐山大侠), 信区: C
标 题: 《� 数据结构� 》要学多深？
发信站: 饮水思源站 (Thu Mar 30 12:14:54 2000), 转信
本人学C学的编不出东西来。
有人叫我先看看《数据结构》
基本上看的懂！不过看了就忘了！
友人就叫我把算法背下来，等背的滚瓜烂熟了
也就可以运用自如了！
是这么回事吗？

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.35.243.29]


发信人: zany (木瓜), 信区: C
标 题: Re: 《?数据结构?》要学多深？
发信站: 饮水思源站 (Thu Mar 30 21:26:25 2000) , 站内信件
真的都看懂了？
不只是一句一句的看懂，还要从算法一级理解。
不过你有那么好的脑子能背下来的话也可以，你可以盖上书试试，不要偷看！如果
你忘了的话，就不要再背了。
不过我当年c语言的课是我读书以来唯一怕不及格的，我的木瓜脑袋还在
学你也能学好啊！Goodluck!

【 在 huangjielei (庐山大侠) 的大作中提到: 】
: 本人学C学的编不出东西来。
: 有人叫我先看看《数据结构》
: 基本上看的懂！不过看了就忘了！
: 友人就叫我把算法背下来，等背的滚瓜烂熟了
: 也就可以运用自如了！
: 是这么回事吗？
:

--
※ 来源:．饮水思源站WWW bbs.sjtu.edu.cn. [FROM: 202.120.8.24]


发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 《� 数据结构� 》要学多深？
发信站: 饮水思源站 (Fri Mar 31 03:15:59 2000), 转信
算法不用背，只要找得到就可以。但基本功还是要有的，
比如给你两页的算法描述，你就应该可以用C实现。
有关算法的描述，到处都是，所以不用背。
现实工作时，绝对多数情况下，算法都由别人实现，
你只要知道怎么用就行了。一般来说自己需要掌握的
比较常用的就是链表，二叉树还有Hash表。
不过数据结构的基本概念要有，也就是知道什么样的
问题可以用什么算法解决，及该算法的复杂度是否可以
接收。算法本身可以查到，你要作的是实现他。
什么叫C学好了你。你如果能用C，自己写出8后问题，
或马跳田字，算法可以在图书馆查到，那么你C也就
出师了。

【 在 huangjielei (庐山大侠) 的大作中提到: 】
: 本人学C学的编不出东西来。
: 有人叫我先看看《数据结构》
: 基本上看的懂！不过看了就忘了！
: 友人就叫我把算法背下来，等背的滚瓜烂熟了
: 也就可以运用自如了！
: 是这么回事吗？

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 206.86.196.155]


发信人: systolic (红红的太阳), 信区: C
标 题: Re: 《� 数据结构� 》要学多深？
发信站: 饮水思源站 (Sat Apr 1 14:05:44 2000), 转信
看你想干什么，
如果要研究算法，
那么最基本的算法都是应该有个了解，
比如排序啊，查找啊，
等等，
不但要知道各种算法的实质，还要知道它们的优缺点，
适用场合，
可改进之处，。。。。
总之，
多着呢！

【 在 took 的大作中提到: 】
: 搞笑.
: 算法只要知道,要用时知道哪里去找、找什么,这就够了.
: 【 在 huangjielei (庐山大侠) 的大作中提到: 】
: : 本人学C学的编不出东西来。
: : 有人叫我先看看《数据结构》
: : 基本上看的懂！不过看了就忘了！
: : 友人就叫我把算法背下来，等背的滚瓜烂熟了
: : 也就可以运用自如了！
: : 是这么回事吗？

--
*******
那时候我们还年轻，
不懂得什么是爱情。
**********

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.1.1]


open: Permission denied
发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 《� 数据结构� 》要学多深？
发信站: 饮水思源站 (Sun Apr 2 00:52:35 2000), 转信
研究算法的人不用写程序。只用pseudo code描述算法。
现在讨论的是学C。我们公司一个很牛的Architect,
研究Video Encoder算法的一Ph.d，就连C都不会写，
照样没问题。这是两码事。再说研究算法和使用算法
在现时生活中的机会恐怕是1：10000。

【 在 systolic (红红的太阳) 的大作中提到: 】
: 看你想干什么，
: 如果要研究算法，
: 那么最基本的算法都是应该有个了解，
: 比如排序啊，查找啊，
: 等等，
: 不但要知道各种算法的实质，还要知道它们的优缺点，
: 适用场合，
: 可改进之处，。。。。
: 总之，
: 多着呢！
: 【 在 took 的大作中提到: 】
: : 搞笑.
: : 算法只要知道,要用时知道哪里去找、找什么,这就够了.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 209.141.66.148]


open: Permission denied
发信人: huangjielei (庐山大侠), 信区: C
标 题: Re: 《� 数据结构� 》要学多深？
发信站: 饮水思源站 (Mon Apr 3 12:16:19 2000), 转信
我的最大困难就是难用C写源代码。
不能上机实践，它描述的太紧凑！
久攻不下，不免心急！想撕书（当然图书馆人太多没敢动！）
这是不是说明我的c语法学就根本的不够好！
还没能力学《数据结构》呢？【 在 tonyxu (无斋主人) 的大作中提到: 】
: 算法不用背，只要找得到就可以。但基本功还是要有的，
: 比如给你两页的算法描述，你就应该可以用C实现。
: 有关算法的描述，到处都是，所以不用背。
: 现实工作时，绝对多数情况下，算法都由别人实现，
: 你只要知道怎么用就行了。一般来说自己需要掌握的
: 比较常用的就是链表，二叉树还有Hash表。
: 不过数据结构的基本概念要有，也就是知道什么样的
: 问题可以用什么算法解决，及该算法的复杂度是否可以
: 接收。算法本身可以查到，你要作的是实现他。
: 什么叫C学好了你。你如果能用C，自己写出8后问题，
: 或马跳田字，算法可以在图书馆查到，那么你C也就
: 出师了。
: 【 在 huangjielei (庐山大侠) 的大作中提到: 】
: : 本人学C学的编不出东西来。
: : 有人叫我先看看《数据结构》
: : 基本上看的懂！不过看了就忘了！
: : 友人就叫我把算法背下来，等背的滚瓜烂熟了
: : 也就可以运用自如了！
: : 是这么回事吗？

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.35.243.27]


open: Permission denied
发信人: turboc (c,c,c), 信区: C
标 题: Re: 《� 数据结构� 》要学多深？
发信站: 饮水思源站 (Mon Apr 17 10:41:19 2000), 转信

写出8后算什么,那是我初一时干的,
起码也应学到 动态规划 和 网络流
【 在 tonyxu (无斋主人) 的大作中提到: 】
: 算法不用背，只要找得到就可以。但基本功还是要有的，
: 比如给你两页的算法描述，你就应该可以用C实现。
: 有关算法的描述，到处都是，所以不用背。
: 现实工作时，绝对多数情况下，算法都由别人实现，
: 你只要知道怎么用就行了。一般来说自己需要掌握的
: 比较常用的就是链表，二叉树还有Hash表。
: 不过数据结构的基本概念要有，也就是知道什么样的
: 问题可以用什么算法解决，及该算法的复杂度是否可以
: 接收。算法本身可以查到，你要作的是实现他。
: 什么叫C学好了你。你如果能用C，自己写出8后问题，
: 或马跳田字，算法可以在图书馆查到，那么你C也就
: 出师了。
: 【 在 huangjielei (庐山大侠) 的大作中提到: 】
: : 本人学C学的编不出东西来。
: : 有人叫我先看看《数据结构》
: : 基本上看的懂！不过看了就忘了！
: : 友人就叫我把算法背下来，等背的滚瓜烂熟了
: : 也就可以运用自如了！
: : 是这么回事吗？

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.173]


open: Permission denied
发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 《� 数据结构� 》要学多深？
发信站: 饮水思源站 (Tue Apr 18 01:54:11 2000), 转信
你老人家太牛了，一般情况根据算法写出8后，
就可以了，写个程序什么的就没什么问题了。

【 在 turboc 的大作中提到: 】
: 写出8后算什么,那是我初一时干的,
: 起码也应学到 动态规划 和 网络流
: 【 在 tonyxu (无斋主人) 的大作中提到: 】
: : 算法不用背，只要找得到就可以。但基本功还是要有的，
: : 比如给你两页的算法描述，你就应该可以用C实现。
: : 有关算法的描述，到处都是，所以不用背。
: : 现实工作时，绝对多数情况下，算法都由别人实现，
: : 你只要知道怎么用就行了。一般来说自己需要掌握的
: : 比较常用的就是链表，二叉树还有Hash表。
: : 不过数据结构的基本概念要有，也就是知道什么样的
: : 问题可以用什么算法解决，及该算法的复杂度是否可以
: : 接收。算法本身可以查到，你要作的是实现他。
: : 什么叫C学好了你。你如果能用C，自己写出8后问题，
: : 或马跳田字，算法可以在图书馆查到，那么你C也就
: : 出师了。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 206.86.196.155]


发信人: desen (desen), 信区: C
标 题: Re: 《� 数据结构� 》要学多深？
发信站: 饮水思源站 (Thu Apr 20 23:10:27 2000), 站内信件
那要看您老是想准备考试还是准备博大精深的说，呵呵

【 在 tonyxu 的大作中提到: 】
: 你老人家太牛了，一般情况根据算法写出8后，
: 就可以了，写个程序什么的就没什么问题了。
: 【 在 turboc 的大作中提到: 】
: : 写出8后算什么,那是我初一时干的,
: : 起码也应学到 动态规划 和 网络流

--
Desen's Personal Web Page
http://desen.126.com

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.52.136]


发信人: emcc (Tarzan), 信区: C
标 题: Re: 《� 数据结构� 》要学多深？
发信站: 饮水思源站 (Sat Apr 22 01:15:20 2000), 转信
【 在 took 的大作中提到: 】
: 搞笑.

也不完全是搞笑，偶比较倾向于ｔｏｎｙｘｕ
老人家的观点．个人觉得学算法（数据结构）
的关键是理解，如算法的思想（关键）是什么，
不必拘尼于细节，碰到后查一下书就可以了．
: 算法只要知道,要用时知道哪里去找、找什么,这就够了.
: 【 在 huangjielei (庐山大侠) 的大作中提到: 】
: : 本人学C学的编不出东西来。
: : 有人叫我先看看《数据结构》
: : 基本上看的懂！不过看了就忘了！
: : 友人就叫我把算法背下来，等背的滚瓜烂熟了
: : 也就可以运用自如了！
: : 是这么回事吗？

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.24.113.238]


C programming faq

饮水思源站 C programming faq 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | c programming faq 0 heavenhorse | 2638 | 01/03/28 20:01
文件 | c programming faq 1 heavenhorse | 2876 | 01/03/28 20:01
文件 | c programming faq 2 heavenhorse | 3056 | 01/03/28 20:01
文件 | c programming faq 3 heavenhorse | 2490 | 01/03/28 20:01
文件 | c programming faq 4 heavenhorse | 1594 | 01/03/28 20:01
文件 | c programming faq 5 heavenhorse | 4559 | 01/03/28 20:01
文件 | c programming faq 6 heavenhorse | 3944 | 01/03/28 20:01
文件 | c programming faq 7 heavenhorse | 5058 | 01/03/28 20:01
文件 | c programming faq 8 heavenhorse | 908 | 01/03/28 20:01
文件 | c programming faq 9 heavenhorse | 748 | 01/03/28 20:02
文件 | c programming faq 10 heavenhorse | 3978 | 01/03/28 20:02
文件 | c programming 11 heavenhorse | 6453 | 01/03/28 20:02
文件 | c programming faq 12 heavenhorse | 4261 | 01/03/28 20:02
文件 | c programming faq 13 heavenhorse | 4138 | 01/03/28 20:02
文件 | c programming faq 14 heavenhorse | 2347 | 01/03/28 20:02
文件 | c programming faq 15 heavenhorse | 2502 | 01/03/28 20:02
文件 | c programming faq 16 heavenhorse | 1446 | 01/03/28 20:02
文件 | c programming faq 17 heavenhorse | 1241 | 01/03/28 20:02
文件 | c programming faq 18 heavenhorse | 2743 | 01/03/28 20:02
文件 | c programming faq 19 heavenhorse | 5731 | 01/03/28 20:02
文件 | c programming faq 21 heavenhorse | 6088 | 01/03/28 20:02
文件 | c programming faq 21 heavenhorse | 1050 | 01/03/28 20:02


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 0
发信站: 饮水思源站 (Fri Jun 23 14:05:26 2000) , 转信
Path: senator-bedfellow.mit.edu!bloom-beacon.mit.edu!howland.erols.net
!newsfeed.skycache.com!Cidera!204.122.16.44!news.eskimo.com!eskimo.com
!scs
From: scs@eskimo.com (Steve Summit)
Newsgroups: comp.lang.c,comp.lang.c.moderated,alt.comp.lang.learn.c-c+
+,comp.answers,alt.answers,news.answers
Subject: comp.lang.c Answers (Abridged) to Frequently Asked Questions
(FAQ)
Followup-To: poster
Date: 15 Jun 2000 10:00:24 GMT
Organization: better late than never
Lines: 1949
Approved: news-answers-request@MIT.Edu
Expires: 3 Jul 2000 00:00:00 GMT
Message-ID: <2000Jun15.0300.scs.0001@eskimo.com>
Reply-To: scs@eskimo.com
NNTP-Posting-Host: eskimo.com
X-Trace: eskinews.eskimo.com 961063224 15636 204.122.16.13 (15 Jun 200
0 10:00:24 GMT)
X-Complaints-To: abuse@eskimo.com
NNTP-Posting-Date: 15 Jun 2000 10:00:24 GMT
X-Last-Modified: February 7, 1999
X-Archive-Name: C-faq/abridged
X-Version: 3.5a
X-URL: http://www.eskimo.com/~scs/C-faq/top.html
X-PGP-Signature: Version: 2.6.2
iQCSAwUBMjhNk96sm4I1rmP1AQEF/QPndRyxOJtumiupKJiAkknSZsQr+8RTntjh
zx8054S9qgdEOgpx3QHea681LklR8g51w+k04fxFU9VeRNuRh6I9yTWG1JjPZRpf
NkcthDa8uNQ0JtWYWef2Jk7/sc2A0L88fHBpnG2epI5av2FwcqO3JKGNR4YkRCb6
MM80Pcg=
=amQx
Originator: scs@eskimo.com
Xref: senator-bedfellow.mit.edu comp.lang.c:429136 comp.lang.c.moderat
ed:15817 alt.comp.lang.learn.c-c++:53790 comp.answers:41211 alt.answer
s:49589 news.answers:185826

Archive-name: C-faq/abridged
Comp-lang-c-archive-name: C-FAQ-list.abridged
URL: http://www.eskimo.com/~scs/C-faq/top.html

[Last modified February 7, 1999 by scs.]

This article is Copyright 1990-1999 by Steve Summit. Content from the
book _C Programming FAQs: Frequently Asked Questions_ is made availabl
e
here by permission of the author and the publisher as a service to the
community. It is intended to complement the use of the published text
and is protected by international copyright laws. The content is made
available here and may be accessed freely for personal use but may not
be republished without permission.

This article contains minimal answers to the comp.lang.c frequently-
asked questions list. More detailed explanations and references can b
e
found in the long version (posted on the first of each month, or see
question 20.40 for availability), and in the web version at http://www
.eskimo.com/~scs/C-faq/top.html
, and in the book _C Programming FAQs: Frequently Asked Questions_
(Addison-Wesley, 1996, ISBN 0-201-84519-9).

--
※ 来源:．饮水思源站WWW bbs.sjtu.edu.cn. [FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 1
发信站: 饮水思源站 (Fri Jun 23 14:07:23 2000) , 转信
Section 1. Declarations and Initializations

1.1: How do you decide which integer type to use?

A: If you might need large values (tens of thousands), use long.
Otherwise, if space is very important, use short. Otherwise,
use int.

1.4: What should the 64-bit type on a machine that can support it?

A: C9X specifies long long.

1.7: What's the best way to declare and define global variables?

A: The best arrangement is to place each definition in some
relevant .c file, with an external declaration in a header file.

1.11: What does extern mean in a function declaration?

A: Nothing, really; the keyword extern is optional here.

1.12: What's the auto keyword good for?

A: Nothing.

1.14: I can't seem to define a linked list node which contains a
pointer to itself.

A: Structures in C can certainly contain pointers to themselves;
the discussion and example in section 6.5 of K&R make this
clear. Problems arise if an attempt is made to define (and use)
a typedef in the midst of such a declaration; avoid this.

1.21: How do I declare an array of N pointers to functions returning
pointers to functions returning pointers to characters?

A: char *(*(*a[N])())();
Using a chain of typedefs, or the cdecl program, makes these
declarations easier.

1.22: How can I declare a function that returns a pointer to a
function of its own type?

A: You can't quite do it directly. Use a cast, or wrap a struct
around the pointer and return that.

1.25: My compiler is complaining about an invalid redeclaration of a
function, but I only define it once.

A: Calling an undeclared function declares it implicitly as
returning int.

1.25b: What's the right declaration for main()?

A: See questions 11.12a to 11.15.

1.30: What am I allowed to assume about the initial values
of variables which are not explicitly initialized?

A: Uninitialized variables with "static" duration start out as 0,
as if the programmer had initialized them. Variables with
"automatic" duration, and dynamically-allocated memory, start
out containing garbage (with the exception of calloc).

1.31: Why can't I initialize a local array with a string?

A: Perhaps you have a pre-ANSI compiler.

1.31b: What's wrong with "char *p = malloc(10);" ?

A: Function calls are not allowed in initializers for global or
static variables.

1.32: What is the difference between char a[] = "string"; and
char *p = "string"; ?

A: The first declares an initialized and modifiable array; the
second declares a pointer initialized to a not-necessarily-
modifiable constant string.

1.34: How do I initialize a pointer to a function?

A: Use something like "extern int func(); int (*fp)() = func;"

--
※ 来源:．饮水思源站WWW bbs.sjtu.edu.cn. [FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 2
发信站: 饮水思源站 (Sun Jun 25 16:23:30 2000), 转信
Section 2. Structures, Unions, and Enumerations

2.1: What's the difference between struct x1 { ... }; and
typedef struct { ... } x2; ?

A: The first structure is named by a tag, the second by a typedef
name.

2.2: Why doesn't "struct x { ... }; x thestruct;" work?

A: C is not C++.

2.3: Can a structure contain a pointer to itself?

A: See question 1.14.

2.4: What's the best way of implementing opaque (abstract) data types
in C?

A: One good way is to use structure pointers which point to
structure types which are not publicly defined.

2.6: I came across some code that declared a structure with the last
member an array of one element, and then did some tricky
allocation to make it act like the array had several elements.
Is this legal or portable?

A: An official interpretation has deemed that it is not strictly
conforming with the C Standard.

2.7: I heard that structures could be assigned to variables and
passed to and from functions, but K&R1 says not.

A: These operations are supported by all modern compilers.

2.8: Is there a way to compare structures automatically?

A: No.

2.10: Can I pass constant values to functions which accept structure
arguments?

A: Not yet. As of this writing, C has no way of generating
anonymous structure values.

2.11: How can I read/write structures from/to data files?

A: It is relatively straightforward to use fread and fwrite.

2.12: How can I turn off structure padding?

A: There is no standard method.

2.13: Why does sizeof report a larger size than I expect for a
structure type?

A: The alignment of arrays of structures must be preserved.

2.14: How can I determine the byte offset of a field within a
structure?

A: ANSI C defines the offsetof() macro, which should be used if
available.

2.15: How can I access structure fields by name at run time?

A: Build a table of names and offsets, using the offsetof() macro.

2.18: I have a program which works correctly, but dumps core after it
finishes. Why?

A: Check to see if a structure type declaration just before main()
is missing its trailing semicolon, causing main() to be declared
as returning a structure. See also questions 10.9 and 16.4.

2.20: Can I initialize unions?

A: The current C Standard allows an initializer for the first-named
member.

2.22: What is the difference between an enumeration and a set of
preprocessor #defines?

A: At the present time, there is little difference. The C Standard
states that enumerations are compatible with integral types.

2.24: Is there an easy way to print enumeration values symbolically?

A: No.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 3
发信站: 饮水思源站 (Sun Jun 25 16:25:47 2000), 转信
Section 3. Expressions

3.1: Why doesn't the code "a[i] = i++;" work?

A: The variable i is both referenced and modified in the same
expression.

3.2: Under my compiler, the code "int i = 7;
printf("%d\n", i++ * i++);" prints 49. Regardless of the order
of evaluation, shouldn't it print 56?

A: The operations implied by the postincrement and postdecrement
operators ++ and -- are performed at some time after the
operand's former values are yielded and before the end of the
expression, but not necessarily immediately after, or before
other parts of the expression are evaluated.

3.3: What should the code "int i = 3; i = i++;" do?

A: The expression is undefined.

3.3b: Here's a slick expression: "a ^= b ^= a ^= b". It swaps a and b
without using a temporary.

A: Not portably; its behavior is undefined.

3.4: Don't precedence and parentheses dictate order of evaluation?

A: Operator precedence and explicit parentheses impose only a
partial ordering on the evaluation of an expression, which does
not generally include the order of side effects.

3.5: But what about the && and || operators?

A: There is a special exception for those operators: left-to-right
evaluation is guaranteed.

3.8: What's a "sequence point"?

A: A point (at the end of a full expression, or at the ||, &&, ?:,
or comma operators, or just before a function call) at which all
side effects are guaranteed to be complete.

3.9: So given a[i] = i++; we don't know which cell of a[] gets
written to, but i does get incremented by one, right?

A: *No*. Once an expression or program becomes undefined, *all*
aspects of it become undefined.

3.12: If I'm not using the value of the expression, should I use i++
or ++i to increment a variable?

A: Since the two forms differ only in the value yielded, they are
entirely equivalent when only their side effect is needed.

3.14: Why doesn't the code "int a = 1000, b = 1000;
long int c = a * b;" work?

A: You must manually cast one of the operands to (long).

3.16: Can I use ?: on the left-hand side of an assignment expression?

A: No.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 4
发信站: 饮水思源站 (Sun Jun 25 16:29:10 2000), 转信
Section 4. Pointers

4.2: What's wrong with "char *p; *p = malloc(10);"?

A: The pointer you declared is p, not *p.

4.3: Does *p++ increment p, or what it points to?

A: *p++ increments p. To increment the value pointed to by p, use
(*p)++ .

4.5: I want to use a char * pointer to step over some ints. Why
doesn't "((int *)p)++;" work?

A: In C, a cast operator is a conversion operator, and by
definition it yields an rvalue, which cannot be assigned to, or
incremented with ++.

4.8: I have a function which accepts, and is supposed to initialize,
a pointer, but the pointer in the caller remains unchanged.

A: The called function probably altered only the passed copy of the
pointer.

4.9: Can I use a void ** pointer as a parameter so that a function
can accept a generic pointer by reference?

A: Not portably.

4.10: I have a function which accepts a pointer to an int. How can I
pass a constant like 5 to it?

A: You will have to declare a temporary variable.

4.11: Does C even have "pass by reference"?

A: Not really, though it can be simulated.

4.12: I've seen different methods used for calling functions via
pointers.

A: The extra parentheses and explicit * are now officially
optional, although some older implementations require them.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 5
发信站: 饮水思源站 (Sun Jun 25 16:30:23 2000), 转信
Section 5. Null Pointers

5.1: What is this infamous null pointer, anyway?

A: For each pointer type, there is a special value -- the "null
pointer" -- which is distinguishable from all other pointer
values and which is not the address of any object or function.

5.2: How do I get a null pointer in my programs?

A: A constant 0 in a pointer context is converted into a null
pointer at compile time. A "pointer context" is an
initialization, assignment, or comparison with one side a
variable or expression of pointer type, and (in ANSI standard C)
a function argument which has a prototype in scope declaring a
certain parameter as being of pointer type. In other contexts
(function arguments without prototypes, or in the variable part
of variadic function calls) a constant 0 with an appropriate
explicit cast is required.

5.3: Is the abbreviated pointer comparison "if(p)" to test for non-
null pointers valid?

A: Yes. The construction "if(p)" works, regardless of the internal
representation of null pointers, because the compiler
essentially rewrites it as "if(p != 0)" and goes on to convert 0
into the correct null pointer.

5.4: What is NULL and how is it #defined?

A: NULL is simply a preprocessor macro, #defined as 0 (or
((void *)0)), which is used (as a stylistic convention, in
preference to unadorned 0's) to generate null pointers.

5.5: How should NULL be defined on a machine which uses a nonzero bit
pattern as the internal representation of a null pointer?

A: The same as on any other machine: as 0. (The compiler makes the
translation, upon seeing a 0, not the preprocessor; see also
question 5.4.)

5.6: If NULL were defined as "((char *)0)," wouldn't that make
function calls which pass an uncast NULL work?

A: Not in general. The complication is that there are machines
which use different internal representations for pointers to
different types of data. A cast is still required to tell the
compiler which kind of null pointer is required, since it may be
different from (char *)0.

5.9: If NULL and 0 are equivalent as null pointer constants, which
should I use?

A: Either; the distinction is entirely stylistic.

5.10: But wouldn't it be better to use NULL, in case the value of NULL
changes?

A: No. NULL is a constant zero, so a constant zero is equally
sufficient.

5.12: I use the preprocessor macro "#define Nullptr(type) (type *)0"
to help me build null pointers of the correct type.

A: This trick, though valid, does not buy much.

5.13: This is strange. NULL is guaranteed to be 0, but the null
pointer is not?

A: A "null pointer" is a language concept whose particular internal
value does not matter. A null pointer is requested in source
code with the character "0". "NULL" is a preprocessor macro,
which is always #defined as 0 (or ((void *)0)).

5.14: Why is there so much confusion surrounding null pointers?

A: The fact that null pointers are represented both in source code,
and internally to most machines, as zero invites unwarranted
assumptions. The use of a preprocessor macro (NULL) may seem to
suggest that the value could change some day, or on some weird
machine.

5.15: I'm confused. I just can't understand all this null pointer
stuff.

A: A simple rule is, "Always use `0' or `NULL' for null pointers,
and always cast them when they are used as arguments in function
calls."

5.16: Given all the confusion surrounding null pointers, wouldn't it
be easier simply to require them to be represented internally by
zeroes?

A: Such a requirement would accomplish little.

5.17: Seriously, have any actual machines really used nonzero null
pointers?

A: Machines manufactured by Prime, Honeywell-Bull, and CDC, as well
as Symbolics Lisp Machines, have done so.

5.20: What does a run-time "null pointer assignment" error mean?

A: It means that you've written, via a null pointer, to an invalid
location. (See also question 16.8.)

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 6
发信站: 饮水思源站 (Sun Jun 25 16:31:18 2000), 转信
Section 6. Arrays and Pointers

6.1: I had the definition char a[6] in one source file, and in
another I declared extern char *a. Why didn't it work?

A: The declaration extern char *a simply does not match the actual
definition. Use extern char a[].

6.2: But I heard that char a[] was identical to char *a.

A: Not at all. Arrays are not pointers. A reference like x[3]
generates different code depending on whether x is an array or a
pointer.

6.3: So what is meant by the "equivalence of pointers and arrays" in
C?

A: An lvalue of type array-of-T which appears in an expression
decays into a pointer to its first element; the type of the
resultant pointer is pointer-to-T. So for an array a and
pointer p, you can say "p = a;" and then p[3] and a[3] will
access the same element.

6.4: Why are array and pointer declarations interchangeable as
function formal parameters?

A: It's supposed to be a convenience.

6.7: How can an array be an lvalue, if you can't assign to it?

A: An array is not a "modifiable lvalue."

6.8: What is the real difference between arrays and pointers?

A: Arrays automatically allocate space which is fixed in size and
location; pointers are dynamic.

6.9: Someone explained to me that arrays were really just constant
pointers.

A: An array name is "constant" in that it cannot be assigned to,
but an array is *not* a pointer.

6.11: I came across some "joke" code containing the "expression"
5["abcdef"] . How can this be legal C?

A: Yes, array subscripting is commutative in C. The array
subscripting operation a[e] is defined as being identical to
*((a)+(e)).

6.12: What's the difference between array and &array?

A: The type.

6.13: How do I declare a pointer to an array?

A: Usually, you don't want to. Consider using a pointer to one of
the array's elements instead.

6.14: How can I set an array's size at run time?

A: It's straightforward to use malloc() and a pointer.

6.15: How can I declare local arrays of a size matching a passed-in
array?

A: Until recently, you couldn't; array dimensions had to be compile-
time constants. C9X will fix this.

6.16: How can I dynamically allocate a multidimensional array?

A: The traditional solution is to allocate an array of pointers,
and then initialize each pointer to a dynamically-allocated
"row." See the full list for code samples.

6.17: Can I simulate a non-0-based array with a pointer?

A: Not if the pointer points outside of the block of memory it is
intended to access.

6.18: My compiler complained when I passed a two-dimensional array to
a function expecting a pointer to a pointer.

A: The rule by which arrays decay into pointers is not applied
recursively. An array of arrays (i.e. a two-dimensional array
in C) decays into a pointer to an array, not a pointer to a
pointer.

6.19: How do I write functions which accept two-dimensional arrays
when the width is not known at compile time?

A: It's not always particularly easy.

6.20: How can I use statically- and dynamically-allocated
multidimensional arrays interchangeably when passing them to
functions?

A: There is no single perfect method, but see the full list for
some ideas.

6.21: Why doesn't sizeof properly report the size of an array which is
a parameter to a function?

A: The sizeof operator reports the size of the pointer parameter
which the function actually receives.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 7
发信站: 饮水思源站 (Sun Jun 25 16:32:06 2000), 转信
Section 7. Memory Allocation

7.1: Why doesn't the code "char *answer; gets(answer);" work?

A: The pointer variable answer has not been set to point to any
valid storage. The simplest way to correct this fragment is to
use a local array, instead of a pointer.

7.2: I can't get strcat() to work. I tried "char *s3 =
strcat(s1, s2);" but I got strange results.

A: Again, the main problem here is that space for the concatenated
result is not properly allocated.

7.3: But the man page for strcat() says that it takes two char *'s as
arguments. How am I supposed to know to allocate things?

A: In general, when using pointers you *always* have to consider
memory allocation, if only to make sure that the compiler is
doing it for you.

7.3b: I just tried the code "char *p; strcpy(p, "abc");" and it
worked. Why didn't it crash?

A: You got "lucky".

7.3c: How much memory does a pointer variable allocate?

A: Only enough memory to hold the pointer itself, not any memory
for the pointer to point to.

7.5a: I have a function that is supposed to return a string, but when
it returns to its caller, the returned string is garbage.

A: Make sure that the pointed-to memory is properly (i.e. not
locally) allocated.

7.5b: So what's the right way to return a string?

A: Return a pointer to a statically-allocated buffer, a buffer
passed in by the caller, or memory obtained with malloc().

7.6: Why am I getting "warning: assignment of pointer from integer
lacks a cast" for calls to malloc()?

A: Have you #included <stdlib.h>?

7.7: Why does some code carefully cast the values returned by malloc
to the pointer type being allocated?

A: Before ANSI/ISO C, these casts were required to silence certain
warnings.

7.8: Why does so much code leave out the multiplication by
sizeof(char) when allocating strings?

A: Because sizeof(char) is, by definition, exactly 1.

7.14: I've heard that some operating systems don't actually allocate
malloc'ed memory until the program tries to use it. Is this
legal?

A: It's hard to say.

7.16: I'm allocating a large array for some numeric work, but malloc()
is acting strangely.

A: Make sure the number you're trying to pass to malloc() isn't
bigger than a size_t can hold.

7.17: I've got 8 meg of memory in my PC. Why can I only seem to
malloc 640K or so?

A: Under the segmented architecture of PC compatibles, it can be
difficult to use more than 640K with any degree of transparency.
See also question 19.23.

7.19: My program is crashing, apparently somewhere down inside malloc.

A: Make sure you aren't using more memory than you malloc'ed,
especially for strings (which need strlen(str) + 1 bytes).

7.20: You can't use dynamically-allocated memory after you free it,
can you?

A: No. Some early documentation implied otherwise, but the claim
is no longer valid.

7.21: Why isn't a pointer null after calling free()?

A: C's pass-by-value semantics mean that called functions can never
permanently change the values of their arguments.

7.22: When I call malloc() to allocate memory for a local pointer, do
I have to explicitly free() it?

A: Yes.

7.23: When I free a dynamically-allocated structure containing
pointers, do I also have to free each subsidiary pointer?

A: Yes.

7.24: Must I free allocated memory before the program exits?

A: You shouldn't have to.

7.25: Why doesn't my program's memory usage go down when I free
memory?

A: Most implementations of malloc/free do not return freed memory
to the operating system.

7.26: How does free() know how many bytes to free?

A: The malloc/free implementation remembers the size of each block
as it is allocated.

7.27: So can I query the malloc package to find out how big an
allocated block is?

A: Not portably.

7.30: Is it legal to pass a null pointer as the first argument to
realloc()?

A: ANSI C sanctions this usage, although several earlier
implementations do not support it.

7.31: What's the difference between calloc() and malloc()?

A: calloc() takes two arguments, and initializes the allocated
memory to all-bits-0.

7.32: What is alloca() and why is its use discouraged?

A: alloca() allocates memory which is automatically freed when the
function which called alloca() returns. alloca() cannot be
written portably, is difficult to implement on machines without
a stack, and fails under certain conditions if implemented
simply.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 8
发信站: 饮水思源站 (Sun Jun 25 16:32:41 2000), 转信
Section 8. Characters and Strings

8.1: Why doesn't "strcat(string, '!');" work?

A: strcat() concatenates *strings*, not characters.

8.2: Why won't the test if(string == "value") correctly compare
string against the value?

A: It's comparing pointers. To compare two strings, use strcmp().

8.3: Why can't I assign strings to character arrays?

A: Strings are arrays, and you can't assign arrays directly. Use
strcpy() instead.

8.6: How can I get the numeric (character set) value corresponding to
a character?

A: In C, if you have the character, you have its value.

8.9: Why is sizeof('a') not 1?

A: Character constants in C are of type int.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 9
发信站: 饮水思源站 (Sun Jun 25 16:33:16 2000), 转信
Section 9. Boolean Expressions and Variables

9.1: What is the right type to use for Boolean values in C?

A: There's no one right answer; see the full list for some
discussion.

9.2: What if a built-in logical or relational operator "returns"
something other than 1?

A: When a Boolean value is generated by a built-in operator, it is
guaranteed to be 1 or 0. (This is *not* true for some library
routines such as isalpha.)

9.3: Is if(p), where p is a pointer, valid?

A: Yes. See question 5.3.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 10
发信站: 饮水思源站 (Sun Jun 25 16:34:02 2000), 转信
Section 10. C Preprocessor

10.2: I've got some cute preprocessor macros that let me write C code
that looks more like Pascal. What do y'all think?

A: Bleah.

10.3: How can I write a generic macro to swap two values?

A: There is no good answer to this question. The best all-around
solution is probably to forget about using a macro.

10.4: What's the best way to write a multi-statement macro?

A: #define Func() do {stmt1; stmt2; ... } while(0) /* (no trailing ;) */

10.6: What are .h files and what should I put in them?

A: Header files (also called ".h files") should generally contain
common declarations and macro, structure, and typedef
definitions, but not variable or function definitions.

10.7: Is it acceptable for one header file to #include another?

A: It's a question of style, and thus receives considerable debate.

10.8a: What's the difference between #include <> and #include "" ?

A: Roughly speaking, the <> syntax is for Standard headers and ""
is for project headers.

10.8b: What are the complete rules for header file searching?

A: The exact behavior is implementation-defined; see the full list
for some discussion.

10.9: I'm getting strange syntax errors on the very first declaration
in a file, but it looks fine.

A: Perhaps there's a missing semicolon at the end of the last
declaration in the last header file you're #including.

10.10b: I'm #including the header file for a function, but the linker
keeps saying it's undefined.

A: See question 13.25.

10.11: Where can I get a copy of a missing header file?

A: Contact your vendor, or see question 18.16 or the full list.

10.12: How can I construct preprocessor #if expressions which compare
strings?

A: You can't do it directly; try #defining several manifest
constants and implementing conditionals on those.

10.13: Does the sizeof operator work in preprocessor #if directives?

A: No.

10.14: Can I use an #ifdef in a #define line, to define something two
different ways?

A: No.

10.15: Is there anything like an #ifdef for typedefs?

A: Unfortunately, no.

10.16: How can I use a preprocessor #if expression to detect
endianness?

A: You probably can't.

10.18: How can I preprocess some code to remove selected conditional
compilations, without preprocessing everything?

A: Look for a program called unifdef, rmifdef, or scpp.

10.19: How can I list all of the predefined identifiers?

A: If the compiler documentation is unhelpful, try extracting
printable strings from the compiler or preprocessor executable.

10.20: I have some old code that tries to construct identifiers with a
macro like "#define Paste(a, b) a/**/b", but it doesn't work any
more.

A: Try the ANSI token-pasting operator ##.

10.22: What does the message "warning: macro replacement within a
string literal" mean?

A: See question 11.18.

10.23-4: I'm having trouble using macro arguments inside string
literals, using the `#' operator.

A: See questions 11.17 and 11.18.

10.25: I've got this tricky preprocessing I want to do and I can't
figure out a way to do it.

A: Consider writing your own little special-purpose preprocessing
tool, instead.

10.26: How can I write a macro which takes a variable number of
arguments?

A: Here is one popular trick. Note that the parentheses around
printf's argument list are in the macro call, not the
definition.

#define DEBUG(args) (printf("DEBUG: "), printf args)

if(n != 0) DEBUG(("n is %d\n", n));

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming 11
发信站: 饮水思源站 (Sun Jun 25 16:34:44 2000), 转信
Section 11. ANSI/ISO Standard C

11.1: What is the "ANSI C Standard?"

A: In 1983, the American National Standards Institute (ANSI)
commissioned a committee to standardize the C language. Their
work was ratified as ANS X3.159-1989, and has since been adopted
as ISO/IEC 9899:1990, and later amended.

11.2: How can I get a copy of the Standard?

A: Copies are available from ANSI in New York, or from Global
Engineering Documents in Englewood, CO, or from any national
standards body, or from ISO in Geneva, or republished within one
or more books. See the unabridged list for details.

11.2b: Where can I get information about updates to the Standard?

A: See the full list for pointers.

11.3: My ANSI compiler is complaining about prototype mismatches for
parameters declared float.

A: You have mixed the new-style prototype declaration
"extern int func(float);" with the old-style definition
"int func(x) float x;". "Narrow" types are treated differently
according to which syntax is used. This problem can be fixed by
avoiding narrow types, or by using either new-style (prototype)
or old-style syntax consistently.

11.4: Can you mix old-style and new-style function syntax?

A: Doing so is currently legal, for most argument types
(see question 11.3).

11.5: Why does the declaration "extern int f(struct x *p);" give me a
warning message?

A: A structure declared (or even mentioned) for the first time
within a prototype cannot be compatible with other structures
declared in the same source file.

11.8: Why can't I use const values in initializers and array
dimensions?

A: The value of a const-qualified object is *not* a constant
expression in the full sense of the term.

11.9: What's the difference between "const char *p" and
"char * const p"?

A: The former declares a pointer to a constant character; the
latter declares a constant pointer to a character.

11.10: Why can't I pass a char ** to a function which expects a
const char **?

A: The rule which permits slight mismatches in qualified pointer
assignments is not applied recursively.

11.12a: What's the correct declaration of main()?

A: int main(int argc, char *argv[]) .

11.12b: Can I declare main() as void, to shut off these annoying "main
returns no value" messages?

A: No.

11.13: But what about main's third argument, envp?

A: It's a non-standard (though common) extension.

11.14: I believe that declaring void main() can't fail, since I'm
calling exit() instead of returning.

A: It doesn't matter whether main() returns or not, the problem is
that its caller may not even be able to *call* it correctly.

11.15: The book I've been using always uses void main().

A: It's wrong.

11.16: Is exit(status) truly equivalent to returning the same status
from main()?

A: Yes and no. (See the full list for details.)

11.17: How do I get the ANSI "stringizing" preprocessing operator `#'
to stringize the macro's value instead of its name?

A: You can use a two-step #definition to force a macro to be
expanded as well as stringized.

11.18: What does the message "warning: macro replacement within a
string literal" mean?

A: Some pre-ANSI compilers/preprocessors expanded macro parameters
even inside string literals and character constants.

11.19: I'm getting strange syntax errors inside lines I've #ifdeffed
out.

A: Under ANSI C, #ifdeffed-out text must still consist of "valid
preprocessing tokens." This means that there must be no
newlines inside quotes, and no unterminated comments or quotes
(i.e. no single apostrophes).

11.20: What are #pragmas ?

A: The #pragma directive provides a single, well-defined "escape
hatch" which can be used for extensions.

11.21: What does "#pragma once" mean?

A: It is an extension implemented by some preprocessors to help
make header files idempotent.

11.22: Is char a[3] = "abc"; legal?

A: Yes, in ANSI C.

11.24: Why can't I perform arithmetic on a void * pointer?

A: The compiler doesn't know the size of the pointed-to objects.

11.25: What's the difference between memcpy() and memmove()?

A: memmove() offers guaranteed behavior if the source and
destination arguments overlap.

11.26: What should malloc(0) do?

A: The behavior is implementation-defined.

11.27: Why does the ANSI Standard not guarantee more than six case-
insensitive characters of external identifier significance?

A: The problem is older linkers which cannot be forced (by mere
words in a Standard) to upgrade.

11.29: My compiler is rejecting the simplest possible test programs,
with all kinds of syntax errors.

A: Perhaps it is a pre-ANSI compiler.

11.30: Why are some ANSI/ISO Standard library functions showing up as
undefined, even though I've got an ANSI compiler?

A: Perhaps you don't have ANSI-compatible headers and libraries.

11.31: Does anyone have a tool for converting old-style C programs to
ANSI C, or for automatically generating prototypes?

A: See the full list for details.

11.32: Why won't frobozz-cc, which claims to be ANSI compliant, accept
this code?

A: Are you sure that the code being rejected doesn't rely on some
non-Standard extension?

11.33: What's the difference between implementation-defined,
unspecified, and undefined behavior?

A: If you're writing portable code, ignore the distinctions.
Otherwise, see the full list.

11.34: I'm appalled that the ANSI Standard leaves so many issues
undefined.

A: In most of these cases, the Standard is simply codifying
existing practice.

11.35: I just tried some allegedly-undefined code on an ANSI-conforming
compiler, and got the results I expected.

A: A compiler may do anything it likes when faced with undefined
behavior, including doing what you expect.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 12
发信站: 饮水思源站 (Sun Jun 25 16:35:51 2000), 转信
Section 12. Stdio

12.1: What's wrong with the code "char c; while((c = getchar()) !=
EOF) ..."?

A: The variable to hold getchar's return value must be an int.

12.2: Why won't the code "while(!feof(infp)) {
fgets(buf, MAXLINE, infp); fputs(buf, outfp); }" work?

A: EOF is only indicated *after* an input routine fails.

12.4: My program's prompts and intermediate output don't always show
up on the screen.

A: It's best to use an explicit fflush(stdout) whenever output
should definitely be visible.

12.5: How can I read one character at a time, without waiting for the
RETURN key?

A: See question 19.1.

12.6: How can I print a '%' character with printf?

A: "%%".

12.9: How can printf() use %f for type double, if scanf() requires
%lf?

A: C's "default argument promotions" mean that values of type float
are promoted to double.

12.9b: What printf format should I use for a typedef when I don't know
the underlying type?

A: Use a cast to convert the value to a known type, then use the
printf format matching that type.

12.10: How can I implement a variable field width with printf?

A: Use printf("%*d", width, x).

12.11: How can I print numbers with commas separating the thousands?

A: There is no standard routine (but see <locale.h>).

12.12: Why doesn't the call scanf("%d", i) work?

A: The arguments you pass to scanf() must always be pointers.

12.13: Why doesn't the code "double d; scanf("%f", &d);" work?

A: Unlike printf(), scanf() uses %lf for double, and %f for float.

12.15: How can I specify a variable width in a scanf() format string?

A: You can't.

12.17: When I read numbers from the keyboard with scanf "%d\n", it
seems to hang until I type one extra line of input.

A: Try using "%d" instead of "%d\n".

12.18: I'm reading a number with scanf %d and then a string with
gets(), but the compiler seems to be skipping the call to
gets()!

A: scanf() and gets() do not work well together.

12.19: I'm re-prompting the user if scanf() fails, but sometimes it
seems to go into an infinite loop.

A: scanf() tends to "jam" on bad input since it does not discard
it.

12.20: Why does everyone say not to use scanf()? What should I use
instead?

A: scanf() has a number of problems. Usually, it's easier to read
entire lines and then interpret them.

12.21: How can I tell how much destination buffer space I'll need for
an arbitrary sprintf call? How can I avoid overflowing the
destination buffer with sprintf()?

A: Use the new snprintf() function, if you can.

12.23: Why does everyone say not to use gets()?

A: It cannot be prevented from overflowing the input buffer.

12.24: Why does errno contain ENOTTY after a call to printf()?

A: Don't worry about it. It is only meaningful for a program to
inspect the contents of errno after an error has been reported.

12.25: What's the difference between fgetpos/fsetpos and ftell/fseek?

A: fgetpos() and fsetpos() use a special typedef which may allow
them to work with larger files than ftell() and fseek().

12.26: Will fflush(stdin) flush unread characters from the standard
input stream?

A: No.

12.30: I'm trying to update a file in place, by using fopen mode "r+",
but it's not working.

A: Be sure to call fseek between reading and writing.

12.33: How can I redirect stdin or stdout from within a program?

A: Use freopen().

12.34: Once I've used freopen(), how can I get the original stream
back?

A: There isn't a good way. Try avoiding freopen.

12.36b: How can I arrange to have output go two places at once?

A: You could write your own printf variant which printed everything
twice. See question 15.5.

12.38: How can I read a binary data file properly?

A: Be sure to specify "rb" mode when calling fopen().

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 13
发信站: 饮水思源站 (Sun Jun 25 16:36:29 2000), 转信
Section 13. Library Functions

13.1: How can I convert numbers to strings?

A: Just use sprintf().

13.2: Why does strncpy() not always write a '\0'?

A: For mildly-interesting historical reasons.

13.5: Why do some versions of toupper() act strangely if given an
upper-case letter?

A: Older versions of toupper() and tolower() did not always work as
expected in this regard.

13.6: How can I split up a string into whitespace-separated fields?

A: Try strtok().

13.7: I need some code to do regular expression and wildcard matching.

A: regexp libraries abound; see the full list for details.

13.8: I'm trying to sort an array of strings with qsort(), using
strcmp() as the comparison function, but it's not working.

A: You'll have to write a "helper" comparison function which takes
two generic pointer arguments, converts them to char **, and
dereferences them, yielding char *'s which can be usefully
compared.

13.9: Now I'm trying to sort an array of structures, but the compiler
is complaining that the function is of the wrong type for
qsort().

A: The comparison function must be declared as accepting "generic
pointers" (const void *) which it then converts to structure
pointers.

13.10: How can I sort a linked list?

A: Algorithms like insertion sort and merge sort work well, or you
can keep the list in order as you build it.

13.11: How can I sort more data than will fit in memory?

A: You want an "external sort"; see the full list for details.

13.12: How can I get the time of day in a C program?

A: Just use the time(), ctime(), localtime() and/or strftime()
functions.

13.13: How can I convert a struct tm or a string into a time_t?

A: The ANSI mktime() function converts a struct tm to a time_t. No
standard routine exists to parse strings.

13.14: How can I perform calendar manipulations?

A: The ANSI/ISO Standard C mktime() and difftime() functions
provide some support for both problems.

13.14b: Does C have any Year 2000 problems?

A: No, although poorly-written C programs do. Make sure you know
that tm_year holds the value of the year minus 1900.

13.15: I need a random number generator.

A: The Standard C library has one: rand().

13.16: How can I get random integers in a certain range?

A: One method is something like

(int)((double)rand() / ((double)RAND_MAX + 1) * N)

13.17: Each time I run my program, I get the same sequence of numbers
back from rand().

A: You can call srand() to seed the pseudo-random number generator
with a truly random initial value.

13.18: I need a random true/false value, so I'm just taking rand() % 2,
but it's alternating 0, 1, 0, 1, 0...

A: Try using the higher-order bits: see question 13.16.

13.20: How can I generate random numbers with a normal or Gaussian
distribution?

A: See the longer versions of this list for ideas.

13.24: I'm trying to port this old program. Why do I get "undefined
external" errors for some library functions?

A: Some semistandard functions have been renamed or replaced over
the years; see the full list for details.

13.25: I get errors due to library functions being undefined even
though I #include the right header files.

A: You may have to explicitly ask for the correct libraries to be
searched.

13.26: I'm still getting errors due to library functions being
undefined, even though I'm requesting the right libraries.

A: Library search order is significant; usually, you must search
the libraries last.

13.28: What does it mean when the linker says that _end is undefined?

A: You generally get that message only when other symbols are
undefined, too.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 14
发信站: 饮水思源站 (Sun Jun 25 16:37:03 2000), 转信
Section 14. Floating Point

14.1: When I set a float variable to 3.1, why is printf printing it as
3.0999999?

A: Most computers use base 2 for floating-point numbers, and many
fractions (including 0.1 decimal) are not exactly representable
in base 2.

14.2: Why is sqrt(144.) giving me crazy numbers?

A: Make sure that you have #included <math.h>, and correctly
declared other functions returning double.

14.3: I keep getting "undefined: sin" compilation errors.

A: Make sure you're actually linking with the math library.

14.4: My floating-point calculations are acting strangely and giving
me different answers on different machines.

A: First, see question 14.2 above. If the problem isn't that
simple, see the full list for a brief explanation, or any good
programming book for a better one.

14.5: What's a good way to check for "close enough" floating-point
equality?

A: The best way is to use an accuracy threshold which is relative
to the magnitude of the numbers being compared.

14.6: How do I round numbers?

A: For positive numbers, try (int)(x + 0.5) .

14.7: Where is C's exponentiation operator?

A: Try using the pow() function.

14.8: The predefined constant M_PI seems to be missing from <math.h>.

A: That constant is not standard.

14.9: How do I test for IEEE NaN and other special values?

A: There is not yet a portable way, but see the full list for
ideas.

14.11: What's a good way to implement complex numbers in C?

A: It is straightforward to define a simple structure and some
arithmetic functions to manipulate them.

14.12: I'm looking for some mathematical library code.

A: See Ajay Shah's index of free numerical software at
ftp://ftp.math.psu.edu/pub/FAQ/numcomp-free-c .

14.13: I'm having trouble with a Turbo C program which crashes and says
something like "floating point formats not linked."

A: You may have to insert a dummy call to a floating-point library
function to force loading of floating-point support.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 15
发信站: 饮水思源站 (Sun Jun 25 16:37:40 2000), 转信
Section 15. Variable-Length Argument Lists

15.1: I heard that you have to #include <stdio.h> before calling
printf(). Why?

A: So that a proper prototype for printf() will be in scope.

15.2: How can %f be used for both float and double arguments in
printf()?

A: In variable-length argument lists, types char and short int are
promoted to int, and float is promoted to double.

15.3: Why don't function prototypes guard against mismatches in
printf's arguments?

A: Function prototypes do not provide any information about the
number and types of variable arguments.

15.4: How can I write a function that takes a variable number of
arguments?

A: Use the <stdarg.h> header.

15.5: How can I write a function that takes a format string and a
variable number of arguments, like printf(), and passes them to
printf() to do most of the work?

A: Use vprintf(), vfprintf(), or vsprintf().

15.6: How can I write a function analogous to scanf(), that calls
scanf() to do most of the work?

A: C9X will support vscanf().

15.7: I have a pre-ANSI compiler, without <stdarg.h>. What can I do?

A: There's an older header, <varargs.h>, which offers about the
same functionality.

15.8: How can I discover how many arguments a function was actually
called with?

A: Any function which takes a variable number of arguments must be
able to determine *from the arguments' values* how many of them
there are.

15.9: My compiler isn't letting me declare a function that accepts
*only* variable arguments.

A: Standard C requires at least one fixed argument.

15.10: Why isn't "va_arg(argp, float)" working?

A: Because the "default argument promotions" apply in variable-
length argument lists, you should always use
va_arg(argp, double).

15.11: I can't get va_arg() to pull in an argument of type pointer-to-
function.

A: Use a typedef.

15.12: How can I write a function which takes a variable number of
arguments and passes them to some other function ?

A: In general, you cannot.

15.13: How can I call a function with an argument list built up at run
time?

A: You can't.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 16
发信站: 饮水思源站 (Sun Jun 25 16:38:11 2000), 转信
Section 16. Strange Problems

16.1b: I'm getting baffling syntax errors which make no sense at all,
and it seems like large chunks of my program aren't being
compiled.

A: Check for unclosed comments or mismatched preprocessing
directives.

16.1c: Why isn't my procedure call working?

A: Function calls always require parenthesized argument lists.

16.3: This program crashes before it even runs!

A: Look for very large, local arrays.
(See also questions 11.12b, 16.4, 16.5, and 18.4.)

16.4: I have a program that seems to run correctly, but then crashes
as it's exiting.

A: See the full list for ideas.

16.5: This program runs perfectly on one machine, but I get weird
results on another.

A: See the full list for a brief list of possibilities.

16.6: Why does the code "char *p = "hello, world!"; p[0] = 'H';"
crash?

A: String literals are not modifiable, except (in effect) when they
are used as array initializers.

16.8: What does "Segmentation violation" mean?

A: It generally means that your program tried to access memory it
shouldn't have, invariably as a result of stack corruption or
improper pointer use.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 17
发信站: 饮水思源站 (Sun Jun 25 16:38:39 2000), 转信
Section 17. Style

17.1: What's the best style for code layout in C?

A: There is no one "best style," but see the full list for a few
suggestions.

17.3: Is the code "if(!strcmp(s1, s2))" good style?

A: Not particularly.

17.4: Why do some people write if(0 == x) instead of if(x == 0)?

A: It's a trick to guard against the common error of writing
if(x = 0) .

17.5: I came across some code that puts a (void) cast before each call
to printf(). Why?

A: To suppress warnings about otherwise discarded return values.

17.8: What is "Hungarian Notation"?

A: It's a naming convention which encodes information about a
variable's type in its name.

17.9: Where can I get the "Indian Hill Style Guide" and other coding
standards?

A: See the unabridged list.

17.10: Some people say that goto's are evil and that I should never use
them. Isn't that a bit extreme?

A: Yes. Absolute rules are an imperfect approach to good
programming style.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 18
发信站: 饮水思源站 (Sun Jun 25 16:39:20 2000), 转信
Section 18. Tools and Resources

18.1: I'm looking for C development tools (cross-reference generators,
code beautifiers, etc.).

A: See the full list for a few names.

18.2: How can I track down these pesky malloc problems?

A: See the full list for a list of tools.

18.3: What's a free or cheap C compiler I can use?

A: See the full list for a brief catalog.

18.4: I just typed in this program, and it's acting strangely. Can
you see anything wrong with it?

A: See if you can run lint first.

18.5: How can I shut off the "warning: possible pointer alignment
problem" message which lint gives me for each call to malloc()?

A: It may be easier simply to ignore the message, perhaps in an
automated way with grep -v.

18.7: Where can I get an ANSI-compatible lint?

A: See the unabridged list for two commercial products.

18.8: Don't ANSI function prototypes render lint obsolete?

A: No. A good compiler may match most of lint's diagnostics; few
provide all.

18.9: Are there any C tutorials or other resources on the net?

A: There are several of them.

18.10: What's a good book for learning C?

A: There are far too many books on C to list here; the full list
contains a few pointers.

18.13: Where can I find the sources of the standard C libraries?

A: Several possibilites are listed in the full list.

18.13b: Is there an on-line C reference manual?

A: Two possibilities are
http://www.cs.man.ac.uk/standard_c/_index.html and
http://www.dinkumware.com/htm_cl/index.html .

18.13c: Where can I get a copy of the ANSI/ISO C Standard?

A: See question 11.2.

18.14: I need code to parse and evaluate expressions.

A: Several available packages are mentioned in the full list.

18.15: Where can I get a BNF or YACC grammar for C?

A: See the ANSI Standard, or the unabridged list.

18.15b: Does anyone have a C compiler test suite I can use?

A: See the full list for several sources.

18.15c: Where are some collections of useful code fragments and
examples?

A: See the full list for a few sources.

18.15d: I need code for performing multiple precision arithmetic.

A: See the full list for a few ideas.

18.16: Where and how can I get copies of all these freely distributable
programs?

A: See the regular postings in the comp.sources.unix and
comp.sources.misc newsgroups, or the full version of this list,
for information.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 19
发信站: 饮水思源站 (Sun Jun 25 16:39:56 2000), 转信
Section 19. System Dependencies

19.1: How can I read a single character from the keyboard without
waiting for the RETURN key?

A: Alas, there is no standard or portable way to do this sort of
thing in C.

19.2: How can I find out how many characters are available for
reading, or do a non-blocking read?

A: These, too, are entirely operating-system-specific.

19.3: How can I display a percentage-done indication that updates
itself in place, or show one of those "twirling baton" progress
indicators?

A: The character '\r' is a carriage return, and '\b' is a
backspace.

19.4: How can I clear the screen, or print text in color, or move the
cursor?

A: The only halfway-portable solution is the curses library.

19.5: How do I read the arrow keys? What about function keys?

A: Such things depend on the keyboard, operating system, and
library you're using.

19.6: How do I read the mouse?

A: What system are you using?

19.7: How can I do serial ("comm") port I/O?

A: It's system-dependent.

19.8: How can I direct output to the printer?

A: See the full list for ideas.

19.9: How do I send escape sequences to control a terminal or other
device?

A: By sending them. ESC is '\033' in ASCII.

19.10: How can I do graphics?

A: There is no portable way.

19.11: How can I check whether a file exists?

A: You can try the access() or stat() functions. Otherwise, the
only guaranteed and portable way is to try opening the file.

19.12: How can I find out the size of a file, prior to reading it in?

A: You might be able to get an estimate using stat() or fseek/ftell
(but see the full list for caveats).

19.12b: How can I find the modification date of a file?

A: Try stat().

19.13: How can a file be shortened in-place without completely clearing
or rewriting it?

A: There are various ways to do this, but there is no portable
solution.

19.14: How can I insert or delete a line in the middle of a file?

A: Short of rewriting the file, you probably can't.

19.15: How can I recover the file name given an open file descriptor?

A: This problem is, in general, insoluble. It is best to remember
the names of files yourself as you open them

19.16: How can I delete a file?

A: The Standard C Library function is remove().

19.16b: How do I copy files?

A: Open the source and destination files and copy a character or
block at a time, or see question 19.27.

19.17: What's wrong with the call fopen("c:\newdir\file.dat", "r")?

A: You probably need to double those backslashes.

19.18: How can I increase the allowable number of simultaneously open
files?

A: Check your system documentation.

19.20: How can I read a directory in a C program?

A: See if you can use the opendir() and readdir() functions.

19.22: How can I find out how much memory is available?

A: Your operating system may provide a routine which returns this
information.

19.23: How can I allocate arrays or structures bigger than 64K?

A: Some operating systems won't let you.

19.24: What does the error message "DGROUP exceeds 64K" mean?

A: It means that you have too much static data.

19.25: How can I access memory located at a certain address?

A: Set a pointer to the absolute address.

19.27: How can I invoke another program from within a C program?

A: Use system().

19.30: How can I invoke another program and trap its output?

A: Unix and some other systems provide a popen() function.

19.31: How can my program discover the complete pathname to the
executable from which it was invoked?

A: argv[0] may contain all or part of the pathname. You may be
able to duplicate the command language interpreter's search path
logic to locate the executable.

19.32: How can I automatically locate a program's configuration files
in the same directory as the executable?

A: It's hard; see also question 19.31 above.

19.33: How can a process change an environment variable in its caller?

A: If it's possible to do so at all, it's system dependent.

19.36: How can I read in an object file and jump to locations in it?

A: You want a dynamic linker or loader.

19.37: How can I implement a delay, or time a user's response, with sub-
second resolution?

A: Unfortunately, there is no portable way.

19.38: How can I trap or ignore keyboard interrupts like control-C?

A: Use signal().

19.39: How can I handle floating-point exceptions gracefully?

A: Take a look at matherr() and signal(SIGFPE).

19.40: How do I... Use sockets? Do networking? Write client/server
applications?

A: These questions have more to do with the networking facilities
you have available than they do with C.

19.40b: How do I... Use BIOS calls? Write ISR's? Create TSR's?

A: These are very particular to a particular system.

19.40c: I'm trying to compile a program in which "union REGS" and
int86() are undefined.

A: Those have to do with MS-DOS interrupt programming.

19.41: But I can't use all these nonstandard, system-dependent
functions, because my program has to be ANSI compatible!

A: That's an impossible requirement. Any real program requires at
least a few services which ANSI doesn't define.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 21
发信站: 饮水思源站 (Sun Jun 25 16:41:00 2000), 转信
Section 20. Miscellaneous

20.1: How can I return multiple values from a function?

A: Either pass pointers to several locations which the function can
fill in, or have the function return a structure containing the
desired values.

20.3: How do I access command-line arguments?

A: Via main()'s argv parameter.

20.5: How can I write data files which can be read on other machines
with different data formats?

A: The most portable solution is to use text files.

20.6: How can I call a function, given its name as a string?

A: The most straightforward thing to do is to maintain a
correspondence table of names and function pointers.

20.8: How can I implement sets or arrays of bits?

A: Use arrays of char or int, with a few macros to access the
desired bit at the proper index.

20.9: How can I determine whether a machine's byte order is big-endian
or little-endian?

A: The usual tricks involve pointers or unions.

20.10: How can I convert integers to binary or hexadecimal?

A: Internally, integers are already in binary. During I/O, you may
be able to select a base.

20.11: Can I use base-2 constants (something like 0b101010)?
Is there a printf() format for binary?

A: No, on both counts.

20.12: What is the most efficient way to count the number of bits which
are set in an integer?

A: Many "bit-fiddling" problems like this one can be sped up and
streamlined using lookup tables.

20.13: What's the best way of making my program efficient?

A: By picking good algorithms and implementing them carefully.

20.14: Are pointers really faster than arrays? How much do function
calls slow things down?

A: Precise answers to these and many similar questions depend on
the processor and compiler in use.

20.15b: People claim that optimizing compilers are good, but mine can't
even replace i/=2 with a shift.

A: Was i signed or unsigned?

20.15c: How can I swap two values without using a temporary?

A: The "clever" trick is a ^= b; b ^= a; a ^= b; see also question
3.3b.

20.17: Is there a way to switch on strings?

A: Not directly.

20.18: Is there a way to have non-constant case labels (i.e. ranges or
arbitrary expressions)?

A: No.

20.19: Are the outer parentheses in return statements really optional?

A: Yes.

20.20: Why don't C comments nest? Are they legal inside quoted
strings?

A: C comments don't nest because PL/I's comments don't either. The
character sequences /* and */ are not special within double-
quoted strings.

20.20b: What does a+++++b mean ?

A: Nothing. It's interpreted as "a ++ ++ + b", and cannot be
parsed.

20.24: Why doesn't C have nested functions?

A: They were deliberately left out of C as a simplification.

20.24b: What is assert()?

A: It is a macro which documents an assumption being made by the
programmer; it terminates the program if the assumption is
violated.

20.25: How can I call FORTRAN (C++, BASIC, Pascal, Ada, LISP) functions
from C?

A: The answer is entirely dependent on the machine and the specific
calling sequences of the various compilers in use.

20.26: Does anyone know of a program for converting Pascal or FORTRAN
to C?

A: Several freely distributable programs are available, namely
ptoc, p2c, and f2c. See the full list for details.

20.27: Can I use a C++ compiler to compile C code?

A: Not necessarily; C++ is not a strict superset of C.

20.28: I need to compare two strings for close, but not necessarily
exact, equality.

A: See the full list for ideas.

20.29: What is hashing?

A: A mapping of strings (or other data structures) to integers, for
easier searching.

20.31: How can I find the day of the week given the date?

A: Use mktime(), Zeller's congruence, or some code in the full
list.

20.32: Will 2000 be a leap year?

A: Yes.

20.34: How do you write a program which produces its own source code as
output?

A: Here's one:

char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";
main(){printf(s,34,s,34);}

20.35: What is "Duff's Device"?

A: It's a devastatingly deviously unrolled byte-copying loop. See
the full list for details.

20.36: When will the next Obfuscated C Code Contest be held?
How can I get a copy of previous winning entries?

A: See the full list, or http://www.ioccc.org/index.html .

20.37: What was the entry keyword mentioned in K&R1?

A: It was reserved to allow functions with multiple, differently-
named entry points, but it has been withdrawn.

20.38: Where does the name "C" come from, anyway?

A: C was derived from B, which was inspired by BCPL, which was a
simplification of CPL.

20.39: How do you pronounce "char"?

A: Like the English words "char," "care," or "car" (your choice).

20.39b: What do "lvalue" and "rvalue" mean?

A: An "lvalue" denotes an object that has a location; an "rvalue"
is any expression that has a value.

20.40: Where can I get extra copies of this list?

A: An up-to-date copy may be obtained from ftp.eskimo.com in
directory u/s/scs/C-faq/. You can also just pull it off the
net; the unabridged version is normally posted on the first of
each month, with an Expires: line which should keep it around
all month. It is also posted to the newsgroups comp.answers and
news.answers . Several sites archive news.answers postings and
other FAQ lists, including this one; two sites are rtfm.mit.edu
(directory pub/usenet), and ftp.uu.net (directory usenet).

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


发信人: heavenhorse (天马), 信区: C
标 题: c programming faq 21
发信站: 饮水思源站 (Sun Jun 25 16:44:22 2000), 转信
A hypertext version of this FAQ list is available at
http://www.eskimo.com/~scs/C-faq/top.html .
An extended version has been published by Addison-Wesley
as _C Programming FAQs: Frequently Asked Questions_
(ISBN 0-201-84519-9).

Steve Summit
scs@eskimo.com

This article is Copyright 1990-1999 by Steve Summit.
Content from the book _C Programming FAQs: Frequently Asked Questions_
is made available here by permission of the author and the publisher as
a service to the community. It is intended to complement the use of the
published text and is protected by international copyright laws. The
content is made available here and may be accessed freely for personal
use but may not be republished without permission.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.21.6]


计算机等级考试和软件水平考试

饮水思源站 计算机等级考试和软件水平考试 精华区离线浏览
类型 | 标题 | 长度 | 时间
目录 | 计算机等级考试 | 10项 | 01/03/28 21:11
目录 | 软件水平考试 | 2项 | 01/03/28 20:10
文件 | Re: 四级和程序员 sufehyy | 504 | 01/03/28 14:07


计算机等级考试

饮水思源站 计算机等级考试 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 全国等级考！！ gch | 485 | 01/03/27 20:42
文件 | Re: 国家三级是否可以用C语言？？ ekin. | 542 | 01/03/27 20:42
文件 | Re: 不知三级B要求C到何程度？ arkin | 489 | 01/03/28 14:08
文件 | Re: 不知三级B要求C到何程度？ addy | 693 | 01/03/28 14:09
文件 | Re: 四级难考吗? licedar | 519 | 01/03/28 19:40
文件 | Re: 求助 kaida | 946 | 01/03/28 20:43
文件 | 全国计算机等级考3B模拟考系统说明 kaida | 1518 | 01/03/28 21:09
文件 | 99年全国计算机等级考试二级笔试试卷－基 jia | 10043 | 01/03/28 21:11
文件 | 99年全国计算机等级考试三级(A)笔试试卷 jia | 12900 | 01/03/28 21:11
文件 | 99年全国计算机等级考试三级（B）笔试试� jia | 13584 | 01/03/28 21:11


发信人: ekin.bbs@210.34.48.50 (g.ekin), 信区: C
标 题: Re: 国家三级是否可以用C语言？？
发信站: FZU_BBS (Wed Dec 23 19:07:52 1998)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
【 在 roy (歪歪) 的大作中提到: 】
: 由于本人想参加99年的全国计算机等级考试三级但不知道是否可以用
: C语言写程序不知哪位网友可以告知一二？

那要看你是报A还是B了，如果是B，上机考的就是C，
A上机考的是汇编语言。

--
※发信站 [福州大学庭芳苑BBS bbs.fzu.edu.cn] · FROM [210.34.51.178]


发信人: arkin (岭南驹), 信区: C
标 题: Re: 不知三级B要求C到何程度？
发信站: 饮水思源站 (Tue Apr 4 20:51:26 2000), 转信
我看到一题是这样的：
有一百五十个双精度浮点数，计算它们的平均值，整数部分和，小数部分和
结果输出到一个文件里。其中只要你写一个计算的子程序。我是考3a的，但也觉得
很简单，一下就弄好了。
【 在 mountain (michy) 的大作中提到: 】
rt

--

--
天马行空会有时
▓▓
直挂云帆济沧海

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.57.102]


发信人: addy (addy), 信区: C
标 题: Re: 不知三级B要求C到何程度？
发信站: 饮水思源站 (Sun Jun 4 20:54:33 2000), 转信
【 在 yifan (yifan) 的大作中提到: 】
: 【 在 arkin (岭南驹) 的大作中提到: 】
: : 我看到一题是这样的：
: : 有一百五十个双精度浮点数，计算它们的平均值，整数部分和，小数部分和
: : 结果输出到一个文件里。其中只要你写一个计算的子程序。我是考3a的，但也觉得
: : 很简单，一下就弄好了。
: : 【 在 mountain (michy) 的大作中提到: 】
: : rt
: : 简单，真的很简单。
并不是简单就会过的，我今年碰到的题看上去很简单，只要用两个for,一个if就解决了
，但是≡诙ㄒ迨菔泵挥梦薹判投ㄒ澹椭缓孟麓卧倮戳耍。。。�

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.121.135.134]


发信人: licedar (sauce~生活的味道), 信区: C
标 题: Re: 四级难考吗?
发信站: 饮水思源站 (Wed May 31 18:43:31 2000), 转信
四级很好过,
60道中文选择题, 30道英文选择题, 再加上1至2道分析题, 尤其是上机题最简单.

所以我在求职的时候那些用人单位对我的四级证书看都不看,
可惜了我200块钱, 好伤心哦.

【 在 Eyas (一树梨花压海棠) 的大作中提到: 】
: 考完三级A后感觉还可以，不知四级如何，请先辈们给点指教。谢了！

--
好机会一个个都流失了，
这个不能再没了！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.211]


发信人: kaida (Noname), 信区: C
标 题: Re: 求助
发信站: 饮水思源站 (Fri Sep 15 18:30:52 2000), 转信
去
http://www.eol.edu.cn/exam/computer/
看一看。
另： 我有3B上机考练习盘。我考过了，现在没用了。
你要的话可以给我丢小纸条。

【 在 xiaozhu (朱朱) 的大作中提到: 】
: 本人急需三级B的试题资料，有哪位大侠有有关信息，希告我！

--
▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
▏ kaida的个人主页! - Microsoft Internet Explorer －□×▏
▏ 文件(F) 编辑(E) 查看(V) 转到(G) 收藏(A) 帮助(H) e ▏
▏ ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▏�
▏ 地址è� http://202.114.98.14/~kaida ┃▼▏
▏

※ 修改:·kaida 於 Sep 15 18:32:06 修改本文·[FROM: 202.120.13.13]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.13.13]


发信人: kaida (Noname), 信区: C
标 题: 全国计算机等级考3B模拟考系统说明
发信站: 饮水思源站 (Tue Nov 7 18:16:16 2000), 转信

1.必须在UCDOS中文操作系统下运行。
校内可从ftp://202.120.25.19/pub/System/Ucdos/UCDOSmini.zip 下载。
只有220k ，但是基本的文件都有了。文件都必须解到D:\UCDOS或其它盘的
UCDOS目录下。
启动UCDOS只须在Windows里双击 UCDOS.PIF 这个快捷方式即可。
2.在CONFIG.SYS里加入
FILES=64
BUFFERS=16
DEVICE=C:\windows\HIMEM.SYS
DEVICE=C:\windows\EMM386.EXE RAM
DOS=HIGH,UMB
但是实际上有时候不加这几句话也可以正常使用，碰运气了。
3.这里提供一套不需要检查密钥盘的练习系统。
校内可从
ftp://202.120.25.19/pub/Tools/Program/等级考试模拟盘/3B/3bok.zip
下载。文件大小428k，文件必须解到根目录下，例如D:\ ，会生成 KS 和
EXAM 两个目录。
4.开始使用。
1)Double click UCDOS.PIF
2)D:\CD KS
3)D:\KS\KEY.EXE (解掉要求插入盘这一步)
4)D:\KS\ID.EXE (进入模拟考试系统)
5)D:\KS\CHO.EXE (进入选择题系统)
5.TurboC2.0 可以从
ftp://202.120.25.19/pub/Tools/Program/TurboC/TC20.zip 下载。

说明:本来是不打算解密的，我买了正版盘的。但学校机房不让带软盘，很多同
学又想在那儿做题，于是迫不得以才............

BTW: key.exe 解二级，3A，四级的密钥盘检查同样有效。

--
※ 修改:·kaida 於 Nov 7 18:21:42 修改本文·[FROM: 202.120.13.13]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.13.13]


发信人: jia (小木头), 信区: C
标 题: 99年全国计算机等级考试二级笔试试卷－基础部分和C部
发信站: 饮水思源站 (Tue Nov 14 10:47:26 2000), 转信

99年全国计算机等级考试二级笔试试卷－基础部分和C部分
2000-08-21 16:04:52
（考试时间120分钟，满分100分）
一、选择题((1)-(40)每个选项1分，(41)-(50)每个选项2分，共60分)
下列各题A)、B)、C)、D)四个有选项中，只有一个选项是正确的，请将正确选项涂写在
答题卡相应位置上，答在试卷上不得分。
（1） 微型计算机的性能主要取决于
A）内存 B）中央处理器 C）硬盘 D）显示卡
（2） 有一个数值152，（3） 它与十六进制数6A相等，（4） 那么该数值是
A）二进制数 B）八进制数 C）十进制数 D）四进制数
（5） 使用超大规模集成电路制造的计算机应该归属于
A）第一代 B）第二代 C）第三代 D）第四代
（6） 已知英文字母a的ASCII代码值是十六进制数61H，（7） 那字母子b 的ASCII
代码值是
A）34H B）54H C）24H D）64H
（8） 一片存储容量是1.44MB的软磁盘，（9） 可以存储大约140万（10） 个
A）ASCII字符 B）中文字符 C）磁盘文件 D）子目录
（11） 在MS-DOS环境中同（12） 时按下[Ctrl]和[Break]两个键，（13） 其作用是
A）终止当前操作 B）暂停当前操作 C）关机 D）热启动
（14） 将二进制数10000001转换为十进制数应该是
A）127 B）129 C）126 D）128
（15） 磁盘处于写保护状态，（16） 那么磁盘中的数据
A） 不B） 能读出，C） 不D） 能删改，E） 也不F） 能写入新数据
G） 可以读出，H） 不I） 能删改，J） 也不K） 能写入新数据
L） 可以读出，M） 可以删改，N） 但不O） 能写入新数据
P） 可以读出，Q） 不R） 能删改，S） 但可以写入新数据
（17） 微型机启动后，（18） DOS提示符是C：\>，（19） 现提示符变为C:\USER>，（
20） 则说明刚
执行过命令
A)PROMPT B)PROMPT USER C)PROMPT $P$G D)CD USER
(10)MS-DOS文件系统目录的组织形式属于
A)关系型结构 B)网络型结构 C)树型结构 D)直线型结构
（11）应用软件系统TH的总容量大约1MB，其主要程序文件存放在C：\TH
目录中，而数据文件存放在C：\TH\DATA目录中。如要将它们完整地
复制到A盘，应该使用的命令是
A）XCOPY C:\TH A:\ B)XCOPY C:\TH A:\ /S
C) XCOPY C:\TH A:\ /M D)XCOPY C:\TH A:\ /P
（12）执行COPY A.+B.TXT这个DOS命令后，得到的磁盘文件是
A)A.TXT B)B.TXT C)AB.TXT D)A+B.TXT
（13）在WINDOWS中，将一个应用程序窗口最小化之后，该应用程序
A）仍在后台运行 B）暂时停止运行 C）完全停止运行 D）出错
（14）CD-ROM属于
A）感觉媒体 B）表示媒体 C）表现媒体 D）存储媒体
（15）在因特网（Internet）中电子公告板的缩写是
A）FTP B）WWW C）BBS D）E-mail
（16）设x、y、z和k都是int型变量，则执行表达式：x=（y=4，z=16，k=32）
后，x的值为
A）4 B）16 C）32 D）52
（17）设有如下的变量定义：
int i=8，k，a，b；
unsinged long w=5
double x=1，42，y=5.2
则以下符合C语言语法的表达式是
A）a+=a-=（b=4）*（a=3） B）x%（-3）；
C）a=a*3=2 D）y=float（i）
（18）假定有以下变量定义：
int k=7，x=12；
则能使值为3 的表达式是
A）x%=（k%=5） B）x%=（k-k%5）
C）x%=k-k%5 D）（x%=k）-（k%=5）
（19）以下叙述中正确的是
A） 输入项可以是一个实型常量，B） 如
scanf（“%f，”3.5）;
C） 只有格式控制，D） 没有输入项，E） 也能正确输入数据到内存，F） 例如：
scanf（“a=%d，b=%d”）；
G） 当输入一个实型数据时，H） 格式控制部分可以规定小数点后的位数，I） 例如：

scanf（“%4.2f”，&f）；
J） 当输入数据时，K） 必须指L） 明变量地址，M） 例如：
scanf（“%f”，&f）；
（20）设x和y均为int型变量，则以下语句：x+=y；y=x-y；x-=y；的功能是
A） 把x和y按从大到小排列
B） 把x和y按从小到大排列
C） 无确定结果
D） 交换x和y中的值
（21）以下程序的输出结果是
A）10 10 B）12 12 C）11 10 D）11 13
main（ ）
{ int a=12，b=12；
printf（“%d %d\n”，--a，++b）;
}
（22）以下程序运行后，输出结果是
A）cde B）字符c的ASCII码值
C）字符c的地址 D）出错
main（ ）
{ char *s=“abcde”；
s+=2；
printf（“%ld\n”，s）；
}
（23）以下程序输出结果是
A）7 B）6 C）5 D）4
main（ ）
{ int m=5；
if（m++>5）printf(“%d\n”，m);
else printf(“%d\n”，m--);
}
（24）当a=1，b=3，c=5，d=4时，执行下面一段程序后，x的值为
A）1 B）2 C）3 D）6
if（a，则输出为
A）ABCdef B）abcDEF C）abc D）DEF
#include
main( )
{ char ch;
while((ch=getchar( ))!=’\n’)
{ if(ch>=’A’ && ch<=’Z’)ch=ch+32;
else if(ch>=’a’ && ch<’z’)ch=ch+32;
printf(“%c”，ch);
}
printf(“\n”);
}
（26）下面能正确进行字符串赋值操作的语句是
A）char s[5]={“ABCDE”}； B）char s[5]={‘A’、’B’、’C’、’D’、’E’};

C) char *s；s=“ABCDEF”； D）char *s； scanf（“%s”，s）；
（27）当执行以下程序段时
A）循环体将执行一次
B）循环体将执行两次
C）循环体将执行无限次
D）系统将提示有语法错误
x=-1；
do { x=x*x；} while（！x）；
（28）执行以下程序后，输出的结果是
A）-1 B）1　　　Ｃ）８　　　Ｄ）0
main（ ）
{ int y=10；
do {y--；} while（--y）；
printf（“%d\n”，y--）;
}
（29）在下列选项中，没有构成死循环的程序段是
A) int i=100
while (1)
{i=i%100+1;
if(i>100)break;
}
B) for(;;);
C)int k=1000;
do{++k} while (k>=1000)
D)int s=36
While(s);--s;
（30）执行语句：for（i=1；i++<4;）后;变量i的值是
A)3 B)4 C)5 D)不定
（31）以下程序运行后，如果从键盘上输入ABCDE<回车>，则输出结果为
A）8 B）7 C）6 D）5
#include
#include
func(char str[ ] )
{ int num =0;
while(*(str+num!=’’) num+ +;
return(num);
}
main( )
{char str[10]，*p=str;
gets(p); printf(“%d\n”，func(p));
}
（32）运行以下程序后，如果从键盘上输入china#<回车>，则输出结果为
A）2，0 B)5，0 C)5，5 D)2，5
#include
main( )
{int v1=0，v2=0;
char ch;
while((ch=getchar( ))!=’#’)
switch(ch)
{case ‘a’;
case ‘h’;
default; v1+ +;
case ‘0’; v2+ ;+
}
printf(“%d，%d\n”，v1，v2);
}
（33）若以下程序所生成的可执行文件名不；当打入以下命令执行该程序时；
FILE1 CHINA BEIJING SHANGHAI
程序的输出结果是
A） CHINA BEIJIANG SHANGHAI
B） FILE1 CHINA BEIJING
C） C B S
D） F C B
main（int argc，char *argv[]）
{ while（argc-->0）
{ ++argv; printf(“%s”，*argv);}
}
（34）下面程序的运行结果是
A)12ba56 B)6521 C)6 D)62
main()
{ char ch[7]={“65ab21”};
int i，s =0
for(i=0;ch[i]>=’0’&&ch[i]<’9’;i+=2)
s=10*s+ch[i]-‘0’
printf(“%d\n”，s);
}
（35）运行下面的程序，如果从键盘上输入:
ab <回车>
c <回车>
def <回车>
则输出结果为
A) a B)a C)ab D)avcdef
b b c
c c d
d d
e
f
#include
#define N 6
main( )
{ char c[N];
int i=o
for( ;i
ss(char *s)
{ char *p=s;
while(*p)p++;
return(p-s);
}
main( )
{ char *a=”abded”;
int i;
i=ss(a);
printf(“%d\n”，i);
}
（37）以下程序运行后，输出结果是
A）8，15 B)8，16 C)8，17 D)8，8
func（int a，int b）
{ static int m=0，i=2；
i+=m+1；
m=i+a+b
return（m）；
}
main（）
{ int k=4，m=1，p；
p=func（k，m）；printf（“%d，”，p）；
p=func（k，m）；printf（“%d\n”，p）；
}
（38）以下程序运行后，输出结果是
A）49.5 B)9.5 C)22.0 D)45.0
#include
#define PT 5.5
#define S(x) PT*x*x
main( )
{ int a=1，b=2;
printf(“%4.1f\n”，S(a+b))
}
（39）以下程序运行后，输出结果是
A)ABCDEFG B)CDG C)abcdefgh D)abCDefGh
main( )
{ static char a[]=”ABCDEFGH”，b[]=”abCDefGh”;
char p1，p2;
int k;
p1=a; p2=b;
for(k=0;k<-7;k++)
if(*(p1+k)= =*(p2+k))
printf(“%c”，*(p1+k));
printf(“\n”);
}
（40）以下程序执行后，a的值是
A）4 B）1 C）0 D）运行时出错，无定值
mian()
{ int a，k=4，m=6，*p1=&k，*p2=&m;
a=p1= =&m;
printf(“%d\n”，a);
}
（41）以下程序运行后，输出结果是
A）84 B）99 C）95 D）44
int d=1；
fun（int p）
{ int d=5；
d+=p++；
printf（“%d”，d）；
}
main（）
{int a=3；
fun（a）；
d+=a++；
printf（“%d\n”，d）;
}
（42）以下程序运行后，输出结果是
A)6385 B)22 C)33 D)693825
main()
{char ch[2][5]={“693”，”825”}，*p[2];
int i，j，s=0;
for(i=0;i<2;i++) p[i]=ch[i];
for(i=0;i<2，i++)
for(j=0;p[i][j]>=’0’ && p[i][j]<=’9’;j=2)
s=10*s+p[i][j]=’0’
printf(“%d\n”，s);
}
（43）以下程序运行后，输出结果是
A)1 B)7 C)9 D)11
fut(int **s， int p[2][3])
{**s=p[1][1];}
main()
{int a[2][3]={1，3，5，7，9，11}，*p;
p=(int *)malloc(sizeof(int));
fut(&p，a);
printf(“%d\n”，*p);
}
（44）设有如下定义：
int a=1，b=2，c=3，d=4，m=2，n=2；
则执行表达式：（m=a>b）&&(n=c>d)后，n的值为
A)1 B)2 C)3 D)0
（45）在执行以下程序时，为了使输出结果为，t=4则给a和b输入的值应满
足的条件是
A)a>b B)aa>b
main( )
{ int s，t，a，b;
scanf(“%d，%d”，&a，&b);
s=1; t=1;
if(a<0)s=s+1;
if(a>b)t=s+1;
else if(a= =b)t=5;
else t=2*s;
printf(“t=%d\n”，t);
}
（46）以下程序的输出结果是
A)x=4 B)x=8 C)x=6 D)x=12
main( )
{ int i，j，x=0;
for(i=0，i<2;i++)
{ x ++;
for(j=0;j<3;j++)
{ if(j%2)continue;
x++;
}
x++
}
printf(“x=%d\n”，x);
}
（47）以下程序运行后，输出结果是
A）1234567 B)7654321 C)1711717 D)7177171
#include
#include
fun(char s w， int n)
{ char t，* s1，* s2;
s1=w;s2=w+n-1;
while(s1，则输出结果为
A)m=3 B)m=2 C)m=1 D)m=0
main ( )
{int m，n;
printf{“Enter m，n:”}; scanf(“%d%d，&m，&n”);
while(m!=n)
{while(m>n)m-=n;
while(n>m)n-=m;
}
printf(“m=%d\n”，m);
}
（49）以下程序运行后，如果从键盘上输入：
book<回车>
book<空格><回车>
则输出结果是
A)*8 B)#9 C)#6 D)*9
#include
main()
{char a1[80]，a2[80]，*s1=a1，*s2=a2;
gets(s1); gets(s2);
if(!strcmp(s1，s2)) printf(“*”);
else printf(“#”);
printf(“%d\n”，strlen(strcat(s1，s2)))
}
A)10000 B)10010 C)00110 D)10100
main( )
{ int y=18，i=0，j，a[8];
do
{ a[i]=y%2;i++;
y=y\2;
} while(y>1=1);
for(j=i-1;j>=0;j--) printf(“%d”，a[j]);
printf(“\n”)
}
二、填空题（每空2分，共40分）
请将每空的正确答案写在答题卡 1 至 20 序号的横线上，答在试卷上不得分。
（1）DOS中的自动批处理文件的全名是 1 。
（2）在DOS启动盘中，除COMMAND.COM外，还有两个必备的系统文
件，它们是MSDOS.SYS(或IBMDOS.COM)与 2 。
（3）在DOS下，要将当前目录中AB.TXT文件设置为只读属性，应该使用的
完整命令行是 3 。
（4）在DOS下，要查看当前目录中所有批处理文件的总字节数，应该使用的
完整命令行是 4 。
（5）计算机病毒除有破坏性、潜伏性和激发性外，还有一个最明显的特性
是 5 。
（6）若想通过以下输入语句使a中存放字符串1234，b中存放字符5，则
输入数据的形式应该是 6 。
.
.
.
char a[10]，b;
scanf(“a=%s b=%c”，a，&b);
.
.
.
（7）下面程序的输出结果是 7 。
char b[]=”ABCD”;
main( )
{ char *chp;
for(chp=b; *chp; chp+=2) printf(“%s”，chp);
printf(“\n”);
}
（8）下面程序的输出结果是 8 。
#define MAX 3
int a[MAX];
main( )
{ fun1( ); fun2(a); printf(“\n”);}
fun1( )
{ int k，t=0;
for(k=0;k
FILE *fp;
main( )
{ int i，j;
if((fp=fopen( 19 ，”wb”))= =NULL)exit(0);
for(i=0;i<10;i++
{ scanf(“%d”，&j);
fwrite(&j，sizeof(int)，1， 20 );
}
fclose(fp);
}
[an error occurred while processing this directive]

--

][ ]L_L `-,C
. ][ , ~~@@=~ `-]C__z,
_a' ]P ~@ _%][~-L_ e-=t@@__`'
"" ~-[ )~" ][ `~~~ .d~ "@,
`"

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: argo.zsu.edu.cn]


发信人: jia (小木头), 信区: C
标 题: 99年全国计算机等级考试三级(A)笔试试卷
发信站: 饮水思源站 (Tue Nov 14 10:55:13 2000), 转信

99年全国计算机等级考试三级(A)笔试试卷
2000-08-21 16:05:34
（考试时间120分钟，满分100分）
一. 选择题：（(1)）～（40）题每题1分，（41）～（55）题每题2分，共70分）
下列各题A）、B）、C）、D）四个选项中，只有一个选项是正确的，请将正确选项涂写
在答题卡相应位置上，答在试卷上不得分。
（1）下面关于微处理器的叙述中，不正确的是：
A）微处理器通常以单片集成电路制成
B）它至少具有运算和控制功能，但不具备存储功能
C）Pentium是目前PC机中使用最广泛的一种微处理器
D）Intel公司是国际上研制、生产微处理器最有名的公司
（2）下面关于PC机CPU的叙述中，不正确的是：
A）为了暂存中间结果，CPU中包含几十个甚至上百个寄存器，用来临时存放数据
B）CPU是PC机中不可缺少的组成部分，它担负着运行系统软件和应用软件的任务
C）所有PC机的CPU都具有相同的机器指令
D）CPU至少包含1个处理器，为了提高计算速度,CPU也可以由2个、4个、8个甚至更多个
处理器组成
（3）微型计算机主存储器的基本编址单元的长度为：
A）32位 B）l位 C）8位 D）16位
（4）长度相同但格式不同的2种浮点数，假设前者阶码长、尾数短，后者阶码短、尾数
长，其它规定均相同，则它们可表示的数的范围和精度为：
A）两者可表示的数的范围和精度相同
B）前者可表示的数的范围大但精度低
C）后者可表示的数的范围大且精度高
D）前者可表示的数的范围大且精度高
（5）所谓“变号操作”是指将一个整数变成绝对值相同但符号相反的另一个整数。假设
使用补码表示的8位整数X=10010101，则经过变号操作后结果为：
A）01101010 B）00010101
C）11101010 D）01101011
（6）汉字的区位码、国标码和机内码（又称内码）是3个不同的概念，假设某个汉字的
区号是30（十进制）、位号是63（十进制），则在PC机中它的内码（十六进制）是：
A）BEDF B）3E5F
C）9EBF D）BOE3
（7）下面关于计算机图形和图像的叙述中，正确的是：
A）图形比图像更适合表现类似子照片和绘画之类的有真实感的画面
B）一般说来图像比图形的数据量要少一些
C）图形比图像更容易编辑、修改
D）图像比图形更有用
（8）分时操作系统的主要特点是：
A）个人独占计算机资源 B）自动控制作业运行
C）高可靠性和安全性 D）多个用户共享计算机资源
（9）下面关于计算机病毒的叙述中，正确的叙述是：
A）计算机病毒有破坏性，它能破坏计算机中的软件和数据，但不会损害机器的硬件
B）计算机病毒有潜伏性，它可能会长时间潜伏，遇到一定条件才开始进行破坏活动
C）计算机病毒有传染性，它能通过软磁盘和光盘不断扩散，但不会通过网络进行传播
D）它是开发程序时未经彻底测试而附带的一种寄生性的计算机程序，它能在计算机系统
中生存和传播
（10）对线性表，在下列哪种情况下应当采用链表表示？
A）经常需要随机地存取元素
B）经常需要进行插入和删除操作
C）表中元素需要占据一片连续的存储空间
D）表中元素的个数不变
（11）字符A、B、C依次进入一个栈，按出栈的先后顺序组成不同的字符串，至多可以组
成多少个不同的字符串？
A）5 B）4 C）6 D）1
（12）设有一个用数组Q［1..m」表示的环形队列，约定f为当前队头元素在数组中的位
置，r为队尾元素的后一位置（按顺时针方向），若队列非空，则计算队列中元素个数的
公式应为：
A）r-f B）（m+r-f） mod m
C）（m-r+f）mod m D）（m-r-f） mod m
（13）对数据组R[1..n]中的n个元素进行排序的某一种方法描述如下：
step1：令h=n；
step2：进行h-1次比较，从R[1]，R[2]，…，R[h]中找出最大的元素R[i]（1≤i≤h）；

step3：若i≠h，则交换R[i]和R[h]
step4：令h=h-1；
step5：若h=1，则排序完成，否则转向step2。
对上述排序方法，下列选项中不正确的是：
A）排序过程中，元素的交换次数至少为0次
B）排序过程中，元素的交换次数至多为n-1次
C）方法是稳定的
D）方法是不稳走的
（14）对上题中描述的排序方法，下列选项中正确的是：
A）排序过程中，比较的次数与元素的初始排列顺序无关
B）排序过程中，比较的次数与元素的初始排列顺序有关
C）确定数组中最大元素需要比较 次
D）确定数组中最小元素需要比较n-1次
（15）对一个排好序的线性表，用二分法检索表中的元素，被检索的表应当采用哪种存
储表示？
A）顺序存储 B）链接存储 C）散列法存储 D）存储表示不受限制
（16）假定中根遍历二叉树的定义如下：若二叉树为非空二叉树，则中根遍历根的右子
树；访问根结点；中根遍历根的左子树。按此定义遍历下图所示的二叉树，遍历的结果
为：
A）DBEAFHGC A
B）CGHFADBE B C
C）EBDAGHFC E D F
D）FHGCADBE G
H
（17）具有指令流水线结构的CPU，一般情况下指令的执行时间主要取决于：
A）指令执行的步骤 B）CPU有无等待状态
C）CPU的时钟周期 D）CPU内的cache存储器大小
（18）在具有PCI总线的奔腾机中，二级cache存储器经常通过cache控制器挂在
A）ISA总线（AT总线）上 B）CPU局部总线上
C）PCI总线上 D）EISA总线上
（19）作为现行PC机的主要系统总线是：
A）ISA总线（AT总线） B）PCI总线和ISA总线
C）EISA总线 D）PCI总线
（20）CPU通过接口电路向液晶显示器输出数据时, 在接口电路中
A）数据可以直接输出到显示器 B）数据只需经过三态门输出到显示器
C）数据经反相器后输出到显示器 D）数据经锁存后输出到显示器
（21）当并行接口芯片8255A被设定为方式2时，其工作的I/O口
A）仅能作输入口使用
B）仅能作输出口使用
C）既能作输入口、也能作输出口使用
D）仅能作不带控制信号的输入口或输出口使用
（22）某显示器的分辩率为1024*768，表示像素颜色的位宽为16bit，则应配置的显示存
储器容量一般为：
A）4MB B）2MB C）1Mb D）8MB
（23）现行PC机中打印机与主机的接口标准大多采用
A）RS-232-C B）Centronics C）IDE D）IEEE-488
（24）在目前流行的大多数奔腾机中，硬盘一般是通过硬盘接口电路连接到：
A）CPU局部总线 B）PCI总线
C）ISA总线（AT总线） D）存储器总线
（25）假设V1和V2是用DW定义的变量，下列指令中正确的是：
A）MOV V1,20H B）MOV V1，V2
C）MOV AL,V1 D）MOV 2000H，V2
（26）在80386以上的微处理器指令系统中，PUSH EAX指令的目的操作数寻扯方式是：
A）立即寻址 B）寄存器寻址
C）寄存器间接寻址 D）存储器直接寻址
（27）下列那条指令不合法？
A）IN AX,0278H B） RCR DX,CL
C）CMPSB D） RET 4
（28）假设AX和BX寄存器中存放的是有符号整数，为了判断AX寄存器中的数据是否大于
BX寄存器中的数据，应采用下面哪一种指令序列？
A）SUB AX，BX B）SUB AX，BX C）CMP AX,BX D）CMP AX，BX
JC label JNC label JA label JG 1abel
注：label表示条件转移指令的目标地址
（29）下列指令经汇编后，机器指令代码最长的是：
A）MOV AX，0 B）SUB Ax，AX
C）XOR AX, AX D）MUL BX
（30）为了使MOV AX，vAR指令执行后，AX寄存器中的内容为4142H，下面哪一种数据定
义会产生不正确的结果？
A）VAR DW 4142H B）VAR DW 16706
C）VAR DB 42H，41H D）VAR BW，‘AB’
（31）在下列指令中，隐含使用AL寄存器的指令有几条？
SCASB； XLAT； MOVSB； DAA； NOP； MUL BH；
A）1条 B）2条 C）4条 D）5条
（32）根据下面提供的PC机内存中的数据，lNT 11H中断服务程序的人口地址是什么
0000：0040 B3 18 8A CC 4D F8 00 F0--41 F8 00 F0 C5 18 8A CC
0000：0050 39 E7 00 F0 A0 19 8A CC--2E E8 00 F0 D2 EF 00 F0
A）4DF8:00F0 B）F000:F840
C）A019: 8ACC D）CC8A:19A0
（33）若（AX）＝0122H，四个标志位CF、SF、ZF、OF的初始状态为0，执行指令
SUB AX,0FFFH后，这四个标志位的状态是：
A）（CF）＝0，（SF）= 0，（ZF）= 0, （OF）= 0
B）（CF）＝1，（SF）= 1，（zF）= 0, （OF）= 0
C）（CF）＝0，（SF）= 0，（ZF）= 1, （OF）= 1
D）（CF）＝1，（SF）= 1，（ZF）= 1, （OF）= 1
（34）执行下列三条指令后、A寄寄存器中的内容是多少？
MOV AX，'8'
ADD AL，'9'
AAA
A）0017H B）0077H C）0107H D）0071H
（35）微机化仪表中，若全部采用CMOS逻辑器件，则其噪声容限约为采用TTL逻辑器件时
的几倍？
A）5倍 B）3倍 C）2倍 D） 1倍
（36）微机控制系统中的监控定时器也称为：
A）绝对时钟 B）相对时钟
C）82531PIT D）看门狗（watchdog）
（37）数字滤波算法中的程序判断算法也称为：
A）算术平均滤波算法 B）递推平均算法
C）限幅滤波算法 D）中位滤波算法、
（38）过程数字量输入／输出通道中，为抑止因共阻抗耦合所产生的干扰，采取的主要
措施是：
A）光电隔离 B）数字滤波 C）模拟滤波 D）接地
（39）计算机网络最突出的优点是：
A）计算精度高 B）内存容量大
c）运算速度快 D）连网的计算机能够相互共享资源
（40）计算机网络分为局域网、城域网与广域网，其划分的依据是：
A）数据传输所使用的介质 B）网络的作用范围
C）网络的控制方式 D）网络的拓扑结构
（41）F=（A＋B）（A＋C）＋B的反函数是：
A）Ａ＋Ｂ
B）ＡＢ
C）Ａ＋Ｂ
D）Ａ＋ＢＣ
（42）数字视频的数据量非常大，VCD使用MPEG-1对视频信息进行压缩编码后，每秒钟的
数码率大约是：
A）150Kbps B）64Kbs C）10Mbps D）1.2Mbps
（43）在进程运行过程中，一个进程的状态会发生变化，下列哪种变化是不可能发生的
？
A）就绪→运行 B）就绪→等待 C）运行→就绪 D）运行→等待
（44）UNIX操作系统区别于WINDOWS95的主要特点是：
A）具有多用户分时功能， B）提供图形用户界面
C）文件系统采用多级目录结构 D）提供字符用户界面
（45）设二叉树根结点的层次为0，一棵深度（高度）为k的满二叉树和同样深度的完全
二叉树各有f个结点和c个结点，下列关系式不正确的是：
A）f＞＝c B）c＞f C）f=2k+1-1 D）C>2k-1
（46）用二分法查找一个长度为10的、排好序的线性表，查找不成功时，最多需要比较
多少次？
A）5 B）2 C）4 0）1
（47）在现行PC机中，常用存储器地址线中的低10位作输入／输出口地址线。设某接口
芯片内部有16个端口，该接口芯片的片选信号由地址译码器产生，则地址译码器的输入
地址线一般应为：
A）全部10位地址线 B）其中的高8位地址线
C）其中的高6位地址线 D）其中的高4位地址线
（48）8237DMA本身有16位地址线，每个通道一次可传输64K字节，如定义64KB为1页，并
在8237与主机连接的控制电路中增加12位页地址寄存器，其寄存器的12位页地址作为它
的高12位地址，此时8237能寻址的内存容量为：
A）32MB B）64MB C）128MB D）256MB
（49）采用SCSI接口时，一块SCSI主接口卡可以连接含有SCSI协议标准控制器的设备为
：
A）1个 B）2个 C）7个 D）8个
（50）在一个多主STD总线系统中，使用邮箱通信法，可实现各个多主CPU模板问的信息
传送，所谓“邮箱”是指：
A）各CPU芯片内部的RAM B）高速缓冲存储器（cache）
C）各多主CPU模板上的SDRAM D）系统存储器
（51）测控微机主机模板上，采用局部总线技术的作用是：
A）节省系统总线的带宽 B）提高抗干扰能力
C）抑制总线终端反射 D）构成紧耦合系统
（52）测控系统中所采用的高质量的D／A转换器，其非线性误差通常在下列哪个误差范
围之内？
A）±2LSB B）±1LSB C）±1/2 LSB D）±1/4 LSB
（53）微机测控系统硬件标准化设计的关键是采用：
A）标准化的CPU B）标准化的数字逻辑器件
C）标准化的模拟电路器件 D）标准化的总线结构及标准通信协议
（54）数据通信中数据传输速率是最重要的性能指标之一，它指单位时间内传送的二进
制数据位数，常用的计量单位是：
A）Kb／s B）Byte／s C）MB／s D）KB／s
（55）双绞线由两根相互绝缘的、绞合成匀称的螺纹状的导线组成，下列关于双绞线的
叙述中，不正确的是：
A）它的传输速率达10Mb／s～100Mb／s，甚至更高，传输距离可达几十公里甚至更远
B）它既可以用于传输模拟信号，也可以用于传输数字信号
C）与同轴电缆相比，双绞线易受外部电磁波的干扰，线路本身也产生噪声，误码率较高

D）通常只用作局域网通信介质
二. 填空题：（每空2分，共30分）
请将每空的正回答案写在答题卡 1 ～ 15 序号的横线上，答在试卷上不得分，
（1）PC机硬件在逻辑上主要由CPU、主存储器、辅助存储器、输入／输出设备与 1 五类
主要部件组成。
（2）下图门电路所输出的逻辑函数F= 2 。
A
B &—
F
B
A
（3）Windows操作系统提供了 3 并行处理能力，它可以使多个应用程序同时运行。
（4）软件测试中，根据程序内部逻辑结构设计测试用例的方法称为 4 法测试。
（5）如果一棵哈夫曼（Huffmam）树共有9个结点，则其中的叶子结点的个数是 5 个。

（6）设森林F由n棵树组成，它的第一棵树，第二棵树，...，第n棵树分别有t1，t2，…
，和、tn个结点，则与森林F对应的二叉树中，根结点的左子树有 6 个结点。
（7）CRT显示器上构成图像的最小单元或图像中的一个点称为 7 。
（8）现行24速光驱在读出光盘上存放的软件时，每秒钟传输的数据为 8 KB。
（9）阅读下面的汇编语言程序，填充，使程序能按预定的设计要求正常执行：
DSEG SEGMENT
ARRAY DB 34H, 56H, 23H，70H，96H
CNT DW $-ARRAY
DSEG ENDS
SSEG SEGMENT PARA STACK ‘STACK’
DB 256 DUP（0）
SSEG ENDS
CSEG SEGMENT
ASSUME CS：CSEG，DS：DSEG，SS：SSEG
START： MOV AX.DSEG
MOV DS.AX
MOV SI.OFFSET ARRAY
MOV CX，CNT
CLD
NEXT： LODSD
MOV BL, AL
AND AL, 0F0H
PUSH CX
MOV CL，4
SHR AL，CL
9
OR AL，30H
CALL DISP
MOV AL，BL
AND AL，0FH
OR AL，30H
CALL DISP
DEC CX
JCXZ DONE
MOV AL，‘，’
CALL DISP
JMP NEXT
DONE： MOV AH，4CH ; 终止当前进程，返回调用进程
INT 21H
DlSP： MOv AH, 14 ；写字符到当前光标位置，光标前进一格
INT 10H
RET
CSEG ENDS
END START
（10）在保证第（9）题程序功能不变的情况下，程序中的MOV SI,OFFSET ARRAY指令可
以用指令（仅一条） 10 替代。
（11）在第（9）题程序执行结束后，屏幕上显示的内容是 11 。
（12）一个由8位单片机构成的测控装置，采用线性温度传感器构成其测温表计，量程为
500 OC～800 OC，设装置获取一温度数据为55（十六进制），则对应的温度值（十进制
）为
12 OC。
（13）A／D转换器的量化误差以它的一个单位分辨率量度，则12位A／D转换器的量化误
差为 13 。
（14）为了实现计算机系统的互连，ISO开放系统互连参考模型把整个网络的通信功能划
分为7个层次，每个层次完成各自的功能，通过各层间的接口和功能的组合与其相邻层连
接，从而实现不同系统之间、不同结点之间的信息传输。OSI参考模型中的7个层次从高
层到低层分别是：应用层、表示层、会话层、运输层、网络层、 14 和物理层。
（15）计算机网络的发展非常迅速，目前正在向B-ISDN的方向演变。其中B表示 15 。指
网络的传输速率非常高，能达到几十或几百Mb／S，甚至达到几十Gb／s；ISDN表示“综
合业务”，是指将话音传输、图像传输、数据传输等多种业务综合到一个网络中，这样
做成本较低而且适合于传送多媒体信息。
1999年
全国计算机等级考试三级(A)笔试试卷
答案及评分标准
一. 选择题：（(1)）～（40）题每题1分，（41）～（55）题每题2分，共70分）
1 2 3 4 5 6 7 8 9 10
B C C B D A C D B B
11 12 13 14 15 16 17 18 19 20
A B C A A B C B B D
21 22 23 24 25 26 27 28 29 30
C B B B A C A D A C
31 32 33 34 35 36 37 38 39 40
C B B C B D C A D B
41 42 43 44 45 46 47 48 49 50
B D B A B C C D C D
51 52 53 54 55 56 57 58 59 60
A C D A A
二. 填空题：（每空2分，共30分）
1、总线(或系统总线)
2、ＡＢ＋ＡＢ
3、多任务（或多进程）
4、白盒法（或白箱法）
5、5
6、t1-1
7、像素
8、3600
9、POP CX
10、LEA SI,ARRAY
11、34,56,23,70,96
12、600
13、±1/8192（或±0.0122%FSR或±0.0122%（满量程）），未加±号得1分。
14、数据链路层（或链路层）
15、带宽
[an error occurred while processing this directive]

--

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: argo.zsu.edu.cn]


发信人: jia (小木头), 信区: C
标 题: 99年全国计算机等级考试三级（B）笔试试卷
发信站: 饮水思源站 (Tue Nov 14 10:56:14 2000), 转信

99年全国计算机等级考试三级（B）笔试试卷
2000-08-21 16:06:19
（考试时间120分钟，满分100分）
一.选择题：（每题1分，共60分）
下列各题A）、B）、C）、D）四个选项中，只有一个选项是正确的，请将正确选项涂写
在答题卡相应位置上，答在试卷上不得分。
（1）地址码长度为二进制24位时，其寻址范围是
A）512KB B）1MB C）24MB D）16MB
（2）编译程序出现的计算机时期是
A）第一代 B）第二代 C）第三代 D）第四代
（3）80386微处理器的实存容量为
A）64KB B）512KB C）1MB D）2MB
（4）当前奔腾（Pentium）微处理器的工作主频率通常为
A）10.5MHz B）35MHz
C）333MHz D）1000MHz
（5）采用精简指令集（RISC）技术的微处理器是
A）8086 B）MC6800 C）80386 D）奔腾
（6）PROM存储器的功能是
A）允许读出和写入 B）只允许读出
C）允许编程一次和读出 D）允许编程多次和读出
（7）在模拟量到数字量转换系统中，低通滤波器的作用是
A）检测生产过程中的现场参数 B）抑制电信号中的干扰
C）将传感器的信号放大 D）对若干个输入信号进行切换
（8）在软盘存储器中，软盘适配器是
A）软盘驱动器与CPU进行信息交换的通道口
B）存储数据的介质设备
C）将信号放大的设备
D）抑制干扰的设备
（9）以下数据结构中哪一个是线性结构？
A）有向图 B）栈 C）线索二叉树 D）B树
（10）单链表的每个结点中包括一个指针link，它指向该结点的后继结点。现要将指针
q指向的新结点插入到指针p指向的单链表结点之后，下面的操作序列中哪一个是正确的
？
A）q:=p^.linK; P^.link:=q^.linK
B）p^.link:=q^.link; q:=P^.linK
C）q^.link:=p^.link; p^.link:=q;
D）p^.link:=q; q^.link:=p^,link
（11）以下哪一个不是队列的基本运算？
A）从队尾插入一个新元素
B）从队列中删除第i个元素
C）判断一个队列是否为空
D）读取队头元素的值
12-14题基于下面的叙述：某二叉树结点的对称序序列为A、B、C、D、E、F、G，后序序
列为B、D、C、A、F、G、E。
（12）该二叉树结点的前序序列为
A）E、G、F、A、C、D、B B）E、A、C、B、D、G、F
C）E、A、G、C、F、B、D D）E、G、A、C、D、F、B
（13）该二叉树对应的树林包括多少棵树？
A）1 B）2 C）3 D）4
（14）该二叉树对应的树林结点的层次次序序列为
A）E、G、F、A、C、D、B B）E、A、C、B、D、G、F
C）E、A、G、C、F、B、D D）E、G、A、C、D、F、B
（15）下面关于图的存储的叙述中正确的是
A）用相邻矩阵法存储图，占用的存储空间大小只与图中结点个数有关，而与边数无关
B）用相邻矩阵法存储图，占用的存储空间大小只与图中边数有关，而与结点个数无关
C）用邻接表法存储图，占用的存储空间大小只与图中结点个数有关，而与边数无关
D）用邻接表法存储图，占用的存储空间大小只与图中边数有关，而与结点个数无关
（16）对线性表进行二分法查找，其前提条件是
A）线性表以顺序方式存储，并且按关键码值排好序
B）线性表以顺序方式存储，并且按关键码值的检索频率排好序
C）线性表以链接方式存储，并且按关键码值排好序
D）线性表以链接方式存储，并且按关键码值的检索频率排好序
（17）下列哪一个关键码序列不符合堆的定义？
A）A、C、D、G、H、M、P、Q、R、X
B）A、C、M、D、H、P、X 、G、0、R
C）A、D、P、R、C、Q、X 、M、H、G
D）A、D、C、M、P、G、H、X 、R、Q
（18）对n个记录的文件进行快速排序，所需要的辅助存储空间为
A）O（1） B）O（1og2n） C）O（n） D） O（n2）
（19）下列哪一条指令只能在管态下执行？
A）读时钟日期 B）访管指令
C）屏蔽中断指令 D）取数指令
（20）在进程状态转换时，下列哪一种状态转换是不可能发生的？
A）就绪态→运行态 B）运行态→就绪态
C）运行态→等待态 D）等待态→运行态
（21）假设就绪队列中有10个进程，系统将时间片设为200ms， CPU进行进程切换要花费
10ms。则系统开销所占的比率约为
A）l％ B）5％ C）10％ D）20％
（22）通过破坏产生死锁的四个必要条件之一，可以保证不让死锁发生，其中采用资源
有序分配法，是破坏
A）互斥条件 B）不可剥夺条件 C）部分分配条件 D）循环等待条件
（23）在下列操作系统的各个功能组成部分中,哪一个不需要有硬件的支持？
A）进程调度 B）时钟管理 C）地址映射 D）中断系统
（24）下列各种操作的时间中，哪一个不属于活动头硬盘的存取访问时间？
A）寻道时间0 B）旋转延迟时间 C）定位时间 D）传送时间
（25）对于下列文件的物理结构，哪一个只能采用顺序存取方式？
A）顺序文件 B）链接文件 C）索引文件 D）Hash文件
（26）在一个页式存储管理系统中，页表内容如下：
2
1
6
3
7
若页的大小为4K，则地址转换机制将逻辑地址0转换成相应的物理地址
A）8192 B）4096 C）2048 0）1024
（27）DOS系统中，当用户需要某些配置时，可以将配置命令写在下列哪一个文件中？
A）COMMAND.COM B）AUTOEXEC.BAT
C）IO.SYS D）CONFIG.SYS
（28）在UNIX系统中，下列哪一个命令属于目录管理的常用命令？
A）pwd B）pr C）ln D）find
（29）软件工程学涉及到软件开发技术和工程管理两方面的内容，下述内容中哪一个不
属于开发技术的范畴？
A）软件开发方法 B）软件开发工具
C）软件工程环境 D）软件工程经济
（30）软件工程的结构化生命周期方法，通常将软件生命周期划分为计划、开发和运行
三个时期，下述哪些工作应属于软件开发期的内容?
Ⅰ需求分析 Ⅱ可行性研究 Ⅲ总体设计
A）只有Ⅰ B）Ⅰ和Ⅱ C）Ⅰ和Ⅲ D）都是
（31）软件计划的目的是提供一个框架，使主管人员对项目能在短时间内进行合理的估
价，下述哪个（些）不属于计划期的内容？
A）资源需求 B）成本估算
C）项目进度 D）功能需求
（32）数据流图（DFD）是软件开发哪一阶段经常使用的工具？
A）需求分析 B）详细设计
C）软件测试 D）软件维护
（33）软件开发的结构化方法中，常应用数据字典技术，其中数据加工是其组成内容之
一，下述哪种（些）方法是常采用编写加工说明的方法？
Ⅰ 结构化语言 Ⅱ 判定树 Ⅲ 判定表
A）只有Ⅰ B）只有Ⅱ C）Ⅰ和Ⅲ D）都是
（34）软件工程的结构化分析方法强调的是分析开发对象的
A）数据流 B）控制流 C）时间限制 D）进程通讯
（35）软件设计中的软件过程其主要描述的是
A）模块间关系 B）模块操作细节
C）模块控制方法 D）模块类型
（36）软件测试是软件开发过程的重要阶段，是软件质量保证的重要手段，下列哪个（
些）是软件测试的任务？
Ⅰ预防软件发生错误
Ⅱ发现改正程序错误
Ⅲ提供诊断错误信息
A）只有Ⅰ B）只有Ⅱ C）只有Ⅲ D）都是
（37）软件测试是软件质挝保证的重要手段，下述哪种测试是软件测试的最基础环节？

A）功能测试 B）单元测试
C）结构测试 D）确认测试
（38）软件维护是软件运行期的重要任务，下列维护任务中哪一类维护是软件维护的主
要部分？
A）完善性维护 B）适应性维护
C）校正性维护 D）支持性维护
（39）数据管理技术发展过程中，文件系统与数据库系统的重要区别是数据库系统具有

A）数据可共享 B）数据无冗余
C）特定的数据模型 D）有专门的数据管理软件
（40）在数据库技术中，面向对象数据模型是一种
A）概念模型 B）结构模型
C）物理模型 D）形象模型
（41）在以下所列的条目中，哪些是数据库管理员（DBA）的职责？
Ⅰ 负责管理企业的数据库资源
Ⅱ 收集和确定有关用户的需求
Ⅲ 设计和实现数据库并按需要修改和转换数据
Ⅳ 为用户提供资料和培训方面的帮助
A）Ⅰ和Ⅱ B）Ⅱ和Ⅲ
C）Ⅰ和Ⅳ D）都是
（42）在数据库的如下两个表中，若雇员信息的主键是雇员号，部门信息表的主键是部
门号，在下列所给的操作中，哪个操作不能执行？
雇员信息表 部门信息表
雇员号 雇员名 部门号 工 资 部门号 部门名 主 任
001 张 山 02 2000 01 业务部 李 建
010 王宏达 01 1200 02 销售部 应伟东
056 马林生 02 1000 03 服务部 周 垠
101 赵 敏 04 1500 04 财务部 陈力胜
A）从雇员信息表中删除行（‘010’，‘王宏达’，‘01’，1200）
B）将行（‘102’，‘赵敏’，‘01’，1500）插入到雇员信息表中
C）将雇员信息表中雇员号=‘010’的工资改为1600元
D）将雇员信息表中雇员号=‘101’的部门号改为‘ 05’
（43）在数据库的如下两个表中，若雇员信息表的主键是雇员号，部门信息表的主键是
部门号。在部门信息表中，哪一行可以被删除？
雇员信息表 部门信息表
雇员号 雇员名 部门号 工 资 部门号 部门名 主 任
001 张 山 02 2000 01 业务部 李 建
010 王宏达 01 1200 02 销售部 应伟东
056 马林生 02 1000 03 服务部 周 垠
101 赵 敏 04 1500 04 财务部 陈力胜
A）部门号=‘01’的行 B）部门号=‘02’的行
C）部门号=‘03’的行 D）部门号=‘04’的行
（44）若用如下的SQL语句创建了一个表S:
CREATE TABLE S（S# CHAR（6） NOT NULL，
SNAME CHAR（8） NOT NULL，SEX CHAR（2），AGE INTEGER）
今向S表插入如下行时，哪一行可以被插入？
A）（‘991001’，‘李明芳’，女，‘23’）
B）（‘990746’，“张为’，NULL，NULL）
C）（NULL，‘陈道一’，‘男’，32）
D）（‘992345’，NULL，‘女’，25）
（45）在关系数据库设计中，设计关系模式是数据库设计中哪个阶段的任务？
A）需求分析阶段 B）概念设计阶段 C）逻辑设计阶段 D）物理设计阶段
（46）数据库应用系统开发一般包括两个方面的内容，就是
A）需求分析和维护 B）概念结构设计和逻辑结构设计
B）功能设计和测试设计 D）结构特性设计和行为特性设计
（47）Power Builder是一种深受广大用户欢迎的快速应用开发工具，它与其他应用开发
工具比较，最具有特色的是
A）支持面向对象的开发方法 B）提供可视化图形用户界面
C）使用ODBC与多种数据库连接 D）可通过数据窗口访问数据库
（48）Oracle系统不但具有高性能的RDBMS，而且提供全过程的应用开发工具。如果要进
行数据库建模，使用的是
A）SQL*Connect B）Oracle Designer／2000
C）Oracle Developer／2000 D）Oracle Financials
（49）计算机网络系统与分布式系统之间的区别主要是
A）系统物理结构 B）系统高层软件 C）传输介质类型 D）服务器类型
（50）帧中继系统设计的主要目标是用于互连多个
A）广域网 B）电话网 C）局域网 0）ATIM网
（51）ATM网络采用固定长厦的信元传送数据，信元长度为
A）1024B B）53B C）128B D）64B
（52）TCP／IP参考模型中的主机-网络层对应于OSI RM中的
A）网络层 B）物理层
C）数据链路层 D）物理层与数据链路层
（53）交换式局域网增加带宽的方法是在交换饥多个端口之间建立
A）点-点连接 B）并发连接 C）物理连接 D）数据连接
（54）IEEE802．3的物理层协议10BASE-T规定从网卡到集线器的最大距离为
A）100m B）185m C）500m D）850m
（55）在Client／Server计算模式中，中间件（Midd1eware）的主要作用是利用高层应
用程序编程接口（API）来隔离
A）通信网络与网络操作系统 C）应用软件与网卡驱动程序
C）应用与网络 D）网络用户与网络管理员
(56) 如果互连的局域网高层分别采用TCP/IP协议与SPX/IPX协议，那么我们可以选择的
互连设备应该是
A）中继器 B）网桥 C）网卡 D）路由器
（57）在WwW服务中，用户的信息检索可以从一台Web Server自动搜索到另一台Web Ser
ver，它所使用的技术是
A）hyperlink B）hypertext C）hypermedia D）HTML
注意：58、59、60三题共三组（信息管理、数值计算、辅助设计），考生任选一组、多
选无效。
信息管理
（58）下述功能都是企业MIS的重要功能的组成部分，哪些是其最基本的功能？
Ⅰ监测企业运行情况
Ⅱ 预测企业未来
Ⅲ控制企业行为
Ⅳ支持企业决策
A）Ⅰ和Ⅱ B）Ⅱ和Ⅳ C）Ⅰ和Ⅲ D）Ⅲ和Ⅳ
（59）企业信息系统建设中，下述哪一个是系统建设的基础？
A）网络 B）硬件 C）软件 D）数据
（60）系统／软件开发的原型化方法是一种有效的开发方法，下述基本环节中哪一个是
原型形成以后才应实施的内容？
A）识别基本需求 B）开发工作模型
C）修正和改进模型 D）进行细部说明
数值计算
（58）数值计算中常产生的误差有截断误差和舍入误差，其中舍入误差产生的原因是
A）无穷运算的截断 B）计算公式的近似
C）数的有限位运算 D）数的近似表示
（59）求解线性代数方程组一般有直接法和迭代法两类，直接法是一类求解线性代数方
程组的
A）近似法 B）消去法 C）渐近法 D）精确法
（60）用牛顿法求方程f（x）=0的根时，必须满足的条件是，在近似根X0的附近有
A）f（x0）≠0 B）F"（x0）≠0
C）f"（X0）＝o D）F'（x0）≠0
辅助设计
（58）图形变换用齐次坐标，实质是用n＋1个分量去表示
A）三维向量 B）二维向量 C）n维向量 D）n＋1维向量
（59）CAD系统设计原则中，一致性包括概念模式、语义、显示格式以及
A）数据 B）信息 C）过程 D）命令句法
（60）CAD图形输出的精度最主要的是取决于
A）显示器分辨率 B）捕捉分辨率
C）图形输入仪分辨率 D）绘图仪分辨率
二. 填空题：（每空2分，共40分）
请将每空的正确答案写在答题卡 1 ～ 20 序号的横线上，答在试卷上不得分。
（1）多媒体技术与超文本技术的结合 1 形成了技术。
（2）数据结构包括的三个方面的内容是：数据的 2 ，数据的存储结构，数据的运算。

（3）按后根次序周游树或树林，等同于按 3 次序周游对应的二叉树。
（4）及时响应是 4 和实时操作系统的特征。
（5）进程创建工作主要完成的是创建进程控制块（PCB），并把它挂到 5 队列中。
（6）文件目录是 6 的有序集合。
（7）系统中有N个进程，则进程就绪队列中最多有 7 个进程。
（8）软件工程的结构化生命周期方法中，一般将软件设计阶段再划分为 8 两个阶段。

（9）软件模块独立性的两个定性度量标准是 9 。
（10）软件设计方法中的Jackson方法是一种面向 10 的设计方法。
（11）软件测试中路径测试是整个测试的基础，它是对软件的 11 进行测试。
（12）数据是信息的符号表示，或称载体；信息是数据的 12 。
（13）网状、层次数据模型与关系数据模型的最大区别在于表示和实现实体之间的联系
的方法：网状、层次数据模型是通过指针链，而关系数据模型是使用 13 。
（14）在数据库的体系结构中，数据库存储的改变会引起内模式的改变。为使数据库的
模式保持不变，从而不必修改应用程序，这是通过改变模式与内模式之间的映象来实现
的。这样，使数据库具有 14 。
（15）在“学生-选课-课程”数据库中的三个关系如下：
S（S#，SNAME，SEX，AGE），SC（S#，C＃，GRADE），C（C＃，CNAME，TEACHER）。
查找选修“数据库技术”这门课程的学生的学生名和成绩。若使用连接查询的SQL语句是
：
SELECT SNAME，CRADE FROM S，SC，C
WHERE CNAME="数据库技术"
AND S.S＃= SC.S＃
AND 15 。
（16）快速以大网Fast Ethernet采用了与传统Ethernet相同的介质访问控制方法，而只
是将它的每个比恃发送的时间降低到 16 ms。
（17）在Client／Server工作模式中,客户机可以使用 17 向数据库服务器发送查询命令
。
（18）ATM局域网仿真系统中，连接在ATM网络中的主机与网桥可以从逻辑上划分为若干
个独立的区域，每个区域称为一个 18 。
（19）在www服务中，统一资源定位器URL可以由三部分组成，即 19 、主机名与文件名
。
注意：20题共三题（信息管理、数值计算、辅助设计），考生任选一题，多选无效。
（20）建立企业管理信息系统的基础性工作是首先应该建立企业的 20 。
（20）建立函数f（x）的近似数值微分或数值积分公式的一种常用的方法是用近似的
20 来表示函数f（x）。
（20）AutoCAD中，图形插入和外部引用通常利用已画好的图去构造新图。它们的主要区
别是 20 。
1999年
全国计算机等级考试三级（B）笔试试卷
答案及评分标准
一.选择题：（每题1分，共60分）
1 2 3 4 5 6 7 8 9 10
D B C C D C B A B C
11 12 13 14 15 16 17 18 19 20
B B B D A A C B C D
21 22 23 24 25 26 27 28 29 30
B D A C B A D A D C
31 32 33 34 35 36 37 38 39 40
D A D A B D B A C B
41 42 43 44 45 46 47 48 49 50
D D C B C D D B B C
51 52 53 54 55 56 57 58 59 60
B D B A C D A
信息管理：（58）C （59）D （60)D
数值计算：（58）C （59）D （60)D
辅助设计：（58）C （59）D （60)D
二. 填空题：（每空2分，共40分）
1、超媒体
2、逻辑结构
3、对称序
4、分时操作系统/分时系统
5、就绪
6、文件控制块(FCB)
7、N-1
8、总体设计、详细设计/概要设计、详细设计
9、内聚性、耦合性
10、数据结构
11、结构
12、内涵/语义解释
13、二维表/表格/表/关系
14、物理独立性/数据物理独立性
15、SC.C#=C.C#/C.C#=SC.C#
16、10
17、结构化查询语句/SQL
18、仿真局域网/ELAN/Emulated LAN
19、访问类型/服务器类型
20、管理模型
20、代数多项式
20、图是否存入磁盘中
[an error occurred while processing this directive]

--

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: argo.zsu.edu.cn]


软件水平考试

饮水思源站 软件水平考试 精华区离线浏览
类型 | 标题 | 长度 | 时间
目录 | 1999 | 3项 | 01/03/27 20:43
文件 | Re: 高程考试报名在什么地方 dannyzhu | 436 | 01/03/28 20:10


1999

饮水思源站 1999 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Re: 软件人员水平考试何时何地报名？ package | 604 | 01/03/27 20:43
文件 | Re: 软件人员水平考试何时何地报名？ loya | 457 | 01/03/27 20:43
文件 | Re: 软件人员水平考试何时何地报名？ zjgod | 674 | 01/03/27 20:43


发信人: package (cat), 信区: C
标 题: Re: 软件人员水平考试何时何地报名？
发信站: 饮水思源站 (Tue Jun 15 12:35:13 1999) , 站内信件
今年的文件至今未发下来。本月底到南昌路去问一下。考试的经验就是，报名费越高，越容易通过，比如Microsoft的认证。，考前千万不要复习，我的一个姓陈的同学，未复习就轻松过了。（注意：是高程）
【 在 zjgod (xiaozhang) 的大作中提到: 】
: 请问诸位大虾：今年的计算机软件人员水平考何时开始报名，在何处
: 有报名，报名时应注意些什么，考试应注意些什么，有何经验可以告
: 诉鄙人？
: 谢谢。
: Thank you very much!

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.220]


发信人: loya (dingdong), 信区: C
标 题: Re: 软件人员水平考试何时何地报名？
发信站: 饮水思源站 (Thu Jun 17 21:39:33 1999) , 站内信件
昂立就有
or复旦计算机楼二楼(现在好像在一楼)
or 科学会堂
6月底
【 在 laoshou (新手) 的大作中提到: 】
: 我也想知道

--
~~~~~~~~~
众生多苦难
吾救苍生于水深火热之中

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.69]


发信人: zjgod (xiaozhang), 信区: C
标 题: Re: 软件人员水平考试何时何地报名？
发信站: 饮水思源站 (Fri Jun 18 12:52:23 1999) , 站内信件
是6月底开始还是结束？
我记得去年先是复旦报完了，南昌路（地址不详）才开始的。
昂立在哪儿？

最近从其他bbs上见到考纲，其中提到4月份开始报名。？
另外，科学会堂的地址是什么，请告之。

Thanks.

【 在 loya (dingdong) 的大作中提到: 】
: 昂立就有
: or复旦计算机楼二楼(现在好像在一楼)
: or 科学会堂
: 6月底
--

;36m※ 修改:·zjgod 於 Jun 18 12:58:21 修改本文·[FROM: 202.120.113.67]
※ 修改:·zjgod 於 Jun 18 15:45:38 修改本文·[FROM: 202.120.113.59]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.113.67]


发信人: dannyzhu (紫色水晶), 信区: C
标 题: Re: 高程考试报名在什么地方
发信站: 饮水思源站 (Tue Jul 4 21:28:01 2000), 转信

上海市计算机考试实施办公室 上海市南昌路47号

【 在 guojin (god) 的大作中提到: 】
: 请问各位消息灵通的大虾：
: 10月份高程考试在交大（徐汇校区）什么地方报名
: 何时开始报名。
: 谢谢！！！！！！！！！！！！！！

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: dii.nju.edu.cn]


发信人: sufehyy (Zerg), 信区: C
标 题: Re: 四级和程序员
发信站: 饮水思源站 (Mon Apr 3 16:23:49 2000), 转信
四级要考的东西可多啦,有数据结构、离散数学、软件工程……，考题类有选择题和论述
题，前者有1/3是英语。
教科书在报考点应该有的，如上海自考中心（PHON:56667796）
至于程序员，hehe,我也想问呢。
【 在 starlucky 的大作中提到: 】
: 考四级和程序员有什么区别，它们分别要考些什么东西？能给我介绍
: 一些好的书和网址吗？
: Thanx!

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.121.132.168]


网络编程

饮水思源站 网络编程 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Re: help tonyxu | 885 | 01/03/26 19:06


发信人: tonyxu (无斋主人), 信区: C
标 题: Re: help
发信站: 饮水思源站 (Sat Sep 19 01:35:22 1998) , 站内信件
用UDP方式生成的Socket,一般要指定一个PORT，另一端用
SendTo直接到这个PORT就可了。
WSAEINVAL是从TCP变成到UDP编程易犯的错误。原因是
UDP是Connectionless的，你不可用Bind,Connect等Stream
Socket的函数。

【 在 ljf (走开别烦我) 的大作中提到: 】
: 我用VC++5.0的CSocket的类来生成一个可以广播的client端，这样
: 我们必须使用udp协议来通讯，并使用SetSockOpt来设置该socket为
: broadcast,这是我的理解。
: 但是现在我对CSocket的成员函数有些不理解，我在create时指定了port
: 或不指定，接着bind函数中怎么又要指定一个port?
: 我怎么指定都会在bind时生成一个WSAEINVAL其含义是
: The socket is already bound to an address.
: why?
: who can help me?
: 我急需帮助!

--
-----
宠辱不惊，闲看庭前花开花落
去留无意，漫随天外云卷云舒

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 205.219.46.174]


HOOK 编程求救

饮水思源站 HOOK 编程求救 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | HOOK编程求助 RedSpider | 662 | 01/03/26 19:31
文件 | Re: HOOK编程求助 BigWhite | 2789 | 01/03/26 19:31
文件 | Re: HOOK编程求助 RedSpider | 2670 | 01/03/26 19:31
文件 | Re: HOOK编程求助 BigWhite | 1437 | 01/03/26 19:31
文件 | Re: HOOK编程求助 Terminator | 1476 | 01/03/26 19:31
文件 | Re: HOOK编程求助 RedSpider | 5506 | 01/03/26 19:32
文件 | Re: HOOK编程求助 holly | 341 | 01/03/26 19:32
文件 | Re: HOOK编程求助 RedSpider | 517 | 01/03/26 19:32
文件 | Re: HOOK编程求助 BigWhite | 598 | 01/03/26 19:32


发信人: RedSpider (空心菜), 信区: C
标 题: HOOK编程求助
发信站: 饮水思源站 (Sun Oct 11 19:19:05 1998) , 站内信件
小弟近日编程碰到一个问题，需要截获一个非本进程
窗口的消息，看了VC的帮助后，似乎要监视本进程之
外的消息，只能把HOOK回调函数放到DLL里去，然后
从DLL中取得HOOK函数的地址，我是用LoadLibrary和
GetProcAddress在运行时调入DLL的，需要一个强制
的类型转换，可问题就在于，HOOK函数的返回类型
为LRESULT CALLBACK，怎么进行类型转换？
另外，截获消息有没有别的办法？或者直接在程序
载入时就从DLL中 IMPORTS 呢？这问题太原始了点，
可我翻遍了手头的资料也找不出个名堂来。

各位大哥，救救我啊！

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.20]


发信人: BigWhite (大白), 信区: C
标 题: Re: HOOK编程求助
发信站: 饮水思源站 (Tue Oct 13 18:49:46 1998) , 站内信件
【 在 RedSpider (空心菜) 的大作中提到: 】
: 小弟近日编程碰到一个问题，需要截获一个非本进程
: 窗口的消息，看了VC的帮助后，似乎要监视本进程之
: 外的消息，只能把HOOK回调函数放到DLL里去，然后
: 从DLL中取得HOOK函数的地址，我是用LoadLibrary和
: GetProcAddress在运行时调入DLL的，需要一个强制
: 的类型转换，可问题就在于，HOOK函数的返回类型
: 为LRESULT CALLBACK，怎么进行类型转换？
: 另外，截获消息有没有别的办法？或者直接在程序
: 载入时就从DLL中 IMPORTS 呢？这问题太原始了点，
: 可我翻遍了手头的资料也找不出个名堂来。
: 各位大哥，救救我啊！

这儿有我写的一个HOOK程序的框架，希望对你有所帮助。不过我是采用的.lib形式，没用
LoadLibary和GetProcAddress。

生成DLL的代码：
[hook.h]
#ifndef HOOKDLL_H
#define HOOKDLL_H
#ifndef HOOKLIBAPI
#define HOOKLIBAPI __declspec(dllimport)
#endif
HOOKLIBAPI BOOL WINAPI Hook_Start ();
HOOKLIBAPI BOOL WINAPI Hook_Stop ();
#endif

[hook.c]
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#define HOOKLIBAPI __declspec(dllexport)
#include "hookDLL.h"

HINSTANCE g_hinstDll = NULL; // instance handle

#pragma data_seg("Shared")
HHOOK g_hhook = NULL; // Hook handle for thread-specific hook
#pragma data_seg()
#pragma comment(linker, "/section:Shared,rws")

static LRESULT WINAPI Hook_HookProc (int nCode, WPARAM wParam, LPARAM lParam)
{
LRESULT lResult= CallNextHookEx(g_hhook, nCode, wParam, lParam);
PMSG pmsg = (PMSG)lParam;

if (nCode == HC_ACTION)
{
switch (pmsg->message)
{
case WM_CHAR:
//TO DO: add your codes here
break;
}
}
return(lResult);
}

BOOL WINAPI Hook_Start ()
{
HHOOK hhook;

if (g_hhook != NULL)
return(FALSE);
hhook = SetWindowsHookEx(WH_GETMESSAGE, Hook_HookProc, g_hinstDll, 0);
g_hhook = hhook;
return(g_hhook != NULL);
}

BOOL WINAPI Hook_Stop ()
{
BOOL fOK = TRUE;

if (g_hhook != NULL)
{
fOK = UnhookWindowsHookEx(g_hhook);
g_hhook = NULL;
}
return(fOK);
}

BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
g_hinstDll = hinstDll;
break;
}
return(TRUE);
}

使用此DLL的文件：
[Test.c]
#include <windows.h>
#include <windowsx.h>
#include <string.h>
#include ".\hookDLL\hookDLL.h"

int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
Hook_Start();
Hook_Stop();
return(0);
}

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.32.132.223]


发信人: RedSpider (空心菜), 信区: C
标 题: Re: HOOK编程求助
发信站: 饮水思源站 (Tue Oct 20 14:51:44 1998) , 站内信件

多谢大侠相助，现在倒是写出来了，也能运行，可是有个
新问题，即使我把HOOK函数放在DLL里了，仍然只能接收到
本进程的消息，SetWindowsHookEx的后两个参数也是正确
的，分别为DLL的HINSTANCE和NULL。我用的是KeyboardProc
和CallWndProc，都不行。

【 在 BigWhite (大白) 的大作中提到: 】
: 这儿有我写的一个HOOK程序的框架，希望对你有所帮助。不过我是采用的.lib形式，没用
: LoadLibary和GetProcAddress。
: 生成DLL的代码：
: [hook.h]
: #ifndef HOOKDLL_H
: #define HOOKDLL_H
: #ifndef HOOKLIBAPI
: #define HOOKLIBAPI __declspec(dllimport)
: #endif
: HOOKLIBAPI BOOL WINAPI Hook_Start ();
: HOOKLIBAPI BOOL WINAPI Hook_Stop ();
: #endif
: [hook.c]
: #include <windows.h>
: #include <windowsx.h>
: #include <tchar.h>
: #include <string.h>
: #include <stdlib.h>
: #include <stdio.h>
: #define HOOKLIBAPI __declspec(dllexport)
: #include "hookDLL.h"
: HINSTANCE g_hinstDll = NULL; // instance handle
: #pragma data_seg("Shared")
: HHOOK g_hhook = NULL; // Hook handle for thread-specific hook
: #pragma data_seg()
: #pragma comment(linker, "/section:Shared,rws")
: static LRESULT WINAPI Hook_HookProc (int nCode, WPARAM wParam, LPARAM lParam)
: {
: LRESULT lResult= CallNextHookEx(g_hhook, nCode, wParam, lParam);
: PMSG pmsg = (PMSG)lParam;
: if (nCode == HC_ACTION)
: {
: switch (pmsg->message)
: {
: case WM_CHAR:
: //TO DO: add your codes here
: break;
: }
: }
: return(lResult);
: }
: BOOL WINAPI Hook_Start ()
: {
: HHOOK hhook;
: if (g_hhook != NULL)
: return(FALSE);
: hhook = SetWindowsHookEx(WH_GETMESSAGE, Hook_HookProc, g_hinstDll, 0);
: g_hhook = hhook;
: return(g_hhook != NULL);
: }
: BOOL WINAPI Hook_Stop ()
: {
: BOOL fOK = TRUE;
: if (g_hhook != NULL)
: {
: fOK = UnhookWindowsHookEx(g_hhook);
: g_hhook = NULL;
: }
: return(fOK);
: }
: BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
: {
: switch (fdwReason)
: {
: case DLL_PROCESS_ATTACH:
: g_hinstDll = hinstDll;
: break;
: }
: return(TRUE);
: }
: 使用此DLL的文件：
: [Test.c]
: #include <windows.h>
: #include <windowsx.h>
: #include <string.h>
: #include ".\hookDLL\hookDLL.h"
: int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
: {
: Hook_Start();
: Hook_Stop();
: return(0);
: }

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.20]


发信人: BigWhite (大白), 信区: C
标 题: Re: HOOK编程求助
发信站: 饮水思源站 (Tue Oct 20 16:57:21 1998) , 站内信件
【 在 RedSpider (空心菜) 的大作中提到: 】
: 多谢大侠相助，现在倒是写出来了，也能运行，可是有个
: 新问题，即使我把HOOK函数放在DLL里了，仍然只能接收到
: 本进程的消息，SetWindowsHookEx的后两个参数也是正确
: 的，分别为DLL的HINSTANCE和NULL。我用的是KeyboardProc
: 和CallWndProc，都不行。

你是不是想截获用户在所有应用程序中的键盘输入啊？(获取密码)
hehe.很巧，我写的这个程序也是完成这个功能。上次给你的框架中
省略了相关代码，现在补上：
static LRESULT WINAPI Hook_HookProc (int nCode, WPARAM wParam, LPARAM lParam)
{
static char ch;

LRESULT lResult= CallNextHookEx(g_hhook, nCode, wParam, lParam);
PMSG pmsg = (PMSG)lParam;

if (nCode == HC_ACTION)
{
switch (pmsg->message)
{
case WM_CHAR:
ch=(TCHAR)(pmsg->wParam);//用户输入的字符
//TO DO:将字符ch写入文件
break;
}
}
return(lResult);
}
记住：WH_GETMESSAGE一样可以获得任何进程的键盘消息。
WH_CALLWNDPROC我没试过。
WH_KEYBOARD应该能行，但它返回的是virtual code,不是char，你很难处理！
hhook = SetWindowsHookEx(WH_GETMESSAGE, Hook_HookProc, g_hinstDll, 0);
^^^^^^^^^^^^^^

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.32.132.223]


发信人: Terminator (魔鬼终结者), 信区: C
标 题: Re: HOOK编程求助
发信站: 饮水思源站 (Tue Oct 20 18:12:50 1998) , 转信
As I know, it seems in NT it's impossible to try to get users'
passwords through this way. However, NT provide a feature to
replace the logon procedure, I mean GINA DLL. You can refer to
it in VC Books Online, it also include two samples.

【 在 BigWhite (大白) 的大作中提到: 】
: 你是不是想截获用户在所有应用程序中的键盘输入啊？(获取密码)
: hehe.很巧，我写的这个程序也是完成这个功能。上次给你的框架中
: 省略了相关代码，现在补上：
: static LRESULT WINAPI Hook_HookProc (int nCode, WPARAM wParam, LPARAM lParam)
: {
: static char ch;
: LRESULT lResult= CallNextHookEx(g_hhook, nCode, wParam, lParam);
: PMSG pmsg = (PMSG)lParam;
: if (nCode == HC_ACTION)
: {
: switch (pmsg->message)
: {
: case WM_CHAR:
: ch=(TCHAR)(pmsg->wParam);//用户输入的字符
: //TO DO:将字符ch写入文件
: break;
: }
: }
: return(lResult);
: }
: 记住：WH_GETMESSAGE一样可以获得任何进程的键盘消息。
: WH_CALLWNDPROC我没试过。
: WH_KEYBOARD应该能行，但它返回的是virtual code,不是char，你很难处理！
: hhook = SetWindowsHookEx(WH_GETMESSAGE, Hook_HookProc, g_hinstDll, 0);
: ^^^^^^^^^^^^^^

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: sg.zju.edu.cn]


发信人: RedSpider (空心菜), 信区: C
标 题: Re: HOOK编程求助
发信站: 饮水思源站 (Wed Oct 21 14:37:06 1998) , 站内信件

还是不行。我是在DLL里SetWindowsHookEx和UnhookWindowsHookEx的结果还是只能
收到本进程的消息。我用的是动态载入的方法。源程序如下：

//////////////////////////////////////////////////////////////////
//Hook.Dll
//hook.def
EXPORTS
InstallHook
UnInstallHook
GetHookState
//hook.cpp
#define DllExport __declspec( dllexport )

#include "windows.h"

HHOOK GetLastHook = NULL;
BOOL HookState = false ;

static LRESULT WINAPI GetMsgProc(int,WPARAM,LPARAM);

BOOL DllExport GetHookState(void);
BOOL DllExport InstallHook(HINSTANCE);
BOOL DllExport UnInstallHook(void);

static LRESULT WINAPI GetMsgProc( int code,
WPARAM wParam,
LPARAM lParam)
{
MSG* MsgStruct;
LRESULT lResult;
if(GetLastHook)
lResult=CallNextHookEx(GetLastHook,code,wParam,lParam);
else
lResult=0;

MsgStruct=(MSG*)lParam;

if(code==HC_ACTION && !HookState )//&& TelnethWnd)
{
if(MsgStruct->message ==WM_CHAR)
if((TCHAR)MsgStruct->wParam =='a')
HookState=true;
}
return lResult;
}

BOOL DllExport GetHookState(void)
{
return HookState;
}

BOOL InstallHook(HINSTANCE hInstance)
{
GetLastHook=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hInstance,0);

if(GetLastHook)
return true;
else
return false;
}

BOOL UnInstallHook(void)
{
return UnhookWindowsHookEx(GetLastHook);
}

//////////////////////////////////////////////////////////////////////////
//调用HOOK的试验程序teskhook
// testhookDlg.cpp : implementation file
//

#include "stdafx.h"
#include "testhook.h"
#include "testhookDlg.h"
#include "WAITDLG.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

///////////////////////////////////////////////////////
// Public Data Area

BOOL (*lpInstallHook)(HINSTANCE);
BOOL (*lpUnInstallHook)(void);
BOOL (*lpGetHookState)(void);

HINSTANCE lpDLL; //DLL的HINSTANCE；

BOOL CTesthookDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this
automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

lpDLL=AfxLoadLibrary("Hook");
if(!lpDLL)
{
MessageBox("Sorry! Hook.dll not found!");
}
else
{
lpGetHookState = (int (__cdecl *)(void))GetProcAddress(lpDLL,"
GetHookState");
lpInstallHook = (int (__cdecl *)(struct HINSTANCE__
*))GetProcAddress(lpDLL,"InstallHook");
lpUnInstallHook = (int (__cdecl *)(void))GetProcAddress(lpDLL,"
UnInstallHook");

if( lpGetHookState
&& lpInstallHook
&& lpUnInstallHook)
{
if((*lpInstallHook)(lpDLL))
MessageBox("Install Hook Success!");
else
MessageBox("Install Hook Failed!");
SetTimer(1,55,NULL);
}
else
MessageBox("GetProc Error!");
}
return TRUE; // return TRUE unless you set the focus to a control
}

void CTesthookDlg::OnButtonGo()
{
WAITDLG waitdlg;
waitdlg.DoModal( );//打开另一个对话框；只作为测试是否能接收到消息用；
}

BOOL CTesthookDlg::DestroyWindow()
{
KillTimer(1);
if((*lpUnInstallHook)( ))
MessageBox("UnHook Success!");
else
MessageBox("UnHook Failed!");
AfxFreeLibrary(lpDLL);
return CDialog::DestroyWindow();
}

void CTesthookDlg::OnTimer(UINT nIDEvent)
{
if(!HookState)
{
HookState=(*lpGetHookState)( );
if(HookState)MessageBox("Yes!");
}

CDialog::OnTimer(nIDEvent);
}

执行结果，程序只能截获在本进程的窗口上的消息（对话框 CTestHookDlg 和
waitdlg），
当在这两个窗口上按下'a'键时，都可以响应弹出"Yes!"消息框。
而对于其他进程的窗口的消息则无任何反应。

搞不懂！

救命！

【 在 BigWhite (大白) 的大作中提到: 】
: 你是不是想截获用户在所有应用程序中的键盘输入啊？(获取密码)
: hehe.很巧，我写的这个程序也是完成这个功能。上次给你的框架中
: 省略了相关代码，现在补上：
: static LRESULT WINAPI Hook_HookProc (int nCode, WPARAM wParam, LPARAM lParam)
: {
: static char ch;
: LRESULT lResult= CallNextHookEx(g_hhook, nCode, wParam, lParam);
: PMSG pmsg = (PMSG)lParam;
: if (nCode == HC_ACTION)
: {
: switch (pmsg->message)
: {
: case WM_CHAR:
: ch=(TCHAR)(pmsg->wParam);//用户输入的字符
: //TO DO:将字符ch写入文件
: break;
: }
: }
: return(lResult);
: }
: 记住：WH_GETMESSAGE一样可以获得任何进程的键盘消息。
: WH_CALLWNDPROC我没试过。
: WH_KEYBOARD应该能行，但它返回的是virtual code,不是char，你很难处理！
: hhook = SetWindowsHookEx(WH_GETMESSAGE, Hook_HookProc, g_hinstDll, 0);
: ^^^^^^^^^^^^^^

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.20]


发信人: holly (Holly), 信区: C
标 题: Re: HOOK编程求助
发信站: 饮水思源站 (Thu Oct 22 09:54:12 1998) , 站内信件

... Hehe. The Hook Procedure will run on different process context
... from yours. You need use InterProcessCommunication Methods
... to pass Data.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.26.243]


发信人: RedSpider (空心菜), 信区: C
标 题: Re: HOOK编程求助
发信站: 饮水思源站 (Mon Oct 26 10:22:06 1998) , 站内信件

如果我在自己的程序里调用DLL里的函数，这是不是算两个PROCESS？
或者是两个THREAD？而调用DLL里的函数需要用到什么样的进程间通信呢？

【 在 holly (Holly) 的大作中提到: 】
: ... Hehe. The Hook Procedure will run on different process context
: ... from yours. You need use InterProcessCommunication Methods
: ... to pass Data.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.22]


发信人: BigWhite (大白), 信区: C
标 题: Re: HOOK编程求助
发信站: 饮水思源站 (Mon Oct 26 19:35:14 1998) , 站内信件
【 在 RedSpider (空心菜) 的大作中提到: 】
: 还是不行。我是在DLL里SetWindowsHookEx和UnhookWindowsHookEx的结果还是只能
: 收到本进程的消息。我用的是动态载入的方法。源程序如下：
sigh!不知道是什么原因，我用你的代码稍做改动重新test了一下，仍然是行的呀，
可以获取各窗口的键盘消息，只是在整个程序结束，成功终止hook后，莫名其妙弹出一个
Assertion Failed，找了半天原因也没找到。我用的是NT4.0,身份是超级用户。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.32.132.223]


VxD

饮水思源站 VxD 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Re: 不知哪位大虾可以介绍一下VxD编程? tonyxu | 547 | 01/03/26 19:34
文件 | Re: 不知哪位大虾可以介绍一下VxD编程? tonyxu | 1629 | 01/03/26 19:34


发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 不知哪位大虾可以介绍一下VxD编程?
发信站: 饮水思源站 (Sun Oct 18 01:10:05 1998) , 站内信件
我现在也刚开始写VxD。仍在摸索中。介绍你一本书，
“Writing Windows VxDx and Device Drivers",作者是
Karen Hazzah。是有关VxD书中最经典的一本。另外可以
参考的是MS的DDK的MANUAL，MSDN上有。
具体你想了解哪一部分？你的题目太笼统。

【 在 xinsb (蠕虫) 的大作中提到: 】
: A.T.T

--
-----
宠辱不惊，闲看庭前花开花落
去留无意，漫随天外云卷云舒

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: sjas-30-0-12.sj]


发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 不知哪位大虾可以介绍一下VxD编程?
发信站: 饮水思源站 (Tue Oct 20 04:22:41 1998) , 站内信件
除第三点外，你的问题都不是三言两语能讲清的。我
先回答你第三点。
3,你需要DDK，和C编译器，及MASM汇编器来开发。
你要先确定你的硬件需要那些功能，修改什么中断，或DMA，或内存映象。
然后找个Sample，在Sample上改。Writing Windows VxDs and Device Drivers
一书中就有几个sample.一般Vxd是用assembly写的。
我是用这个方法做的。

我再试一下用最简单的方法回答你其他问题。
1) 你知道计算机有许多硬件设备，如键盘，显示器，打印机等，
计算机通过Driver(驱动程序)来使用这些硬件的。
在DOS时代这些Driver可以是个TSR，或就是个Application，因为
App是可以直接访问硬件的。在Windows 3.1时代，这些Driver可以是
个DLL，或是个独立的VxD(Virtual Device Driver)。但到了Win95时代，
也就是32bit操作系统时代，许多“Driver”类型的
操作是不能用Win32 DLL实现的。简言之这些操作在用户态是禁止的
只能在核心态做，这些操作是，
-访问内存映象的硬件
-DMA传输数据
-硬件中断出理
-发出软件中断
这样的话，你要使32-bit的应用程序使用硬件设备，就必须使用
VxD，比如说键盘就是VKD.VxD。当然除VxD外还有一个方法使32bit
Application访问硬件，就是写一个16bit的Driver，再写一个32bit
到16bit的Thunk程序，使32-bit程序可以调16位的Drv。但这种方式
为M$oft强烈不推荐。从潮流上看，16bit程序的消亡是历史趋势。
所以写VxD是站在历史正确的一边。

先到这里吧！剩下两点以后有空再聊。

【 在 jasondane (开心鼠) 的大作中提到: 】
: 问题:
: 1. 为什么要VxD编程?
: 2. VxD编程的概念.
: 3. 编程步骤, 使用的软件
: 4. 如何使用编制的VxD
: 谢谢.

--
-----
宠辱不惊，闲看庭前花开花落
去留无意，漫随天外云卷云舒

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 205.219.46.174]


问题讨论

饮水思源站 问题讨论 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | popen 的功能 pdfan | 277 | 01/03/26 19:40
文件 | Re: popen 的功能 playboy | 338 | 01/03/26 19:40
文件 | Re: popen 的功能 hhfeng | 403 | 01/03/26 19:40
目录 | Dll | 4项 | 01/03/27 17:05
文件 | 哪儿可以下载WIN32 SDK,WIN95 DDK qingquan | 204 | 01/03/27 18:43
文件 | Re: 哪儿可以下载WIN32 SDK,WIN95 DDK seagate | 333 | 01/03/27 18:43
文件 | Re: 哪儿可以下载WIN32 SDK,WIN95 DDK seagate | 269 | 01/03/27 18:43
文件 | Re: 压缩函数 law | 454 | 01/03/27 18:48
文件 | Re: 压缩函数 hpl | 397 | 01/03/27 18:48
文件 | Re: 压缩函数 hpl | 531 | 01/03/27 18:49
文件 | Re: 压缩函数 junjun | 475 | 01/03/27 18:49
目录 | WIN32的对齐方式 | 4项 | 01/03/27 19:57


发信人: pdfan (lake), 信区: C
标 题: popen 的功能
发信站: 饮水思源站 (Wed Oct 28 11:14:29 1998) , 站内信件
近来读程式, 遇到一函数 popen, 找了一些手册, 也未查到此
函数, 望哪位大虾相告, 在下先谢了.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: chenwang.nju.ed]


发信人: playboy (梦如人生), 信区: C
标 题: Re: popen 的功能
发信站: 饮水思源站 (Wed Oct 28 16:56:13 1998) , 站内信件

【 在 pdfan (lake) 的大作中提到: 】
: 近来读程式, 遇到一函数 popen, 找了一些手册, 也未查到此
: 函数, 望哪位大虾相告, 在下先谢了.
打开管道

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www.syntc.com.c]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: popen 的功能
发信站: 饮水思源站 (Wed Oct 28 19:52:36 1998) , 站内信件
【 在 pdfan (lake) 的大作中提到: 】
: 近来读程式, 遇到一函数 popen, 找了一些手册, 也未查到此
: 函数, 望哪位大虾相告, 在下先谢了.

执行一个进程，将该进程的输入/输出，作为打开的文件柄的输出/输入。
就是管道。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


Dll

饮水思源站 Dll 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | DLL输出函数请教，急！急！！！ metaphase | 992 | 01/03/27 17:04
文件 | Re: DLL输出函数请教，急！急！！！ playboy | 935 | 01/03/27 17:04
文件 | Re: DLL输出函数请教，急！急！！！ metaphase | 791 | 01/03/27 17:04
文件 | Re: DLL输出函数请教，急！急！！！ playboy | 756 | 01/03/27 17:05


发信人: metaphase (它山之石), 信区: C
标 题: DLL输出函数请教，急！急！！！
发信站: 饮水思源站 (Sun Nov 22 10:23:35 1998) , 站内信件
各位大侠，请教一个问题。
用DUMPBIN /EXPORTS出某一个软件的DLL文件（设为DLLFILEA.DLL）
的输出函数时，发现有如下的输出结果：

ordinal hint RVA name

1141 0 FunctionA (forwarded to DLLFILEB.FunctionA)
1111 1 FunctionB (forwarded to DLLFILEB.FunctionB)
1112 2 FunctionC (forwarded to DLLFILEB.FunctionC)

现在本人也想做一个DLL文件，假设名叫DLLFILEA.DLL，其中只想重写
DLLFILEB.DLL中的FunctionA，而FunctionB和FunctionC则仍用DLLFILEB
中的。当然，DLL文件里的函数不只有这么少，如何做到覆盖其中一部分
而其余的全部转储到其它的DLL文件内？

盼各位大侠赐我良方，不胜感激！
--
-------------------------------------------
| Every time you go away , |
| You take a piece of me with you ! |
-------------------------------------------

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.11.184]


发信人: playboy (梦如人生), 信区: C
标 题: Re: DLL输出函数请教，急！急！！！
发信站: 饮水思源站 (Tue Nov 24 08:43:02 1998) , 站内信件
【 在 metaphase (它山之石) 的大作中提到: 】
: 各位大侠，请教一个问题。
: 用DUMPBIN /EXPORTS出某一个软件的DLL文件（设为DLLFILEA.DLL）
: 的输出函数时，发现有如下的输出结果：
: ordinal hint RVA name
: 1141 0 FunctionA (forwarded to DLLFILEB.FunctionA)
: 1111 1 FunctionB (forwarded to DLLFILEB.FunctionB)
: 1112 2 FunctionC (forwarded to DLLFILEB.FunctionC)
: 现在本人也想做一个DLL文件，假设名叫DLLFILEA.DLL，其中只想重写
: DLLFILEB.DLL中的FunctionA，而FunctionB和FunctionC则仍用DLLFILEB
: 中的。当然，DLL文件里的函数不只有这么少，如何做到覆盖其中一部分
: 而其余的全部转储到其它的DLL文件内？
: 盼各位大侠赐我良方，不胜感激！
找到函数入口点，然后截获他装入你的DLL再调用你的函数

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www.syntc.com.c]


发信人: metaphase (它山之石), 信区: C
标 题: Re: DLL输出函数请教，急！急！！！
发信站: 饮水思源站 (Wed Nov 25 21:51:14 1998) , 站内信件
【 在 playboy (梦如人生) 的大作中提到: 】
: 找到函数入口点，然后截获他装入你的DLL再调用你的函数
What I wanted is to forwarded functions to another DLL.
I saw the book <Windows 95 system programming secret>.
It was written at about 1995 or 1996.
In the book,the author said that there was no way to do so yet.
But I want to know wheather I can do it now or not.
If I can,How to?
Can you help me,boy!
--
-------------------------------------------
| Every time you go away , |
| You take a piece of me with you ! |
-------------------------------------------

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.11.184]


发信人: playboy (梦如人生), 信区: C
标 题: Re: DLL输出函数请教，急！急！！！
发信站: 饮水思源站 (Mon Nov 30 12:30:47 1998) , 站内信件

有一种静态修改PE格式的DLL的方法，即将一个DLL注入另一个DLL中。
不过这个技术还不成熟。具体可给我发E-MAIL我们探讨一下。
至于想在运行时修改，恐怕得作一个VXD来HOOK文件系统了。

【 在 metaphase (它山之石) 的大作中提到: 】
: What I wanted is to forwarded functions to another DLL.
: I saw the book <Windows 95 system programming secret>.
: It was written at about 1995 or 1996.
: In the book,the author said that there was no way to do so yet.
: But I want to know wheather I can do it now or not.
: If I can,How to?
: Can you help me,boy!

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www.syntc.com.c]


发信人: qingquan (阿容), 信区: C
标 题: 哪儿可以下载WIN32 SDK,WIN95 DDK
发信站: 饮水思源站 (Wed Nov 25 22:34:31 1998) , 转信

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.9.209]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: 哪儿可以下载WIN32 SDK,WIN95 DDK
发信站: 饮水思源站 (Thu Nov 26 09:10:58 1998) , 站内信件
msdn.Microsoft.com:
1. Win32 SDK is named platform SDK
2. Win98 DDK
3. Windows NT 5.0 DDK
4. OLE DB SDK

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: eesun3.tamu.edu]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: 哪儿可以下载WIN32 SDK,WIN95 DDK
发信站: 饮水思源站 (Fri Nov 27 02:15:15 1998) , 站内信件
Good place !
ftp://ins22web.seu.edu.cn/

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: eesun3.tamu.edu]


发信人: law (海狼), 信区: C
标 题: Re: 压缩函数
发信站: 饮水思源站 (Tue Nov 24 12:04:58 1998) , 站内信件
【 在 liyi (小毅) 的大作中提到: 】
: Windows下编程，有什么现成的文件压缩函数可以调用？
: 或者其它软件的DLL?
: 谢谢

在SDK里查所有以LZ开头的函数。
--

这虚无的城市，这飘渺的城市。
在拥挤的人群中，我已找不到我自己。

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.190]


发信人: hpl (坏鲁), 信区: C
标 题: Re: 压缩函数
发信站: 饮水思源站 (Tue Dec 1 23:31:45 1998) , 站内信件
使用 wINDOWS 提供的 compress进行压缩才行的.

坏鲁亲自试过的.
【 在 liyi (小毅) 的大作中提到: 】
: 我查了一下，解压缩的函数是可以找到的，但是压缩操作怎么进行？
: 能不能具体讲一讲?
: 谢谢

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.199.24.45]


发信人: hpl (坏鲁), 信区: C
标 题: Re: 压缩函数
发信站: 饮水思源站 (Tue Dec 8 13:05:26 1998) , 转信
到目前为止,这一类的函数似乎不再流行了,相关的开发人员页不再
使用这一类的函数.

相关的软件我也在寻找.
不过你可以试验一下.Create preace 之类的函数.

坏鲁乐呵呵说.
【 在 liyi (小毅) 的大作中提到: 】
: 谢谢。
: 可惜这个程序运行是要进入DOS环境的，运行时出来DOS的黑屏有点不好看，
: 速度也慢一些。有没有其它好一点的?

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.199.24.45]


发信人: junjun (阿牛), 信区: C
标 题: Re: 压缩函数
发信站: 饮水思源站 (Sat Dec 12 22:46:47 1998) , 转信
据我所知（本人曾经在某软件项目中遇到需要压缩文件的情况），
现成的函数是没有的。到网上找一找有时能找到支持标准ZIP压缩算法的
子程序（好象PKZIP的站点http://www.pkware.com就有）。
【 在 liyi (小毅) 的大作中提到: 】
: Windows下编程，有什么现成的文件压缩函数可以调用？
: 或者其它软件的DLL?
: 谢谢

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.215]


WIN32的对齐方式

饮水思源站 WIN32的对齐方式 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | WIN32的对齐方式 flybird | 882 | 01/03/27 19:57
文件 | Re: WIN32的对齐方式 seagate | 1177 | 01/03/27 19:57
文件 | Re: WIN32的对齐方式 flybird | 778 | 01/03/27 19:57
文件 | Re: WIN32的对齐方式 Evil | 959 | 01/03/27 19:57


发信人: flybird (白门柳), 信区: C
标 题: WIN32的对齐方式
发信站: 饮水思源站 (Mon Dec 28 18:11:31 1998) , 站内信件
经试验，WIN32的数据段缺省对齐方式如下:
char 单字节对齐
short 双字节对齐
int,float 四字节对齐
double 八字节对齐
structure 按其成员的最大对齐方式对齐
union 按其成员的最大对齐方式对齐
堆栈段变量的最小对齐单位是四字节(结构内的成员偏移不受此规则限制，
与上面所列相同)
堆中动态分配的地址一律为八的整数倍
structure的size为其最大成员(基本数据类型，包括嵌套的结构中的基本类型)
size的倍数，为满足这个条件，在最后一个成员的后面加padding，不影响成员
偏移量的计算
该死的microsoft，竟在32位机器上用八字节对齐，想升WIN64也不用这么急呀。
有谁知道别的系统有什么特殊的对齐规则的，请不吝赐教。
--

残碧殿秋如有恋,老鸡知曙奈无声

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.112.26.223]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: WIN32的对齐方式
发信站: 饮水思源站 (Wed Dec 30 00:40:08 1998) , 站内信件
哈哈， 我与bird兄弟看法不同。 照我看:
1. 结构内的成员偏移按其类型是对的，但不应该有"最小对齐单位" 这一说法。
2. structure 的大小与在哪儿分配的还有关系 ？ 如此说来一个 structure 的 sizeof() 在
heap 和 stack 中是不一样的了？这就很怪。

【 在 flybird (白门柳) 的大作中提到: 】
: 经试验，WIN32的数据段缺省对齐方式如下:
: char 单字节对齐
: short 双字节对齐
: int,float 四字节对齐
: double 八字节对齐
: structure 按其成员的最大对齐方式对齐
: union 按其成员的最大对齐方式对齐
: 堆栈段变量的最小对齐单位是四字节(结构内的成员偏移不受此规则限制，
: 与上面所列相同)
: 堆中动态分配的地址一律为八的整数倍
: structure的size为其最大成员(基本数据类型，包括嵌套的结构中的基本类型)
: size的倍数，为满足这个条件，在最后一个成员的后面加padding，不影响成员
: 偏移量的计算
: 该死的microsoft，竟在32位机器上用八字节对齐，想升WIN64也不用这么急呀。
: 有谁知道别的系统有什么特殊的对齐规则的，请不吝赐教。

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: epipc2.tamu.edu]


发信人: flybird (白门柳), 信区: C
标 题: Re: WIN32的对齐方式
发信站: 饮水思源站 (Fri Jan 22 21:06:53 1999) , 站内信件
1,
char a; //位于堆栈段
(int)&a % 4 == 0
这是因为使用32位进出栈指令的方便
2,
size相同，结构的起始地址对齐方式不同

3，文章中谈到的不会有错，因为我程序用到的。
【 在 seagate (风雪夜归人) 的大作中提到: 】
: 哈哈， 我与bird兄弟看法不同。 照我看:
: 1. 结构内的成员偏移按其类型是对的，但不应该有"最小对齐单位" 这一说法。
: 2. structure 的大小与在哪儿分配的还有关系 ？ 如此说来一个 structure 的 sizeof() 在
: heap 和 stack 中是不一样的了？这就很怪。

--

残碧殿秋如有恋,老鸡知曙奈无声

※ 修改:·flybird 於 Jan 22 21:15:06 修改本文·[FROM: 202.120.16.15]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: Evil (Live), 信区: C
标 题: Re: WIN32的对齐方式
发信站: 饮水思源站 (Thu May 27 00:42:26 1999) , 站内信件
【 在 flybird (白门柳) 的大作中提到: 】
: 经试验，WIN32的数据段缺省对齐方式如下:
: char 单字节对齐
: short 双字节对齐
: int,float 四字节对齐
: double 八字节对齐
: structure 按其成员的最大对齐方式对齐
: union 按其成员的最大对齐方式对齐
: 堆栈段变量的最小对齐单位是四字节(结构内的成员偏移不受此规则限制，
: 与上面所列相同)
: 堆中动态分配的地址一律为八的整数倍
: structure的size为其最大成员(基本数据类型，包括嵌套的结构中的基本类型)
: size的倍数，为满足这个条件，在最后一个成员的后面加padding，不影响成员
: 偏移量的计算
: 该死的microsoft，竟在32位机器上用八字节对齐，想升WIN64也不用这么急呀。
: 有谁知道别的系统有什么特殊的对齐规则的，请不吝赐教。

#pragma pack(n)

default is /Zp = /zp8

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.217]


发信人: alancao (alan), 信区: C
标 题: 如何键盘模拟输入:shilt+A键?
发信站: 饮水思源站 (Mon Mar 29 15:15:41 1999) , 站内信件
如果对特定的窗口，用SendMessage或PostMessage，对某个
程序，用PostAppMessage

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.220]


发信人: alancao (alan), 信区: C
标 题: 如何得到子窗口在主窗口中的相对坐标�
发信站: 饮水思源站 (Mon Mar 29 15:37:01 1999) , 站内信件
在VC1.5中，如何得到子窗口在主窗口中的相对坐标？

1.比较笨的方法是先ClientToScreen转成屏幕坐标,然后
ScreenToClient转成主窗口坐标,不知有没有更方便的方法.
2.MapWindowPoints(hwndChild, hwndParent, (POINT FAR *)lprc, 2)
lprc 设成子窗口内的坐标(0,0, width, height)
3. 可以使用CWnd::MapWindowPoints(CWnd* pwndTo, LPRECT lpRect )
--

缘来是你!

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.220]


发信人: alancao (alan), 信区: C
标 题: 如何将窗口居中显示?
发信站: 饮水思源站 (Mon Mar 29 15:44:24 1999) , 站内信件

Easy, Call Function CWnd:: Center Windows

Example(1): CenterWindow( ); //Relative to it's parent
// Relative to Screen
Example(2): CenterWindow(CWnd:: GetDesktopWindow( ));
//Relative to Application's MainWindow
AfxGetMainWnd( ) -> Center Window( );
--

缘来是你!

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.220]


发信人: alancao (alan), 信区: C
标 题: 怎样由。DLL生成相应的。LIB？�
发信站: 饮水思源站 (Mon Mar 29 16:46:05 1999) , 站内信件
Borland和Microsoft的lib文件是不兼容的.VC中似乎找不到相应的东东.可以用
Dumpbin加/export参数列出输出函数,自己写一个def文件,然后再用lib.exe生成
相应的import lib.不过如果这个dll的输出函数是NONAME型的,那就没办法了.
--

缘来是你!

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.220]


发信人: Media (硝酸铵), 信区: C
标 题: Re: 如何键盘模拟输入:shilt+A键?
发信站: 饮水思源站 (Mon Mar 29 20:17:27 1999) , 站内信件
【 在 alancao (alan) 的大作中提到: 】
: 如果对特定的窗口，用SendMessage或PostMessage，对某个
: 程序，用PostAppMessage
可以调用keybd_event函数

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.32.142.66]


发信人: congkun (eagle), 信区: C
标 题: Re: 请教线程与进程的问题�
发信站: 饮水思源站 (Tue Apr 13 21:56:42 1999) , 站内信件
【 在 nicegirl (真实男孩) 的大作中提到: 】
: 请问各位大虾，这线程与进程到底是如何区别的。它们之间有什么关系。
: VC中的多线程类又有什么关系？

进程是占据独立资源空间的任务,从一般的概念上说,进程可以看作你启动的独立运行的
程序实例.每个进程占据独立的内存资源,进程间不能直接共享内存资源.

线程则是小于进程的一个概念,几个进程可以拥有多个线程,各个线程共享进程的资源
空间.

对多处理器系统来讲,进程和线程都可以分配给不同的CPU同步处理.

VC里是线程类CWinThread,它将Windows的Thread API封装了起来.
具体情况请看帮助(VC5)或MSDN(VC6)的有关内容.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.32.132.223]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: 请教线程与进程的问题�
发信站: 饮水思源站 (Wed Apr 14 09:10:10 1999) , 站内信件
【 在 congkun (eagle) 的大作中提到: 】
: 进程是占据独立资源空间的任务,从一般的概念上说,进程可以看作你启动的独立运行的
: 程序实例.每个进程占据独立的内存资源,进程间不能直接共享内存资源.
: 线程则是小于进程的一个概念,几个进程可以拥有多个线程,各个线程共享进程的资源
: 空间.
: 对多处理器系统来讲,进程和线程都可以分配给不同的CPU同步处理.
: VC里是线程类CWinThread,它将Windows的Thread API封装了起来.
: 具体情况请看帮助(VC5)或MSDN(VC6)的有关内容.

一般来说，不同进程使用不同的虚拟寻址空间，而同一进程的不同线程使用同一进程
空间。

对一般的实现来说，
同一程序不同进程之间共享使用同一代码物理空间，而各自使用各自的数据及堆栈物理
空间。同一进程的多线程之间共享使用同意代码空间，同一数据空间，而各自使用其
独立的栈空间。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 怎样实现两个进程的变量调用？
发信站: 饮水思源站 (Sun Aug 1 23:33:49 1999) , 站内信件
32位环境下是无法做到内存共享的。
Memory Mapper file 是一个办法，但效率上会有问题。
最简单的办法是用SendMessage, 参数传递使用WM_COPYDATA
消息。
第二个办法是使用Socket机制。
剩下复杂的办法是使用HOOK，hook其它的Process。这一点
可参阅Advanced Windows的第18章Breaking through process boundary wall.

【 在 TangShi (AIC) 的大作中提到: 】
: 使用共享内存。

--
-----
宠辱不惊，闲看庭前花开花落
去留无意，漫随天外云卷云舒

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 209.209.30.155]


发信人: cudo (amulet), 信区: C
标 题: Re: hello, cudo
发信站: 饮水思源站 (Thu Sep 23 10:07:07 1999) , 站内信件
【 在 wolfs (大狼) 的大作中提到: 】
: Have you used the function:FindResource( )?
: 怎么得到函数的第一个参数(句柄)?
: waiting for your answer.

FindResource()可以使用NULL做为第一个参数，这样系统将
在当前进程中寻找资源。不使用NULL的情况一般是要从DLL
中Load资源。如果你要加载EXE中的资源，你可以使用NULL
或使用GetModuleHandle(NULL)获得第一个参数，如果加载
DLL中的资源，使用GetModuleHandle(dllName)得到第一个
参数。
--
纵使长条似旧垂，也应攀折他人手。

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 166.111.64.166]


发信人: jia (小木头), 信区: C
标 题: 使用 Owner Draw Button 构造Windows新控件
发信站: 饮水思源站 (Fri Nov 12 10:30:31 1999) , 站内信件
使用 Owner Draw Button 构造Windows新控件
Beta
使用 Owner Draw Button 构造Windows新控件
CButton类的 Owner Draw 特性是天然的画板，如果有计划的进行“涂鸦”，
做出漂亮的新控件是轻易可以完成。 使用CButton类的另一重要原因在于，可以先
在对话框画出Button的位置，然后在DoDataExchange时， 用DDX_Control宏对对话
框的控件与类变量映射，最后我们发现一切尽在掌握之中。以下是实现浮动式工具
条的例子。

/* Summary:
1.Variable names style
*FloatToolBar styles micro begin with FTSB_
*struct BARDATA to store bar item information
*member variables begin with m_

2.How the class works
*all the painting works is done in DrawItem function
*mouse moves in
*know where is the mouse and SetCapture the mouse input
*determine which bar items should be redraw and how to redraw
*use SendMessage(WM_PAINT)
*mouse moves out we ReleaseCapture the mouse input

3.Bugs
*SetCapture eats the input key ALT so when mouse is on the bar
menu key is disabled -- this maybe the system bug ?

3.New ideas
*when mouse does on the toolbar, make bar items icon monochromatic
*use SetTimer and GetCursorPos functions to trace the mouse location
to avoid the bug

4.Questions
*how to make a colorful picture looks disable gray ?
*/

// FloatToolBar.h : header file
//
#if !defined(AFX_CFLOATTOOLBAR_H__2C379EC2_41BE_11D2_B4B4_C09391D09237__INCLUDE
D_)#define AFX_CFLOATTOOLBAR_H__2C379EC2_41BE_11D2_B4B4_C09391D09237__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

// Defines for Float ToolBar Style
// B stand for Basic style
#define FTSB_CHECKED 0x0001
#define FTSB_DISABLED 0x0002
#define FTSB_NORMAL 0x0004
#define FTSB_HIDE 0x0008
#define FTS_MOUSEON 0x0010
#define FTS_PRESSED 0x0020

struct BARDATA
{
BARDATA() {imgMon=0;} ;
~BARDATA()
{
if(imgMon!=0) delete imgMon ;
if(next != 0) delete next ;
} ;
int imageIndex ;
int buttonIndex ;
RECT rect ;
unsigned short style ;
unsigned short current_style ;
BARDATA* next ;
unsigned short* imgMon ;
};

/////////////////////////////////////////////////////////////////////////////
// CFloatToolBar window

class CFloatToolBar : public CButton
{
// Construction
public:
CFloatToolBar();

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CFloatToolBar)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual BOOL PreTranslateMessage(MSG* pMsg);
//}}AFX_VIRTUAL

// Implementation
public:
BOOL CheckButton(int buttonId, BOOL check=TRUE);
BOOL AddBarItem(int imageId, int buttonId,
RECT* lpRect, unsigned short st) ;
virtual ~CFloatToolBar();

// Generated message map functions
protected:
//{{AFX_MSG(CFloatToolBar)
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnEnable(BOOL bEnable);
//}}AFX_MSG

DECLARE_MESSAGE_MAP()

unsigned short ColorBright(COLORREF col);
void MouseInWho(CPoint point);
void DrawButton(BARDATA * button, CDC* lpDc) ;
BOOL m_MouseDown;
BOOL m_internal ;
HWND m_focusRef ;
BARDATA* m_BarData ;
BOOL m_parentNotify ;
UINT m_MouseFlag ;
};

// FloatToolBar.cpp : implementation file
//
/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately b
efore the previous line.#endif // !defined(AFX_CFLOATTOOLBAR_H__2C379EC2_41BE_1
1D2_B4B4_C09391D09237__INCLUDED_)#include "stdafx.h"
#include "FloatToolBar.h"
//#include "resource.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CFloatToolBar

CFloatToolBar::CFloatToolBar()
{
m_BarData = 0 ;
/*
// Testing code
RECT rect ;
rect.top = 0 ;
rect.bottom = 48 ;
rect.left = 0 ;
rect.right = 48 ;
AddBarItem(IDI_ICON1, ID_HELP_ABOUT, &rect, FTSB_CHECKED) ;

m_BarData->next = new BARDATA ;
m_BarData->next->buttonIndex = IDI_ICON1 ;
m_BarData->next->current_style = FTSB_NORMAL ;
m_BarData->next->rect.top = 0 ;
m_BarData->next->rect.bottom = 48 ;
m_BarData->next->rect.left = 48 ;
m_BarData->next->rect.right = 96 ;
m_BarData->next->imageIndex = IDI_ICON1 ;

m_BarData->next->next = new BARDATA ;
m_BarData->next->next->buttonIndex = ID_APP_ONTOP ;
m_BarData->next->next->current_style = FTSB_NORMAL ;
m_BarData->next->next->rect.top = 0 ;
m_BarData->next->next->rect.bottom = 48 ;
m_BarData->next->next->rect.left = 96 ;
m_BarData->next->next->rect.right = 144 ;
m_BarData->next->next->imageIndex = IDI_ICON2 ;

m_BarData->next->next->next = 0 ;
*/
}

CFloatToolBar::~CFloatToolBar()
{
if(m_BarData != 0) delete m_BarData ;
}

BEGIN_MESSAGE_MAP(CFloatToolBar, CButton)
//{{AFX_MSG_MAP(CFloatToolBar)
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_KILLFOCUS()
ON_WM_ENABLE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFloatToolBar message handlers

BOOL CFloatToolBar::AddBarItem(int imageId, int buttonId,
RECT* lpRect, unsigned short st)
{
BARDATA* p ;
if(m_BarData == 0)
{
m_BarData = new BARDATA ;
p = m_BarData ;
}
else
{
for(p=m_BarData; p!=0; p=p->next)
if(p->next==0) break ;
p->next = new BARDATA ;
p = p->next ;
}
if(p == 0) return FALSE ;
p->next = 0 ;
p->imageIndex = imageId ;
p->buttonIndex = buttonId ;
(p->rect).left = lpRect->left ;
(p->rect).right = lpRect->right ;
(p->rect).top = lpRect->top ;
(p->rect).bottom = lpRect->bottom ;
p->current_style = st ;
return TRUE ;
}

void CFloatToolBar::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
BARDATA* bp ;
CDC* lpDc ;
lpDc = GetDC() ;
lpDc->SetBkMode(TRANSPARENT) ;

// Prevent the button from gaining focus
if(GetFocus() == this)
::SetFocus(m_focusRef) ;

// Draw all buttons
for(bp=m_BarData; bp!=0; bp=bp->next)
DrawButton(bp, lpDc) ;

// The default paint message is form external
m_internal = FALSE ;
}

void CFloatToolBar::OnLButtonDblClk(UINT nFlags, CPoint point)
{
OnLButtonDown(nFlags, point) ;
}

void CFloatToolBar::OnLButtonDown(UINT nFlags, CPoint point)
{
m_MouseFlag = MK_LBUTTON ;
MouseInWho(point) ;
CWnd* parent = GetParent() ;
if(parent!=0)
if(parent->IsWindowEnabled())
{
m_MouseDown = TRUE ;
m_internal = TRUE ;
SendMessage(WM_PAINT) ;
}
}

void CFloatToolBar::OnLButtonUp(UINT nFlags, CPoint point)
{
m_MouseFlag = nFlags ;
MouseInWho(point) ;
if(m_parentNotify)
{
CWnd* parent = GetParent() ;
if(parent!=0)
if(parent->IsWindowEnabled() && m_MouseDown)
{
m_MouseDown = FALSE ;
ReleaseCapture() ;
parent->SendMessage(WM_COMMAND,
MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED),
(LPARAM)m_hWnd) ;
point.y = point.x = -1 ;
MouseInWho(point) ;
m_internal = TRUE ;
SendMessage(WM_PAINT) ;
}
}
m_internal = TRUE ;
SendMessage(WM_PAINT) ;
}

void CFloatToolBar::OnMouseMove(UINT nFlags, CPoint point)
{
m_MouseFlag = nFlags ;
HWND current, parent ;
current = ::GetFocus() ;
if(GetParent()==0) return ;
parent = GetParent()->m_hWnd ;
if(current!=parent && ::GetParent(current)!=parent)
return ;

MouseInWho(point) ;
RECT rect ;
GetClientRect(&rect) ;
if(point.x>0 && point.y>0 &&
point.x<rect.right && point.y<rect.bottom)
SetCapture() ;
else
::ReleaseCapture() ;

m_internal = TRUE ;
SendMessage(WM_PAINT) ;
}

void CFloatToolBar::OnKillFocus(CWnd* pNewWnd)
{
SendMessage(WM_PAINT) ;
}

BOOL CFloatToolBar::PreTranslateMessage(MSG* pMsg)
{
if(::GetFocus() != m_hWnd)
m_focusRef = ::GetFocus() ;
return CButton::PreTranslateMessage(pMsg);
}

void CFloatToolBar::OnEnable(BOOL bEnable)
{
CButton::OnEnable(bEnable);
OnKillFocus(NULL) ;
}

void CFloatToolBar::DrawButton(BARDATA * button, CDC* lpDc)
{
BOOL moveFlag = FALSE ;
if(button->style & FTSB_HIDE) return ;
HICON hIcon = AfxGetApp()->LoadIcon(button->imageIndex) ;
if(hIcon == NULL) return ;

if(!m_internal)
{
button->style = 0 ;
button->current_style &= ~FTS_MOUSEON ;
button->current_style &= ~FTS_PRESSED ;
}

if(button->style == button->current_style) return ;

button->style = button->current_style ;
COLORREF sysCol = GetSysColor(COLOR_WINDOW) ;
unsigned short sysColBrg = ColorBright(sysCol) ;

if(button->style & FTSB_CHECKED)
{
if(button->style & FTS_PRESSED) return ;
if(button->style&FTS_MOUSEON)
lpDc->FillSolidRect(&(button->rect), sysCol) ;
else
lpDc->FillSolidRect(&(button->rect), RGB(215,215,215)) ;
lpDc->DrawEdge(&(button->rect),
BDR_SUNKENINNER, BF_RECT) ;
moveFlag = TRUE ;
::OffsetRect(&(button->rect), 1, 1);
::DrawIconEx(lpDc->m_hDC,
(button->rect).left, (button->rect).top,
hIcon,
(button->rect).right-(button->rect).left,
(button->rect).bottom-(button->rect).top,
0, 0, DI_NORMAL);
}

if(button->style & FTSB_DISABLED)
{
lpDc->FillSolidRect(&(button->rect), sysCol) ;
long x, y, is=0, pos=1 ;
if(button->imgMon == 0)
{
unsigned short imgW = (button->rect).right -
(button->rect).left + 1 ;
unsigned short imgH = (button->rect).bottom -
(button->rect).top + 1 ;
button->imgMon = new
unsigned short[1+(int)(imgW*imgH/16)] ;
::DrawIconEx(lpDc->m_hDC,
(button->rect).left, (button->rect).top,
hIcon,
(button->rect).right-(button->rect).left,
(button->rect).bottom-(button->rect).top,
0, 0, DI_NORMAL);
for(y=(button->rect).top; y<=(button->rect).bottom; y++)
for(x=(button->rect).left; x<(button->rect).right; x++)
{
if((sysColBrg -
ColorBright(::GetPixel(lpDc->m_hDC, x, y)))
>0)
{
button->imgMon[is] |= 0x0001 ;
}
else
{
button->imgMon[is] &= 0xFFFE ;
}
pos++ ;
if(pos==17)
{
pos = 1 ;
is++ ;
continue ;
}
button->imgMon[is] <<= 1 ;
}
if(pos != 16) button->imgMon[is] <<= 16 - pos ;
}
pos = 1 ;
is = 0 ;
COLORREF pc = RGB(255,255,255) ;
::OffsetRect(&(button->rect), 1, 1);
unsigned short tmp = button->imgMon[0] ;
for(y=(button->rect).top; y<=(button->rect).bottom; y++)
for(x=(button->rect).left; x<(button->rect).right; x++)
{
if(tmp&0x8000)
::SetPixel(lpDc->m_hDC, x, y, pc) ;
pos++ ;
if(pos==17)
{
pos = 1 ;
is++ ;
tmp = button->imgMon[is] ;
continue ;
}
tmp <<= 1 ;
}
pos = 1 ;
is = 0 ;
pc = RGB(128,128,128) ;
::OffsetRect(&(button->rect), -1, -1);
tmp = button->imgMon[0] ;
for(y=(button->rect).top; y<=(button->rect).bottom; y++)
for(x=(button->rect).left; x<(button->rect).right; x++)
{
if(tmp&0x8000)
::SetPixel(lpDc->m_hDC, x, y, pc) ;
pos++ ;
if(pos==17)
{
pos = 1 ;
is++ ;
tmp = button->imgMon[is] ;
continue ;
}
tmp <<= 1 ;
}
}

if(button->style & FTSB_NORMAL)
{
lpDc->FillSolidRect(&(button->rect), sysCol) ;
if(button->style & FTS_PRESSED)
{
lpDc->DrawEdge(&(button->rect),
BDR_SUNKENINNER, BF_RECT) ;
moveFlag = TRUE ;
::OffsetRect(&(button->rect), 1, 1);
}
if(button->style & FTS_MOUSEON)
lpDc->DrawEdge(&(button->rect),
BDR_RAISEDINNER, BF_RECT) ;
::DrawIconEx(lpDc->m_hDC,
(button->rect).left, (button->rect).top,
hIcon,
(button->rect).right-(button->rect).left,
(button->rect).bottom-(button->rect).top,
0, 0, DI_NORMAL);
}

if(moveFlag)
::OffsetRect(&(button->rect), -1, -1);
}

void CFloatToolBar::MouseInWho(CPoint point)
{
short i = 0 ;
BARDATA* bp ;

SetDlgCtrlID(0) ;
m_parentNotify = FALSE ;

for(bp=m_BarData; bp!=0; bp=bp->next)
{
// Found point in the rect
if(point.x>(bp->rect).left && point.x<(bp->rect).right &&
point.y>(bp->rect).top && point.y<(bp->rect).bottom)
{
if(bp->style & FTSB_HIDE) continue ;
SetDlgCtrlID(bp->buttonIndex);
if(bp->style & FTSB_DISABLED) continue ;
m_parentNotify = TRUE ;
switch(m_MouseFlag)
{
case MK_LBUTTON:
bp->current_style |= FTS_PRESSED ;
bp->current_style &= ~FTS_MOUSEON ;
break ;
default:
bp->current_style |= FTS_MOUSEON ;
bp->current_style &= ~FTS_PRESSED ;
break ;
}
}
// Point does in the rect
else
{
bp->current_style &= ~FTS_MOUSEON ;
bp->current_style &= ~FTS_PRESSED ;
}
i++ ;
}
}

unsigned short CFloatToolBar::ColorBright(COLORREF col)
{
return (unsigned short)(GetBValue(col)+
GetGValue(col) + GetRValue(col)) ;
}

BOOL CFloatToolBar::CheckButton(int buttonId, BOOL check)
{
BARDATA* p ;
BOOL toReturn = FALSE ;
for(p=m_BarData; p!=0; p=p->next)
{
if(buttonId == p->buttonIndex)
{
toReturn = TRUE ;
if(check)
{
p->current_style |= FTSB_CHECKED ;
p->current_style &= ~FTSB_NORMAL ;
}
else
{
p->current_style |= FTSB_NORMAL ;
p->current_style &= ~FTSB_CHECKED ;
}
}
}
return toReturn ;
}

--
再见！
相逢在下一个路口！

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.6.34]


发信人: DuZ (hi), 信区: C
标 题: 一道Microsoft的题目
发信站: 饮水思源站 (Mon Nov 15 13:32:50 1999) , 转信
void lock(int *x) is a function which wait until *x
is 0 and set *x to 1.
void unlock(int *x) is a function which set *x to 0.
int read_data(void *buf,int size) is to read data.
int write_data(void *buf,int size) is to write data.
Use those four function to write two multiple threads
read/write functions that multiple reading access
is permitted and no read/write is permitted
when a writing is in process. Writing is not
permitted also when a reading is in process.

Following I will give a imitation of functions lock,unlock,
read_data and write_data under Windows. In order to debug those
functions I add a parameter DWORD thid to every function.
Then two functions int read(void *buf,int size,DWORD thid);
int write(void *buf,int size,DWORD thid) is needed to
solve the problem.
If one thinks that there are some troubles in my imitation
of those four functions, please write to me.

#include <windows.h>
#include <stdio.h>

#define BUFFER_SIZE 1000
#define THREAD_COUNT 10
#define TOTAL_TIME 30

//Remove defination of this macro to get
//less debug information
#define LOCK_INFO

CRITICAL_SECTION cs;
CRITICAL_SECTION ics;
char glBuf[BUFFER_SIZE];

//Imitate lock function.
void lock(int *x,DWORD thid)
{
start:
EnterCriticalSection(&cs);
if(*x)
{
LeaveCriticalSection(&cs);
Sleep(0);//Flip to another thread
goto start;
}
*x=1;
#ifdef LOCK_INFO
EnterCriticalSection(&ics);
printf("Thead %d lock %d\n",thid,x);
LeaveCriticalSection(&ics);
#endif
LeaveCriticalSection(&cs);
}

//Imitate unlock
void unlock(int *x,DWORD thid)
{
EnterCriticalSection(&cs);
*x=0;
#ifdef LOCK_INFO
EnterCriticalSection(&ics);
printf("Thead %d unlock %d\n",thid,x);
LeaveCriticalSection(&ics);
#endif
LeaveCriticalSection(&cs);
}

//Imitate read_data,parameter thid is added for debug information.
int read_data(void *buf,int size,DWORD thid)
{
int i;
EnterCriticalSection(&cs);
printf("Thread %d start reading data\n",thid);
LeaveCriticalSection(&cs);
for(i=0;i<size;i++)
{
((char *)buf)[i]=glBuf[i];
Sleep(0);//to flip to another thread.
//If read and write function are not right,then
//Sleep(0) will make the fault easier to discover.
}
EnterCriticalSection(&ics);
printf("Thread %d end reading data\n",thid);
LeaveCriticalSection(&ics);
return size;
}

//Imitate write_data,parameter thid is added for debug information.
int write_data(void *buf,int size,DWORD thid)
{
int i;
EnterCriticalSection(&cs);
printf("Thread %d start writing data\n",thid);
LeaveCriticalSection(&cs);
for(i=0;i<size;i++)
{
glBuf[i]=((char *)buf)[i];
Sleep(0);
}
EnterCriticalSection(&ics);
printf("Thread %d end writing data\n",thid);
LeaveCriticalSection(&ics);
return size;
}

//This two functions has not been written.
//Who can write it?
int read(void *buf,int size,DWORD thid);
int write(void *buf,int size,DWORD thid);

//The following functions is used to debug the
read and write function.
DWORD WINAPI ThreadFun(void *p)
{
int i;
DWORD thid;
char buf[BUFFER_SIZE];
thid=(DWORD)p;
startt:
i=rand();
if(i<10000)
{
write(buf,BUFFER_SIZE,thid);
}
else if(i==10000)
{
EnterCriticalSection(&ics);
printf("Leave thread %d",thid);
LeaveCriticalSection(&ics);
return i;
}
else
{
read(buf,BUFFER_SIZE,thid);
}
goto startt;
}

//use redirection to let the output information
//inputed to a file.Then you may check the output result to
//see whether there are deadlock or conflict between r/w.
void main()
{
int i;
HANDLE hThread[THREAD_COUNT];
InitializeCriticalSection(&cs);
InitializeCriticalSection(&ics);
for(i=0;i<THREAD_COUNT;i++)
{
DWORD thid;
hThread[i]=CreateThread(NULL,0,ThreadFun,(void *)i,0,&thid);
}
WaitForMultipleObjects(THREAD_COUNT,hThread,TRUE,TOTAL_TIME*1000);
for(i=0;i<THREAD_COUNT;i++)
{
TerminateThread(hThread[i],0);
CloseHandle(hThread[i]);
}
printf("End Processing\n");
fprintf(stderr,"Press any key to quit...\n");
DeleteCriticalSection(&ics);
DeleteCriticalSection(&cs);
}
--
※ 修改:·DuZ 於 Nov 15 13:47:22 修改本文·[FROM: 202.120.8.25]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www-post@bbs]


发信人: tonyxu (无斋主人), 信区: C
标 题: Re: 请问dll与exe的不同
发信站: 饮水思源站 (Thu Jan 13 01:40:38 2000), 转信
dll是动态连接库，Exe是最终的可执行文件。
如果用户只要运行你的binary code, exe就可以了。
但用户如要在你的基础上继续开发，就需要给他你
的dll,除此之外还要引入库lib,和头文件*.h。

不过现在的COM技术，dll和exe区分很小了，都
可以作为一个component,只不过dll是IN_PROC,
而exe是LOCAL_SERVER或REMOTE_SERVER。

【 在 laichaoan (长安) 的大作中提到: 】
: dll程序与exe程序有何不同?
: 如在某CAD软件上进行二次开发,所生成的程序以dll的形式给用户?
: 还是exe的形式?为什么呀?请指教!谢谢!

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: dhcp41.ictv.com]


驱动程序

饮水思源站 驱动程序 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Re: 哪位大哥帮个忙?(哪里有开发驱动程序 zhucai | 621 | 01/03/28 21:06


发信人: zhucai (小甜甜), 信区: C
标 题: Re: 哪位大哥帮个忙?(哪里有开发驱动程序的工具)
发信站: 饮水思源站 (Sun Oct 29 21:11:41 2000) , 转信
【 在 teacofe (tea) 的大作中提到: 】
: 哪位大哥帮个忙?(哪里有开发驱动程序的工具)
: 急盼,请指点一二!!!
: 在这里先谢过了!

开发设备驱动程序主要工具有：DDK98,DDK2000,建议你去 Microsoft的Web Pa
ge里去找。

http://microsoft.com/ 然后搜寻　98DDK 即可！
  另外美国Vireo公司提供了工具 VToolsD，目前新版本3.0以上。
              http://www.vireo.com/
另外还有：VxDWrite等软件！
:

--
※ 来源:．饮水思源站WWW bbs.sjtu.edu.cn. [FROM: 61.134.6.204]


发信人: licedar (sauce~考虑中……), 信区: C
标 题: Re: 那位网友有*。BMP的文件的格式的资料，请发个给我？
发信站: 饮水思源站 (Sat Nov 11 01:55:17 2000) , 转信
1，文件头部分：14bytes
偏移量 意义
0 'B'
1 'M'
2 文件大小
6 保留1(==0)
8 保留2(==0)
10 第一个象素的偏移量
2，信息头部分：一般40bytes
偏移量 意义
14 信息头占多少字节,一般==40
18 宽
22 高
26 平面数量(==1)
28 一个象素占几位(8,16,24)
30 是否压缩(未压缩==0)
34 图象大小(可选)(按字节)
38 X Pixels per Meter(可以不使用,==0)
42 Y Pixels per Meter(可以不使用,==0)
46 位图使用颜色数(使用所有==0)
50 重要颜色数(都重要==0)
3，如果有调色板，以每4bytes代表一种颜色，4个bytes依次为
红，绿，蓝，透明度(==0)
4，图象数据
为象素从左下角往右上角按行排列，因每行图像数据必须是4的倍数，
如果不是4的倍数，行末填充以0。

【 在 CopyMe (Hobby) 的大作中提到: 】
: 如题，多谢！
:

--
好机会一个个都流失了，
这个不能再没了！
※ 来源:．饮水思源站WWW bbs.sjtu.edu.cn. [FROM: 61.129.209.91]
※ 修改:·licedar 於 Nov 11 21:59:08 修改本文·[FROM: 202.120.18.45]


技术与应用

饮水思源站 技术与应用 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 汉字处理（C FOR DOS） huafeng. | 2727 | 01/03/26 18:26
文件 | Re: 字符串比较 Cehuiren | 348 | 01/03/27 20:49


发信人: Cehuiren (溜溜), 信区: C
标 题: Re: 字符串比较
发信站: 饮水思源站 (Wed Jul 7 23:26:18 1999) , 站内信件
一级汉字的内码序跟拼音一致

【 在 systolic (红红的太阳) 的大作中提到: 】
: 用什么方法可以实现两个字符串按拼音序而不是一级，二级序汉字内码排序比较？
: 谢谢！

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.8.25]


Unknown

饮水思源站 Unknown 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | VESA 谈 1/2 (VBE 1.2) (Cfido 旧文重贴) cloudwu | 4648 | 01/03/26 18:32
文件 | VESA 谈 (VBE 3.0) cloudwu | 1284 | 01/03/26 18:32
文件 | VESA 谈 2/2 （VBE 2.0) (Cfido 旧文重贴 cloudwu | 5700 | 01/03/26 18:32


发信人: cloudwu (云风), 信区: C
标 题: VESA 谈 1/2 (VBE 1.2) (Cfido 旧文重贴)
发信站: 饮水思源站 (Thu Apr 30 09:04:54 1998) , 转信

- 信区: PROGRAMR .CHINA程序人生(中国)-------------------------------------
信件: 1340 Sent Local 日期: 25 Feb 98 15:33:05
来自: Cloud Wu 已读: 是 已回信 : 否
给: All 标记:
主题: 关于 VBE 1/2 (VBE 1.2)
------------------------------------------------------------------------------
... 这是一封回Jingle的朋友关于VBE的旧信.
由于最近有朋友向我打听 VBE ,所以我在这贴出来.
当时写的很乱,也不全面.请看的朋友不要抱怨.
完整的资料可以去 UNIVBE 的主页或者 Jingle BBS 上 D/L
不过是 E 文版的.:(
如果有朋友能将其翻译.那就谢天谢地了
我的 E 文可是极差,几乎考试就没及过格 ;-P
BTW: Jingle 上有 GAME MAKE 区,有机会上 Jingle 又对游戏制作
感兴趣的朋友,一定要去看看,侃侃:)

- 信区: Programe .Bull编程讨论(黄石)-------------------------------------
信件: 70 Sent Local 日期: 10 Sep 97 00:29:03
来自: Cloud Wu 已读: 是 已回信 : 否
给: Gan Jiang 标记:
主题: VBE
------------------------------------------------------------------------------
-=> 看到 Gan Jiang 和 Cloud Wu 为 Re: 关于游戏 争的不可开交,俺想插几句 <=-

GJ> 原来有这样的好东东,我研究对VGA显存直接写点花了将近一年.早上BBS就好
知道S3的640x480x256的控制方法么?俺正需要它.
GJ> 了.能传一个VBE与它的资料给我吗?如不方便,可不要传上站,直接传给我.
还是就在这谈吧.
BTW:俺的资料带到学校去了,只能凭记忆加上以前写的程序给你介绍,
. 一定将不全(可能有错误之处),你问问Bull Chen好了,他一定能补全.
首先你要定义两个结构(附后).
VBE功能都是通过mov AX,4FXX ; XX为功能号,调用INT 10H实现的.
返回寄存器,al为0x4f表示显卡支持VESA,ah为0表示调用成功.
0号功能可以读取显示卡信息,即VESAinfo,查得VBE版本号,支持模式:

typedef unsigned int word;
typedef unsigned char byte;
typedef struct {
char sign[4]; //('VESA')
word ver; //版本号两字节,一主版本号,一副版本号
char far * OEMstr;
dword capabilities; //能否重设调色板寄存器宽度,俺的S3不支持
word far *mode; //(0xffff end) 所支持的模式
word vmemsize; //(v1.1+) 显示RAM 64K为单位
byte res[236];
} VESAinfo;

调用是ES:DI应指向VESAinfo
VESA的模式是从0x100排起的.
如:0x100 640x400x256
0x101 640x480x256
0x109 132x25x16 Text Mode
0x10e 320x200x64K
有狠多,你可以写一程序查,俺写过一个功能较全的,如果需要
俺可以传上来.(狠小只7K,有必要的话,俺把源程序也U上去)

1号功能读取显示模式信息,即VESAmode:
调用时ES:DI应指向VESAmode,CX为模式号.
这里有一内存窗口的概念,即用(通常是)A000:0000开始的(通常是)64K,
映射狠大的显示内存.
移动内存窗口用0x4f05调用INT 10,但更快的方法是直接调用VESAmode.fun
所指的函数.

typedef struct {
word attr;
byte Aattr; //A窗口的状态,读?写?
byte Battr; //B~~~~~~~~~~
word granu; //1perKb
word size; //1perKb
word Aseg; //0xa000
word Bseg; //0xa000
void far *fun; //(AX=0x4f05)指向移动内存窗口的函数
word bpscan; //每行多少byte
//VESA modes in v1.0/1.1
word w; //width
word h; //height
byte cw; //char width
byte ch; //char height
byte planes;
byte bppixel;
byte banks;
byte memtype;
byte banksize;
byte pages;
byte res1;
//v1.2+,Information about Hi,True Color Mode
byte Rmsize;
byte Rpos;
byte Gmsize;
byte Gpos;
byte Bmsize;
byte Bpos;
byte Xmsize;
byte Xpos;
byte dirinfo;
byte res2[216];
} VESAmode;

2号功能设置模式 (BX=模式号)
3~~~~~~查询当前模式号 (返回BX=模式号)
4~~~~~~忘了 (好象可以实现虚拟屏幕,硬件滚屏)
5~~~~~~移动内存窗口
DX=移动多少,一般以64K为单位,
这个数值在VESAmode里,是哪个俺记不清了,
BX俺一般赋0,好象是用来控制A,B窗口的.
BTW:俺一直在S3上编程,现在手头没资料,好多记不清,莫见怪

VBE还有些功能,俺就没用过了.

听说VBE 2.0 支持32位保护模式,俺正在找资料.

BTW to BC:你有时间的话能否将这封信检查一下有无技术错误,
再将没写到的补全,好成为一份完整的VESA资料,俺想除了Gan Jiang
还有许多朋友需要的.谢谢. :)

>>> _/_/_/_/ _/ _/ /-_/_ _ /, _ E-mail: cloudwu@nease.net
> _/ _/ _/ _/ _\ /_ /_//_/_/ |_| 江城浪子 Cloud Wu 欢迎你来
_/_/_/_/ _/_/_/_/_/ http://www.nease.net/~cloudwu 云风工作室 〖胖〗

... 敬告 BBS 战友: 使用瘟都死有害健康.
-!- 蓝波车明汉化版 v2.31
! Origin: Jingle BBS武汉劲捷电子信息站(027)3648668,3636678,3692889 (6:663/2)

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.197.71.12]


发信人: cloudwu (云风), 信区: C
标 题: VESA 谈 (VBE 3.0)
发信站: 饮水思源站 (Thu Apr 30 09:08:09 1998) , 转信

- 信区: PROGRAMR .CHINA程序人生(中国)-------------------------------------
信件: 1342 Sent Local 日期: 25 Feb 98 15:33:05
来自: Cloud Wu 已读: 是 已回信 : 否
给: All 标记:
主题: 关于 VBE 3.0
------------------------------------------------------------------------------
看到 UNIVBE 6.0 里增加了 VBE 3.0
的支持,感觉世界变化太快了
哪位能写写这个 VBE 3.0 的介绍.
有资料就更妙了 :)~ 最好还是C文的 :)~~~
BTW:我觉得 VBE2 够用了.不象当年学在保护模式下控制显卡时,那么迫切
的想要 VBE2 的资料

>>> _/_/_/_/ _/ _/ /-_/_ _ /, _ E-mail: cloudwu@nease.net
> _/ _/ _/ _/ _\ /_ /_//_/_/ |_| 江城浪子 Cloud Wu 欢迎你来
_/_/_/_/ _/_/_/_/_/ http://www.nease.net/~cloudwu 云风工作室 〖胖〗

... 站远线少E多,LJ口水纵横,谁敢横刀止飙,唯我劲捷群英! :)
-!- 蓝波车明汉化版 v2.31
! Origin: Jingle BBS武汉劲捷电子信息站(027)3648668,3636678,3692889 (6:663/2)

--
--
http://www.nease.net/~cloudwu
http://computer.igd.edu.cn/~cloud
E-mail: cloudwu@163.net

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.197.71.12]


发信人: cloudwu (云风), 信区: C
标 题: VESA 谈 2/2 （VBE 2.0) (Cfido 旧文重贴）
发信站: 饮水思源站 (Thu Apr 30 09:13:58 1998) , 转信

- 信区: PROGRAMR .CHINA程序人生(中国)-------------------------------------
信件: 1341 Sent Local 日期: 25 Feb 98 15:33:05
来自: Cloud Wu 已读: 是 已回信 : 否
给: All 标记:
主题: 关于 VBE 2/2 (VBE 2.0)
------------------------------------------------------------------------------
... 从 VBE 2.0 开始 支持了保护模式,这样就不用切换到实模式下
切换映射窗口了 :) 或者,你还可以使用线形缓存.我认为这是 VBE 2.0
相对于 VBE 1.X 的最大改进.

- 信区: Programe .Bull编程讨论(黄石)-------------------------------------
信件: 70 Local 日期: 29 Oct 97 17:36:42
来自: Cloud Wu 已读: 是 已回信 : 否
给: All 标记:
主题: VBE 2.0 简单教程
------------------------------------------------------------------------------
这篇文章原来是想发给BC的,想想后还是发给了ALL.
好让更多战友分享新的知识.

在 TP & inet 的帮助下,我搞到了VBE 2.0的完整手册. 可惜是E文的.
小D的E文是如此的不济,以至抱着Dictionary熬了X小时才读懂了大概.
忽然听到BC嚷着,他的E文也... 方才醒悟,和小D的E文水平不相上下
的战友也大有人在. :) 如果真是这样,我花上点时间写这个,就狠有
意义了. 至少让大家有更多的时间去用C文B信,而不必收老外的折磨.

VBE 1.2以前的版本的C文资料以不难得到,这里为了节约各位大虾和小
D我的时间,只介绍VBE 2.0中特有的(部分)精彩内容.
>. Notice: ^^^^,而不是翻译,想更全面了解VBE 2.0,请D/L TP
>. U/L 的完整VBE 2.0文档.

... 1. VBE 2.0 的模式
VBE的模式是16 bit的(bit0-bit15),VBE 2.0 新定义了bit14
当Bit14为1时,使用线形缓存.
>VBE 2.0 没有定义新的模式,而且也不保证所有旧模式必须被支持.

... 2. VBE 2.0 的函数
VBE使用INT 10h作为接口,函数 4F00 - 4F0F 为基本函数,
4F10 - 4FFF 为扩充函数. (比如声音的接口 :)~ )
> 这里不介绍扩充函数.(还需要大虾们自己读 E 文)

除了函数 07h,保护模式中依然可以通过INT 10H 调用VBE 中的函数
05h & 09h,但这将是实调用.(VBE 2.0也提供了32位的非中断调用版
本,待会再谈)
而函数 07h的接口改了,以适应32位模式.区别在于
CX = 开始地址的Bits 0-15
DX = 开始地址的Bits 16-31
在32位保护模式下使用VBE的32位界面,需要定义2个选择子和数据段,
这些是由调用者分配和初始化的.数据段的限制将被设为64K.
另外不要忘了32位的VBE界面需要32位的栈.

>关于函数 00h
在VBE 2.0中,VBE的标识不再是"VESA",而是"VBE2"
另外还增加了许多不重要的字符信息,这里就不提了. :>> (我狠懒)

>关于函数 01h
调用后得到的信息增加了
PhysBasePtr dd ? ; 32位缓存的物理地址
OffScreenMemOffset dd ? ; 指向屏幕显示部分在缓存中的偏移量
OffScreenMemSize dw ? ; 以1K为单位的屏幕显示部分的缓存大小
Reserved db 206 dup (?) ; 保留

其中 ModeAttributes (得到的信息表的第一项) VBE 2.0 增加了
Bit 5 为1时,支持VGA兼容模式
Bit 6 为1时,支持窗口缓存模式
Bit 7 为1时,支持线形缓冲模式

>关于函数 02h
VBE 2.0中设置BX的D14可以使用线形缓存.
Note:VBE BIOS 2.0 将相应设置BIOS数据区40:87的内存清除标志,以便于VBE
. 的函数03h返回这个标志.而VBE BIOS 1.2以前的版本忽略这个标志.

>关于函数 03h
VBE 2.0的变化基本同函数 02h

>关于函数 05h
在使用线形缓存时,调用此函数将返回AH=03H,调用失败.

>关于函数 0Ah
... 这是VBE 2.0的重头戏: 返回 VBE 保护模式界面 (一张表)

输入:
AX =4F0Ah VBE 2.0 Protected Mode Interface
BL =00h Return protected mode table
输出:
AX = 返回码
ES = 实模式下表的段
DI = 表的偏移量
CX = 包括保护模式代码在内的表的总长度(字节为单位)
(for copying purposes)
表的格式:(这里就用E文了,相信大虾们一看就明白 :) 累死了)
ES:DI + 00h Word Offset in table of Protected mode code for
Function 5 for Set Window Call
ES:DI + 02h Word Offset in table of Protected mode code for
Function 7 for set Display Start
ES:DI + 04h Word Offset in table of Protected mode code for
Function 9 for set Primary Palette data
ES:DI + 06h Word Offset in table of Ports and Memory Locations
that the application may need I/O privilege for.
(Optional: if unsupported this must be 0000h)
(See Sub-table for format)
ES:DI + ? Variable remainder of Table including Code
The format of the Sub-Table (Ports and Memory locations)
. Port, Port, ... , Port, Terminate Port List with FF FF,
. Memory locations (4 bytes), Length (2 bytes), Terminate Memory List
. with FF FF.
Example 1. For Port/Index combination 3DE/Fh and Memory locations DE800-DEA00h
. (length = 200h) the table would look like this:
. DE 03 DF 03 FF FF 00 E8 0D 00 00 02 FF FF
Example 2. For only the ports it would look like:
. DE 03 DF 03 FF FF FF FF
Example 3. For only the memory locations it would look like
. FF FF 00 E8 0D 00 00 02 FF FF

... 再次声明,本文是根据小D的理解而作.而且并不全面.请大虾对照E文原版
... 观看,若有错误和遗漏,请指教.更希望大虾们(尤其是WDJ,BC,TP,FG...)
... 能抽空翻译全文,以拯救芸芸众生.阿门.

>>> _/_/_/_/ _/ _/ /-_/_ _ /, _ E-mail: cloudwu@nease.net
> _/ _/ _/ _/ _\ /_ /_//_/_/ |_| 江城浪子 Cloud Wu 欢迎你来
_/_/_/_/ _/_/_/_/_/ http://www.nease.net/~cloudwu 云风工作室 〖胖〗

... All 同学,希望你读了本信后,写点心得体会,并要请家长签名!
-!- 蓝波车明汉化版 v2.31
! Origin: Jingle BBS武汉劲捷电子信息站(027)3648668,3636678,3692889 (6:663/2)

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.197.71.12]


休息一下

饮水思源站 休息一下 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Girl Friend Algorithm& Analysis tap | 1284 | 01/03/26 18:34


发信人: tap (风花雪月), 信区: C
标 题: Girl Friend Algorithm& Analysis
发信站: 饮水思源站 (Sun May 17 19:06:51 1998) , 站内信件
if (you desired to have a gf && you are normal male human)
{
if (look for female human == SUCCESS)
{
if (talk to target == SUCCESS)
{
if(catch target == SUCCESS)
goto SUCCESS;
else
{
fall in depression;
examine what's wrong;
goto initial condition;
}
}
else
{
examine what's wrong;
goto initial condition;

}

}

else
{

go to hell;

}

}

else if (you are currently hunted by a girl && you are male human)

{

if (the girl does not match your requirement)

{

get rid off her;

goto initial condition as soon as possible;

}
else
{
go to hell;
}
}
else if (you are currently hunted by a girl && you are male human)
{
if (the girl does not match your requirement)
{
get rid off her;
goto initial condition as soon as possible;
}
else
{
catch the girl;
goto SUCCESS;
}
}
else
go to take a look of psychologist;

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 166.111.60.108]


TC / BC

饮水思源站 TC / BC 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Re: 怎样使用class stack? 请教 sticker | 572 | 01/03/26 18:42
目录 | 一个小问题 | 5项 | 01/03/27 19:50
文件 | Re: 用BC函数使计算机重新启动 howe | 1072 | 01/03/27 20:15
文件 | Re: 请教打印问题。� liujq | 505 | 01/03/27 21:38
文件 | Re: 请教打印问题。� killers | 545 | 01/03/27 21:38
目录 | Turbo C 2.0 | 4项 | 01/03/27 21:45
文件 | 图像平移 jia | 4124 | 01/03/27 21:46
文件 | Re: 如何声明类中函数？ luckyfang | 1186 | 01/03/28 12:59
文件 | Re: 如何使用Qsort函数? asadi | 997 | 01/03/28 12:59


一个小问题

饮水思源站 一个小问题 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 一个小问题 qgp | 490 | 01/03/27 19:50
文件 | Re: 一个小问题 hhfeng | 742 | 01/03/27 19:50
文件 | Re: 一个小问题 law | 578 | 01/03/27 19:50
文件 | Re: 一个小问题 toll | 713 | 01/03/27 19:50
文件 | Re: 一个小问题 toll | 373 | 01/03/27 19:50


发信人: qgp (修罗王.一平), 信区: C
标 题: 一个小问题
发信站: 饮水思源站 (Tue Dec 22 10:28:07 1998) , 站内信件
在TURBO C中定义了一个二维浮点数组，但是从键盘输入时出现运行错误：
scanf:floating point formats not linked (大概是这样)

我的输入代码如下：
....
for (i=1;i<N;i++)
for (j=1;j<N;j++)
scanf("%f",&a[i][j])
....
不可能出错吧？请问各位高手这个问题是什么？怎样解决？

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.38.222.17]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: 一个小问题
发信站: 饮水思源站 (Tue Dec 22 14:56:00 1998) , 站内信件
【 在 qgp (修罗王.一平) 的大作中提到: 】
: 在TURBO C中定义了一个二维浮点数组，但是从键盘输入时出现运行错误：
: scanf:floating point formats not linked (大概是这样)
: 我的输入代码如下：
: ....
: for (i=1;i<N;i++)
: for (j=1;j<N;j++)
: scanf("%f",&a[i][j])
: ....
: 不可能出错吧？请问各位高手这个问题是什么？怎样解决？

TURBO C是有这个问题。Borland C++ 3.1 帮助里面有个最好的解决办法，
就是引用floating library中的一个全程变量。不过我一般是引用一个
ecvt 或 gcvt 函数，用没有用的参数调用一下再编译连接就可以了。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: law (海狼), 信区: C
标 题: Re: 一个小问题
发信站: 饮水思源站 (Tue Dec 22 15:44:25 1998) , 站内信件
【 在 hhfeng (快乐的眼睛) 的大作中提到: 】
: TURBO C是有这个问题。Borland C++ 3.1 帮助里面有个最好的解决办法，
: 就是引用floating library中的一个全程变量。不过我一般是引用一个
: ecvt 或 gcvt 函数，用没有用的参数调用一下再编译连接就可以了。

先读入一个临时变量，再赋值
--

这虚无的城市，这飘渺的城市。
在拥挤的人群中，我已找不到我自己。

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.190]


发信人: toll (鸣), 信区: C
标 题: Re: 一个小问题
发信站: 饮水思源站 (Fri Jul 2 21:13:33 1999) , 转信
【 在 yzc (阿凯) 的大作中提到: 】
: 这是tc的一个bug,换成一维数组或用其它方法代替吧。
: 【 在 qgp (修罗王.一平) 的大作中提到: 】
: : 在TURBO C中定义了一个二维浮点数组，但是从键盘输入时出现运行错误：
: : scanf:floating point formats not linked (大概是这样)
: : 我的输入代码如下：
: : ....
: : for (i=1;i<N;i++)
: : for (j=1;j<N;j++)
: : scanf("%f",&a[i][j])
: : ....
: : 不可能出错吧？请问各位高手这个问题是什么？怎样解决？
:
:
虽然是个bug，不过可以在scanf...之前执行printf（"%f",1.1）
来连上浮点库。
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www-post@bbs]


发信人: toll (鸣), 信区: C
标 题: Re: 一个小问题
发信站: 饮水思源站 (Sat Jul 10 11:46:57 1999) , 转信
对不起，前一次回答没看清楚问题。
现做如下解答：

main()
{
float a[n][m],b;
int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%f",&b);
a[i][j]=b;
}
...

虽然比较笨拙，只好如此了。
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www-post@bbs]


发信人: howe (无痕), 信区: C
标 题: Re: 用BC函数使计算机重新启动
发信站: 饮水思源站 (Wed Mar 31 10:04:43 1999) , 站内信件
【 在 holly (Holly) 的大作中提到: 】
: int 19H

INT 19H是重新加载系统，不是严格意义的热启动，在很多机器上调用这个中断
会出现如下情况：
机器马上出现Starting MSDOS...然后就停住了。

一般在DOS下重启动的方法是：JMP FFFF:0000
在JMP前设置内存中某处的标志量来决定是热启动还是冷启动（记不清在哪里了，好象
是0071H处)
但是C和汇编都不支持直接远跳转
有两个方法可以实现这一点。
一种是写一个重启动的函数，这个函数中写一个正常的跳转，然后用debug修改
EXE,把跳转终点改成FFFF:0000
还有一个方法是直接用debug写一个重启动函数(冷启动只要5个字节长,EA 00 00 FF FF)。
然后在程序里用shell调用。
--
莫
求
莫 无
逐 痕
有
缘

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.223]


发信人: liujq (天高任我飞), 信区: C
标 题: Re: 请教打印问题。�
发信站: 饮水思源站 (Sun Nov 14 15:23:42 1999) , 站内信件
我曾经作过一个，所用方法如下（比较笨的方法）：
1.打印机初始化，设置相应的打印精度（参考相关打印机手册）。
2.读取图形的一行，转换成打印机要求格式（Turbo C有相应的图形函数）。
3.重复2，直至所有图形区域。

【 在 killers (小马) 的大作中提到: 】
: 怎样把dos下 turbo C的图形打印出来。
: 不用Print Screen。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.118.229.84]


发信人: killers (小马), 信区: C
标 题: Re: 请教打印问题。�
发信站: 饮水思源站 (Sun Nov 21 21:15:04 1999) , 站内信件
【 在 liujq (天高任我飞) 的大作中提到: 】
: 我曾经作过一个，所用方法如下（比较笨的方法）：
: 1.打印机初始化，设置相应的打印精度（参考相关打印机手册）。
: 2.读取图形的一行，转换成打印机要求格式（Turbo C有相应的图形函数）。
: 3.重复2，直至所有图形区域。

感谢这位大侠，最后我用Esc打印指令和

getpixelcolor()解决了这个问题。好象就是

你说的方法。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.45]


Turbo C 2.0

饮水思源站 Turbo C 2.0 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Turbo C jia | 2722 | 01/03/27 21:44
文件 | Turbo C 2.0的配置文件 jia | 945 | 01/03/27 21:44
文件 | Turbo C 2.0的安装和启动 jia | 990 | 01/03/27 21:44
文件 | Turbo C 2.0集成开发环境的使用 jia | 13933 | 01/03/27 21:45


发信人: luckyfang (老K), 信区: C
标 题: Re: 如何声明类中函数？
发信站: 饮水思源站 (Sun Dec 26 18:51:29 1999), 转信
你要把这些文件全部加入到工程里去!

【 在 corn 的大作中提到: 】
: 在用BC3.1编程过程中遇到如下问题：
: test.h包含类中变量和函数的声明， test.cpp中定义了该类的所有
: 函数， testmain.cpp为主程序，将调用类中的某些函数。但是在连接
: 时出现错误，说是被调用的类函数(Ctest(),displayw())没有在主程序中定义
: （undefined symbol)。请教各位大侠如何才能使程序正确？不胜感谢！
: test.h
: class Ctest
: {public: Ctest();
: void displayw(void);
: };
: test.cpp
: #include "test.h"
: Ctest::Ctest()
: {
: }
: void Ctest::displayw(void)
: {
: }
: testmain.cpp
: #include "test.h"
: void main()
: { Ctest *p1;
: p1=new Ctest;
: p1->displayw();
: delete p1;
: return 0;
: }

--

_/ _/ _/ _/_/ _/ _/ _/ _/
_/ _/ _/ _/ _/ _/ _/ _/ _/
_/ _/ _/ _/ _/_/ _/_/
_/ _/ _/ _/ _/ _/ _/ _/
_/_/_/ _/_/ _/_/ _/ _/ _/

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.53.64]


发信人: asadi (谁认识连丹怡(上海外国语学校)), 信区: C
标 题: Re: 如何使用Qsort函数?
发信站: 饮水思源站 (Mon Dec 27 22:22:42 1999), 转信
【 在 jia (小木头) 的大作中提到: 】
: 发信人: Bazooka (踏雪无痕), 信区: C
: 标 题: 如何使用Qsort函数?
: 发信站: 饮水思源站 (Sat Dec 18 15:47:39 1999) , 站内信件
: TC的Stdlib.h中有个Qsort函数,使用快速排序法,请问如何使用
: 似乎要自己写一比较的程序.请各位大虾指教,不胜感谢!

Qsort的用法如下

#include "stdlib.h"
void qsort(void *buf,size_t num,size_t size,
int ( * compare) (const void *, const void *));

函数qsort()用对buf指向的数组快速排序.
退出时,数组已经排序,num指出数组中元素的数目,size说明元素占多少字节

compare指向的函数比较数组元素的关键字,起行时必须是

func_name (const void *arg1, const void * arg2);
返回值必须是 <0 ,如果arg1<arg2
=0 ,如果arg1=arg2
>0, 如果arg1>arg2

数组按升序排列,最低地址处放最小元素

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.34.9.55]


Unix

饮水思源站 Unix 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Re: Unix C中有没有函数srand48()和drand xjzhou | 757 | 01/03/26 19:00
目录 | 问题讨论 | 1项 | 01/03/27 18:38
文件 | Re: 有没有将fortran转换为C语言的工具? magirl | 347 | 01/03/27 21:15
文件 | Unix下的C语言编程 gwing | 7428 | 01/03/28 13:02
文件 | Re: 怎样在unix上做Socket编程？ law | 354 | 01/03/28 13:30


发信人: xjzhou (流浪者), 信区: C
标 题: Re: Unix C中有没有函数srand48()和drand48()????
发信站: 饮水思源站 (Sun Sep 6 00:11:02 1998) , 站内信件
Unix C 中有 srand48() 及 drand48() :

void srand48(long seedval);
double drand48(void);

这些函数使用 linear congruential 算法和 48位的整数计算。srand48()用来初始化，
它必须在drand48()前使用。 drand48()则产生位于[0.0, 1.0)区间的双精度浮点数。

int rand(void);
void srand( unsigned int seed );

同样 srand()用来初始化，它必须在rand()前使用。rand()产生的是从 0 到 (2^15)-1
的整数。如果 srand 时的种子不变则 rand 产生的随机数序列也不会变。
【 在 shuey (悠悠) 的大作中提到: 】
:
: 它们与Ansi C 中的函数rand()和srand()有何区别?
:
: 谢谢.
:
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www]


问题讨论

饮水思源站 问题讨论 精华区离线浏览
类型 | 标题 | 长度 | 时间
目录 | 哪里去找原代码? | 7项 | 01/03/27 18:38


哪里去找原代码?

饮水思源站 哪里去找原代码? 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 哪里去找原代码? turn | 252 | 01/03/27 18:38
文件 | Re: 哪里去找原代码? seagate | 364 | 01/03/27 18:38
文件 | Re: 哪里去找原代码? turn | 452 | 01/03/27 18:38
文件 | Re: 哪里去找原代码? abbelf | 349 | 01/03/27 18:38
文件 | Re: 哪里去找原代码? seagate | 384 | 01/03/27 18:38
文件 | Re: 哪里去找原代码? hhfeng | 317 | 01/03/27 18:38
文件 | Re: 哪里去找原代码? seagate | 290 | 01/03/27 18:38


发信人: turn (投机分子), 信区: C
标 题: 哪里去找原代码?
发信站: 饮水思源站 (Wed Nov 25 15:56:43 1998) , 转信
哪里可以找到一些标准的程序,比如利用
链表作排序操作...可否提供一些好的
C语言网站?
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: 哪里去找原代码?
发信站: 饮水思源站 (Thu Nov 26 09:12:11 1998) , 站内信件
【 在 turn (投机分子) 的大作中提到: 】
: 哪里可以找到一些标准的程序,比如利用
: 链表作排序操作...可否提供一些好的
: C语言网站?

Why donot you use STL ?
--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: eesun3.tamu.edu]


发信人: turn (投机分子), 信区: C
标 题: Re: 哪里去找原代码?
发信站: 饮水思源站 (Thu Nov 26 10:59:27 1998) , 转信
【 在 seagate (风雪夜归人) 的大作中提到: 】
: 【 在 turn (投机分子) 的大作中提到: 】
: : 哪里可以找到一些标准的程序,比如利用
: : 链表作排序操作...可否提供一些好的
: : C语言网站?
:
:
: Why donot you use STL ?

I am doing this in UNIX.
Can i get STL for HPUX? Where to get it?
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www]


发信人: abbelf (神之擎), 信区: C
标 题: Re: 哪里去找原代码?
发信站: 饮水思源站 (Thu Nov 26 16:45:12 1998) , 站内信件
【 在 turn (投机分子) 的大作中提到: 】
: I am doing this in UNIX.
: Can i get STL for HPUX? Where to get it?

也可以用 G++ lib
在各大FTP 的GNU目录下都有

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: 哪里去找原代码?
发信站: 饮水思源站 (Thu Nov 26 23:34:02 1998) , 站内信件
【 在 turn (投机分子) 的大作中提到: 】
: I am doing this in UNIX.
: Can i get STL for HPUX? Where to get it?
Those 2 guys who create STL are working in HP <-- I remember

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: eesun3.tamu.edu]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: 哪里去找原代码?
发信站: 饮水思源站 (Thu Nov 26 23:49:35 1998) , 站内信件
【 在 seagate (风雪夜归人) 的大作中提到: 】
: Those 2 guys who create STL are working in HP <-- I remember

Yes. :)

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: 哪里去找原代码?
发信站: 饮水思源站 (Fri Nov 27 02:12:54 1998) , 站内信件
http://www.sgi.com/Technology/STL/download.html
ftp://butler.hpl.hp.com/stl/

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: eesun3.tamu.edu]


发信人: magirl (水皮鱼), 信区: C
标 题: Re: 有没有将fortran转换为C语言的工具?
发信站: 饮水思源站 (Sun Nov 7 13:28:42 1999) , 转信
有，GNU的f2c。

【 在 wj (thinking) 的大作中提到: 】
: 请问各位,有没有这种工具可将Fortran程序自动转换
: 为C 或 C++程序? 在此谢过了.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 159.226.88.132]


发信人: gwing (网之强), 信区: C
标 题: Unix下的C语言编程
发信站: 饮水思源站 (Tue Jan 4 19:16:38 2000) , 转信
前言
本文译自《Slackware Linux Unleashed》(第三版) 一书的第27章: Programming in C. 关于本译文有任何的话请与我联系: mailto:con@nease.net.

Linux的发行版中包含了很多软件开发工具. 它们中的很多是用于 C 和 C++应用程序开发的. 本文介绍了在 Linux 下能用于 C 应用程序开发和调试的工具. 本文的主旨是介绍如何在 Linux 下使用 C 编译器和其他 C 编程工具, 而非 C 语言编程的教程. 在本文中你将学到以下知识:

什么是 C
GNU C 编译器
用 gdb 来调试GCC应用程序
你也能看到随 Linux 发行的其他有用的 C 编程工具. 这些工具包括源程序美化程序(pretty print programs), 附加的调试工具, 函数原型自动生成工具(automatic function prototypers).

--------------------------------------------------------------------------------

注意: 源程序美化程序(pretty print programs)自动帮你格式化源代码产生始终如一的缩进格式.

--------------------------------------------------------------------------------

什么是 C?
C 是一种在 UNIX 操作系统的早期就被广泛使用的通用编程语言. 它最早是由贝尔实验室的 Dennis Ritchie 为了 UNIX 的辅助开发而写的, 开始时 UNIX 是用汇编语言和一种叫 B 的语言编写的. 从那时候起, C 就成为世界上使用最广泛计算机语言.

C 能在编程领域里得到如此广泛支持的原因有以下一些:

它是一种非常通用的语言. 几乎你所能想到的任何一种计算机上都有至少一种能用的 C 编译器. 并且它的语法和函数库在不同的平台上都是统一的, 这个特性对开发者来说很有吸引力.
用 C 写的程序执行速度很快.
C 是所有版本的UNIX上的系统语言.
C 在过去的二十年中有了很大的发展. 在80年代末期美国国家标准协会(American National Standards Institute)发布了一个被称为 ANSI C 的 C 语言标准.这更加保证了将来在不同平台上的 C 的一致性. 在80年代还出现了一种 C 的面向对象的扩展称为 C++. C++ 将在另一篇文章 "C++ 编程"中描述.

Linux 上可用的 C 编译器是 GNU C 编译器, 它建立在自由软件基金会的编程许可证的基础上, 因此可以自由发布. 你能在 Linux 的发行光盘上找到它.

GNU C 编译器
随 Slackware Linux 发行的 GNU C 编译器(GCC)是一个全功能的 ANSI C 兼容编译器. 如果你熟悉其他操作系统或硬件平台上的一种 C 编译器, 你将能很快地掌握 GCC. 本节将介绍如何使用 GCC 和一些 GCC 编译器最常用的选项.

使用 GCC
通常后跟一些选项和文件名来使用 GCC 编译器. gcc 命令的基本用法如下:

gcc [options] [filenames]
命令行选项指定的操作将在命令行上每个给出的文件上执行. 下一小节将叙述一些你会最常用到的选项.

GCC 选项
GCC 有超过100个的编译选项可用. 这些选项中的许多你可能永远都不会用到, 但一些主要的选项将会频繁用到. 很多的 GCC 选项包括一个以上的字符. 因此你必须为每个选项指定各自的连字符, 并且就象大多数 Linux 命令一样你不能在一个单独的连字符后跟一组选项. 例如, 下面的两个命令是不同的:

gcc -p -g test.c

gcc -pg test.c
第一条命令告诉 GCC 编译 test.c 时为 prof 命令建立剖析(profile)信息并且把调试信息加入到可执行的文件里. 第二条命令只告诉 GCC 为 gprof 命令建立剖析信息.

当你不用任何选项编译一个程序时, GCC 将会建立(假定编译成功)一个名为 a.out 的可执行文件. 例如, 下面的命令将在当前目录下产生一个叫 a.out 的文件:

gcc test.c
你能用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out. 例如, 将一个叫 count.c 的 C 程序编译为名叫 count 的可执行文件, 你将输入下面的命令:

gcc -o count count.c

--------------------------------------------------------------------------------

注意: 当你使用 -o 选项时, -o 后面必须跟一个文件名.

--------------------------------------------------------------------------------

GCC 同样有指定编译器处理多少的编译选项. -c 选项告诉 GCC 仅把源代码编译为目标代码而跳过汇编和连接的步骤. 这个选项使用的非常频繁因为它使得编译多个 C 程序时速度更快并且更易于管理. 缺省时 GCC 建立的目标代码文件有一个 .o 的扩展名.

-S 编译选项告诉 GCC 在为 C 代码产生了汇编语言文件后停止编译. GCC 产生的汇编语言文件的缺省扩展名是 .s . -E 选项指示编译器仅对输入文件进行预处理. 当这个选项被使用时, 预处理器的输出被送到标准输出而不是储存在文件里.

优 化 选 项
当你用 GCC 编译 C 代码时, 它会试着用最少的时间完成编译并且使编译后的代码易于调试. 易于调试意味着编译后的代码与源代码有同样的执行次序, 编译后的代码没有经过优化. 有很多选项可用于告诉 GCC 在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件. 这些选项中最典型的是-O 和 -O2 选项.

-O 选项告诉 GCC 对源代码进行基本优化. 这些优化在大多数情况下都会使程序执行的更快. -O2 选项告诉 GCC 产生尽可能小和尽可能快的代码. -O2 选项将使编译的速度比使用 -O 时慢. 但通常产生的代码执行速度会更快.

除了 -O 和 -O2 优化选项外, 还有一些低级选项用于产生更快的代码. 这些选项非常的特殊, 而且最好只有当你完全理解这些选项将会对编译后的代码产生什么样的效果时再去使用. 这些选项的详细描述, 请参考 GCC 的指南页, 在命令行上键入 man gcc .

调试和剖析选项
GCC 支持数种调试和剖析选项. 在这些选项里你会最常用到的是 -g 和 -pg 选项.
-g 选项告诉 GCC 产生能被 GNU 调试器使用的调试信息以便调试你的程序. GCC 提供了一个很多其他 C 编译器里没有的特性, 在 GCC 里你能使 -g 和 -O (产生优化代码)联用. 这一点非常有用因为你能在与最终产品尽可能相近的情况下调试你的代码. 在你同时使用这两个选项时你必须清楚你所写的某些代码已经在优化时被 GCC 作了改动. 关于调试 C 程序的更多信息请看下一节"用 gdb 调试 C 程序" .
-pg 选项告诉 GCC 在你的程序里加入额外的代码, 执行时, 产生 gprof 用的剖析信息以显示你的程序的耗时情况. 关于 gprof 的更多信息请参考 "gprof" 一节.

用 gdb 调试 GCC 程序
Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能:

它使你能监视你程序中变量的值.
它使你能设置断点以使程序在指定的代码行上停止执行.
它使你能一行行的执行你的代码.

在命令行上键入 gdb 并按回车键就可以运行 gdb 了, 如果一切正常的话, gdb 将被启动并且你将在屏幕上看到类似的内容:

GDB is free software and you are welcome to distribute copies of it

under certain conditions; type "show copying" to see the conditions.

There is absolutely no warranty for GDB; type "show warranty" for details.

GDB 4.14 (i486-slakware-linux), Copyright 1995 Free Software Foundation, Inc.

(gdb)
当你启动 gdb 后, 你能在命令行上指定很多的选项. 你也可以以下面的方式来运行 gdb :

gdb <fname>
当你用这种方式运行 gdb , 你能直接指定想要调试的程序. 这将告诉gdb 装入名为 fname 的可执行文件. 你也可以用 gdb 去检查一个因程序异常终止而产生的 core 文件, 或者与一个正在运行的程序相连. 你可以参考 gdb 指南页或在命令行上键入 gdb -h 得到一个有关这些选项的说明的简单列表.

为调试编译代码(Compiling Code for Debugging)
为了使 gdb 正常工作, 你必须使你的程序在编译时包含调试信息. 调试信息包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号. gdb 利用这些信息使源代码和机器码相关联.

在编译时用 -g 选项打开调试选项.

gdb 基本命令
gdb 支持很多的命令使你能实现不同的功能. 这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令, 表27.1列出了你在用 gdb 调试时会用到的一些命令. 想了解 gdb 的详细使用请参考 gdb 的指南页.

表 27.1. 基本 gdb 命令.

命 令 描 述
file 装入想要调试的可执行文件.
kill 终止正在调试的程序.
list 列出产生执行文件的源代码的一部分.
next 执行一行源代码但不进入函数内部.
step 执行一行源代码而且进入函数内部.
run 执行当前被调试的程序
quit 终止 gdb
watch 使你能监视一个变量的值而不管它何时被改变.
break 在代码里设置断点, 这将使程序执行到这里时被挂起.
make 使你能不退出 gdb 就可以重新产生可执行文件.
shell

--
※ 来源:．饮水思源站WWW bbs.sjtu.edu.cn. [FROM: 210.74.134.221]


发信人: law (游戏*人生), 信区: C
标 题: Re: 怎样在unix上做Socket编程？
发信站: 饮水思源站 (Wed Mar 8 09:20:03 2000) , 转信

#define SERV_TCP_PORT 554
Ports under 700 are reserved for root.
you must be root to bind to those port.
#define SERV_ADDR "195.12.166.211"

--
※ 来源:．饮水思源站WWW bbs.sjtu.edu.cn. [FROM: 202.101.11.221]


C++ Builder

饮水思源站 C++ Builder 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Re: 请问谁有C++Builder的电子版书� law | 421 | 01/03/26 19:04
文件 | C++Builder发布可执行文件非要带个DLL不� mudfish | 321 | 01/03/27 16:46
文件 | Re: C++Builder发布可执行文件非要带个DL ini | 549 | 01/03/27 16:46
文件 | Re: HELP asong | 402 | 01/03/27 16:46
文件 | Re: C++BUILDER中如何使用MSCOMM控件？ reede | 703 | 01/03/28 20:26


发信人: law (海狼), 信区: C
标 题: Re: 请问谁有C++Builder的电子版书�
发信站: 饮水思源站 (Sat Sep 12 23:33:46 1998) , 站内信件
【 在 trends (一路等候) 的大作中提到: 】
: 如题

http://linux.ustc.edu.cn/books/c/cbuilder/

--

这虚无的城市，这飘渺的城市。
在拥挤的人群中，我已找不到我自己。

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.26.178]


发信人: mudfish (mudfish), 信区: C
标 题: C++Builder发布可执行文件非要带个DLL不可吗?
发信站: 饮水思源站 (Sat Oct 31 10:32:54 1998) , 站内信件
1.4M多的一个大DLL，这样发布可执行文件太没面子了。真的非要带上这个DLL不
可吗？请各位大虾帮忙！

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: bbs.njupt.edu.c]


发信人: ini (run), 信区: C
标 题: Re: C++Builder发布可执行文件非要带个DLL不可吗?
发信站: 饮水思源站 (Sat Oct 31 19:14:57 1998) , 站内信件
In options set dialog:
1. Packages page, unselect "Build with runtime packages";
2. Linker page, unselect "Use dynamic RTL".

then rebuild.

BTW: the steps are based on c++ builder 3.0

【 在 mudfish (mudfish) 的大作中提到: 】
: 1.4M多的一个大DLL，这样发布可执行文件太没面子了。真的非要带上这个DLL不
: 可吗？请各位大虾帮忙！

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.240.100]


发信人: asong (song), 信区: C
标 题: Re: HELP
发信站: 饮水思源站 (Fri Nov 6 09:31:04 1998) , 站内信件
改个显示模式试试（我以前用DELPHI3。0时遇到过类似问题这么解决的）

【 在 Gsf (哇噻) 的大作中提到: 】
: When i install Delphi4.0 or C++Builder3.0 and run it,then my machine
: halt.
: Can anybody tell me why?
: Thanx!!!

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 210.28.129.239]


发信人: reede (geo), 信区: C
标 题: Re: C++BUILDER中如何使用MSCOMM控件？
发信站: 饮水思源站 (Sun Aug 13 09:46:03 2000), 转信

The OLEVirant is not include in the CB, but it is supported by the Win API,
So you can use it. You can search olevirant in the cb help.
MSComm can be used in CB and Dephli. The detail example is found on the web
site CBuild world.
【 在 mudfish (mudfish) 的大作中提到: 】
: 【 在 asong (song) 的大作中提到: 】
: : MSCOMM中的INPUT和OUTPUT property类型（virant）c++builder中找不到，咋办？
: 推荐你使用async32控件(Delphi 3.0下的)，只要在C++ Builder下重新Install一下
: 就可以用了，非常好用。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.240.61]


小程序和小问题

饮水思源站 小程序和小问题 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Re: 任意大的整数如何实现? hotpot | 1486 | 01/03/26 19:22
文件 | Re: 任意大的整数如何实现? thebestone | 56 | 01/03/26 19:23
文件 | Re: 请教算法(九宫格问题) abbelf | 1633 | 01/03/27 21:04
文件 | 高斯消去法解n维的线性方程组的小程序 wisi | 2156 | 01/03/28 12:54
文件 | 演绎“生命游戏”--小程序 jia | 1633 | 01/03/28 19:19
文件 | 请教非递归掉用的二叉树遍历的算法 lawson | 613 | 01/03/28 20:05
文件 | Re: 请教非递归掉用的二叉树遍历的算法 truelance | 1539 | 01/03/28 20:05
文件 | Re: 请问由日期计算那天为星期几的算法 thebestone | 1174 | 01/03/28 20:51


发信人: hotpot (火锅), 信区: C
标 题: Re: 任意大的整数如何实现?
发信站: 饮水思源站 (Tue Oct 6 16:34:26 1998) , 站内信件
【 在 pdfan (lake) 的大作中提到: 】
: 现遇一难题,需 >10^9 的整数, 且需在其上定义加减乘除,幂,开方等
: 运算, 现请教如何用C或C++实现? maple , mathematica etc. 已经
: 能做到了
可以从这些运算的实现算法入手. 这儿有个 n^m 的例子, n 和 m 都
可以是大整数, 例如 2^100. 希望能够给你一点帮助和启发:

// following is it. hehe, just for pleasure...
#include <stdio.h>

#define BUFSIZE 1024
#define max_of(x,y) (((x)>(y))?(x):(y))

char x[BUFSIZE];
int len;

void display()
{
int i;
for( i=len; i>=0; i-- ) printf("%d",x[i]);
printf("\n");
}

int report(char* msg){ puts(msg); return 1; }

int main( int argc, char* argv[] )
{
char* p;
int n=2, m=100;
int i, j, k;
int temp = 0;

if( argc!=3 ) return report("syntax: p n m");
n = strtol(argv[1], &p, 10);
m = strtol(argv[2], &p, 10);
if(!(n>0&&m>0)) return report("invalid parameters.");

for(i=0;i
len = 0;
x[0] = n;
while( --m > 0 )
{
display();
for( i=len; i>=0; i-- )
{
for(temp=x[i]*n,x[i]=0,k=i; temp>0; temp/=10, k++)
{
if(k+1>BUFSIZE-1) return report("buffer overflow.");
x[k] += temp%10; len=max_of(k,len);
if(x[k]>=10){ x[k+1]++; x[k]-=10; len=max_of(k+1,len); }
}
}
}

display();
report("ok.");

return 0;
}

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.224.4]


有一行错误的，去掉就可以了，
另外， #include "stdlib.h"


发信人: abbelf (神之擎), 信区: C
标 题: Re: 请教算法(九宫格问题)
发信站: 饮水思源站 (Wed Aug 25 10:23:28 1999) , 站内信件
最傻的方法:
1: 描述状态空间
(很简单, 3x3矩阵即可, 也可以存为9进制数, 当然还可以考虑更紧凑的方法,
这个问题的等价问题就是描述一个全排列)
2: 描述状态转移(比如可用状态转移距阵,不过不大可行,内存不够,可存为稀疏矩阵)
3: 有向图的最短路径搜索
(有现成的算法,自己想么稍微费点神, 不过比问题本身好想)
这个方法傻就傻在用了奇大的空间.

或者直接用有界深度优先或者宽度优先搜索. (稍加改进成为动态的状态空间搜索)

【 在 artin (artin) 的大作中提到: 】
: 有一个著名的九宫格问题:
: 在三行三列的九个格子里,依次填入1-8,第九个格子空着:
: ___________
: | 1 | 2 | 3 |
: |___|___|___|
: | 4 | 5 | 6 |
: |___|___|___|
: | 7 | 8 | |
: |___|___|___|
: 交换数字与空格的位置,如何以最少步数得到:得到:
: ___________
: | 8 | 7 | 6 |
: |___|___|___|
: | 5 | 4 | 3 |
: |___|___|___|
: | 2 | 1 | |
: |___|___|___|
: 如何编程得到移法,使步数最少,最少步数为30步,总共有十种移法只需30步,36步的移
: 法很多,不过,那不是最少的.这个问题困扰我好长时间了,有一段时间简直是入了迷,
: 还是没能做出来,看大家的了!!!

--
<a href="http://202.120.16.15/">

http://202.120.16.15/ (电子书籍、网络游戏、聊天室)
</a>

※ 修改:·abbelf 於 Aug 25 10:31:41 修改本文·[FROM: 202.120.16.15]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: jia (小木头), 信区: C
标 题: 演绎“生命游戏”--小程序
发信站: 饮水思源站 (Sun May 7 18:19:55 2000), 转信
发信人: ashygirl (呆瓜小贼), 信区: AC
标 题: 演绎“生命游戏”--小程序
发信站: 武汉白云黄鹤站 (Sat May 6 19:52:12 2000), 站内信件

前几天看到一个C程序很有意思，
大概是讲以一个方块作为生存空间，
每个生物周围都有8块空间，
若8块中有3块的生物活，则此生物不管原来的状态，都变成活。
若8块中有2块的生物活，则此生物就保持原样。
其余的情况生物就死。
编译了一把，以100X100的大小，默认开始时所有空间内都为活，
显示的图案很不错，大家不妨试试。
^o^

#include <graphics.h>
main()
{
int orgData[100][100],resData[100][100];
int nCount,nRows,nCols,i,j,times;
int GraphDriver=DETECT,GraphMode;
for (i=0;i<100;i++)
for (j=0;j<100;j++) orgData[i][j]=1;
initgraph(&GraphDriver,&GraphMode,"");
setcolor(WHITE);
rectangle(270,190,370,290);
for (times=1;times<200;times++){
for (nRows=1;nRows<99;nRows++){
for (nCols=1;nCols<99;nCols++){
nCount=orgData[nRows-1][nCols-1]+orgData[nRows-1][nCols]
+orgData[nRows-1][nCols+1]+orgData[nRows][nCols-1]
+orgData[nRows][nCols+1]+orgData[nRows+1][nCols-1]
+orgData[nRows+1][nCols]+orgData[nRows+1][nCols+1];
switch (nCount){
case 3: putpixel(nCols+210,120+nRows,BLACK);
resData[nRows][nCols]=1;break;
case 2: resData[nRows][nCols]=orgData[nRows][nCols];break;
default: resData[nRows][nCols]=0;putpixel(nCols+210,120+nRows,WHITE);
}
}
}
for (i=1;i<99;i++)
for (j=1;j<99;j++) orgData[i][j]=resData[i][j];
getch();
}
}

--

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: lawson (文明), 信区: C
标 题: 请教非递归掉用的二叉树遍历的算法
发信站: 饮水思源站 (Wed Jun 28 00:08:10 2000) , 转信
我在写一个非递归调用的二叉树遍历的算法,书上只提供了中序遍历的算法,
先序和后序的非递归的算法没有提供.
哪位大虾能否把另两种算法贴上来,谢谢!

其中非递归的中序遍历的算法如下:

InOrderTraverse(BiTree T)
{
InitStack(S);
p=T;
while(p||!StackEmpty(S)) {
if (p) {
Push(S,p);
p=p->lchild;}
else {
Pop(S,p);
printf("%d\t",p->data);
p=p->rchild;
} // else
} // while
}

--
※ 来源:．饮水思源站WWW bbs.sjtu.edu.cn. [FROM: 61.129.176.1]


发信人: truelance (兰斯洛), 信区: C
标 题: Re: 请教非递归掉用的二叉树遍历的算法
发信站: 饮水思源站 (Wed Jun 28 11:54:21 2000), 转信
FirstOrderTraverse(BiTree T)
{
InitStack(S);
p=T;
while(p||!StackEmpty(S)) {
if (p) {
printf("%d\t",p->data);
Push(S,p);
p=p->lchild;}
else {
Pop(S,p);
p=p->rchild;
} // else
} // while
}
LastOrderTraverse(BiTree T)
{
InitStack(S);
p=T;
Ward=Left;
while(p||!StackEmpty(S)) {
switch Ward {
case Left:
if(p) {
Push(S,[p,Right]);
p=p->lchild; }
else
Pop(s,[p,Ward]);
case Right:
Push(S,[p,Root]);
p=p->rchild;
Ward=Left;
case Root:
printf("%d\t",p->data);
if(!StackEmpty(S))
Pop(s,[p,Ward]);
else
p=Nil;
} // switch
} // while
}
【 在 lawson (文明) 的大作中提到: 】
: 我在写一个非递归调用的二叉树遍历的算法,书上只提供了中序遍历的算法,
: 先序和后序的非递归的算法没有提供.
: 哪位大虾能否把另两种算法贴上来,谢谢!
: 其中非递归的中序遍历的算法如下:
: InOrderTraverse(BiTree T)
: {
: InitStack(S);
: p=T;
: while(p||!StackEmpty(S)) {
: if (p) {
: Push(S,p);
: p=p->lchild;}
: else {
: Pop(S,p);
: printf("%d\t",p->data);
: p=p->rchild;
: } // else
: } // while
: }

--
我有迷魂招不得

※ 修改:·truelance 於 Jun 28 11:56:24 修改本文·[FROM: 202.120.16.216]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.216]


发信人: thebestone ((今天是二○○○年九月二十二日）), 信区: C
标 题: Re: 请问由日期计算那天为星期几的算法
发信站: 饮水思源站 (Fri Sep 22 18:21:30 2000), 站内信件
BorlandC，不知道您的这个要求是不是一个 DOS 的程序，//Linux 我不清楚
如果是 DOS 程序的话，那么算你是幸运了，
我刚才帮您找了找，居然找到了，//我原先自己还不晓得呢，哼！

DOS 环境下， Turbo C++ 3.0
中 Help 找函数 mktime(...)，找其帮助，
其中有一个例子，这个函数能够完成您要求的功能。

//其实，如果编一个小的程序，也就是那么的 十来分钟，我也懒的写也，呵呵

【 在 thebestone ((今天是二○○○年九月二十二日）) 的大作中提到: 】
: 这种程序自己写一个不就是了吗？
: 我现在没有，不过，我想，如果写的话，也不会用多少时间的，
: 自己可以试一试呀。
: 估计也就是一个纯粹的 C 语言的问题，
: 与操作系统无关，也与编译环境无关。
: 写上那么 10 行， 或者 20 行就差不多了吧，呵呵...
: Try...
: 【 在 borlandc (FANTY) 的大作中提到: 】
: : 以前在北大的一本书上看到过这样一个程序：当用户输入日期明，程序便
: : 输出那天是星期几，那是很喜欢那个算法，但现在已丢了，如果各位有这方面
: : 的算法或原码，请相助。谢过！

--

这是我的 签名档。

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


Others

饮水思源站 Others 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Re: 求助!-RecoverAll的注册码 Netguy | 410 | 01/03/27 18:44
文件 | 免费抽奖真“免费”吗？ agui. | 3756 | 01/03/27 19:14


发信人: Netguy ( HappyNetguy), 信区: C
标 题: Re: 求助!-RecoverAll的注册码
发信站: 饮水思源站 (Thu Nov 26 21:37:44 1998) , 转信
【 在 pard (pard) 的大作中提到: 】
: 那位仁兄能告诉我RecoverAll的注册码! 不胜感激.

Recover 4 All Ver 03.

http://ourworld.compuserve.com/homepages/Kaus

SuperUser KLTSMMPQQ
超级用户 SEWUS3WL

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.38.198.197]


发信人: agui.bbs@210.34.48.50 (阿桂), 信区: C
标 题: 免费抽奖真“免费”吗？
发信站: FZU_BBS (Sat Dec 12 19:27:39 1998)
转信站: sjtubbs!sjtunews!FZU_BBS
Origin: bbs.fzu.edu.cn
免费抽奖真“免费”吗？
文／Gu Huaiyong
免费抽奖真“免费”吗？
最近在接上闲逛，偶遇有人在搞免费抽奖，心中疑惑，便想一探
究竟，无奈自己概率之类学的不好，于是便用电脑写了个模拟的程序，
希望有兴趣的读者来模拟一下是否“免费”，并附上免费抽奖的传单
内容一份与大家共享。
*****************以下为传单内容******************************
XXX日用化妆品公司
产品展销让利大酬宾宣传活动
为了提高我公司产品知名度，经公司研究决定，在保证产品质量的
前提下，采取让利酬宾，拿出一部分电视广告费，进行免费抽奖赠送活
动。
免费抽奖说明如下
箱中共20个球，10分球10个，5分球10个，随心所欲从中抽出10
个球，
加起来的分数就是对奖号码，即中即送，中奖率100%。

一等奖 100分奖彩电一台 价值2000元
二等奖 50分奖VCD一台 价值1200元
三等奖 95分奖精美茶具一套 价值180 元
四等奖 55分奖太神洗发露两瓶 价值90 元
五等奖 60分奖太神洗发露一瓶 价值45 元
六等奖 65分奖太空杯一个
七等奖 85分奖袜子一双或牙膏一支
八等奖 70分奖毛巾一条
九等奖 90分奖洗衣粉一袋或肥皂一块

以上九条奖品全部为我公司免费奉送
特优奖：凡是抽中75分或80分者，可按优惠价28元购买太神植物防脱洗
发露
一瓶。（原价45元/每瓶）
祝君好运
制造商地址：XX省XXXX路32号
*******************以下为模拟抽奖的程序**************************
该程序用Qbasic写成
RANDOMIZE TIMER
CLS
COLOR 14
PRINT , , "免费抽奖现在开始!"
PRINT
"______________________________________________________________"
COLOR 15
INPUT "请输入您要抽奖的次数:", time
PRINT "抽奖"; time; "次"
PRINT "抽奖中..."
FOR k = 1 TO time
a5 = 0: a10 = 0
FOR i = 1 TO 10
IF RND(i) >= .5 THEN a5 = a5 + 1 ELSE a10 = a10 + 1
NEXT i
result = 5 * a5 + 10 * a10
SELECT CASE result
CASE 100
g100 = g100 + 1
CASE 50
g50 = g50 + 1
CASE 95
g95 = g95 + 1
CASE 55
g55 = g55 + 1
CASE 60
g60 = g60 + 1
CASE 65
g65 = g65 + 1
CASE 85
g85 = g85 + 1
CASE 70
g70 = g70 + 1
CASE 90
g90 = g90 + 1
CASE 75
pay75 = pay75 + 1
CASE 80
pay80 = pay80 + 1
CASE ELSE
END SELECT
NEXT k
COLOR 14
PRINT , , "结果公告"
PRINT "得分", "次数"
PRINT
"_______________________________________________________________"
COLOR 15
PRINT "100", g100
PRINT "50", g50
PRINT "95", g95
PRINT "55", g55
PRINT "60", g60
PRINT "65", g65
PRINT "85", g85
PRINT "70", g70
PRINT "90", g90
PRINT "75", pay75
PRINT "80", pay80
PRINT "按任意键看您得到的奖品和付出的钱数"
v$ = INPUT$(1)
COLOR 14
PRINT , , "最终结果"
PRINT
"_______________________________________________________________"
PRINT "您得到:"
COLOR 15
PRINT "彩电", g100; "台"
PRINT "VCD机", g50; "台"
PRINT "精美茶具", g95; "套"
PRINT "太神洗发露", g55 * 2 + g60; "瓶"
PRINT "太空杯", g65; "个"
PRINT "袜子或牙膏", g85; "个"
PRINT "毛巾", g70; "条"
PRINT "洗衣粉或肥皂", g90; "个"
COLOR 14: PRINT "请您付款:", (pay75 + pay80) * 28; : COLOR 15: PRINT
"元"
BEEP
PRINT "欢迎下次再来!"
END
--
生活，不是每天都有惊涛骇浪，
但是只要能仔细观察，总能找到让人回味的东西。
请放慢你匆匆忙忙的脚步，
品味生活中的点点滴滴。

--
※发信站 [福州大学庭芳苑BBS bbs.fzu.edu.cn] · FROM [210.34.53.234]


C++ 语言讨论

饮水思源站 C++ 语言讨论 精华区离线浏览
类型 | 标题 | 长度 | 时间
目录 | C++ quiz | 9项 | 01/03/27 19:31
文件 | 如何实现我我想实现的功能？ zhuxy | 556 | 01/03/27 19:31
文件 | Re: 如何实现我我想实现的功能？ ini | 866 | 01/03/27 19:31
目录 | 哪里有ＡＮＳＩC++标准的文档? | 10项 | 01/03/27 19:32
目录 | bc3.1中huge指针到底怎么用？ | 8项 | 01/03/27 19:41
目录 | 如何重载先赋值，后加的++？ | 8项 | 01/03/27 20:34
文件 | C++的沉迷与爱恋 Kind | 9911 | 01/03/28 14:20
文件 | Re: [转载] 请问如何用new分配两维数组？ martin | 541 | 01/03/28 19:54


C++ quiz

饮水思源站 C++ quiz 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | C++ quiz 1 sticker | 301 | 01/03/27 19:29
文件 | C++ quiz 1 anwer sticker | 1190 | 01/03/27 19:30
文件 | Re: C++ quiz 1 anwer abbelf | 1764 | 01/03/27 19:30
文件 | Re: C++ quiz 1 anwer sticker | 856 | 01/03/27 19:30
文件 | C++ quiz 2 sticker | 1608 | 01/03/27 19:31
文件 | Re: C++ quiz 2 abbelf | 1918 | 01/03/27 19:31
文件 | Re: C++ quiz 2 sticker | 1244 | 01/03/27 19:31
文件 | C++ quiz 3 sticker | 347 | 01/03/27 19:31
文件 | Re: C++ quiz 3 rectangle | 462 | 01/03/27 19:31


发信人: sticker (sticker), 信区: C
标 题: C++ quiz 1
发信站: 饮水思源站 (Mon Aug 10 09:42:20 1998) , 转信
//class definition

class A{
public:
A();
A(int);
};

//objects declaration

A a;
A a();
A a(3);

//which line is wrong and why?
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www]


发信人: sticker (sticker), 信区: C
标 题: Re: C++ quiz 1 anwer
发信站: 饮水思源站 (Tue Aug 11 14:20:28 1998) , 转信
【 在 abbelf (神之擎) 的大作中提到: 】
: 对, A a(); 应是函数声明，倒是没注意到，从未试图用 A a();
: 来声明过对象。光那一句话编译是没问题的, 所以没注意。:)
:
: 不过关于 () 和 (void) 的区别确实也不大清楚，不知道各个版本 C++ 的标准
: 里是怎么写的？我最早看的书认为 () 等价于 (...)；好象有编译器这样做的。
: 不过后来好象都被解释成 (void), 我看很多类库就是这么用的。
: 不知道你用的什么编译器。要找一套标准太麻烦了，望指教。

in the oldest C, () == (...). but ever since C people paid
attention to prototypes, () is interprated as (void).
a function f(...) has no prototype at all, therefore not
encouraged in modern C.

in the newest standard of C++, () == (void). it's the law:)
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www]


发信人: sticker (sticker), 信区: C
标 题: C++ quiz 3
发信站: 饮水思源站 (Wed Aug 12 14:45:05 1998) , 转信
//you are gonna provide this String class to
//other users. soon they will complain. why?

class String {
public:

String(char*);
String(String&);

length();

//etc...

};
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: www]


发信人: rectangle (圆圆), 信区: C
标 题: Re: C++ quiz 3
发信站: 饮水思源站 (Wed Aug 12 20:54:18 1998) , 站内信件
【 在 sticker (sticker) 的大作中提到: 】
: //you are gonna provide this String class to
: //other users. soon they will complain. why?
: class String {
: public:
: String(char*);
: String(String&);
: length();
: //etc...
: };

1)add const
2)unsigned int length()

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.7.201]


发信人: zhuxy (xyz), 信区: C
标 题: 如何实现我我想实现的功能？
发信站: 饮水思源站 (Sat Sep 5 16:18:34 1998) , 站内信件
从以下的代码中可以看出我的本意，可惜编译通不过，因为
指针类型不匹配。

class a{
a();
void (*f)(void);
void f1();
void f2();
}

a::a(){
f=f1;}
void a::f1(){
//执行其它操作;
f=f2;}
编译时说类型不匹配：f1,f2是非静态的；
改为static void f1(),static void f2()
后，则在f1的又出现错误说不可使用非静态的成员f.

我该怎样做？

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.26.127]


发信人: ini (run), 信区: C
标 题: Re: 如何实现我我想实现的功能？
发信站: 饮水思源站 (Sat Sep 5 18:49:47 1998) , 站内信件
C++的成员函数指针和数组的声明/使用都是很麻烦的.

1.声明:
class Test
{
public:
void f1();
void f2();
void f3();

typedef void (Test::*TFunc)();

TFunc fd[3];
TFunc fp;
};
这里,fd是数组,fp是指针.二者的区别不大.
2.引用:
void Test::f1()
{
//这是borland 的写法
fp = &(Test::f1);
fd[0] = &(Test::f1);
//VC是这样写的:
// fp = Test::f1;
// fd[0] = Test::f1;

(this->*(fd[0]))();
(this->*fp)();
}
这里的写法比较特殊,使用了->*运算(可以参考标准C的书,有这个运算符的介绍)
和显式的this指针.不使用这两个东东的写法我还不会...

--
※ 修改:·ini 於 Sep 5 19:55:06 修改本文·[FROM: 202.120.240.200]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.240.200]


哪里有ＡＮＳＩC++标准的文档?

饮水思源站 哪里有ＡＮＳＩC++标准的文档? 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Re: 哪里有ＡＮＳＩC++标准的文档? Terminator | 370 | 01/03/27 19:32
文件 | Re: 哪里有ＡＮＳＩC++标准的文档? starfish | 412 | 01/03/27 19:32
文件 | Re: 哪里有ＡＮＳＩC++标准的文档? abbelf | 2028 | 01/03/27 19:32
文件 | Re: 哪里有ＡＮＳＩC++标准的文档? law | 619 | 01/03/27 19:32
文件 | Re: 哪里有ＡＮＳＩC++标准的文档? hhfeng | 710 | 01/03/27 19:32
文件 | Re: 哪里有ＡＮＳＩC++标准的文档? netmader | 504 | 01/03/27 19:32
文件 | Re: 哪里有ＡＮＳＩC++标准的文档? law | 588 | 01/03/27 19:32
文件 | Re: 哪里有ＡＮＳＩC++标准的文档? hhfeng | 414 | 01/03/27 19:32
文件 | Re: 哪里有ＡＮＳＩC++标准的文档? gem | 580 | 01/03/27 19:32
文件 | Re: 哪里有ＡＮＳＩC++标准的文档? starfish | 489 | 01/03/27 19:32


发信人: Terminator (魔鬼终结者), 信区: C
标 题: Re: 哪里有ＡＮＳＩC++标准的文档?
发信站: 饮水思源站 (Fri Oct 30 16:55:23 1998) , 站内信件

There's a book named THE ANNOTATED ANSI C STANDARD which
was translated into Chinese and published by XueYuan.

【 在 starfish (海星) 的大作中提到: 】

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: sg.zju.edu.cn]


发信人: starfish (海星), 信区: C
标 题: Re: 哪里有ＡＮＳＩC++标准的文档?
发信站: 饮水思源站 (Fri Oct 30 18:28:16 1998) , 站内信件
我要的是ANSI C++标准,而不是ANSI C标准.

【 在 Terminator (魔鬼终结者) 的大作中提到: 】
: There's a book named THE ANNOTATED ANSI C STANDARD which
: was translated into Chinese and published by XueYuan.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.205]


发信人: abbelf (神之擎), 信区: C
标 题: Re: 哪里有ＡＮＳＩC++标准的文档?
发信站: 饮水思源站 (Fri Oct 30 21:58:53 1998) , 站内信件
【 在 zhuxy (xyz) 的大作中提到: 】
: 还没有统一的标准吧

我有下载的全套草案.

Accredited Standards Committee* Doc No:X3J16/96-0225
X3, INFORMATION PROCESSING SYSTEMS WG21/N1043
Date: 2 December 1996
Project:Programming Language C++
Reply to:Andrew Koenig
AT&T Research
PO Box 636
600 Mountain Avenue
Room 2C-306
Murray Hill, NJ 07974 USA
ark@research.att.com

0
Working Paper for
Draft Proposed International Standard for Information Systems--
Programming Language C++

Abstract

0 This document specifies the form and establishes the interpretation of
programs expressed in the programming language C++. Its purpose is to
promote portability, reliability, maintainability, and efficient exe-
cution of C++ language programs on a variety of computing systems.
This document is subject to change without notice, and may not be
referred to as a Standard until approved by an accredited standards
body. Distribution of this document does not represent or warrant any
degree of completeness or correctness of this document. This document
is a working draft and is known to be incorect, incomplet, and incoN-
sistent.

--
※ 修改:·abbelf 於 Oct 30 21:59:53 修改本文·[FROM: 202.120.16.15]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: law (海狼), 信区: C
标 题: Re: 哪里有ＡＮＳＩC++标准的文档?
发信站: 饮水思源站 (Mon Nov 9 10:11:07 1998) , 站内信件
【 在 gem (青庭) 的大作中提到: 】
: 谁是abbelf?

问个问题:

#include <stdio.h>

void main()
{
char buf[100];
sprintf(buf, "100%%\n");
printf(buf);
}

用gcc和C++Builder带的bcc32.exe编译出来，
运行结果是:
100%

用VC5.0带的cl.exe编译以后，
结果是
100

哪个符合ANSI标准啊?
--

这虚无的城市，这飘渺的城市。
在拥挤的人群中，我已找不到我自己。

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.26.178]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: 哪里有ＡＮＳＩC++标准的文档?
发信站: 饮水思源站 (Mon Nov 9 11:18:40 1998) , 站内信件
【 在 law (海狼) 的大作中提到: 】
: 问个问题:
: #include <stdio.h>
: void main()
: {
: char buf[100];
: sprintf(buf, "100%%\n");
: printf(buf);
: }
: 用gcc和C++Builder带的bcc32.exe编译出来，
: 运行结果是:
: 100%
: 用VC5.0带的cl.exe编译以后，
: 结果是
: 100
: 哪个符合ANSI标准啊?

我认为应该是第一种对, 至于标准, 我这里没有ANSI C正式文档.
不过这点好象当时学课程时就讲过, %%在格式打印时作为一个对待.

--
※ 修改:·hhfeng 於 Nov 9 11:19:05 修改本文·[FROM: 202.120.16.15]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: netmader (网路行者), 信区: C
标 题: Re: 哪里有ＡＮＳＩC++标准的文档?
发信站: 饮水思源站 (Mon Nov 9 12:19:16 1998) , 站内信件
俺和hhfeng看法一致。
【 在 hhfeng (快乐的眼睛) 的大作中提到: 】
: 我认为应该是第一种对, 至于标准, 我这里没有ANSI C正式文档.
: 不过这点好象当时学课程时就讲过, %%在格式打印时作为一个对待.

--
藐姑射之山，有神人居焉。肌肤若冰雪，淖约若处子；
不食五谷，吸风饮露；乘云气，御飞龙，而游乎四海之外...

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.26.53]


发信人: law (海狼), 信区: C
标 题: Re: 哪里有ＡＮＳＩC++标准的文档?
发信站: 饮水思源站 (Mon Nov 9 12:40:33 1998) , 站内信件
【 在 hhfeng (快乐的眼睛) 的大作中提到: 】
: 我认为应该是第一种对, 至于标准, 我这里没有ANSI C正式文档.
: 不过这点好象当时学课程时就讲过, %%在格式打印时作为一个对待.

这个问题的实质是这样的，
printf("%");
bc 和 gcc的输出是 %
vc 的输出是空。
哪个对呢？

--

这虚无的城市，这飘渺的城市。
在拥挤的人群中，我已找不到我自己。

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.26.178]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: 哪里有ＡＮＳＩC++标准的文档?
发信站: 饮水思源站 (Mon Nov 9 20:36:11 1998) , 站内信件
【 在 law (海狼) 的大作中提到: 】
: 这个问题的实质是这样的，
: printf("%");
: bc 和 gcc的输出是 %
: vc 的输出是空。
: 哪个对呢？

这就都对，因为本身是不应该出现的情况，printf可以做任何解释。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: gem (青庭), 信区: C
标 题: Re: 哪里有ＡＮＳＩC++标准的文档?
发信站: 饮水思源站 (Mon Nov 9 21:50:27 1998) , 站内信件
前者对，此外，ANSI标准似乎要求main()函数的返回值
为int型，不能是void。

【 在 law (海狼) 的大作中提到: 】
: 问个问题:
: #include <stdio.h>
: void main()
: {
: char buf[100];
: sprintf(buf, "100%%\n");
: printf(buf);
: }
: 用gcc和C++Builder带的bcc32.exe编译出来，
: 运行结果是:
: 100%
: 用VC5.0带的cl.exe编译以后，
: 结果是
: 100
: 哪个符合ANSI标准啊?

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.26.178]


发信人: starfish (海星), 信区: C
标 题: Re: 哪里有ＡＮＳＩC++标准的文档?
发信站: 饮水思源站 (Thu Nov 12 15:04:41 1998) , 站内信件
ANSI C中规定main函数有两种写法，一种是
void main(void)
一种是
int main(int argc, char** argv)
当然，为了对以前版本的兼容性，还几种其它的写法Ｈ�
main()
和
main(void)

【 在 gem (青庭) 的大作中提到: 】
: 前者对，此外，ANSI标准似乎要求main()函数的返回值
: 为int型，不能是void。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.205]


bc3.1中huge指针到底怎么用？

饮水思源站 bc3.1中huge指针到底怎么用？ 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | bc3.1中huge指针到底怎么用？ skies | 526 | 01/03/27 19:40
文件 | Re: bc3.1中huge指针到底怎么用？ ini | 592 | 01/03/27 19:40
文件 | Re: bc3.1中huge指针到底怎么用？ skies | 934 | 01/03/27 19:40
文件 | Re: bc3.1中huge指针到底怎么用？ ini | 351 | 01/03/27 19:40
文件 | Re: bc3.1中huge指针到底怎么用？ hhfeng | 742 | 01/03/27 19:40
文件 | Re: bc3.1中huge指针到底怎么用？ seagate | 874 | 01/03/27 19:40
文件 | Re: bc3.1中huge指针到底怎么用？ skies | 713 | 01/03/27 19:40
文件 | Re: bc3.1中huge指针到底怎么用？ seagate | 583 | 01/03/27 19:41


发信人: skies (sgt.pepper), 信区: C
标 题: bc3.1中huge指针到底怎么用？
发信站: 饮水思源站 (Mon Dec 21 09:25:03 1998) , 转信
由于在dos下要用到大于64k的数组，因此在bc3.1中使用了huge指针，
以下一简单test程序：
long int i;
int huge *p;
p=new int huge(70000);
for(i=0;i<70000;i++)
{
*p=1;
p++;
}
执行完new语句后发现p值为null，并未给指针p分配空间。
请大家指教！

--
※ 修改:·skies 於 Dec 21 13:03:44 修改本文·[FROM: 202.119.21.251]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.119.21.251]


发信人: ini (run), 信区: C
标 题: Re: bc3.1中huge指针到底怎么用？
发信站: 饮水思源站 (Mon Dec 21 19:34:58 1998) , 站内信件
【 在 skies (sgt.pepper) 的大作中提到: 】
: 由于在dos下要用到大于64k的数组，因此在bc3.1中使用了huge指针，
: 以下一简单test程序：
: long int i;
: int huge *p;
: p=new int huge(70000);
p=new int[70000];//32bit系统下一定行的,16bit就...
估计您得用malloc/calloc才行.
: for(i=0;i<70000;i++)
: {
: *p=1;
: p++;
: }
: 执行完new语句后发现p值为null，并未给指针p分配空间。
: 请大家指教！

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.240.10]


发信人: skies (sgt.pepper), 信区: C
标 题: Re: bc3.1中huge指针到底怎么用？
发信站: 饮水思源站 (Tue Dec 22 17:20:20 1998) , 转信
还是不好用啊！能不能说具体点
比如以下这个简单程序，怎样才能让它给p分配内存空间啊？
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
main()
{
long int i;
int huge *p;
int huge *p1;
//p=new int huge[70000];
if ((p = (int huge *) farmalloc(60000*sizeof(int))) == NULL)
{
printf("Not enough memory to allocate buffer\n");
exit(1); /* terminate program if out of memory */
}
p1=p;
for (i=0;i<60000;i++)
{*p1=1;
p1++;}
farfree(p);
farfree(p1);
return 0;
}
【 在 ini (run) 的大作中提到: 】
: p=new int[70000];//32bit系统下一定行的,16bit就...
: 估计您得用malloc/calloc才行.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.119.21.251]


发信人: ini (run), 信区: C
标 题: Re: bc3.1中huge指针到底怎么用？
发信站: 饮水思源站 (Tue Dec 22 18:23:26 1998) , 站内信件
试试改变一下编译模式,一般应用large/huge模式.
在16bit系统下最好不要使用大于64k的数据块.
但在large/huge模式应该是没有问题的.
记得改变模式后builde all

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.240.10]


发信人: hhfeng (快乐的眼睛), 信区: C
标 题: Re: bc3.1中huge指针到底怎么用？
发信站: 饮水思源站 (Tue Dec 22 22:12:05 1998) , 站内信件
另外注意内存是否够，16bit DOS只有640K常规内存可以用。
一般来说，分不出前面例子的空间的。如果是这个问题试一下下面之一：

1: 退出Borland C++运行，或者装EMS以减小BC的常规内存消耗。
2: 装类似 DOS4GW, Dos Extender 类似的库(BC下我不知道有什么产品可以用)，
增加可用内存。
3: 用32bit的系统。
4: 调用扩充内存的接口分配内存，用交换方式使用内存。

【 在 ini (run) 的大作中提到: 】
: 试试改变一下编译模式,一般应用large/huge模式.
: 在16bit系统下最好不要使用大于64k的数据块.
: 但在large/huge模式应该是没有问题的.
: 记得改变模式后builde all

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.15]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: bc3.1中huge指针到底怎么用？
发信站: 饮水思源站 (Wed Dec 23 02:18:09 1998) , 站内信件
我想，如果你用 Turbo Debugger 看，肯定是分配成功了。
所以你的程序在 DOS 下和 TD中可以运行，但在BC3.1 IDE
中不能运行。

原因在于，在DOS下的程序占了所有的剩余内存，BC3.1 IDE
也不例外。这样你想分配大于64k的内存肯定是要失败的，
不管你用 new 还是 farmalloc.

要在 BC3.1 IDE 中调试程序，就只能分配near 的内
存(< 64K)， 或采用static variables

【 在 skies (sgt.pepper) 的大作中提到: 】
: 由于在dos下要用到大于64k的数组，因此在bc3.1中使用了huge指针，
: 以下一简单test程序：
: long int i;
: int huge *p;
: p=new int huge(70000);
: for(i=0;i<70000;i++)
: {
: *p=1;
: p++;
: }
: 执行完new语句后发现p值为null，并未给指针p分配空间。
: 请大家指教！

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: eesun3.tamu.edu]


发信人: skies (sgt.pepper), 信区: C
标 题: Re: bc3.1中huge指针到底怎么用？
发信站: 饮水思源站 (Wed Dec 23 12:03:21 1998) , 转信
多谢seagate，果然有效。
只是每次退出td或在td下再次运行时总会死机，不知道是咋回事。
请seagate帮忙帮到底。呵呵
【 在 seagate (风雪夜归人) 的大作中提到: 】
: 我想，如果你用 Turbo Debugger 看，肯定是分配成功了。
: 所以你的程序在 DOS 下和 TD中可以运行，但在BC3.1 IDE
: 中不能运行。
: 原因在于，在DOS下的程序占了所有的剩余内存，BC3.1 IDE
: 也不例外。这样你想分配大于64k的内存肯定是要失败的，
: 不管你用 new 还是 farmalloc.
: 要在 BC3.1 IDE 中调试程序，就只能分配near 的内
: 存(< 64K)， 或采用static variables

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.119.21.251]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: bc3.1中huge指针到底怎么用？
发信站: 饮水思源站 (Thu Dec 24 00:48:19 1998) , 站内信件
看了你贴在#864的程序，我觉得问题可能在 farmalloc(60000*sizeof(int)) 上 ！
因为在 DOS 下, int是16bit 的，建议用 farmalloc(60000L * long(sizeof(int)))
试一试吧. BC3.1下可能要写成 (long), 而非 long()

【 在 skies (sgt.pepper) 的大作中提到: 】
: 多谢seagate，果然有效。
: 只是每次退出td或在td下再次运行时总会死机，不知道是咋回事。
: 请seagate帮忙帮到底。呵呵

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: epipc2.tamu.edu]


如何重载先赋值，后加的++？

饮水思源站 如何重载先赋值，后加的++？ 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | 如何重载先赋值，后加的++？ howe | 551 | 01/03/27 20:34
文件 | Re: 如何重载先赋值，后加的++？ DuZ | 320 | 01/03/27 20:34
文件 | Re: 如何重载先赋值，后加的++？ howe | 720 | 01/03/27 20:34
文件 | Re: 如何重载先赋值，后加的++？ DuZ | 588 | 01/03/27 20:34
文件 | Re: 如何重载先赋值，后加的++？ ruster | 590 | 01/03/27 20:34
文件 | Re: 如何重载先赋值，后加的++？ ini | 796 | 01/03/27 20:34
文件 | Re: 如何重载先赋值，后加的++？ howe | 895 | 01/03/27 20:34
文件 | Re: 如何重载先赋值，后加的++？ DuZ | 475 | 01/03/27 20:34


发信人: howe (无痕), 信区: C
标 题: 如何重载先赋值，后加的++？
发信站: 饮水思源站 (Wed May 19 13:27:03 1999) , 站内信件
对于一个整数n
n++和++n是不一样的
如何重载n++的++?
--
莫
求
莫 无
逐 痕
有
缘

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.16.223]


发信人: DuZ (hi), 信区: C
标 题: Re: 如何重载先赋值，后加的++？
发信站: 饮水思源站 (Fri May 21 17:14:19 1999) , 站内信件
对于类来说x++和++x是一样的。
【 在 howe (无痕) 的大作中提到: 】
: 对于一个整数n
: n++和++n是不一样的
: 如何重载n++的++?

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.8.25]


发信人: howe (无痕), 信区: C
标 题: Re: 如何重载先赋值，后加的++？
发信站: 饮水思源站 (Fri May 21 22:44:46 1999) , 站内信件
【 在 DuZ (hi) 的大作中提到: 】
: 对于类来说x++和++x是一样的。

找到答案了，重载prefix ++用operator++()，重宰postfix ++用operator++(int)
--
莫
求
莫 无
逐 痕
有
缘

※ 修改:·howe 於 May 21 22:45:07 修改本文·[FROM: 202.112.26.217]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.112.26.217]


发信人: DuZ (hi), 信区: C
标 题: Re: 如何重载先赋值，后加的++？
发信站: 饮水思源站 (Sat May 22 20:41:45 1999) , 站内信件
I don't think so.
operator++() is a memeber function of a class.
if operator++(int) is a memeber function of a class too, then it means
object++x,when object has type of this class ,and x has type int.
if operator++(int) is not a member function. it just redefine ++x or x++.

【 在 howe (无痕) 的大作中提到: 】
: 找到答案了，重载prefix ++用operator++()，重宰postfix ++用operator++(int)

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.8.25]


发信人: ruster (heart), 信区: C
标 题: Re: 如何重载先赋值，后加的++？
发信站: 饮水思源站 (Sat May 22 20:47:34 1999) , 站内信件
你可以定义其中一个为友元,我记得最早的C++书里就提到了这个问题

【 在 DuZ (hi) 的大作中提到: 】
: I don't think so.
: operator++() is a memeber function of a class.
: if operator++(int) is a memeber function of a class too, then it means
: object++x,when object has type of this class ,and x has type int.
: if operator++(int) is not a member function. it just redefine ++x or x++.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.199.248.20]


发信人: ini (run), 信区: C
标 题: Re: 如何重载先赋值，后加的++？
发信站: 饮水思源站 (Sun May 23 08:44:03 1999) , 站内信件
这种理解是完全错误的. C++为了区分前置的++和后置的++,
使用了这种表达方法.由于++是一元运算符,而操作符重载又
不能改变操作符的运算性质(目数和优先级),所以即使重载
operator++(int),也不可能让O++I的语法成为合法.另外,在
没有类的情况下,是不可能重载++的,也就是说,不可能重载
全局的++.

【 在 DuZ (hi) 的大作中提到: 】
: I don't think so.
: operator++() is a memeber function of a class.
: if operator++(int) is a memeber function of a class too, then it means
: object++x,when object has type of this class ,and x has type int.
: if operator++(int) is not a member function. it just redefine ++x or x++.

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.240.61]


发信人: howe (无痕), 信区: C
标 题: Re: 如何重载先赋值，后加的++？
发信站: 饮水思源站 (Mon May 24 21:25:14 1999) , 站内信件
【 在 DuZ (hi) 的大作中提到: 】
: I don't think so.
: operator++() is a memeber function of a class.
: if operator++(int) is a memeber function of a class too, then it means
: object++x,when object has type of this class ,and x has type int.
: if operator++(int) is not a member function. it just redefine ++x or x++.

VC是这么处理的，其实这里的int没有其它意义，只是为了区别两个重载函数。
--
莫
求
莫 无
逐 痕
有
缘

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.112.26.209]


发信人: DuZ (hi), 信区: C
标 题: Re: 如何重载先赋值，后加的++？
发信站: 饮水思源站 (Thu May 27 10:40:43 1999) , 站内信件
Yes,
I read VC Help and found it does so.
I don't know whether other c++ does so.
I was told that c++ never use postfix when I use c++ firsttime,about five years ago.

【 在 howe (无痕) 的大作中提到: 】
: VC是这么处理的，其实这里的int没有其它意义，只是为了区别两个重载函数。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.8.25]


发信人: Kind (天蓝水碧), 信区: C
标 题: C++的沉迷与爱恋
发信站: 饮水思源站 (Sun Apr 9 18:46:58 2000), 转信
C++的沉迷与爱恋

作者：侯捷

1998.09.28 发表

每年的 09/28 於我都是一个特殊的日子 -- 不只是因为教师节。今年很
特殊地没有普天同庆，那麽我就写篇文章自己庆祝一下好了。

我於今年七月发表了一本着作 <多型与虚拟> 和一本译作 <深度探索 C++
物件模型> ，获得很大的回响。这些作品都不是针对 C++ 的完全初学者
所写，但从初阶到高阶为数众多的 C++ guy，热情地表达了他们对这些主
题的喜悦。

在许多来信中，我看到一些有趣的现象，也感受到一些值得整理下来的想
法。所以，根据我个人的学习过往、我的教学经验、以及周遭朋友的心得
交流，写下这篇文章，或可为後学者戒。

●<多型与虚拟> 序言节录

首先让我节录 <多型与虚拟> 一书序言：

<多型与虚拟> 序 节录（侯俊杰/松岗/1998/07）

一般而言，C++ 是一个难学易用的语言。

C++ 的难学，初始在於其重重的布幕，布幕之中编译器对我们的程式码做
了太多的手脚，使我们惯於循序思考的工程脑袋一无所措。及长，又面临
新的思维模式，使我们必须扭转惯常的思考习惯。

C++ 的易用则在於其巨大的弹性，能够以多型（polymorphism）、虚拟
（virtual）、模板（template）、泛型（generalization）等种种型式
，让既有的码去处理未知的、未来的资料型态。

当然，易用必须先能用。用不好或不能用的话，「写 C++ 程式」最後就
成了只是「使用 C++ 编译器」，这是大家常拿来彼此调侃的笑话。

在「难学」的背景下，「易用」是使我们依然前仆後继的动力。愈来愈多
的大学资讯科系把 C++ 开在大一课程，这虽然说明 C++ 是多麽地重要，
可也苦了资讯新兵们。

其实「难学」的最大症结在於，很难得有一本书，能够一针见血地指出多
型与虚拟的重要性；在我们粗具语法基础之後，直接把我们导引到最核心
最重要的思想，并且在建立这个思想的过程中，提供足够的必要基础。

●困难度之一

「C++ 是个难学易用的语言」，这句话相信很多人心有戚戚。C++ 的学习
难度，一在於语言本身太多的「幕」，一在於 "paradigm shift" （思考
模式的移转）。

传统循序语言如 C, Pascal, Basic, Fortran...，除了模样看起来稍有
不同，基本上都是函式 call 来 call 去，大同小异，很容易掌握。你想
做的动作，在 code 中都看得一清二楚。你所看不到的，荦荦大者也不过
就是编译器为你的函式加上用以处理堆叠的一小段码（prologue 和 epilogue）
，这一小段码基本上做的是 housekeeping 工作，你没看到也没有关系
（更好），并不影响你对程式逻辑的思考。

C++ 不一样，C++ 有太多和程式逻辑息息相关的动作是编译器为我们加
上去的。换句话说 C++ 编译器为我们「加码」。如果不识清这一节，学
习C++ 有如雾里看花，雾非雾，花非花。

编译器为我们的 C++ 程式加了什麽码呢？很多！物件诞生时 ctor 会被
唤起，物件死亡时 dtor 会被唤起，这都是加码的结果。ctor 中设定
vtpr 和 vtbl，这也是加码的结果。new 单一物件时会产生 memory block
cookie，new 物件阵列时会产生一个内部结构记录着 object size 和
class ctor...，这也都是布幕後的工作。可以说，程式码中看不到而
却必须完成的所有与程式逻辑有关的动作，统统都是 C++ 编译器加码後
的结果。

当「继承」发生，整个情况变得稍微复杂起来。「多重继承」又更复杂
一些，「虚拟继承」再更复杂一些。

这些布幕後的主题，统可归类为所谓的 C++ object model（物件模型
）。如果不知道这些底层机制，你就只能够把 "make destructors
virtual in base classes"（<Effective C++>, item14）或 "never
treat arrays polymorphically" （<More Effective C++>, item 3）
这类规则硬背下来，却不明白它的道理。
用一样东西，却不明白它的道理，林语堂如是说：『不高明』。只知道
how，不知道 why，侯捷如是说：『不高明』。

●困难度之二

C++ 的第二个学习难度在於 "paradigm shift"（思考模式的移转）。
别说自己设计 classes 了，光使用别人的 classes，就都是一种思考
模式和行为模式的移转。MFC（或 OWL 或 VCL）programmer 必然甚能
够领略并体会我的意思。

使用所谓的 application framework（一种大型的、凝聚性强的、有着
物件导向公共基础建设的 class library），你的码和 framework 之间
究竟是怎样的关系呢？framework 提供的一大堆可改写的虚拟函式的意义
与价值究竟在哪里呢？为什麽 framework 所设计的种种美好性质以及各
式各样的演算法竟然可以施行於我们自己设计的 class types 身上呢？
framework 被设计时，并不知道我们的存在呀！

这正是物件导向中的多型（polymorphism）的威力。

稍早所说的 C++ 物件模型，偏属程式设计的低层面；这里所说的思考模
式移转，则是程式设计的高层面。能够把新思维模式的威力发挥得最淋漓
尽致的，当推物件导向的 polymorphism（多型）和 generalization（
泛型）。如果你没有使用这两项特性，等於入 C++ 宝山而空手返。

●反覆 炼，循环震荡

想像 C++ 是一把用来解决程式问题的刀，要它坚轫，要它锋利，就必须
经过多次的回火，在高热和骤冷之间 炼。

初学 C++ 语法（syntax）之後，你应该尽快尝试体验 polymorphism
（大致而言也就是虚拟函式的运用）。等到对 OOP 的精神有了大局掌控
的能力，但对 C++ 的许多小细节不甚清楚，就是回到C++ 物件模型 炼
的时机。

成长，是在高阶（polymorphism）和低阶（object model）之间反覆震
荡，才能够震荡到更高的位阶，而不是平平庸庸於中阶（C++ syntax）
的一滩死水。

●不要沉沦於 C++ syntax

100 个人跟我说他懂 C++/OOP，只有 10% 不到可以让我认为他没有胡吹
大气。太多的人，上嘛上不到 polymorphism，下嘛又下不到object model。
就这样不上不下地卡在 C++ 语法层面。大一学了C++，到大四快毕业了，
连 virtual functions 是怎麽回事都期期艾艾支支吾吾说不出个道理。

有时候我觉得，太苛责同学也於心不忍，因为同学们事实上处於一种无知
的状态，既不知道 C++/OOP 该怎麽学，也不知道哪些书可以教他们那麽
学。所以，苛责同学，不如责怪老师。

众所周知，大学教授泰半是动口不动手，普遍的心态是「论文第一，升等
为要；程式语言？哎，末流！」。「末流」课程通常由教授们轮流教，谁
倒楣谁来教；於是就常常有「下学期要教 C++ 语言了，这学期寒（暑）假
赶快去要本书来恶补」的情况发生。偏偏程式语言这东西，只动口不管用
，一定要动手，而且要常动手。老师自己没有摸到C++/OOP 的精神，学生
又能学到什麽？

有些学校资讯系并不教特定的程式语言，老师们的态度是「语言是一种自
己学就好了的东西嘛，拿到大学殿堂来，哎，不入流」！於是应该好好为
学生打下实际基础的课程，却天马行空地腾云驾雾起来，大谈抽象意念。
饱读经书的老师们可能忽略了，一个完全没有技术基础的学子，要的不是
形而上的道，而是形而下的器。

我们是先能够欣赏具象画，还是先能够 郎 抽象画？我们不都� 先对毕卡
索的画大骂「这是什麽东西」，直到自己的艺术涵养够丰富了、人生阅练
更饱满了、能够举一隅以三隅反了、能够接触类旁通左右逢源了，才转而
能够欣赏甚至进入毕卡索的抽象意境吗？

老师们各有专长，要老师们来教非彼专长的大班课、基础课，我又觉得似
乎也太为难老师了。那麽，苛责老师，不如责怪学校当局。如果学校当局
能够聘请经验老道又有教学热诚的工程师来教这类实务学科，不是三方皆
大欢喜吗？不要说什麽制度僵化啦，难以突破啦，大学是高度自治区，礼
聘几位兼任老师，不全都是系上的权责范围内吗？

当学子们在课程上学不到他要的东西，就只好闭门自修。但是，循序性
（sequential）语言尚有自修学会的可能，物件导向语言嘛，以大学生
的程度来讲，我认为自修实在困难，只会修出个四不像、半瓶水。

管不到学校！管不到教授！自求多福的情况下，希望看到这篇文章的你，
知道 C++/OOP 该怎麽学。

●不要沉迷於 C++ semantics 和 C++ object model

对於底层知识有浓厚兴趣的朋友，下探到 object model 领域，一定会
非常开心地在 object size、object layout、vptr/vtbl、以及许多
布幕後的技术之间玩将起来。了解这些东西，当然是好的，但是由於一
探究竟得其奥秘的快感与成就感，使得一些朋友们在这个层面里「玩」
起来了，小地方玩得很精，玩得不亦乐乎，玩得忽略了 C++/OOP 的最
终目标。

最终目标是 polymorphism！

我要说，在 C++ syntax 以及相对低阶的 C++ semantics 里，不要玩得
太过火。过犹不及，会伤身的。C++ 经典名书内附的一些习题，在我看来
颇有点玩得过火的味道。至於什麽百题精选、题库大成，除了修练基本功
之外，都满无趣的东西。

Programming 应该是一种天马行空的想像力与创意的组合；如果你能够自
己想题目，譬如说实作一个天体运行的 class 体系、或是实作一个生物分
类（界门纲目科属种）体系，不是很有趣吗？准备资料的过程中，查查百科
全书，你也因此查到了太阳系九大行星的几何资料，哈雷慧星的轨道周期
，或是黑面琵鹭的「界门纲目科属种」英文名称，这难道不比钻研於 ++++i
或 ----i 或 *&*&p 之类的头脑体操题目有趣吗？（看过不少这类好笑
题目，没一个记下来，只好胡乱写几个运算式。诸位应该知道我说的那种
头脑体操题目）

固然，在科学与工程的领域里头，无技术无以为立，但别把自己弄得过於僵
化，过於匠气。僵化与匠气是我们教育体系的最大沉疴。到了高专层次，
败象显露无遗。

●名书推荐

如果没有介绍几本好书，我就是为德不卒。

让我再节录 <多型与虚拟> 的二刷感言：

<多型与虚拟> 一版二刷感言 （侯俊杰/松岗/1998/08）... C++ 相关书籍
，如天上繁星，如过江之鲫。广博如四库全书者有之（如 The C++ Programming
Language、C++ Primer），深奥宛如山重水复有之（如 Inside The C++
Object Model），独沽一味者有之（如 C++ Programming Style、More
Effective C++），独树一帜者有之（如 The Design and Evolution of C++）
，另辟蹊径者亦有之（如 STL tutorial Reference Guide）。...

以下是我认为你应该要拥有的书籍。有趣的是，我才在自己班上做了一个调查
（我教的是物件导向 Windows 程式设计，学生应该要有良好的 C++/OO 基础）
，拥有以下 1~5 本书的人举手。举手人数都很少，而且老是那几位（最高记录
是拥有四本）。这让我感觉，强者恒强，弱者恒弱。悲夫！

1. C++ Primer (3/e), Lippman/A.W./1998
（听说 1999 将有中译本）

2. The C++ Programming Language (3/e), Bjarne/A.W./1997
（听说 1999 将有中译本）

以上两本书是 C++ 经典百科。就内容水平而言，我认为同为瑜亮。 普遍的印
象是，第一本较易接受，第二本涩味稍重。第二本书 作者 Bjarne 是 C++
语言的创造者，所以有其权威性。我认识的多 位 C++/OOP 高手，都是两书齐具。

3. Inside The C++ Object Model, Lippman/A.W./1996
（中译本 <深度探索 C++ 物件模型>）

全书讲解 C++ object model，上穷碧落下黄泉。内容很好，层次也高， 可惜
原文书大大小小的错误繁如晨星，阅读时需小心。

4. Effective C++, Meyers/A.W./1992
（印象似有中译本，名称忘了，谁可补充说明？）

5. More Effective C++, Meyers/A.W./1996
（有中译本吗？我不知道，谁可补充说明？）

同一作者的这两本书，专讲 C++ programming 的重要观念，使你的程式 更稳
健更有效率。书中许多观念涉及 C++ object model，与 (3) 书混合看， 如
鱼得水。

6. Polymorphism in C++ <多型与虚拟> 侯俊杰/松岗/1998
（没有中译本 -- 它本身就是中文书）

在语法粗具的基础上，直接把读者导引到最核心最重要的思想，并且 在建立这
个思想的过程中，提供足够的必要基础。

我只列出一本中文书，是因为这方面的中文书我看得少，英文书看得多。「恐
有遗珠之憾」这类「八方得体」的话，还是说一下好了 :)。
注意，这些都只是强本固元用来扎基础的书籍而已，要观摩大型程式经验，还
有诸如 Large Scale C++ Software Design（John Lakos/A.W./1996）可以
阅读。

OO 的世界，不止 OOP，还有 OOA/OOD，那又是一缸子的学问和一缸子的书。

--- end

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 166.111.174.37]


发信人: martin (papa), 信区: C
标 题: Re: [转载] 请问如何用new分配两维数组？
发信站: 饮水思源站 (Wed Jun 21 19:30:25 2000), 转信
this is a sample

int i,j;
char** temp;
temp = new char*[i];
for(int n=0;n<i;n++)
{
temp[i] = new char[j];
}

【 在 yuanshiren (摩登原始人) 的大作中提到: 】
: 【 以下文字转载自 VC 讨论区 】
: 【 原文由 yuanshiren 所发表 】
: 如何用new和delete分配和释放两维以及更高维的数组？
: 谢谢！

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.101.62.201]


C 语言与其它语言混合编程

饮水思源站 C 语言与其它语言混合编程 精华区离线浏览
类型 | 标题 | 长度 | 时间
目录 | Fortran函数的原形定义 (转载) | 11项 | 01/03/28 19:14
文件 | [转载] VB如何与C接口(转载) jia | 7832 | 01/03/28 19:14


Fortran函数的原形定义 (转载)

饮水思源站 Fortran函数的原形定义 (转载) 精华区离线浏览
类型 | 标题 | 长度 | 时间
文件 | Fortran函数的原形定义 (转载) master | 671 | 01/03/28 19:14
文件 | Re: Fortran函数的原形定义 (转载) seagate | 517 | 01/03/28 19:14
文件 | Re: Fortran函数的原形定义 (转载) master | 746 | 01/03/28 19:14
文件 | Re: Fortran函数的原形定义 (转载) seagate | 664 | 01/03/28 19:14
文件 | Re: Fortran函数的原形定义 (转载) seagate | 1462 | 01/03/28 19:14
文件 | Re: Fortran函数的原形定义 (转载) master | 308 | 01/03/28 19:14
文件 | Re: Fortran函数的原形定义 (转载) seagate | 666 | 01/03/28 19:14
文件 | Re: Fortran函数的原形定义 (转载) master | 844 | 01/03/28 19:14
文件 | Re: Fortran函数的原形定义 (转载) seagate | 853 | 01/03/28 19:14
文件 | Re: Fortran函数的原形定义 (转载) master | 640 | 01/03/28 19:14
文件 | Re: Fortran函数的原形定义 (转载) seagate | 371 | 01/03/28 19:14


发信人: master (共饮长江水), 信区: C
标 题: Fortran函数的原形定义 (转载)
发信站: 饮水思源站 (Thu Dec 10 08:06:50 1998) , 站内信件
【 以下文字转载自 program 讨论区 】
【 原文由 master 所发表 】

在C中调用一Fortran函数，其中有字符串的传递。
例如:

int a,b,c,d;
char TextBuff[8]

....
Fsubroutine(&a,&b,&c,&d,TextBuff);
....

那么这个Fortran函数怎样在C的头上声明其原形定义呢？
形如 extern void _stdcall Fsubroutine(int *,int *,int *,int *,char *);
我试过，不行! 如果不声明的话也不行。请教各位高手，该如何声明? Thanks!!!

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.6.66]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: Fortran函数的原形定义 (转载)
发信站: 饮水思源站 (Thu Dec 10 10:24:14 1998) , 站内信件
Which Compiler ? (MS Fortran 5.1 or Digital Visual Fortran 5.0 ?)

In Digital Fortran 5.0, you can specify the
function's attribute as STDCALL or C, and then
I think the strings can be passed successfully.

In MS Fortran 5.1, you also can set the function
attributes as C or FORTRAN.

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: eesun3.tamu.edu]


发信人: master (共饮长江水), 信区: C
标 题: Re: Fortran函数的原形定义 (转载)
发信站: 饮水思源站 (Thu Dec 10 12:18:36 1998) , 站内信件
【 在 seagate (风雪夜归人) 的大作中提到: 】
: Which Compiler ? (MS Fortran 5.1 or Digital Visual Fortran 5.0 ?)
: In Digital Fortran 5.0, you can specify the
: function's attribute as STDCALL or C, and then
: I think the strings can be passed successfully.
: In MS Fortran 5.1, you also can set the function
: attributes as C or FORTRAN.

我用的编译器是和VC4.0捆绑在一起的，我想大概是MS Fortran编译器吧。连机帮助
说是FPS4.0。那该怎么声明呢?

--
※ 修改:·master 於 Dec 10 12:46:25 修改本文·[FROM: 202.120.6.66]
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.6.66]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: Fortran函数的原形定义 (转载)
发信站: 饮水思源站 (Fri Dec 11 06:08:22 1998) , 站内信件
【 在 master (共饮长江水) 的大作中提到: 】
: 我用的编译器是和VC4.0捆绑在一起的，我想大概是MS Fortran编译器吧。连机帮助
: 说是FPS4.0。那该怎么声明呢?
To say it simply, you must let fortran to use C style
string.
1. Look up in help for ATTRIBUTES, I am sure you can
get some info about it.
2. try it !
3. I am sure it will work. There is even a fortran
header file for MS fortran 5.1, which makes fortran
programs can call WIN API.

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: eesun3.tamu.edu]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: Fortran函数的原形定义 (转载)
发信站: 饮水思源站 (Sat Dec 12 08:23:23 1998) , 站内信件

【 在 master (共饮长江水) 的大作中提到: 】
: 我用的编译器是和VC4.0捆绑在一起的，我想大概是MS Fortran编译器吧。连机帮助
: 说是FPS4.0。那该怎么声明呢?
Sorry, 上次没讲对 ！

我在 Digital Visual Fortran 5.0 上实验的结果如下：

1. C 中

(1) 声明 Fortran 函数

#ifdef __cplusplus // avoid C++ name mangling
extern "C" {
#endif
void __stdcall ScoldFortran(char* pStr, int leng);
#ifdef __cplusplus
}
#endif

注意: 一定要 __stdcall，因为要求 left->right 入栈
实际上这是人为地生成一个 Fortran Style 的 string.

(2) 调函数：
char szBuf[] = "Damn Fortran !";
ScoldFortran(szBuf, strlen(szBuf));

2. Fortran 中
subroutine ScoldFortran(str)
character*(*) str
!DEC$ ATTRIBUTES STDCALL, DLLEXPORT, ALIAS:'_ScoldFortran' :: ScoldFortran

write(*, *) str
end

3. 哈哈， 不知道你是不是用 DLL, 我用的是 DLL, 估计直接连也一样.

顺便说一下，俺可是不喜欢 Fortran. 虽然在大学里学得就是Fortran，而且也只用过它了.

昨天在 comp.lang.fortran 看到有人居然认为Fortran 从本质上比 C 速度要快，据说是
pointer 的原因. 俺实在是不明白。可以说在 fixed point方面 Fortran没有一点优势.
float point 方面就不好说了。毕竟很多著名的数值分析软件包是 Fortran 写的.

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: eesun3.tamu.edu]


发信人: master (共饮长江水), 信区: C
标 题: Re: Fortran函数的原形定义 (转载)
发信站: 饮水思源站 (Wed Dec 16 16:52:07 1998) , 站内信件

照你所说，我试了试还是不行，连接时通不过。我不是通过DLL的，我是在函数了里
直接调用的。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.6.66]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: Fortran函数的原形定义 (转载)
发信站: 饮水思源站 (Thu Dec 17 00:00:10 1998) , 站内信件
【 在 master (共饮长江水) 的大作中提到: 】
: 照你所说，我试了试还是不行，连接时通不过。我不是通过DLL的，我是在函数了里
: 直接调用的。

我可以呀 ！
1. 我用的是 Digital Visual Fortran 5.0，在声明函数的方法上可能不一样。
如： !DEC$ STDCALL ... 在 你的Fortran 中可能要改写一下。请注意
! 在fortran 中起注释的作用，所以你的fortran compiler 可能没解释它。
查查Help 吧。
2. 用 DLL 试验一下
3. 去掉 __declspec(dllexport) 之类的东西

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: eesun3.tamu.edu]


发信人: master (共饮长江水), 信区: C
标 题: Re: Fortran函数的原形定义 (转载)
发信站: 饮水思源站 (Wed Dec 23 09:56:15 1998) , 站内信件
【 在 seagate (风雪夜归人) 的大作中提到: 】
: 我可以呀 ！
: 1. 我用的是 Digital Visual Fortran 5.0，在声明函数的方法上可能不一样。
: 如： !DEC$ STDCALL ... 在 你的Fortran 中可能要改写一下。请注意
: ! 在fortran 中起注释的作用，所以你的fortran compiler 可能没解释它。
: 查查Help 吧。
: 2. 用 DLL 试验一下
: 3. 去掉 __declspec(dllexport) 之类的东西

照你以前所说又重新试了一次，这次成了。 非常感谢!
我想write(*,*) str这句恐怕是关键，还有为什么 C中声明的和Fortran的函数原形会
不一样？在C中声明为ScoldFortran(char *,int),而Fortran的原形为ScoldFortran(str)
character*(*) str, 但编译也能通过。
另外用DLL编译是怎么一回事？

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.6.66]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: Fortran函数的原形定义 (转载)
发信站: 饮水思源站 (Wed Dec 23 11:31:25 1998) , 站内信件
【 在 master (共饮长江水) 的大作中提到: 】
: 照你以前所说又重新试了一次，这次成了。 非常感谢!
: 我想write(*,*) str这句恐怕是关键，还有为什么 C中声明的和Fortran的函数原形会
-----------------
why ?

: 不一样？在C中声明为ScoldFortran(char *,int),而Fortran的原形为ScoldFortran(str)
: character*(*) str, 但编译也能通过。

嘿嘿，老兄，我上次写的东西，你可能根本就没看吧 ？ 之所以能成功就是因为采用
了不同的函数原形。这样，C call Fortran 时，先压一个 string length 入栈，
正好满足 Fortran string 的格式.

: 另外用DLL编译是怎么一回事？

我的意思是把 Fortran 模块编译成 DLL试一试，当然你已经成功了，就无所谓了。

--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: epipc2.tamu.edu]


发信人: master (共饮长江水), 信区: C
标 题: Re: Fortran函数的原形定义 (转载)
发信站: 饮水思源站 (Wed Dec 23 14:43:06 1998) , 站内信件
【 在 seagate (风雪夜归人) 的大作中提到: 】
: -----------------
: why ?
: 嘿嘿，老兄，我上次写的东西，你可能根本就没看吧 ？ 之所以能成功就是因为采用
: 了不同的函数原形。这样，C call Fortran 时，先压一个 string length 入栈，
: 正好满足 Fortran string 的格式.
在C的调用中，那char *后必须紧跟strlen(char *)，否则不能成功，是不是这样?

: 我的意思是把 Fortran 模块编译成 DLL试一试，当然你已经成功了，就无所谓了。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.6.66]


发信人: seagate (风雪夜归人), 信区: C
标 题: Re: Fortran函数的原形定义 (转载)
发信站: 饮水思源站 (Thu Dec 24 00:40:48 1998) , 站内信件
【 在 master (共饮长江水) 的大作中提到: 】
: 在C的调用中，那char *后必须紧跟strlen(char *)，否则不能成功，是不是这样?

Yes, and must be stdcall
--
天涯海角

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: epipc2.tamu.edu]


发信人: jia (小木头), 信区: C
标 题: [转载] VB如何与C接口(转载)
发信站: 饮水思源站 (Thu Apr 27 20:56:25 2000), 转信
【 以下文字转载自 VB 讨论区 】
【 原文由 hyhour 所发表 】
类似问题已经问过很多次，现在再转载一篇文章供大家参考。
大家也可以自己去下面站点访问，自行查找需要的资料。
http://www.zjonline.com.cn/vbbible/index.html(无须proxy.)

VB调用C程序的方法—动态链接库法
强 琳 李 论 归云科 雷景辉
摘 要 文中介绍了一种实现VB调用C语言程序的方法－动态连接库法，给出了动态
链接库制作的一般框架,通过实例描述了动态连接库的实现及其制做方法、编程步骤,这种
方法具有普遍的意义。
�
一、引言
    Visual Basic( 以下简称VB)是一种可视化的面向对象的编程语言，以其编程简单、
快捷等特点，深受广大WINDOWS程序员的青睐。利用VB开发界面友好、操作方便的软件只
需很短的时间。但是VB运行速度较慢，对于庞大的科学计算问题，VB的这种慢速会使人难
以忍受。C语言是国际上非常流行的一种中级编程语言，以其灵活、高效等优点而获得广
泛应用，许多的应用程序都是用C语言在DOS环境下编写而成。那么如何发挥VB和C这两
种语言的优势，用VB设计一种良好的for windows界面来调用C语言程序，即实现VB调用
C语言程序呢？现有的文献只提到动态链接库（以下简称DLL）可以将这两种语言连接起来
但有讲动态链接库DLL的制做及其编程方法。本文详细介绍了Borland C环境下制作动态
链接库以及VB调用for dos动态链接库的的方法、步骤，并通过实例描述VB调用C程序的全
过程。
二、用Borland C编写DLL程序的方法
  要想实现VB调用C程序，首先需要用Borland C编写动态连接库DLL程序（假设DLL程序
取名为example）。动态链接库包含四个文件：C语言源程序(.C）、模块定义文件（.DEF）、原型函数文件（.H）和工程文件（.PRJ）。下面分别详细介绍一下这四种文
件的具体结构。
1、编写C语言源程序的框架：
C语言源程序（example.C），它包括三种函数：入口函数、输出函数和终止函数。其具
体结构如下：
/*************************************/
/* 文件名： example.C */
/*************************************/
#include <windows.h>
/***********入口函数***********/
int FAR PASCAL LibMain ( HANDLE hInstance,
WORD wDataSeg,
WORD cbHeapSize,
LPSTR lpszCmdLine )
{
if (cbHeapSize!=0)
UnlockData(0);
return （1）;
}
/***********输出函数***********/
int FAR PASCAL example(int param1,...,char param n)
{
...... /*C语言应用程序*/
}
/***********终止函数***********/
int FAR PASCAL WEP ( int /*SystemExit*/ )
{
return(1);
}
  以上各组成部分参数的含义：Windows.h头文件，它包含有数据类型的定义、API入口
点定义和其它有用的参数信息。PASCAL说明符定义该程序的传递参数和净化堆栈的协定
（注意：DLL外部传送的指针必须是远指针FAR）。LibMain带四个参数：
hInstance、 wDataSeg、cbHeapSize和lpszCmdLine。第一个参数hInstance是DLL事例句
柄， wDataSeg参数是数据段（DS）寄存器值，cbHeapSize参数是在模块定义文件中定义
的堆的大小，LibMain 使用该值使本地堆初始化。lpszCmdLine参数包括命令行信息，但
很少被DLL使用。一般来说，这四个参数是制作DLL通用的参数。
如果不想让DLL数据被封住，那么必须调用unlockdata恢复正常的非锁状态，如果DLL初
始化已经成功，DLL则返回1，若不成功则返回0值，且 DLL退出系统。
DLL的输出函数实现用户所要完成的任务，这部分是DLL的核心。它与一般C语言程序不同
之处在于无scanf函数。所有的外部指针都是远指针FAR。画直线函数要用lineto函数。
DLL包括一个终止函数，终止函数有时称为退出函数，它的名字必须是WEP。且它可以被
包括在DLL模块定义文件的EXPORTS段中。
2、模块定义文件（.DEF)的结构和各段的意义
模块定义文件的结构如下：
/*************************************/
/* 文件名： example.DEF */
/*************************************/
LIBRARY example /* DLLname */
DESCRIPTION ' example.DLL'
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE SINGLE
HEAPSIZE 1024
EXPORTS
example @1
WEP @2
  关键字LIBRARY是把这个模块视为一个DLL，库的名字example跟在其后，且必
须与该库的名字、DEF中的DLL的文件名相一致。DESCRIPTION语句采用一个字符串，其长度可达
128 个字符，通常用它来保存模块描述的信息。EXETYPE windows语句每个windows应用
程序和 DLL都需要。DATA语句定义该库数据段的内存属性，关键字MOVEABLE允许内存管
理程序在 必要时移动内存段，关键字SINGLE是DLL必要，因为DLL总是有一个单一数据段
，而不管访 问它的应用程序的数量。HEAPSIZE语句用来定义一个DLL局部堆的初始规模，
执行局部内 存分配的DLL必须在库启动时使该堆初始化，堆的大小被传送给DLL的LiEnt
ry的程序。然 后用该堆的大小调用Locallnit使DLL的局部堆初始化。
EXEPORTS语句定义将被用作来自应用程序或来自其它DLL入口点的程序，windows
利用这个信息建立一个序数入口值，序数入口值是一个优化的值，允许动态连接机制更快块
操作且使用较少的内存。
一般来说，模块定义文件（.DEF)的结构除取动态库的名字不同外，其它结构都是
固定的。
3．建立原形函数文件(.H)
原形函数的功能是进一步声明调用函数的函数名和传递的参数，其形式为：
/*************************************/
/* 文件名： example.H */
/*************************************/
extern "C" int _export FAR PASCAL example(int param1,...,char param n) ;
4．建立工程文件(.PRJ)
工程文件中包含有example.C、example.DEF两个文件后，然后编译连接生成动态
链接库即可。
以上是制作动态连接库的框架，现在通过一个实例介绍制作动态链接库的方法。
如要求程序完成功能为：打开一个数据文件读出前两个数据，将这两个数与所传递的两个参
数相加，返回它们的和。设该DLL程序的名字为ADD。
第一步：在Borland C++环境下编辑.C文件、.DEF文件和.H文件，并建立.PRJ文件。如
（1）编写C语言源程序清单：
/*************************************/
/* 文件名： ADD.C */
/*************************************/
#include <iostream.h>
#include <conio.h>
#include <io.h>
#include <alloc.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>
#include <stdio.h>
#include "c:\ADD.h"
/*入口函数*/
int FAR PASCAL LibMain (HANDLE hInstance ,
WORD wDataSeg ,
WORD cbHeapSize,
LPSTR lpszCmdLine )
{
if (cbHeapSize!=0)
UnlockData(0);
return 1;
}
/*输出函数*/
int FAR PASCAL ADD(int x,int y,char *filein)
{ int a,b；
fp=fopen(filein,"r");
if(fp==NULL) { exit(0);}
int temp1=0,temp2=0;
fscanf(fp,"%d",&a);
fscanf(fp,"%d",&b);
temp1=x+a;
temp2=y+b;
temp1=temp1+temp2;
fclose(fp);
return(temp1);
}
/*退出函数*/
int FAR PASCAL WEP ( int/*SystemExit*/ )
{
return(1);
}
2）ADD.DEF文件的程序清单：
/*************************************/
/* 文件名： ADD.H */
/*************************************/
LIBRARY ADD
DESCRIPTION 'ADD.DLL'
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE SINGLE
HEAPSIZE 1024
EXPORTS
ADD @1
WEP @2
（3）ADD.H程序清单：
/*************************************/
/* 文件名： ADD.H */
/*************************************/
extern "C" int _export FAR PASCAL add(int x,int y,char *filein) ;
（4）建立工程文件：
在Borland C++环境下的project项中打开open project file项并建立ADD.prj，在add
item中加入ADD.C文件和ADD.DEF文件即可建立工程文件。
第二步，在Borland C的options项的Applation中选择Windows DLL，再在Compile中选择
Build all，这样就可生成动态链接库ADD.DLL供VB调用。
三、VB3.0调用动态链接库DLL方法
制作好DLL之后，就可以用VB调用它，实现VB调用C程序。VB程序要使用DLL中的函
数， 首先必须要有特殊的声明，用Declare声明语句在窗体级或模块级或全局模块的代
码声明段进行声明，将动态链接库中的函数声明到VB中，供VB程序调用。
语句格式为：Declare Sub 过程名Lib摽鈹黚_n[ Alias " 别名]（[ByVal 参数AS类型]
）；蛭狣eclare Function函数名Lib摽鈹黚_衃 Alias " 别名]（[ByVal 参数AS类型]）AS
类型在声明中首先用Declare关键字表示声明DLL中的函数。在C语言中有的函数类型为
VOID，它表示不具有返回值，则必须用关键字Sub将其声明成过程。有的函数具有返回
值，则必须用关键字Function将其声明成函数，并且在声明语句的最后要用AS关键字指
明函数返回值的类型。
例如上面的ADD.DLL在VB中就可以声明为：
Declare Function ADD Lib撫c:\ADD.dll敚―ByVal X AS Integer, ByVal Y AS Integ
er ,ByVal filein as string）AS Integer
通过此声明语句将函数ADD声明到VB中，便可直接调用。
四、结束语
以上详细介绍了Borland C环境下制作动态链接库以及VB调用for dos动态链接库
的方法、步骤，并通过实例说明VB调用C语言程序的方法。举例程序ADD经VB3.0编译，在486
微机上调试通过。本文介绍的方法具有广泛的意义，也完全适用于C++ 语言程序。

--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.18.245]
--
※ 转载:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.7.21]


重新整理精华区，所有东西暂时放在下边的这个临时目录中。
thebestone, 2001.03.26
临时目录（尚未整理的文档）