C言語なら、俺に聞け! <27>
■ このスレッドは過去ログ倉庫に格納されています
0001日下部? ということにしたいのですね? :)
NGNG・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日下部氏の激動の半生は過去スレを参照
0175174
NGNG0176デフォルトの名無しさん
NGNGforは
for(i=0;i<5;i++)
printf("i=%d\n",i);
とやると同じことを5回繰り返す
0179デフォルトの名無しさん
NGNG0180デフォルトの名無しさん
NGNG0181デフォルトの名無しさん
NGNGn=(int(*)[3])calloc(5*3,sizeof(int));
free(n);
free後のnって,(*n)[3]の状態に戻っているの?
0182デフォルトの名無しさん
NGNGふつーisdigit()使わんか?
0183デフォルトの名無しさん
NGNG%pを使って表示してみそ。
0184デフォルトの名無しさん
NGNGそうだごめん(汗
>>173
isdigitを使って。0-7とかだったら>>174で
0185デフォルトの名無しさん
NGNG私は聞いたことがありません。
個人的にはC言語のforは自由度があり過ぎるとは思っていますが。
0186デフォルトの名無しさん
NGNGでも、Perl使いとかみたいに妙な使い方を追い求めたりはしてないな。
0187デフォルトの名無しさん
NGNGそれで、どーゆーことがわかるんでしょうか??
0188183
NGNGprintf("%p", n);
とすればポインタ n の値を表示してくれる。
callocとfreeの前後に入れてみれば、nの値の変化がわかる。
(*n)[3]の状態ってぇのがよくわからないんで、
当てずっぽうに答えただけ。
0191デフォルトの名無しさん
NGNGfree(n); しても、nの値が変わるかどうかはわからないでしょ。nの指す
ヒープ領域は解放されるでしょうけど。
0193デフォルトの名無しさん
NGNG状態って、何?
0195 C-FAQの日本語の本が欲しい
NGNG0196デフォルトの名無しさん
NGNG田部はfjに帰れ。
0197デフォルトの名無しさん
NGNGあのおっさん。
0198デフォルトの名無しさん
NGNGnが変わるわけは無いじゃん。
ポインタ自体はコピー渡しされてるんだから
0199デフォルトの名無しさん
NGNGう゛ぁか、せっかく自分で調べさせようとゆうどうしてるのに
0200デフォルトの名無しさん
NGNGtypedef struct{
int i;
void show(char n); これはなぜつかえないのか
}Myclass;
main()
{
Myclass x;
x.show;
}
みたいな感じでつかいたいのですが・・・無理ですか?
0201デフォルトの名無しさん
NGNGそろそろC++を使う時期だね
どうしてもというなら関数ポインタにすれば?
0202デフォルトの名無しさん
NGNG> 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デフォルトの名無しさん
NGNGint calc(int *x[]);
main()
{
int z;
int a[2][2] = {{1,2},{3,4}};
z = calc(a);
}
これでやった場合calc(a)がうまくいかない(aの二次配列がうまくわたせない)
のですがどうしたらいいですか?
charの場合の2次配列はうまくいくのですが・・・
0204デフォルトの名無しさん
NGNGint calc(int x[][2]);
int calc(int x[2][2]);
どれでも同等。配列の要素数は必要。
それから"int *x[]"だとint*を保持する配列になるはず
0205デフォルトの名無しさん
NGNG0206デフォルトの名無しさん
NGNG0207デフォルトの名無しさん
NGNG0208デフォルトの名無しさん
NGNG0209デフォルトの名無しさん
NGNG0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNG0212デフォルトの名無しさん
NGNGメモリをケチらざるを得ない状況で無い限りC++に移行したほうがメリット多いかと
0213デフォルトの名無しさん
NGNG関数ポインタでがんがれ!
でもCでクラスの実装は無謀だよ、と予め逝っておくテスト。
0214デフォルトの名無しさん
NGNGpublicとprivateはexternとstaticで真似できる?クラスごとにファイルを作成しないといけないけど・・・
0215214
NGNG0216デフォルトの名無しさん
NGNG0217デフォルトの名無しさん
NGNG0218デフォルトの名無しさん
NGNG変数なの?
大域変数はクラス変数になると思ったけど。
0219デフォルトの名無しさん
NGNG変数にも使えるけど・・・・
0220デフォルトの名無しさん
NGNG/* 関数外 */
static int i; /* このファイルのみ */
int i; /* 他のファイルからも */
extern int i; /* いずれかのファイルで宣言されているものを参照 */
0221218
NGNG無論わかってる。短すぎたな。こんなことを考えてるのかなあということ。
---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;
}
0222218
NGNG#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漏れもCで暮らすとか創ってみたことあったけど、
どうしてもthisが自前になってしまってかっこわるいのであきらめた。
CはCらしくが一番
0224デフォルトの名無しさん
NGNG0225デフォルトの名無しさん
NGNG0226218
NGNGうん、かっこ悪いんだよね。
さすがに構造体に関数へのポインタ埋め込むことはやったことないけど、
構造体の実体を隠して全部関数でやり取りさせるってライブラリは何度も作ったことある。
オブジェクト指向にかぶれたばかりのときにね、やってみた(w
stdioのFILE*をやり取りする関数群はそういう作りだということに後で気づいた(w
あ、ちなみに>>221-222はコンパイルできて実行できることをgccで確認してある(w
0227デフォルトの名無しさん
NGNGFILEはオブジェクト指向だね。
0228デフォルトの名無しさん
NGNGstatic MyClass *this;
とかでもいいんだけど、あんま意味ないし。
0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNGSingltonか。
C で は デ ザ イ ン パ タ ー ン も 思 い の ま ま で す 。
0231デフォルトの名無しさん
NGNG(Cでオブジェクト指向)
0232デフォルトの名無しさん
NGNGどこにあるん?
0233デフォルトの名無しさん
NGNG0234デフォルトの名無しさん
NGNG------
static charfoo[1000] = "HOEHOE";
・
・
・
b.c
------
extern char foo[1000];
・
・
・
そしてソース内部の色々な個所で参照
コンパイルして出来たオブジェクトをリンクさせる。→Warning発生
開発者 「ワーニングが出ることもあるが、プログラムとしては何の問題もない」
俺の今まで学んできたC言語では、a.cでstatic宣言している以上、他のモジュールからは
参照できないはずなんだが、開発者は「これでテストもした、正常に動作している」と
言い張る。
さて、間違っているのはどっち?
0235デフォルトの名無しさん
NGNG0236デフォルトの名無しさん
NGNGa.c の static char foo[] は実は参照されていないという罠。
0237デフォルトの名無しさん
NGNGえ、コンパイルエラーにならない?
0238デフォルトの名無しさん
NGNG0240234
NGNGグローバル宣言で
extern int inted;
extern int wnted;
・
・
・
・
int inted;
と記述した場合、コンパイラはどう解釈するんだ?
これもエラーが出ないらしい。ワーニングさえ。問題ないってことか・・・?
0241234
NGNG・ppp.hというヘッダでextern宣言されている
・ppp.cで実体宣言されている
・ppp.cで最初にppp.hをインクルードしているため、展開後の解釈が↑のようになる
という意味です。
0242デフォルトの名無しさん
NGNGここ→http://gcc.gnu.org/からどうやって手に入れるのか
英語ちゃんができなくて分かりません
どうか教えて下さい
0243デフォルトの名無しさん
NGNG特に問題はないと思うが?
もしかしてwntedが宣言だけされていて定義されていないことか?
wntedがプログラム中に使用されていなければ、エラーにはならない。
使用されていればエラーになる。
0244デフォルトの名無しさん
NGNG英語の前に日本語を勉強しろ。
あと、英語がわからないなら、日本製だけ使っとけ。
0245デフォルトの名無しさん
NGNG少なくともOSくらいは書こうよ。
0246242
NGNGOSはwindows98SEを使ってます
それと英語ができなくてもつかえる日本製というのがあれば
教えていただけますか
0247とし
NGNG0248デフォルトの名無しさん
NGNGコンピュータ英語出来ないのはプログラマとして致命的。
ああ、日本語LOGOとかめじろとかは国産だ。
0249デフォルトの名無しさん
NGNGBorland C++でも使え。入手方法からインストール方法まで書かれている。
http://homepage1.nifty.com/tyuuki/old/cc/bcc_install.html
gccの場合、コンパイルエラーなどのエラーメッセージは全て英語だ。
英語ができない奴に使いこなすことは難しいだろう。
0250デフォルトの名無しさん
NGNG> gccの場合、コンパイルエラーなどのエラーメッセージは全て英語だ。
いつの時代の話だ?gcc 3.1 は日本語がうざすぎるくらいだが。
0251デフォルトの名無しさん
NGNGなる。型名もしくは配列名が指定されていない。
0252デフォルトの名無しさん
NGNG0253デフォルトの名無しさん
NGNG> いつの時代の話だ?
では、Cで可変長配列が使えないことも「いつの時代の話だ?」
と煽っていいんですね?
0254デフォルトの名無しさん
NGNG語尾に:)がついていない。8点減点。
0256デフォルトの名無しさん
NGNG外部参照宣言はどこかのファイルに存在するものを参照する。そのどこかには自らのファイルも含まれる。
0257256
NGNG0258デフォルトの名無しさん
NGNGでもそれってブロックの最初でしか・・・。
0259デフォルトの名無しさん
NGNG> static charfoo[1000] = "HOEHOE";
コンパイルしたら、エラーになったよ。
a.c:3: invalid initializer
まぁこれはミスなんだろうが…
実は更にc.cというファイルがあって、そこに実体があるという罠。
それでもwarningがでるのはおかしいけど…
これ以上はwarningを貼ってもらうしかないね。
0260242
NGNGありがとうございます
チャレンジしてみます
0261デフォルトの名無しさん
NGNG0262デフォルトの名無しさん
NGNG\0,000-
0263デフォルトの名無しさん
NGNG社会・世評
http://natto.2ch.net/soc/
が詳しい。
0264デフォルトの名無しさん
NGNG> C言語っていくらですか?
いいえ、いくらではありません。:)
0265デフォルトの名無しさん
NGNG恐ろしいことに、昔のCとの互換性のために「型を省略したらint」が
適用されてしまって、static charfoo は static int charfoo と同じ
意味になってしまう。
invalid initializerになるのは、型が書いてないからじゃなくて、
intの変数を文字列で初期化しようとしたから。だから、
static charfoo[1000];
これはエラーにならなかったりする(warningくらいは出るが)。
もっと極端な話、
foo;
これだけでもint foo;と解釈されてエラーにならないんだよね。
0266251
NGNGああそうだった。longがlong intと見なされると同じだね。
0267デフォルトの名無しさん
NGNGこれだけでもint foo;と解釈されてエラーにならないんだよね。
これはウソ
0268デフォルトの名無しさん
NGNGgccではエラーにならないんだけど、コンパイラによるのかも。
0269デフォルトの名無しさん
NGNGgcc2.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どっかにお手本になるソースファイルはありませんか?
いろいろ探したんですけど、なかなか見つからなくて・・・
0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNG考える力のないものは再開発しかできないのか?
0274デフォルトの名無しさん
NGNGどんな環境でも使えるものを作るのは、Cだけでは大変だよ。
■ このスレッドは過去ログ倉庫に格納されています