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

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

■ このスレッドは過去ログ倉庫に格納されています
0001スーパーハイソサエティーハッカー日下部陽一NGNG
漏れは38才、21年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
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プログラマならこれを買っとけ。
・プログラミング言語C(K&Rと呼べば通だ)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/yfcbookshelf-22/250-3950205-1475419

K&Rで挫折するようなヤツはこれでも買え。
これでわからない、救いがたいヤツはあきらめろ。
・作ってわかるCプログラミング(アヒル本と呼べば通だ)
http://dennou.gihyo.co.jp/books/void_c/
http://www.amazon.co.jp/exec/obidos/ASIN/477411328X/qid%3D1005618315/250-3950205-1475419

・前スレ C言語なら、漏れに聞け! <13>
http://pc.2ch.net/test/read.cgi/tech/1013990673/l50
0159デフォルトの名無しさんNGNG
#error これだとメッセージを出力して終わってしまいますが、
#warn ←こんな感じでメッセージを出力してそのままコンパイルを続けるようなのってないですか?
0160デフォルトの名無しさんNGNG
menuについて解説した日本語ページ無いですかね。
英語ページは見つけたんですけど…
無ければ無いでそっち使いますけどね。
0161デフォルトの名無しさんNGNG
>>160
menuってなーにー?
0162160NGNG
説明が足りませんでしたね。
ごめんなさい。
cursesを使ってターミナル画面で
メニューシステムを扱えると言うライブラリです。
(man menuより意訳。大雑把だけど)
0163161NGNG
>>162
おぉ、なるへそ。勉強になりました。
0164デフォルトの名無しさんNGNG
>>158
それよりも、printf系関数で数値を2進数字列にする機能がほしかった。
逆ならstrtolでできるんだけどな。
0165デフォルトの名無しさんNGNG
>>158
Unixが発祥の地ということで、例のクソファイルシステム関係で
8進数が導入されたんじゃ?
2進がないとは、アセンブラとは違うんじゃヴォケ って意思表示かと。
0166デフォルトの名無しさんNGNG
>>159
汎用的な方法はないと思われ。
とりあえずコンパイラのマニュアル見てみたら。
たとえばVCだったら #pragma message ってのでできる。
0167デフォルトの名無しさんNGNG
質問なのですが、
malloc関数などで、メモリーを確保しますよね。
メモリーが確保された状態で、ALT+F4を押されて強制終了させられたら、
開放しない事になるのでしょうか(多分なると思いますが)。
もしそうならば、ウィンドウプロシージャの中にWM_DESTROYが送られてくるのでしょうか?
0168デフォルトの名無しさんNGNG
OS のやる気次第
0169名無しさん@EmacsNGNG
普通は解放してくれるんじゃないの?よく知らないけど。
0170デフォルトの名無しさんNGNG
mallocしたらfreeしなさい。
しなさいったらしなさい。
0171デフォルトの名無しさんNGNG
>>167
普通は解放する。

mallocしたままプロセスが異常終了したとき、
OSにそのメモリを返さないライブラリを作ったり使ったりしても、
標準規格の中から外れているわけじゃないので可。

だが、よく考えてみれば分かることだが、
今時のOSでは、そんな屑ライブラリを使ってる可能性はない。

DOSやCP/Mの時代で、EMSとかDPMIを使ってメモリ確保するライブラリとか
作ってて、たまたまそれをmallocに流用してたとして、
CTRL+Cとかでプログラムが中断されたときにマップしたフレームをきちんと
返さない、という屑ライブラリはあったかもしれんがね。

0172_NGNG
Cの勉強しようと思うんですが・・・
http://www.bloodshed.net/  の、DevC++ってやつで事足りますか?
入門用のオススメソフトないですかね・・・
0173デフォルトの名無しさんNGNG
http://paming.s7.xrea.com/ykwk166_kai/yukiwiki.cgi?mycmd=read&mypage=%5B%5B%82%DC%82%B8%82%CDC%8C%BE%8C%EA%82%F0%8Ao%82%A6%82%BD%82%A2%82%CC%82%C5%82%B7%5D%5D
0174デフォルトの名無しさんNGNG
>>173

> Q. まずはC言語を覚えたいのですが、コンパイラは何を使えば良いでしょうか。
> A. 使っているOSによります。
> UNIX/Linux
> 標準でインストールされているgccを使いましょう。

Linuxでは、今は標準でインストールされねーぞ。
0175デフォルトの名無しさんNGNG
>>172
わるいことはいわないから、DigitalmarsかBorlandにしておけ。
0176デフォルトの名無しさんNGNG
>>172
Windowsなら cygwinでgccってのもアリかと。
0177デフォルトの名無しさんNGNG
>174
ここで突っ込む暇があったら追加・加筆したれよ(藁
0178デフォルトの名無しさんNGNG
>>177
おお、これWikiだったか。       
0179デフォルトの名無しさんNGNG
結城先生ハァハァ
ウッ!
0180デフォルトの名無しさんNGNG
>>172
事足りるっつーか、それって結局コンパイラは gcc だし、何の問題も無し。
Cygwin 入れるのもかったるいだろうし。
0181デフォルトの名無しさんNGNG
日本では情報少ないだろ>DevC++
0182デフォルトの名無しさんNGNG
DevC++の統合環境って勝手に関連付けしてくれる。
0183デフォルトの名無しさんNGNG
先生、黒板見えませーん!
せめて

i=1;

と書くのはやめて、

i = 1;

と書いてください。

あと、プログラマは何故 "," と "." の区別が一瞬でつきますか?
0184デフォルトの名無しさんNGNG
>183
文脈でわかるだろ
pi=3,14
foo(a.b.c,d,e.f)
とかね
0185デフォルトの名無しさんNGNG
>>184
俺もそう思ったけど、メンバーを参照するときに.を使うね。
0186デフォルトの名無しさんNGNG
>>183
区別が付くほど大きな文字サイズにしているから。
0187デフォルトの名無しさんNGNG
>>184
pi=3,14; は警告も出ずに動いてしまうと言う罠。
0188デフォルトの名無しさんNGNG
おばあちゃんの知恵。

コンマの後ろには必ず空白を。
ピリオドの前後は空白を入れない。
0189デフォルトの名無しさんNGNG
>>187
lint機能搭載してるコンパイラなら警告出るはずだが
0190デフォルトの名無しさんNGNG
>>188
ファイルサイズが増えるから嫌。
0191デフォルトの名無しさんNGNG
最近Kusakabe Youichiさんを見かけないのですが、どうしちゃったんですか?
アクセス規制された?
電波が届かない、圏外?
0192デフォルトの名無しさんNGNG
>>190
いつの時代の人間だよ。
0193デフォルトの名無しさんNGNG
>>191
胃潰瘍で入院中です。

From: Kusakabe Youichi <[email protected]>
Newsgroups: japan.food,fj.sci.lang.japanese
Subject: Re: スローフード
Date: Sat, 02 Mar 2002 04:42:57 +0900
Organization: Macintosh User Group PLEIADES
Lines: 14
Message-ID: <02032002044a7c8669%[email protected]>
References: <[email protected]>
NNTP-Posting-Host: 202-238-200-042.ryukyu.ne.jp
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 8bit
NNTP-Posting-Date: 1 Mar 2002 19:42:56 GMT
User-Agent: YA-NewsWatcher/3.1.8


In article <[email protected]>, O.Ogiwara
<[email protected]> wrote:
> スローフード?

私は手術したので、しばらく食べられません。

ヘ_ヘ ____________________________
ミ・・ ミ [email protected]
( ° )〜 日下部陽一
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0194デフォルトの名無しさんNGNG
>>193
それは入院中でも書けるということを意味してるような
0195191NGNG
>>193
そうですか kusakabe さんお大事に。はぁと。
0196デフォルトの名無しさんNGNG
実行速度の目安として、ステップ数を計測したいと思っています。
ある関数に入ってからのアセンブラレベルでの実行ステップ数を計測
したいんだけど現在ではgdbで関数頭でブレークしておいて
その関数を抜けるまで地道にsiを繰り返しています。
でもイマイチ効率が悪いのでもう少しいい方法を模索中です。
0197デフォルトの名無しさんNGNG
>>196
あそう。
0198デフォルトの名無しさんNGNG
胃潰瘍ってマジ?
0199デフォルトの名無しさんNGNG
チーズばっかり食ってるからか?
0200デフォルトの名無しさんNGNG
>>196
プロファイルツールを使わないのは何か意味があるのか?
0201デフォルトの名無しさんNGNG
>>200
プロファイルツールって何ですか?
0202201NGNG
googleで調べたけど売り物ばかり
Unix系(Linuxです)で使える無料のものはないのでしょうか?
0203デフォルトの名無しさんNGNG
http://www.linux.or.jp/JM/html/GNU_binutils/man1/gprof.1.html
0204デフォルトの名無しさんNGNG
>>202
ふーん、お前のところのLinuxって
man gprof
ってやっても何も出ないのか?
それって本当にLinuxなのか?
0205201NGNG
>>204
今はじめてしりました。
なかなか便利そうですね。
LinuxとかUnixとかだと、検索しても 見つからない というか、
単語名(キーワード)をしらないとどうしようもないですからね

機能逆引きページみたいなのも全く無いですし。
困ったものです。
0206デフォルトの名無しさんNGNG
>>205
普段からマニュアルに目を通しておけ。
全てを覚えるのではなく,どこにどんなことが
書いてあるかをおおざっぱに把握する程度で良い。
0207デフォルトの名無しさんNGNG
>>205
> 機能逆引きページみたいなのも全く無いですし。
man man
と打ち
-k オプションの部分を良く読むこと
0208デフォルトの名無しさんNGNG
apropos 使うとか
0209201NGNG
>>207
ステップ数を数えるツール をさがしてて、
「プロファイル」 という単語にたどり着かないじゃないですか。
結局>>206氏のとおり普段からマニュアルを読んどくしかないですけど。

man の -k オプションは役立たずです。
0210デフォルトの名無しさんNGNG
>>209
「プログラム 実行速度 計測 方法」で検索してみた。
http://www.google.com/search?q=%83v%83%8D%83O%83%89%83%80+%8E%C0%8Ds%91%AC%93x+%8Cv%91%AA+%95%FB%96@&hl=ja&lr=lang_ja
結構簡単にプロファイラにたどり着けそうな気がする。
0211デフォルトの名無しさんNGNG
>>209
> ステップ数を数えるツール
確かにそれだと別の物を探してしまうし、
多分それだけのキーワードで質問したら
永遠にgprofは出てこなかっただろう。

検索キーワードの指定方法は結構難しい
私が初心者の頃、一般的なキーワードを指定してしまい、
何千件の一致結果にげんなりしてしまったことがあったり、
自分言葉を検索キーワードにしてしまい全然ヒットしないことがあった
今はの私はキーワードをいろいろ変えながらうまくクズ情報にフィルタをかけたり、
検索エンジンをいろいろ変えたりして何とか
検索エンジンを使いこなしているつもりになっているが、まだまだ先は長い。
0212デフォルトの名無しさんNGNG
Cでミリ秒単位で時間は持ってこれないの?
0213デフォルトの名無しさんNGNG
clock()とCLOCKS_PER_SECで場合によっては求められる
0214デフォルトの名無しさんNGNG
下のように関数を作りました。

LOCAL void hankaku(int resu)
{
return;
};

この場合、プロトタイプ宣言も

LOCAL void hankaku(int resu);

とするのでしょうか?
0215デフォルトの名無しさんNGNG
>>214

localなんてあったか?
staticとexternなら知っているが。
0216デフォルトの名無しさんNGNG
>>214
プロトタイプ宣言なんてする奴はいねーよ!
0217デフォルトの名無しさんNGNG
プロトタイプ宣言しないと

void func1(){ … }
void func2(){ … }

ってなソースで func1 から func2呼び出せませんが 何か?
0218デフォルトの名無しさんNGNG
>>216
GLOBALの時だけ、宣言するのですか?
0219デフォルトの名無しさんNGNG
>>217

うーん?
でも実際にプロトタイプ宣言していないものがほとんどだよね?
0220デフォルトの名無しさんNGNG
>>218
LOCALだとかGLOBALだとか一体なんの話をしているんだ?
0221monosiriNGNG
ローカル関数
グローバル関数
0222デフォルトの名無しさんNGNG
>>221
他のファイルから見えるか見えないかってことか?
それはstaticとexternだろ?
0223デフォルトの名無しさんNGNG
>>219
普通はヘッダファイルでプロトタイプ宣言してるからでしょ。
0224デフォルトの名無しさんNGNG
>>223
そのなかにもないし。
標準ライブラリくらいでしかみたことない。
0225デフォルトの名無しさんNGNG
みんなはプロトタイプ宣言をしているの?
0226デフォルトの名無しさんNGNG
プロトタイプ宣言したことないって…
ネタか? マジで入門者レベルなのか?
とりあえず相手にしないほうが良さそうだなぁ…
0227214NGNG
ネットから落としたサンプルソースに

LOCAL Sint16 e1_pl_search_bak = 0;

GLOBAL Sint16 e1_pl_search(Float32 x, Float32 y)
{
・・・・・・・・・・・・・
}

てな感じで、書いてあったんです。
0228デフォルトの名無しさんNGNG
>>226
いや、俺はしているんだが・・・・
でもApacheとかゆうめいなソフトのソースを見るとないから迷っている。

俺が見落としているだけ?
0229デフォルトの名無しさんNGNG
>>225
> みんなはプロトタイプ宣言をしているの?
1つのファイルのみでプログラムが構成されていて、
main関数を一番最後に書く場合、プロトタイプ宣言はしない。

が、そんなプログラムはあまり書かない。
0230214NGNG
なんかヘッダーファイルを一つ一つ見ていったら、
#define GLOBAL // 外部参照
#define LOCAL static // 内部参照

ってなことが書いてありました。

・・・・・・・・
0231デフォルトの名無しさんNGNG
>>229
そうか。ありがとう。
じゃあこのままプロトタイプ宣言をし続けていいんですね・・・
正直迷っていたんで助かりました。
0232デフォルトの名無しさんNGNG
>>230
プロトタイプ宣言でやってみてエラーになったらやめれば?
0233デフォルトの名無しさん NGNG
#include <stdio.h>

#define MAX 5 /* これ以後の MAX を 5 に読み替える命令 */

main()
{
int i;
int point[MAX]; /* MAX 個の要素を持つ配列 point を宣言 */
int total=0, avr; /* ★★★★★*/

for(i=0; i<MAX; i++){ /* MAX 回の繰り返し */
printf("%d人目の点数は? >", i+1);
scanf("%d", &point[i]);
/* 配列の場合でも & を忘れずに付ける */
}
for(i=0; i<MAX; i++){
printf("%d人目 = %d\n", i+1, point[i]);
total += point[i];
}
avr = total / MAX;
printf("平均点 = %d\n", avr);
}

 超初心者です。 上の五つ星のところの int total=0 のところの
「 =0 」を消して、実行すると、totalの結果がおかしくなります。
どうしてなんでしょうか? よろしくお願いしますm(__)m
0234近頃物忘れが激しい35歳NGNG
質問です

関数その1
void mycopy(char *d,char *s,int n)
{
  while((*s !='\0')&&(n > 0)){

   *d++ = *s++;
    n--;
  }

 *d = '\0';

}
と書くとsの文字はdにコピーできますね。では

関数その2
void mystradv(char *s,int d)
{
  while((*s !='\0')&&(d > 0)){
    *s++;
    d--;
  }

}
のと書くと、何か期待通りに動作しません。
期待っちゆうのは

int main()
{
  char x[20+1];
  char y[20+1];
  memset(x,'\0',sizeof(x));
  memset(y,'\0',sizeof(y));

  strcpy(x,"0123456789");

  mystradv(x,3);//関数その2
  mycopy(y,x,10);//関数その1

  printf("x=%s y=%s\n",x,y);
  return 0;
}
結果   0123456789
期待   3456789

関数の引数に(char *s)を使っているのに何故なんでしょうか?
宜しくお願いします。
0235デフォルトの名無しさんNGNG
>>233
コンパイル時に警告がでないか?
0236デフォルトの名無しさんNGNG
>>233
ローカルで宣言した変数は内容が0に初期化される保証はない
0237近頃物忘れが激しい35歳NGNG

ごめんなさい。ちょっと訂正

main()
{
略
 × printf("x=%s y=%s\n",x,y);
 ○ printf("y=%s\n",y);

どうぞ宜しく
0238デフォルトの名無しさんNGNG
>>236
staticなら0に初期化されますがなにか?
0239デフォルトの名無しさんNGNG
>234
void mystradv(char**s, intd)
じゃない?
配列を渡すと変なことになるけど
0240デフォルトの名無しさんNGNG
>>238
ローカルに宣言した自動変数は0に初期化される保証はない。
これでどうだ
0241デフォルトの名無しさんNGNG
>>240
OK!
というか普通はコンパイラが警告を出してくれるよな。どんなの使っているんだろうね。
0242近頃物忘れが激しい35歳NGNG
いえ、char* を渡したいんですわ。
*sをs[2]を指すようにしたいんですがな。
ん−−−
0243デフォルトの名無しさんNGNG
>1
Cがいちばん経んかが少ない空な.単に経んかについていけなかっただけでは.LOL!
0244デフォルトの名無しさんNGNG
警告メッセージを読まないからバカなんだよ。
0245デフォルトの名無しさんNGNG
>>242
よく考えてみろよ。
char*s だと、s[0]へのポインタがコピー渡しされるわけだから、
そのポインタを書き換えることは不可能。
ポインタを書き換えたいならポインタへのポインタを渡せ
0246233 NGNG
>>233 です。
 レス速いですね。 みなさん、ありがとうございます。
自動変数って
 int total = 0 , avr;   (>>233の五つ星のとこ)
 の「 avr 」もそうだと思うのですが、とりあえず結果がおかしければ
変数をゼロにしてて、いいのかな? 「 avr=0 」にしても、しなくても
結果は同じでした。

 て優香。あまりわかってないので、逝ってきます。
ありがとうございました。
0247デフォルトの名無しさんNGNG
>>246
avrは初期化する前に参照していないから。
0248プリオンが溜まりつつある35歳NGNG
>246さん

お返事ありがとう。でもね・・・

関数その1
void mycopy(char *d,char *s,int n)
{
  while((*s !='\0')&&(n > 0)){

   *d++ = *s++;
    n--;
  }

 *d = '\0';

}

コピー渡しの*d *sのはずなのに、なんで
コピーできるのだろうかね?

宜しくお願いします。
0249プリオンが溜まりつつある35歳NGNG
>>246×
>>245
0250デフォルトの名無しさんNGNG
>>248
mycopyでコピーが出来ているのは、
s[0]へのポインタがコピーされているので、
ポインタは別物でも、ポインタが差す先は同じもの

実体と参照について調べてみよう
0251プリオンが溜まりつつある35歳NGNG
タバコすってきた
>>250さん、どうもありがとう。

勉強してみます。
0252デフォルトの名無しさん NGNG
#define "逝ってよし" 0
#define "あぼーん" 1
てな感じで日本語使えたよね?
エラーが出るんだがどう書いたらいいか教えてください。
使用しているコンパイラはVisualC++6.0です。
0253デフォルトの名無しさんNGNG
無理だろ
0254デフォルトの名無しさんNGNG
おまえおもろいな
0255デフォルトの名無しさんNGNG
>>252
日本語はもとより、"←これも使えないぞ。
0256デフォルトの名無しさんNGNG
>>248
あのさ、
*s++
ってさ、
*(s++)
ってことだよな。
こういう書き方は混乱するから単に
s++
でいいと思うが。(細かいトコだけど)
0257デフォルトの名無しさんNGNG
>>256
イディオムだからいいじゃねーか
0258256NGNG
ってmycopyの場合は
*d++=*s++;
の方がが一行で済ませられるな。
良く見てなかった。
氏かも256だと言うのに気づかなかった。
頚釣って夷狄益…
■ このスレッドは過去ログ倉庫に格納されています