トップページ⇒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
0655デフォルトの名無しさんNGNG
voidタン・・・ハァハァ
0656Kusakabe YouichiNGNG
In article >>654, デフォルトの名無しさん/654 wrote:

> どうせKusakabeが変なソフト使ってるんでしょ。

私のは問題ないですね。
0657デフォルトの名無しさんNGNG
>>656
JIS X 0201仮名が化けたり、JIS X 0208の英数字をISO 8859-1に変換したり
するのは、少なくとも2chの閲覧に限っては問題あると思います。
閲覧するだけならどうでもいい話ですが、引用時にそれを行うのは著作者人格権の
同一性保持権を侵害していることになります。
0658Kusakabe YouichiNGNG
In article >>657, デフォルトの名無しさん/657 wrote:
> JIS X 0201仮名が化けたり、JIS X 0208の英数字をISO 8859-1に変換したり

はつみみです。
0659デフォルトの名無しさんNGNG
やあみんな!元気?

strcmpで文字列でなく (見た目上)文字を比較する方法を編み出したよ!
やり方は簡単さ!

int a = 'a';
int b = 'b';

if( strcmp(&a,&b) )printf("chigau\n");

ほら、これなら 文字を比較 してるように見えるだりろぉ?

あー石投げるな〜機種依存〜
0660デフォルトの名無しさんNGNG
>>619
変数名、引数名が適当すぎる。
それじゃ添削以前に、やってることが理解できないから
読む気がしない。

もっと意味のある変数名にするか、コメントで説明をつけてくれ。
変数名がちゃんとしていれば、コメントは最小限で済む。
0661デフォルトの名無しさんNGNG
つまらない。
if ( a < b ) kill(>>659);
0662Kusakabe YouichiNGNG
In article >>661, デフォルトの名無しさん/661 wrote:

> つまらない。
> if ( a < b ) kill(>>659);

2項演算子ですね。
0663デフォルトの名無しさんNGNG
下位7ビットでasciiをサブセットに持っていない文字コードは何があるの?
0664Kusakabe YouichiNGNG
In article >>663, デフォルトの名無しさん/663 wrote:

> 下位7ビットでasciiをサブセットに持っていない文字コードは何があるの?

いくらでもあるとおもうが。
0665デフォルトの名無しさんNGNG
>>661
つまらない、って一刀両断することも無いだろ。

どうして特定の環境で>>659のコードが正しく動いてしまうのか
ということを考えてみた方が面白くはないか?

少なくとも俺が昔このコードを読ん
0666デフォルトの名無しさんNGNG
>664
具体的に教えて。
そしてその文字コードを使うOSも教えろゴラア。
0667デフォルトの名無しさんNGNG
>>665
読ん?続きないの?
0668デフォルトの名無しさんNGNG
>>665
> 少なくとも俺が昔このコードを読んだときには一目で動く理由がわかったぞ
0669デフォルトの名無しさんNGNG
>>668
> 少なくとも俺が昔このコードを読んだら一目で恋に落ちたぞ
0670デフォルトの名無しさんNGNG
ゴルゴの標的にされた模様。>>665
0671デフォルトの名無しさんNGNG
過去ログdat待ちでこのスレしかみてないんですけどなかったから質問です。

RS232Cシリアルポートの送受信ってどするのでしょう?
0672デフォルトの名無しさんNGNG
osの上ならポート指定してwrite、readするだけ。
0673デフォルトの名無しさんNGNG
>>671
I/Oポートに直接ガンガン書けばいいんじゃない?
0674デフォルトの名無しさんNGNG
あと受信はタイマかスレッドで定期的にしろ。
0675デフォルトの名無しさんNGNG
>>674
割り込みつかうのは邪道?
0676デフォルトの名無しさんNGNG
使える環境ならそれを使う。
だいたいOSの上からは割り込みなんて使えんだろ。
0677デフォルトの名無しさんNGNG
>>659
リトルエンディアンでも、plain charがsigned charの処理系で
'\377'とかと比較したら面白いことになるな。
0678デフォルトの名無しさんNGNG
672〜676 レスありがと でもわからん。

えーとレスつくようなのでもう少し説明。
環境 Win98でVC

状況

ぶっちゃけて言うと手付かずです。とりあえずどっかのサンプル見て
勉強してから質問しようと思ったんですけど、それすら見つからなかった。
局地的なプログラムならちらほらあったけど、よくわかるのはなし。
で、参考文献とかでもいいので教えてもらいたい。

目的

とりあえず、受信と送信を確立したい。

たぶんオレはすごく間抜けな質問してるんだろうな・・・みなさん大目にみてください。
ちなみにCの経験は大学の授業レベルです。
(つまりポートやタイマなんて関係のないプログラムしか作ったことないんです)
0679デフォルトの名無しさんNGNG
DCB構造体で通信パラメータをセットする。
あとはファイルのリードライトと同じ要領。
ハンドシェイクやプロトコルは適当に自分で考えろ。
ってゆーかVC++関連スレのほうが良いのでは?
0680名無しNGNG
HTML(2.X、4)は、codesetとして、UNICODEが規定されている。
で、news<->2ch Converterの仕様か、iso-2022-jpの仕様かは
知らんが、UNICODE文字が、すべてはmapされない。
だから、Halfwidth Katakanaとかハングルとか、見えなくなってしまう
文字の出てくる可能性だって、あるわけ。
だれが悪いのか、って言えば‥‥‥文化摩擦としか。
#Halfwidth Katakana領域を正しく変換しないコンバータが責任かも
個人的には、UNICODE実体参照とかをどう処理するかも気になるが。
0681デフォルトの名無しさんNGNG
クソカベニ ヨメナイヨウニ ハンカクカナ デカキコモウ ... シネ クソカベ!!!
0682デフォルトの名無しさんNGNG
>>678
こんなのあったけど、どうか。
ttp://www.vector.co.jp/soft/win95/prog/se173131.html
0683681を全角に復元してみましたNGNG
>>681
> クソカベニ ヨメナイヨウニ ハンカクカナ デカキコモウ 。。。 シネ クソカベ!!!
0684デフォルトの名無しさんNGNG
0.1 を10回足したいときはどうすればいいの?
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宣言をつけてみてはどうでしょうか?
■ このスレッドは過去ログ倉庫に格納されています