> だいたいできると思うんですが、細かいところで苦労するかもしれず、
レスありがとうございます。一応CygWinでやってみようかなと思います。
(linuxをインストールすれば早いかもしれませんが、うちの環境は無線LANなので設定が厳しい・・w)
> それはそうと、この掲示板では、ネットワークプログラミングについて
> かつて話題になったことがあります。
>
> http://bbs9.otd.co.jp/maebashi/bbs_plain?base=32&range=1
>
> こっちでは、WinSockでいいやん、という話になったようですね。
参考にさせていただきます。
> で、私は、この議論についての記憶はあったのですが、発掘するのに
> えらく苦労しました。タイトルが不適切だからです(まあタイトル
> 変えずにレス付け続けた私も悪いですが)。
> というわけでそのへんはishikawaさんもちょっと考慮していただけると
> 嬉しいかなあ、と。
スイマセン以後気をつけます。
> よく本屋に行ったら Linux対応のネットワークプログラミング と書かれている本
> を見かけるんですが、Windows上でもCygWinをインストールすればそのネットワーク
> プログラムは実行させることはできますか?
だいたいできると思うんですが、細かいところで苦労するかもしれず、
私はやったことないので誰か詳しい人がレスしてくれないかなあ、
と思っていたのですが(他力本願)
それはそうと、この掲示板では、ネットワークプログラミングについて
かつて話題になったことがあります。
http://bbs9.otd.co.jp/maebashi/bbs_plain?base=32&range=1
こっちでは、WinSockでいいやん、という話になったようですね。
で、私は、この議論についての記憶はあったのですが、発掘するのに
えらく苦労しました。タイトルが不適切だからです(まあタイトル
変えずにレス付け続けた私も悪いですが)。
というわけでそのへんはishikawaさんもちょっと考慮していただけると
嬉しいかなあ、と。
> > いまちょっと調べたんですが、NoTopMostって「最上位指定のないウインドウの
> > 中で一番『上に』位置させる」という指定ではないですか?
> 説明がすごく下手なので申し訳ありません。今やろうとしていることが
> まさにその通りなのです.指定したwindowを現在アクティブなwindowの
> 真下に持っていく。ABCDと4つのwindowsがありAが現在アクティブで
> Dを指定してADBCとしたい。
既にヤスラカさんからレスがついていますが、
「最上位指定のあるウインドウ」と「アクティブなウインドウ」は
別物なわけですね。「最上位指定のある(TopMostな)ウインドウ」というのは、
たとえばIMEのツールバーのように、アクティブであるなしには関係なく
常に前面に表示されるウインドウのことなのだと思います。
んで、
>NoTopMostって「最上位指定のないウインドウの
>中で一番『上に』位置させる」という指定ではないですか?
私はドキュメントを途中まで読んでこう書いてしまいましたが、
続きに
>ウィンドウが既に非最上位ウィンドウとなっているときは、このフラグは無効です。
とあるように、非最上位ウィンドウの時は無効なんですね。失礼しました。
いろいろ情報ありがとうございました。私も勉強になりました。 > ヤスラカさん
以下余談ですが、
昔UNIXのX Windowの仕事をしていたとき、お客さんにはよく「TopMostウインドウ」
のようなウインドウを出して欲しい、と言われたものです。でもXにはそういう
ものはありませんでした。
このへん、職人気質のUNIXプログラマは、「最上位」と「それ以外」の2段階という
恣意的な分け方を嫌ったのかしら、などと思ったりします。
プログラマといえば「0, 1, たくさん」しか数えられないものですし。
でも実用上、TopMostなウインドウが欲しいというのもわかるんですよね。
お客さん向けに不具合・要望通知のフォーマットを作り、優先順位の項を
入れたら、ほとんど全ての通知を優先順位「高」で出してきた。
なんて話もよく聞きますが、
現状のWindowsアプリでは、そんな混乱には陥らず、結構便利に使えていると
思います。
ヤスラカです。
MFCは使ってないのですが、Win32APIは叩いてたりします。
古い手法だと自覚してます(^^;
そんな「古い」私の理解では、2つの誤解をされているように思います。
とりあえず、MSDN Onlineより
http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_mfc_cwnd.3a3a.setwindowpos.asp
>wndNoTopMost
(中略)
>ウィンドウが既に非最上位ウィンドウとなっているときは、このフラグは無効です。
第一に、最上位にないウィンドウに対してNoTopMostしようとしても、何も起こりません。
第二に、ここでいう「最上位(TopMost)」というのは「常に最前面に表示」とか言われているもので、
実際のZ-Orderが最上位と言う意味ではないと(私は)理解しています。
Top系のフラグが3種類ありますが、これらはつまり、
・wndTop は、"TopMost"以外で先頭に
・wndTopMost は、ウィンドウに"TopMost"属性を与える
・wndNoTopMost は、ウィンドウから"TopMost"属性を削除する
という事だと考えます。
MDIアプリではこの辺の動作が完全ではないので、
MDIではないもので実験してみると良いと思います。
おっしゃっている事をやろうとするなら、かなり泥臭くて見た目も悪いですが、
1.Z-Orderを2位にしたいウインドウを wndTop に指定
2.Z-Orderを1位にしたいウィンドウを wndTop に指定
という2段構えにならざるを得ないと思います。
ABCDのウィンドウのDが、Aに対する環境ウィンドウ(ツールボックス等)であるなら、
DはMDIChildではなく、独立したダイアログウィンドウにし、
これをTopMostにする等の方法が一般的だと思います。
(ぱ)さん投稿有難うございます.
> > CMyView * pMyView = ( CMyView * ) pDoc -> GetView(RUNTIME_CLASS(CMyView) );
> > CMDIChildWnd * pChild = ( CMDIChildWnd * pMyView -> GetParent();
> > pChild ->SetWindowPos( &pChild->wndNoTopMost, 0,0,0,0,SWP_SHOWWINDOW);
>
> このコードではうまくいかなかったのですか? うまくいかなかったとしたら、
> どううまくいかなかったのでしょうか?
何も反応無しです.しかしpChild→ActivateFrame(SW_SHOW)とすると
指定したwindow(今回は気をつけてみました.)が一番トップに表示され
アクティブになるのでハンドルの取得方法は正しいと思います.
> いまちょっと調べたんですが、NoTopMostって「最上位指定のないウインドウの
> 中で一番『上に』位置させる」という指定ではないですか?
説明がすごく下手なので申し訳ありません。今やろうとしていることがまさにその通りなのです.指定したwindowを現在アクティブなwindowの真下に持っていく。ABCDと4つのwindowsがありAが現在アクティブでDを指定してADBCとしたい。
今は、このSetWindowPosを研究しているのですがあまり成功例がないようです。
それでは、
> ウィンドウズをアクティブウインドウズの
> 真後ろに持っていきたいのですが
この「真後ろ」というのがよくわからなかったのですが(通常「真後ろ」と
いえばXYの座標が一致していることを意味すると思うんですが、
文脈からしてそういうことをしているようにも見えないし)、
よく考えてみると、
「現在アクティブで一番上に表示されているウインドウの、
『ひとつ下の階層』に表示させたい」
という意味でしょうか?
だとすると、現在アクティブなウインドウがTOPMOSTなウインドウでない限り
「できない」ように思えますが、どうでしょうか? > 詳しい方
私はMFCはずいぶん前にちょっとやったきりで、そのときはウインドウの
前後関係をいじったりはしてませんし、今手元に開発環境もないので
試すこともできませんが…
> MSDNやネットで検索した結果SetWindowPosにて
> 自由にWindowsのZオーダーを変更できる
> ことが分かったのですがいまいち使い方
> が分かりません。
検索したらこんなのが見つかりました。
http://forums.belution.com/ja/vc/000/001/76.shtml
> CMyView * pMyView = ( CMyView * ) pDoc -> GetView(RUNTIME_CLASS(CMyView) );
> CMDIChildWnd * pChild = ( CMDIChildWnd * pMyView -> GetParent();
> pChild ->SetWindowPos( &pChild->wndNoTopMost, 0,0,0,0,SWP_SHOWWINDOW);
このコードではうまくいかなかったのですか? うまくいかなかったとしたら、
どううまくいかなかったのでしょうか?
それを書いたほうが有効な回答が得られやすいと思います。
いまちょっと調べたんですが、NoTopMostって「最上位指定のないウインドウの
中で一番『上に』位置させる」という指定ではないですか?
上記のページではwndBottomを指定してますし。
これは素人の推測ですので外してましたらすみません。
# 余談ですけど、「ウインドウズ」といったらOSなのであって、画面に表示される
# アレのことは「ウインドウ」でよいと思うです。:-)
よく本屋に行ったら Linux対応のネットワークプログラミング と書かれている本
を見かけるんですが、Windows上でもCygWinをインストールすればそのネットワーク
プログラムは実行させることはできますか?
MDIを使用してアプリを開発しております。
複数ウィンドウズを開いてある指定した
ウィンドウズをアクティブウインドウズの
真後ろに持っていきたいのですが
どうしたらいいのか迷っています。
MSDNやネットで検索した結果SetWindowPosにて
自由にWindowsのZオーダーを変更できる
ことが分かったのですがいまいち使い方
が分かりません。
どなたかご存知の方いらっしゃったらご教授
いただけないでしょうか。
参考にコード記します。
環境はVS6/windows2000です。
CMyView * pMyView = ( CMyView * ) pDoc -> GetView(RUNTIME_CLASS(CMyView) );
CMDIChildWnd * pChild = ( CMDIChildWnd * pMyView -> GetParent();
pChild ->SetWindowPos( &pChild->wndNoTopMost, 0,0,0,0,SWP_SHOWWINDOW);
> はじめておじゃまします。Dukeと申します。
はじめまして。
> 同ページ内の「配列→ポインタの読み替え」という単元で述べられている
> scanfを用いた例えですが、これは正常に動いてしまうと結論付けてよい
> ものなでしょうか?
もちろんこの書き方は正しくないわけで、「正常に動いて『しまう』」の、
この『しまう』というあたりに、
これは正常に動いているように見えるけれど正しくないのだ、
という意図を含めたつもりでしたが、もっとはっきり書いたほうが誤解がないですね。
多少ですが、修正しておきました。ご意見ありがとうございました。
はじめておじゃまします。Dukeと申します。
今日始めてHP内の「配列とポインタの完全制覇」を読ませていただきました。
そこで一つ思うことがあるのでこちらに書かせていだたきます。
同ページ内の「配列→ポインタの読み替え」という単元で述べられている
scanfを用いた例えですが、これは正常に動いてしまうと結論付けてよい
ものなでしょうか?
実際の運用を正しく述べるのであれば、
「正常に動いているように誤認してしまう」
という形で記述するべきだと愚考します。
突然失礼かと思いましたが書き込ませていただきました。
> unsigned long に cast する前に
> while(*ep++);
> を実行してますね。
> これがキモなんです。
> 1番目の実行結果の場合、この
> while(*ep++);
> を行っていません。従って、環境変数を表示しています。
> 2番目の実行結果の場合、この
> while(*ep++);
> の後に実行しています。従って、環境変数の領域の後に
> ある、unsigned long が (ID, 値) の 2 つ組で連続して
> いる領域を表示しているわけです。つまり、全く違うもの
> を表示しているわけですから、
>
> なお、unsigned long の 2つ組 の領域は、IDが 0 と
> なったところで終わります。
やっと理解できました。
while(*ep++);
で環境変数の領域分だけポインタをすすめたあとにunsigned longの
領域があるのですね。
検証してみました。
while(*ep++);
while(*ep){
printf("ep = %ld , %ld\n",*ep,ep[1]);
ep+=2;
}
printf("ep = %ld , %ld\n",*ep,ep[1]);
実行結果:
ep = 16 , -1075054081
ep = 6 , 4096
ep = 17 , 100
ep = 3 , 134512692
ep = 4 , 32
ep = 5 , 6
ep = 7 , 1073741824
ep = 8 , 0
ep = 9 , 134513616
ep = 11 , 0
ep = 12 , 0
ep = 13 , 0
ep = 14 , 0
ep = 15 , -1073747345
ep = 0 , 0
while(*ep++) をコメント化すると,環境変数の領域もIDが0で終了して
いました。
実行結果:
ep = -1073742852 , -1073742842
ep = -1073742829 , -1073742804
ep = -1073742696 , -1073742673
ep = -1073742657 , -1073742625
ep = -1073742575 , -1073742556
ep = -1073742545 , -1073742501
ep = -1073742481 , -1073742468
ep = -1073742455 , -1073742441
ep = -1073742433 , -1073742401
ep = -1073742389 , -1073742378
ep = -1073742368 , -1073742354
ep = -1073741903 , -1073741880
ep = -1073741862 , -1073741849
ep = 0 , 16
わかりやすい説明をありがとうございました。
> しかし,変数 environ をunsigned long型にcastして使用すると,番号が
> 表示されますが,この「番号」と先の文字列とはどのような関連が
> あるのでしょうか?
全く関連ありません。
unsigned long に cast する前に
while(*ep++);
を実行してますね。
これがキモなんです。
1番目の実行結果の場合、この
while(*ep++);
を行っていません。従って、環境変数を表示しています。
2番目の実行結果の場合、この
while(*ep++);
の後に実行しています。従って、環境変数の領域の後に
ある、unsigned long が (ID, 値) の 2 つ組で連続して
いる領域を表示しているわけです。つまり、全く違うもの
を表示しているわけですから、
なお、unsigned long の 2つ組 の領域は、IDが 0 と
なったところで終わります。従って、
while(*ep){
printf("ep = %ld\n",*ep);
ep+=1;
i++;
}
このループは誤りです。これだとIDではなく、値の
方が 0 になったところで、終わりだと誤認してしまう
可能性があります。正しくは、
while (*ep){
printf("ep = %ld, %ld\n", *ep, ep[1]);
ep += 2;
}
のようにする必要があるでしょう。
(i++ は無意味なので除きました。)
このあたりについては Linux というよりは、C言語の勉強が
必要ではないかと思います。
> 最近の Linux は、変数 environ の指す環境変数の領域の直後に、
> 各種のパラメータを渡すための領域があり、そこに各種の情報が
> (情報のID, 情報の値) というペアで入っています。
> このなかで、情報のID==17 に対応する部分にある
> 値が、HZ です。
ご説明ありがとうございました。
まだ,理解できていないので質問させてください。
変数 environ を使用して環境変数を表示するプログラムを作成し,
実行すると環境変数が文字列で表示されます。
extern char **environ ;
main( int argc, char *argv[], char *envp[] )
{
int i ;
printf("envp == 0x%x\n",envp );
printf("environ == 0x%x\n",environ );
for( i=0 ; environ[i] ; i++ )
printf("environ[%d]==0x%x, \"%s\"\n",i,environ[i],environ[i] );
}
実行結果:
envp == 0xbfffe47c
environ == 0xbfffe47c
environ[0]==0xbffffbfc, "USER=XXXXXXXX"
environ[1]==0xbffffc06, "LOGNAME=XXXXXXX"
environ[2]==0xbffffc13, "HOME=XXXXXXXX"
:
:
:
省略
しかし,変数 environ をunsigned long型にcastして使用すると,番号が
表示されますが,この「番号」と先の文字列とはどのような関連が
あるのでしょうか?
#include<stdio.h>
#include <unistd.h>
extern char **environ;
int main( int argc, char *argv[], char *envp[] )
{
int i=0;
unsigned long *ep = (unsigned long *)environ;
while(*ep++);
printf("envp == 0x%x\n",envp );
printf("environ == 0x%x\n",environ );
while(*ep){
printf("ep = %ld\n",*ep);
ep+=1;
i++;
}
exit(0);
}
実行結果:
envp == 0xbffff44c
environ == 0xbffff44c
ep = 16
ep = -1075054081
ep = 6
ep = 4096
ep = 17
ep = 100
ep = 3
ep = 134512692
ep = 4
ep = 32
ep = 5
ep = 6
ep = 7
ep = 1073741824
ep = 8
よろしくお願い致します。
なるほど・・、ありがとうございます、分かりました。
>#define NULL ((void*)0) と定義されてるとします。
>もしプログラムのなかにNULLが現れたら(ヌルポインターが必要な場所に)
>NULL→マクロで((void*)0)に変換→コンパイラがヌルポインターに変換
>ってことでいいんですかね?
NULL→マクロで((void*)0)に変換
→コンパイラが、この中の「0」をヌルポインターに変換
です。
>なにが聞きたいか率直にいいますと「((void*)0)自体がヌルポインターじゃないんです
>か?だから「→コンパイラがヌルポインターに変換」はいらないんじゃないかと・・・」
>っていうことを聞いてるわけです。
私がポインタ完全制覇で書いているのも、C-FAQに書いてあるのも、
「コンパイラは、文脈に応じて、定数0をヌルポインタに変換する」
ということです。
普通、「0」と書けばその型はintですが、ポインタとして扱われるべき
文脈では、ヌルポインタに変換されます。
char *a = 5;
では警告が出るくせに
char *a = 0;
なら警告が出ないのはそのためです。
ただし、たとえばvoid func(char *p)という関数にヌルポインタを渡そうとして
「func(0)」と書くと、もしプロトタイプ宣言が無ければ、正しくヌルポインタが
渡らない可能性があります。
NULLを「((void*)0)」に#defineしている処理系というのは、こういう
問題を避けるため、「ポインタとして扱われるべき文脈」を強制的に
作り出しているわけです。
その意味では、「((void*)0)」というひとかたまりで考えれば、
これをヌルポインタだと考えても差し支えはないでしょう。
誤解をしていると思います。
ループ内で *ep と *environ を並べて表示してますが、
この両者には全く関連がありません。
最近の Linux は、変数 environ の指す環境変数の領域の直後に、
各種のパラメータを渡すための領域があり、そこに各種の情報が
(情報のID, 情報の値) というペアで入っています。
このなかで、情報のID==17 に対応する部分にある
値が、HZ です。
従って、
> ・なぜ,AT_CLKTCKの初期値を17としているでしょうか?
ID==17のところにHZが入っているというのが仕様だから
> ・environの値が17になったとき,次のポインタを返却して終了していますが,
> なぜなのでしょうか?(仕様?)
この手続きは、ID==17に対応する値を探してそれを返しているわけです。
つまり仕様。
> ・ep=17となるときは,環境変数MAILが対応していますが,2つの値は関連が
> あるのでしょうか?それともそもそもの考え方がおかしい?
対応していないし、関連はない
というのが答となるでしょう。
> > 実行ファイル名: readlink(2) システムコールで "/proc/プロセスID/exe" を読む
> > "/proc/プロセスID/exe" だけは、Linux 固有です。
>
> tcshを表示したい場合,psコマンドをたたくと
> % ps -efa | grep tcsh
> XXXXX 9789 9788 0 09:58 pts/0 00:00:00 -tcsh
>
> のようになりますが,readlink(2) システムコールで"/proc/プロセスID/exe"
> を読み込むと,プログラム実行結果が絶対パスで表示されてしまいます。
>
> ex.) exe -> /usr/local/pkg/tcsh/6.12.00/bin/tcsh の場合
> % ./a.out
> UID PID ELAPSED TIME COMMAND
> XXX XXXX 2:58:32 0:00 /usr/local/pkg/tcsh/6.12.00/bin/tcsh
>
> COMMANDの部分を「-tcsh」と表示するには,readlinkではだめなようです。
> どこからファイル名を取得すればよろしいでしょうか?
/proc/プロセスID/cmdlineから取得することでできました。
お手数おかけしました。
> 実行ファイル名: readlink(2) システムコールで "/proc/プロセスID/exe" を読む
> "/proc/プロセスID/exe" だけは、Linux 固有です。
tcshを表示したい場合,psコマンドをたたくと
% ps -efa | grep tcsh
XXXXX 9789 9788 0 09:58 pts/0 00:00:00 -tcsh
のようになりますが,readlink(2) システムコールで"/proc/プロセスID/exe"
を読み込むと,プログラム実行結果が絶対パスで表示されてしまいます。
ex.) exe -> /usr/local/pkg/tcsh/6.12.00/bin/tcsh の場合
% ./a.out
UID PID ELAPSED TIME COMMAND
XXX XXXX 2:58:32 0:00 /usr/local/pkg/tcsh/6.12.00/bin/tcsh
COMMANDの部分を「-tcsh」と表示するには,readlinkではだめなようです。
どこからファイル名を取得すればよろしいでしょうか?
よろしくお願い致します。
> う、すいません。最新のソースだと proc/sysinfo.c の init_libproc()
> を見るのが良いようです。HZ で grep すると、すぐ見つかります。
> 3.1.11 を見ると、sysconf(_SC_CLK_TCK) を使うのも、もはや古い方法で
> 良くないみたいですね。
> find_elf_note() で Hertz を得るのが正しいようです。
>
procpsのソースを参考とし,下記のようなソースを作成したら
Hertzの取得はできましたが,いまいち中身がよくわかっていません。
#include<stdio.h>
#include <unistd.h>
extern char **environ;
unsigned long long Hertz;
#ifndef AT_CLKTCK
#define AT_CLKTCK 17 /* frequency of times() */
#endif
#define NOTE_NOT_FOUND 42
//extern char** environ;
/* for ELF executables, notes are pushed before environment and args */
static unsigned long find_elf_note(unsigned long findme){
unsigned long *ep = (unsigned long *)environ;
while(*ep++);
while(*ep){
printf("ep = %ld string = %s\n",*ep,*environ);
if(ep[0]==findme) return ep[1];
ep+=2;
environ+=2;
}
return NOTE_NOT_FOUND;
}
int main()
{
Hertz = find_elf_note(AT_CLKTCK);
printf("Hertz = %ld\n",Hertz);
exit(0);
}
実行結果:
% ./a.out
ep = 16 string = USER=XXXXX
ep = 6 string = HOME=XXXXX
ep = 17 string = MAIL=XXXXX
Hertz = 100
ユーザ環境を表示する変数environを使用して取得できるのですが,
・なぜ,AT_CLKTCKの初期値を17としているでしょうか?
・environの値が17になったとき,次のポインタを返却して終了していますが,
なぜなのでしょうか?(仕様?)
・ep=17となるときは,環境変数MAILが対応していますが,2つの値は関連が
あるのでしょうか?それともそもそもの考え方がおかしい?
よろしくお願い致します。
あけましておめでとうございます。
こちらこそよろしくお願いいたします。
年跨ぎスレになってしまいました。
> 最近でもないですが、COMの使い方についてかつて調べたとき
> 結構苦労しました。MFCあたりも結局MSDNを引くことになっちゃって、
> 「導入用の教科書」ってあんまりなかった気がします。
そう言われてみると確かにCOMの本ってほとんど見かけないですね。
MFCもスケルトンをちょっと弄って終わりですし。
# 残念ながら私はどっちもやったことがないのですけど(^^;
> Oracleはマニュアル自体高くて分厚かったような。
あ、あの白いマニュアルですね。
会社は1セットしかないとこが多くて、
業務と方式で取り合いになるから棚に陳列されているだけ、
なんてプロジェクトも結構ありますね。
今はPDFのものがあるから便利ですけど。
追記 http://www.catnet.ne.jp/kouno/c_faq/c5.html#0この辺読んだんですがどうも
分からないので。
>> たとえばword_manage.hで、先頭の#ifndefが#ifdefになっていて、
すいません、モロこれでした。お騒がせしました。
あと些細なことかもしれませんがちょっと気になったので。
ヌルポインターのことです。
#define NULL ((void*)0) と定義されてるとします。
もしプログラムのなかにNULLが現れたら(ヌルポインターが必要な場所に)
NULL→マクロで((void*)0)に変換→コンパイラがヌルポインターに変換
ってことでいいんですかね?
なにが聞きたいか率直にいいますと「((void*)0)自体がヌルポインターじゃないんです
か?だから「→コンパイラがヌルポインターに変換」はいらないんじゃないかと・・・」
っていうことを聞いてるわけです。
お願いします。
> でも、
> 「未定義のシンボル NULL」
> というエラーがでるんですが・・・。
うーん。でも、間接的にstdio.hを#includeしているはずだ、ということは
納得されますよね?
ソースは、ダウンロードではなく、手で打ち込んでますか?
だとすると入力ミスかも。
たとえばword_manage.hで、先頭の#ifndefが#ifdefになっていて、
word_manage.hがまるごと効いていないとか。
でも、
「未定義のシンボル NULL」
というエラーがでるんですが・・・。
> P261のlist5-10、<stdio.h>いりますよね。
List5-10ではword_manage_p.h(List5-9)を#includeしており、
word_manage_p.hはword_manage.h(List5-2)を#includeしています。
そしてそのword_manage.hでstdio.hを#includeしていますから、
List5-10でことさらに#includeする必要はないはずです(しても
よいですが)。
あとは作法の問題で、「そのヘッダファイル/ソースファイルで必要とされる
型やマクロを宣言しているヘッダファイルは、必ずそこで#includeしておけ」
という流儀の人もいるかもしれませんが、コンパイラに怒ってもらえない
ような作法はきっと守れないので、あまり意味がないのでは、と私は思います。
> そもそも、uptime や start を、char 型の変数に保持
> してるってことがなんか変ですね。Linux 上で char 型
> を使った場合、-128〜127の値しか保持できませんから
> uptime や start を保持するには不十分です。
>
> /proc/$PID/status の該当行を一度 char 型の配列に
> 取得したあと、sscanf() 等を使って long 型の数値に
> 変換する必要があるのでは?
>
uptime,startをchar型の配列に取得後,関数atolを使用して,
long型に変換することにより,上手く処理できました。
ありがとうございました。
P261のlist5-10、<stdio.h>いりますよね。
すいません、ちゃんと警告でました。僕の勘違いだったみたいです。
開発環境にDeveloper使ってるですが、どうもデフォルトで「警告表示なし」になってた
みたいです、「あり」にしたら普通にでました。
ありがとうございました。