トップページ⇒tech
1001コメント297KB

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

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001sageジョブス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言語なら、オレに聞け! <6>
http://piza2.2ch.net/test/read.cgi/tech/999617524/
0809デフォルトの名無しさんNGNG
Callback関数ってなんですか?
あとcallback関数をメンバ関数として作りたいのですが
可能ですか?
0810   NGNG
>>807
せめて何行目でエラーがでるのかぐらい書け!!
だいたい clコマンド直接使ってる奴なんてお前ぐらいだぞ。
VisualStudioからプロジェクト作ってコンパイルしろよ!
0811807NGNG
>>808
今自宅からなので周りに友達が居ません。

>>810
エラーは全く出ません。
コンパイルはちゃんと通ります。
でも、実行すると構文エラーと出てしまいます。
VC++でプロジェクト作って実行すると問題なく通ります。
gccは実行できる環境が現在無いために不明。
0812デフォルトの名無しさんNGNG
>>807
> printf("足し算1〜5、引き算6以上\n");
って書いてあるけど、このソースだと5を入力すると引き算になっちゃうよ。

重箱の隅につきsage
0813デフォルトの名無しさんNGNG
>>811
VCなら返り血を明示的に書かなければ勝手にintになるので
多分間違っているだろうが、main()の前にintかvoidと書いてみたらどうだ。
0814807NGNG
ご親切に説明を下さった方々ありがとうございます。
どう考えても私にはわかりませんので、
学校にいって教授に聞いてみます。
お騒がせしました。
0815  NGNG
>>811
それでだめならフリーのコンパイラ使え。LSIC86とかな。
LSIC86はただのCだから変数宣言を最初になおせよ。
C++使いたいならbolandのやつ使え。
0816デフォルトの名無しさんNGNG
>>801
> SVGAのBIOSを呼び出したいというだけです。
PC-UnixでSVGA BIOSなんて動かんよ。
SVGAlibでも使え。
0817デフォルトの名無しさんNGNG
>>809
その質問の答えは、何のためにcallback関数を作りたいのか
を聞いてからだなー。
なにすんの?
0818デフォルトの名無しさんNGNG
>>811
実行時に構文エラーって良く分からんな。
0819デフォルトの名無しさんNGNG
>>811
> コンパイルはちゃんと通ります。
> でも、実行すると構文エラーと出てしまいます。
エラーメッセージを Copy & Paste しましょう。

手元の VC6 で試してみたけど、コマンドラインからコンパイルできたし、実行もできたぞ。
0820デフォルトの名無しさんNGNG
>>805
レスありがとうございます。
例えば以下のように、
    A    B    C
 1 1.0 2.0 3.0

と格納されているとき、fgets()を使って行ごとに読み、
別のテキストファイルに入力すると、
1.0 2.0 3.0
と書き込まれます。この後、例えばB列のデータのみを
取り出すとか、処理した結果を別のExcelファイルのC列
に書き込むなどの方法を教えてください。
0821デフォルトの名無しさんNGNG
>>820
まず「〜などの方法」ではなく、必要な処理をリストアップすべきだな。
ひとつの関数でいろんなことをまとめてやろうとせずに、単純な処理を
行う関数を部品として作成して。それらを組み合わせて最終的な目的が
果たせるようにする。
たとえば、B列のデータを取り出すためには、まず指定した列のデータを
取得する関数を作らなけりゃならない・・・・、

って、この調子で説明したら先が長くなるなぁ・・・

まず最終的に実現したい機能をリストアップ。
それからだ。
0822デフォルトの名無しさんNGNG
まぁ落ち着きたまへ。そしてマロにC言語の便利なライブラリを持ってきたまへ。
0823821NGNG
う、そうね。
文字列系の標準ライブラリなんて最近つかってなかったんで、はなから
頭に無かった。

配列とポインタとstrstr()が理解できれば、B列取り出すのは難しくないはず。
0824デフォルトの名無しさんNGNG
>>820
まずAWKでやってみて、それで荷が勝ちすぎるようならPerlを使ってみれば。
Cの練習なのでなければ、わざわざCを使って不自由な思いをする必要はない。
0825デフォルトの名無しさんNGNG
検索してみ。C言語のライブラリあるから。
ただあんまり出来はよくなかった気がする。
0826デフォルトの名無しさんNGNG
>>823
sscanfでいいやん。
0827デフォルトの名無しさんNGNG
strtokの使い方が分からないならsscanfつかえ。
0828デフォルトの名無しさんNGNG
signed a;
unsigned b;
signed c;
a = -1;
b = a;
c = b;
とやった場合、c==aとなることは保証されてる?
0829デフォルトの名無しさんNGNG
標準ライブラリのソースコードってどうやって見られるの?
0830デフォルトの名無しさんNGNG
>>829
VCだったら
\Program Files\Microsoft Visual Studio\VC98\CRT
に入ってるよ。
他の環境は知らん。
0831デフォルトの名無しさんNGNG
>>830
サンクス。
入門書を読み終わった後の段階として、
標準ライブラリのソースコードを読もうかと思って。
0832デフォルトの名無しさんNGNG
>>831
一言逝っとくと、VCのランタイムのソースは汚いよ。
0833デフォルトの名無しさんNGNG
Win98では現在のローカル日時設定出来るのですが、WinNT/200では出来ません
SetLocalTime関数を使用しています
Helpを見るとSE_SYSTEMTIME_NAME 特権を有効にしなければならず、
この特権を割り当てるには、AdjustTokenPrivileges 関数を使いますが、
AdjustTokenPrivilegesのパラメータの意味がまったくわかりません
教えていただくか、別の方法を教えてください
0834デフォルトの名無しさんNGNG
Administratorでログイン汁
0835744NGNG
>>833
739で同じ質問しただろ。
答えてやってるのに見もせずに同じ質問するな。

仕方ないからもっかい書いてやるけど、
管理者アカウントでログインすれば設定できるはずだ。
要するに一般ユーザーにはシステム時刻を変更する権限がないんだよ。
0836744NGNG
>>833
あぁ、それから。
システム時刻変更の特権を割り当てるには云々って書いてるけど、
ユーザーの権限を変更できるのは管理者だけなんで。
一般ユーザーのログインでやっても失敗するから、そこんとこお間違いなく。
0837デフォルトの名無しさんNGNG
誰か教えてください。学校の課題で出たんですが、選択整列法or挿入整列法を
行うプログラムが知りたいです。誰か教えてください。全然わかんないです・・・
0838デフォルトの名無しさんNGNG
まず「選択整列法」「挿入整列法」というものが解かりますか?
解かるなら、試しにここに簡単でいいので書いてみてください。
0839ドキュンD1NGNG
どなたか教えて下さい。

main()
{
double a,b,c,d,e;
int i;
scanf("%lf %lf %lf",&a,&b,&c);
d=((a-b)/c)+1.0;
i=d;
printf("%lf %d \n",d,i);
}
このプログラムで
2.0 1.7 0.1 と入力すると4.000000と4が出力されるのですが、
1.9 1.6 0.1 と入力すると4.000000と3 となるのは何故なの?
0840デフォルトの名無しさんNGNG
printfの%lfを%.20fとかに変えてみると分かるけど、
後者の演算の結果は4よりわずかに小さいので、intの変数に代入する際に
切り捨てられて3になります。
正確に4.0にならないのは、浮動小数点の演算誤差のせい。
0841デフォルトの名無しさんNGNG
>>838
ごめんなさい。選択整列法、挿入整列法、どちらもどんなものかわかりません・・・
0842デフォルトの名無しさんNGNG
>>841
じゃああきらめて留年しろ。
0843デフォルトの名無しさんNGNG
>>841
1.宿題で出すのだから授業で説明したか教科書に載っている
2.この板でも一週間に一度は誰かが尋ねるくらい FAQ なことなので、
 google などで検索すれば概念、仕組みからソースコードまで手に入る。
3.宿題は宿題スレで訊ねれ
宿題見てやるよ
http://pc.2ch.net/test/read.cgi/tech/1003838158/
0844839NGNG
>840
レスありがとうございます。
0845デフォルトの名無しさん NGNG
質問です!
ポインタの理解に苦しんでいるのですが、
char (*(**hoge[0])[1])
せんぱい方はこう言うのも簡単に脳内変換出来ちゃうんでしょうか
それともこんな宣言はあまりしない方がいいですか
0846デフォルトの名無しさんNGNG
独学でCを始めて1ヶ月の者です。


#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{

int i;
double d;
long l;

i = atoi(argv[1]);
l = atol(argv[2]);
d = atof(argv[3]);

printf("%d %ld %f",i,l,d);

return 0;
}

上のプログラムは、参考書に載っていたもの
ですが、コンパイルして実行すると強制終了されてしまいます。
本には『コマンドライン上で整数、long型の変数、浮動小数点数
を入力してください。すると、これらの値が画面に再度表示されます』
と、書いてあります。

どのように使うものなのでしょうか?
また、コマンドラインとは何か?といった事が
全然わからないので、それについて分かりやすく
説明されているページをご存知でしたら教えていただきたいです。
0847_NGNG
CとJAVA、初めから覚えるならどちらが難しいですか?
0848846NGNG
>>846についてですが
いろいろと、いじってみた結果
実行することができました。(と思います…)

MS−DOSプロンプトから実行する際に
スペースで区切って『1 2 3』と入力した上で実行
したらできました。気合と勘なので
まだ、何がなんだか理解していませんが…

でも、なんかわかりそうな気がしてきました。
いろいろやってみます。
0849846NGNG
たびたびスイマセン。
別に 1 2 3 じゃなくってもできるんですね。
3つの値をわたさなければいけないということなのかな?
3つ未満の時は強制終了で、3つ以上の時は
実行されるけど反映されるのは最初の3つのみ…

また、こんがらがってきた…
0850デフォルトの名無しさんNGNG
>>846
hoge.exe 1 2 3

としたとき、argv[0]には"hoge.exe"(へのポインタ)が入っていて、
argv[1]には"1"が入ってる。で、コマンドラインの引数が足りないとき、
846ではargv[3]は、メモリ上の変なところを指してるんで
強制終了する(そもそもargv[3]なんてない)。

つーか、こんなサンプルが載ってる本なんて捨てちまえ。
0851デフォルトの名無しさんNGNG
>>846
#include<stdio.h>
int main(int argc, char *argv[])
{
int i;
for(i=0;i<argc;i++) printf("%d:%s\n",i,arg[i]);
return 0;
}

WebでC言語入門とか検索したほうがよいと思われ。
0852851NGNG
ミス。訂正。スマソ。

× for(i=0;i<argc;i++) printf("%d:%s\n",i,arg[i]);
○ for(i=0;i<argc;i++) printf("%d:%s\n",i,argv[i]);
0853846NGNG
>>850-851

今、C言語入門ページ巡りを
しているところです。

なんか、何か1つわからないことがあって
それがわかれば、今まで疑問に思ってきたことが
理解できそうな…そんな感じです。今。
がんばって勉強します。

ちなみに、現在使用している参考書は『独習C』です。
0854デフォルトの名無しさんNGNG
>>845
>char (*(**hoge[0])[1])
コンパイラ通るの?
0855初心NGNG
すいません。>>845の hoge[0] ってのはどうなるんですか?
要素0個の配列?
0856855NGNG
あ、ポインタ変数の配列へのポインタ変数配列の先頭要素へのポインタ、
・・・・でいいんですか・・・・?
0857デフォルトの名無しさんNGNG
今更ながらに >676 の解説希望。
構造体のアドレスでなく値を代入していると
思うんだけど私が間違ってるのか?
*でもついていればアドレスという説明はわかるんだけど。
0858デフォルトの名無しさんNGNG
>857
676が間違ってる。
0859デフォルトの名無しさんNGNG
>>857
たしかに。受けてる関数の引き血もintだしnumの宣言もint。
んで戻り値は〜構造体型。構造体丸投げは多少問題アリですが・・・
それにしても今更ですな。
0860デフォルトの名無しさんNGNG
ネタだろ?
0861デフォルトの名無しさんNGNG
ll これは?
0862デフォルトの名無しさんNGNG
>>861
ハァ?
0863はじめの二歩NGNG
Cを趣味で勉強している大学生です。
とりあえず文法レベルは分かったつもりですが、
まだライブラリ等の知識はあまり無い、という段階です。
Cでの不定長文字列についての質問なのですが、文字列を加工して
返すような関数を作る時、普段はどうしていますか?
もちろんプログラムの目的によっても違うでしょうが、日常的
にはどうしているか、という話です。
1. strncat,snprintfのように、バッファのサイズを引数で
指定して、あふれた分は切り捨てる。
2. fgetsのように、バッファに収まらない時は次回の呼び出しの
ときに返す。
3. バッファは呼び出し先の関数でmalloc()で確保し、バッファへの
ポインタを返す。free()は呼び出し元が行う。
p=hoge();
if(p!=NULL){
puts(p);
free(p);
}
という感じで。
4. 専用の文字列ライブラリを使う。
5. GC(聞きかじりですが)を利用。

1.を除けば一番無駄が少ないのは3.だと思いますが、malloc()は
恐いとよく脅されるので、3.のようなプログラムの書き方でも
大丈夫なものなのか、質問してみたかったのです。
もっとも小心者はJavaでも使うのが正しいのかも知れませんが。
0864デフォルトの名無しさんNGNG
速度が要求される場合か、文字列のサイズが予測できる場合は 1
ユーザの手入力とかそういう入力データ系は 3
かな。

2は、プログラムであふれたかどうかを判断して、処理を書かないといけないので
普通はつかいません。

4も、使うところでは使われています(qmailやdjbdnsで有名なdjbの人とかね)

5は、3や4を使う場合の応用編なんだけど、とりあえずは忘れていていいよ。
0865デフォルトの名無しさんNGNG
面倒なんで最近は全部C++でstd::stringを投げ返してる。
いちいち考える必要がなくなるし。

あと、WindowsAPIがらみとか、渡されたバッファが足りないときは
エラーを返す、ってパターンもあるね。
0866デフォルトの名無しさんNGNG
ここはCスレ
0867初心者NGNG
JAVAとCどっち簡単で使える?
0868デフォルトの名無しさんNGNG
>>867
日本語すらまともに使えない奴にはどっちも無理。
0869デフォルトの名無しさんNGNG
>>867

文字列一回出すためだけにいっぱい書くの嫌ならC。
.exeファイルが作れなくても泣かないのならJava。
0870デフォルトの名無しさんNGNG
Cを使うのはMS-DOS以来なので、intがふつー32bitになっただけで
カルチャーショックを受けている漏れなのですが、最近のOSでは
自動変数というかスタックはどのくらい使ってもOKなんでしょうか?

Windows 2000やLinuxで開発する場合の目安(?)が有れば教えてください。
ファイル読み込みのバッファとして1MBぐらい豪気に使ってもいいのか、とか。
0871デフォルトの名無しさんNGNG
1MBを越えないようにしとけばたいがい平気だが
100Kを越えた時点でふつう、馬鹿かと思う。
0872デフォルトの名無しさんNGNG
VCのリンカはデフォルトで1MBのスタックを確保。
0873デフォルトの名無しさんNGNG
>>870
古典的なUNIXなら無限、というかユーザーリミットに
あたるまで。物理セグメントのないUNIXマシンが多かった。
freeやreturnで再利用されて合計値が下がるのでむしろ好ましい。
0874870NGNG
デフォルトが1MBですか。Linuxのgccも同じぐらいでしょうか?

>871
数十KBぐらいなら、普通の組み方として許されますか?

あと、大きめの構造体を渡す時に参照渡しにするのは、
今でもやりますよね?
0875デフォルトの名無しさんNGNG
>>874
Linuxは古典的な配置のはず。
0876デフォルトの名無しさんNGNG
>>870
たぶん例えで言ってると思うんだけどツッコミ。

>ファイル読み込みのバッファとして1MBぐらい豪気に使ってもいいのか、とか。
今日びのOSはファイルをキャッシュするから
わざわざ大きなバッファを使うメリットはほぼゼロだと思う。
0877870NGNG
>876
いや、本気で言ってました……。
1byteずつ読んでも一向に構わないんですね?
0878876NGNG
>>877
1 byteとかいう極小単位の場合は実装によると思います。
インラインやマクロで関数が実装されていれば実質的に
ポインタ操作と大して変わらないので。

常に非常に高速なアクセスが要求されるとか、作業に必要でないなら
最低限のバッファ(作業場)程度がいいんじゃないでしょうか。
私はそう考えているんですけども、、、。
0879デフォルトの名無しさんNGNG
UNIX系のOSの場合、multi threadにすると使えるstack spaceが減ったり
することがあるので注意。
今時のOSならファイル読み込みはメモリにマップしちゃうのが楽だと思われ。
0880デフォルトの名無しさんNGNG
>>879
マッピングだとワークエリアとして書き込んだときに元データが壊れるから嫌い
いや、俺それで大ミスしたことあるから
0881デフォルトの名無しさんNGNG
>863
3は動かなくないはですが、あんまり良くないですね。
malloc()とfree()を別の関数でやると、それぞれの関数の汎用性(独立性)が下がるんで。

realloc()をうまく使えば、もっと方法がありそうですが。
0882デフォルトの名無しさんNGNG
Pascal文字列互換な関数郡ってないのかね?
0883デフォルトの名無しさんNGNG
varOleStr
0884デフォルトの名無しさんNGNG
intel C/C++ Compilerって、gccやVC++よりも
ものすごい勢いで最適化したりするの?
0885デフォルトの名無しさんNGNG
しないって。Intelのツールの恩恵を受けやすくなってるだけ
0886デフォルトの名無しさんNGNG
ものすごい勢いじゃないにしてもVCやgccより良くない?
0887デフォルトの名無しさんNGNG
VCとはどっこいどっこい。
いいところもあれば悪いところもある。
ただ、確実にgccよりはいいね。

vector Cとか言うのが最適かすごいらしいが。
0888仕様書無しさんNGNG
http://www.pro.or.jp/~fuji/computerbooks/c/c.kernighan.html

この本どうですか?
使用されてた方や知っている方がおられましたら感想聞かせてください。
0889デフォルトの名無しさんNGNG
>>888
ハヤシハルヒコ
0890デフォルトの名無しさんNGNG
>>888
必読

そのあとで林晴彦読むと、ヘタレっぷりがよく分かる
0891デフォルトの名無しさんNGNG
>888-890
ジサクジエン ゴクロウサン(ワラ
0892888NGNG
>>889
ハヤシハルヒコを買えということ?

>>890
そうですか。今会社の研修で使ってるのですが、
プログラミングの勉強はじめてなんで、この本で勉強を
したことが私の基礎になりそうで気になっていたので安心しました。
この会社を研修本にしてる私の会社はある程度見所ありそうですかね?
0893仕様書無しさん NGNG
つーか蟹飯とK&Rはプルグラマのバイブだぞ  ブルブル(・∀・)
0894888NGNG
>>891
ちがうYO!
>>887
ハヤシハルヒコを買え
ある意味必読
0895888NGNG
>>891
なんだよ自作自演て。
掲示板をそんな見方しか出来ないのか。
人間が小さいな、ド厨房さん。
0896デフォルトの名無しさんNGNG
プログラミングの質問ではないけど、
C言語でプログラムを書くにあたって便利なツールは何がありますか?
0897デフォルトの名無しさんNGNG
>>896
UNIX
0898デフォルトの名無しさんNGNG
>>896
Emacs
cflow
警告メッセージをきちんと読む心がけ
0899デフォルトの名無しさんNGNG
(vim&&screen) || emacs
man2html
grep
find
窓な人なら迷わずcygwin
0900デフォルトの名無しさんNGNG
emacsで日本語表示するとなんかドットが荒いんだけど...
0901デフォルトの名無しさんNGNG
サルガッソーと猿実装って何か似てるよね♪
0902デフォルトの名無しさんNGNG
>>901
少し休むことも必要だぞ?
0903デフォルトの名無しさんNGNG
>>889-890
何でK&Rの感想で林が出て来んだよ
それに10分も後に辻褄ぼろぼろのレスつけてんのも変だしな 自作自演クサクサ
0904デフォルトの名無しさんNGNG
http://ebi.2ch.net/test/read.cgi/rikei/1004776636/
0905デフォルトの名無しさんNGNG
データ構造を勉強するのにお勧めの本を教えてください。
できればC言語で学べる本がいいです。お願いします。
0906デフォルトの名無しさんNGNG
sleep関数の最大指定秒数はどのくらいですか?
0907デフォルトの名無しさんNGNG
>>906
そもそも sleep() は標準ライブラリ関数ではないので、環境を明記しないと答えられないと
思われ。
0908デフォルトの名無しさんNGNG
>>907
POSIXらしいよ。
レス数が900を超えています。1000を超えると表示できなくなるよ。