标签归档:C++

gsl 安装以及运行

1.主页
http://www.gnu.org/software/gsl/

2.下载源码及manual
ftp://ftp.gnu.org/gnu/gsl/gsl-1.7.tar.gz
http://www.gnu.org/software/gsl/manual/gsl-ref.ps.gz

3.编译安装
(我用的是FC4)
./configure –diable-shared
make
make install

4.测试
4.1写个testgsl.c:
#include stdio.h;
#include gsl/gsl_sf_bessel.h;

int main(void)
{
double x = 5.0;
double y = gsl_sf_bessel_J0(x);
printf(“J0(%g) = %.18e\n”,x,y);
return 0;
}

4.2编译
gcc -Wall -c testgsl.c

4.3链接
gcc -o testgsl testgsl.o -lgsl -lgslcblas -lm

4.4运行
./testgsl
输出:
J0(5) = -1.775967713143382920e-01

gcc + gsl 编译c文件

gcc -I/usr/lib/include -c test1.c
gcc -L/usr/lib64 test1.o -lgsl -lgslcblas -lm

# g++ -I/usr/lib/include -c main.cpp
[root@localhost test1]# gcc -I/usr/lib/include -c getmin.cpp
[root@localhost test1]# g++ -I/usr/lib/include -c grayhist.cpp
[root@localhost test1]# g++ -I/usr/lib/include -c sumhist.cpp

g++ -static main.o grayhist.o sumhist.o-lgsl -lgslcblas -lm -o main.out

2.3 Shared Libraries

To run a program linked with the shared version of the library the operating system must be able to locate the corresponding .so file at runtime. If the library cannot be found, the following error will occur:

$ ./a.out
./a.out: error while loading shared libraries:
libgsl.so.0: cannot open shared object file: No such
file or directory

To avoid this error, define the shell variable LD_LIBRARY_PATH to include the directory where the library is installed.

For example, in the Bourne shell (/bin/sh or /bin/bash), the library search path can be set with the following commands:

$ LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
$ export LD_LIBRARY_PATH
$ ./example

In the C-shell (/bin/csh or /bin/tcsh) the equivalent command is,

% setenv LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH

The standard prompt for the C-shell in the example above is the percent character `%’, and should not be typed as part of the command.

To save retyping these commands each session they should be placed in an individual or system-wide login file.

To compile a statically linked version of the program, use the -static flag in gcc,

$ gcc -static example.o -lgsl -lgslcblas -lm

#warning This file includes at least one deprecated or antiquated header.

用DEV-C++编译是总是有警告:

32:2 C:\Dev-Cpp\include\c++\3.4.2\backward\backward_warning.h #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated. V-C++,

那么你应该这样(新标准)如下:

#include <iostream> //C++头文件,去掉.h
#include <fstream>
#include <cstdlib> //C头文件,在原有文件名前加c,并去掉.h
using namespace std; //包括std名字空间

int main() //main函数必须返回int型,不再支持void
{
ofstream fout(“output.dat”, ios_base::binary);
//在文件操作中使用ios_base类代替早期的ios类
return 0; //这一条语句何以省略
}

====================
总是忘记,再次提醒自己

静态变量

  静态变量
  静态变量的类型说明符是static。
静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由
static加以定义后才能成为静态外部变量,或称静态全局变量。 对于自动变量,它属于动态存储方式。
但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。
  由此看来, 一个变量可由static进行再说明,并改变其原有的存储方式。
  1. 静态局部变量
  在局部变量的说明前再加上static说明符就构成静态局部变量。
  例如:
  static int a,b;
  static float array[5]={1,2,3,4,5};
  静态局部变量属于静态存储方式,它具有以下特点:
  (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
  (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
  (3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋以0值。
  (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋
初值,则其值是不定的。 根据静态局部变量的特点,
可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,
而且保存了前次被调用后留下的值。
因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的
副作用,因此仍以采用局部静态变量为宜
  2.静态全局变量
  全局变量(外部变量)的说明之前再冠以static
就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,
当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,
在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,
因此可以避免在其它源文件中引起错误。从以上分析可以看出,
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,
限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。
  静态变量
  除范围之外,变量还有存活期,在这一期间变量能够保持它们的值。在应用程序的存活期内一直保持
模块级变量和公用变量的值。但是,对于 Dim
声明的局部变量以及声明局部变量的过程,仅当过程在执行时这些局部变量才存在。通常,当一个过程执行完毕,它的局部变量的值就已经不存在,而且变量所占据
的内存也被释放。当下一次执行该过程时,它的所有局部变量将重新初始化。
  但可将局部变量定义成静态的,从而保留变量的值。在过程内部用 Static 关键字声明一个或多个变量,其用法和 Dim 语句完全一样:
  Static Depth
  例如,下面的函数将存储在静态变量 Accumulate 中的以前的运营总值与一个新值相加,以计算运营总值。
  Function RunningTotal (num)
  Static ApplesSold
  ApplesSold = ApplesSold + num
  RunningTotal = ApplesSold
  End Function
  如果用 Dim 而不用 Static 声明 ApplesSold,则以前的累计值不会通过调用函数保留下来,函数只会简单地返回调用它的那个相同值。
  在模块的声明段声明 ApplesSold,并使它成为模块级变量,由此也会收到同样效果。但是,这种方法一旦改变变量的范围,过程就不再对变量排他性存取。由于其它过程也可以访问和改变变量的值,所以运营总值也许不可靠,代码将更难于维护。
  声明所有的局部变量为静态变量
  为了使过程中所有的局部变量为静态变量,可在过程头的起始处加上 Static 关键字。例如:
  Static Function RunningTotal (num)
  这就使过程中的所有局部变量都变为静态,无论它们是用 Static、Dim 或 Private 声明的还是隐式声明的。可以将 Static 放在任何 Sub 或 Funtion 过程头的前面,包括事件过程和声明为 Private 的过程

=================================
很多东西都是自己在用到的时候才真正去了解它

C++中的常用数学函数

#include <iostream>
  #include <cmath>
  using namespace std;
  int main()
  {
   double pi,e,n;
   int i;
   pi = acos(-1.0);
   e = exp(1.0);
   cout << "abs(-10) = " << abs(-10) << "\n";//求整数的绝对值
   cout << "fabs(-10.8) = " << fabs(-10.8) << "\n";
   cout << "asin(0.5) = " << asin(0.5) << " (π/6)\n";
   cout << "atan(1.0) = " << atan(1.0) << " (π/4)\n";
   cout << "atan2(1.0,√3) = " << atan2(1.0,sqrt(3.0)) << " (π/6)\n";
   cout << "sin(π/2) = " << sin(pi / 2.0) << "\n";
   cout << "sinh(π/2) = " << sinh(pi /2.0 ) << "\n";
   cout << "cos(π/2) = " << cos(pi / 2.0) << " (≈0.0)\n";
   cout << "cosh(π/2) = " << cosh(pi /2.0 ) << "\n";
   cout << "tan(π/4) = " << tan(pi / 4) << "\n";
   cout << "tanh(π/4) = " << tanh(pi /4 ) << "\n";
   cout << "ceil(1.3) = " << ceil(1.3) << "\n";
   cout << "ceil(-1.3) = " << ceil(-1.3) << "\n";
   cout << "floor(1.3) = " << floor(1.3) << "\n";
   cout << "floor(-1.3) = " << floor(-1.3) << "\n";
   cout << "log(e*e) = " << log(e*e) << "\n";
   cout << "log10(1000.0) = " << log10(1000.0) << "\n";
   cout << "fmod(10.2,3.0) = " << fmod(10.2,3.0) << "\n";
   cout << "fmod(-10.2,3.0) = " << fmod(-10.2,3.0) << "\n";
   cout << "pow(25.0,2.0) = " << pow(25.0,2.0) << "\n";
   cout << "modf(-12.3435,&n) = " << modf(-12.3435,&n) << ",";
   cout << "n = " << n << "\t-12.3435 = n + modf(-12.3435,&n)\n";
   cout << "frexp(17.0,&i) = " << frexp(17.0,&i) << ",";
   cout << "i = " << i << "\t17.0 = frexp(17.0,&i)*2^i\n";
   cout << "ldexp(0.53125,5) = " << ldexp(0.53135,5) << "\tldexp(0.53125,5)=0.53125*2^5\n";
   return 0;
  }
  /*
  输出结果:
  abs(-10) = 10
  fabs(-10.8) = 10.8
  asin(0.5) = 0.523599 (π/6)
  atan(1.0) = 0.785398 (π/4)
  atan2(1.0,√3) = 0.523599 (π/6)
  sin(π/2) = 1
  sinh(π/2) = 2.3013
  cos(π/2) = 6.12303e-017 (≈0.0)
  cosh(π/2) = 2.50918
  tan(π/4) = 1
  tanh(π/4) = 0.655794
  ceil(1.3) = 2
  ceil(-1.3) = -1
  floor(1.3) = 1
  floor(-1.3) = -2
  log(e*e) = 2
  log10(1000.0) = 3
  fmod(10.2,3.0) = 1.2
  fmod(-10.2,3.0) = -1.2
  pow(25.0,2.0) = 625
  modf(-12.3435,&n) = -0.3435,n = -12 -12.3435 = n + modf(-12.3435,&n)
  frexp(17.0,&i) = 0.53125,i = 5 17.0 = frexp(17.0,&i)*2^i
  ldexp(0.53125,5) = 17.0032 ldexp(0.53125,5)=0.53125*2^5
  */
  /*
  abs; acos; asin; atan; atan2; ceil;cos; cosh; exp;
  fabs; floor; fmod; frexp; ldexp; log;log10; modf; pow;
  sin; sinh; sqrt;tan; tanh;
  acosf; asinf; atanf; atan2f; ceilf; cosf; coshf; expf;
  fabsf; floorf; fmodf; frexpf; ldexpf; logf;
  log10f; modff; powf; sinf; sinhf; sqrtf; tanf; tanhf;
  acosl; asinl; atanl; atan2l; ceill; cosl; coshl; expl;
  fabsl; floorl; fmodl; frexpl; ldexpl; logl;
  log10l; modfl; powl; sinl; sinhl; sqrtl; tanl; tanhl;
  */