2 :
デフォルトの名無しさん :2006/01/28(土) 10:13:20
乙
994 名前:976[sage] 投稿日:2006/01/28(土) 18:13:52 レルどうも なにやら話が盛り上がってますね なにやらってテメーが振った話だろボケが
ソートプログラムでけた。 関数は作れてないけど int main(void) long a[5],x=0,i,j; //配列の初期化 for(i=0;i<5;i++){ a[i]=0; } //値の入力 for(i=0;i<5;i++){ printf("%d回目の値の入力=\n",i+1); scanf("%d",&a[i]); } //値の比較 for(i=0;i<5;i++){ for(j=i+1;j<5;j++){ if(a[i]<=a[j]){ } else{ x=a[i]; a[i]=a[j]; a[j]=x; } } } //結果出力 for(i=0;i<5;i++){ printf("%d,",a[i]); } getch(); }
あぁここに書き込むときに改行が多いって出たから余計な改行消してたらmainの{が消えてる・・。
ひどいソースだ
なにこの糞ソース
ゴミのソースほど面白い…!
カレンダーの表示プログラムですがプロトタイプ宣言で、 不正な文字のエラーになってしまいます。 どこが問題なのか分かりません。指摘して頂きたいのですがお願いします。 コンパイラはBCC32です。 /*****ガウス記号のマクロ******/ #define FL(x) ((int)(x) > (x) ? (int)(x) - 1 : (int)(x)) int get_day(int ,int ,int ); //プロトタイプ宣言 /******メイン処理******/ int get_day(int y, int m, int d) //Y年M月D日の曜日を求める関数 { int yobi; yobi = (y + FL(y / 4) - FL(y / 100) + FL(y /400) + FL(2.6 * m + 1.6) + d) % 7; return yobi; }
15 :
デフォルトの名無しさん :2006/01/28(土) 20:28:20
気にするな、ソート如きで良いソースも悪いソースもあったもんじゃない 釣りか基地外
>>17 スペース全部消して見たら出来ました!!
やっと起動できるようになりました!
くだらないミスをしてしまい、すいませんでした(;´Д`)
本当にありがとうございました。
>>16 (1)意味もなくlong
(2)もし意味があってもscanf,printfでint型を指定している
(3)sort部分の比較でif(...){}else{...}となっている。普通に条件式を否定しろ
(4)#includeをしていない。
(5)getchなどという処理系依存の関数の使用
(6)Cのくせに最後にreturn 0;をしていない
以上の点をもってソート如きで悪いソースですが?
21 :
8 :2006/01/28(土) 20:59:33
>>19 1,2、前回のプログラムからの引用だった為書き換えミス
3、何か間違ってる?
4、省略(
>>9 参照)
5、結果出力後入力待ちにしている
6 mainがvoidのため不要
>>31 >6 mainがvoidのため不要
Σ(゚Д゚;エーッ!
>>21 int main に見えるのだが・・・。
>>21 >6
mainがvoidのため不要
>int main(void)
(ノ∀`)
25 :
22 :2006/01/28(土) 21:03:03
31 -> 21
>>19 (3) そもそも a[i]>a[j] にすればいい話。
>>21 >5、結果出力後入力待ちにしている
なんの反論にもなってないが…?
日本語ワカル?
>>27 (5) のツッコミは無理があると思った。
C99では return 0; いらない。 俺は書くけど。
> 5、結果出力後入力待ちにしている それは処理系依存の関数を使う理由にはならないが。 それ以前になんでそんなことしたいんだ? 画面がなくなっちゃうんですぅとかいう間抜けな答えは聞きたくないぞ?
31 :
デフォルトの名無しさん :2006/01/28(土) 21:43:59
>>22 -
落ち着いてひとつにまとめてレスしてくれ
前スレでCを勉強するために書いてるって言ってるし、「処理系に依存」とかそこまで知った事ではない。
getchは解説サイトに、プログラムの流れを途中途中で止める時によく使うし便利とあったから使ってるまで。
まぁ叩かれてるが
俺にとっては書き方があってるかどうか知りたかったからソース乗せたんだし勉強になってるからいいけど。
なんで偉そうなんだ(笑
ネット弁慶というやつですな
34 :
デフォルトの名無しさん :2006/01/28(土) 21:58:28
自演のにおいがする
単にツッコミきて逆切れしてるようにしか見えんが(笑
>>8 >>21 longの意味がない
returnで返していない
if文の改善
>>19 (3)はelseで否定の条件式は不要
longは常にサイズが同じだから使う意味はある intだと処理系で変わってしまう場合あり まぁ・・・・宿題とか勉強ならどうでもいいけどね
%lなってないってことで指定されたんだと思う
あら・・・擁護しようがないな
>longは常にサイズが同じ >longは常にサイズが同じ >longは常にサイズが同じ >longは常にサイズが同じ >longは常にサイズが同じ
longに意味があるなら
>>19 の1に対しては抱擁になってるよw
3とか4の指定あたりでおかしいと判断できるけど
>>41 Cは単に2ちゃんには書き込んでないってだけだと思うがw
Bはどうしようもないけどw
>>42 例えばPS2(ee-gcc)でのlongは8バイトだぞ
>>43 え?だから指定するまでもないのにおかしいなって
>>44 マジで?long4バイトぢゃないの?
つかえねぇ・・・今後全部変数ダブルにしたろか
>>45 あ、そゆことか
47 :
デフォルトの名無しさん :2006/01/28(土) 22:25:59
longのビット長>=intのビット長 仕様かこれかと
bit数を指定したい時はstdint.h ......と、堂々と言える時代に早くなってほしいなぁ。
stdint.h が使えるのが一番だけど、 無ければ自分で typedef すりゃいい。 サイズ固定なのにプリミティブ型直接使ってるような奴はクビ。
VCがサポートしない限りそんな時代は来ない
stdintとかfloat.hとか それ系、指定の方法がわからない(ノ´∀`*)
え?longって4バイトじゃないの? 4バイトとか8バイト固定したいときってどうすればいいの? 環境はWindows固定ということ前提にすると。
>>8 getchはconio.hをインクルードしないと使えないけど分かってるのかな
自分で適当な型をtypedefするしかないんじゃないの
55 :
デフォルトの名無しさん :2006/01/28(土) 23:33:01
もう、longもintもどっちにしろ環境依存なの? でも、charは1バイトのままなの? なんか俺の昔の記憶だと char 1バイト short 2バイト long 4バイト int 環境依存(Win32だと4バイト) float 4バイト(浮動小数点) double 8バイト(浮動小数点) で、注意するのはintだけだったという記憶があるんだけど 実際はそうじゃないってこと? 環境はWindows固定ということで頼む。
>>56 規格で決まっているのは、各型のバイト数の大小関係と、
sizeof(cahr)が1になると言うこと。
# ちなみに、CHAR_BITS(charのビット数)も環境依存
>>56 > 環境はWindows固定ということで頼む。
その時点で環境の依存について無視してるだろ、ボケ。
>>58 いや、とりあえず他の環境はそんなにかわることないし、
大抵Windowsにあわせてくる(移植楽だしね)から、
やっぱり、注目するべきはWindowsでしょ。これは現実の話(別にゴヒイキって話題じゃないよ)
>>57 おお、そうなんだ。
大小とcharのバイトが1としか決まってないとはしらなんだ・・・。
ありがとう。
もう、こだわらないでプログラムするよ。
>>56 floatも微妙に曲者
整数型との計算で制度落ちることある
doubleを使うべき
>>59 > とりあえず他の環境はそんなにかわることないし
変わるから環境依存な訳だし、
そもそも、環境依存で環境を特定してどうするのかと(ry
>>60 よっぽど使えないテキストで勉強したようだな。
本は複数読んでおけよ。
別にlongが4バイトだと思ってるのはそんなに悪くもないんじゃない? たとえ違う環境で8バイトになっててもメモリ使用量あがるだけだし intが常に4バイトって勘違いしてるのが問題なんだろ? 環境によってはもっと小さくなることがあるわけだし
型のサイズは規定してないけど INT_MAX等の定義ルールで CHAR_BIT 8 以上 SHRT_MAX 2^15 - 1 以上 INT_MAX 2^15 - 1 以上 LONG_MAX 2^31 - 1 以上 とあるので少なくとも char = 8bit 以上 short = 16bit 以上 int = 16bit 以上 long = 32bit 以上 は論理的に確定するね まぁこんなこと気にする暇があるなら、 stdint.hかそれ相当を自分で定義しろって結論になるけど
>>64 > たとえ違う環境で8バイトになっててもメモリ使用量あがるだけだし
> intが常に4バイトって勘違いしてるのが問題なんだろ?
どういう勉強をしたら、こんなアホな発言が出来るんですか?
いっそ基本データ型全部100バイトにでもしたれΨ(`∀´)Ψケケケ
>>64 > intが常に4バイトって勘違いしてるのが問題なんだろ?
違う。
typedefも使わずにサイズに依存したコードを書くことが問題。
winももうすぐ64bitOSが出るから、あと10年経つと今の試食版みたいな存在になるかもな
71 :
デフォルトの名無しさん :2006/01/29(日) 01:18:05
#include <stdint.h> int32_t a;
>>59 アホか。
整数型のサイズを決めてるのはコンパイラであって OS じゃない。
>>72 マジで?
例えばWin32APIをコンパイルしたとして、
そのコンパイラがlongを8バイトとすればlongは8バイトになっちゃうってこと?
つーことは、俺がlongを4バイトとして組んでたのはあくまでも、
VCのコンパイラ仕様にあわせただけであって、
Windowsに対応したわけではなかったわけ?
あ、そうかも。
そうだな。64BitOSでも
32Bitモードってのがあってこれまで作った奴も動くらしいしねぇ。
これってそういうこといってんのかな?
人の話を聞かないのは病気なのか?
なんだ、文盲か
>>76 どうせロートルがたまに自分のわかる話で
自分より知識なさそうなの見つけたからレスつけたんでしょ?
ほら、わかる範囲で語ってきなよw
78 :
デフォルトの名無しさん :2006/01/29(日) 02:41:21
ポインタって文章よんで学んでる分には別に難しく感じなかったけど、これを使いこなせるようになれってこと? ポインタ、ポインタノポインタ、ポインタノポインタノポインタまで理解はできたけど。
>>77 あぁもううるさい奴だな。
それぞれの型がどうなるかはコンパイラ依存だと言ってるだろう。
実行ファイルの状態でも型情報が C の形で表現されてる訳が無いだろうが。
全く、こういう奴いたら先ずクビだな。
>>78 の要約
『トリプルポインタは分かるけどクワドルプルポインタは分かりません >< 』
返答
『そんなこと言ってる時点で理解できてないのは明白です』
>>78 経験上、「理解できた」と軽々しく口にする奴ほど分かってない事が多い。
>>78 ポインタのポインタはポインタでしかないから、ポインタを正しく理解できているのなら
ポインタのポインタはそんなに難しくないと思う。まして、
ポインタのポインタのポインタはポインタのポインタと解釈できるのだから
ポインタのポインタのポインタのポインタになったところで大したことはない。
必要なら、適宜typedefでもしとけと。
わざわざ自演しなくていいよ 経験上この時間帯に二人にレスされることはめったにないから。 明日が休日だからという理由もあるかもしれないが。 とりあえず 「>軽々しく」と軽々しく判断した基準と。 疑うんなら力試しにでもなるような問題作れるなら出してみてよ
頭の中で理解している と 使いこなせる は別物? と言いたいわけで 理解できてるなら使いこなせる、か。
>>83 大丈夫、しばしばこの板で>80みたいなことを書いている漏れは、ここ最近のこのスレでは>82しか書いてないから。
>>83 >「>軽々しく」と軽々しく判断した基準
読んだだけで理解できたとか言ってる所だろw
87 :
デフォルトの名無しさん :2006/01/29(日) 03:09:06
>>86 本を熟読して、本についている絵をガンミしながら、頭の中フル回転で、さらに自分で試しながらコンパイルして、ポインタを理解したつもりだけど〜
って書けばよかったね。
言い方が悪かったようだ・・ 実際にプログラムにポインタを組み込む事はあるの?
あんただれ
きみもだれ
>>88 そこまで書けば、信用しなくもないが、
ポインタのポインタのポインタのポインタのポインタが何かくらいは分かるよな?
ポインタのポインタのポインタのポインタのメモリアドレスを格納した変数
アセンブラやるのが一番だろう。
95 :
!88 :2006/01/29(日) 03:26:02
>>92 ポインタ
どんなに修飾しようがただのポインタ。それ以上でもそれ以下でもない
(この文章を論理的に考えると空集合になるのは気づいても言ってはいけない)
Javaをやれば無問題 うはw漏れ頭いいww
JavaはCやってC++やってやるつもり。
>>93 よろしい。
んじゃ、次。
x, y を引数に取り、sqrt(x*x+y*y) と atan2(y, x) を返す関数を作れ。
ただし、構造体とグローバル変数は使わないこと。
x == 0 && y == 0 の場合は考慮しなくていい。
99 :
デフォルトの名無しさん :2006/01/29(日) 03:34:49
>>98 関数に仕様は?計算値はどうやって返すんだい?
>>98 ポインタ以前に言ってる意味が分かりません
sprtは平方根か何かだと思うけど・・atan2とか知らない
>>99 ポインタの問題なんだから・・・。
>>100 別に知らなくてもそのまま書けばいいだけだし、
何の関数かくらい調べられるはずだ。
102 :
デフォルトの名無しさん :2006/01/29(日) 03:44:48
横槍だけど
double func( double x, double y )
{
return sqrt(x*x+y*y) + atan2(y, x);
}
>>98 の文章の内容に一致する正解だと思うw
103 :
デフォルトの名無しさん :2006/01/29(日) 03:47:15
sprtはそのとおり平方根。 atan2はarctan。tanの逆関数。tan(θ)=y/x <=> θ=atan2(y, x)。
平方根の値とタンジェントの逆?の値をxとyに返す関数と言う事?
またまた横槍だけど atan関数がtanの逆関数 atan2は引数がxとyがあり、y/xのアークタンジェントを返す xのアークタンジェントとは違う
>>104 日本語出来ない人?
完全に一致してると思うが?
因みに”返す”なんだからリターンだろ
ポインタ渡しは、返すとは言わないよな?
なんでhypot()を使わないのだろう。
109 :
デフォルトの名無しさん :2006/01/29(日) 03:54:12
>>106 atan2がtanの逆関数といったのは数学的な意味ね。
tan(θ)=y/x <=> θ=atan2(y, x)。
じゃあ、変な関数だけど
void sqrt_and_atan2(double x, double y, double *_sqrt, double *_atan2)
{
*_sqrt = sqrt(x*x+y*y);
*_atan2 = atan2(y, x);
}
えーはっきりいえば、アークドラゴンも意味が分からないし
どういったプログラムなのかも分からない
ただ
>>102 を見たからかもしれないけど
void a(float x, float y)
{
return sqrt(x*x;y*y),atan2(x;y);
}
で
>>105 の様になるよね?
けどポインタをどこで使えばいいのかも分からないし、基本自体が意味不明
sqrtとatan2の引数間違えた
>>110 それはダメすぎだろう。一眠りしておいで。
俺にそんな意味のわからない問題を出すからこうなる
voidじゃなくてfloatか。 それともfloat→doubleにしないといけないの?
”返す”関数を作れる人は少ないねw 仕様が文章である限り、プログラム以前の問題が多いなw 言いたい事は sqrt(x*x+y*y) と atan2(y, x) の値を取得出切る関数じゃないの?w
>>107 sqrt(x*x+y*y) と atan2(y, x) を返せと言ったのに、
足した値を返してどうする。
アホか。死ね。
>>108 標準関数じゃないからこのスレでは御法度。
C99 ならあるけど、C99 は普及率低杉なので。
>>110 void で return 使ってどうやって値を返すのか。
しかも 2 つもの値を。
>>109 それであってるが、あんた
>>88 じゃないよな?
というか、
>>88 のレスはどれだ?
_のプリフィクスもってる時点でウンコ
因みに適当だが、
>>98 の文章通りの仕様で
限りなく言いたい事を組んだ関
enum {
FUNC_TYPE_SQRT,
FUNC_TYPE_ATAN2,
FUNC_TYPE_MAX
} FUNC_TYPE;
double func( FUNC_TYPE type, double x, double y )
{
double ret = 0.0;
switch( type ) {
case FUNC_TYPE_SQRT:
ret = sqrt(x*x+y*y);
break;
case FUNC_TYPE_ATAN2:
ret = atan2(y, x);
break;
}
return ret;
}
>>116 float a(float x, float y);
float b(float x, float y)
main()
{
float x=0,y=0;
x=a();
y=b();
return 0;
}
float a(float x, float y)
{
return sqrt(x*x+y*y)
}
float b(float x,float y)
{
return atan2(x+y)
}
>>116 ”sqrt(x*x+y*y) と atan2(y, x) を返せ”
それを個別だとも、足してはいけないとも記述は一切ないが?
そのさ…、自分の中の当り前って感覚をどうに出来ない?w
ドキュメントとか作れない人だろw
>>117 命名規則には立ち入るべからず。
_ + (大文字 or _) から始まるのなら話は別だが。
>>118-119 はいはい、ワロスワロス。
>>120 Kusakabe みたいなこと言うなよ。
199じゃないの? 198とかのソース見た時点でわけわかめなのに分かるわけない。
>>119 確かに、それも文章通りの正解だw
感服した
今、一生懸命に
>>98 の文章能力の欠如を
当り前の普通の様に言ってるレス主は98?
通常の仕事では、文章で説明なんて当然。
それが、あやふやなのに、その態度は頂けない。
つーか、仕事出来ないだろw
仕事で
>>98 みたいなの見たら直接聞きに行くから別に桶
滅多につかまらない、他会社のSE様だったら?w
引数からポインタを使って返そうとかいったらネタバレになるだろ。
そこを考えるのも問題のうち。
というか、先ず前提として「ポインタの問題」ってのがあるのに、
ポインタ使わない答えが「文章通り」とかあり得ない。
逆に言えば、ポインタ使ってるなら、
足したの返すのは論外としても、
>>118-119 みたいな仕様でも正解と見なす。
問題があやふやな分、そこは寛容にいくよ。
>>127 88は119なわけだけど正解なんだ、やった・・
ポインタをどこでどう使えばいいのかも分からない(知識の問題で)からどうしようもない
>>127 いや、待て118-119はポインタ使ってないw
131 :
130 :2006/01/29(日) 04:29:41
いや、すまん。日本語の構文解析ミスだ。気にせず流しおいて
>というか、先ず前提として「ポインタの問題」ってのがあるのに、
>ポインタ使わない答えが「文章通り」とかあり得ない。
それが自分の中の当り前を決め付けで、説明をしないで仕事を進める駄目人間の特徴。
お前さん、仕事できないタイプだねw
>足したの返すのは論外としても、
足しても
>>98 の何処にも引っかからないが?
引っかかるのは、アンタの当り前だろw
>逆に言えば、ポインタ使ってるなら、
>足したの返すのは論外としても、
>
>>118-119 みたいな仕様でも正解と見なす。
118と119のどこがポインタを使ってるか説明を求めるw
>>129 いや、不正解だって・・・。
ポインタ使ってないっしょ。
>>129 (もしも)ポインタを使ってるなら(現実は違うけど)正解と書いてますから
残念ながら不正解ということですね。
うむ、構文解析を俺も一回ミスって
>>118-119 が正解と読み間違えた
>>132 >それが自分の中の当り前を決め付けで
流れ読めよ・・・。
>足しても
>>98 の何処にも引っかからないが?
a と b を返せと言われて a + b を返す奴がいたら
気が狂ってるとしか思えない。
>118と119のどこがポインタを使ってるか説明を求めるw
・・・。
>引数からポインタを使って返そうとかいったらネタバレになるだろ。 >そこを考えるのも問題のうち。 >というか、先ず前提として「ポインタの問題」ってのがあるのに、 大いなる矛盾だなw ポインタを使って返そうとかいったらネタバレ なのに 先ず前提として「ポインタの問題」 なのか… ww
aとbを個別で欲しい仕様があるのに a と b を返せとしか書かない奴がいたら 気が狂ってるとしか思えない。 aとbが分けられないだけで a + b でも a と b を返しているだろw
>>136 たぶん、どこでポインタを使うかを考える問題なんじゃない。
少なくとも正解がわかれば、ポインタがなぜ必要かが分かるのだからね。
まとめ ポインタの使い道
複数の返り値を返せない貧弱言語のCの欠陥を誤魔化すのに使える。
あとは動的なデータ構造を構成したいときとかだな
流石にもう相手してられんわ。
なんか問題を求めたところからすごい流れになったもんだ float a(float x, float y); float b(float x, float y); main() { float *x,*y; x=0; y=0; *x=a(); *y=b(); return 0; } float a(float x, float y) { return sqrt(x*x+y*y); } float b(float x,float y); { return atan2(x+y) } これでポインタもOK・・?
>>142 Null Pointer Exception (言語違うけど)
>>142 ダメ。
x や y を 0 (ヌルポインタ)で初期化してるのに
*x や *y に代入しちゃダメ。
xとyの前に*をつけた場合は?
>>142 が関数のポインタ渡しの解答、と言えるのも
>>98 と
>>132 の言い分があるからだねw
ばっかじゃねーのw
文章がしっかり書けないのに
流れとか、それらしい言い訳を後から言うからだ
ほんとに、仕事出来ない人間だろ
とりあえず、
>>109 が出題者の意図を最大限に酌んだ答えで、
>>139 が出題者の意図を最大限に酌んだ解説だから、
読んどくように。
>>146 はいはい、ワロスワロス。
"出題者の意図を最大限に酌んだ" これを仕事で当てはめられる ”出題者”と同義の立場の人は、主に仕事が出来ないと言われますw
float a(float x, float y);
float b(float x, float y);
main()
{
float *x,*y;
*x=0;
*y=0;
*x=a(1.0f,1.0f);
*y=b(1.0f,1.0f);
return 0;
}
float a(float x, float y)
{
return sqrt(x*x+y*y);
}
float b(float x,float y);
{
return atan2(x+y)
}
>>98 と
>>132 から、これが関数のポインタ渡し
と言えてしまうのか……
考えさせることが目的の「問題」と 間違いが無いことを要求する「仕事」を 同列で語ってる奴テライタス
考えさせることが目的の「問題」でも 間違いが無いことを要求するものだが… 間違っても考えれば良いってか? 日本、馬鹿量産だな……
それって間違った内容を新人に教えて 言い訳が、”考え方を言ったんだよ” って言い訳してる、使えない奴だなw
分からなければヒント与えつつ 誘導していくつもりだったのに 横から答えられたからこうなったんだよw まあ、間違えてもいいから考えて、 そして正解にたどり着けば、 単に正解を教えるだけの場合より 理解が深まるというものなのだ。
>分からなければヒント与えつつ >誘導していくつもりだったのに と、考える為の文章が拙いのは意味が違うと思うが? 分からなければ”文章を変更しつつ” 誘導していくつもりだったのに じゃないの?w
>>155 はぁ・・・。
お前、どうしようもない奴だな。
これは「ポインタを理解してる」かどうかの試金石となる問題なんだから、
先ずかなりぼやかしてでも意図が酌めるかどうか確認しただけだ。
「ポインタを理解してる」ならあの文章で十分意図は酌めるし、
実際そういう人がいる。
あんた、ダメダメだ。
もう相手にしないよ。
>>132 で、文章の受け取り方を間違った人間が沢山いる時点で
文章能力に欠如があるのは一目瞭然なんだが…
>「ポインタを理解してる」ならあの文章で十分意図は酌めるし、 >実際そういう人がいる。 これを前提に物事を語る奴が、問題を引き起こすんだよw 実際そういう人がいる。 あんた、ダメダメだ。 もう相手にしないよ。
究極の馬鹿だな 誰の事か分るだろ こう言ってるのと同義って事かなww で、お互いが相手を”究極の馬鹿”と思うわけだ 文章は正しく書こうなw
>「ポインタを理解してる」ならあの文章で十分意図は酌めるし、 >実際そういう人がいる。 この姿勢を散々指摘されてるのを自覚してないんだ…… 友達同士の雑談ならともかく、どんな場面(学校、会社)だとうろNGだろ まして、教えるって場合はなお更だ
>>159 w の無い人は w のある人とは別人? 自演じゃないよね?
とりあえず、
>>78 から一言一句逃さず全部読んで理解しろ。特に
>>83 。
力試しとか試金石とかそういうところ全部読み飛ばされても、
困るとしか言いようが無い。
正直な所、流れも把握してないやつまで理解させる気はないよ。
流れも把握してないのに勝手に横レスして訳分からんとか、ふざけてるのかと。
話の流れを理解するのと 話の流れが無いと成立しな文章を書く事が指摘されるのは まったくの別問題だと思う…… なんども言うが、 話の流れがあるからって略しても良い部分と悪い部分があり アンタは略してはいけない部分を略したって事だよ 話の流れがあるからって、問題の内容自体を略しちゃいけないだろ 例えば、食べ物の話をしてて ”悪い物ってなんだ?” って質問に、 ”殺人” と答えたら、 話の流れを理解してない食べ物に関して悪い事だよ って言い出すような奴は、ほぼ他人とコミュニケーションが上手く出来ない
>>162 いや、どう考えてもその場合は後者のコミュニケーション能力不足だろw
文脈からの推論くらいしろよ。
>正直な所、流れも把握してないやつまで理解させる気はないよ。 じゃあ、そう言う奴にはレスを返すなよ 見苦しいよ、お前
自分の言ってる事を伝えられない事を コミュニケーション能力不足と言うのであって 文章の意味、内容的に合っている解答なのに 文章製作者の勝手な前提を汲めない事を コミュニケーション能力不足とは言わない
>>162 数学のテストでそんなに親切な指定があるか?
この公式を使えだの、こういう道筋で解きなさいだの。
普通は無いだろ。
そういうのを「知っているか」「理解してるか」「思いつくか」を見るものだし、
出題範囲って前提条件も酌んで答える事も要求されるだろ。
それがテストってもんだ。
隠した仕様があるのは、その仕様が定石で、
その仕様を答えさせることも問題の一部だったから。
それはもう
>>127 で言ってる話だ。
>>163 その理屈が成り立つなら
ヒューザーの小嶋社長が、国会や住民説明会で言ってる意味不明な内容も
流れを理解してない国民のコミュニケーション能力不足なのか……
>数学のテストでそんなに親切な指定があるか? >この公式を使えだの、こういう道筋で解きなさいだの。 >普通は無いだろ。 >そういうのを「知っているか」「理解してるか」「思いつくか」を見るものだし、 >出題範囲って前提条件も酌んで答える事も要求されるだろ。 >それがテストってもんだ。 馬鹿確定? 数学のテストは、他に答え様が無いように設問される。 当然、文章問題もな。 それで、文章、内容ともにあってるなら正解なる。 で、あとで設問者がこってり絞られるんだよw
つーか、センター試験レベルの 数学の問題を解いた事ないのは判った
>隠した仕様があるのは、その仕様が定石で、
>その仕様を答えさせることも問題の一部だったから。
>それはもう
>>127 で言ってる話だ。
ポインタ渡しを隠す為に、
”返す”と不適切な言葉を使うのは
値を得る方法と言って濁したりする事とは
まったく別の問題だと思う
百歩譲って、あんたの理屈が成り立っても
あんたの文章が、あんたの理屈道理じゃ無いんだから
文章能力が無いのを認めなよ…
因みに、小学生の掛け算の算数の問題で 足算で全部解いても、正解を貰ったよけどね 今の授業が掛け算を教えてるとか 流れを読めとか先生は言わなかったぞw 以下、中高大でも同じ それがテスト設問者の能力だろ で、それがテストってもんだw
>>169 数学のテストの答えなんて、
出題範囲超えればいくらでもバリエーションがあるし、
出題範囲内でも色々解法があることも多い。
エレガントな解法もあれば、愚鈍な解法もある。
最終的な答えが1つでないこともある。
例を上げさせるような問題の場合はな。
日本じゃ滅多にないだろうが。
この問題の曖昧さは、
>>127 の事情がある以上、ある程度は避けられない。
だから、その曖昧さの範囲内であれば一応正解とせざるを得ない。
でも、その答えにはエレガントなものもあれば、愚鈍なものもある。
だから、愚鈍な解法を提示されれば、一応それでもできるけど、
もっといい方法がある・・・とヒントを出しつつ誘導していくわけだ。
普通のテストと違うのは、質問を限定的に受け付けられるってこった。
>>171 「計算結果は、第3、4引数からポインタを介して返される」
どっかおかしいか?
逆に言うと、 ”この公式を使えだの、こういう道筋で解きなさいだの” を言わずに、それを使わざるを得ない問題を出せないレベルの設問者って事でFA?
>>174 じゃあ、お前が問題作れよ。10分で。
あんまり長いといなくなるかもしれないぞ?
>「計算結果は、第3、4引数からポインタを介して返される」 初 め て 提 示 さ れ た 内 容 で す 初 め て 提 示 さ れ た 内 容 で す 初 め て 提 示 さ れ た 内 容 で す 三回言っちゃたよw
>>176 「返す」という言葉がおかしいかどうか聞いてるだけだ。
x, y を引数に取り、sqrt(x*x+y*y) と atan2(y, x) の値を個別に得る関数を一つ作れ。 ただし、構造体とグローバル変数は使わないこと。 関数の戻り値はvoid型とすること。 x == 0 && y == 0 の場合は考慮しなくていい。
>>178 うん。戻り値の型が void だってのは言った方が良かったね。
それは認める。
関数を通しての、ポインタ渡しの値の取得を ”返す”とは言わないだろw
さすがム板。 憂さ晴らしコバンザメプログラマー住人の揚げ足取りと 教えてあげる君教師ヅラの逆切れ持論全開の全面戦争勃発か。 お前らキモイよ
散々指摘していた部分を汲んだ問題再提示が、10分もかからなかった件について それをあっさり認めたにも関らず、今までの指摘を認めない件について
GetClientRect ウィンドウのクライアント領域の左上端と右下端の座標を返します。座標は、クライアント座標で返されます。 lpRect RECT 構造体へのポインタを指定します。この構造体にクライアント領域の座標が格納されます。left メンバと top メンバは 0 になります。right メンバと bottom メンバは、クライアント領域の幅と高さになります。 戻り値 関数が成功すると、0 以外の値が返ります。 関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、GetLastError 関数を使います。 関数の説明と戻り値には”返す”とあるが、引数には一切”返す”と使われないww
>>183 再提示を求めてたんじゃなくて、新しく問題を作る事を想定してたけど。
今までの議論を踏まえて考えられるんだから、
そりゃ再提示くらいならすぐできるわさ。
>>184 つまらん揚げ足取りだな。
それに、その論理なら
>>98 には問題がない事になる。
ポインタ渡しの説明は 取得とか格納されます だよな、普通は ”lpRectを介して”ウィンドウのクライアント領域の左上端と右下端の座標を返します。 なんて書かれてるならともかく…
文脈が微妙に違うだろ。 もう疲れた。 もういいよ。あとは好きに遊んでて。
>>185 …お前…つまらん揚げ足取りじゃなくて
ポインタの重要なニュアンスだぞ?
日本語的にも、関数説明の”返す”と戻り値説明の”返す”はまったく意味が違うだろ
「計算結果は、第3、4引数からポインタを介して返される」
これは、どう見ても
戻り値説明で使われてる”返す”を、関数説明で使われる”返す”と混同してる文章だw
そもそも、英語ドキュメントを 馬鹿翻訳したものを自論の根拠に提示してる時点で ”…もしかして…ポインタを詳しく知らない?” ってレベルかも?
The GetClientRect function retrieves the coordinates of a window's client area. The client coordinates specify the upper-left and lower-right corners of the client area. Because client coordinates are relative to the upper-left corner of a window's client area, the coordinates of the upper-left corner are (0,0). lpRect [out] Pointer to a RECT structure that receives the client coordinates. The left and top members are zero. The right and bottom members contain the width and height of the window. Return Value If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. 因みに原文だ。”返す”と言う意味をよ〜く考えようねw
191 :
88 :2006/01/29(日) 07:10:15
まだやってたのか
もう相手しないとか、疲れたとか言いながら 真っ赤になって、鼻の穴膨らまして 反論の文章を練ってるんだよw
なんちゅうか、ポインタの問題であんなの出す時点でうんこだな。 人に教える能力はゼロだよ。 とりあえず88はこんなセンパイに出会ったら適当にあしらって相手にしないが吉だね。 引数arrとnを取り、arrに大きさnのint配列として利用できる領域を確保し、 その成否を返す(失敗=0、成功=非0)関数を作れ とか言ってみる。
int func( int* arr, int n ) { if( !arr && n > 0 ) { arr = (int*)malloc( sizeof(int) * n ); if( arr ) { memset( arr, 0, sizeof(int) * n ); return 1; } } return 0; }
はや(怪しいけど)。では上を(1)として (2) ではそれを使用するコードを作れ (3) (1)(2)でキャストを使用している場合、キャストの不要な形で作り直せ。 「キャストを使用している」は、引数渡しでキャストしている部分を含む。 ただしmallocの戻り値を格納するときに使用しているキャストはそのままでよい。
#define ARR_NUM (10) int func( int* arr, int n ); int main( void ) { int i; int* arr = NULL; if( func( arr, ARR_NUM ) != 0 ) { for( i = 0; i<ARR_NUM; i++ ) { *(arr + i) = i; } for ( i = 0; i<ARR_NUM; i++ ) { printf( "value[%d] is %d\n", i, arr[i] ); } free( arr ); } return 0; }
やっぱ怪しかったね。 それ、おちるよ。
わりい。成否返しているのにテストしてなかった。80点だな。
サンクスです。作り直しました。 int func( int* arr, int n ) { int* temp = NULL; if( !arr && n > 0 ) { temp = (int*)malloc( sizeof(int) * n ); if( temp ) { memset( temp, 0, sizeof(int) * n ); arr = temp; return 1; } } return 0; }
そいえば超68kさんの日記のとこでポインタについて面白い日記公開してたなぁ
ロング型で質問なんですが引数等に、OLなどを多々見かけますが 「L」を付ける意味はなんですか? どんな効果なのかを教えてください。
30L = (long)30
>>203 ロング型にキャストした整数なんですね。解答ありがとうございました!!
>>204 違う。
「long型の整数リテラル」と言う事。
>>205 整数リテラルなのですか。何度も解答すいません。ありがとうございます!!
>>98 言いたい事は解るが、その文章だと、回答は以下になる。
double *fnc( double x, double y )
{
static double ans[2];
ans[0] = sqrt( x*x+y*y );
ans[1] = atan2( y, x );
return ans;
}
>>208 親切に有難う御座います・゚・(つД`)・゚・ サイトを見て回りたいと思います。
随分と昨日は楽しそうだったな 早く寝て損した
211 :
デフォルトの名無しさん :2006/01/29(日) 14:44:04
質問です。このプログラムで「いやん あはん やめてぇ〜」を sexmanual.txtから読み込みたいのですが、想定以上にいやがられます。 カンマで区切ったのがいけなかったのでしょうか。原因が分からず仕事が進みません。 #include <stdio.h> char* test[10]; void save(void){ FILE *file; file=fopen("sexmanual.txt","w"); fprintf(file,"%s,%s,%s",test[1],test[2],test[3]); fclose(file); } void load(void){ FILE *file; file=fopen("sexmanual.txt","r"); fscanf(file,"%s,%s,%s",test[1],test[2],test[3]); fclose(file); } void main(void) { test[1]="いやん"; test[2]="あはん"; test[3]="やめてぇ〜"; save(); load(); printf("%s %s %s",test[1],test[2],test[3]); }
>>211 > 質問です。このプログラムで「いやん あはん やめてぇ〜」を
> sexmanual.txtから読み込みたいのですが、想定以上にいやがられます。
童貞捨てて経験積めば嫌がられなくなると思うよ。
あと全角スペースが入ってるのはなんで?
213 :
デフォルトの名無しさん :2006/01/29(日) 15:17:45
>>212 ワロタwww早く童貞が捨てられるよう頑張ってみますw
上は打ち間違えました。
「いやん あはん やめてぇ〜」を「いやん,あはん,やめてぇ〜」に読み替えてください。
それにしてもやはり私が童貞だから・・・orz。
配列の取り扱い
>>211 test[1] とかに読み込もうとしてるからだね。
test[1] には "いやん" のアドレスが入ってるわけだが、
ここに書き込もうとすることは、
文字列リテラルの置いてある領域に書き込もうとしてることになる。
文字列リテラルの置いてある領域には普通書き込めず、エラーになる。
まあ、環境によっては書き込める場合もあるけど、
だからといってこんな事はやっちゃだめ。
書き込みたいならバッファ確保しとくべきだなぁ。
217 :
デフォルトの名無しさん :2006/01/29(日) 15:29:14
>>215 レスありがとうございます。
えっとsave()はtest[]でやってもいいけどload()ではtest[]を使うと
文字を入れてある領域に不正がでるから違う変数で読み込ませてそれをtest[]に
コピーすればいいってことですか?C言語はむつかしいですね。
%sに埋め込むのは 十分なバッファが確保されているchar型配列へのアドレスだよ
220 :
デフォルトの名無しさん :2006/01/29(日) 15:37:58
皆様のおかげで解決しました。原因はアドレスだったのですか・・。 本当に感謝します。ありがとうございました。m(- -) m
不安だから、一応最終形を見せて欲しいな。
結局のところ、>98はこういうことなんじゃないか? /* 直行座標から極座標に変換(1) */ void r2p(double x, double y, double * r, double * theta) { if (r == NULL || theta == NULL) { return; } *r = hypot(x, y); *theta = atan2(y, x); } /* 直行座標から極座標に変換(2) */ double * r2p(double x, double y) { static double polar[2]; polar[0] = hypot(x, y); polar[1] = atan2(y, x); return polar; }
223 :
デフォルトの名無しさん :2006/01/29(日) 17:44:00
バイナリデータをfread()で配列int d[100]に読み込んで int i; int a; for (i=0;i<100;i++){ if (d[i] == 0xb1){ a=i; } } とやって、ある特定のデータがきたらそこの配列の番号をしりたいのですが うまくいきません。 どうすればいいでしょう?
>>223 特定のデータがfreadで全く読み込まれてないから、一回もaが変わらず(エラーになる)。
int長は環境にもよるから、unsigned char d[100]で100バイト読み込みましょう。
fread(&d, sizeof(int), 100, FILE); とかやってんなら、FILEからsizeof(int)=(32ビットPCだとだいたい4、環境依存)バイトずつだとか読み込まれるから。 さらにx86とかだとリトリエンディアンになるからry 全部int型で書き込んだファイルをそう読みたいんなら他のところが違うんだろう。
227 :
223 :2006/01/29(日) 18:00:57
>>225 ,226
ありがとうございました。
intが原因でした。
228 :
211 :2006/01/29(日) 18:27:36
>>221 #include <stdio.h>
char *test;
char *test2;
char *test3;
char t[100];
char t2[100];
char t3[100];
void save(void){
FILE *file;
file=fopen("sexmanual.txt","w");
fprintf(file,"%s,%s,%s",test,test2,test3);
fclose(file);
}
void load(void){
FILE *file;
file=fopen("sexmanual.txt","r+");
fscanf(file,"%s,%s,%s",&t,&t2,&t3);
fclose(file);
}
void main(void)
{
test="いやん";
test2="あはん";
test3="やめてぇ〜";
save();
load();
printf("%s %s %s",t,t2,t3);
}
229 :
211 :2006/01/29(日) 18:28:14
これでいかがでしょうか。実は先ほどたまたま運良く結果が出ていたのをうまくいったと勘違いしていた様です。 すぐに気がついたのですが、皆さんの好意を無駄にしたくないと思って入門書の配列とポインタのところや皆さんの アドバイスを何度も読み直してさきほどようやく原因を究明してコードを完成させました。 これでようやく私の作りたいものができそうです。改めてありがとうございました。
void load(void){ FILE *file; file=fopen("sexmanual.txt","r+"); fscanf(file,"%s,%s,%s",&t,&t2,&t3); fclose(file); } tとt2とt3はchar型の要素が100個の配列で宣言されている Cでは面白い特性があって char t[100];と宣言された場合 tはt[0] t[1] t[2] ...という配列の先頭アドレス つまり t == &t[0]と等価なのである しかしそのコードではポインタのポインタを引数として与えているので我輩の脳内コンパイラではエラーが起こるであろう
ポインタをグローバルで唱えて値も代入していない時点でウンコなんだが
232 :
質問 :2006/01/29(日) 20:59:32
gclのソースを弄って、gclを立ち上げるときに、 自動的にこちらの指定したlispのコードを実行させるようにしたいのですが、 どうすればいいでしょうか?
>>230 ポインタのポインタじゃなくて、配列へのポインタ。
アドレスは一緒なんで、動作的には問題は起こらない。
>>232 CommonLisp スレで聞け。
まじでー char t[100] scanf("%s",&t);ってscanf("%s",&t[0]); ってやってるって認識される訳か
235 :
232 :2006/01/29(日) 21:12:58
>>233 lispスレでは、スレ違いと言われました。 実行時に、ユーザ指定のコードを実行させるようにする方法は、 わかんないでしょうか?
>>234 違う。&t は &t だ。
型は int (*)[100] になる。
&t[0] の型は int * 。
>>235 スレ違いと言ってる人もいれば、
答えてる人もいるような感じだなぁ。
俺は Lisp スレでスレ違いではないと思うが
(GCL 固有のスレがあるわけでもないし)、
とりあえずマニュアル精読しろって言われてるんじゃないのかな?
>>236 だから
char lpStr[128];と唱えて
fscanf(stdin,"%s",&lpStr);
ってのは不味くない?
238 :
232 :2006/01/29(日) 21:33:53
common Lispの本を読んでも、仕様は書いてあっても、 処理系の解説は載ってませんからね。 gclのコードは大きすぎで、mainとか読んでもわかんないしで、 困ってるところです。 stdinにfprintfかなんかで、書き込んで、実行させる方法とかないでしょうか?
>>237 lpStr を渡すのが最善なのは分かるよ。
一応 &lpStr でも動くと言ってるだけ。
ただ、厳密なことを言えば、
char * と char (*)[128] とでアドレッシングが違う可能性があるから、
環境によっては動かない可能性はあるね。
>>238 CommonLisp の本でもなく、
gcl のコードでもなく、
gcl のマニュアルってのはないの?
知らんけど。
240 :
238 :2006/01/29(日) 21:57:08
処理系のマニュアルはないです。
って、質問を読み違えてた。 ソースをいじって実現したいのか。 それなら確かに C の質問か・・・。 でも、それはちゃんとソースを読んで 頑張ってちょうだいとしか言いようが無い気が。
たとえばaabdcefdsaasaaebbfcccdbcded見たいな感じにならんでるものから 一文字ずつアスキーコードに変えて配列に入れたいんですけど なんだか混乱してきたのでやり方おしえてもらえませんか?
>>242 どこまでできて、どこまでできてないのか。
ちゃんとソースを提示する事。
>>242 char配列なら大抵はASCIIコードで入ってると思うが?
245 :
デフォルトの名無しさん :2006/01/29(日) 23:11:14
当方PERLしか出来ないんですが C言語を始めるにあたりお勧めの解説書教えて下さい
248 :
デフォルトの名無しさん :2006/01/29(日) 23:27:03
それは英文法辞書持たされて理解しろてのと同じ残虐な行為ですよ-_-;
>>1 に書籍スレに行けと書いてあるのに
文字を読めない人間に本を紹介しても無駄無駄
>>249 「何を伝えるか?」までは誰にも教えることの出来ない事だから、
それで問題ないと思うが?
>>250 あなたが何を伝えたいのかがわからない。
>>200 色いろ違うが(arrを0テストしてはいけない、ゼロ埋めする必要はない)、
基本的な間違いとして、それではarrに入れた値は全く呼出側に戻されないぞ。
引数で値を戻したい場合は、それを格納する領域のアドレスを戻したい型のポインタで受け取り、
値を格納する場合にはそのポインタを参照はがしして格納する。
戻したい型をTとすると、
func(T* pt){
*pt = (値);
}
で、呼び出し側は
T t;
func(&t);
ここでは戻したい型はint型配列として使用できる領域。
ということはつまり、n個のint型を格納できる連続するメモリの先頭アドレスであり、その型はint*。
従って、Tをint*に置き換え、関数側は
func(int* *pt){
*pt = (値);
}
で、呼出側は
int* t;
func(&t);
となる。
254 :
デフォルトの名無しさん :2006/01/30(月) 00:50:09
CなんていいからJavaを始めなさい
>>254 5年前なら釣られてやったものを
といいつつ釣られてみる
3年前はペンギンでした
259 :
242 :2006/01/30(月) 02:10:33
>>243 全くできておりません。
文字読み込んで数字として配列に存在させたいのです。
>>259 1.文字列を読み込む
2.格納されたをループさせてint型配列に一つづつぶち込む
だけでいいと思うんだが。
261 :
242 :2006/01/30(月) 02:17:28
>>260 その2の過程では一度char形配列にいれたものを
=でint形配列と結べばいいんですかね?
262 :
デフォルトの名無しさん :2006/01/30(月) 02:26:29
>>242 あのねえ。char型は数値なんだよ。
char c = 'a';
ってなってるとして
printf("%d\n", c);
ってやるとだな、97が出て来るんだよ。ASCIIならばな。
263 :
デフォルトの名無しさん :2006/01/30(月) 02:28:25
でだな。たとえば char s[] = "abc"; ってなってるとするだろ。これで printf("%d %d %d\n", s[0], s[1], s[2]); なんてやるとだな、97 98 99 って出るわけだよ。 文字として出したいなら puts(s); とかな。色々あるがな。 文字コード出したいなら %d とかで出せばいいだけ。
264 :
242 :2006/01/30(月) 02:40:03
>>263 その後の処理としては文字を並び替えたいのです
たとえばabdcbac→aabbccdみたいな形に。
それでただ数字ならソートの部分は配列使ってできています。
ただそのプログラムは読み取るデータが一つずつ改行されているので
改行されずにそのまま並んでいる文字を一つずつ数字で配列にいれたい
ということで質問させてもらいました。
質問させてください。 使用ソフトはvisualC++なんですが、 配列を使って、例えば double A[000],B[000]; int i; という風に定義するとします。 すると、AとBの000の数字はどこまで大きくできるんでしょうか? 当方、なぜか40000以上にするとエラーでvisualC++がとまってしまいます。 原因の分かる方、ご教授願いますm(__)m
266 :
デフォルトの名無しさん :2006/01/30(月) 03:03:57
268 :
デフォルトの名無しさん :2006/01/30(月) 03:07:51
>>265 自動変数はおそらくスタックに作られるのでスタックの限界までしか作れないと
思っておけ。もちろんスタックを使わないようなコードを作るコンパイラもある
かも知れないが、この頃のメジャーなやつはだいたいスタックを使っている。
逆に言うと、スタックを大きくしてしまえばその分だけ大きく作れる。
しかしそこまでしなければならないということは何か設計がおかしいような
気もする。場合にもよるが。
どうしても必要なら static にしてしまうとか、関数の外に出してしまうとか、
malloc() で確保するようにするとか、とにかく自動変数以外の変数にしろ。
>>267 すいません。使用ソフトはvisualCなんですが、
C言語なんで質問してもいいかな…と思いまして。
原因がわかればなにとぞご助言を。
270 :
デフォルトの名無しさん :2006/01/30(月) 03:19:55
>>270 親切にありがとうございました。助かりますm(__)m
迷惑かけてすいません。以後、気をつけます。
なんでそんなに偉そうなの? 死ねよ
お前らダメプログラマーが唯一見下せる素人を気分悪くしてんじゃねーよ また来ていただかないとダメだろ
274 :
242 :2006/01/30(月) 06:27:20
なんか普通にやってみたらできました。 すんまそ
>>273 ×気分悪くして
○気分悪くして
じゃないのか?
277 :
276 :2006/01/30(月) 13:23:15
いや意味和姦ね ○気分悪くさせて じゃないのか?つか俺莫迦?
一人でオナニーはヤメレ
オナニーは普通は一人でするもんじゃないのか? それとも複数人でオナニーすれば無問題なのか?
280 :
デフォルトの名無しさん :2006/01/30(月) 14:41:56
281 :
デフォルトの名無しさん :2006/01/30(月) 14:46:48
ど素人の俺に教えてください。 LINUXで動くプログラムの処理速度をμ秒単位で計測したいのですが どの関数で時間を取得すればいいとですか?
>>281 UNIXプログラミング質問スレってのがあるけど、とりあえず
gettimeofday()
>>281 プログラムが始まってから終わるまででいいのであれば time コマンドを使え。
stdio.h の中は ↓ のようになっていたんですが、これは2重インクルードガード というやつですよね?! #if _MSC_VER > 1000 #pragma once // ● #endif #ifndef _INC_STDIO // ◎ #define _INC_STDIO それで今回コメント●の部分で疑問を感じました。 ここは、バージョンによってコンパイルするだのしないだのを分岐しているんだと考えてます。 コメント◎の部分と●の部分は期待する結果は同じはずです。 なら、●の部分はいらないと思うのが・・・なぜ 意味がなんとか通じた方いらっしゃいましたらご解説のほどを!!!
>>285 スレ違いだけど。
#pragma onceはプリプロセッサが同じファイルを2度以上インクルードしないという情報を知らされる分、
普通のインクルードガードよりもプリプロセスにかかるオーバーヘッドの削減が期待できる(はず)。
しかし#pragma onceが使えるコンパイラは限られている(というより独自拡張だ)から、
使えるかどうかを確かめるための#if _MSC_VER > 1000がある。
そして#pragma onceが使えないプリプロセッサのために
通常のインクルードガード(#ifndef _INC_STDIO)も用意されている。
>>285 「将来的には◎の方を廃止してしまいたい」と言う、強い願望の現れ
ではあるまいか?
>>286-287 そうなのですか。ありがとうございました! すっきり致しましたです そして勉強になりました!
Linuxなんですが(Winでも一緒?) # include <signal.h> (void)signal(SIGALRM, func); とやりたいんですが、 funcに複数の引数を持たせる事は出来ないのでしょうか。 funcからある変数の中身を弄りたいんですが、 その変数をfuncにpointerで渡したいんです。 その変数をglobalにすればfuncの引数は1つでいいのですが、 変数はglobalに出したくないので。 複数引数が駄目なら、何か同等の機能を持たせる方法はありますか?
全然わかりません><
>>289 多分、確保したリソース系を解放したいんだよな
ポインタをstatic変数で持って、解放する関数を用意するしかないと思う。
getHoge();とかしてシングルトンもどきという手もあるけど
Cでそこまでする必要があるのかという疑問がある
292 :
289 :2006/01/30(月) 21:59:36
>>291 実はC++で書いてるんでsingletonもどきでもいいのですが、
使ってる関数がCのものなのでここで聞きました。
signalはsignalでも、boost::signalなら関数オブジェクトが使えるんだけどな。
ぶっちゃけ、何気に読んでて勉強になる俺がいる
295 :
デフォルトの名無しさん :2006/01/31(火) 00:10:04
組み合わせを表示するプログラムを作りたいのですが、誰か分かる人いますか? 例えば、(a,b,c)(b,c,k)(h,j,u)のような文字のグループが与えられていて、 同じ文字は重複せずに組み合わせていくプログラムなんですが・・・。 わかる人いたら教えてください!!お願いします!!
(1,2,3)(4,5,6)(7,8,9)
297 :
デフォルトの名無しさん :2006/01/31(火) 00:20:00
>296 C言語で書くとどのような感じになりますか? よろしければ教えていただきたいのですが・・・。
>>295 ,297
考えられる全ての組み合わせを作る
その過程で重複するのは除く
まず組み合わせの計算式 4C2とかについて なぜ二つの枠がある時 4P2 / 2!をしなければいけないのか理解してね
どっちかっつーと数学だな あとはいかにCで表現するかか。 俺は数学苦手だ
302 :
デフォルトの名無しさん :2006/01/31(火) 01:02:34
初学者には基本的に開発環境が無料で手に入るのと、解説本は豊富な言語がいいと思う。 ただ、方向性で何から始めるべきかかわるよね。 将来、PGになりたいのなら、断然Java。潰しもきくし。 C/C++でプログラミングの基礎を覚えるのは難しいよ。 本当は無料版さえあればDelphiがおすすめなんだけどね。 Webデザイナーになりたいなら、HTMLとJavaScriptから入ってPHPに進めばいい。 日曜プログラマでさもよくば趣味を生かして仕事の効率化を図りたい人にはVB(VBA)が一応おすすめ。 ただ今後はC#にとって代わられる可能性も否めないので。
プログラミングってなんだっけ? やりたいことを表現する為の規則が言語の文法でしょ?
304 :
デフォルトの名無しさん :2006/01/31(火) 01:18:34
やりたいことがプログラミングである場合はどう 表現すりゃいいの?
やりたいことがプログラミングな場合それはオナニーだろ
ジッサイ、組み込み系とUNIXとWindowsSDKしか得意分野ないじゃん
windowsだったらあんまりC使うメリットなさげ。。
今や。
ゲームとか
Cだけ覚えてても、金に結びつきズラス orz
311 :
デフォルトの名無しさん :2006/01/31(火) 03:29:51
>>307 Windows のデバイスドライバ作るときとか・・・。
312 :
デフォルトの名無しさん :2006/01/31(火) 03:30:50
>>311 C言語一年くらいかかって覚えて、制御系の会社へ面接行ったら
「共に成長していきましょう。電気電子で」とか言われますた
>>302 言語の前に、コンピュータの基礎知識を身につけて欲しい。
CPU・記憶装置・入力装置・出力装置・バスなどはもちろん、
メモリイメージやN進数、CPUの動作概要など、
制御すべきコンピュータがどういうものなのか?
を理解しないで言語を勉強しても、効率が悪いと思う。
316 :
デフォルトの名無しさん :2006/01/31(火) 09:48:37
ハードウェアの基本的なことがまるでわかってないど素人でも 習いたてのカタコト言語で書いたコードがそこそこ「効率」よかったりはするな 問題は習ったことから少しでも外れるとお手上げってとこだ スクラッチで書くことはできてもバグが直せないとか 応答時間を制約された途端トンズラとかな
int foo(); と int foo( void ); の違い教えて。 速度とかでなく 何故、この記述でやるのかっての
>>317 voidは引数ねぇよってことで呼び出しのとき引数指定したらエラー
何も書かないのは何を何個引数として呼び出そうが怒られなかったハズ
その処理系はchar型は符号付き1bit変数で定義されていたとして なぜsigned charと宣言できるのかと同じ質問
>>319 >その処理系はchar型は符号付き1bit変数で定義されていたとして
アリエナス
>>319 CHAR_BIT >= 8 は規格で定められていた気がする
ビットフィールドが1bit幅の時、
なぜ、signed intと宣言できるのか?
という例えのほうが現実味があるな
突っ込まないでwwwwwwwwwwwww 8bitだったね
>>317 引数の型チェックを行うか行わないかの違い。
a = a + 1 というのと、 a += 1 はどっちが早い?
>>324 5文字 a = a + 1
4文字 a += 1
3文字 ++a
結論 a += 1、のほうが1文字少ないのでa = a + 1よりは早くタイプできる。
ただし、++aのほうがさらにタイプ数が少ない。
コードの速度ならどれもCなら差が発生するほうが珍しい
volatileで宣言していたら違うコード吐くかもしれないね。
どれもこれもincだけで済ませてるみたいだよ。 volatileつけても同様。メモリーにしまう処理が増えるだけ。
抽象的な質問をしてしまい、申し訳ない。
>>324 その程度だとどんなCPU向けのコンパイラでも最適化したら同じだと思うぞ。
なので実行時に違いはないんじゃないの?
てか、その程度を最適化できないコンパイラはクソ。
>>328 ああ。そりゃちょっとだけ遅いかも。
でもCPUによっては同じかも。
mallocで延々確保続けたら最後どうなんの?
nullを返す
あ、そっか確保失敗したらNULLだったか
337 :
デフォルトの名無しさん :2006/01/31(火) 16:15:34
char cd= 0xB6; unsigned short ud; と宣言されてる時、udに0xB6が入る様にするには、どの様にキャストすれば良いですか? ud = (unsigned int)cd; // ud = 0xFFB6・・・
君の環境はchar型はsignedで定義されてるんだと思うよ つまり君の環境でのcharが表現できる数値の範囲は128〜-127ぐらい そして0xB6ってのは128以上だからMSB(符号ビット)が入れ替わっちゃって変な意図しない値が代入されてるんだよ だからunsigned charと宣言すれば解決するはず
339 :
337 :2006/01/31(火) 16:36:54
実は、文字の操作(UNICODE変換等)を行いたいのですが、 charをunsigned charで宣言すると、あっちこっち直さなきゃならないので・・・ どうしても、char型を一時的に符号無視して、unsigned short(16bit)に拡張したいのです キャストなら、なんとかなるかなと思いまして・・・
だってsigned charで宣言してる時点で0xB6なんて値は不正な値だよ? 最初から欠陥プログラムだったんだよ 解決方法はいくらでもあるけど、それを実行するとあっちが立たないになるからお勧めできない
>>340 >だってsigned charで宣言してる時点で0xB6なんて値は不正な値だよ?
意図してるかどうかは別として、不正ではないと思うが。
>>337 ud = (unsigned char)cd;
> だってsigned charで宣言してる時点で0xB6なんて値は不正な値だよ? お前の頭が欠陥品だ。 お前がこのスレでレスをするのはお勧めできない。半年ROMれ
へぇ文句たれてる暇あったら 彼に解決策でも与えなよ
誤りを積極的に正すのは解決策を与える以上に重要。
346 :
337 :2006/01/31(火) 17:15:33
347 :
デフォルトの名無しさん :2006/01/31(火) 17:15:55
子供たちよ 332 みたいにはなるなよ 最適化の幻想と実際の差にあごが外れるのが怖くて アセンブラろくに読まずにてきとーこくようなクルクルパーは 日常の言動から誰も本気で信用してないぞ
平気だよ もうCPUとかメモリとか理解しなくてもプログラミングできる時代だから まぁCはメモリ知らないとダメだけど
349 :
デフォルトの名無しさん :2006/01/31(火) 17:21:01
実行環境に CPU やメモリが必ずしも存在しない時代だかんね
>>339 コンパイラにchar を unsigned にするか signed にするかの
オプションついてないか?
ついてればラッキー, なければ地道に直す
ud = cd & 0xff; いかんか? いかんか? キャストすべきか? んじゃこうだ。 ud = (unsigned short) (cd & 0xff); 可読性悪いか? んじゃこうだ。 ud = (unsigned short) (cd & 0x00ff);
>>316 コードの書き方で応答時間意識するのって組み込みのひと?
応答時間はコード云々じゃなくて、ネットワークの話だった気が、、。
355 :
デフォルトの名無しさん :2006/01/31(火) 21:07:06
356 :
デフォルトの名無しさん :2006/01/31(火) 21:17:34
316の
ncurseで現在のカーソル位置を得るにはどうすれば良いのでしょうか。
358 :
357 :2006/01/31(火) 22:31:06
自己解決しました。getyxですね。すみません。
数値計算やっても応答時間意識する. data 突っ込んで から output 出てくるまでの時間って意味だけどね. 通常, 数値計算なんてのはアルゴリズムの選択がとんで もなくものを言うんだけど, 大量にループがあるのが 当たり前なので, ループ内のコードに関しては結構気を 使ってコーディングする.
361 :
デフォルトの名無しさん :2006/02/01(水) 00:18:06
char m[] = "■"; char t[] = "■"; というような変数宣言をして, 二つ同時(m, t 共に)にパラメータを溜めていき二つとも 20個まで溜めたいのですがやり方がわかりません ちなみに「二つ同時に」というのはパラメータ開始時が二つ同時というだけです 終わりはどちらが先に溜まって終わるかというのは分からないようにしたい 同期を取るというのも調べてみましたが…よく分からないので教えてください
>>361 パラメータを溜めるとはどういうことか?もっと詳しく。
363 :
361 :2006/02/01(水) 00:38:49
インストーラのような感じです mの場合:■■■■■・・・■(20個まで溜まる) tの場合:■■■■■・・・ で・これの開始時は同じだが終わりはどちらが先に終わるか分からないと
エスパーかもーん
乱数で割ったあまりが偶数か奇数か判断して改行を入れたらどうかねー それならきっちり二行になるとおもわれ。
char ms[64]={0,}; char ts[64]={0,}; int mc = 0; int tc = 0; ・・・ if(mc<20){ strcat(ms,m); mc++; } if(tc<20){ strcat(ts,t); tc++; } よく分からん。
367 :
361 :2006/02/01(水) 01:34:39
それで合っていると思うのでちゃんと書いていただけるとうれしいです・・
ヒント:ubuntu
369 :
デフォルトの名無しさん :2006/02/01(水) 02:10:30
APIを勉強してるんですがBccDevなどのGUI環境のCコンパイラに簡単にGUIのウィンドウやメニューなどを作れる機能があります。 将来仕事していくに当たってはこれに頼らず自分でAPIの基礎から学んだ方が良いのでしょうか? それともGUIなどはそういった枠組みがあるものを組み立てるような存在なのでしょうか?
>>369 > 将来仕事していくに当たってはこれに頼らず自分でAPIの基礎から
> 学んだ方が良いのでしょうか?
一から作れる能力を養っておくに越した事はない。しかし何も知らないのは厳しい。
> それともGUIなどはそういった枠組みがあるものを組み立てるような
> 存在なのでしょうか?
意味が分からない。
プログラミングなんてできても仕事は降ってこないから
すいません。ちょっと便乗させて下さい。 char a = "■"; printf("%c",a); "■"の出力がD,Hに化けてしまうんですが ■の変換指定子を教えて下さい。
%aでやってみて駄目でした。
まちがえた' ' OTL
でも、ASCIIとかJISのコード表に載ってない文字だから printf("■"); で、やらないと駄目かな。。
>>372 char a[] = "■";
printf( "%s", a );
>>372 char の変数にダブルクォーテーションで括って文字列へのポインタを入れてはいかん。
それ以前の問題として、今のところだいたいの有名なCPU用コンパイラでは、
charは8ビットだ。なので'■'は入らない。エンコードによりけりだがこの
文字は16ビット〜24ビットないとダメだ。
ということで wchar_t などがあるわけだが、こういう複数バイト文字だったと
しても文字列のまま扱うのならできる。
378 :
デフォルトの名無しさん :2006/02/01(水) 15:09:04
>>370 >> 将来仕事していくに当たってはこれに頼らず自分でAPIの基礎から
>> 学んだ方が良いのでしょうか?
>一から作れる能力を養っておくに越した事はない。しかし何も知らないのは厳しい。
なるほど。
>> それともGUIなどはそういった枠組みがあるものを組み立てるような
>> 存在なのでしょうか?
>意味が分からない。
GUIを作る場合
いちいちソースを覚えるような存在ではなく、あらかじめ準備されてるソースなどをコピペしてそれを組み立てるような存在
または、ソースをいちから入力するものではなくBccFormみたいに簡単なGUI操作で作るもの
なのかなと。
379 :
デフォルトの名無しさん :2006/02/01(水) 16:10:04
intなどビット幅が広い変数に入っている値の下位8ビットを unsigned char の変数に入れたいのですが、どうすればいいですか?
int a; unsigned char b; (中略) b = (unsigned char)(a & 0xff);
381 :
379 :2006/02/01(水) 16:24:17
>>380 ありがとうございます。
おかげさまで、ばっちりイキました。
>>380 b = (unsigned char)a;
でいいだろ。
CHARBIT >= 8 と言いたかった?
385 :
デフォルトの名無しさん :2006/02/01(水) 18:17:37
いつかcharが8バイトを超える日がやってくるのだろうか
charは1バイトって決まってるからな。 1バイトが何ビットかというのはまた違う話だし。
Unicodeが統一されたら8byteを超えるかな? 恐らく統一はされないと思うけど
この世の全ての文字に対応したら8バイトでも足りないじゃなかろうか
391 :
デフォルトの名無しさん :2006/02/01(水) 19:37:21
393 :
デフォルトの名無しさん :2006/02/01(水) 20:07:02
>>392 あ? typo じゃなかったのか (ゲラゲラ
fscanfで読み込んだデータ(名前、体重等)を構造体(5人分)に格納するには どうしたらいいんですか?
>>394 初心者向けの本を買ってきたらいいですよ。
激しく同意
変数に全角文字「あ」を代入ってどうやればいいですか? char *c; c='あ'; にしても変な文字になる・・。
char s[] = "あ"; or wchar_t s[] = L"あ";
このスレタイの無意味さにワロタ
>>398 なるほど1次元配列が未定な変数に代入する時は宣言時じゃないといけないのか・・
それと全角文字は""になるのか
ありがとう
402 :
デフォルトの名無しさん :2006/02/01(水) 22:07:07
char s[]; s[]="あ"; だとエラー s="あ"; でもエラー
>>400 そうだよ
全角文字は特殊でね""で囲まないといけないんだよ
Lはノイズだから無視してね♥
文字コードについてもっと知るべきだな
406 :
デフォルトの名無しさん :2006/02/01(水) 23:02:12
自作関数って何のために使うんですか? 何度も呼び出す際は便利だとは思うけど、ほかにどのような利便性があるのでしょうか? また長文ではない・・簡単なソースの場合はmainに駄々がきでもいいのかな 会社とか実用的な場ではどうやってるんでしょうか
>>406 自作関数使わずに数千、数万行にわたるソース書いてみろ
イヤでも分かる
なるほど、それは理解できます。 他には?
>>408 例えば、処理の中に
status = security_chk(hoge);
if(FALSE == status)
{
return ERROR;
}
とかあったら、「あーなんかセキュリティのチェックしてんだな〜」くらい分かる
全体として処理フローが分かりやすくなったりな。
>>409 なるほど、流れが分かりやすくなりますね。
>>400 全角文字は通常マルチバイト(たとえば2バイトとか)で表現されているから、
charには格納できない。だから、文字「列」として扱うしかない。
> if(FALSE == status) キモイ
414 :
デフォルトの名無しさん :2006/02/01(水) 23:39:30
>>408 いや、理解できているようには見えない
その証として、今のあなたに聞くが
>自作関数って何のために使うんですか?
長文のある部分を要約して隠すことがなぜ「わかりやすく」なると思うんだ?
これは構造化プログラミングをしていない場合であっても、
ものすごく大事なことなんだが、あなたはどう思ったんだ?
>>413 流し読みしてて気づかなかった
というかおまい良く気づいたな
>>413 よくあるテクだよ。
好きになれない人もいるし、好んで使う人もいる。
あんま宗教論争起こしそうなレスするなよ。
>>414 main(){
処理1
処理2
〜中略〜
処理99999999998
処理99999999999
}
よりも
main(){
関数1()
関数2()
〜中略〜
関数20()
}
関数1(){
処理1
処理2
}
〜中略〜
関数20(){
処理99999999998
処理99999999999
}
後者の方が本体であるmainの流れが分かり安くなるからじゃないの
また同じ処理をする場合関数を呼ぶだけでいいから(
>>406 )
あと関数の名前でどんな処理をするのかが分かる(
>>409 )
> if(FALSE == status) 遺憾の念を禁じ得ない
IDが出ないのを良いことに粘着してる香具師が1名いるな
>>406 > 自作関数って何のために使うんですか?
「利用可能な物をどの様にして有効に活用するか?」
それを考えることもプログラマの仕事ではないかね?
何とかとハサミは使いよう、と言うだろ?
「何のために使うのか?」
それは、使う人が考えるのであって、
他人に教わるものではない。
他人から得られることは「他人はどう使っているのか?」であって、
「あなたにとってその使い方が最善かどうか」は、
あなたにしか判断できないことだ。
そして、「あなたが何に使うか?」もあなた自身が考えることだ。
なぜそこで、「僕がメインディッシュになってやる!」 と言わない
423 :
デフォルトの名無しさん :2006/02/02(木) 00:18:09
>>421 >それを考えることもプログラマの仕事ではないかね?
他人の意見も聞く事も成長に繋がると思います。
>何とかとハサミは使いよう、と言うだろ?
何とかってなんですか?気になりますので人に発言する時はきちんと覚えている言葉を使ってください。
>それは、使う人が考えるのであって、 他人に教わるものではない。
何故ですか?あなたは他人の考え方、料理の仕方など参考にしようと考えた事はありませんか?
>他人から得られることは「他人はどう使っているのか?」であって、
だから「会社とか実用的な場ではどうやってるんでしょうか」と聞いているけど読んだのかな。
>「あなたにとってその使い方が最善かどうか」は、 あなたにしか判断できないことだ
そうだね。けどそんな事聞いてもいないし、言われるまでもないですけど何を断言しているのですか?
>そして、「あなたが何に使うか?」もあなた自身が考えることだ。
上の発言と同じ意味だと思うけど2度言う必要はあったのですか?
それで別にあなたに言われるもまでもなく使う時に考えますよ。
そういうのをおせっかいと言います。
質問です。。。 #include <stdio.h> int main(void) { printf("hello,world\n") return 0; } hello.cという名前で、Cドライブのctestの中にあります。 こういう基礎中の基礎をやっているのですが、 コマンドプロンプトで、 C:\ctest>bcc32 hello.c と、コンパイル?してもhello,woridが表示されません。 教材だと表示されているのですが。。。 ご指摘お願いします
>>424 (1) printfの末尾のセミコロン抜け
(2) コンパイルしただけではだめ。できたexeを実行する。
ありがとうございます! セミコロン忘れてました^^; とりあえずexe実行してみます
つーかbcpad使え
bcc developerってツール使うとGUIで簡単にコンパイルや編集できるよ
無料のVC++使えばよくね?
430 :
424 :2006/02/02(木) 00:50:54
すみmせん・・ C:\ctest>bcc32 hello.cでも C:\ctest>gcc hello.cでも exe化できないのですが、どうすれば・・・
432 :
424 :2006/02/02(木) 01:01:32
>>430 えっと、>>424の状況で、できたexe実行しろと指摘を頂いたので、 本を見てみると、 「Windowsの場合 C:\ctest>gcc hello.c これでコンパイルできますが、UNIXの場合と異なり、 実行系s期ファイル名はディフォルトでa.exeになります C:\ctest>a.exeもしくはC:\ctest>a で実行できます」 と書いてあったので、 C:\ctest>gcc hello.c でexeファイルにしてから、コンパイルと思ったのですが、何かが違うようです。。 ’gcc’は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチファイルとして認識されていません。 とのこと。・・
まずは、PC初心者板へいけ。
434 :
デフォルトの名無しさん :2006/02/02(木) 05:44:17
>>417 int a0;
main()
{
for(a0 = 0; a0 < 10; a0++)
{
a1();
}
}
a1()
{
a = 0;
}
馬鹿げたことに見えるかも知れないが
数千行からのプログラムではやってしまいがちなミスを
単純化したものだ
407 によってか否かはわからんが
なぜ関数化するのかが理解できたのなら
このミスの根底にあるものを指摘できるはず
>>434 とりあえずコンパイルエラーだな
ちゃんとプロトタイプ宣言汁
436 :
デフォルトの名無しさん :2006/02/02(木) 06:05:31
>>435 エラーの意味わかってる?
他に警告ってのもあるな
437 :
デフォルトの名無しさん :2006/02/02(木) 06:07:13
> 0 = 0; a0 < 10; a0++
438 :
デフォルトの名無しさん :2006/02/02(木) 06:07:30
あ、これか s/a = 0;/a0 = 0;/ 関数原型に関するあるスタイルを知らないのはこっちのせいじゃないが
440 :
デフォルトの名無しさん :2006/02/02(木) 09:10:01
>>439 なぜ、グローバル変数を使ってはいけないんだ?
あらゆる場所から使えるってことは、 グローバル変数にまつわるバグはあらゆる場所に 埋め込まれうるという事だ。
442 :
デフォルトの名無しさん :2006/02/02(木) 09:15:32
で、話もどるが、なぜ関数化するんだ?
関数化出来ない事を考えればいいだろ。
444 :
デフォルトの名無しさん :2006/02/02(木) 09:29:42
ちなみに 414, 434, 436, 438, 440, 442 は、 406 または似た立場の者に対する発言なんで お間違いのないように
445 :
デフォルトの名無しさん :2006/02/02(木) 09:56:48
sqrt(X)という平方根を求める計算をしてるんですが、 Xの値が整数になったときに-1.#INF00とエラーになってしまいます 回避するにはどうすればいいんでしょうか?
ちゃんと math.h インクルードしてる?
>>442 Cは関数型プログラムサポートしてるから、標準ライブラリ使うのだってmain()から関数呼び出してるっしょ?
別にひとりで組むのならmain()関数一本でもいいと思うけど、標準ライブラリ使って効率よくプログラム書きたいのなら、
そんなひとの為に「関数」は必要だった。
それだけみたい。無理に自作関数作らなくても、main()関数一本のみのコードがわかりやすいなら必要ない。 中にはmain()に処理を全部詰め込んだ方が分かり易い。ってひともいるらしいし。
449 :
デフォルトの名無しさん :2006/02/02(木) 13:33:00
test(){ calloc } void main(){ test(); } 上記のように関数内でcallocを使った場合freeした方がいいんでしょうか? それともstatic変数のように自動的に開放されるのでしょうか?
451 :
デフォルトの名無しさん :2006/02/02(木) 13:41:31
>>450 そうなのですか・・・・・・・・・・ありがとうございます
まぁ。「利用可能な物をどの様にして有効に活用するか?」 って考えなんじゃないの?
走り続けるんでないならfreeなんかせんでもいいとは思うけどね
455 :
デフォルトの名無しさん :2006/02/02(木) 14:14:54
配列の質問なんですが、 int i, a[i]; (a[10]とかなら当然いいんですが) これはダメなんですか?家のコンパイラだと定型式がないとか出てきて無理なんですが・・・
>>455 その書き方に対応していないコンパイラでは駄目
>>456 対応してるの教えてもらえませんか?・・・
C99対応なら使える っつーか、使うな
え〜!! 学校だといけるので困るんですよ・・・
俺は困らない
>>447 > Cは関数型プログラムサポートしてるから
まさか Functional Programming の事ではないよな?
465 :
デフォルトの名無しさん :2006/02/02(木) 15:10:03
>>447 =448 か?
>中にはmain()に処理を全部詰め込んだ方が分かり易い。
どうやら話が循環したようだな
いいからコンパイラを main だけで書いてみろよ
別にコンパイラでなくてもいいが数千行かそれ以上の main をな
できれば途中でやめて他の人に続きを頼んでみるといい
>ってひともいるらしいし。
そんな奴のコードを引き継がされてみたいか?
やだやだぁ alloc系使わないとやだぁ
ってかどんなプログラムでもmain()は20行以下にするべきだろう。 何万行もあったら後から死ぬほど読みにくいぞ。
大学で間に合わせ用にmainの中身1000行越えるの作ったが本当にありがとうございました状態になった 改良する気はもうない
あるデータファイルを読み込んで、そのファイル内に出て来た管理番号の順に数値を与える。 というプログラムを作ろうと思っています。 ここで、管理番号は「英字+数字5文字」の6字からなっているのですが、 この管理番号の6文字のみをファイルから抜き出して配列に格納するにはどのようにすれば良いのでしょうか? 分かる方がいましたら教えてください。よろしくお願いします。 ちなみに、例としてデータファイルの内容は下記のようになっています。 --------------------------------------------- 文字列(長さは各行ごと異なる) 管理番号 日付 : : ---------------------------------------------
>>467 main以外に関数使ったほうが逆に分かりにくくない?
と初心者は思う
ひとつの関数で済ます=変数の9割がグローバルと言う事 これ程恐ろしい事はない
グローバルマンセーニダ━━━━━━<ヽ`∀´>━━━━━━ !!!!!
でも20行以下はいいすぎ 200行以下にしとき
>>473 教条主義的に行数制限するのは如何な最中とは思うが、
目安としてなら200行よりは20行の方がいい。
初心者なんですがC言語で質問があります。 突然 mkdir でフォルダが作れなくなってしまいました。 エラーメッセージは「ユーザーまたはグループのクオータを超えることはできません」 とでます。どうにかならないでしょうか?お願いします。
>>475 C言語の質問じゃねえし、丁寧にメッセージ出てるじゃないか
「ユーザーまたはグループのクオータを超えることはできません」ってとこが わけわからんのです。 ちなみにスレ違いなんでしょうか?
スレ違い
ほな、どこいったらエエの??
480 :
デフォルトの名無しさん :2006/02/02(木) 16:36:17
>>414 ,434
なぜ人が「分かった」という返答に対して「お前は分かっていない」と決め付けるような事ができるわけ?
これはこの業種特有の性格なの?
この前のポインタの時も分かったというレスに対して「分かっていない」→結果「分かっていた」んだが同一人物なのか?
こう説明したがりの上から目線の。
普段職場で「分かっていない」と上司にこき使われてるそれらの反動かな
むりやりっぽい感じもするけどいいんでない? 盤面でかくなったらきついかもだけど
483 :
デフォルトの名無しさん :2006/02/02(木) 17:21:04
>>480 よく読んでね
414 の目にどう映ったかしか書いてないでしょ
それが正しいかどうかを反問で確かめようともしているよね
で、今のところ帰ってきた返事からはますます見間違いではなさそうに思えている
434 でもそんなに難しいことは聞いてないよ
現に 441 あたり、ようやくいい線ついてきたと思った矢先
次のレスで元の木阿弥に戻っちまった
上から目線が気に入らないのはあなたの勝手だが
悪いが互角にやり合える相手に見えてないもので
>>455 > int i, a[i];
藻前は、この時点で「i」にどんな値が入っているか判るか?
「i」は初期化されていないから、
何個の配列が確保されるか判らないがいいのか?
さすがにそんな質問じゃ無いだろ
おまえら心の中だけで言うのもやさしさですよ
489 :
デフォルトの名無しさん :2006/02/02(木) 17:43:51
>>483 よく読んでね??
>414 の目にどう映ったかしか書いてないでしょ
で?だから勝手に決め付けるなって話だけど?
そもそも
>>408 の2行のレスに対して
>>414 あの2行でどう見えたもくそもない あ、エスパーですか
そして
>>414 の自分の出した反問にも関わらず、答え
>>417 をスルーして
>>434 の発言
それで何か勘違いしているようだが
>>414 のレス以降、レスはしてないわけだが?
>>441 やその後のレスなんて知ったことではない
他人の発言を見て勝手に木阿弥にされてもね
>上から目線が気に入らないのはあなたの勝手だが
>悪いが互角にやり合える相手に見えてないもので
上から目線は否定しないわけか
そうやって見下してる時点で、あんたは他人の発言を理解することはできないよ
部下のやってることにたいして「お前は分かっていない・できていない」と言って自分の他人への理解力のなさから部下の言ってることを理解できていない
まるでワンマン部長と同じだよ
491 :
デフォルトの名無しさん :2006/02/02(木) 17:50:05
ポインタを理解していないとか言って下手な問題を出して散々叩かれてた奴と同一の悪寒がする
492 :
481 :2006/02/02(木) 17:52:03
>>482 そうですか、よかったぁ・・
自分ひとりでもくもくとやってきたもんですから他から見たら変なソースになってないかどうか不安だったもんで
ちなみにアルゴリズムというんでしょうか処理の仕方は変えないとしてソース自体の改善点をあげるとしたらどういったところがあるでしょうか?
493 :
デフォルトの名無しさん :2006/02/02(木) 17:58:25
>>489 再び、よく読んでね
あなたが解ってないかどうかは、こちらから見てって立場をはっきり示してるでしょ
違うのなら違うと思わせる発言をすればいい
今のところそれがないわけだが 441 があなたではないなら、なおさらだね
それこそこっちはエスパーじゃないんだから突っ張るだけじゃ伝わらないよ
ここはプログラム技術板なんで、技術的な話がどのくらい噛み合うかが論客の主要な価値であって
今のあなたはそれを低く見られているのに悪態までつくとクレーマーさながらだよ、およしなさい
こんな所でイチャイチャするな!!
久々のフレームか?これぞCスレの醍醐味だぜ で、何を議論してんの?
>>492 ざっとしか見てないけどチェック関数がごり押し過ぎるか
盤面広げるとかすると書くのきつい
ついでにそれで行くとしてもif文の最初のa[][]&&部分必要ないような・・・
>>493 君が間違っているように見える。とにかく二人とも別でやってくださいね。
では質問とかどうぞ。
>>492 いや、あちこち拙い。
言語仕様上の(警告レベルの)問題点が2点、悪魔が鼻から出る問題点が1点、
誤入力で暴走する問題点が1点、可読性の観点での問題点が2点、
衒学的なファイル管理上の問題点が1点あるな。
>>498 それ厳しいだろ
多分随分前に来た○×の盤面表示わかりませんの初心者でしょこの人
>>481 間が悪かったようだね、可哀想に。
コードはイイ感じ。プログラムセンスがあるようだ。ただし、デバグが甘い。
数字以外の入力があった場合の対処法を覚えないと、使い物にならないよ。
>>502 確かにおかしい。
_test なんて名前を使っているのもおかしいw
ユーザー定義にアンダーバーを頭に付けるのはタブーだぞ。
>>502 構造体の中身に触れられたくない時とか、
コンパイル時の依存を断ち切るのに、結構良く使う普通のテクニック。
>>504 そんなこと出来たんですか。
ありがとうございます。
>>502 > 普通はヘッダファイルに実体を書きませんか?
全然おかしくないぞ。
お前に見せるとろくな事をしないんで見せない。
FILE構造体とかがどちらかというと変なだけ
507 :
481 :2006/02/02(木) 18:44:07
>>496 確かにこれ以上チェックの条件増やしていくのは厳しくなりますね・・
>>500 数字以外の場合〜の問題点は対処しきれてませんね
正直そこまではいいかと思ってましたが考えて見ます
509 :
498 :2006/02/02(木) 18:46:06
>>492 一応指摘しておいたほうがよさそうなところだけ掻い摘んで。
>int a[3][3]={0},fase=0;
・二次元配列の初期化は二重に括弧を使うべき。
→int a[3][3] = {{0}}; int fase = 0;
※そりゃそうと、faseって何?
> return a[3][3];
・配列の範囲外をアクセスしてはいけない。
※そもそも戻した値を使ってないなら戻り値の型はvoidでよかろう。
> scanf("%d",&i);
・scanf()は用心して使うべき。
※fgets()とatoi()/strtol()/sscanf()を組み合わせるのが無難か。
> if(i<0||i>2||j<0||j>2)
> puts("1〜3までの値を入力してください。");
> else if(a[i][j]==1||a[i][j]==2)
> puts("そこはすでに入力済みです。");
> else break;
・ブロック化した方が、修正するときのミスも防止できる。
>if(a[i][j]==1)
>b[i][j]='O';
>else if(a[i][j]==2)
>b[i][j]='X';
> else
> b[i][j]=' ';
> printf("%c ",b[i][j]);
・b配列に入れる必然性がない。if-elseが読み難い。
※一時変数に入れるだけならcharの単純変数でいいし、配列を使用するとすっきりするだろう。
>>509 シミュレーションGAMEとかでプレイヤーフェーズとかあるあれじゃない?
スペル知らないけど
あー、phase? どっちかと言うと、turnな気がするが。
512 :
481 :2006/02/02(木) 19:41:03
>>508 んーオセロ作りたいといってた人は私以外にも何人かいたみたいですが
基礎を学んだだけで実力つけるためにゲーム作ってみようといったものです。
それで最初はオセロを作る予定だったけどまだ技術的に無理だったからマルバツにのりかえたって話してました。
>>509 参考にさせていただきます。
・配列の範囲外をアクセスしてはいけない。
・b配列に入れる必然性がない。
ってところはまだよく理解できてないところが有りますが・・。
faseはフェイズのつもりでしたが誤字だったかな。
フェーズ フェイズ phase
>>498 言語仕様上の(警告レベルの)問題点が2点って?
514 :
デフォルトの名無しさん :2006/02/02(木) 19:46:03
>※fgets()とatoi()/strtol()/sscanf()を組み合わせるのが無難か。 その「用心」ができない人たちのポピュラーな対応らしいが はっきり言って、どれ使おうがそいつが書く限り気休めの域を出ないだろ てきとーこかずに仕様をちゃんと確認して使うって基本がない以上ね
scanf("%[123]",&i); 1,2,3以外入力拒否になる,では?
>>515 そも、それでは「数字以外を入力すると暴走」と同じ現象になる。
#scanf()が使いづらいのは、入力を拒否することにあるというのが判らないなら使わん方がいい。
>>514 少なくとも暴走するよりはましではないか?
>>513 二次元配列の問題とコメント文字。
#いや、C99なら別にいいのだが。
>>512 >・配列の範囲外をアクセスしてはいけない。
a[3][3]はどこを指すか考えてみるといい。そこは、アクセス禁止だ。
>・b配列に入れる必然性がない。
例えば、char b;と定義して、if (a[i][j] == 1) b = 'O'; else if (a[i][j] == 2) b = 'X'; else b = ' ';でことが足りる。
配列にする必要はない。
或いは、 char const b[] = " OX";と定義してprintf("%c ", b[a[i][j]]);でも充分。
517 :
デフォルトの名無しさん :2006/02/02(木) 20:06:17
>少なくとも暴走するよりはましではないか? ああマシだね おまえさんはプログラムを作るんじゃなく買った方がマシだ
この説明したがりの上から目線って ポインタ問題で叩かれ、そしてさっき喧嘩していたやつなのか?
>>518 漏れのことなら違うよん。
#って書く辺り、「説明したがり」の自覚がないでもないらしい。
>>517 やけに絡むなぁ。ではどうしろと?
520 :
デフォルトの名無しさん :2006/02/02(木) 20:36:22
>>519 「暴走」が起きているのは scanf ではなく、あなたのプログラムってことを理解しろ
ISO/IEC9899 に完全準拠しバグが絶対にない(悪魔の証明だが) scanf でも
あなたのプログラムは相変わらず「暴走」するだろう
ここまで来るとど素人でも Failed Module がどこなのかを言い当てることはできる
>>519 たぶんとりあえず、ポインタとかさっきの喧嘩と同じく、
とりあえず喧嘩吹っかけたい人が居るみたいなので落ち着いて無視すれば良いと思うよ
522 :
デフォルトの名無しさん :2006/02/02(木) 20:42:27
sage つけて自作自演に走った「論客」さん、よっぽど悔しかったんだね
初心者の時から scanf を一度も使ったことが無い 手持ちの本にも載っていなかったので %dだの%sだの指定するのがメンドイと感じてしまう そんな私からすれば なぜscanfを使いたがる人が多いのかと 逆にふしぎだったりする
>>512 いや、予想通りの人だ多分
scanf()は読み込めないとストリームに放置したままヌルーするから嫌われてるだけ
自分で作って自分でPLAYする分には使っても一向に問題ないよ
>>523 とりあえず楽じゃん
数値ならatoiやらstrtolやらせんでもいいし
ちょっとやりたい時とかfgets(str,256,stdin);とか書くの・・・やってみたらむしろ楽だなヲイww
526 :
デフォルトの名無しさん :2006/02/02(木) 20:49:05
>>523 あなたに動機がなければそんなもん
scanf どころか printf すら滅多に使わないバリバリ現役の人ふつーにいるし
>>525 fgets()の第二パラメータは、sizeof(str)がお勧め。
つまりこうなる。
char buf[200];
fgets(buf, sizeof(buf), stdin);
int foo = atoi(buf);
厳密にチェックしたいときは、strtol()かsscanf()でやるけどね。
>>523 一番困るのは、printf()とscanf()の書式指定を「同じモノ」として
説明している入門書だったりするのであなたは運がよかったと思います。
528 :
デフォルトの名無しさん :2006/02/02(木) 20:57:53
>>527 そこで atoi なんか使ったら説得力ないでしょうが
ね、だから気休めの域を出ないって言うのよ
mallocで確保したものにsizeofされかねん
○×ゲームの数値チェック(1,2,3以外はエラー)だったらatoiで十分じゃん
531 :
デフォルトの名無しさん :2006/02/02(木) 21:07:03
>>465 >どうやら話が循環したようだな
漏れに関しては「main()に処理を全部詰め込んだ方が分かり難い」と感じます。
初期化部分とメインループと終了処理ぐらいは.ファイルを分割して分かり易い状態で保存してる
>>480 >この前のポインタの時も分かったというレスに対して「分かっていない」→結果「分かっていた」んだが同一人物なのか?
>こう説明したがりの上から目線の。
>普段職場で「分かっていない」と上司にこき使われてるそれらの反動かな
そんな気ガス。。
レスが多くてどのレスが誰なのかわからん
同一人物かどうかわからないけど
>>519 はいい香具師そう
>>527 う〜ん場合にとっては配列MAXまで読み込まないほうが処理手抜きできると思うのだよね
535 :
481 :2006/02/02(木) 21:24:58
>>516 あ、なるほど
この場合戻り値はa[2][2]にすればいいのかな?全体ってことでaにしたら確かエラーが出た覚えが・・。
それでbの二次元配列は
char b;と定義して、if (a[i][j] == 1) b = 'O'; else if (a[i][j] == 2) b = 'X'; else b = ' ';
この場合は表示の時はどうやればいいんでしょうか?
char const b[] = " OX";と定義してprintf("%c ", b[a[i][j]]);
こちらの方は分かりました。この様な使い方もあるんですね、なるほど。
>>524 そうでしたか、どうも。
scanfについては前々から言われて問題があるのは分かってた事なので
今度はscanfに代用になる使い方
>>509 等を調べてみます
数式で、 A /= 5 ってどういう意味ですか?割ってるのに=?・・・
>>536 A /= 5は A = A / 5と一緒
538 :
481 :2006/02/02(木) 21:53:48
scanfの部分をこう追加や変更を加えればscanfの問題はOKですか? char x; fgets(x,sizeof(x),stdin); i = atoi(x); で、エラー文をiの値が1,2,3以外のときは数字が違うと言うエラー
>>537 なるほど〜、どうもありです。
てか中途半端に略せるの止めてほしいなぁ・・・
i=i+1 → i++
とかだってたった2文字だけじゃん
そんなところで時間省けても、プログラム考えるのに何時間とかかるんだから意味なくない?
>539 int a[N]; a[rand()%N] /= 2; と a[rand()%N] = a[rand()%N] / 2; が等価でないことは分かるか?
>>539 変数名が
jugemu.jugemu.goko.no.surikire.kaijari.suigyo.no.fuuraimatsu.suiraimatsu.unraimatsu
だったら84文字の節約になるよ。
>>542 分からないです・・・
ちなみにあなたの言いたいことも分からないです・・・
*i++ = *n++;
>>543 アルファベットだけで大文字、小文字あわせて54個あるのに長くする意味あるんですか?
>>546 まず数の数え方から勉強した方がいいのではないかと…
>>542 int n;
n = rand() % N;
a[n] = [n] / 2;
こうならa[rand()%N] /= 2;と等価。
[]の中に副作用のある式を書かれたら今度こそ説明が付かないけれど。
>>544 ようするにrandは毎回ランダムな数を返すから、
a[rand()%N] = a[rand()%N] / 2;では=の右辺と左辺で異なる要素を扱うことになってしまう。
>>539 おまえ CPU がどうやって動いているか一回勉強しろ.
> i=i+1 → i++
の i++ ってのは, CPU の物によったら 1命令.
今のコンパイラは, 最適化がそこそこ頑張ってくれるが,
昔のコンパイラは i = i + 1 と i++ だと計算時間が
違う奴が結構いた.
そもそも C を高級言語と思うな!
せいぜい, 高級アセンブラだぞ...
550 :
デフォルトの名無しさん :2006/02/02(木) 22:21:27
>>549 CISC のアセンブラ知らねー奴に後置++ の説明は一苦労だな
>>539 ++演算子については文字数の問題ではない。
a = b++;
と
a = ++b;
は違う。
ポインタ変数が絡むと更に違う。
add ax, 1 と inc ax の違いだな。
増やすだけなら前でも後ろでもええがな(-ωー)
>>539 それらは人間がキーを打つのを楽するためではなく、コンパイラが楽をするためのもの。
それに加えCはかなり低レベルな言語であり、つまりかなりCPU寄りな言語であるという事情も絡んでいる。
大抵のCPUは加算・減算とは別にインクリメント・デクリメントの命令を持っていて、
最適化技術が貧弱だった昔のCコンパイラでは++と--の演算子を使わないと、
そのインクリメント・デクリメントの機械語にコンパイルしてくれないという事情があった。
(現代のコンパイラならこの心配は要らない。i = i + 1;もi++;も同じコードを作る)
さらに大抵のCPUの命令は2オペランド。
「〜に―を加える」というような命令はあっても「〜にー + …の結果を代入する」という命令を持っているCPUは少ない。
これもやはり最適化技術が貧弱だった昔はa = a + 4よりも
直接前者の命令に当てはめられるということでa += 4のような複合代入演算子が作られた。
(これも現代のコンパイラなら心配は要らない。a = a + 4;もa += 4;も同じコードを作る)
ただ、最適化でどうせ同じになるからと++や+=を使えるのに敢えてa = a + 4;などと書くようでは
「郷に入っては郷に従え」という言葉を知らないただの馬鹿。
C言語には二つの変数を交換する式みたいなのはないの?
a = a+2 とかはわかりやすい書き方だとは思うけどね 初めて知った時 a += 2 とかなんかとっつきにくかったし
>>555 なかった気がする
つーかそんくらい自分でやってください
>>551 その他は言ってることは正しいんだが
>>539 の例に出している単なる1加算の場合は
中途半端な略と思うのも分かるなぁと
タイムマシンで過去に戻ってPDP-11にxchg命令みたいなのを追加すれば、Cにも変数を交換する式ができますか?
>>538 たったの3種類[1.2.3.]なら数字に変換する必要ないだろう
if文に直で'1''2''3'を判定すればすむじゃないか
>556 私は逆だったな。"aに2を足す。"と読めるんで、"aはaに2を足したものとする"よりわかりやすかった。
C++ になら swap 関数テンプレートがあるのだが、 C だとマクロ使わないとこの手の汎用ルーチンは作れないね。 #define swap(type, a, b) do { type C_ = (a); (a) = (b); (b) = C_; } while(0)
>>538 fgetc と fgets の違いを述べよ
>>562 a += 2
これを見て,"aに2を足す。"と読めるなんてお前天才だなwww
シグマの求め方は、"aはaに2を足したものとする" って考えていくんだから、分かりにくいってよほど最初に習わないと無理だろ
>>561 あ、そうなんですか
文字として1,2,3が認識されると思ってたんですが数字の1も文字の1も一緒なんですね(?)
って・・・悪魔のささやきってメル欄にあるのですが・・。
>>563 x[2]にしないといけないって事ですか?
>>568 文字と文字配列の違いが分からないなら絶対やるなよ
>>568 1や2や3は数値。
'1'や'2'や'3'は文字。
つーか。盤が大きくなったら使えない技を勧めるなよと。
>>568 fgetsの2番目の引数は引数-1まで読んで最後の\0だ
1-1はいくつだ
ところで途中読んでないけどこれまさかさっきの○×の話じゃないだろうな?
mallocで開放せずに処理を行っていました。 こういう場合、int hoge[100] みたいなスタック領域を破壊することはありますか? ヒープ領域とスタック領域とあるので領域が別?とか考えるのは間違いでしょうか?
>>533 なんだかよく判らんけど、ありがと♪
>>535 >この場合戻り値はa[2][2]にすればいいのかな?全体ってことでaにしたら確かエラーが出た覚えが・・。
そもそも、なんで戻さなければならないの?
つーか、呼び出し側で受け取ってないんですが。
>char b;と定義して、if (a[i][j] == 1) b = 'O'; else if (a[i][j] == 2) b = 'X'; else b = ' ';
そのままprintf("%c ", b);で充分。
文字配列もそうだけど、型の違いに慣れてないのかな?
まぁがんばってくれと。
#fgets()とatoi()の使い方に関しては>527を参考に。
>>575 確保した領域は、プロセス終了時にOSがよきに計らってくれるのであんまり意識しなくてもいい。
但し、繰り返し処理で毎回確保するようだといつかメモリが足りなくなる。
破壊はしないと思うが 確保できなきゃNULL返るだけだし
578 :
デフォルトの名無しさん :2006/02/02(木) 23:27:26
>確保した領域は、プロセス終了時にOSがよきに計らってくれるのであんまり意識しなくてもいい。 どのように「よきに計らって」くれるのかをきちんと調べておくことが大切 そのソースが将来移植される全ての処理系をいま予測する必要がある main という実行環境とのインターフェイス部分で問題処理までやるからそうなるんだよ!
とりあえず、入門変を読み終えて、実際に仕事でCを使い メカ制御を行うファームウェアを作っています。 そんな俺も春で3年目。 仕事も落ち着いたので、もう一歩ステップアップするための書籍を探しています。 お勧めはありますか? とりあえず、今はITRONやSHなどのマイクロ関係の本を読んでますが、 Cでよい本があれば教えてください。
>>579 只ステップアップと言っても要求するもんが判らないなぁ。
書籍スレ辺りを覗いてみてはどうだろう。
581 :
デフォルトの名無しさん :2006/02/02(木) 23:33:05
>>579 そこから上は尻に火がつかないと・・・
とりあえずハードも憶えるあたりからじゃないか?
とりあえずで済むような甘い相手じゃないが
>>576-577 さん、レスありがとうございます。
実は、スタック破壊起こしてますね〜みたいな話をされてる
方がいたんですが、どういう場合にスタック破壊がおこるのでしょうか?
str = malloc(10)とかやってmemcpy(str, hoge,11)とかをやってしまった場合
スタックを破壊する可能性はあるんでしょうか?
584 :
481 :2006/02/02(木) 23:39:29
ちょっと分からなくなったので
scafの代用としてfgetsを使うようにした
>>538 以降はリセットします
>>535 配列は戻したあと受け取られてないんですか?これ・・。
自分の頭の中では、例えば入力の関数の場合ですとmainから受け取った配列aをa[i][x]=1で中身を0から1に更新してreturn a[3][3]で更新された配列aをmain()に返して上書きしてるつもりなんですが・・
結果的にmainのa[i][j]も更新されてたのでてっきりそうなのかと
関数player()でa[i][j]=1とした時点でmain()のa[i][j]も同様というか同じものだからってことで更新されてたのかな・・。
char bはそれだと図面を表示できなくなりますね
b[][]の配列を図面として表示しているのでb[0][0]が左上、b[0][1]が真ん中上という風に・・。
fgetsとatoiはまだまだ分かりきれてないようです・・勉強します。
>>582 それはmallocの問題じゃないと思うが
>>586 さん、レルありがとうございます。
malloc云々は関係ないですね。
確保した領域をオーバーして書き込んでしまった場合、
そのアドレスがスタック領域であった場合、破壊してしまう事になるんでしょうか
>>587 大抵のコンパイラが吐くコードならスタック領域では無い
>>549 ,550
「インクリメント/デクリメント演算子は
*--sp = x --> push x
x = *sp++ --> pop x
したかったので導入した」
ってのを Usenet だか IEEE だかの論文か何かで
読んだ記憶が...
>>584 >配列は戻したあと受け取られてないんですか?これ・・。
・main()のaは関数から戻ってきたのではない。
main()のaの内容が書き換わっているのは、main()のaの場所を関数に教えて
そこを関数が書き換えているから。
・関数の戻り値の型がintなのに配列は戻せない。
だから、return a;ではエラーが出る。当然だ。
例えばa[0][0]なら返せるが、それは配列ではなく、只の整数値だ。
・そもそも呼び出し側で受け取っていない。
受け取るには、例えば int foo = PLAYER(a);などとする必要がある。
配列は関数に渡せない。渡しているのはその場所(即ちポインタ)のみ。
逆に、場所を渡しているから関数から書き換え可能となっている。
関数の引き数と戻り値の仕掛けについて、もっと単純な関数で色々試してみることをお勧めしておく。
>>588 さん
ではスタック破壊とはどういった時におきるんでそう(?_?)
コンパイラはなんだか分からないんですが、組込み系の処理なですが、。
>>591 mallocでスタック破壊といった人間にきけば?
>>590 なるほど・・そういうことだったんですね
じゃあ書き換えは関数内でやって関数自体はvoidでいいですね、勉強になりました。
>>591 {
int i;
(&i)[32] = 0;
}
呼び出し側のスタックとか、
返りアドレス上書きするとスタック破壊になると思う。タヴン。
呼んだのとは違う場所に帰ったりさせると面白い。
質問なのですが、文字列の連結の時は
時は?
誤爆しましたorz 文字列の連結の時には while(*s1++); while(*s1++ = *s2++); で上手く連結することができるのですが、これで文字列の比較をしようとするときに、 while(*s1++ == *s2++){ if(*s1 == '\0') printf("等しいです"); とやったのですが、 これだと違う文字列を比較したときにも「等しいです」。 とでてしまうのですが、これは何でこうなるのでしょうか? どなたか教えて頂けると助かります<(_ _)>
そんなトリッキーなコードを書こうとするから分からなくなる。 素直に分かりやすく書け。 どうせ最適化が効いてパフォーマンス変わらん。
>>597 s1="A";
s2="AB"とする
最初の比較で*s1++==*s2++は真なのでwhileに入る。
次にs1をインクリメントしたので*s1=='\0'なのでif文が真になって等しいですと表示。
というかstrcmp使え
おお!そういうことだったんですか! >599さんありがとうございます<(_ _)> 文字を格納後、格納先が真か偽か判断ということでいいんですね! 本当に助かりました。ありがとうございます!
>>597 { は ; のtypo?
同じ文字列だと末尾の'\0'も等しいから、その先に行っちゃうぞ。
602 :
デフォルトの名無しさん :2006/02/03(金) 04:00:23
構造体の使い方についてですが例えば構造体変数a,b,cを宣言する時 struct TEST { char *name; int age; } a,b,; //宣言する時はここ main() { struct TEST c; //追加する時はここ とする方法と typedef struct{ char *name; int age; } TEST; main() { TEST,a,b,c; //まとめて宣言と追加 とする方法、どちらがメジャーで使いやすいのでしょうか?
後者のが気分が(・∀・)イイ!!
俺は構造体の宣言時はstructをつける派だな。
>>602 前者と後者は等価でない事を判っているのか?
607 :
デフォルトの名無しさん :2006/02/03(金) 10:54:38
突然ごめんなさい。 あの、自分のコンピュータから同じネットワーク内にあるコンピュータのファイルを見れるようなコマンドありませんか?
608 :
607 :2006/02/03(金) 10:56:40
あと堀江由衣って、顔マルいよね?
マルいしキモイ
>>606 あーゆー事を人に訊くくらいだから
解ってないんでしょう。
lsはリナ糞じゃないの
>>591 自動変数のバッファオーバーランの時。
例: void func() { char s[1]; s[2] = '\0'; }
でも、これも自動変数をスタックに作らないコードを作る
コンパイラだったらスタックは破壊されない。(破壊する
ことには代わりはないが、別の場所が壊れる)。
ところでなんで未だにリターン値を入れるスタックに自動変数を
作るようになってるんだろう? 高速だから? 互換性の問題?
スタック代りになる別レジスタ作ってコンパイラをそれに合わせ
ればもっと安全になるのに。
615 :
デフォルトの名無しさん :2006/02/03(金) 17:20:46
「関数の戻り値がポインタとなる」 File関連、メモリ関連の標準関数で使用されるのは解ったのですが、 実際に関数を自作する時に「関数の戻り値がポインタとなる」場合、 または、そうする事により便利になる場合というのは、 どのような時なのですか?
>>615 FILEのように、具体的な処理内容を隠蔽した関数群を作る際に。
617 :
デフォルトの名無しさん :2006/02/03(金) 17:36:09
俺大学生だけど ここって、研究室の先輩とか教授とかより頼りになるよ。 おれの研究室終わってる。
俺の教授も尾わっ採る
教授なんて所詮政治力
>>615 C言語でオブジェクト指向風に作る時。FILE関係はその例でもある。
621 :
デフォルトの名無しさん :2006/02/03(金) 18:07:21
>>616 、620
thx。
>>620 C言語で構造体を使ってclass風に組む、という事でしょうか?
中身を公開していない構造体へのポインタを返すのは オブジェクト指向じゃなく、単なるカプセル化だな。
>>623 オブジェクト指向「風」ってことだよ。
X Window System の Xlib もそんな感じだな。
>>622 昔はC++ってCに変換してからコンパイルしてたからな
C++に出来てCに出来ないことはなかった。
あの凶悪な「テンプレート」さえなければ
「template という識別子は将来の為に予約されています」 だったから大丈夫。
#defineと#includeをうまく使えばCでジェネリック・プログラミングも不可能ではないんだけどね。
/* arraydef.h */ #ifndef ARRAYDEF_H_ #define ARRAYDEF_H_ #define Array_def(type, suffix) typedef struct Array##suffix { type* m_elems; } Array##suffix; void Array##suffix##_init(Array##suffix* self, int size); type Array##suffix##_get(Array##suffix* self, int i); void Array##suffix##_set(Array##suffix* self, int i, type value); #endif /* arrayimpl.h */ #ifndef ARRAYIMPL_H_ #define ARRAYIMPL_H_ #define Array_impl(type, suffix) void Array##suffix##_init(Array##suffix* self, int size) { self->m_elems = malloc(size * sizeof (type)); } type Array##suffix##_get(Array##suffix* self, int i) { return self->m_elems[i]; } void Array##suffix##_set(Array##suffix* self, int i, type value) { self->m_elems[i] = value; } #endif
/* arrayint.h */ #ifndef ARRAYINT_H_ #define ARRAYINT_H_ #include "arraydef.h" Array_def(int, Int) #endif /* arrayint.c */ #include "arrayint.h" #include "arrayimpl.h" Array_impl(int, Int) /* main.c */ #include "arrayint.h" int main(void) { ArrayInt array; int i; int size = 10; ArrayInt_init(&array, size); for(i = 0; i < size; ++i) { ArrayInt_set(&array, i, i * 2); } for(i = 0; i < size; ++i) { printf("%dn", ArrayInt_get(&array, i)); } return 0; }
>>625 テンプレートありのC++ソースをCに機械的に変換することは可能だと思うが。
ていうか、どんな言語からでも変換可能では? 実際に実装があるかどうかは
別として。アセンブリ言語に変換できてCに変換できないわけがないと思うが。
631 :
デフォルトの名無しさん :2006/02/03(金) 21:15:53
#include <stdio.h> int main(){ int *pa[500],*pb[500],*pc[500],*pd[500],*pe[500],*pf[500]; int i; for(i-0;i<500;i++){ *pa[i]=5; *pb[i]=5; *pc[i]=5; *pd[i]=5; *pe[i]=5; *pf[i]=5; printf("%d,%d,%d,%d,%d,%d\n",*pa[i],*pb[i],*pc[i],*pd[i],*pe[i],*pf[i]); } return 0; } と言うプログラム作ったんだが これって俺が思ってるよりも危険?
無能はプログラムなんかしなくていいのに
634 :
デフォルトの名無しさん :2006/02/03(金) 21:39:16
後はこれを勝手に増殖するようにすれば・・・・ は秤ス考えてんだ、俺orz
635 :
デフォルトの名無しさん :2006/02/03(金) 21:51:48
C言語とFortranの違いって何ですか???
>>635 ちょwwwwwwwwwwおまwwwwwwwwFortranww
もうダメポ
可変長の引数を取る関数に、動的な数の引数を与えたいのですが、 どうやれば出来るんでしょうか。 ↓こんな関数にある時は2個、ある時は3個の引数を与えたいんです。 void test(char *fmt, ...) { va_list ap; va_start(fmt, ap) ... }
test("", a); /* 2個 */ test("", a, b); /* 3個 */
639 :
637 :2006/02/03(金) 23:06:12
言葉が足りませんでした。 2個、3個と限定せずに、ある時は2個、ある時は1000個と渡します。 if文で1000個分岐させるのもありかもしれませんが、C言語として 動的な引数を一つの関数呼び出しで行うことは可能なんでしょうか。 スタックを積むことが出来れば、可能なんでしょうが。
>>637 ヒント:文字列の長さの場合はどうやっているか?
>>639 まだ状況が分からん。
言葉だけじゃなくコードを交えて説明しちくり。
可変長の引数を取る関数が分かるなら 可変個の引数を取る関数でググれば分かるはず
>>637 自分が書いた関数の挙動を理解していないんジャマイカ
644 :
637 :2006/02/03(金) 23:26:41
/* ユーザーから数値または文字を複数入力、個数不明 */ int *number; char *c; /* これを前述のtest関数に渡す */ test(number[0], number[1], number[2]....); こんな感じでどうでしょうか。 関数を作り直して配列で渡してしまえば、もちろんそれでいいのですが、 動的な数の引数を渡すことが、出来るか出来ないか知りたいので。
645 :
637 :2006/02/03(金) 23:28:05
もちろん、可変長の引数を受け取る方法は分かります。
やりたいことは分かるが、多分できんよ。 わざわざ可変長で実装せず、void*の配列などで実装したほうがいいと思う。 printfを呼びたいんじゃぁってのなら、無理だが。
647 :
637 :2006/02/03(金) 23:34:37
やはりそうですか。 自分で書いた物なので変更は可能ですが、色々な使い方を考えると 可変長の引数を取れた方がライブラリとして便利なので質問しました。 どうもありがとうございました。
printfに対するvsprintfというのもあるから 実際の可変長関数と、可変長引数を取る関数とをそれぞれ作っておいて 前者から後者を呼び出すってのも、ありかと思う
×printf ○sprintf
test(number, sizeof(number)/sizeof(number[0]));
ダミーの値を入れて渡すという手もあるけど、 1000 個とかなるとやめてくれと言うしか無いなぁ。 まあ、実際は 1000 個もはやらないんだろうけど。
例えば以下のような動的に確保されたメモリがあるとします。 int *hoge = (int*)calloc(num ,sizeof(int)); このhoge配列が持つ要素の数を調べるにはどうすればいいでしょうか? 本来は把握するべきなのですが・・・
num おいとけ
K&Rが読みにくくて仕方ないんだけど。。 webを見て翻訳を線引っ張って消して書き換えてみた訳だけども 索引もちょっと(贔屓目に見ても)わかりにくいし。。 本当に皆んなこの本読んでるんでしょうか?
656 :
デフォルトの名無しさん :2006/02/04(土) 03:35:59
age
657 :
655 :2006/02/04(土) 03:37:46
文法の本だけで4冊持ってるからもうCの本そろそろ買いたくないし orz
658 :
655 :2006/02/04(土) 03:47:03
続編を含んでいるものもあるから、必然的にあと2冊は買わなきゃいけない
画面消去して再出力するとき画面ちらつくんですが解消方法あります?
PAINTSTRUCT構造体のメンバをうまく使えばいいんじゃね
>655 そうか? そもそもC言語の文法なんて大した情報量じゃないんだから、 全部覚えて、記憶が怪しければK&Rを参照でいい。
662 :
デフォルトの名無しさん :2006/02/04(土) 06:03:23
ものすごい幼稚な問題なんですけど、、91を素数かどうか判定するプログラム教えてください! #include <math.h> #include <stdio.h> void main(void) { double a=91; double i; double z; for(i=2; i<=a-1; i++){ z = fmod(a,i); if( z == 0) printf("素数ではありません\n"); else printf("素数です\n"); } } だったら、全部の数に素数ですと、素数ではありません、が出てしまいます。。
663 :
デフォルトの名無しさん :2006/02/04(土) 06:10:18
main関数の引数のようにargc(argument count)とargv(argument values)で やればいいんじゃない?
664 :
デフォルトの名無しさん :2006/02/04(土) 06:19:15
すみませんC言語始めたばっかりなんでプログラムで教えてくれたらうれしいです!おねがいします。。
>>660 あ、すいません
GUIでなくてCUIのプロンプト画面の方のことです
>>665 消去しないで書き換えればよい。
標準Cではできないので、詳しくは適切なスレで聞きなおしなさい。
>>667 WindowsならWin32APIのスレ、DOSならDOSのスレがある。
669 :
デフォルトの名無しさん :2006/02/04(土) 08:48:24
ループを使って、1.aaa,2.aaa・・・10.aaaをfopenしたいんですけど、 どのようにすれば良いですかね?
fprintf(fname,"%d.aaa",i)とでもしてfnameで開く
672 :
デフォルトの名無しさん :2006/02/04(土) 09:12:55
>>670 その場合はfnameはFILE構造体で宣言して良いのですかね?
fopenしてfnameのポインタを代入してないから、なんかおかしい気がするんですが。
寝惚けてた sprintfだ
たぶん670のfprintfはsprintfの間違いだと思う。
675 :
デフォルトの名無しさん :2006/02/04(土) 09:26:55
C言語超入門っていう本を読んだんですが 次に読むおすすめの本ありませんか? どれが良書かよくわからなくて(汗 まだ初めて一週間くらいですが本の内容はいちお理解しました
>>675 1) K&R、655が読みにくいと言っているが気にスンナ
2) C言語ポインタ完全制覇:冬休みに斜め読みしただけだかニヤニヤしながら読める本だ
677 :
デフォルトの名無しさん :2006/02/04(土) 09:53:14
>>676 ありがとうございます
休み中に買って読んでみます。
678 :
デフォルトの名無しさん :2006/02/04(土) 09:54:21
突拍子もな位質問をするようで申し訳ないのですが、 教えて下さい。 メモリ上の話なんですが、 int A = 100 ; って変数宣言した時、メモリ上にint型でAの領域を確保して、その箱の中に100という値を格納するは分かるのですが、 その確保した領域に対して「ここがAだ!」という情報を格納しているのはメモリのどこに存在するのですか? よろしくお願いします。
>>679 そのどちらも存在するとは限らない。
そもそも関数内のローカル変数かどうかでも違うし、最適化によって変数そのものが消えるかもしれない。
>>679 >その確保した領域に対して「ここがAだ!」という情報を格納しているのはメモリのどこに存在するのですか?
「その箱の中に100という値を格納する」命令自体は、
メモリのどこに格納されているか知っているか?
あえていうなら実行コードの中。
683 :
679 :2006/02/04(土) 15:09:26
>>680 グローバル変数でもローカル変数でもいいので教えていただけませんか?
>>681 存じておりません…
>>682 exeの中ってことですか?
自分がアホさに情けなくなってきます…('A`)
>683 そもそも、なぜ、変数のアドレスがどこに格納されてるかを知りたいか?
>>679 おそらくコンパイルされた後にはそのような情報は跡形もない。
強いて言えば名前ではなくアドレスを使っているとでも言えばよいか。
>>679 1. 静的な変数の場合
命令部にアドレスが直接埋め込まれている。
ただし、実行ファイルの状態では実行時の実際のアドレスにはなっておらず、
実行ファイルをメモリ上にロードする際に実際のアドレスに書き換えられる。
2. スタック上に確保される変数の場合(非静的内部変数)
スタックのアドレスからのオフセット(ずれ)として命令部に直接埋め込まれている。
実際のアドレスは、スタックのアドレスにオフセットを加減する事により得られる。
スタックのアドレスは、その関数が呼ばれる場所により変化するので、
具体的なアドレスを実行前に決定することはできない。
スタックのアドレスはレジスタに入れられている。
3. 最適化により A がレジスタになった場合
4. 最適化により A が消去され、100 が直接使われる場合
アドレスは存在しない。
まあ、アセンブリ言語勉強するのが手っ取り早い。
>>683 いあいあ、ラディカルな考え方を継続できるなら大物になれるよ
doubleは桁数が大きい時や精度が必要なときに使うと 書いてたのですがいつもdoubleじゃダメなんですか。
>>679 変数名からその内容を参照することのできるデバッガならAがどこにあるかということを把握しているだろう。
>>689 むしろいつもdoubleが一般的。
floatは浮動小数点数版shortのような存在。
だぼー!
ありがとうございました。
掛け算をするためのプログラムとして #include<stdio.h> #include<stdlib.h> #include<string.h> int chun(int,int); int main(char *sa[1]) { int t,k,j; t = atoi(sa[0]); k = atoi(sa[1]); j=chun(t,k); printf("%d\n",j); fflush(stdin); getchar(); return 0; } chun(int x,int y) { int z; z=x*y; return z; } という感じのプログラムを書いたんですがコンパイルしてみるとexeファイルはできたのですが実行するとエラーが発生しました。 どうすればいいのでしょうか?あとatoi関数はどこに定義されてるのですか?初心者ですみません。
ヴェテランですみません
>>693 int main(int argc, char *sa[])
あとatoiはprintfなどと同じ標準関数。<stdlib.h>の中で宣言されている。
696 :
693 :2006/02/04(土) 17:14:00
>>695 無理でした。「パラメータ 'argc' は一度も使用されない(関数 main(int,char * *) 」)というエラーメッセージ
がでてきました。でもatoi関数についてはありがとうございます。というかそもそもコマンドライン引数と言うのは
何なんですか?
>>696 このままエラーと警告の区別つかないまま頑張ってください。
>>696 エラーと警告の区別くらい付けてから出直しましょう。
>>696 おとといになりましたらお越しください。
700 :
693 :2006/02/04(土) 17:21:34
>>697-698 すいませんでした。
無理でした。「パラメータ 'argc' は一度も使用されない(関数 main(int,char * *) 」)という警告がでてきました。
でもatoi関数についてはありがとうございます。というかそもそもコマンドライン引数と言うのは何なんですか?
ここまでくると教えて君の愚問ですな C言語 コマンドライン 引数
この程度の無能はリアルでもまあまあお目にかかれるから イマイチおもしろみに欠けるなあ・・・
リアルだったらその場にグーグル様がいらっしゃらないから仕方なかろ
プログラミング中 ↓ パソコン使用中 ↓ 今時ネットにも繋げない環境の方が少ない気が ↓ グーグル先生登場
今日は狭量な香具師が多いなw
まぁな
ヾ(o゚ω゚o)ノ゙ プニプニ!プニプニ!
709 :
679 :2006/02/04(土) 18:21:32
皆様、ありがとうございました〜。
ちょっと分かったような気もしますが、いまいち納得いってない部分もあるので
アセンブラを勉強してきます。
>>685 思いつきで気になったことがあったら、完全に理解するまで気になってしょうがない性格でして…
それでは。
710 :
デフォルトの名無しさん :2006/02/05(日) 01:27:48
>>679 アセンブラとコンパイラ+リンカーを勉強すればわかるでしょう。
int A = 100;
機械語ではAという情報は存在しません。すべてはアドレスに変換されます。
例)適当な機械語ですけどw
MOV 0x5012ab4, 100 ;0x5012ab<-100 0x5012ab4はAのアドレス
アセンブリ言語はアドレス関係のことを理解するのに最適だな。 その他、効率のいいコード悪いコードというのもよく見えてくるようになる。
712 :
デフォルトの名無しさん :2006/02/05(日) 02:03:27
>>679 外部結合を持つ変数の場合はリンカへの入力となるオブジェクトファイル内
外部結合を持たない変数の場合はコンパイラのヒープ内に保持されている
いずれにせよ実行時には A などというシンボル情報は完全に取り除かれ
単に「何番地」という呼び方になっている
このおかげで、
int A;
main()
{
A = 100;
}
と
int B, A;
main()
{
A = 100;
}
で実行時間に差が出る可能性を考慮する必要がない
(シンボル情報を参照していれば、B をスキップする時間が必要)
デバッグシンボルを埋め込んだ場合はどこかにあるんじゃないの?
まあそうだけど。
715 :
デフォルトの名無しさん :2006/02/05(日) 19:09:55
primeってなんですか?
>>715 文脈によって異なる。
が、このスレで聞くということから推論するとたぶん素数
717 :
デフォルトの名無しさん :2006/02/05(日) 19:16:15
そうなんです、素数のかかわってるものなんです。
メトロイド素数?
素元と言えヘ(゚∀゚ヘ)
そげんこといわれても・・・
721 :
デフォルトの名無しさん :2006/02/05(日) 20:26:51
いっちょんおもしんなか
なんか、いなかのほうげんにやっちゃにとっとけど…
九州男児が「寒い寒い」うるさいです。 扉閉めないとすぐ怒鳴ります。なんとかしてください。
芋焼酎でも与えておいて下さい
芋焼酎は下のほうだ 一緒にするな
726 :
デフォルトの名無しさん :2006/02/07(火) 11:43:56
#include <stdio.h> main() { int i = 1; printf("%d\n", i); return 0; } 65535以下の数値を使う場合unsigned shortを使うように心掛けて 長いソースの中でメモリを節約していく事が綺麗なソースと言うことですか?
intをdoubleにキャストすると精度が損なわれるって聞いたのですが、 int型の46を1/100にしたdouble型の0.46に精度を損なわずに変更するにはどうすればよいですか?
728 :
デフォルトの名無しさん :2006/02/07(火) 11:52:14
inlineって、プロトタイプに付ければいいんですか? それとも、関数本体に付ければいいんですか?
>>727 typedef base100 long
base100 hoge = 46;
>>726 いえ、型のサイズに依存するならそれ用のヘッダを使ってください。
#include<stdint.h>
uint_fast16_t
# とか言えるようにC99が早く一般的になってくれー
# 自前で定義するの面倒だよー
int long double short 使い分けがわからねええええええええええええええええええええ!!!! おっぱん的な使い方を教えてくださいm(_ _)m
教える気が失せる言葉遣いだ
>>732 C-FAQ 1.1どの整数型を使えばよいか、どうやって決めればよいか。
の答えを256回読め
736 :
デフォルトの名無しさん :2006/02/07(火) 14:38:57
Borland Developer Studio Eclipse+CDT 値段を考えないとするとどちらの開発環境が良いですか? 経験者の方、メリットデメリットで教えてください。
C99はCOBOL2000やpngと同じようにマイナー規格になるね
BCCて何に準拠してんだよ いろいろ仕様が不明だ
>>726 > 長いソースの中でメモリを節約していく事が綺麗なソースと言うことですか?
メモリの節約と綺麗なソースは、
全 く 別 の 問 題 だ!
今のPCスペック高いからメモリ節約とかあんま考えないでいいよ
さらに言えば、メモリ節約したつもりになっても、 alignmentのことを考えると1byteも節約出来てないのに、 速度だけ遅くなったとかありえるからなぁ。
744 :
728 :2006/02/07(火) 15:28:05
よろしくお願いします
>>744 いいよ#includeなんて書かないで
>>746 やべぇincludeと読み間違えたorz
ブラウザの文字の大きさ変えようかな
何で無視されたかわかんないんだろうな。 標準Cには、inlineなんて無いよ。
>>748 (,,゚Д゚)∩先生C99は標準Cじゃないんでしょうか
C99は亜種です 近づいてはなりません あんなんCと認めません
現時点での標準CはC99だけです 規格書のど頭にそう書いてあります 誰が認めようが認めまいが、標準化委員会が一番偉いんだから仕方ありません みんなあきらめて非標準Cを使いましょう
unsigned intて何ですか?
int year; time_t t = mktime(&(struct tm){.tm_year = year, .tm_mon = 0, .tm_mday = 1}); C99 なんてキモいだけだよね。
>>755 いや、それぐらいは可愛いもんだ。
一番まずいのは、alloca を無理にでも
標準化しようとしたために起こった
可変長配列の扱いの汚さ。
C99なんて知らない俺が真の勝ち組
C99はきんもーっ☆ みんな非標準Cを使おうでFA?
きもかろうが、何だろうが 便利でお得ならば使う。 そうでなければ使わない。 それだけ。 正直、使用する価値がいまいち見えないんだよな。
このスレのみんなでC100を決める
可変長配列は void func(void *base, int nmemb, int size, /* ... */) { char (*work)[size] = base; for (int i = 0; i < nmemb; i++) { work[i]をあれこれ } } みたいな感じで使うと便利かもしれないような気がしないでもない。
とりあえず、途中での変数宣言はいい。 だが、これだけなら C++ を better C として使った方が・・・。
ブロックの先頭以外で変数が宣言できるのなんてCじゃないやい!ヽ(`Д´)ノ
>>761 で、そうやって規格を拡張した結果がこれか?
http://seclan.dll.jp/c99d/c99d04.htm#dt19990719 >
>//(3)* がないと困る例
>void sumup(data, n, m)
> int n, m;
> int data[m][n];
>{
> ...
>}
>//(4)↑のプロトタイプ
>void sumup(int data[m][n], int m, int n);//(4.1)m,n の宣言より前の参照!
>void sumup(int data[*][*], int m, int n);//(4.2)OK
>
> この関数のプロトタイプの宣言を単純に記述すると、(4.1) のように記述することになりますが、
>この場合、m や n は data の中で参照する前で宣言されていないので問題になります。そのような時、
>(4.2) のように [*] という記述方法を使用することでそのエラーを回避することができるのです。
まさに泥沼・・・
Cの仕様は最初から十分おかしい。 staticが場所によってリンケージを指定したり記憶域期間を指定したり、 voidの意味が3通りあったり 負数同士のわり算が未定義とか 泥沼じゃない仕様なんてCじゃない、ということでFA。
>>765 割り算のは処理系定義。
ちなみにC99で改善された。
Cの仕様で一番突っ込むとこは「ビット演算子の優先順位」だろ この悪しき優先順位はJavaにも継承されてしまった...
>>768 Javaで直されたらかえって混乱するだろうから仕方がなかったのだろう。
770 :
デフォルトの名無しさん :2006/02/07(火) 20:58:46
C言語初心者で、やっと入門書が終ったんですけど、次にどんな本を読もう か迷ってます。 数値計算とアルゴリズムに興味があって 図書館でみた、奥村先生のC言語最新アルゴリズム事典が面白そうだったん ですけど、これって改訂版とかはでてないですか?本屋で探しても、初版 しか置いてなかったんですけど。 あと、Art of なんたらかんたらにも挑戦してみたいです。
ええ、あなた程度でも思いつくような事はさすがにやってます^^;;
773 :
デフォルトの名無しさん :2006/02/08(水) 00:40:26
>>770 インターネットで検索して調べりゃいいじゃん。
774 :
デフォルトの名無しさん :2006/02/08(水) 00:44:14
ちょいとyaccとlexの事で質問です。
ttp://www.linux.or.jp/JF/JFdocs/Lex-YACC-HOWTO-6.html を参考にいろいろといじっていたのですが、
extern YYSTYPE yylval;
という一行をサイトにあるとおりlex.lファイルの一番先頭、
include集団の直ぐ後ろに書いたんですが、そうするとgccがエラーを吐きます。
error: parse error before "yylval"
warning: data definition has no type or storage class
だそうです。
どんな感じでしょうか?
>>774 処理系はオリジナルのyacc?bison?
>>775 iBookのFreeBSDにデフォルトで入っているyaccだから、
たぶんオリジナルだと思います。
YYSTYPE を #define してないからでしょ。
%union{ char *str; char ch; } とかやっているんですが、 それとは別にYYSTYPEも#defineしないとまずいんでしょうか?
申し訳ありません。 オプションで -d をつけるのを忘れていましたorz
0〜X、0〜Y、0〜Zのような3つのenumがあって、 X,Y,Zの一番大きい値を定義するdefineを書く方法ってないでしょうか?
#define MAX(X,Y,Z) ((X>=Y)?((X>=Z)?X:Z):((Y>=Z)?Y:Z)) こんなん?
ありません
783 :
デフォルトの名無しさん :2006/02/08(水) 03:36:36
>>780 こういうMAXが欲しいということか?
#define MAX max(max(X, Y), Z)
#define MAX (X < Y ? Y < Z ? Z : Y : X < Z ? Z : X)
785 :
デフォルトの名無しさん :2006/02/08(水) 08:58:03
質問なんですけど。 char *ch; ch = "now is the time"; この文でしたら、文字'w'へアクセスするにはch[3]になる訳ですが、本体は ch[0] = 'n' ch[1] = 'o' ch[2] = 'w' という順に格納されているのでしょうか?
"■"は複数バイト文字だから char ch; では扱えなくて、文字列として使用するならば、配列として扱われる。で、合ってます?でしょうか
#define MOJI "■" は使い方合ってるんでしょうか? 質問攻めですいません。
charと配列とポインタの関係を研究している訳です。。
1. ダブルクォーテーションで括った文字列はNULLターミネートされたchar型配列 となってメモリ中に置かれ、その領域の先頭へのポインタとなる。 2. シングルクォーテーションで括った文字は char の値となる。 3. Lが先頭に付いているシングルクォーテーションで括られた文字(例 L'あ')は wchar_t 型の値となる。wchar_t 型のビット数や使用するエンコーディングは 環境によって違うが、だいたいの場合は何の文字でも表せるようになっている。 (例: GCCのCでは32bitでUnicodeのUCS4)。 4. Lが先頭に付いているダブルクォーテーションで括られた文字列(例 L"あいう")は NULLターミネートされたwchar_t型配列となってメモリ中に置かれ、その領域の 先頭へのポインタとなる。 5. wchar_t 型から char 配列への変換は mbtowc(), NULLターミネートされた wchar_t 配列から char配列への変換は mbstowcs(), NULLターミネートされた char 配列から wchar_t 型への変換は wctomb(), NULLターミネートされた char 配列から wchar_t 型配列への変換は mbstowcs() を使用する。また、 これらの変換を行うためには setlocale() で適切なロケールを設定しておく 必要がある(UNIX系OSでは setlocale(LC_ALL, "") などとすると環境変数から 値を拾って勝手に設定してくれる)。 ということで、エンコーディングに関係なく1文字単位で処理をしたい場合は wchar_t 型に変換してから行った方が楽。そんなことしないでただ保持して 出力するだけという場合は char のままでもいいが、char のビット数を オーバーする文字だった場合は char 配列でないと保持しておくことができ ないかも知れない。しかしビット数については環境依存であるため、ある エンコーディングで16ビットになる文字も char 変数一つで扱えるかも 知れない(しかしそれに期待して書かれたプログラムは移植性がなくなる)。
あ、間違えた。誰か直しておいて。
>>789 > 2. シングルクォーテーションで括った文字は char の値となる。
シングルクォーテーションで括った文字定数はintな訳だが
>>789 さん
本当に有難うございます。とても参考になります。なので、メモに取って絶対忘れないようにしておくつもりです。
以前はよく分からなかったwchar_t 型の使い方まで繋げることができたので、本当に感謝です。
我らがロクサス隊は中山としょういちを潰した。次はVIPのゴミどもを潰してやろう。 かかってこい。メンバー随時更新中!! ロクサス隊メンバー紹介! ロクサス 隊長 ←俺。最強のコテ バルボッサ 副隊長 ←俺に次ぐ最強のコテ 以下部下・家来 レオン ←最後まで戦うこの部隊に欠かせない人材 クロノトリガースレの全住民 ※1 しょういち 隊長の家来 最強を極めたソラ ←宣伝役 補欠候補 マララー( ・∀・) 隊長の家来 カカ ←どんなことにも恐れない人 (Φ_Φ) 隊長の有能な家来 電車男 ←気ままな人 アブノーマル志向 隊長の家来 ウンコマン ←毒舌野郎だが隊長の家来 デミックス ←いざって時に助けてくれる アルテマ(・∀・)ウエポン 隊長の家来 あ(-A-)ぐ 隊長の家来 ドラクエの人 ← スレ立てを協力してくれる 星猫 隊長の家来 県南軍団(・∀・) ←アンカーミスが多いが隊長の家来 県南プロ( ´∀`)マターリ ←独り言を言う奴だがとりあえず隊長の家来 中山軍団全員 降参してきた家来 ローグギャラクシー攻略スレの全住民 ※2 その他ロクサスのトリップを使ってる奴 以上 ※1、2は↓の為 1000 名前:最強を極めたソラ ◆UqyFEBqAhM :2006/02/07(火) 15:13:38 ID:e9+4+mso 1000ならここの住民全員がロクサス隊に強制入隊!! 1000 名前:最強を極めたソラ ◆UqyFEBqAhM :2006/02/07(火) 11:56:05 ID:hmPzbVIc 1000ならここの住民全員がロクサス隊に強制入隊!!
めちゃめちゃおかしい質問なのですが THESPOKEってC言語のコンパイラとしてつかえるのですか?? 日本語おかしくてすいません。
>>797 >>795 のリンク先にも書いてあるがtheSpokeはあくまでMSがやってる学生向けコミュニティを指す。
多分君がイメージしているのはVisual Studio .net 2003 theSpoke Premiumのことだろうと思うのだが。
Visual StudioはMS製のIDE(統合開発環境。要はアプリの開発やソースの管理を支援する便利な代物)で、
勿論C/C++コンパイラも付属している。コンパイラだけ欲しいのなら無料で手に入るけど、
開発を支援するものは何もないので自分でエディタを探したり、Eclips使ったりする必要がある。
いみわかんねwww
>791 C++にどっぷり浸かって忘れてるけど、Cではintだっけ? '0xFFFF'とかも常に有効ってこと?
>Cではintだっけ? その通り >'0xFFFF'とかも常に有効ってこと? 未定義
803 :
デフォルトの名無しさん :2006/02/08(水) 20:09:59
未規定
期待できないと? うまいこと言ったつもりか〜〜〜〜〜!!!!!!11
>>805 おまえ、「くそっ、やられた」と思っただろ?
807 :
デフォルトの名無しさん :2006/02/08(水) 20:31:18
処理系定義
datファイルの書き換えをしたいのですがfopen(, ,"r+")すれば問題ないのでしょうか? それともほかに書き換えしやすい命令があるんでしょうか
>>801 '\xFFFF'の間違いか?
それでC++に浸かってるなんて、よく言えたものだな
810 :
デフォルトの名無しさん :2006/02/08(水) 22:05:00
フローチャートってどこまで詳しくかけばいいの?
フローチャートはそれを書くことそのものが目的ではないから その目的にかなうだけ詳しくかけばよい 逆にそれを超えて詳しく書いてはいけない C言語はまったく関係ないな
813 :
デフォルトの名無しさん :2006/02/08(水) 23:00:54
>>810 まだフローチャートを書いているひとがいるんだ。
フローチャートをどのレベルで書けばよいかは、書いたフローチャートを
利用する次の工程による。
フローチャートを高レベルで書くと、 プログラムの開始 ↓ メインの処理 ↓ 終了
>>810 脳内イメージとソースとがうまく相互変換できるようになればいいんじゃないのかな、それは君自身の糧になる。
817 :
デフォルトの名無しさん :2006/02/09(木) 00:18:47
フローチャートでいいじゃない。 形を変えたところで大差ないだろう。 それにUMLで図書いたところでその中味はどう書きゃいいのさ、 という問題が残る。
けど、フローチャートよりUMLのActivity図の方が良くね? とゆうか俺がそれで代用してるんだが
間を割り込んですいません。ちょっと教えてください。 配列で100個のデータがある(A[100])とすると、 その中から10個のデータを抜き出して (A[1]〜A[10]の和、A[11]〜A[20]の和など) 和を計算することは可能でしょうか?
可能です
ちょっと手を貸してもらえないでしょうか? なにとぞよろしくお願いします。
何が解らないのかが、分からない
いま、 #include<stdio.h> #include<math.h> main() { int i; double sumA=0,A[100]; for(i=1; i<=100; i++) { sumA+=A[i]; } } こんな感じです。うまく抜き出したいのですが・・・
・A[100]は初期化されてないから、どんな値が入っているか不明 ・この場合、配列はA[0]〜A[99]まで
826 :
810 :2006/02/09(木) 00:47:16
実はもうプログラムができていて、発表会のためにフローチャートを書いているんですが だいたいの感じで書くと、ほとんど四角の箱だけで、中に抽象的な処理を書くだけになってしまいます。 かといってちょっとでも具体的に書くと、量が多くて発表には合わない感じです。
>>825 すいませんでした。A[0]〜A[100]には1をどんどん足していく感じで作りたいのです。
その後、10個ずつ抜き出してその10個の和を計算したいのです。
>>827 イマイチ何がしたいのか、わからん・・・
#include<stdio.h>
main()
{
int i, k;
double sumA, A[100];
/* 初期化 */
for (i = 0; i < 100; i++) A[i] = i + 1;
/* 合計 */
for (k = 0; k < 10; k++){
sumA = 0;
for (i = 0; i < 10; i++)
sumA += A[k * 10 + i];
printf("%d\n", sumA);
}
829 :
819 :2006/02/09(木) 01:03:59
>>828 できました!
sumA += A[k * 10 + i];
の一文が書けなくて、困っていました。
とりあえず、数学の計算に応用したかったのです。
本当にありがとうございました!
ファイル入出力について質問させてください。 file=fopen("data.txt","w"); if (file!=NULL){ fputc(10,file); fclose(file); } このdata.txtをバイナリエディタで表示した場合、 0Aとなると思ったのですが、実際は0D 0Aと表示されます。 fputc(9,file_G); だと09 fputc(11,file_G);だと0B と表示されるのに… 10は何か特殊なのでしょうか?
831 :
デフォルトの名無しさん :2006/02/09(木) 01:22:33
そりゃオマエの使っているそのコンパイラのライブラリがOSのデフォルトの 環境に合わせて \n (0x0a) を \r\n (0x0d, 0x0a) に変換しているからだ。それが 嫌なら fopen() のモードを "w" じゃなくて"wb" にしろ。
>>830 10は改行\nと同じ
試しにまっさらなテキストでエンター1回だけ押して保存して見てみろ
0A0DなんだよWINでは
833 :
830 :2006/02/09(木) 01:35:08
解決しました! お早い返答ありがとうございます。
ごめんなさい 0D0Aですた(・∀・)
835 :
デフォルトの名無しさん :2006/02/09(木) 01:40:23
Mac は昔から改行が 0d だけらしいな。 で、MS-DOS とか Windows は 0d0a。 UNIXやLinuxは 0a。 但しこの頃は改行コードや文字コードの違いを吸収してしまうエディタとかが あるのでOSのデフォルトというものは段々なくなっているように思う。
アサ○ビールの大五郎って焼酎 味全然付いてね
。。。
838 :
726 :2006/02/09(木) 14:45:51
>>741 わかりました。まず買った参考書を読破してからソースの美しさについて考えてみます。
>>742 そうなんですか。まぁ1バイト2バイト変わったところで・・・とは思いますけど何万行も書いてると変わってくるかなとも思ったので。心掛け程度なんでしょうか
>>743 ちょっと分からないです。まだ質問するレベルにも達していないようなので勉強します。ありがとうございました。
839 :
デフォルトの名無しさん :2006/02/09(木) 16:09:02
Time-stampってどうやってやんの? 誰か教えて栗!
友達になって栗!
>>840 鼬害。
>>839 何のタイムスタンプか判らんが、ファイルのタイムスタンプの取得方法なら
標準Cだけでは解決しないので該当環境スレなどへどうぞ。
>>838 メモリ量の問題ではなく、ソースを読んで意味が判るように心掛けるべきでしょう。
windows.hをインクルードしたヘッダファイル( MyHeader1.h )と winsock2.hをインクルードしたヘッダファイル( MyHeader2.h )があったとして、 #include "MyHeader1.h" #include "MyHeader2.h" なんてやるとコンパイルできません。 winsock2.hを先に、windows.hを後にインクルードできればいいのですが、 ラップされたヘッダーだと解らない場合があります。 このような問題はどのように解決すればいいのでしょうか? というか、いちいち全部のヘッダみて、どれがwindows.hをインクルードしてるか調べなきゃだめなんでしょうか?
書いた順に読み込むんだから当然
不安なら全部書いておけ include重なったって問題ない
>>843 > winsock2.hを先に、windows.hを後にインクルードできればいいのですが、
どっちが先でも問題ないはずだが?
>>843 #include <winsock2.h>
#include <windows.h>
#include "MyHeader1.h"
#include "MyHeader2.h"
848 :
843 :2006/02/09(木) 17:46:21
847氏の見て「なるほど」って思いました。 全部書いておきます。 ありがとうございました。
849 :
デフォルトの名無しさん :2006/02/09(木) 18:22:53
動的に確保された構造体の配列a[n]があり、その構造体のメンバはポインタ*bを持ち、 そのポインタは、動的に確保された別の構造体の配列をさします(この配列は全て異ります)。 この状況で、a[i].bが指している配列を解放したいのですが、うまくいきません。 原因がどうしてもわからないため、動的な構造体の配列の各要素が、それぞれ 別の動的な配列をさしている場合、freeはうまくいかないのではないかと勝手に思っているのですが、 違いますか??勘違いでしょうか。。。・
851 :
デフォルトの名無しさん :2006/02/09(木) 18:32:53
勘違いです。
852 :
デフォルトの名無しさん :2006/02/09(木) 19:08:22
free(a[i].b)でいいんですよね?for文で片付けているので間違えないんですが・・・。 俺のプログラムがウンコだからっぽいですね。。 ただ、相当な回数繰り返し計算にこの配列を用いているんですが、 freeしなければ正常に動くんです、、、。
>>852 >俺のプログラムがウンコだからっぽいですね。。
いや、「だからっぽい」ではなく「だから」。
854 :
デフォルトの名無しさん :2006/02/09(木) 19:30:44
int 型とdouble型を演算してint型もしくはdouble型の変数に保存する時、 保存先の変数の型にあわせてから計算して、その後保存すればOKですよね?
855 :
デフォルトの名無しさん :2006/02/09(木) 19:31:22
合わせて=キャストして、です。失礼しました。
>>849 考えられる例
・動的配列aを解放してから各構造体メンバを解放している
・2回以上同一アドレスに対してfreeした
・処理しているときにメモリ破壊している。freeの時に運良く「上手くいかなかった」
別にキャストしなくても勝手に格上げされる intに入れれば勝手にけつが無くなる まぁしたほうがいいとは思うけどね
>>852 いんだよ。
気になるなら再現する最小限の大きさのプログラムを作ってここに書き込め。
そしたらみんながツッコミ入れるから。
859 :
デフォルトの名無しさん :2006/02/09(木) 20:32:03
重複includeについての質問です まず、「重複include防止をした」hoge.hに「定義」と「宣言」(関数Aとします)を書きます。 hoge_1.cppとhoge_2.cppの二つのファイルがこのhoge.hをincludeしました。 関数Aを使うのはhoge_1.cppだけだとします。 hoge_2.cppは関数Aを使いません、単にhoge.hをincludeしただけ。 これでビルドしたら、「既に関数Aはhoge_2のobjに定義されてます〜」 エラーがでました。 エラーを消すためにhoge_2.cppにあるhoge.hのincludeをはずしてビルドします。 これは成功します。 この状態でhoge_2.cppにhoge.hをincludeしてビルドします。 一番初めは失敗したのになぜか成功しちゃいました。 これはどういうことなんでしょうか? 環境は.net2003を使ってます。 よろしくお願いします。
>>852 解放の直後に0を入れてみてうまく動くようなら、二重解放をどこかでしている。
>>859 2つのファイルでincludeしてそれを共にinckudeしたら
宣言ダブルんだからダメだろそりゃ
include被ってもどうにかなるのは標準のだけだよ
まぁNET使ったことないいけどナー
インクルードファイルに書けるのは宣言だけ。
……というのは、ガセ
ここでアンケート あなたはstdio.hなどのファイルのことをなんと呼びますか? ・ヘッダファイル ・インクルードファイル ・その他
869 :
デフォルトの名無しさん :2006/02/09(木) 20:50:07
・ヘッダファイル
>>861-866 リビルドしたら、どちらとも無事エラーになってくれました。
Cとは関係ないことですみませんでした。
もうひとつ質問
>>865 さんがおっしゃるようにヘッダに「宣言」だけ書いた場合
重複include防止って意味があるんでしょうか?
宣言だけだったら重複していても害はないとあるサイトでは書いてあったんですけど。
重複include防止って具体的にどういう時に役に立つんですか?
>>871 関数や変数の宣言は何度あっても問題ないが、
構造体の定義など同じものが複数あっては駄目なものもある。
873 :
デフォルトの名無しさん :2006/02/09(木) 21:08:20
インクルードが循環する時とか。
#defineが重複すると警告とかでてうぜー enumとかtypedefが重複するとエラーになる
>>872 そうなんですか。
今、構造体の宣言で実験してみたらエラーになりました。
includeについてスッキリしました。
ありがとうございました。
>>873-874 構造体以外に他にもいろいろ問題があるんですね。
いやあ、かなり助かりました。
ありがとうございます。
「書けるだけ」っつーか、「書いていいのは」だな。 C99じゃない限りdefineマクロは二回定義できないし、typedefも同様。 なので、二重にインクルードされないようにインクルードガードは必須。 これでも尚、ソースファイルごとにインクルードされることには違いないので グローバル変数や関数が剥き身で置いてあると多重定義になる。 つまり、↓はダメ。 --foo.c-- #include "foo.h" void func(void) { ...; } --main.c-- #include "foo.h" int main() { func(); return 0; } --foo.h-- void func(void); /* これは宣言だから大丈夫 */ #define FOO 0 /* これも別に問題なし */ void subFunc() /* これが多重定義になる */ { ...; } 但し、同じfoo.hでもこうするとダメなのでインクルードガードは必要。 --bar.h-- #include "foo.h" --bar.c-- #include "bar.h"
878 :
デフォルトの名無しさん :2006/02/09(木) 21:42:33
おか
879 :
デフォルトの名無しさん :2006/02/09(木) 21:43:28
victim-pogetive.0507@ドコモ ウイルス送りまくってくれ
携帯用のウイルスてCで作れるのか? Javaじゃないとダメじゃないの?
ヘッダファイルの先頭に #ifndef hoge1_header_file #define hoge1_header_file ... #endif とかもしくは #pragma once とかつけてる?
携帯なら別にウィルスじゃなくてもメールボムの方が効果でかくねーか? でかい添付ファイル付きの奴でメールサーバを溢れさせるとか
#include <stdio.h> #define square(x) (x)*(x) int main(){ int x,y; x=2; y=square(++x); printf("x=%d\n",x); printf("y=%d\n",y); return 0; } で、なぜ x=4 y=16 となるか分かりません。どのように展開されてるか 教えてください。
>>883 そんなネタはおもろない 出直してきなせい
>>883 y=square(++x);
と
y=square(x++);
を試してみろ
ああ、副作用か・・・
887 :
デフォルトの名無しさん :2006/02/09(木) 23:01:24
++square(x)とかどう?
890 :
883 :2006/02/09(木) 23:04:11
y=square(x++); としたら x=4 y=4 になりましたが…!? やっぱ分からないです。
x=4; y=16/square(x); さてyはいくつ?
わからないままでいいよ
893 :
デフォルトの名無しさん :2006/02/09(木) 23:06:51
>>890 それは偶然の産物
いくら注視しても帰納は無理
素直に規格票を入手してそこから演繹を試みなさい
{ int x,y; x=2; y=(++x)*(++x); printf("x=%d\n",x); printf("y=%d\n",y); return 0; } 実際、Eオプションでコンパイラに展開させるとこれ。
アセンブリよくわからないけど、 かけ算するときに、命令に変数のアドレスそのまま渡してるからじゃない? こんな感じ。 TASU a TASU a KAKELU a a b
y=(++x)*(++x);が 括弧さきにやるから、3になって4になるxが。 で4*4=16 x++とした場合は、2*2やってから 3になって4になるxが。みたいね。
だから以下は未定義だと何度言ったら分かる y=(++x)*(++x); JIS X 3010:2003規格表嫁 P48 6.5 直前の副作用完了点から次の副作用完了点までの間に 式の評価によって一つのオブジェクトに格納された値を変更する 回数は、高々1回でなければならない。さらに、変更前の 値の読み取りは、格納される値を決定するためだけに行われ なければならない。 今回のでは、副作用完了点から次の副作用完了点の間で ++xが2回有ることから未定義の式文 よってこれが3になろうが5になろうが、画面から猫が飛び出そうが 知ったこっちゃない
猫は飛び出さないだろう
>>898 未定義動作の時に画面から猫が飛び出るという実装がなされた
そんな遊び心満載の処理系があれば可能
クララは立つけどね
そんなもん読んでるやついるのか? 初めて知った。1万4千8百円だって。 見たこと無い。
>>897 のこの部分って、何度も何度も引用されてねーか?
つかこれぐらい入門書に書いておけよな
未定義って、コンパイラがもっと積極的に教えてくれても いい気がする今日この頃
>>902 高いが手元に置いておいて損はない(勿論ちゃんと読んでの話な)
それに糞見づらいのでいいんなら正規にPDF(スキャンされた画像をPDF化した奴)
を読めるサイトもある。もっとも全文検索や索引は一切無いがな
ウォーニングデネー(´A`)
>>897 おまえ、他人に理解されることを恐れているのか?
他人に理解してもらいたいなら、和訳しろ。
908 :
デフォルトの名無しさん :2006/02/09(木) 23:35:09
++猫;
909 :
デフォルトの名無しさん :2006/02/09(木) 23:36:15
>>900 #pragma でゲームが起動するってのはあったらしいな。
>>897 マジに教えて欲しいんだが、なんでそれが 「 未定義 」 なんだ?
y=(++x)*(++x);
一番優先順位の高い演算は、2つある ( ) の中身。 同一優先順位の演算が2つあるから、
結合順位に照らし合わせる。 結果、代入演算子の右辺から評価。
右辺は乗算だから、左の項から評価。
従って、
左の(++x)を評価:xは3に
右の(++x)を評価:xは4に
3と4を掛ける:12
yに代入:yは12に
Cの言語仕様だと、こうなるのではないか? 曖昧(動作が未定義)な点は、無いと思うが・・・
>>911 > 右辺は乗算だから、左の項から評価。
ここが間違い。
>>911 だから++xが二度出てくることで、xの値を2度更新してる
その式文中に副作用完了点は末尾以外存在しない
よって未定義動作
>>911 偉い人たちには曖昧にしか見えなかったんどすえ。
>>911 ++xを両方先に計算すると、4x4でyは16
曖昧な事極まりない
>>912 >>913 演算の優先順位と、評価順序は異なるってことか?
A + B * C は、B の評価結果と C の評価結果を掛けて、それを A の評価結果と合算する、
っていう順位は決まっているけれども、A・B・C の評価順序は、演算の順位とは全く関係なく
不定である、って解釈であってる?
>>916 まぁ1行目は間違ってないな
とりあえずここで問題なのは、隣接する2つの副作用完了点の間で
同一オブジェクトを2度変更していること
よって、演算子の優先順位だの評価順序だのを持ち出すのはナンセンス
んなのは全く関係ない
ちなみに蛇足だが、関数呼び出しの実引数並びの評価順序も未定義
>>916 演算子の優先順位は評価済みの各要素を結合する順番。
評価の順序は定義されてない。
こういうこったね。
釣られ乙
未定義って、定義し忘れでしょ?結局 リッチもまだまだだな
>>915 「 両方先に計算すると ・・・ 」
なんだか、直感的にとっても判りやすい表現。 何となく ワカテキタ 希ガス。
>>922 そこに実装系の腕の見せ所があるんじゃないかァー
遊び心の分からない人だナー
>>922 評価順序を定義しない方が高速なコードを生成できるかもしれないからじゃなかったっけ?
それと、それまでに出てたコンパイラにも配慮
>>918 > 関数呼び出しの実引数並びの評価順序も未定義
それは、各引数の評価結果をスタックに積む順番はケツから、ってのは決まってるけれども、
その前段階の 「 各引数を評価する順序 」 は未定義ってことだね!
そういうこった
マジで、スゲー勉強になった。 ほんとにありがとう > レスくれたみんな。 2ch ってクズの集まりだと思ってたけど、なんだ、まともな連中もいるんじゃねーか。 オイラ、泣けてくるゼ。
そのクズに教わる気分はどうかね?
気分はサイコーでつ。
932 :
デフォルトの名無しさん :2006/02/10(金) 01:11:24
もしかしたら基礎的なことかもしれませんが typedef 構造体等のキーワードでググっても わからなかったのでよかったら教えてください。 下記のような構造体のコードがあるんですが >typedef struct tagOAMEntry >{ >u16 attribute0; >u16 attribute1; >u16 attribute2; >u16 attribute3; >}OAMEntry,*pOAMEntry; 最後の >}OAMEntry,*pOAMEntry; 部分がよくわかりません。 最後が >}OAMEntry; であれば「tagOAMEntry」という構造体に「OAMEntry」という名前をつける ということだと思うのですが…。 雰囲気的には >typedef struct tagOAMEntry >{ >u16 attribute0; >u16 attribute1; >u16 attribute2; >u16 attribute3; >}OAMEntry; >OAMEntry *pOAMEntry; を省略して記述したような感じに思いますがどうなんでしょう? お手数ですが教えてください。
int i,*p;
tagOAMEntry構造体の別名をOAMEntryとした上で 同時にその構造体へのポインタの別名をpOAMEntryとしている
935 :
デフォルトの名無しさん :2006/02/10(金) 01:39:40
>>932 んじゃおまえ typedef int INT, *PINT; はどうなるんだよ。
わかんねえなら入門書読め。
入門書にはそこまで書いてないだろ
937 :
932 :2006/02/10(金) 01:49:09
>typedef int INT, *PINT; このような記述ができるということが入門書に書いてなかったので 質問しました。上記の記述方法を知っていたら質問しませんでした。 申し訳ないです。
Javaなら副作用があいまいな部分なんてないけどな 副作用が怖いお子様はJavaでもやっていろ
>>932 typedef struct tagOAMEntry { (略)} OAMEntry, *pOAMEntry;
int n, *ptr
typedef struct tagOAMEntry { (略)}が型名でOAMEntryがオブジェクト、*pOAMEntryはポインタ。
型名 オブジェクト コンマ演算子 ポインタ;って形になってる。
<蛇足>
typedef struct __Node {
int no;
char name[20];
struct __Node *next;
} Node;
この形はNode内部でNode型の変数やポインタを使いたい場合にstruct __Nodeで
Node型と定義される前の型を表現している。__Nodeという名前じゃなくても別にOK。
ただ読みやすくするには似たような名前が良いかと思われる。
941 :
940 :2006/02/10(金) 02:33:01
>>940 内部で同じ型の変数は使えないかも・・・
構造体タグと構造体変数名のこといってるなら名前空間が違うからおk 入れ子structのこといってるならそれはおk
943 :
デフォルトの名無しさん :2006/02/10(金) 02:48:16
944 :
デフォルトの名無しさん :2006/02/10(金) 02:49:10
>>937 typedef int INT, *PINT; は typedef int INT; typedef int *PINT; を一回で書いただけだ。
なんか今夜は喧嘩が多いな糞野郎
副作用が怖いならSchemeでも使ってろボケ
そこは Haskell だろ
l;;llllll||lll从从WWWl||ll,,ツ从ツツノlイノ'彡ヽ イ从、从从从从从ll|| |リ从////ノノ彡;j jl从从从从;;;;;;;;;;;;从;;;;;/;;;;;;;;;、、、;;-ー、イ彡:} (ミミ;;ッ''"゙ ̄ '、::::゙`゙''ー、/"´::: :::: |;;;;;彡| }ミミ;;;} ::: {:: ゙:::::、::: :::ィ ,,:::: };;;;イ;;l jミミ;;;;} ::: ヽ::::ミヽ:: | ノ W:: |;;;;彡:| }ミ;;;;;;} ::: ヾ {:::::ミ ヽ j イ|从 ":::: };;;;;;彡{ iミ゙;;;ノ:::::: \'、 }}: l||イ /,ィ;;、、-ーーヾ'ァ;;イ、 {;;;;リ:レ彡"三三ミヽ,,リ{{,,ノ;;;;ィ≦==ミ'" |;;〉l.| l"';;;l ゙'''<<~(::) >>::)-ら::ィ'ー゙-゙,,彡゙ .:|;l"lリ |l ';;', ::: ー` ̄:::::::ミ}゙'~}彡ィ""´ .:::lリノ/ l'、〈;', ::: :::::::t、,j iノ:::、::.. ..::::lー'/ ,、,,,/| ヽヽ,,', ::.、 :::::(゙゙( ),、)、ヽ::. イ ::::l_ノ )ヽ"´ ''''"レl_ヽ,,,', ヾ'ー、:::;r'"`' ゙'';;"" ゙l| ::j ::: |: l,,,, ゙''(,l ', l| リ {"ィr''''' ーー''ijツヽ l| :" l |',`ヽ, し お (l :'、 `',. 'l| |;;゙゙゙゙"""´ー、;;| ノ: / /リヽ \ . ろ 前 Z::::ヽ '、 ゙'t;ヽ ` ´ ノ;;リ ,r' // | や ら >; :::ヽ ::ヽミニニニ彡'" , ':::::// | ┃ い フヽ ::\ : ミー―― "ノ , ':::: //: | ┃ い }ヽヽ :::::\::( ̄ ̄ ̄ /:::://: | ┃ 加 }| ヽヽ :::::`'-、竺;;ニィ':::// | l // 減 (: | ヽ ヽ :::: ::::::... ::// | | ) ・・ に ( | ヽ ヽ:: ::::::... // リ. | つ、 r、{ | ヽ ヽ // / | ヽ '´ | ヽ ヽ // /
950 :
デフォルトの名無しさん :2006/02/10(金) 12:24:36
(>Д<)ゝ”イエッサ!!
入力バッファを破棄する方法ないですか?
すいませんどうもAPI関連っぽい話だったみたいなんで 質問取り下げます
別にAPIでもなんでも無いんだがな scanf("%*[^\n]"); これで改行まで読み飛ばし scanf("%*c"); その後これで改行読み飛ばし
FlushConsoleInputBuffer() 使ったほうがキモチイイ
>>955 それってどうゆう使い方をしてるのかkwsk
微妙な質問来るとおまえら質問者去ってから正解出す傾向ないか?w
>>956 入力バッファを流すと詰まりそうだからそんなAPIは存在自体気持ち悪い
それが俺に聞けクオリティ
fseek(stdin, 0, SEEK_END); って駄目なの?
>>962 まあそんな感じ
流してもプログラム側には文字は流れてこないから
# 別なところに流れていってるってのが正しい解釈なんだろうけど
>>955 バッファの破棄ってさ・・・直接コンソール入力で使いたいんじゃないか?
それ以外の場合なら破棄しなくてもどうにかなる気がするんだよね
>>963 規格では未定義
gccでは何も起こらなかった(クリアされなかった)
MSDNには多分期待した動作が載ってる、調べてないけど
>>964 破棄ってぽ〜んと消滅させてくれるんじゃなくて
どっか他のところに流すの?
なんか嫌だなそれ
969 :
デフォルトの名無しさん :2006/02/10(金) 16:12:17
標準入出力はfseekで送ったり巻き戻したりできんでしょ。 そんなこんなでgetchみたいな関数が巷で流行してる。
本当気持ち悪いな なんだあの破棄ってAPI・・・
getchって流行してるのか? ボタン押すまで次の処理しませ〜んとかの時には便利だけど
973 :
デフォルトの名無しさん :2006/02/10(金) 16:22:45
forループの変数 i が 0からはじまるのに、ループの中の if の条件の中に i-2 とか入れたいのですが、 int a[10]={0}; int i; for(i=0;i<10;i++){ if(a[i-2]==xx) a[i]=xx } このような書き方をしていいですか?
>>973 そのままだと当然、駄目
最初のi=0の時に思いっきり範囲外アクセスしてるから
976 :
973 :2006/02/10(金) 16:34:32
>>974 了解しました。
>>975 実はプログラム中に誤りを見つけて、条件を付け加えたいのです。
>>976 まず、質問の仕方を勉強した方がいい。
# 具体的に、どんな事をしたいのか?
# を聞いているのに
>>976 は無いだろう。
978 :
973 :2006/02/10(金) 17:34:21
すみません。 int a[10]={0}; int i; int b; for(i=0;i<10;i++){ if(a[i]==xx) b=a[i]; } このような感じのプログラムで i の値でそのあともずっと処理が続いていくんですが if(a[i]==xx)のとき、a[i]の一個前とか二個前とかの値が重要なことに気づきました。 で、プログラムを出来る限りいじらずに、 a[i-2]とかa[i-1]とかのデータを見て処理をするようにしたいです。
じゃあ a[i-1]とかa[i-2]入れちゃえ ただ実行前にif(i>0)とかi<1で範囲外にアクセスしないようにすりゃいい
int *a, data[12]={0}; int i, b; a = data + 2; for(i=0;i<10;i++){ if(a[i - 2]==xx) b=a[i - 2]; } /* a[-2] = data[0], a[-1] = data[1], a[0] = data[2] とする */
>>932 まだ見てるかな・・・?
> 最後の
> >}OAMEntry,*pOAMEntry;
> 部分がよくわかりません。
struct tagOAMEntry { いろいろ };
typedef tagOAMEntry OAMEntry;
typedef tagOAMEntry *pOAMEntry;
って分割して書くとわかるかな?
突っ込んでる人がいないんだけど、
>>940 は、typedef が消えてて実は同じ意味じゃない。
前者は型のエイリアス、後者は変数宣言。
2個前だか3個前だか知らんけど別のバッファに保存しとけば良いだけじゃ?
もうそんな時期か 立ててみるからまってなー
乙鰈
梅
うめぇ!m9っ`・ω・´)
990 :
デフォルトの名無しさん :2006/02/11(土) 07:31:42
不定長の1次元配列を作りたいのですがうまく出来ません。 その配列には要素を加えたり、取り除いたりしたいのですが、、任意の要素を動かすわけではなく、スタックのように一番最後のものだけを加えるか取り除くかすることを想定しています。 最初から固定的な配列をメモリに確保するともともとのサイズ以上の要素を入れたい場合たとえメモリが余っていてもダメです。ちょっとしか要素を使わなかった場合にはメモリがもったいないです。 かと言ってリンクドリスト構造にすると例えば100番目の要素にアクセスするのに100個の要素を辿る必要がありオーバーヘッドが大きいです。 要素を加える時と取り除く時に新たな配列を作り、古い配列の内容を全コピーした後、古い配列を削除するというのも考えたのですが、やはりオーバーヘッドが大きいし、メモリがガベージだらけになってしまうと思います。 どうやればいいのでしょうか?
間を取って、配列をリスト状に繋ぐといいよ。
スタックとして使うことを想定するんなら、何番目の〜は考えなくてもいいのでは?
使用目的によってはそうでもない。
| ヽ |.´。. γ |'; 'ё;゚ソ | ノ | ヘ、 | /`\_つ |∩ 人 |ω、 \
| ヽ |。. γ | 'ё;゚ソ | ノ | ヘ、 |/`\_つ |人 | \
| ヽ |。. γ | 'ё;゚ソ | ノ | |/` |人 | \
| ヽ |。. γ | 'ё;゚ソ | ノ | ヘ、 |/`\_つ ∩ |人 ω | \
|ヽ | γ |ё;゚ソ |ノ |ヘ、 |\_つ ∩ | ω |
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。