amazon

25.3.11

C++ string型からchar**型へ


C++ではどうも"文字列"が自動的にstringになるようだ。

Cのmain関数をc_main名前に変えて、C++から呼びだそうとしたとき警告が出た。
//main.cpp
#include "c_main.h"

int main(){
    char* argv[] = {"文字列"};
    int argc = 1;
    c_main(argc,argv);
    return 0;
}
をコンパイルして実行すると
$ g++ main.cpp
$ ./a.out
warning: deprecated conversion from string constant to ‘char*'
という警告が出る。

「string constant型からchar*型への変換は非推奨です」ということである。
警告なのでこのままでもいいのだが、気持ち悪いのでいじってみた。

char* argv[] = {(char*)"文字列"};
型変換なので、これだけでOK。

全体では以下のようにすればよい。
//main.cpp
#include "c_main.h"

int main(){
    char* argv[] = {(char*)"文字列"};
    int argc = sizeof argv/sizeof argv[0];
    c_main(argc,argv);
    return 0;
}


//c_main.h
int c_main(void);


//c_main.c
#include "c_main.h"

int c_main(int argc, char *argv[]){
    ---- 関数の中身 ----
}



余談だが、
int main(int argc, char *argv[])
のargvには実行時のオプションに与える文字列の配列、argcにはその個数が入っている。
例えば、
//main.c

#include <stdio.h>
int main(int argc, char* argv[]){
    printf("argc = %d\n",argc);
    printf("1 = %s, 2 = %s, 3 = %s\n",argv[0],argv[1],argv[2]);
    return 0;
}
をコンパイルして実行すると

$ gcc main.c
$ ./a.out 文字列1 文字列2 文字列3
argc = 4
1 = ./a.out, 2 = 文字列1, 3 = 文字列2
となる。

16.3.11

CPANメモ

cpanをいじっていたら、

$ cpan
と打っても反応しなくなった。

$ sudo perl -MCPAN -e shell



cpan[1]>

モジュールの検索
cpan[1]> i /モジュール名/

モジュールのインストール
cpan[1]> install モジュール名

15.3.11

e-taxで確定申告 on MBP Snow Leopard

e-Taxで確定申告をしたときに、つまずいたことをメモしておく。

まず、公的個人認証サービスクライントソフトがインストール出来ない。
これは、エラーにもあるように、Snow Leopardは標準でJAVAが入っていない事による。

http://support.apple.com/downloads/から、
Java for Mac OS X 10.6を検索して、
Download & インストール。

このままだと、e-taxの書類をSafariで作成中にJAVAのエラーが出る。
そこで、
Macのソフトウェア・アップデートでSafariの最新版をインストール。


また、エラーコード:AF0020-701 については
ここにあるが、Safariを一旦落として、Safari.appの情報を開いて、詳細設定で、32ビットモードで起動するにチェックを入れる。

後は、この辺参考にしました。
e-Tax奮闘記

計算しなくてい良いので、手書きの申告よりずっと楽でした。

4.3.11

int argc, char *argv[]の中には何が入っているのか



glutだとglutInit(&argc,argv)で初期化を行う。

argcとargvには何が入っているか出力してみた。

#include <stdio.h>
int main(int argc, char *argv[]){
printf("argc=%d\n",argc);
printf("argv[0]=%s\n",argv[0]);
printf("argv[1]=%s\n",argv[1]);
}

で、コンパイルして
$./a.out
で実行すると、以下の結果が出た。
argc=1
argv[0]=./a.out
argv[1]=(null)

というわけでglutの初期化をmain関数以外で使うには、こんな感じしたらできた。

#include <GL/glut.h>
#include <stdio.h>

void func(int argc, char *argv[]){
glutInit(&argc,argv);
}

int main(int argc, char *argv[]){
char *v[]={"window name"};
func(1,v);
glut...;//他のglut関数
return 0;
}

C, C++で配列を返す関数

C、C++では配列を返す関数は作れない。
そこでポインタを渡してあげれば良い。

以下に対処方法の例。
2次元配列a[3][5]に関数funcで代入をする方法を示した。

=============================
[main.c]
#include <stdio.h>
#include "func.h"

int main()
{
int a[3][5]; //aの宣言
func(a); //aのポインタを関数funcに渡して処理をさせる

/*aの中身の確認*/
int i,j;
for(i=0;i<3;i++){
 for(j=0;j<5;j++){
 printf("%d \n",a[i][j]);
 }
}
return 0;
}
=============================
[func.h]
int func(int (*a)[5]); //関数の宣言
=============================
[func.c]
#include "func.h" //ヘッダーのインクルード
int func(int (*a)[5]){ //関数の中身
 int i,j;
for(i=0;i<3;i++){ //aに i x j を代入
 for(j=0;j<5;j++){
 a[i][j] = i*j;
 } }
 return 0;
 }

2.3.11

エクセルで時刻を24時間以上表示する方法

エクセルで合計時間を計算すると24時間で循環してしまう。

その対処。

セルの書式設定、ユーザー定義で
h:mm:ss

[h]:mm:ss
にする。