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

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

■ このスレッドは過去ログ倉庫に格納されています
0001日下部? ということにしたいのですね? :)NGNG
C言語質問スレッド Part 26

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART4
http://pc.2ch.net/test/read.cgi/tech/1022961238/l50

・前スレ

<26> http://pc3.2ch.net/test/read.cgi/tech/1026048820/
<25> http://pc.2ch.net/test/read.cgi/tech/1024918442/
<24> http://pc.2ch.net/test/read.cgi/tech/1024033400/
<23> http://pc.2ch.net/test/read.cgi/tech/1023024817/

コンパイラなどのリンクは>>2-3 あたり
void日下部氏の激動の半生は過去スレを参照
0446sageNGNG
誰か突っ込んでやれよ
0447デフォルトの名無しさんNGNG
>>445
んなわきゃないでしょっ びしっ。
0448デフォルトの名無しさんNGNG
>>445
文字列リテラルの最適化のことか?
0449二つ目のお気に入りとしてNGNG
このサイトは世界一リンクの多い総合リンク
サイトを目指しています。しかも総合リンク
サイトとしては日本初のナビゲーションリン
ク機能を搭載して、全てのサイトを右フレー
ムに表示できるようにしてあり、あらゆるサ
イトをさくさく表示することができます。是
非ブックマークに登録して活用してください。

http://home9.highway.ne.jp/cym10262/
0450デフォルトの名無しさんNGNG
構造体のコピーがa=bで良しとして、比較はどうする?
if(a!=b)とか考えたことないや。出来るのかな?
0451デフォルトの名無しさんNGNG
>>450
まずは比較する際の「意味」を考えれ。

struct Proc p, q; // プロセス構造体
if( p < q ) ・・・

もしこんな風に書けたとしても、
結局の所「何を」比較しているのか意味分かるか?
0452デフォルトの名無しさんNGNG
>>451
a==b・・・aとbが同じ
a!=b・・・aとbは違う。
0453デフォルトの名無しさんNGNG
>>451
レコードの比較。
違いがあるのかないのか。
等等の用途に。

比較したい時ってない?
メンバがいっぱいある時、一つずつ比較するのは面倒だろ。

1byte境界にしてmemcmpか? ちと嫌だ。鬱だ。
0454デフォルトの名無しさんNGNG
>>453
そろそろC++の時期
0455デフォルトの名無しさんNGNG
比較用の関数作れ。
0456デフォルトの名無しさんNGNG
>>454
C++で万事解決?
解説本でスパッと説明されているのを見たことないなあ。
入門編しか読んだことないからかな。
解説してくれるとうれしいです。

>>455
多種多様な構造体ごとに作るのは鬱にならないか?
指定された構造体が記録されているメモリブロックをユニークに
参照して、パディング位置が判別出来れば比較用関数1つで済むだろうが。
0457デフォルトの名無しさんNGNG
>>456
>指定された構造体が記録されているメモリブロックをユニークに
>参照して、パディング位置が判別出来れば比較用関数1つで済むだろうが。
そんな無茶苦茶な。アラインメントによる隙間だってあるかも知れんし
ポインタの参照先がデータ本体かも知れんし、上にもあったが
意味上の問題もあるし(リストの連結に利用するポインタの値が
違うからといって意味的に同値で無いとは限らんだろう?)

C++では演算子のオーバーロードが出来るし、ポリモーフィズムも
可能だから456の意向に近いことは出来ると思うがな
0458デフォルトの名無しさんNGNG
C++でもクラスごとにオーバーロード関数を自分で実装しないといけない罠。
0459デフォルトの名無しさんNGNG
ヘッダファイル内で関数定義をするにはどうすればいいのでしょうか。
普通に定義したら、複数のCファイルでそのヘッダファイルをinclude
しているので、multiple definitionと言われる。
0460デフォルトの名無しさんNGNG
http://js-web.cside.com/index.html
0461デフォルトの名無しさんNGNG
>>459
ヘッダファイルに関数定義を入れないといけない理由は?
0462名無しさん@XEmacsNGNG
>459

#ifdef xxxxx_h

とかやって、回避してください。

具体的な方法は、標準的なヘッダファイルに同じことが
普通はかいてあります。
たとえは、stdio.h などにも、ちゃんと多重定義しないように
そういう処理がかいてあるので参考にしてください


0463デフォルトの名無しさんNGNG
>462
459の犯してる誤ちはそういうことじゃない
0464デフォルトの名無しさんNGNG
>>461に同意

単に外部参照したいだけ?
externで解決か?
0465495NGNG
>>461
ANSI Cの時間計測関数より正確に時間計測できる
関数ってOSによって異なってますよね。
それをラッピングするマクロがヘッダファイルに書いてあったんです。
しかし、そのままではどうしてもコンパイルが通らないんです。
よくよく調べてみたらマクロで定義できるほど単純ではないことに
気がついて、マクロではなく関数で定義しようとしたんです。
0466463NGNG
>495
未来からのメッセージですか?
もう一度ヘッダファイルのなんたるかを再考してみよ
0467デフォルトの名無しさんNGNG

>465
とりあえず、問題のソースをはってみそ

0468459(=465)NGNG
>>466
そうします。
0469デフォルトの名無しさんNGNG
>>465
ヘッダでは関数宣言、別途.cファイルで定義を記述。
がベストだろ。

#ifdef HOGE
関数定義
#else
関数宣言
#endif

として、どこか1つのソースだけで、このヘッダを読み込む前に
#define HOGE
する手もあるが、お勧めできない。
0470459NGNG
>>467
すいません、他人のソースなんで・・・
冷静に考えてみたら、素直な方法を
考え付きました。
0471デフォルトの名無しさんNGNG
アンニュイな午前3時。。
0472デフォルトの名無しさんNGNG
>>470
まさか、おれの知ってるやつじゃあるまいな。
そいつ、ヘッダに関数を定義するの得意だった。
0473デフォルトの名無しさんNGNG
テスト期間でこの宿題に時間をかけたくありません。助けてください!解けますか?問題の意味もいまいちわからないし。
3×3のマスの中にチェスのナイトが置かれている。
(1) 3×3の配列aを定義して、すべての要素を0に初期化。ナイトの位置は1で、空欄は0で配列に記録。
スクリーン上には、□で空欄を、★でナイトの現在位置を表示する。(ナイトの最初の位置はプログラマーが選択してよい)
(2) チェスのナイトは、将棋の桂馬と同じ動きをするが、前だけでなく左右や後ろにも桂馬飛びができる。
そこで、3×3の配列bとcを宣言して、それぞれに現在位置(i,j)から移動できるマスの番号を2桁の整数で入力する。
移動できるマスが(3,1)ならば31と入力する。(この問題では移動できるマスは常に2つなので配列bとcを使います。)
(3) 現在のナイトがいる配列bの要素を10で割った商と余りを利用して、移動できるマスを(i,j)の形でプリントする。
同様に、配列cの要素をプリントする。
(4) ユーザーからの入力を読み、上の(3)で求めた(i,j)のどちらかならばナイトを移動して、新しい状態をプリントする。
入力が-1,-1ならばプログラムを終了する。
(5) 上の(3)と(4)を繰りかえす。
条件:配列aを引数として、現在ナイトがいる場所をプリントする関数を作製すること。
0474デフォルトの名無しさんNGNG
なんか宿題スレに答えらしきもの(内容見てない)
があったけど。
0475デフォルトの名無しさんNGNG
誰も解いてくれません^^;解いてくださいお願いします!
0476デフォルトの名無しさんNGNG
Pythonでなら、かいてあげるよ
0477デフォルトの名無しさんNGNG
>>473
http://pc3.2ch.net/test/read.cgi/tech/1027756023/199
http://pc3.2ch.net/test/read.cgi/tech/1027756023/247-248
0478デフォルトの名無しさんNGNG
> テスト期間でこの宿題に時間をかけたくありません。
こういう人のために時間をかけるのはどうなのだろうか。
0479デフォルトの名無しさんNGNG
というよりは普段勉強をしていないだけ。
0480デフォルトの名無しさんNGNG
問題を解くより、問題の正しい解釈を見つけるほうが時間かかりそう。
0481デフォルトの名無しさんNGNG
>>473
>問題の意味もいまいちわからないし。

つまり、俺らがめちゃくちゃな解答をしてあげても先生に
 「できました!かんっぺきです!ボクは天才ですから!いやーハハハハ」
とかいって提出する可能性があるわけだな
0482おしえて〜NGNG
質問!!

a=2.0;
b=3.0;
c=5.0;
c[0]=a+b+c;
c[1]=a+b-c;
c[2]=a+b*c;
c[3]=a+b/c;
c[3]=a-b+c;
・
・
・

数値は同じで演算子だけを+、-、*、/の全ての組み合わせで計算したいのですが、全て書くのは大変です。
何とかこのソースを簡単に出来きませんか?
教えて下さい。

0483おしえて〜NGNG
ソース間違えました
a=2.0;
b=3.0;
c=5.0;
d[0]=a+b+c;
d[1]=a+b-c;
d[2]=a+b*c;
d[3]=a+b/c;
d[4]=a-b+c;
・
・
・
0484デフォルトの名無しさんNGNG
>>483
そういうコードを生成するコードを書きなさい
0485おしえて〜NGNG
>>484
すいません具体的にお願いします。
0486デフォルトの名無しさんNGNG
>>458
#include <stdio.h>

int main()
{
int i;
const char op[] = "+-*/";

for(i = 0; i < 16; ++i) printf("d[%d]=a%cb%cc;\n", i, op[i/4], op[i%4]);

return 0;
}
0487おしえて〜NGNG
ありがとうございました。
0488デフォルトの名無しさんNGNG
>>487
ここまで出たんだから、ソース吐かせずに
プログラム中で計算する方法を考えるべし
0489おしえて〜NGNG
>>488
たびたびすいません。やっぱり分かりません。
486のソースをどお変えればよいのでしょうか?
初心者なので教えて頂けないでしょうか。
お願いします。
0490デフォルトの名無しさんNGNG
>>488
演算子の順位がめんどくさそう
0491デフォルトの名無しさんNGNG
>>489
こんなもんかな。ただし演算子の優先順位は考慮してないよ。

#include <stdio.h> 

static double add(double a, double b)
{
  return a + b;
}
static double sub(double a, double b)
{
  return a - b;
}
static double mul(double a, double b)
{
  return a * b;
}
static double div(double a, double b)
{
  return a / b;
}

int main() 
{ 
  int i; 
  double (* op[])(double, double) = {add, sub, mu\
l, div};
  double d[16], a = 2.0, b = 3.0, c =&n\
bsp;5.0;

  for(i = 0; i < 16; ++i)
    d[i] = op[i/4](a, op[i%4](b, c));
  return 0; 
}
0492491NGNG
ごめん、ターミナルからコピペしたら折り返しのところに\が入った。スマソ
こっちが正しい。

#include <stdio.h> 

static double add(double a, double b)
{
  return a + b;
}
static double sub(double a, double b)
{
  return a - b;
}
static double mul(double a, double b)
{
  return a * b;
}
static double div(double a, double b)
{
  return a / b;
}

int main() 
{ 
  int i; 
  double (* op[])(double, double) = {add, sub, mul, div};
  double d[16], a = 2.0, b = 3.0, c = 5.0;

  for(i = 0; i < 16; ++i)
    d[i] = op[i/4](a, op[i%4](b, c));
  return 0; 
}
0493デフォルトの名無しさんNGNG
>>491
どうでもいいが、なんでそんなにエディタの幅がせまいの?
0494493NGNG
リロードしてなかった。すまそ
0495おしえて〜NGNG
>>491
すいません。実行できないんですが・・
0496491NGNG
>>493
インデントがちゃんと見えるようにスペースを&nbsp;に置換してる。
んで、面倒なんで行頭のスペースだけじゃなくてソースにあるスペースを全部
&nbsp;に置換してるから、やたら幅を食う(笑)

ちなみにエディタというかターミナルの幅は95にしてる。
0497デフォルトの名無しさんNGNG
おしえて君、ここまでしてもらっているんだから
ちょっとはその足りない脳みそ使ってみろよ
0498491NGNG
>>495
ありゃあ。一応こっちではコンパイル/実行してみてるんだけど。
実行できないというのはどのレベル?
・コンパイルできない
・コンパイルできたけど実行したら保護違反とかなんとか言われてしまう
・結果が表示されない

多分、結果の表示がなされてないとかいうことかな。してないな(w

mainのreturn 0;の前に

for (i = 0; i < 16; i++)
  printf("d[%d] = %f\n", i, d[i]);

と入れてみてくれ。
0499おしえて〜NGNG
>>498
実行すると、
『実行時エラー:不正なアドレス参照』とだけでます。
0500デフォルトの名無しさんNGNG
演算子の優先順位も考慮してみた
#include <stdio.h>

static double add(double a, double b) {
 return a + b;
}
static double sub(double a, double b) {
 return a - b;
}
static double mul(double a, double b) {
 return a * b;
}
static double div(double a, double b) {
 return a / b;
}
int main() {
 int i;
 double (* op[])(double, double) = {add, sub, mul, div};
 char str[] = "+-*/";
 double d[16], a = 2.0, b = 3.0, c = 5.0;

 for(i = 0; i < 16; ++i)
  if ( i/4 < 2 && i%4 > 1 )
   d[i] = op[i/4](a, op[i%4](b, c));
  else
   d[i] = op[i%4](op[i/4](a,b),c);

 for( i = 0; i < 16; i++ )
  printf( "%f %c %f %c %f = %f\n", a, str[i/4], b, str[i%4], c, d[i] );
 return 0;
}
0501デフォルトの名無しさんNGNG
>>500
おおすばらしい。
でもこれなら、結局普通に式を16個書いたほうがいいね。
ぐふっ
0502おしえて〜NGNG
>>500
実行すると
エラー:無題:4行目:パーサーエラー、・E は間違っています。
と出るんですが。
0503おしえて〜NGNG
なかなかうまくできないですね〜
0504デフォルトの名無しさんNGNG
>>502
全角スペースをなおしたか?
0505デフォルトの名無しさんNGNG
>>502
「コンパイル」と「実行」という言葉を使い分けよう
0506デフォルトの名無しさんNGNG
>>505
ツッコミにワロタ
0507おしえて〜NGNG
>>504
直しましたが、やはりできません。
0508おしえて〜NGNG
どうせ教えるなら、ちゃんと動くものを教えてください。
こっちも忙しいんです。
0509デフォルトの名無しさんNGNG
>>507
コンパイルエラーの出た行を貼ってくれ。(ソースの)
0510おしえて〜NGNG
人を引き止めといて、、、
0511デフォルトの名無しさんNGNG
>>508
ごめんね。
0512デフォルトの名無しさんNGNG
error C2018: 文字 '0x81' は認識できません。
error C2018: 文字 '0x40' は認識できません。
がいくつか出てくるのだが・・・
0513デフォルトの名無しさんNGNG
なんか親切な人がいるなぁ

マターリイイ!
0514おしえて〜NGNG
>>509
Cmachineが原因でKERNEL32.DLLにエラーが発生しました。Cmachineは終了します。
と出てCmachine強制終了してしまいます。
0515デフォルトの名無しさんNGNG
>>512
それおもいっきり全角スペースじゃん
0516デフォルトの名無しさんNGNG
>>512
全角スペースを除去しろよタコ
0517デフォルトの名無しさんNGNG
>>515-516
スマソ
忘れてた(w
0518おしえて〜NGNG
しっかりしてください。 >>517
0519おしえて〜NGNG
>>503>>508>>510>>518
やめてください。寂しい人ですね。
0520デフォルトの名無しさんNGNG
>>519
みんな分かっているから気にするな。
対象のソースを丸ごと貼ってくれい
0521おしえて〜NGNG
>>520
すいません。ソース待ちだったんですか。
#include<stdio.h>
static double add(double a,double b){
return a+b;
}
static double sub(double a, double b){
return a-b;
}
static double mul(double a, double b){
return a*b;
}
static double div(double a, double b){
return a/b;
}
int main(){
int i;
double(* op[])(double,double)={add,sub,mul,div};
char str[]="+-*/";
double d[16],a=2.0,b=3.0,c=5.0;
for(i=0;i <16;i++)
if (i/4<2&&i%4>1)
d[i]=op[i/4](a,op[i%4](b,c));
else
d[i]=op[i%4](op[i/4](a,b),c);
for(i=0;i<16;i++)
printf("%f %c %f %c %f=%f\n",a,str[i/4],b,str[i%4],c,d[i]);
return 0;
}
0522おしえて〜NGNG
521をやると、>>514になります。
0523デフォルトの名無しさんNGNG
>>521
まったくもんだいない。
Cmachineとやらの問題じゃないの?
0524デフォルトの名無しさんNGNG
>>522
Cmachineを使うのは初めてかい?
以前に違うソースは実行できた?
0525デフォルトの名無しさんNGNG
http://homepage1.nifty.com/kentake/qanda.html
0526おしえて〜NGNG
>>523
そうですか。どうしてもできません。プログラムを動かす基の部分が原因だと思うので諦めます。
ありがとうございました。
0527デフォルトの名無しさんNGNG
ひょっとして、Cmachineとやらって関数ポインタをうまく扱えないんじゃ。
0528デフォルトの名無しさんNGNG
バグ多そうだよ、Cmachine。初心者にはお(略)
0529デフォルトの名無しさんNGNG
あれは標準関数すらまともにサポートしていないよ。
printfとかstrcpy程度。
0530デフォルトの名無しさんNGNG
Cmachineってなに?
0531デフォルトの名無しさんNGNG
ミーンマシーンと関係ありますか?
0532デフォルトの名無しさんNGNG
>>528
やっぱりw

>>530
初心者向けCエディタとでも言えばよいのかな?
ちなみにフリー。
0533デフォルトの名無しさんNGNG
質問です。
Cでは以下のように複数のファイルで
同一名のグローバル変数を定義しても
C++とは違い、エラーになりませんが、
これは言語仕様でしょうか?

file1.c
int foo=3;

file2.c
int foo=7;
0534デフォルトの名無しさんNGNG
yes
0535デフォルトの名無しさんNGNG
file1.cの中でfooを参照すると3になり、
file2.cの中でfooを参照すると7になります。
staticを付けてないので両方のfooは外部リンケージ
を持つのに 「外部リンケージを持つ変数はプログラム
の中でただ一つの定義を持たなければならない」という
規則に違反しないんでしょうか?
0536デフォルトの名無しさんNGNG
>>535
externしなけりゃ外部リンケージ持たないとか?
staticにすると、externができなくなる、と。
0537デフォルトの名無しさんNGNG
>>521
解決できたのかな。とりあえず、そのCmachineとやらいう変な処理系捨てて、
まともな処理系、たとえばgccなりbccなりを使ってほしい。
じゃないと変な癖つくよ。まかり間違って職業プログラマになってしまって、
しかもCを書くようになったら、かなりの困ったチャンになってしまうよ。

http://pc.2ch.net/test/read.cgi/prog/1021560641/l50
このスレで晒されるような存在になってしまうこと必至(w

で、Cmachineを使わざるを得ないというのであれば、ちょっとだけヒントを。
ただ、これでも動くかどうかはわかんないけど、トリッキーなことやってないので、
多分動くのではないかと。

以下の関数をop[なんちゃら](かんちゃら, どうした)って呼んでる部分で
置き換えてみるとよい。evalの引数opはどうやって得るかは考えてね。

double eval(char op, double a, double b)
{
  switch (op) {
  case '+':
    return a + b;
    break;
  case '-':
    return a - b;
    break;
  case '*':
    return a * b;
    break;
  case '/':
    return a / b;
    break;
  }
}
0538デフォルトの名無しさんNGNG
>>533
リンクエラーになる。
0539デフォルトの名無しさんNGNG
>>538
Cではリンクエラーにならんそうです
0540デフォルトの名無しさんNGNG
gccでもVC++6.0(もちろんCとしてコンパイル)でもリンクエラーになるぞ。
0541デフォルトの名無しさんNGNG
Σ(゚Д゚) が、ガセなの?信じたのに
0542API学くんNGNG
すみません質問です。
void *HENSU
という表現があったのですが、意味がわかりません。
ボイドへのポインタの意味を教えていただけないでしょうか。

voidは関数に付けて返り値のないものという認識だったのですが、
変数に付いてさらにポインタというところがわかりません。
0543デフォルトの名無しさんNGNG
vectorで文字列の配列を扱うときの宣言は
どうしたらいいのでしょう?
vector<char []> list;
vector<char [256]> list;
いずれもだめなようで
vector<char *> list;
とするとOKなのですが
while (inifile.getline(ss,256)){
CorpusList.push_back(ss);
AfxMessageBox(ss) //この段階では表示される
}
AfxMessageBox(CorpusList[0]);//あれれ・・・表示されない

するとAfxMessageBox(MFCのダイアログ表示命令)
になにも表示されません・・・
0544デフォルトの名無しさんNGNG
>>543
スレ違い
0545デフォルトの名無しさんNGNG
>>536
static指定されてない外部宣言は外部リンケージをもつ。

>>538 >>540
VC++6.0だとエラーと出るが実行できるぞ。(SPあててない)
BCC5.5.1だとエラーにならずに実行できるね。
gccは試してないけど、これが正しいのか?
■ このスレッドは過去ログ倉庫に格納されています