トップページ⇒tech
985コメント296KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001凡才ハカーNGNG
おれは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言語なら、オレに聞け! <7>
http://pc.2ch.net/test/read.cgi/tech/1003418249/l50
0153デフォルトの名無しさんNGNG
うo(^。^o) ん(o^-^)o こo(^O^o)♪
0154デフォルトの名無しさんNGNG
>>148
>C++のライブラリはスレッドの事は関知してないんでそ?

Cのライブラリの間違い? というかCのライブラリですらWindows
なんかではスレッドセーフになっている場合がある。
Javaなんぞと違ってC/C++はスレッドについては実装によって異なるだけ
0155デフォルトの名無しさんNGNG
>>152
http://pc.2ch.net/test/read.cgi/tech/1003674814/
0156デフォルトの名無しさんNGNG
>>148
> C++のライブラリはスレッドの事は関知してないんでそ?
ANSI C++ にはスレッドに関する規定がない、というのが正しいかな。

最近の処理系だと、ライブラリ側でスレッドセーフな関数を一部提供しているのが普通。今時の
ライブラリだと、operator new あたりはふつースレッドセーフ。
0157デフォルトの名無しさんNGNG
#include<stdio.h>
#include<stdlib.h>

int shortest(int, int) ;

int main(void)
{
int m, n, x ;

printf("Input m:") ;
scanf("%d",&m) ;

printf("Input n:") ;
scanf("%d",&n) ;

if( m<0 || n<0)
{
printf("error! m or n is less than 0.\n") ;
exit(1) ;
}

x = shortest(m, n) ;

printf("The number of shortest paths from (0, 0) to (%d, %d) = %d\n",m,n,x) ;
}


int shortest(int m, int n)
{
int s ;

printf("called ===> number of shortest paths(%d, %d)\n",m,n) ;

if(m==0 || n==0)
{
printf("return <=== number of shortest paths(%d, %d) = 1\n",m,n) ;
return 1 ;
}
else if(m>=0 && n>=0)
{
s = shortest(m-1,n) + shortest(m,n-1) ;
}

printf("return <=== number of shortest paths(%d, %d) = %d\n",m,n,s) ;
return s ;

}

あえて再帰処理で作りました。
0158デフォルトの名無しさんNGNG
任意の待ち時間をつくりたのですが?
0159デフォルトの名無しさんNGNG
希望の時間が過ぎるまで clock で計測しながらループ待ち
0160デフォルトの名無しさんNGNG
>>159
お前みたいな奴がいるから困るんだ (涙
0161デフォルトの名無しさんNGNG
>>160
組み込みなら許すかも。

>>158
環境依存だから、環境を書くように。Win32 なら Sleep(), UNIX なら sleep(), usleep() あたりか。
0162159NGNG
>>160
あはは (^▽^;
ひとつの案として言ってみただけです。
自分がプログラム作るときはちゃんと Sleep とか使いますから、ご安心召されよ〜。
0163デフォルトの名無しさんNGNG
>>162
ネタとしても面白くないな。逝って良し。
0164デフォルトの名無しさんNGNG
ntpで時間が戻って亜ボーン
って、大した誤差はでないだろうな藁
0165デフォルトの名無しさんNGNG
closedir()に失敗して強制終了
closedir()をコメントアウトすると、無事に?終了します
0166デフォルトの名無しさんNGNG
それは良かったね
0167デフォルトの名無しさんNGNG
今日からC言語を始めてみようと思って、
LSIC86をダウンロードしたのはいいのですが、
テストのためにマニュアルにのっている
hello.c というプログラムをコンパイルしようとしたところ

hello.c 1: can't open: stdio.h: No such file or directory

とエラーが出てしまいます…。
マニュアルで綴りや設定の仕方など見直したのですがわかりません。
すごく初歩的な質問で申し訳ないのですが、
どなたかよろしくお願いします…。
0168デフォルトの名無しさんNGNG
>>167
INCLUDE環境変数をちゃんと設定した?
確か必要だったような気がする
0169デフォルトの名無しさんNGNG
>>167
ここがLSIC86の初期設定を解説しているから読んでみそ。
http://www.sting.co.jp/mag/comp.htm
0170デフォルトの名無しさんNGNG
>>167です。

>>168-169さん、ありがとうございます。
INCLUDE環境変数というものが何かよくわかっていないのですが
>>169さんの紹介してくださったページ通りに設定はしてみました。
やはり同じエラーが出てしまいました…。

関係ないかもしれませんが、Win98SEを使っています。
Win95/98対応と書いてあったのですが、
SEには対応していないのでしょうか…?
0171あきじん ◆jx8Uh8fk NGNG
何故今頃LSIC-86なのか…。確かANSI-C準拠じゃないよね?

↓これとか使った方がいいよ。
http://www.borland.co.jp/cppbuilder/freecompiler/index.html
0172横やりNGNG
>>170
>169のページ見たけど

> -XC:\LSIC86\BIN -LC:\LSIC86\LIB -IC:\LSIC86\INCLUDE -T -O
となります。

のあたりだろ
0173デフォルトの名無しさんNGNG
>>170
Win98SEでも動作するよ。現にオレのWin98SEマシンでも動いた。
多分、ファイル_LCCの記述にタイプミスがあるんじゃないかな?
もう一度よく見直してみてくれ。

INCLUDE環境変数はCコンパイラがインクルードファイルを見つける
ときのパスを記述したもの。入門書を読めば大抵は前半部で
解説があると思う。


で、171氏が指摘しているようにLSIC86でなければいけない
特別な理由でもない限り、Borland C++を使った方がいいと
思うぞ。
0174デフォルトの名無しさんNGNG
>>167です。

>>171さんのところのをよく読んでみているところですが、
>>172
> -XC:\LSIC86\BIN -LC:\LSIC86\LIB -IC:\LSIC86\INCLUDE -T -O
はちゃんと直したんですよ…。
うーん。

設定するときにC:\CONFIG.SYSとC:\AUTOEXEC.BATを
書き変えたのですが、元々文字が書いてあったのでそれに書き足しました。
マニュアルには「…と書いてください」とあったのですが
元々C:\CONFIG.SYSとC:\AUTOEXEC.BATは空ファイルなのでしょうか??
0175167NGNG
>>173さん ありがとうございます。
もう一度_lccを見直してみることにします。
でも、別に特別な理由があるわけではなくて
LSIC86を最初に見つけたというだけなので
>>171さんのところのコンパイラをダウンロードしてみます。

どうもありがとうございました!
0176あきじん ◆jx8Uh8fk NGNG
AUTOEXEC.BATが空なのは問題無いはず。
それよりもAUTOEXEC.BAT変更したら
再起動しなきゃ駄目だよ。SHIFT+再起動でも駄目。

じゃ頑張ってね。
0177デフォルトの名無しさんNGNG
すんごいレベルの低いこと聞きます

register char *p;
として、このpは内容が0xffであるようなメモリのアドレスを格納したとします。
そして
if(*p == 0xff){
}
とこれを判定しようとしました。これって真にならないんですか?
0178デフォルトの名無しさんNGNG
>>177
if(p == (char*)0xff)
これだったら真になるよ。
0179デフォルトの名無しさんNGNG
あ、メモリの内容が0xffなんです。そのアドレスは0xffではないです。
デバッグ中に変数の値見ても*p=0x000000ffって表示されます。(VC++)
0180178NGNG
すまん。勘違いだ。178は取り消し。
0181デフォルトの名無しさんNGNG
>>179
符号拡張で、*p == -1 になってるんじゃない?
0182デフォルトの名無しさんNGNG

>>181
あ、きっとそれです!
0xffとではなく(char)0xffと比較しないとダメなんですね?(^^;
どうも有り難うございました。
0183デフォルトの名無しさんNGNG
>>179
if (*p == (unsigned char)0xff)
こうすればどうよ?
0184あきじん ◆jx8Uh8fk NGNG
>182
コンパイルの時にwarning出なかった?
いっぱい出るからって無視しちゃ駄目だよ(w
0185デフォルトの名無しさんNGNG
>>183
有り難うございます。今試したところ
if(*p == (char)0xff)が正解でした。
pがchar*なのでこれにあわせてcharでないとダメと言うことでしょう。

>>184
いっぱいでるから無視してました(w
たぶんでてるかも。
0186183NGNG
char型変数との比較なのに符合無しにキャストしてしまうとは
激迂闊なオレ。回線切って、アキバに新設された公開首吊り場
に逝ってきます。
海よりも深く反省し、心から謝罪と賠償を(以下略)
0187一部ですがNGNG
質問です。
コンパイルできないです。
スマソ
char *txt = "今日は大変良い天気です。1012abアイウaiu012";
char *p = txt;

if (isalpha(p)!=0) printf("%c===>半角英字\n",p);
else if (isdigit(p)!=0) printf("%d===>半角数字\n",p);
else if (IsKigouS(p)!=0) printf("%c===>半角記号\n",p);

alphabet.cpp(98) : error C2664: 'isalpha' : 1 番目の引数を 'char *' から 'int' に変換できません。 (新しい機能 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
0188デフォルトの名無しさんNGNG
>>187
こう直してみてください。
isalpha(p) -> isalpha(*p)
0189デフォルトの名無しさんNGNG
>>187
何がしたいの?文字列の一番目の文字を判定したいのか?
文字と文字列の違いは分かってる?
0190187NGNG
>>188-189
とりあえずコンパイルはできました。
ありがとう。
0191デフォルトの名無しさんNGNG
マルチスレッドなプログラムでグローバル変数を読み書きしたいのですが、
どうやって排他処理をすればよろしいのでありましょうか?
0192デフォルトの名無しさんNGNG
>>191
セマフォ、クリティカルセクションなど。
0193191NGNG
初耳の言葉だ・・・
調べてまいります。ありがとう。
0194191NGNG
どうも調べ方が悪かっただけらしい。ありがと。
http://www.remus.dti.ne.jp/%7Etom3/multi_thread_basic.html
http://www.hlla.is.tsukuba.ac.jp/%7Eyas/coins/dsys-1998/1999-01-26/pthread-sync.html
http://www.ncad.co.jp/%7Ekomata/c-kouza17.htm
0195デフォルトの名無しさんNGNG
いまどきCをはじめるのはやめたほうがいいぞ
0196デフォルトの名無しさんNGNG
Rubyが入門には最適。
Rubyだけで十分。
0197デフォルトの名無しさんNGNG
Javaでもいいけどな。
0198 ◆RubyOmS2 NGNG
>>196
RubyのライブラリをCで書く為にCを勉強し始めている俺は、
Ruby厨としては、失格なのか?
0199デフォルトの名無しさん NGNG
軽い気持ちでcrypt使ったら
undefined reference to `crypt' って (−_−)
プロの皆さんは何を使ってますか、高い強度は必要ではないです
>>195
自分はタコだけど、メモリにグッっと近づいた感じは触ってて気持ち良いよ
生産性を論じてるならアレだけど
VB、Java、Perl辺りをやっていた
0200199 NGNG
すまそん、事故怪傑しました
UltraFastって言うのを頂きました (^^v
0201デフォルトの名無しさんNGNG
CGIやりたいって言ったら
Perlの入門書を薦められ、
その前にCを触っておくべきだと
言われたのですが
どうでしょう?
0202デフォルトの名無しさんNGNG
目的がCGIなら、いきなりPerlでもよかろ。
0203デフォルトの名無しさんNGNG
>>199
C言語の存在ってPascalに近づいてきたかもね、
つまり、教育用言語。
0204 NGNG
>>199

Windowsで実行してない?UNIX系じゃないと実装されてないよ。
0205デフォルトの名無しさんNGNG
C言語でCGIを作っていますが、何か?
というか、Perlがよく分からないのでCです。はい。
0206デフォルトの名無しさんNGNG
#define A "\0\0\0\0"

fn(char* a){

}

int main(){
 fn(A);
}

とした時
fn の a 指す値は
*a 〜 *(a+4) は全部 \0 になるの?
0207デフォルトの名無しさんNGNG
>>206
なる、と思う・・・
0208デフォルトの名無しさんNGNG
全部\0になるよ。

main内に
fn("\0\0\0\0");
と書いたのと同じだもん。
0209 NGNG
>>205

文字列操作とか大変じゃないですか?
フォームから送られてくるデータの項目ごとの分割とか。
(Perlではハッシュでかんたん。)
何か美しい解決法があれば聞きたいです。
0210login:PenguinNGNG
C言語の"C"の由来ってなんなんだろ?
0211デフォルトの名無しさんNGNG
>>209
そういうのは全部ライブラリでなんとかしたり、
データベースに突っ込んでなんとかしたりするから平気です。
0212デフォルトの名無しさんNGNG
"B"の次だから "C"

K&R読んだことないの?
0213 NGNG
>>210

Bの次。が有力。
0214デフォルトの名無しさんNGNG
>208
ありがと
じゃあ、文字列の最後を \0 2個にしたいときは
#define A "abcde\0"
ってすればいいですよね
0215デフォルトの名無しさんNGNG
すればいいですよ
0216デフォルトの名無しさんNGNG
>>210
BCPLの頭文字とったのがB言語で、
ダブルにその次ってことでCらしい。よくわからんけど。
次はPか。ピー言語。なんか嫌っ('Д`;)
0217デフォルトの名無しさんNGNG
>215
ありがとございました
0218 fNGNG
http://cm.bell-labs.com/cm/cs/who/dmr/bintro.html

興味があったのでB言語について。
文法的にはほぼCですな。
BとCって何が違うんですか?
ポインタがないとか?
0219デフォルトの名無しさんNGNG
>>218
ざっと読んでみた。
ポインタはあるみたい。というか、型は整数しかなくて、キャストしなくても
* 付ければポインタとして扱われているように見える。
0220デフォルトの名無しさんNGNG
char *ExtractFileNameM(const char *FullPath)
{
char *szFindPoint;
char *szFileName;

if(strlen(FullPath)>MAX_PATH)
return NULL;

else
{
szFindPoint=strchr(FullPath,'\');

while(szFindPoint){
szFileName=szFindPoint;
szFindPoint=strchr(szFindPoint,'\');
}
}
if(!szFileName)return FullPath;
else
return szFileName;

}
こいつを実装とやらをしたいんだけどスタックとかから教えてください
0221デフォルトの名無しさんNGNG
>>220
まずは日本語を勉強しましょう。「実装とやら」と言われても、何のことやら分かりません。
0222デフォルトの名無しさんNGNG
え?汎用関数つくることを実装というのではないのかや?
0223デフォルトの名無しさんNGNG
>>222
意味不明。
0224デフォルトの名無しさんNGNG
これじゃSJIS扱えないよ
0225デフォルトの名無しさんNGNG
if(mblen(szFindPoint-1,2)!=2)
szFileName=szFindPoint;
このようにさっき変えた。

そろそろスタックとかやりたいYO
0226デフォルトの名無しさんNGNG
\\も直したから安心してョ
0227デフォルトの名無しさんNGNG
こりゃまたすごい意味不明。
>>220さんはスタックってなにか知ってるのかな?
0228デフォルトの名無しさんNGNG
めもり確保して
めもりに一個ずついれてくんだろ?
0229デフォルトの名無しさんNGNG
ちなみにstackは積むとかそーゆー意味だと思うんだけどョ
0230 NGNG
>>220
スタック、リスト、キュー、どれもメモリー確保して格納する作業ですが?
出直しておいで。
0231デフォルトの名無しさんNGNG
なぜ「実装とやら」をしたいのだ?
セインセイにいいつけられた?
0232デフォルトの名無しさんNGNG
さっきのマイプログラム、配列つくって
whileつかって、ひとつひとつ
if(FullPath[i]='\\'&&mblen(FullPath[i-1],2)!=2)
とかやったほうがいいとおもう?
0233デフォルトの名無しさんNGNG
いや、はじめてライブラリに挑戦する僕チンなんだ
(スタティック)どーせならひたすら低級路線
で行こうとおもっただけアル
0234デフォルトの名無しさんNGNG
要するに、
C言語の「標準ライブラリ」を極力使わずに、自作ライブラリを作りたい
ということだろ。
で、手始めにpath nameの分解をしたいと。
大方、mainのargvでわたされたファイルパス名を分解しようという動機だろう。

とりあえず、strlen使ってたら、<string.h>必要になるから、
そこも自作しなさい。
あとmblen() なんてだれもしらん。
0235デフォルトの名無しさんNGNG
>>234
strchr()もだめだね。
0236デフォルトの名無しさんNGNG
クララが・・クララが・・・

でさぁ、どっかのHPにstrchrの定義が
あって、char *strchr( ,int)だったんだけど
あれって実体を返すうーーー、いいのだ。
VCLにはExtractFileNameがあるけど、あれは実体を
返すの?それともポインタかなぁ。もうっかい見てみるからナ!
0237いかりや長介NGNG
だめだこりゃ。
0238デフォルトの名無しさんNGNG
mallocで64バイトとったらヌル文字は65バイト目ですか?
それとも64バイト目をヌル文字って考えながらプログラム
することがプログラマの使命なのですか?
0239デフォルトの名無しさんNGNG
>>238
掟です。
0240デフォルトの名無しさん NGNG
しょっちゅうアクセス違反してるお馬鹿な私は
char *ptr;
/* 処理 */
if(hoge != NULL && strlen(hoge))
と書いていますが、これは正しいでしょうか。もしNULLならstrlenは
判定されませんか。(僕の環境では大丈夫です)
また、時々重複freeしちゃうダメっぷりなので
if(hoge){
 free(hoge);
 hoge = NULL;
}
こんな感じであっちこっちに散りばめてるのですが、これはドキュソですか
変な事聞いてごめんなさい、、、、
0241スシばっか食ってるNewBeeNGNG
Bの次って
0242デフォルトの名無しさんNGNG
>>240
&&の処理順序は保証されているし、そのような書き方はよく見かける
後者のfreeについてはそういうマクロなり関数なりを用意しとけ
0243デフォルトの名無しさんNGNG
>>240

free() のことなんだけど、>>242 さんみたいにマクロ定義するのが一般的です

#define free_safety(v) if(v){ free(v); v=NULL; }

ただし注意して扱わないといけないんだけど、
こうやってるとハマるんだよなー。。。
  char *ptr = some_ptr;
  /* some long long loooong proc. */
  free_safety(ptr);
ptr には NULL が代入されるけど some_ptr には NULL が代入されないんで、
そこからどんなバグが生成されるやら(笑い
0244デフォルトの名無しさんNGNG
>>240
二重 free() するのは厳禁だが、条件反射的に

if (hoge) {
 free(hoge);
 hoge = NULL;
}

と書くと、今度は free したポインタを参照するバグに出くわすと思うぞ。これは検出しづらいから、
ムチャクチャにタチが悪いバグになる。

どこで、いつ malloc() して、どこで、いつ free() するのかを良く考えてプログラミングするのが先。
その上で防衛的に NULL 代入するようにするのはアリだと思う。(俺はやらないけど)
0245デフォルトの名無しさんNGNG
240です、ありがとうですぅ
安心しましたです、出来る方の言葉を聞きたくて(^-^*
でももっと本を読まないと
何故かCよりgdbばっかり触ってるような(鬱
早速マクロにしますです
0246デフォルトの名無しさんNGNG
>>244さん
なるほど!、次にはまるのはそれの様な気がします(^-^; コワ
やっぱり人間GCよろしく適当に散りばめるのはヤバイんですね
構造がつかめて無いのは仰るとおりです。
0247デフォルトの名無しさんNGNG
>>246
真面目な話、GC 使うという選択肢はアリだよ。

http://www.hpl.hp.com/personal/Hans_Boehm/gc/
0248デフォルトの名無しさん NGNG
getsの時に漢字で入力してprintfの時にひらがなで出力するには
どうすればいいの?誰かおしえて。
0249デフォルトの名無しさんNGNG
漢字をひらがなに変換するプログラムを組んで、それでひらがなになおしなさい。
0250デフォルトの名無しさんNGNG
ほんとにあったら欲しいな
出来たら英語に翻訳してくれると尚良し
0251デフォルトの名無しさんNGNG
>249
その変換するプログラムをおしえて欲しいのよ。
0252デフォルトの名無しさんNGNG
とりあえず、機械翻訳とデータベースについて勉強してからもう一度来なさい。
■ このスレッドは過去ログ倉庫に格納されています