トップページ⇒tech
909コメント312KB

C言語なら、俺に聞け! <9>

■ このスレッドは過去ログ倉庫に格納されています
0001C言語ハッカー Kusakabe YouichiNGNG
おれは21才、9年間プログラムを一生懸命作ってきた。
あちこちの言語に手を出したが結局極めたのはC言語だけだった。
大体のことなら分かるからオレに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

・前スレ C言語なら、オレに聞け! <8>
http://pc.2ch.net/test/read.cgi/tech/1005811510/l50
0685デフォルトの名無しさんNGNG
>>684

0.1*10;
0686デフォルトの名無しさんNGNG
>684
深入りしたくない場合、
予め計算機で計算して即値で 1 と書いておきます。
言語によっては、RationalとかRatio aとかのクラスか型が
有るので、それを使います。
0687686NGNG
スレ違いだった。Cスレだった。
0688デフォルトの名無しさんNGNG
>>685
それって数学的に正しい答えが出るって保証されてるの?
0689デフォルトの名無しさんNGNG
入門書を見ると
int main(void)
って書いてあるけど、これって正しいの?
int main()
のほうがいいんじゃないの?
0690デフォルトの名無しさんNGNG
>>689

ANSI C準拠のコンパイラならどちらでもいいと思うけど。
0691デフォルトの名無しさんNGNG
Cではmain()はmain(...)だったと思うから
main(void)の方が良いだろう。
0692デフォルトの名無しさんNGNG
>>691
あんさん、それプロトタイプ宣言の時だけですぜ。
最後にセミコロンが無いから、689は関数定義の話をしていると思われ。
0693デフォルトの名無しさんNGNG
じゃあ、プロトタイプ宣言の時は
int main(void);
で、関数の時は
int main()
でいいんですね?
0694デフォルトの名無しさんNGNG
古いコンパイラーで、
char 型の範囲が、0 〜 255
のものって生き残ってるの?
0695デフォルトの名無しさんNGNG
C++より、Cがむずかしい
0696デフォルトの名無しさんNGNG
CよりHSPがむずかしい
0697デフォルトの名無しさんNGNG
>>694
char が signed ではなく unsigned のものがあるか、って話?
0698デフォルトの名無しさんNGNG
>>697
そう。
getchar()をcharで受けてはいけない。int で受けなさい、という説明で、
現在のコンパイラーでは、charは -125〜126 だけど、古いコンパイラーでは
0 〜 255 だから、EOFで-1を返すgetchar()を受けるときは、安全性を考慮してintで宣言する、という
説明を読んで、そんな古いコンパイラーいまだに使ってるところあるのかよ。と思ったのです。
あと、ANSI的にはどっちが正しいの?
0699デフォルトの名無しさんNGNG
>>698
>ANSI的にはどっちが正しいの?

char が符号付か符号無しかは、処理系によって違う。
あたらしい、古いの問題じゃなくて。
0700デフォルトの名無しさんNGNG
>>698
getchar()で返すのはEOFと0〜UCHAR_MAXのUCHAR_MAX+1通り。
(charが8bitの場合は-1〜255の257通りね。)
signed charでもunsigned charでも足りんと思わんか?
0701デフォルトの名無しさんNGNG
>>698 VC++6 でも /J スイッチつければ char が 0〜255 だぜ
/J default char type is unsigned
ちなみに -125〜126 ってのはいったいどこから出てきた数字?
-127〜127 または -128〜127 ならわかるが。
0702デフォルトの名無しさんNGNG
>>701
> -127〜127 または -128〜127 ならわかるが。

-127〜127ってのはいったいどこから出てきた数字?
-128〜127 ならわかるが。
0703701NGNG
>>702よ、ISO標準C90 から出てきた数字だ
<limits.h> SCHAR_MIN/MAXの最小値は -127,+127 と規定されとる
世の中「2の補数系」ばかりじゃないからな
0704デフォルトの名無しさんNGNG
>>702
> -127〜127ってのはいったいどこから出てきた数字?
1 の補数表現でしょ。
0705Kusakabe YouichiNGNG
In article >>689, デフォルトの名無しさん/689 wrote:

> 入門書を見ると
> int main(void)
> って書いてあるけど、これって正しいの?

どの入門書ですか?
0706Kusakabe YouichiNGNG
In article >>698, デフォルトの名無しさん/698 wrote:

> >>697
> そう。
> getchar()をcharで受けてはいけない。int で受けなさい、という説明で、
> 現在のコンパイラーでは、charは -125〜126 だけど、古いコンパイラーでは
> 0 〜 255 だから、EOFで-1を返すgetchar()を受けるときは、安全性を考慮してintで宣言する、という
> 説明を読んで、

そりゃ説明が間違っているって。
べつにunsignedのがあるからintになっているわけじゃあない。

いったいどこにそんなウソの説明が書いてあったんだ。
0707デフォルトの名無しさんNGNG
Cで掲示板作りたいんだけど、お勧めHP無い?
0708デフォルトの名無しさんNGNG
>>707

http://www.bell-labs.com/
0709 NGNG
どっかにシグナルハンドラのサンプルソースないかな?
0710デフォルトの名無しさんNGNG
>>709
ってどんなんだ?
sigaction()の使い方、とかだったらUnix系のフリーソフトのソース
見るんじゃ駄目なのか?
0711デフォルトの名無しさんNGNG
man sigaction読んでコード書けない頭なら
プログラミング止めた方がいいよ
0712デフォルトの名無しさんNGNG
sprintfが出力する文字数を、
呼び出す前に調べる方法無いですかね?
0713Kusakabe YouichiNGNG
In article >>712, デフォルトの名無しさん/712 wrote:

> sprintfが出力する文字数を、
> 呼び出す前に調べる方法無いですかね?

sprintfをエミュレイトする関数をつくればいい:)
0714デフォルトの名無しさんNGNG
>>712
fprintf, vfprint で /dev/null (\\.\null) に書き出して、戻り値をチェック。
0715デフォルトの名無しさんNGNG
>>713
それが面倒なので…

>>714
winの場合は"\\.\null"のファイル開いてそこに書き出すってことですよね。
ありがとうございます。
0716デフォルトの名無しさんNGNG
ああ、久しぶりにヌルヌルしたい。
0717デフォルトの名無しさんNGNG
>>715
> winの場合は"\\.\null"のファイル開いてそこに書き出すってことですよね。
Yes

ただファイル名は \\.\nul が正解 (l は1つ)ね。すまん。
0718デフォルトの名無しさんNGNG
文字列がひらがなだけかどうか検索する関数って
簡単な奴ご存知でしょうか?
あとひらがなをかたかなに変換する関数とかあったら
お願いします。
0719雪江NGNG
>>718
簡単に実装するには、ひらがなデータベースをつくって
全文字比較 ・・・でしょうね。
変換もまた同じです。
文字コード関係は煩雑だから適当なライブラリを拾うといいと思いますよ

がんばって
0720デフォルトの名無しさんNGNG
>雪江さん
どうもありがとう! 頑張ります。
0721デフォルトの名無しさんNGNG
\\.\って何?
0722名無しNGNG
>>712
たしか、WTLのCString::Formatが、sprintfの文字数を
数えてたかも。
0723デフォルトの名無しさんNGNG
>>718-720の展開ってどうなんですか?
突っ込まなくてもいいのですか?
文字コードがどうのとか言わなくていいのですか?
0724さんばーNGNG
ソケットを作って、send(Socket,buf,strlen(buf),1);
でデータを送信するプログラムをC+winsockでを書いているのですが、
closesocketするか、プログラムを終了させないとデータが届きません。
おそらくどこかにバッファされてしまっているのでは、
と思っているのですが、どのようにするとすぐにsendした内容が
届くように出来るのでしょうか。
0725デフォルトの名無しさんNGNG
何で最後のflagsパラメータに1なんか指定してるんだ?
バンド外データとして送信したいのか?
winsock.h
#define MSG_OOB 0x1 /* process out-of-band data */

つーか、スレ違いだけどな。
0726さんばーNGNG
>725
すみません単に間違えました。フラグは0にしています。
perlだと $|=1;してストリームをフラッシュしますよね。
このような動作が必要なのではと思っているのですが・・・
0727デフォルトの名無しさんNGNG
puts() って数字は出力できないの?
0728味噌醤油醸造株式会社NGNG
>>727
int n = 1000000;
puts((const char*)&n);
0729デフォルトの名無しさんNGNG
>>728
おいおい、ネタか?
'\0'が見つからなくて暴走する可能性があるぞ。

>>727
> puts() って数字は出力できないの?
できん。文字列に変換しろ。

char buf[100];  // バッファサイズは適当
sprintf(buf, "%d", n);
puts(buf);
0730デフォルトの名無しさんNGNG
>>724
しばらく時間がたつと送信されると思うけど
バッファしてほしくないときはsetsockoptでTCP_NODELAYを指定する。
0731デフォルトの名無しさんNGNG
fgetsでファイルの一行を読み込み、sscanfでデータをセットする場合、
sscanf(line,"%s %s...", data1,data2,...)としたいのですが、
フォーマットの形式が極端に長い場合、これを使うと書くのに時間が
かかるのですが、これ以外の方法はないのでしょうか?
0732デフォルトの名無しさんNGNG
>>731
エディタにコピーの機能はないのでしょうか?
0733Kusakabe YouichiNGNG
In article >>731, デフォルトの名無しさん/731 wrote:
> sscanf(line,"%s %s...", data1,data2,...)としたいのですが、
> フォーマットの形式が極端に長い場合、これを使うと書くのに時間が
> かかるのですが、これ以外の方法はないのでしょうか?

そんなにかかりませんよ。

全部%sばかりで同じ繰り返しならば、
少しは速くする方法はありますが、まあそれでも3倍速くなるわけではないですが。
0734デフォルトの名無しさんNGNG
>>731
Emacs Lisp でマクロを組む。
0735まあNGNG
>>731
こんなのはどう?
0736そもさんNGNG
C言語の師と見込んで質問いたします。

マルチスレッド化するとき
スレッドセーフでないかもしれない
malloc/free(new/delete)を遣うときは
クリティカルセクションでくるむべきでしょうか?
0737デフォルトの名無しさんNGNG
じょーきょーよくわかんないけど、もう一段抽象化というか
間に1つクッションいれた設計にしたらどーかしら?

poolアロケーターとか、GCつかうこと考えてもいいんじゃない?

www.annexia.orgにある、c2libってなかなかいいよ。
0738デフォルトの名無しさんNGNG
5bit*128の配列がほしい。
どうやってつくるんだ?
0739デフォルトの名無しさんNGNG
↑もちろん、メモリ上で連続に確保だ。
0740736NGNG
>>737
ありがとうございます。
メモリ管理を集中的に行うオブジェクトを導入して
オブジェクトのミューテックスにするという理解で良いでしょうか。
なるほど・・綺麗です。

>www.annexia.orgにある、c2libってなかなかいいよ。
ありがとうございます、見てきます〜。
0741デフォルトの名無しさんNGNG
>>738
何に使うんだ?
0742デフォルトの名無しさんNGNG
スレッドセーフじゃないかもしんない環境ってもしよかったら
何なのか教えてください。

c2libはこの前つかったんですがUNIX系な環境でCでサーバー
書く目的には便利ですよ。Apacheのpoolベースの文字列、
各種コンテナ関数が独立したライブラリになったようなかんじです。
0743736NGNG
>>742
>スレッドセーフじゃないかもしんない環境って
古い libc や DOS+gcc や組み込み系のオールドな環境です
今日びスレッドセーフでない環境のほうが珍しいと思われます。(^^;
0744デフォルトの名無しさんNGNG
>>738
unsigned char array[128/8][5];
int a120 = ((array[120/8][0]>>(120%8)) << 0)
     | ((array[120/8][1]>>(120%8)) << 1)
     | ((array[120/8][2]>>(120%8)) << 2)
     | ((array[120/8][3]>>(120%8)) << 3)
     | ((array[120/8][4]>>(120%8)) << 4);
0745デフォルトの名無しさんNGNG
>>743
そうでしたか。Thanksです。気を使うことが多くて大変そうですね。
パズルといてるみたいで面白いかも?

処理効率の面で許されるならなるたけ「富豪的」にGCやプールで
ラクしたいですね。Bohem GCやc2libは使えるかどうか不明ですが、
参考にはなりそうですね。
0746736NGNG
>>745
>処理効率の面で許されるならなるたけ「富豪的」にGCやプールで
>ラクしたいですね。
はい。スレッド消滅時にはアロケートしたメモリは解決する必要が
あるのでGCに処理してもらえると楽になります。メモリ管理だけでも
(私にとって)奥深いです。
0747デフォルトの名無しさんNGNG
>>746
えっと話かわりますが、Hoardっつーのを思い出しました。
dosとか古いlibc向け用途にはダメですが、なかなか
ぐっとくる宣伝文句ですよ。

http://www.cs.utexas.edu/users/emery/hoard/
0748 NGNG
eの値を小数点以下100桁まで求めよ。
πの値を小数点以下100桁まで求めよ。
0749雪江NGNG
>>748
http://3.141592653589793238462643383279502884197169399375105820974944592.jp/
円周率です。どうぞ。
0750デフォルトの名無しさんNGNG
>>748
const char *PI =
"3.14159265358979323846264338327950288419716939937510"
"58209749445923078164062862089986280348253421170679";

int main()
{
puts(PI);
return 0;
}
0751デフォルトの名無しさんNGNG
構造体のところではまっているのですが、
グローバルで、
struct _data{
int id;
char szdata[32];
}data[16]:
とかやって、
void func1(){
........
........
strcpy(data[1].szdata,"hogehoge");
printf("%s\n",data[1].szdata);
return;
}
とやると、ここでのprintfではきちんと参照できるのですが、
別関数で、
void func2(){
printf("%s\n",data[1].szdata);return;}
とやると、data[1].szdataには何にも格納されていないのですが、
なにか根本的に間違ってますか?
0752デフォルトの名無しさんNGNG
>>751
間違ってるようにま見えません。
なにか他のことが原因になってるのでは?
0753デフォルトの名無しさんNGNG
>>752
ほかの参考書などをみるに、ほとんどが
void main()内で、
struct _data data[16]などと
やっているものが多く、グローバルなデータベースとして
扱っているものが見当たらず、できないのかとも思ってしまいました

・・・・なんででしょ(・・・少しいらいらします)
0754デフォルトの名無しさんNGNG
>>753
的外れかもしれませんがvolatile宣言をつけてみてはどうでしょうか?
0755Kusakabe YouichiNGNG
In article >>753, デフォルトの名無しさん/sage/753 wrote:

> >>752
> ほかの参考書などをみるに、ほとんどが
> void main()内で、
> struct _data data[16]などと

どんな本を読んでいるのでしょうか?
0756Kusakabe YouichiNGNG
In article >>751, デフォルトの名無しさん/751 wrote:

> 構造体のところではまっているのですが、
> グローバルで、
(中略)
> なにか根本的に間違ってますか?

(1)「グローバルで」といいつつ関数定義のスコープ内で行っている。
(2)「別関数」といいつつ実はそれはべつのコンパイル単位にある。
(3)「値が格納されていない」ってのは実はコンパイルエラーがでてる。
(4) func1を呼び出す前にfunc2を呼び出していた。
(5) 実はfunc1は呼び出されていなかった。
(6) 1のつもりでlと書いていた
...
なんてことがないことを示すために
ソースをそのまま書いた方が早いと思うが。
0757731NGNG
>>732-735
レスありがとうございます。
楽せずにコピペを繰り返すことにしました。
0758人間のくずNGNG
「西暦年と月を入力するとその月の日数が表示されるようにせよ」
という問題教えてくれませんか?
if構文の問題なんですがelse if などがよく分かりません
0759初心者NGNG
すいません本当に悩んでますC初心者です。
ファイルから文字列を読み込み表示してそれをタイプ
するんですがどうしてもgets()関数を実行してくれません。
どうしてですか?
void num(){
int n=100,i;
FILE *fp;
char honbun[10],fname[5],type_moji[10];

scanf("%s",fname);
fp1=fopen(fname,"r");
if(fp1==NULL)
exit(-1);
do{
printf("%s", fgets(honbun,n,fp1));
gets(type_moji);
}
while(!strcmp(honbun,type_moji));
fclose(fp1);
}
0760初心者NGNG
line3 のFILE *fpは*fp1です。
0761デフォルトの名無しさんNGNG
>>758
うるう年の計算方法はわかりますか?
0762デフォルトの名無しさんNGNG
>>759
>char honbun[10],fname[5],type_moji[10];
いろいろあるけど、とりあえず、こうしてください。
char honbun[1024],fname[256],type_moji[1024];
0763初心者NGNG
>>762
やっぱり出来ませんです。
0764HELP!!NGNG
http://pc.2ch.net/test/read.cgi/tech/1003838158/966-967
           ↑
          966-967
0765デフォルトの名無しさんNGNG
>>763
ファイルのオープンは成功してますか?
0766758NGNG
>761
それくらいは分かります。
月が2・4・6・9・11月でないときは31日。
月が4・6・9・11月のときは30日。
月が2のとき
 西暦が100の倍数のとき400の倍数のときはうるう年で29日
                    そうでない場合は28日
 西暦が100の倍数ではないが4の倍数のときうるう年で29日
                   そうでないときは28日
 これをどう書いたらいいのかよく分からないんです。
0767?SメNGNG
>>765
ファイルはオープンできてます。
読み込んだ文字列を表示して終ってしまいます。
0768Kusakabe YouichiNGNG
In article >>766, 758/766 wrote:
>  西暦が100の倍数のとき400の倍数のときはうるう年で29日
>                  そうでない場合は28日
>  西暦が100の倍数ではないが4の倍数のときうるう年で29日
>                  そうでないときは28日

2行めと4行めは同じ場合では?

あと「4の倍数じゃないとき」を忘れてますね。

>  これをどう書いたらいいのかよく分からないんです。

ちゃんとした入門書でも買ったらどうでしょう?
0769初心者NGNG
Kusakabe Youichi さん
<<759
お願いします。
0770デフォルトの名無しさん NGNG
>>766
もっと簡単に、
  西暦が400の倍数のとき、29日
  !(西暦が100の倍数) && (西暦が4の倍数)、29日
  その他、28日

とすれば。
0771名無しNGNG
scanfが喰わずに残した\nを、getsが喰っただけの話では?
0772デフォルトの名無しさんNGNG
>758
http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/

これでいけるかな?
ちいうか検索くらいしれ。
0773名無しNGNG
>770
  西暦が400の倍数のとき、29日
  西暦が100の倍数のとき、28日
西暦が4の倍数のとき、29日
  その他、28日
の方が素直な感じがするけどな。
0774Kusakabe YouichiNGNG
In article >>769, 初心者/769 wrote:

> Kusakabe Youichi さん
> <<759
> お願いします。

ん? それは何ですか?
0775デフォルトの名無しさん NGNG
>>773
まっ、それでもいいけど(W
0776初心者NGNG
>>771
出来ました。ありがとうございました。
>> Kusakabe Youichi
759をやってもらいたかったのです。
でも出来ました。また宜しくお願いします。
0777初心者NGNG
fgetsでとってきた文字配列には改行を読み込む
ことによって終った場合 改行文字が含まれていますよね。
それを消す方法はないんですか?
0778名無しNGNG
forで回して、\nと一致すれば、\0に置き換えればいいかと。
0779デフォルトの名無しさんNGNG
ファイルオープンをエラーしたときにexit関数を使いたいのですが、
これはstdio.hには入っていない関数なんですか?
そんなもの定義されていないってエラーくらいました…。

どの本見ても他のヘッダファイルをインクルードしていないのに
この関数が当たり前のように使われているんですが。(カニチャーハンですら)

なにか私の知らないインクルード技術を使っているっていうことなんでしょうか?
0780名無しNGNG
そーゆーときは、manするとか、includeファイルのある場所でgrepしてみしょうね。
0781Kusakabe YouichiNGNG
In article >>776, 初心者/776 wrote:
> 出来ました。ありがとうございました。
> >> Kusakabe Youichi
> 759をやってもらいたかったのです。

なんだろう?
0782初心者NGNG
>>778 助かりました。そうですね。
0783Kusakabe YouichiNGNG
In article >>777, 初心者/777 wrote:

> fgetsでとってきた文字配列には改行を読み込む
> ことによって終った場合 改行文字が含まれていますよね。
> それを消す方法はないんですか?

Do you have a rubber? (英)
Do you have an eraser? (米)

172ペイジに書いてありますよ > それを消す方法は
0784仕様書無しさんNGNG
>>782
読み捨ててもいいしね。
■ このスレッドは過去ログ倉庫に格納されています