トップページ⇒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日下部氏の激動の半生は過去スレを参照
0175174NGNG
string.hをインクルードしてネ
0176デフォルトの名無しさんNGNG
forってなんですか?
0177 NGNG
int (*n)[3];

n=(int(*)[3])calloc(5*3,sizeof(int));

free(n);

free後のnって,(*n)[3]の状態に戻っているの?
0178 NGNG
>>176
forは
for(i=0;i<5;i++)
 printf("i=%d\n",i);
とやると同じことを5回繰り返す
0179デフォルトの名無しさんNGNG
(`_ゝ´)フォォー
0180デフォルトの名無しさんNGNG
whileが正統でforは異端だと聞いたのですが、本当ですか?
0181デフォルトの名無しさんNGNG
int (*n)[3];

n=(int(*)[3])calloc(5*3,sizeof(int));

free(n);

free後のnって,(*n)[3]の状態に戻っているの?
0182デフォルトの名無しさんNGNG
>>174
ふつーisdigit()使わんか?
0183デフォルトの名無しさんNGNG
>>181
%pを使って表示してみそ。
0184デフォルトの名無しさんNGNG
>>182
そうだごめん(汗

>>173
isdigitを使って。0-7とかだったら>>174で
0185デフォルトの名無しさんNGNG
>>180
私は聞いたことがありません。
個人的にはC言語のforは自由度があり過ぎるとは思っていますが。
0186デフォルトの名無しさんNGNG
>>185
でも、Perl使いとかみたいに妙な使い方を追い求めたりはしてないな。
0187デフォルトの名無しさんNGNG
>>183
それで、どーゆーことがわかるんでしょうか??
0188183NGNG
>>187
printf("%p", n);
とすればポインタ n の値を表示してくれる。
callocとfreeの前後に入れてみれば、nの値の変化がわかる。

(*n)[3]の状態ってぇのがよくわからないんで、
当てずっぽうに答えただけ。
0189185NGNG
>>186
意図不明。
私はPerlわからないんで更に不明。
0190185NGNG
>>186
あ、ごめんなんとなくわかった。
0191デフォルトの名無しさんNGNG
>>188
free(n); しても、nの値が変わるかどうかはわからないでしょ。nの指す
ヒープ領域は解放されるでしょうけど。
0192187NGNG
>>188
なるほど、さんきゅ。
0193デフォルトの名無しさんNGNG
>>181
状態って、何?
0194183NGNG
>>191
変わるかどうかわからないなら、試して表示してみればいいのでは?
0195 C-FAQの日本語の本が欲しいNGNG
 
0196デフォルトの名無しさんNGNG
>>195
田部はfjに帰れ。
0197デフォルトの名無しさんNGNG
fjにもこないで欲しいよ。
あのおっさん。
0198デフォルトの名無しさんNGNG
>>191
nが変わるわけは無いじゃん。
ポインタ自体はコピー渡しされてるんだから
0199デフォルトの名無しさんNGNG
>>198
う゛ぁか、せっかく自分で調べさせようとゆうどうしてるのに
0200デフォルトの名無しさんNGNG
structのなかで関数を定義しそれを使いたいのですがどうすればいいですか?
typedef struct{
int i;
void show(char n); これはなぜつかえないのか
}Myclass;
main()
{
Myclass x;
x.show;
}
みたいな感じでつかいたいのですが・・・無理ですか?
0201デフォルトの名無しさんNGNG
>>200
そろそろC++を使う時期だね

どうしてもというなら関数ポインタにすれば?
0202デフォルトの名無しさんNGNG
>>200
> structのなかで関数を定義しそれを使いたいのですがどうすればいいですか?
Cでは無理です。
ただし、関数へのポインタを使用することはできます。
もちろんポインタなので使用する前に何かの関数を設定しておく必要があります。

typedef struct{
  int i;
  void (*func)(char n); これはなぜつかえないのか
}Myclass;

int main(void)
{
  Myclass x;
  char c = '?';
  x.showp = show;  // void show(char); へのポインタを設定
  x.showp(c);    // 設定された関数の呼び出し
  retrun 0;
}
0203デフォルトの名無しさんNGNG
そうですか・・・わかりました。あと二次配列を関数に渡すとき
int calc(int *x[]);
main()
{
int z;
int a[2][2] = {{1,2},{3,4}};
z = calc(a);
}
これでやった場合calc(a)がうまくいかない(aの二次配列がうまくわたせない)
のですがどうしたらいいですか?
charの場合の2次配列はうまくいくのですが・・・
0204デフォルトの名無しさんNGNG
int calc(int (*x)[2]);
int calc(int x[][2]);
int calc(int x[2][2]);
どれでも同等。配列の要素数は必要。
それから"int *x[]"だとint*を保持する配列になるはず
0205デフォルトの名無しさんNGNG
ありがとうございます。たすかりました。
0206デフォルトの名無しさんNGNG
/*
0207デフォルトの名無しさんNGNG
*/
0208デフォルトの名無しさんNGNG
#if 0
0209デフォルトの名無しさんNGNG
#endif
0210デフォルトの名無しさんNGNG
やっぱりC++の方が便利なのか。
0211デフォルトの名無しさんNGNG
Cでオブジェクト指向は無理ですか?
0212デフォルトの名無しさんNGNG
>211
メモリをケチらざるを得ない状況で無い限りC++に移行したほうがメリット多いかと
0213デフォルトの名無しさんNGNG
>201
関数ポインタでがんがれ!
でもCでクラスの実装は無謀だよ、と予め逝っておくテスト。
0214デフォルトの名無しさんNGNG
>>213
publicとprivateはexternとstaticで真似できる?クラスごとにファイルを作成しないといけないけど・・・
0215214NGNG
でも広域変数になっちゃうか・・・
0216デフォルトの名無しさんNGNG
staticじゃ複数のインスタンスが作れないじゃん
0217デフォルトの名無しさんNGNG
うるせーばか
0218デフォルトの名無しさんNGNG
むむ。externとかstaticって関数の可視性のことだと思ってたけど。
変数なの?

大域変数はクラス変数になると思ったけど。
0219デフォルトの名無しさんNGNG
>>218
変数にも使えるけど・・・・
0220デフォルトの名無しさんNGNG
>>218
/* 関数外 */
static int i; /* このファイルのみ */
int i; /* 他のファイルからも */
extern int i; /* いずれかのファイルで宣言されているものを参照 */
0221218NGNG
>>220
無論わかってる。短すぎたな。こんなことを考えてるのかなあということ。
---myclass.h
typedef struct _myclass MyClass;
struct _myclass {
  MyClass *(* set)(MyClass *this, char *str);
  MyClass *(* display)(MyClass *this);
  void (* destroy)(MyClass *this);
  char *str;
};
MyClass *MyClassNew(void);
---myclass.c
#include <stdio.h>
#include <stdlib.h>
#include "myclass.h"
static int count_instance = 0;  /* クラス変数、ただしプライベート */
static MyClass *set(MyClass *this, char *str)
{
  this->str = str;
  return this;
}
static MyClass *display(MyClass *this)
{
  if (this->str) {
    puts(this->str);
  }
  return this;
}
void destroy(MyClass *this)
{
  count_instance--;
  free(this);
}
MyClass *MyClassNew(void)
{
  MyClass *instance = malloc(sizeof(MyClass));

  if (!instance) {
    return NULL;
  }
  count_instance++;
  instance->set = set;
  instance->display = display;
  instance->destroy = destroy;
  instance->str = NULL;
  return instance;
}
0222218NGNG
---使い方
#include "myclass.h"
int main(int argc, char * argv[])
{
  MyClass *c;

  c = MyClassNew();
  if (!c) {
    return 3;
  }
  c->set(c, "氏ね");
  c->display(c);
  c->destroy(c);
  return 0;
}
---

要するにCで無理やりクラスっぽいことをやらせようということで、
大域変数をstaticにするってのは、count_instanceみたいにクラス変数的な
使い方を想定してるってことなのかなあ、なんて考えてた。

にしても、C++ならthisポインタを暗黙のうちに渡してくれるのに、
Cだと明示的に自分自身を渡してやらなければならないから、
やっぱC++使ったほうがいいかもね。少なくともこの点は楽できる。
0223デフォルトの名無しさんNGNG
>>222
漏れもCで暮らすとか創ってみたことあったけど、
どうしてもthisが自前になってしまってかっこわるいのであきらめた。
CはCらしくが一番
0224デフォルトの名無しさんNGNG
自然が一番
0225デフォルトの名無しさんNGNG
無理しないのが一番。
0226218NGNG
>>223
うん、かっこ悪いんだよね。

さすがに構造体に関数へのポインタ埋め込むことはやったことないけど、
構造体の実体を隠して全部関数でやり取りさせるってライブラリは何度も作ったことある。
オブジェクト指向にかぶれたばかりのときにね、やってみた(w

stdioのFILE*をやり取りする関数群はそういう作りだということに後で気づいた(w

あ、ちなみに>>221-222はコンパイルできて実行できることをgccで確認してある(w
0227デフォルトの名無しさんNGNG
>>226
FILEはオブジェクト指向だね。
0228デフォルトの名無しさんNGNG
確実に一つしか作られないクラスなら(藁

static MyClass *this;

とかでもいいんだけど、あんま意味ないし。
0229デフォルトの名無しさんNGNG
それじゃ、インスタンスが1こしか…
0230デフォルトの名無しさんNGNG
>>229
Singltonか。

C で は デ ザ イ ン パ タ ー ン も 思 い の ま ま で す 。
0231デフォルトの名無しさんNGNG
libjpegのソースがけっこう面白いYO
(Cでオブジェクト指向)
0232デフォルトの名無しさんNGNG
>>231
どこにあるん?
0233デフォルトの名無しさんNGNG
www.ijg.org
0234デフォルトの名無しさんNGNG
a.c
------
static charfoo[1000] = "HOEHOE";
・
・
・


b.c
------
extern char foo[1000];
・
・
・
そしてソース内部の色々な個所で参照


コンパイルして出来たオブジェクトをリンクさせる。→Warning発生


開発者 「ワーニングが出ることもあるが、プログラムとしては何の問題もない」



俺の今まで学んできたC言語では、a.cでstatic宣言している以上、他のモジュールからは
参照できないはずなんだが、開発者は「これでテストもした、正常に動作している」と
言い張る。

さて、間違っているのはどっち?
0235デフォルトの名無しさんNGNG
ウォーニング
0236デフォルトの名無しさんNGNG
>234
a.c の static char foo[] は実は参照されていないという罠。
0237デフォルトの名無しさんNGNG
> static charfoo[1000] = "HOEHOE";
え、コンパイルエラーにならない?
0238デフォルトの名無しさんNGNG
charfoo
0239234NGNG
>>237
ならない。ワーニングになる。何故ならんのかわからんが。

>>236
だよな。一瞬俺の記憶が狂ってるのかと思ったのだよ
0240234NGNG
ついでにもひとつ質問


グローバル宣言で

extern int inted;
extern int wnted;
・
・
・
・
int inted;

と記述した場合、コンパイラはどう解釈するんだ?
これもエラーが出ないらしい。ワーニングさえ。問題ないってことか・・・?
0241234NGNG
↑は
 ・ppp.hというヘッダでextern宣言されている
 ・ppp.cで実体宣言されている
 ・ppp.cで最初にppp.hをインクルードしているため、展開後の解釈が↑のようになる

という意味です。
0242デフォルトの名無しさんNGNG
コンパイラを手に入れたいのですが
ここ→http://gcc.gnu.org/からどうやって手に入れるのか
英語ちゃんができなくて分かりません
どうか教えて下さい
0243デフォルトの名無しさんNGNG
>>240
特に問題はないと思うが?
もしかしてwntedが宣言だけされていて定義されていないことか?

wntedがプログラム中に使用されていなければ、エラーにはならない。
使用されていればエラーになる。
0244デフォルトの名無しさんNGNG
>英語ちゃんができなくて分かりません
英語の前に日本語を勉強しろ。
あと、英語がわからないなら、日本製だけ使っとけ。
0245デフォルトの名無しさんNGNG
>>242
少なくともOSくらいは書こうよ。
0246242NGNG
すいません
OSはwindows98SEを使ってます
それと英語ができなくてもつかえる日本製というのがあれば
教えていただけますか
0247としNGNG
しぬ?
0248デフォルトの名無しさんNGNG
>>246
コンピュータ英語出来ないのはプログラマとして致命的。

ああ、日本語LOGOとかめじろとかは国産だ。
0249デフォルトの名無しさんNGNG
>>246
Borland C++でも使え。入手方法からインストール方法まで書かれている。
http://homepage1.nifty.com/tyuuki/old/cc/bcc_install.html

gccの場合、コンパイルエラーなどのエラーメッセージは全て英語だ。
英語ができない奴に使いこなすことは難しいだろう。
0250デフォルトの名無しさんNGNG
>>249
> gccの場合、コンパイルエラーなどのエラーメッセージは全て英語だ。

いつの時代の話だ?gcc 3.1 は日本語がうざすぎるくらいだが。
0251デフォルトの名無しさんNGNG
>>237
なる。型名もしくは配列名が指定されていない。
0252デフォルトの名無しさんNGNG
俺の使っている2.9xは英語だが。
0253デフォルトの名無しさんNGNG
>>250
> いつの時代の話だ?
では、Cで可変長配列が使えないことも「いつの時代の話だ?」
と煽っていいんですね?
0254デフォルトの名無しさんNGNG
>>253
語尾に:)がついていない。8点減点。
0255240-241NGNG
>>243
ん、問題なかったっけ。さんくす。
問題定義しているのは、

・externで外部参照宣言した後に、実体を宣言しても問題ないのか

ということね
0256デフォルトの名無しさんNGNG
>>255
外部参照宣言はどこかのファイルに存在するものを参照する。そのどこかには自らのファイルも含まれる。
0257256NGNG
s/参照する/参照することを宣言する/
0258デフォルトの名無しさんNGNG
>>253
でもそれってブロックの最初でしか・・・。
0259デフォルトの名無しさんNGNG
>>234
> static charfoo[1000] = "HOEHOE";

コンパイルしたら、エラーになったよ。

a.c:3: invalid initializer

まぁこれはミスなんだろうが…

実は更にc.cというファイルがあって、そこに実体があるという罠。
それでもwarningがでるのはおかしいけど…
これ以上はwarningを貼ってもらうしかないね。
0260242NGNG
>>249
ありがとうございます
チャレンジしてみます
0261デフォルトの名無しさんNGNG
くだらないことですいません。C言語っていくらですか?
0262デフォルトの名無しさんNGNG
>>261
\0,000-
0263デフォルトの名無しさんNGNG
>>261
社会・世評
http://natto.2ch.net/soc/

が詳しい。
0264デフォルトの名無しさんNGNG
>>261 void流煽り
> C言語っていくらですか?

いいえ、いくらではありません。:)
0265デフォルトの名無しさんNGNG
>>259
恐ろしいことに、昔のCとの互換性のために「型を省略したらint」が
適用されてしまって、static charfoo は static int charfoo と同じ
意味になってしまう。

invalid initializerになるのは、型が書いてないからじゃなくて、
intの変数を文字列で初期化しようとしたから。だから、
static charfoo[1000];
これはエラーにならなかったりする(warningくらいは出るが)。
もっと極端な話、
foo;
これだけでもint foo;と解釈されてエラーにならないんだよね。
0266251NGNG
>>265
ああそうだった。longがlong intと見なされると同じだね。
0267デフォルトの名無しさんNGNG
foo;
これだけでもint foo;と解釈されてエラーにならないんだよね。

これはウソ
0268デフォルトの名無しさんNGNG
>>267
gccではエラーにならないんだけど、コンパイラによるのかも。
0269デフォルトの名無しさんNGNG
const/static等を付けた場合のみ暗黙でintになるんじゃないの?
gcc2.9.4/gcc3.1/vc6/bcc5.5.1で通らなかったよ
0270デフォルトの名無しさんNGNG
関数の中だと式文と解釈されてしまってだめだね。
関数の外なら行けますた。

% cc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/specs
gcc version 2.95.3 20010315 (release)
% cat foo.c
foo;
% cc -c foo.c
foo.c:1: warning: data definition has no type or storage class
% nm foo.o
00000004 C foo
00000000 t gcc2_compiled.
%
0271タイピング初心者NGNG
Cでタイピングソフトを作ろうと思うんですけど、
どっかにお手本になるソースファイルはありませんか?
いろいろ探したんですけど、なかなか見つからなくて・・・
0272デフォルトの名無しさんNGNG
それくらい考えてみろよ
0273デフォルトの名無しさんNGNG
>>271
考える力のないものは再開発しかできないのか?
0274デフォルトの名無しさんNGNG
>>271
どんな環境でも使えるものを作るのは、Cだけでは大変だよ。
■ このスレッドは過去ログ倉庫に格納されています