From: Kevin M. Rosenberg Date: Fri, 4 Jul 2003 21:39:40 +0000 (+0000) Subject: r5231: Auto commit for Debian build X-Git-Tag: debian-4.5.3-3~69 X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=commitdiff_plain;h=87f312d59cabca5080b481a20314601ea476c4be r5231: Auto commit for Debian build --- diff --git a/debian/changelog b/debian/changelog index 15ac3a6..ace0c65 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +ctsim (4.2.5-1) unstable; urgency=low + + * Fix gcc-3.3 compilation issues (closes:200074) + + -- Kevin M. Rosenberg Fri, 4 Jul 2003 14:23:38 -0600 + ctsim (4.2.4b-2) unstable; urgency=low * Allow mesag1 | libgl1 in all binary packages (closes:190213) diff --git a/debian/control b/debian/control index 9bb20cf..090d916 100644 --- a/debian/control +++ b/debian/control @@ -4,7 +4,7 @@ Priority: extra Maintainer: Kevin M. Rosenberg Build-Depends: debhelper (>= 4.0.0), wxwin2.4-headers, fftw-dev, libreadline4-dev, mesa-common-dev, libwxgtk2.4-dev, ctn-dev, libpng12-dev, dpkg-dev Build-Depends-Indep: debhelper (>= 4.0.0) -Standards-Version: 3.5.9.0 +Standards-Version: 3.5.10.0 Package: ctsim Architecture: any diff --git a/debian/rules b/debian/rules index 478e811..4d073ab 100755 --- a/debian/rules +++ b/debian/rules @@ -1,7 +1,5 @@ #!/usr/bin/make -f -export DH_COMPAT=4 - ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) CFLAGS += -g endif diff --git a/include/scanner.h b/include/scanner.h index cad4be0..eba02d4 100644 --- a/include/scanner.h +++ b/include/scanner.h @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: scanner.h,v 1.23 2003/04/01 19:49:41 kevin Exp $ +** $Id: scanner.h,v 1.24 2003/07/04 21:39:39 kevin Exp $ ** ** ** This program is free software; you can redistribute it and/or modify @@ -111,8 +111,8 @@ class Scanner int geometry() const {return m_idGeometry;} static int getGeometryCount() {return s_iGeometryCount;} - static const char** getGeometryNameArray() {return s_aszGeometryName;} - static const char** getGeometryTitleArray() {return s_aszGeometryTitle;} + static const char* const* getGeometryNameArray() {return s_aszGeometryName;} + static const char* const* getGeometryTitleArray() {return s_aszGeometryTitle;} static int convertGeometryNameToID (const char* const geometryName); static const char* convertGeometryIDToName (const int idGeometry); static const char* convertGeometryIDToTitle (const int idGeometry); @@ -165,8 +165,8 @@ class Scanner double m_dTextHeight; #endif - static const char* s_aszGeometryName[]; - static const char* s_aszGeometryTitle[]; + static const char* const s_aszGeometryName[]; + static const char* const s_aszGeometryTitle[]; static const int s_iGeometryCount; void projectSingleView (const Phantom& phm, DetectorArray& darray, const double xd1, const double yd1, const double xd2, const double yd2, const double xs1, const double ys1, const double xs2, const double ys2, const double dDetAngle); diff --git a/libctsim/backprojectors.cpp b/libctsim/backprojectors.cpp index 7551ff9..164b42e 100644 --- a/libctsim/backprojectors.cpp +++ b/libctsim/backprojectors.cpp @@ -8,7 +8,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: backprojectors.cpp,v 1.33 2003/03/23 18:37:42 kevin Exp $ +** $Id: backprojectors.cpp,v 1.34 2003/07/04 21:39:40 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -35,18 +35,18 @@ const int Backprojector::BPROJ_IDIFF = 3; const char* const Backprojector::s_aszBackprojectName[] = { - {"trig"}, - {"table"}, - {"diff"}, - {"idiff"}, + "trig", + "table", + "diff", + "idiff", }; const char* const Backprojector::s_aszBackprojectTitle[] = { - {"Direct Trigometric"}, - {"Trigometric Table"}, - {"Difference Iteration"}, - {"Integer Difference Iteration"}, + "Direct Trigometric", + "Trigometric Table", + "Difference Iteration", + "Integer Difference Iteration", }; const int Backprojector::s_iBackprojectCount = sizeof(s_aszBackprojectName) / sizeof(const char*); @@ -65,33 +65,33 @@ const int Backprojector::INTERP_3BSPLINE = 7; const char* const Backprojector::s_aszInterpName[] = { - {"nearest"}, - {"linear"}, - {"cubic"}, + "nearest", + "linear", + "cubic", #if HAVE_FREQ_PREINTERP - {"freq_preinterpolationj"}, + "freq_preinterpolationj", #endif #if HAVE_BSPLINE_INTERP - {"bspline"}, - {"1bspline"}, - {"2bspline"}, - {"3bspline"}, + "bspline", + "1bspline", + "2bspline", + "3bspline", #endif }; const char* const Backprojector::s_aszInterpTitle[] = { - {"Nearest"}, - {"Linear"}, - {"Cubic"}, + "Nearest", + "Linear", + "Cubic", #if HAVE_FREQ_PREINTERP - {"Frequency Preinterpolation"}, + "Frequency Preinterpolation", #endif #if HAVE_BSPLINE_INTERP - {"B-Spline"}, - {"B-Spline 1st Order"}, - {"B-Spline 2nd Order"}, - {"B-Spline 3rd Order"}, + "B-Spline", + "B-Spline 1st Order", + "B-Spline 2nd Order", + "B-Spline 3rd Order", #endif }; diff --git a/libctsim/filter.cpp b/libctsim/filter.cpp index ab11056..59e02d7 100644 --- a/libctsim/filter.cpp +++ b/libctsim/filter.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2000 Kevin Rosenberg ** -** $Id: filter.cpp,v 1.39 2001/03/13 04:44:25 kevin Exp $ +** $Id: filter.cpp,v 1.40 2003/07/04 21:39:40 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -46,33 +46,33 @@ const int SignalFilter::FILTER_TRIANGLE = 11; const int SignalFilter::s_iReconstructFilterCount = 4; const char* const SignalFilter::s_aszFilterName[] = { - {"abs_bandlimit"}, - {"abs_hamming"}, - {"abs_hanning"}, - {"abs_cosine"}, - {"shepp"}, - {"abs_sinc"}, - {"bandlimit"}, - {"sinc"}, - {"hamming"}, - {"hanning"}, - {"cosine"}, - {"triangle"}, + "abs_bandlimit", + "abs_hamming", + "abs_hanning", + "abs_cosine", + "shepp", + "abs_sinc", + "bandlimit", + "sinc", + "hamming", + "hanning", + "cosine", + "triangle" }; const char* const SignalFilter::s_aszFilterTitle[] = { - {"Abs(w) * Bandlimit"}, - {"Abs(w) * Hamming"}, - {"Abs(w) * Hanning"}, - {"Abs(w) * Cosine"}, - {"Shepp"}, - {"Abs(w) * Sinc"}, - {"Bandlimit"}, - {"Sinc"}, - {"Hamming"}, - {"Hanning"}, - {"Cosine"}, - {"Triangle"}, + "Abs(w) * Bandlimit", + "Abs(w) * Hamming", + "Abs(w) * Hanning", + "Abs(w) * Cosine", + "Shepp", + "Abs(w) * Sinc", + "Bandlimit", + "Sinc", + "Hamming", + "Hanning", + "Cosine", + "Triangle" }; const int SignalFilter::s_iFilterCount = sizeof(s_aszFilterName) / sizeof(const char*); @@ -83,13 +83,13 @@ const int SignalFilter::DOMAIN_FREQUENCY = 0; const int SignalFilter::DOMAIN_SPATIAL = 1; const char* const SignalFilter::s_aszDomainName[] = { - {"frequency"}, - {"spatial"}, + "frequency", + "spatial", }; const char* const SignalFilter::s_aszDomainTitle[] = { - {"Frequency"}, - {"Spatial"}, + "Frequency", + "Spatial", }; const int SignalFilter::s_iDomainCount = sizeof(s_aszDomainName) / sizeof(const char*); diff --git a/libctsim/imagefile.cpp b/libctsim/imagefile.cpp index c479adb..57d5b65 100644 --- a/libctsim/imagefile.cpp +++ b/libctsim/imagefile.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: imagefile.cpp,v 1.47 2003/03/23 18:37:42 kevin Exp $ +** $Id: imagefile.cpp,v 1.48 2003/07/04 21:39:40 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -51,27 +51,29 @@ const int ImageFile::EXPORT_FORMAT_RAW = 6; const char* ImageFile::s_aszExportFormatName[] = { - {"text"}, - {"pgm"}, - {"pgmascii"}, + "text", + "pgm", + "pgmascii", #ifdef HAVE_PNG - {"png"}, - {"png16"}, + "png", + "png16", #endif #ifdef HAVE_CTN_DICOM - {"dicom"}, + "dicom", #endif }; const char* ImageFile::s_aszExportFormatTitle[] = { - {"Text"}, - {"PGM"}, - {"PGM ASCII"}, - {"PNG"}, - {"PNG 16-bit"}, + "Text", + "PGM", + "PGM ASCII", +#ifdef HAVE_PNG + "PNG", + "PNG 16-bit", +#endif #ifdef HAVE_CTN_DICOM - {"Dicom"}, + "Dicom", #endif }; const int ImageFile::s_iExportFormatCount = sizeof(s_aszExportFormatName) / sizeof(const char*); @@ -89,21 +91,23 @@ const int ImageFile::IMPORT_FORMAT_DICOM = 2; const char* ImageFile::s_aszImportFormatName[] = { - {"ppm"}, + "ppm", #ifdef HAVE_PNG - {"png"}, + "png", #endif #ifdef HAVE_CTN_DICOM - {"dicom"}, + "dicom", #endif }; const char* ImageFile::s_aszImportFormatTitle[] = { - {"PPM"}, - {"PNG"}, + "PPM", +#ifdef HAVE_PNG + "PNG", +#endif #ifdef HAVE_CTN_DICOM - {"Dicom"}, + "Dicom", #endif }; const int ImageFile::s_iImportFormatCount = sizeof(s_aszImportFormatName) / sizeof(const char*); diff --git a/libctsim/phantom.cpp b/libctsim/phantom.cpp index 9d9a537..acfedd7 100644 --- a/libctsim/phantom.cpp +++ b/libctsim/phantom.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: phantom.cpp,v 1.33 2003/03/15 14:52:36 kevin Exp $ +** $Id: phantom.cpp,v 1.34 2003/07/04 21:39:40 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -38,16 +38,16 @@ const int Phantom::PHM_UNITPULSE = 2; const char* Phantom::s_aszPhantomName[] = { - {"herman"}, - {"shepp-logan"}, - {"unit-pulse"}, + "herman", + "shepp-logan", + "unit-pulse", }; const char* Phantom::s_aszPhantomTitle[] = { - {"Herman Head"}, - {"Shepp-Logan"}, - {"Unit Pulse"}, + "Herman Head", + "Shepp-Logan", + "Unit Pulse", }; const int Phantom::s_iPhantomCount = sizeof(s_aszPhantomName) / sizeof(const char*); diff --git a/libctsim/procsignal.cpp b/libctsim/procsignal.cpp index 1685f19..89b6ff0 100644 --- a/libctsim/procsignal.cpp +++ b/libctsim/procsignal.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: procsignal.cpp,v 1.32 2001/03/30 19:17:32 kevin Exp $ +** $Id: procsignal.cpp,v 1.33 2003/07/04 21:39:40 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -42,23 +42,23 @@ const int ProcessSignal::FILTER_METHOD_FFTW = 4; const int ProcessSignal::FILTER_METHOD_RFFTW =5 ; #endif const char* const ProcessSignal::s_aszFilterMethodName[] = { - {"convolution"}, - {"fourier"}, - {"fouier-table"}, - {"fft"}, + "convolution", + "fourier", + "fouier-table", + "fft", #if HAVE_FFTW - {"fftw"}, - {"rfftw"}, + "fftw", + "rfftw", #endif }; const char* const ProcessSignal::s_aszFilterMethodTitle[] = { - {"Convolution"}, - {"Fourier"}, - {"Fouier Trigometric Table"}, - {"FFT"}, + "Convolution", + "Fourier", + "Fouier Trigometric Table", + "FFT", #if HAVE_FFTW - {"FFTW"}, - {"Real/Half-Complex FFTW"}, + "FFTW", + "Real/Half-Complex FFTW", #endif }; const int ProcessSignal::s_iFilterMethodCount = sizeof(s_aszFilterMethodName) / sizeof(const char*); @@ -68,12 +68,12 @@ const int ProcessSignal::FILTER_GENERATION_INVALID = -1; const int ProcessSignal::FILTER_GENERATION_DIRECT = 0; const int ProcessSignal::FILTER_GENERATION_INVERSE_FOURIER = 1; const char* const ProcessSignal::s_aszFilterGenerationName[] = { - {"direct"}, - {"inverse-fourier"}, + "direct", + "inverse-fourier", }; const char* const ProcessSignal::s_aszFilterGenerationTitle[] = { - {"Direct"}, - {"Inverse Fourier"}, + "Direct", + "Inverse Fourier", }; const int ProcessSignal::s_iFilterGenerationCount = sizeof(s_aszFilterGenerationName) / sizeof(const char*); diff --git a/libctsim/projections.cpp b/libctsim/projections.cpp index 6473002..c0e4871 100644 --- a/libctsim/projections.cpp +++ b/libctsim/projections.cpp @@ -8,7 +8,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: projections.cpp,v 1.82 2003/03/23 18:37:42 kevin Exp $ +** $Id: projections.cpp,v 1.83 2003/07/04 21:39:40 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -37,15 +37,15 @@ const int Projections::POLAR_INTERP_BICUBIC = 2; const char* const Projections::s_aszInterpName[] = { - {"nearest"}, - {"bilinear"}, + "nearest", + "bilinear", // {"bicubic"}, }; const char* const Projections::s_aszInterpTitle[] = { - {"Nearest"}, - {"Bilinear"}, + "Nearest", + "Bilinear", // {"Bicubic"}, }; diff --git a/libctsim/scanner.cpp b/libctsim/scanner.cpp index 57babad..aeb5197 100644 --- a/libctsim/scanner.cpp +++ b/libctsim/scanner.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: scanner.cpp,v 1.43 2003/04/01 19:49:41 kevin Exp $ +** $Id: scanner.cpp,v 1.44 2003/07/04 21:39:40 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -34,20 +34,20 @@ const int Scanner::GEOMETRY_EQUIANGULAR = 1; const int Scanner::GEOMETRY_EQUILINEAR = 2; const int Scanner::GEOMETRY_LINOGRAM = 3; -const char* Scanner::s_aszGeometryName[] = +const char* const Scanner::s_aszGeometryName[] = { - {"parallel"}, - {"equiangular"}, - {"equilinear"}, - {"linogram"}, + "parallel", + "equiangular", + "equilinear", + "linogram", }; -const char* Scanner::s_aszGeometryTitle[] = +const char* const Scanner::s_aszGeometryTitle[] = { - {"Parallel"}, - {"Equiangular"}, - {"Equilinear"}, - {"Linogram"}, + "Parallel", + "Equiangular", + "Equilinear", + "Linogram", }; const int Scanner::s_iGeometryCount = sizeof(s_aszGeometryName) / sizeof(const char*); diff --git a/libctsim/trace.cpp b/libctsim/trace.cpp index 3fe33f0..73636ed 100644 --- a/libctsim/trace.cpp +++ b/libctsim/trace.cpp @@ -8,7 +8,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: trace.cpp,v 1.3 2000/08/27 20:32:55 kevin Exp $ +** $Id: trace.cpp,v 1.4 2003/07/04 21:39:40 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -42,22 +42,22 @@ const int Trace::BIT_CLIPPING = 0x0010; const char* Trace::s_aszTraceName[] = { - {"none"}, - {"console"}, - {"phantom"}, - {"proj"}, - {"plot"}, - {"clipping"}, + "none", + "console", + "phantom", + "proj", + "plot", + "clipping", }; const char* Trace::s_aszTraceTitle[] = { - {"None"}, - {"Console"}, - {"Phantom"}, - {"Projections"}, - {"Plot"}, - {"Clipping"}, + "None", + "Console", + "Phantom", + "Projections", + "Plot", + "Clipping", }; const int Trace::s_iTraceCount = sizeof(s_aszTraceName) / sizeof(const char*); diff --git a/man/Makefile.am b/man/Makefile.am index 7f24410..184adb3 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -1,2 +1,2 @@ -man_MANS=pjrec.1 phm2pj.1 phm2if.1 ifexport.1 ifinfo.1 if1.1 if2.1 pjinfo.1 ifinfo.1 pj2if.1 ctsim.1 ctsimtext.1 phm2helix.1 pjHinterp.1 +man_MANS=pjrec.1 phm2pj.1 phm2if.1 ifexport.1 ifinfo.1 if1.1 if2.1 pjinfo.1 ifinfo.1 pj2if.1 ctsim.1 ctsimtext.1 phm2helix.1 pjHinterp.1 linogram.1 EXTRA_DIST = $(man_MANS) diff --git a/man/linogram.1 b/man/linogram.1 new file mode 100644 index 0000000..783c22a --- /dev/null +++ b/man/linogram.1 @@ -0,0 +1,30 @@ +.\" -*- NROFF -*- +.\" +.TH "linogram" "1" "" "Kevin Rosenberg" "Engineering" +.SH "NAME" +linogram \- Linogram gribddisplay for CTSIM + +.SH "SYNOPSIS" +.B linogram [OPTIONS] + +.SH "DESCRIPTION" +.Nm linogram +displays the grib used in linogram\-based scanning for +the CTSim package. + +.SH "OPTIONS" +\fIlinogram\fP accepts the following options +.TP 12 +.B \-\-version Display version +.TP 12 +.B \-\-help Print a terse help message + +.SH "AUTHORS" +Kevin Rosenberg, M.D. + +.SH "HISTORY" +CTSim was begun in 1983 using MS\-DOS and an EGA display adapter. In +1999 it was ported to GNU/Linux and later ported to Microsoft Windows. + +.SH "SEE ALSO" +.BR ifinfo (1), if1 (1), if2 (1), ifexport (1), phm2pj (1), phm2if (1), pj2if (1), pjinfo (1), pjrec (1) diff --git a/src/tips.cpp b/src/tips.cpp index 05c2a9e..20acf99 100644 --- a/src/tips.cpp +++ b/src/tips.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2001 Kevin Rosenberg ** -** $Id: tips.cpp,v 1.3 2001/03/05 20:29:23 kevin Exp $ +** $Id: tips.cpp,v 1.4 2003/07/04 21:39:40 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -40,26 +40,26 @@ const char* const CTSimTipProvider::s_aszTips[] = { - {"You can create a geometric phantom using the \"File - Create Phantom\" menu command."}, - {"You can create a gray-scale, rasterized image of a phantom by using the \"Process - Rasterize\" menu command on a geometric phantom."}, - {"You can simulate the x-ray process by using the \"Process - Projections\" menu command on a geometric phantom."}, - {"You can simulate first, second, and third-fourth-fifth generation CT scanners by using different scanner geometries."}, - {"You can reconstruct an image from the x-ray data by using the \"Reconstruction\" menu on a projection file."}, - {"You can specify different levels of smoothing by using different filters in the \"Reconstruction\" dialog."}, - {"You can select a row and column of an image by left-mouse button clicking on an image."}, - {"You can plot a column or row of an image by using the \"Analyze - Plot\" command."}, - {"You can save your plots to a disk file by using the \"File - Save\" command."}, - {"You can create your own phantoms using a text editor. Please see the manual for the simple file format."}, - {"You can perform 2-dimension Fourier transform of images using the \"Filter\" menu commands."}, - {"You can create an image of a filter by using the \"File - Create Filter\" menu command."}, - {"You can add two images by using the \"Image - Add\" menu command."}, - {"You can display the value of a pixel in an image by right-mouse button clicking on an image."}, - {"You can view a 3-dimensional view of an image using the \"Image - 3D\" menu command."}, - {"You can scale an image to any size using the \"Image - Scale Size\" menu command."}, - {"You can display context-sensitive help by using the \"Help\" button on dialog boxes."}, - {"You can compare two images by using the \"Analyze - Compare Images\" menu command."}, - {"You can display these tips at any time by using the \"Help - Tips\" menu command."}, - {"You can control CTSim's operation using the \"File - Preferences\" menu command."}, + "You can create a geometric phantom using the \"File - Create Phantom\" menu command.", + "You can create a gray-scale, rasterized image of a phantom by using the \"Process - Rasterize\" menu command on a geometric phantom.", + "You can simulate the x-ray process by using the \"Process - Projections\" menu command on a geometric phantom.", + "You can simulate first, second, and third-fourth-fifth generation CT scanners by using different scanner geometries.", + "You can reconstruct an image from the x-ray data by using the \"Reconstruction\" menu on a projection file.", + "You can specify different levels of smoothing by using different filters in the \"Reconstruction\" dialog.", + "You can select a row and column of an image by left-mouse button clicking on an image.", + "You can plot a column or row of an image by using the \"Analyze - Plot\" command.", + "You can save your plots to a disk file by using the \"File - Save\" command.", + "You can create your own phantoms using a text editor. Please see the manual for the simple file format.", + "You can perform 2-dimension Fourier transform of images using the \"Filter\" menu commands.", + "You can create an image of a filter by using the \"File - Create Filter\" menu command.", + "You can add two images by using the \"Image - Add\" menu command.", + "You can display the value of a pixel in an image by right-mouse button clicking on an image.", + "You can view a 3-dimensional view of an image using the \"Image - 3D\" menu command.", + "You can scale an image to any size using the \"Image - Scale Size\" menu command.", + "You can display context-sensitive help by using the \"Help\" button on dialog boxes.", + "You can compare two images by using the \"Analyze - Compare Images\" menu command.", + "You can display these tips at any time by using the \"Help - Tips\" menu command.", + "You can control CTSim's operation using the \"File - Preferences\" menu command.", }; const size_t CTSimTipProvider::s_iNumTips = sizeof(s_aszTips) / sizeof(const char *);