C言語なら俺に聞け! Part 121

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は専門の別スレッドがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
C言語なら俺に聞け! Part 120
http://pc8.2ch.net/test/read.cgi/tech/1136726279/
2デフォルトの名無しさん:2006/01/28(土) 10:13:20
3デフォルトの名無しさん:2006/01/28(土) 10:28:10
>>1
4デフォルトの名無しさん:2006/01/28(土) 18:32:47
printf(">>1 乙");
5デフォルトの名無しさん:2006/01/28(土) 18:35:31
994 名前:976[sage] 投稿日:2006/01/28(土) 18:13:52
レルどうも
なにやら話が盛り上がってますね


なにやらってテメーが振った話だろボケが
6デフォルトの名無しさん:2006/01/28(土) 18:40:37
>>999
>>5
なんだか血の気が多い人だ
7デフォルトの名無しさん:2006/01/28(土) 18:48:11
8デフォルトの名無しさん:2006/01/28(土) 19:29:24
ソートプログラムでけた。
関数は作れてないけど
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();
}
9デフォルトの名無しさん:2006/01/28(土) 19:30:20
あぁここに書き込むときに改行が多いって出たから余計な改行消してたらmainの{が消えてる・・。
10デフォルトの名無しさん:2006/01/28(土) 19:40:47
ひどいソースだ
11デフォルトの名無しさん:2006/01/28(土) 19:52:16
なにこの糞ソース
12デフォルトの名無しさん:2006/01/28(土) 20:18:11
ゴミのソースほど面白い…!
13デフォルトの名無しさん:2006/01/28(土) 20:24:35
カレンダーの表示プログラムですがプロトタイプ宣言で、
不正な文字のエラーになってしまいます。
どこが問題なのか分かりません。指摘して頂きたいのですがお願いします。
コンパイラは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;

}
14デフォルトの名無しさん:2006/01/28(土) 20:27:17
>>9-11
お手本よろ
15デフォルトの名無しさん:2006/01/28(土) 20:28:20
>>10-12
お手本よろ
16デフォルトの名無しさん:2006/01/28(土) 20:29:06
気にするな、ソート如きで良いソースも悪いソースもあったもんじゃない
釣りか基地外
17デフォルトの名無しさん:2006/01/28(土) 20:38:13
>>13
全角スペースが変なところにあるとか?
18デフォルトの名無しさん:2006/01/28(土) 20:44:19
>>17
スペース全部消して見たら出来ました!!
やっと起動できるようになりました!
くだらないミスをしてしまい、すいませんでした(;´Д`)
本当にありがとうございました。
19デフォルトの名無しさん:2006/01/28(土) 20:46:20
>>16

(1)意味もなくlong
(2)もし意味があってもscanf,printfでint型を指定している
(3)sort部分の比較でif(...){}else{...}となっている。普通に条件式を否定しろ
(4)#includeをしていない。 
(5)getchなどという処理系依存の関数の使用
(6)Cのくせに最後にreturn 0;をしていない

以上の点をもってソート如きで悪いソースですが?
20デフォルトの名無しさん:2006/01/28(土) 20:52:35
>>8-9が何がしたかったのかが知りたい。
218:2006/01/28(土) 20:59:33
>>19
1,2、前回のプログラムからの引用だった為書き換えミス
3、何か間違ってる?
4、省略(>>9参照)
5、結果出力後入力待ちにしている
6 mainがvoidのため不要
22デフォルトの名無しさん:2006/01/28(土) 21:02:32
>>31
>6 mainがvoidのため不要 
Σ(゚Д゚;エーッ!
23デフォルトの名無しさん:2006/01/28(土) 21:02:47
>>21
int main に見えるのだが・・・。
24デフォルトの名無しさん:2006/01/28(土) 21:03:00
>>21
>6
mainがvoidのため不要
>int main(void)
(ノ∀`)
2522:2006/01/28(土) 21:03:03
31 -> 21
26デフォルトの名無しさん:2006/01/28(土) 21:05:14
>>19
(3) そもそも a[i]>a[j] にすればいい話。
27デフォルトの名無しさん:2006/01/28(土) 21:05:26
>>21
>5、結果出力後入力待ちにしている
なんの反論にもなってないが…?
日本語ワカル?
28デフォルトの名無しさん:2006/01/28(土) 21:06:59
>>27
(5) のツッコミは無理があると思った。
29デフォルトの名無しさん:2006/01/28(土) 21:07:08
C99では return 0; いらない。
俺は書くけど。
30デフォルトの名無しさん:2006/01/28(土) 21:21:51
> 5、結果出力後入力待ちにしている

それは処理系依存の関数を使う理由にはならないが。
それ以前になんでそんなことしたいんだ?
画面がなくなっちゃうんですぅとかいう間抜けな答えは聞きたくないぞ?
31デフォルトの名無しさん:2006/01/28(土) 21:43:59
>>22-
落ち着いてひとつにまとめてレスしてくれ
前スレでCを勉強するために書いてるって言ってるし、「処理系に依存」とかそこまで知った事ではない。
getchは解説サイトに、プログラムの流れを途中途中で止める時によく使うし便利とあったから使ってるまで。

まぁ叩かれてるが
俺にとっては書き方があってるかどうか知りたかったからソース乗せたんだし勉強になってるからいいけど。
32デフォルトの名無しさん:2006/01/28(土) 21:55:26
なんで偉そうなんだ(笑
33デフォルトの名無しさん:2006/01/28(土) 21:57:18
ネット弁慶というやつですな
34デフォルトの名無しさん:2006/01/28(土) 21:58:28
自演のにおいがする
35デフォルトの名無しさん:2006/01/28(土) 21:59:50
単にツッコミきて逆切れしてるようにしか見えんが(笑
36デフォルトの名無しさん:2006/01/28(土) 22:05:22
>>8>>21
longの意味がない
returnで返していない
if文の改善

>>19
(3)はelseで否定の条件式は不要
37デフォルトの名無しさん:2006/01/28(土) 22:08:41
longは常にサイズが同じだから使う意味はある
intだと処理系で変わってしまう場合あり
まぁ・・・・宿題とか勉強ならどうでもいいけどね
38デフォルトの名無しさん:2006/01/28(土) 22:10:07
%lなってないってことで指定されたんだと思う
39デフォルトの名無しさん:2006/01/28(土) 22:14:14
あら・・・擁護しようがないな
40デフォルトの名無しさん:2006/01/28(土) 22:15:43
>longは常にサイズが同じ
>longは常にサイズが同じ
>longは常にサイズが同じ
>longは常にサイズが同じ
>longは常にサイズが同じ
41デフォルトの名無しさん:2006/01/28(土) 22:17:14
longに意味があるなら>>19の1に対しては抱擁になってるよw
3とか4の指定あたりでおかしいと判断できるけど
42デフォルトの名無しさん:2006/01/28(土) 22:18:42
>>40
あれ?間違ってた?
43デフォルトの名無しさん:2006/01/28(土) 22:20:35
>>41
Cは単に2ちゃんには書き込んでないってだけだと思うがw
Bはどうしようもないけどw
44デフォルトの名無しさん:2006/01/28(土) 22:23:10
>>42
例えばPS2(ee-gcc)でのlongは8バイトだぞ
45デフォルトの名無しさん:2006/01/28(土) 22:23:29
>>43
え?だから指定するまでもないのにおかしいなって
46デフォルトの名無しさん:2006/01/28(土) 22:25:30
>>44
マジで?long4バイトぢゃないの?
つかえねぇ・・・今後全部変数ダブルにしたろか

>>45
あ、そゆことか
47デフォルトの名無しさん:2006/01/28(土) 22:25:59
longのビット長>=intのビット長
仕様かこれかと
48デフォルトの名無しさん:2006/01/28(土) 22:26:48
bit数を指定したい時はstdint.h

......と、堂々と言える時代に早くなってほしいなぁ。
49デフォルトの名無しさん:2006/01/28(土) 22:47:37
stdint.h が使えるのが一番だけど、
無ければ自分で typedef すりゃいい。
サイズ固定なのにプリミティブ型直接使ってるような奴はクビ。
50デフォルトの名無しさん:2006/01/28(土) 22:52:48
VCがサポートしない限りそんな時代は来ない
51デフォルトの名無しさん:2006/01/28(土) 23:09:13
stdintとかfloat.hとか
それ系、指定の方法がわからない(ノ´∀`*)
52デフォルトの名無しさん:2006/01/28(土) 23:22:37
え?longって4バイトじゃないの?
4バイトとか8バイト固定したいときってどうすればいいの?
環境はWindows固定ということ前提にすると。
53デフォルトの名無しさん:2006/01/28(土) 23:25:58
>>8
getchはconio.hをインクルードしないと使えないけど分かってるのかな
54デフォルトの名無しさん:2006/01/28(土) 23:27:02
自分で適当な型をtypedefするしかないんじゃないの
55デフォルトの名無しさん:2006/01/28(土) 23:33:01
>>54
俺のタイプでふv
56デフォルトの名無しさん:2006/01/28(土) 23:33:14
もう、longもintもどっちにしろ環境依存なの?
でも、charは1バイトのままなの?
なんか俺の昔の記憶だと

char 1バイト
short 2バイト
long 4バイト
int 環境依存(Win32だと4バイト)
float 4バイト(浮動小数点)
double 8バイト(浮動小数点)

で、注意するのはintだけだったという記憶があるんだけど
実際はそうじゃないってこと?
環境はWindows固定ということで頼む。
57デフォルトの名無しさん:2006/01/28(土) 23:35:47
>>56
規格で決まっているのは、各型のバイト数の大小関係と、
sizeof(cahr)が1になると言うこと。

# ちなみに、CHAR_BITS(charのビット数)も環境依存
58デフォルトの名無しさん:2006/01/28(土) 23:38:18
>>56
> 環境はWindows固定ということで頼む。

その時点で環境の依存について無視してるだろ、ボケ。
59デフォルトの名無しさん:2006/01/28(土) 23:41:31
>>58
いや、とりあえず他の環境はそんなにかわることないし、
大抵Windowsにあわせてくる(移植楽だしね)から、
やっぱり、注目するべきはWindowsでしょ。これは現実の話(別にゴヒイキって話題じゃないよ)
60デフォルトの名無しさん:2006/01/28(土) 23:42:51
>>57
おお、そうなんだ。
大小とcharのバイトが1としか決まってないとはしらなんだ・・・。
ありがとう。
もう、こだわらないでプログラムするよ。
61デフォルトの名無しさん:2006/01/28(土) 23:42:59
>>56
floatも微妙に曲者
整数型との計算で制度落ちることある
doubleを使うべき
62デフォルトの名無しさん:2006/01/28(土) 23:43:23
>>59
> とりあえず他の環境はそんなにかわることないし

変わるから環境依存な訳だし、
そもそも、環境依存で環境を特定してどうするのかと(ry
63デフォルトの名無しさん:2006/01/28(土) 23:45:19
>>60
よっぽど使えないテキストで勉強したようだな。
本は複数読んでおけよ。
64デフォルトの名無しさん:2006/01/28(土) 23:46:01
別にlongが4バイトだと思ってるのはそんなに悪くもないんじゃない?
たとえ違う環境で8バイトになっててもメモリ使用量あがるだけだし
intが常に4バイトって勘違いしてるのが問題なんだろ?
環境によってはもっと小さくなることがあるわけだし
65デフォルトの名無しさん:2006/01/28(土) 23:47:40
型のサイズは規定してないけど
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かそれ相当を自分で定義しろって結論になるけど
66デフォルトの名無しさん:2006/01/28(土) 23:48:33
>>64
> たとえ違う環境で8バイトになっててもメモリ使用量あがるだけだし
> intが常に4バイトって勘違いしてるのが問題なんだろ?

どういう勉強をしたら、こんなアホな発言が出来るんですか?
67デフォルトの名無しさん:2006/01/28(土) 23:50:01
いっそ基本データ型全部100バイトにでもしたれΨ(`∀´)Ψケケケ
68デフォルトの名無しさん:2006/01/28(土) 23:55:44
>>66>>67
あほ
69デフォルトの名無しさん:2006/01/29(日) 00:01:58
>>64
> intが常に4バイトって勘違いしてるのが問題なんだろ?

違う。
typedefも使わずにサイズに依存したコードを書くことが問題。
70デフォルトの名無しさん:2006/01/29(日) 00:19:27
winももうすぐ64bitOSが出るから、あと10年経つと今の試食版みたいな存在になるかもな
71デフォルトの名無しさん:2006/01/29(日) 01:18:05
#include <stdint.h>
int32_t a;
72デフォルトの名無しさん:2006/01/29(日) 02:13:48
>>59
アホか。
整数型のサイズを決めてるのはコンパイラであって OS じゃない。
73デフォルトの名無しさん:2006/01/29(日) 02:20:59
>>72
マジで?
例えばWin32APIをコンパイルしたとして、
そのコンパイラがlongを8バイトとすればlongは8バイトになっちゃうってこと?

つーことは、俺がlongを4バイトとして組んでたのはあくまでも、
VCのコンパイラ仕様にあわせただけであって、
Windowsに対応したわけではなかったわけ?

あ、そうかも。
そうだな。64BitOSでも
32Bitモードってのがあってこれまで作った奴も動くらしいしねぇ。
これってそういうこといってんのかな?
74デフォルトの名無しさん:2006/01/29(日) 02:23:03
人の話を聞かないのは病気なのか?
75デフォルトの名無しさん:2006/01/29(日) 02:24:15
>>74
嫌味はいいから、結論だけいってよw
76デフォルトの名無しさん:2006/01/29(日) 02:26:01
なんだ、文盲か
77デフォルトの名無しさん:2006/01/29(日) 02:26:53
>>76
どうせロートルがたまに自分のわかる話で
自分より知識なさそうなの見つけたからレスつけたんでしょ?
ほら、わかる範囲で語ってきなよw
78デフォルトの名無しさん:2006/01/29(日) 02:41:21
ポインタって文章よんで学んでる分には別に難しく感じなかったけど、これを使いこなせるようになれってこと?
ポインタ、ポインタノポインタ、ポインタノポインタノポインタまで理解はできたけど。
79デフォルトの名無しさん:2006/01/29(日) 02:48:54
>>77
あぁもううるさい奴だな。
それぞれの型がどうなるかはコンパイラ依存だと言ってるだろう。
実行ファイルの状態でも型情報が C の形で表現されてる訳が無いだろうが。

全く、こういう奴いたら先ずクビだな。
80デフォルトの名無しさん:2006/01/29(日) 02:50:20
>>78の要約
『トリプルポインタは分かるけどクワドルプルポインタは分かりません >< 』
返答
『そんなこと言ってる時点で理解できてないのは明白です』
81デフォルトの名無しさん:2006/01/29(日) 02:51:32
>>78
経験上、「理解できた」と軽々しく口にする奴ほど分かってない事が多い。
82デフォルトの名無しさん:2006/01/29(日) 02:53:54
>>78
ポインタのポインタはポインタでしかないから、ポインタを正しく理解できているのなら
ポインタのポインタはそんなに難しくないと思う。まして、
ポインタのポインタのポインタはポインタのポインタと解釈できるのだから
ポインタのポインタのポインタのポインタになったところで大したことはない。
必要なら、適宜typedefでもしとけと。
83デフォルトの名無しさん:2006/01/29(日) 02:58:54
わざわざ自演しなくていいよ
経験上この時間帯に二人にレスされることはめったにないから。
明日が休日だからという理由もあるかもしれないが。

とりあえず
「>軽々しく」と軽々しく判断した基準と。
疑うんなら力試しにでもなるような問題作れるなら出してみてよ
84デフォルトの名無しさん:2006/01/29(日) 03:01:54
頭の中で理解している と 使いこなせる は別物?
と言いたいわけで

理解できてるなら使いこなせる、か。
85デフォルトの名無しさん:2006/01/29(日) 03:07:31
>>83
大丈夫、しばしばこの板で>80みたいなことを書いている漏れは、ここ最近のこのスレでは>82しか書いてないから。
86デフォルトの名無しさん:2006/01/29(日) 03:07:44
>>83
>「>軽々しく」と軽々しく判断した基準
読んだだけで理解できたとか言ってる所だろw
87デフォルトの名無しさん:2006/01/29(日) 03:09:06
>>78
ポインタは絵で理解するといいよ
88デフォルトの名無しさん:2006/01/29(日) 03:14:34
>>86
本を熟読して、本についている絵をガンミしながら、頭の中フル回転で、さらに自分で試しながらコンパイルして、ポインタを理解したつもりだけど〜
って書けばよかったね。
89デフォルトの名無しさん:2006/01/29(日) 03:16:28
言い方が悪かったようだ・・
実際にプログラムにポインタを組み込む事はあるの?
90デフォルトの名無しさん:2006/01/29(日) 03:17:54
あんただれ
91デフォルトの名無しさん:2006/01/29(日) 03:18:26
きみもだれ
92デフォルトの名無しさん:2006/01/29(日) 03:18:31
>>88
そこまで書けば、信用しなくもないが、
ポインタのポインタのポインタのポインタのポインタが何かくらいは分かるよな?
93デフォルトの名無しさん:2006/01/29(日) 03:21:52
ポインタのポインタのポインタのポインタのメモリアドレスを格納した変数
94デフォルトの名無しさん:2006/01/29(日) 03:23:36
アセンブラやるのが一番だろう。
95!88:2006/01/29(日) 03:26:02
>>92
ポインタ
どんなに修飾しようがただのポインタ。それ以上でもそれ以下でもない
(この文章を論理的に考えると空集合になるのは気づいても言ってはいけない)
96デフォルトの名無しさん:2006/01/29(日) 03:26:14
Javaをやれば無問題
うはw漏れ頭いいww
97デフォルトの名無しさん:2006/01/29(日) 03:29:06
JavaはCやってC++やってやるつもり。
98デフォルトの名無しさん:2006/01/29(日) 03:30:35
>>93
よろしい。
んじゃ、次。

x, y を引数に取り、sqrt(x*x+y*y) と atan2(y, x) を返す関数を作れ。
ただし、構造体とグローバル変数は使わないこと。
x == 0 && y == 0 の場合は考慮しなくていい。
99デフォルトの名無しさん:2006/01/29(日) 03:34:49
>>98
関数に仕様は?計算値はどうやって返すんだい?
100デフォルトの名無しさん:2006/01/29(日) 03:35:42
>>98
ポインタ以前に言ってる意味が分かりません
sprtは平方根か何かだと思うけど・・atan2とか知らない
101デフォルトの名無しさん:2006/01/29(日) 03:43:55
>>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)。
104デフォルトの名無しさん:2006/01/29(日) 03:48:07
>>102
全然一致してない。死ね。
105デフォルトの名無しさん:2006/01/29(日) 03:49:44
平方根の値とタンジェントの逆?の値をxとyに返す関数と言う事?
106デフォルトの名無しさん:2006/01/29(日) 03:50:56
またまた横槍だけど

atan関数がtanの逆関数
atan2は引数がxとyがあり、y/xのアークタンジェントを返す
xのアークタンジェントとは違う
107デフォルトの名無しさん:2006/01/29(日) 03:53:04
>>104
日本語出来ない人?
完全に一致してると思うが?

因みに”返す”なんだからリターンだろ
ポインタ渡しは、返すとは言わないよな?
108デフォルトの名無しさん:2006/01/29(日) 03:53:49
なんで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);
}
110デフォルトの名無しさん:2006/01/29(日) 03:54:39
えーはっきりいえば、アークドラゴンも意味が分からないし
どういったプログラムなのかも分からない
ただ>>102を見たからかもしれないけど

void a(float x, float y)
{
return sqrt(x*x;y*y),atan2(x;y);
}

>>105の様になるよね?
けどポインタをどこで使えばいいのかも分からないし、基本自体が意味不明
111デフォルトの名無しさん:2006/01/29(日) 03:55:39
sqrtとatan2の引数間違えた
112デフォルトの名無しさん:2006/01/29(日) 03:56:58
>>110
それはダメすぎだろう。一眠りしておいで。
113デフォルトの名無しさん:2006/01/29(日) 03:57:57
俺にそんな意味のわからない問題を出すからこうなる
114デフォルトの名無しさん:2006/01/29(日) 03:58:56
voidじゃなくてfloatか。
それともfloat→doubleにしないといけないの?
115デフォルトの名無しさん:2006/01/29(日) 04:00:16
”返す”関数を作れる人は少ないねw
仕様が文章である限り、プログラム以前の問題が多いなw

言いたい事は
sqrt(x*x+y*y) と atan2(y, x) の値を取得出切る関数じゃないの?w

116デフォルトの名無しさん:2006/01/29(日) 04:01:28
>>107
sqrt(x*x+y*y) と atan2(y, x) を返せと言ったのに、
足した値を返してどうする。
アホか。死ね。

>>108
標準関数じゃないからこのスレでは御法度。
C99 ならあるけど、C99 は普及率低杉なので。

>>110
void で return 使ってどうやって値を返すのか。
しかも 2 つもの値を。

>>109
それであってるが、あんた >>88 じゃないよな?
というか、>>88 のレスはどれだ?
117デフォルトの名無しさん:2006/01/29(日) 04:03:17
_のプリフィクスもってる時点でウンコ
118デフォルトの名無しさん:2006/01/29(日) 04:05:33
因みに適当だが、>>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;
}
119デフォルトの名無しさん:2006/01/29(日) 04:08:05
>>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)
}
120デフォルトの名無しさん:2006/01/29(日) 04:08:29
>>116
”sqrt(x*x+y*y) と atan2(y, x) を返せ”
それを個別だとも、足してはいけないとも記述は一切ないが?

そのさ…、自分の中の当り前って感覚をどうに出来ない?w
ドキュメントとか作れない人だろw
121デフォルトの名無しさん:2006/01/29(日) 04:09:29
>>117
命名規則には立ち入るべからず。
_ + (大文字 or _) から始まるのなら話は別だが。

>>118-119
はいはい、ワロスワロス。

>>120
Kusakabe みたいなこと言うなよ。
122デフォルトの名無しさん:2006/01/29(日) 04:10:29
199じゃないの?
198とかのソース見た時点でわけわかめなのに分かるわけない。
123デフォルトの名無しさん:2006/01/29(日) 04:11:35
>>119

確かに、それも文章通りの正解だw
感服した
124デフォルトの名無しさん:2006/01/29(日) 04:15:06
今、一生懸命に>>98の文章能力の欠如を
当り前の普通の様に言ってるレス主は98?

通常の仕事では、文章で説明なんて当然。
それが、あやふやなのに、その態度は頂けない。
つーか、仕事出来ないだろw
125デフォルトの名無しさん:2006/01/29(日) 04:20:05
仕事で>>98みたいなの見たら直接聞きに行くから別に桶
126デフォルトの名無しさん:2006/01/29(日) 04:23:17
滅多につかまらない、他会社のSE様だったら?w
127デフォルトの名無しさん:2006/01/29(日) 04:24:29
引数からポインタを使って返そうとかいったらネタバレになるだろ。
そこを考えるのも問題のうち。

というか、先ず前提として「ポインタの問題」ってのがあるのに、
ポインタ使わない答えが「文章通り」とかあり得ない。
逆に言えば、ポインタ使ってるなら、
足したの返すのは論外としても、
>>118-119 みたいな仕様でも正解と見なす。
問題があやふやな分、そこは寛容にいくよ。
128デフォルトの名無しさん:2006/01/29(日) 04:26:16
>>126
今後の身の振り方を考えるかもなw
129デフォルトの名無しさん:2006/01/29(日) 04:28:09
>>127
88は119なわけだけど正解なんだ、やった・・
ポインタをどこでどう使えばいいのかも分からない(知識の問題で)からどうしようもない
130デフォルトの名無しさん:2006/01/29(日) 04:28:24
>>127
いや、待て118-119はポインタ使ってないw
131130:2006/01/29(日) 04:29:41
いや、すまん。日本語の構文解析ミスだ。気にせず流しおいて
132デフォルトの名無しさん:2006/01/29(日) 04:30:12
>というか、先ず前提として「ポインタの問題」ってのがあるのに、
>ポインタ使わない答えが「文章通り」とかあり得ない。
それが自分の中の当り前を決め付けで、説明をしないで仕事を進める駄目人間の特徴。
お前さん、仕事できないタイプだねw

>足したの返すのは論外としても、
足しても>>98の何処にも引っかからないが?
引っかかるのは、アンタの当り前だろw

>逆に言えば、ポインタ使ってるなら、
>足したの返すのは論外としても、
>>118-119 みたいな仕様でも正解と見なす。
118と119のどこがポインタを使ってるか説明を求めるw
133デフォルトの名無しさん:2006/01/29(日) 04:30:46
>>129
いや、不正解だって・・・。
ポインタ使ってないっしょ。
134デフォルトの名無しさん:2006/01/29(日) 04:32:36
>>129
(もしも)ポインタを使ってるなら(現実は違うけど)正解と書いてますから
残念ながら不正解ということですね。

うむ、構文解析を俺も一回ミスって>>118-119が正解と読み間違えた
135デフォルトの名無しさん:2006/01/29(日) 04:33:00
>>132
>それが自分の中の当り前を決め付けで
流れ読めよ・・・。

>足しても>>98の何処にも引っかからないが?
a と b を返せと言われて a + b を返す奴がいたら
気が狂ってるとしか思えない。

>118と119のどこがポインタを使ってるか説明を求めるw
・・・。
136デフォルトの名無しさん:2006/01/29(日) 04:33:59
>引数からポインタを使って返そうとかいったらネタバレになるだろ。
>そこを考えるのも問題のうち。

>というか、先ず前提として「ポインタの問題」ってのがあるのに、

大いなる矛盾だなw
ポインタを使って返そうとかいったらネタバレ
なのに
先ず前提として「ポインタの問題」
なのか…
ww
137デフォルトの名無しさん:2006/01/29(日) 04:35:14
>>136
ドツボにハマってるなお前・・・。
138デフォルトの名無しさん:2006/01/29(日) 04:37:12
aとbを個別で欲しい仕様があるのに
a と b を返せとしか書かない奴がいたら
気が狂ってるとしか思えない。

aとbが分けられないだけで
a + b でも a と b を返しているだろw
139デフォルトの名無しさん:2006/01/29(日) 04:37:53
>>136
たぶん、どこでポインタを使うかを考える問題なんじゃない。
少なくとも正解がわかれば、ポインタがなぜ必要かが分かるのだからね。

まとめ ポインタの使い道
 複数の返り値を返せない貧弱言語のCの欠陥を誤魔化すのに使える。
 あとは動的なデータ構造を構成したいときとかだな
140デフォルトの名無しさん:2006/01/29(日) 04:38:04
流石にもう相手してられんわ。
141デフォルトの名無しさん:2006/01/29(日) 04:39:50
>>139
まとめ乙。
そういうこと。
142デフォルトの名無しさん:2006/01/29(日) 04:40:07
なんか問題を求めたところからすごい流れになったもんだ

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・・?
143デフォルトの名無しさん:2006/01/29(日) 04:41:34
>>142
Null Pointer Exception (言語違うけど)
144デフォルトの名無しさん:2006/01/29(日) 04:41:53
>>142
ダメ。
x や y を 0 (ヌルポインタ)で初期化してるのに
*x や *y に代入しちゃダメ。
145デフォルトの名無しさん:2006/01/29(日) 04:43:42
xとyの前に*をつけた場合は?
146デフォルトの名無しさん:2006/01/29(日) 04:43:53
>>142
が関数のポインタ渡しの解答、と言えるのも
>>98>>132の言い分があるからだねw

ばっかじゃねーのw
文章がしっかり書けないのに
流れとか、それらしい言い訳を後から言うからだ
ほんとに、仕事出来ない人間だろ
147デフォルトの名無しさん:2006/01/29(日) 04:46:04
とりあえず、>>109 が出題者の意図を最大限に酌んだ答えで、
>>139 が出題者の意図を最大限に酌んだ解説だから、
読んどくように。

>>146
はいはい、ワロスワロス。
148デフォルトの名無しさん:2006/01/29(日) 04:48:16
"出題者の意図を最大限に酌んだ"

これを仕事で当てはめられる
”出題者”と同義の立場の人は、主に仕事が出来ないと言われますw
149デフォルトの名無しさん:2006/01/29(日) 04:50:25
>>147
ほほぅ・・。
150デフォルトの名無しさん:2006/01/29(日) 04:51:51

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
から、これが関数のポインタ渡し
と言えてしまうのか……
151デフォルトの名無しさん:2006/01/29(日) 04:52:38
考えさせることが目的の「問題」と
間違いが無いことを要求する「仕事」を
同列で語ってる奴テライタス
152デフォルトの名無しさん:2006/01/29(日) 04:55:19
考えさせることが目的の「問題」でも
間違いが無いことを要求するものだが…

間違っても考えれば良いってか?
日本、馬鹿量産だな……
153デフォルトの名無しさん:2006/01/29(日) 04:56:57
それって間違った内容を新人に教えて
言い訳が、”考え方を言ったんだよ”
って言い訳してる、使えない奴だなw
154デフォルトの名無しさん:2006/01/29(日) 05:00:36
分からなければヒント与えつつ
誘導していくつもりだったのに
横から答えられたからこうなったんだよw

まあ、間違えてもいいから考えて、
そして正解にたどり着けば、
単に正解を教えるだけの場合より
理解が深まるというものなのだ。
155デフォルトの名無しさん:2006/01/29(日) 05:04:13
>分からなければヒント与えつつ
>誘導していくつもりだったのに

と、考える為の文章が拙いのは意味が違うと思うが?

分からなければ”文章を変更しつつ”
誘導していくつもりだったのに
じゃないの?w
156デフォルトの名無しさん:2006/01/29(日) 05:10:01
>>155
はぁ・・・。
お前、どうしようもない奴だな。

これは「ポインタを理解してる」かどうかの試金石となる問題なんだから、
先ずかなりぼやかしてでも意図が酌めるかどうか確認しただけだ。
「ポインタを理解してる」ならあの文章で十分意図は酌めるし、
実際そういう人がいる。

あんた、ダメダメだ。
もう相手にしないよ。
157デフォルトの名無しさん:2006/01/29(日) 05:11:59
>>132で、文章の受け取り方を間違った人間が沢山いる時点で
文章能力に欠如があるのは一目瞭然なんだが…
158デフォルトの名無しさん:2006/01/29(日) 05:14:34
>「ポインタを理解してる」ならあの文章で十分意図は酌めるし、
>実際そういう人がいる。

これを前提に物事を語る奴が、問題を引き起こすんだよw
実際そういう人がいる。

あんた、ダメダメだ。
もう相手にしないよ。
159デフォルトの名無しさん:2006/01/29(日) 05:18:29
究極の馬鹿だな
誰の事か分るだろ

こう言ってるのと同義って事かなww
で、お互いが相手を”究極の馬鹿”と思うわけだ
文章は正しく書こうなw
160デフォルトの名無しさん:2006/01/29(日) 05:23:54
>「ポインタを理解してる」ならあの文章で十分意図は酌めるし、
>実際そういう人がいる。

この姿勢を散々指摘されてるのを自覚してないんだ……
友達同士の雑談ならともかく、どんな場面(学校、会社)だとうろNGだろ
まして、教えるって場合はなお更だ
161デフォルトの名無しさん:2006/01/29(日) 05:46:12
>>159
w の無い人は w のある人とは別人? 自演じゃないよね?
とりあえず、>>78 から一言一句逃さず全部読んで理解しろ。特に >>83
力試しとか試金石とかそういうところ全部読み飛ばされても、
困るとしか言いようが無い。

正直な所、流れも把握してないやつまで理解させる気はないよ。
流れも把握してないのに勝手に横レスして訳分からんとか、ふざけてるのかと。
162デフォルトの名無しさん:2006/01/29(日) 06:00:44
話の流れを理解するのと
話の流れが無いと成立しな文章を書く事が指摘されるのは
まったくの別問題だと思う……

なんども言うが、
話の流れがあるからって略しても良い部分と悪い部分があり
アンタは略してはいけない部分を略したって事だよ
話の流れがあるからって、問題の内容自体を略しちゃいけないだろ

例えば、食べ物の話をしてて
”悪い物ってなんだ?”
って質問に、
”殺人”
と答えたら、
話の流れを理解してない食べ物に関して悪い事だよ

って言い出すような奴は、ほぼ他人とコミュニケーションが上手く出来ない
163デフォルトの名無しさん:2006/01/29(日) 06:05:27
>>162
いや、どう考えてもその場合は後者のコミュニケーション能力不足だろw
文脈からの推論くらいしろよ。
164デフォルトの名無しさん:2006/01/29(日) 06:06:04
>正直な所、流れも把握してないやつまで理解させる気はないよ。

じゃあ、そう言う奴にはレスを返すなよ
見苦しいよ、お前
165デフォルトの名無しさん:2006/01/29(日) 06:10:26
自分の言ってる事を伝えられない事を
コミュニケーション能力不足と言うのであって

文章の意味、内容的に合っている解答なのに
文章製作者の勝手な前提を汲めない事を
コミュニケーション能力不足とは言わない
166デフォルトの名無しさん:2006/01/29(日) 06:11:38
>>162
数学のテストでそんなに親切な指定があるか?
この公式を使えだの、こういう道筋で解きなさいだの。
普通は無いだろ。
そういうのを「知っているか」「理解してるか」「思いつくか」を見るものだし、
出題範囲って前提条件も酌んで答える事も要求されるだろ。
それがテストってもんだ。

隠した仕様があるのは、その仕様が定石で、
その仕様を答えさせることも問題の一部だったから。
それはもう >>127 で言ってる話だ。
167デフォルトの名無しさん:2006/01/29(日) 06:14:16
>>163
その理屈が成り立つなら
ヒューザーの小嶋社長が、国会や住民説明会で言ってる意味不明な内容も
流れを理解してない国民のコミュニケーション能力不足なのか……
168デフォルトの名無しさん:2006/01/29(日) 06:16:56
>>167
状況違いすぎるだろw
169デフォルトの名無しさん:2006/01/29(日) 06:17:04
>数学のテストでそんなに親切な指定があるか?
>この公式を使えだの、こういう道筋で解きなさいだの。
>普通は無いだろ。
>そういうのを「知っているか」「理解してるか」「思いつくか」を見るものだし、
>出題範囲って前提条件も酌んで答える事も要求されるだろ。
>それがテストってもんだ。

馬鹿確定?
数学のテストは、他に答え様が無いように設問される。
当然、文章問題もな。
それで、文章、内容ともにあってるなら正解なる。

で、あとで設問者がこってり絞られるんだよw
170デフォルトの名無しさん:2006/01/29(日) 06:20:22
つーか、センター試験レベルの
数学の問題を解いた事ないのは判った
171デフォルトの名無しさん:2006/01/29(日) 06:24:35
>隠した仕様があるのは、その仕様が定石で、
>その仕様を答えさせることも問題の一部だったから。
>それはもう >>127 で言ってる話だ。

ポインタ渡しを隠す為に、
”返す”と不適切な言葉を使うのは
値を得る方法と言って濁したりする事とは
まったく別の問題だと思う

百歩譲って、あんたの理屈が成り立っても
あんたの文章が、あんたの理屈道理じゃ無いんだから
文章能力が無いのを認めなよ…
172デフォルトの名無しさん:2006/01/29(日) 06:29:52
因みに、小学生の掛け算の算数の問題で
足算で全部解いても、正解を貰ったよけどね

今の授業が掛け算を教えてるとか
流れを読めとか先生は言わなかったぞw
以下、中高大でも同じ
それがテスト設問者の能力だろ

で、それがテストってもんだw
173デフォルトの名無しさん:2006/01/29(日) 06:32:15
>>169
数学のテストの答えなんて、
出題範囲超えればいくらでもバリエーションがあるし、
出題範囲内でも色々解法があることも多い。
エレガントな解法もあれば、愚鈍な解法もある。
最終的な答えが1つでないこともある。
例を上げさせるような問題の場合はな。
日本じゃ滅多にないだろうが。

この問題の曖昧さは、>>127 の事情がある以上、ある程度は避けられない。
だから、その曖昧さの範囲内であれば一応正解とせざるを得ない。
でも、その答えにはエレガントなものもあれば、愚鈍なものもある。
だから、愚鈍な解法を提示されれば、一応それでもできるけど、
もっといい方法がある・・・とヒントを出しつつ誘導していくわけだ。
普通のテストと違うのは、質問を限定的に受け付けられるってこった。

>>171
「計算結果は、第3、4引数からポインタを介して返される」
どっかおかしいか?
174デフォルトの名無しさん:2006/01/29(日) 06:33:21
逆に言うと、
”この公式を使えだの、こういう道筋で解きなさいだの”
を言わずに、それを使わざるを得ない問題を出せないレベルの設問者って事でFA?
175デフォルトの名無しさん:2006/01/29(日) 06:34:48
>>174
じゃあ、お前が問題作れよ。10分で。
あんまり長いといなくなるかもしれないぞ?
176デフォルトの名無しさん:2006/01/29(日) 06:35:35
>「計算結果は、第3、4引数からポインタを介して返される」

初 め て 提 示 さ れ た 内 容 で す
 初 め て 提 示 さ れ た 内 容 で す
  初 め て 提 示 さ れ た 内 容 で す

三回言っちゃたよw
177デフォルトの名無しさん:2006/01/29(日) 06:36:42
>>176
「返す」という言葉がおかしいかどうか聞いてるだけだ。
178デフォルトの名無しさん:2006/01/29(日) 06:37:59
x, y を引数に取り、sqrt(x*x+y*y) と atan2(y, x) の値を個別に得る関数を一つ作れ。
ただし、構造体とグローバル変数は使わないこと。
関数の戻り値はvoid型とすること。
x == 0 && y == 0 の場合は考慮しなくていい。
179デフォルトの名無しさん:2006/01/29(日) 06:38:49
>>178
うん。戻り値の型が void だってのは言った方が良かったね。
それは認める。
180デフォルトの名無しさん:2006/01/29(日) 06:40:41
関数を通しての、ポインタ渡しの値の取得を
”返す”とは言わないだろw
181デフォルトの名無しさん:2006/01/29(日) 06:41:43
182デフォルトの名無しさん:2006/01/29(日) 06:45:20
さすがム板。

憂さ晴らしコバンザメプログラマー住人の揚げ足取りと
教えてあげる君教師ヅラの逆切れ持論全開の全面戦争勃発か。
お前らキモイよ
183デフォルトの名無しさん:2006/01/29(日) 06:45:31
散々指摘していた部分を汲んだ問題再提示が、10分もかからなかった件について
それをあっさり認めたにも関らず、今までの指摘を認めない件について
184デフォルトの名無しさん:2006/01/29(日) 06:48:08
GetClientRect
ウィンドウのクライアント領域の左上端と右下端の座標を返します。座標は、クライアント座標で返されます。

lpRect
RECT 構造体へのポインタを指定します。この構造体にクライアント領域の座標が格納されます。left メンバと top メンバは 0 になります。right メンバと bottom メンバは、クライアント領域の幅と高さになります。

戻り値
関数が成功すると、0 以外の値が返ります。
関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、GetLastError 関数を使います。

関数の説明と戻り値には”返す”とあるが、引数には一切”返す”と使われないww
185デフォルトの名無しさん:2006/01/29(日) 06:50:06
>>183
再提示を求めてたんじゃなくて、新しく問題を作る事を想定してたけど。
今までの議論を踏まえて考えられるんだから、
そりゃ再提示くらいならすぐできるわさ。

>>184
つまらん揚げ足取りだな。
それに、その論理なら >>98 には問題がない事になる。
186デフォルトの名無しさん:2006/01/29(日) 06:52:01
ポインタ渡しの説明は
取得とか格納されます
だよな、普通は

”lpRectを介して”ウィンドウのクライアント領域の左上端と右下端の座標を返します。
なんて書かれてるならともかく…
187デフォルトの名無しさん:2006/01/29(日) 06:55:58
文脈が微妙に違うだろ。

もう疲れた。
もういいよ。あとは好きに遊んでて。
188デフォルトの名無しさん:2006/01/29(日) 06:56:07
>>185
…お前…つまらん揚げ足取りじゃなくて
ポインタの重要なニュアンスだぞ?
日本語的にも、関数説明の”返す”と戻り値説明の”返す”はまったく意味が違うだろ

「計算結果は、第3、4引数からポインタを介して返される」
これは、どう見ても
戻り値説明で使われてる”返す”を、関数説明で使われる”返す”と混同してる文章だw
189デフォルトの名無しさん:2006/01/29(日) 06:59:30
そもそも、英語ドキュメントを
馬鹿翻訳したものを自論の根拠に提示してる時点で
”…もしかして…ポインタを詳しく知らない?”
ってレベルかも?
190デフォルトの名無しさん:2006/01/29(日) 07:08:41
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
19188:2006/01/29(日) 07:10:15
まだやってたのか
192デフォルトの名無しさん:2006/01/29(日) 07:19:47
もう相手しないとか、疲れたとか言いながら
真っ赤になって、鼻の穴膨らまして
反論の文章を練ってるんだよw
193デフォルトの名無しさん:2006/01/29(日) 07:26:29
なんちゅうか、ポインタの問題であんなの出す時点でうんこだな。
人に教える能力はゼロだよ。
とりあえず88はこんなセンパイに出会ったら適当にあしらって相手にしないが吉だね。

引数arrとnを取り、arrに大きさnのint配列として利用できる領域を確保し、
その成否を返す(失敗=0、成功=非0)関数を作れ

とか言ってみる。
194デフォルトの名無しさん:2006/01/29(日) 07:43:20
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;
}
195デフォルトの名無しさん:2006/01/29(日) 07:52:58
はや(怪しいけど)。では上を(1)として

(2) ではそれを使用するコードを作れ

(3) (1)(2)でキャストを使用している場合、キャストの不要な形で作り直せ。
  「キャストを使用している」は、引数渡しでキャストしている部分を含む。
  ただしmallocの戻り値を格納するときに使用しているキャストはそのままでよい。
196デフォルトの名無しさん:2006/01/29(日) 08:03:46
#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;
}
197デフォルトの名無しさん:2006/01/29(日) 08:11:20
やっぱ怪しかったね。
それ、おちるよ。
198デフォルトの名無しさん:2006/01/29(日) 08:20:49
199デフォルトの名無しさん:2006/01/29(日) 08:23:58
わりい。成否返しているのにテストしてなかった。80点だな。
200デフォルトの名無しさん:2006/01/29(日) 08:24:49
サンクスです。作り直しました。

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;
}
201デフォルトの名無しさん:2006/01/29(日) 08:44:24
そいえば超68kさんの日記のとこでポインタについて面白い日記公開してたなぁ
202デフォルトの名無しさん:2006/01/29(日) 09:52:28
ロング型で質問なんですが引数等に、OLなどを多々見かけますが
「L」を付ける意味はなんですか?
どんな効果なのかを教えてください。
203デフォルトの名無しさん:2006/01/29(日) 10:01:03
30L = (long)30
204デフォルトの名無しさん:2006/01/29(日) 10:02:49
>>203
ロング型にキャストした整数なんですね。解答ありがとうございました!!
205デフォルトの名無しさん:2006/01/29(日) 10:17:00
>>204
違う。
「long型の整数リテラル」と言う事。
206デフォルトの名無しさん:2006/01/29(日) 10:29:47
>>205
整数リテラルなのですか。何度も解答すいません。ありがとうございます!!
207デフォルトの名無しさん:2006/01/29(日) 10:36:31
>>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デフォルトの名無しさん:2006/01/29(日) 10:39:15
>>206
接尾子でググルといい。
209デフォルトの名無しさん:2006/01/29(日) 10:50:59
>>208
親切に有難う御座います・゚・(つД`)・゚・ サイトを見て回りたいと思います。
210デフォルトの名無しさん:2006/01/29(日) 10:58:03
随分と昨日は楽しそうだったな
早く寝て損した
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]);

}
212デフォルトの名無しさん:2006/01/29(日) 15:09:23
>>211
> 質問です。このプログラムで「いやん あはん やめてぇ〜」を
> sexmanual.txtから読み込みたいのですが、想定以上にいやがられます。
童貞捨てて経験積めば嫌がられなくなると思うよ。

あと全角スペースが入ってるのはなんで?
213デフォルトの名無しさん:2006/01/29(日) 15:17:45
>>212
ワロタwww早く童貞が捨てられるよう頑張ってみますw
上は打ち間違えました。
「いやん あはん やめてぇ〜」を「いやん,あはん,やめてぇ〜」に読み替えてください。
それにしてもやはり私が童貞だから・・・orz。
214デフォルトの名無しさん:2006/01/29(日) 15:19:26
配列の取り扱い
215デフォルトの名無しさん:2006/01/29(日) 15:20:22
>>211
test[1] とかに読み込もうとしてるからだね。
test[1] には "いやん" のアドレスが入ってるわけだが、
ここに書き込もうとすることは、
文字列リテラルの置いてある領域に書き込もうとしてることになる。
文字列リテラルの置いてある領域には普通書き込めず、エラーになる。

まあ、環境によっては書き込める場合もあるけど、
だからといってこんな事はやっちゃだめ。
216デフォルトの名無しさん:2006/01/29(日) 15:26:54
書き込みたいならバッファ確保しとくべきだなぁ。
217デフォルトの名無しさん:2006/01/29(日) 15:29:14
>>215
レスありがとうございます。
えっとsave()はtest[]でやってもいいけどload()ではtest[]を使うと
文字を入れてある領域に不正がでるから違う変数で読み込ませてそれをtest[]に
コピーすればいいってことですか?C言語はむつかしいですね。
218デフォルトの名無しさん:2006/01/29(日) 15:32:08
>>217
違う
219デフォルトの名無しさん:2006/01/29(日) 15:32:35
%sに埋め込むのは

十分なバッファが確保されているchar型配列へのアドレスだよ
220デフォルトの名無しさん:2006/01/29(日) 15:37:58
皆様のおかげで解決しました。原因はアドレスだったのですか・・。
本当に感謝します。ありがとうございました。m(- -) m
221デフォルトの名無しさん:2006/01/29(日) 15:41:38
不安だから、一応最終形を見せて欲しいな。
222デフォルトの名無しさん:2006/01/29(日) 17:36:32
結局のところ、>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;
}
}
とやって、ある特定のデータがきたらそこの配列の番号をしりたいのですが
うまくいきません。
どうすればいいでしょう?
224デフォルトの名無しさん:2006/01/29(日) 17:47:45
>>223
ソースがそれだけじゃわからん
225デフォルトの名無しさん:2006/01/29(日) 17:48:27
>>223
特定のデータがfreadで全く読み込まれてないから、一回もaが変わらず(エラーになる)。
int長は環境にもよるから、unsigned char d[100]で100バイト読み込みましょう。
226デフォルトの名無しさん:2006/01/29(日) 17:57:44
fread(&d, sizeof(int), 100, FILE);
とかやってんなら、FILEからsizeof(int)=(32ビットPCだとだいたい4、環境依存)バイトずつだとか読み込まれるから。
さらにx86とかだとリトリエンディアンになるからry

全部int型で書き込んだファイルをそう読みたいんなら他のところが違うんだろう。
227223:2006/01/29(日) 18:00:57
>>225,226
ありがとうございました。
intが原因でした。
228211: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);
}
229211:2006/01/29(日) 18:28:14
これでいかがでしょうか。実は先ほどたまたま運良く結果が出ていたのをうまくいったと勘違いしていた様です。
すぐに気がついたのですが、皆さんの好意を無駄にしたくないと思って入門書の配列とポインタのところや皆さんの
アドバイスを何度も読み直してさきほどようやく原因を究明してコードを完成させました。
これでようやく私の作りたいものができそうです。改めてありがとうございました。
230デフォルトの名無しさん:2006/01/29(日) 20:13:21
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]と等価なのである
しかしそのコードではポインタのポインタを引数として与えているので我輩の脳内コンパイラではエラーが起こるであろう
231デフォルトの名無しさん:2006/01/29(日) 20:57:07
ポインタをグローバルで唱えて値も代入していない時点でウンコなんだが
232質問:2006/01/29(日) 20:59:32
gclのソースを弄って、gclを立ち上げるときに、
自動的にこちらの指定したlispのコードを実行させるようにしたいのですが、
どうすればいいでしょうか?
233デフォルトの名無しさん:2006/01/29(日) 21:10:07
>>230
ポインタのポインタじゃなくて、配列へのポインタ。
アドレスは一緒なんで、動作的には問題は起こらない。

>>232
CommonLisp スレで聞け。
234デフォルトの名無しさん:2006/01/29(日) 21:11:33
まじでー
char t[100]
scanf("%s",&t);ってscanf("%s",&t[0]);
ってやってるって認識される訳か
235232:2006/01/29(日) 21:12:58
>>233
lispスレでは、スレ違いと言われました。
実行時に、ユーザ指定のコードを実行させるようにする方法は、
わかんないでしょうか?
236デフォルトの名無しさん:2006/01/29(日) 21:27:25
>>234
違う。&t は &t だ。
型は int (*)[100] になる。
&t[0] の型は int * 。

>>235
スレ違いと言ってる人もいれば、
答えてる人もいるような感じだなぁ。
俺は Lisp スレでスレ違いではないと思うが
(GCL 固有のスレがあるわけでもないし)、
とりあえずマニュアル精読しろって言われてるんじゃないのかな?
237デフォルトの名無しさん:2006/01/29(日) 21:32:43
>>236
だから
char lpStr[128];と唱えて
fscanf(stdin,"%s",&lpStr);
ってのは不味くない?
238232:2006/01/29(日) 21:33:53
common Lispの本を読んでも、仕様は書いてあっても、
処理系の解説は載ってませんからね。
gclのコードは大きすぎで、mainとか読んでもわかんないしで、
困ってるところです。
stdinにfprintfかなんかで、書き込んで、実行させる方法とかないでしょうか?
239デフォルトの名無しさん:2006/01/29(日) 21:51:53
>>237
lpStr を渡すのが最善なのは分かるよ。
一応 &lpStr でも動くと言ってるだけ。
ただ、厳密なことを言えば、
char * と char (*)[128] とでアドレッシングが違う可能性があるから、
環境によっては動かない可能性はあるね。

>>238
CommonLisp の本でもなく、
gcl のコードでもなく、
gcl のマニュアルってのはないの?
知らんけど。
240238:2006/01/29(日) 21:57:08
処理系のマニュアルはないです。
241デフォルトの名無しさん:2006/01/29(日) 22:16:28
って、質問を読み違えてた。
ソースをいじって実現したいのか。
それなら確かに C の質問か・・・。

でも、それはちゃんとソースを読んで
頑張ってちょうだいとしか言いようが無い気が。
242デフォルトの名無しさん:2006/01/29(日) 22:22:53
たとえばaabdcefdsaasaaebbfcccdbcded見たいな感じにならんでるものから
一文字ずつアスキーコードに変えて配列に入れたいんですけど
なんだか混乱してきたのでやり方おしえてもらえませんか?
243デフォルトの名無しさん:2006/01/29(日) 22:29:17
>>242
どこまでできて、どこまでできてないのか。
ちゃんとソースを提示する事。
244デフォルトの名無しさん:2006/01/29(日) 22:43:13
>>242
char配列なら大抵はASCIIコードで入ってると思うが?
245デフォルトの名無しさん:2006/01/29(日) 23:11:14
当方PERLしか出来ないんですが
C言語を始めるにあたりお勧めの解説書教えて下さい
246デフォルトの名無しさん:2006/01/29(日) 23:13:52
>>245
何でもいいよ。
247デフォルトの名無しさん:2006/01/29(日) 23:20:42
>>245
規格見れば確実
248デフォルトの名無しさん:2006/01/29(日) 23:27:03
それは英文法辞書持たされて理解しろてのと同じ残虐な行為ですよ-_-;
249デフォルトの名無しさん:2006/01/29(日) 23:28:28
>>1に書籍スレに行けと書いてあるのに
文字を読めない人間に本を紹介しても無駄無駄
250デフォルトの名無しさん:2006/01/29(日) 23:30:03
>>249
「何を伝えるか?」までは誰にも教えることの出来ない事だから、
それで問題ないと思うが?
251デフォルトの名無しさん:2006/01/29(日) 23:32:50
>>250
あなたが何を伝えたいのかがわからない。
252デフォルトの名無しさん:2006/01/29(日) 23:56:30
>>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);
となる。
253デフォルトの名無しさん:2006/01/30(月) 00:44:11
>>248
Perl 使えるなら、それで十分。
254デフォルトの名無しさん:2006/01/30(月) 00:50:09
CなんていいからJavaを始めなさい
255デフォルトの名無しさん:2006/01/30(月) 00:52:08
>>254
5年前なら釣られてやったものを
といいつつ釣られてみる
256デフォルトの名無しさん:2006/01/30(月) 01:18:50
>>255
5年前は学生でした
257デフォルトの名無しさん:2006/01/30(月) 01:27:24
3年前はペンギンでした
258デフォルトの名無しさん:2006/01/30(月) 01:42:12
>>257
Linuxかよ!
259242:2006/01/30(月) 02:10:33
>>243全くできておりません。
文字読み込んで数字として配列に存在させたいのです。
260デフォルトの名無しさん:2006/01/30(月) 02:13:27
>>259
1.文字列を読み込む
2.格納されたをループさせてint型配列に一つづつぶち込む

だけでいいと思うんだが。
261242: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 とかで出せばいいだけ。
264242:2006/01/30(月) 02:40:03
>>263その後の処理としては文字を並び替えたいのです
たとえばabdcbac→aabbccdみたいな形に。
それでただ数字ならソートの部分は配列使ってできています。
ただそのプログラムは読み取るデータが一つずつ改行されているので
改行されずにそのまま並んでいる文字を一つずつ数字で配列にいれたい
ということで質問させてもらいました。
265デフォルトの名無しさん:2006/01/30(月) 02:57:06
質問させてください。

使用ソフトはvisualC++なんですが、
配列を使って、例えば

double A[000],B[000];
int i;

という風に定義するとします。
すると、AとBの000の数字はどこまで大きくできるんでしょうか?
当方、なぜか40000以上にするとエラーでvisualC++がとまってしまいます。
原因の分かる方、ご教授願いますm(__)m
266デフォルトの名無しさん:2006/01/30(月) 03:03:57
>>264
改行読みとばせばいいのでは?
267デフォルトの名無しさん:2006/01/30(月) 03:07:32
>>265
原因はわかるが適したスレで聞けよ。
268デフォルトの名無しさん:2006/01/30(月) 03:07:51
>>265
自動変数はおそらくスタックに作られるのでスタックの限界までしか作れないと
思っておけ。もちろんスタックを使わないようなコードを作るコンパイラもある
かも知れないが、この頃のメジャーなやつはだいたいスタックを使っている。

逆に言うと、スタックを大きくしてしまえばその分だけ大きく作れる。
しかしそこまでしなければならないということは何か設計がおかしいような
気もする。場合にもよるが。

どうしても必要なら static にしてしまうとか、関数の外に出してしまうとか、
malloc() で確保するようにするとか、とにかく自動変数以外の変数にしろ。
269デフォルトの名無しさん:2006/01/30(月) 03:18:06
>>267
すいません。使用ソフトはvisualCなんですが、
C言語なんで質問してもいいかな…と思いまして。

原因がわかればなにとぞご助言を。
270デフォルトの名無しさん:2006/01/30(月) 03:19:55
>>269
だから書いただろうが。読めよ。
271デフォルトの名無しさん:2006/01/30(月) 03:30:31
>>270
親切にありがとうございました。助かりますm(__)m
迷惑かけてすいません。以後、気をつけます。
272デフォルトの名無しさん:2006/01/30(月) 05:31:50
なんでそんなに偉そうなの?
死ねよ
273デフォルトの名無しさん:2006/01/30(月) 05:43:35
お前らダメプログラマーが唯一見下せる素人を気分悪くしてんじゃねーよ
また来ていただかないとダメだろ
274242:2006/01/30(月) 06:27:20
なんか普通にやってみたらできました。
すんまそ
275デフォルトの名無しさん:2006/01/30(月) 10:05:02
>>273
ワロタw
276デフォルトの名無しさん:2006/01/30(月) 13:22:36
>>273
×気分悪くして
○気分悪くして
じゃないのか?
277276:2006/01/30(月) 13:23:15
いや意味和姦ね
○気分悪くさせて
じゃないのか?つか俺莫迦?
278デフォルトの名無しさん:2006/01/30(月) 13:43:46
一人でオナニーはヤメレ
279デフォルトの名無しさん:2006/01/30(月) 14:14:11
オナニーは普通は一人でするもんじゃないのか?
それとも複数人でオナニーすれば無問題なのか?
280デフォルトの名無しさん:2006/01/30(月) 14:41:56
>>277
草加せんべいドゾー 
つ○
281デフォルトの名無しさん:2006/01/30(月) 14:46:48
ど素人の俺に教えてください。
LINUXで動くプログラムの処理速度をμ秒単位で計測したいのですが
どの関数で時間を取得すればいいとですか?
282デフォルトの名無しさん:2006/01/30(月) 15:05:27
>>281
UNIXプログラミング質問スレってのがあるけど、とりあえず
gettimeofday()

283デフォルトの名無しさん:2006/01/30(月) 15:53:44
>>281
つ「プロファイラ」
284デフォルトの名無しさん:2006/01/30(月) 16:03:15
>>281
プログラムが始まってから終わるまででいいのであれば time コマンドを使え。
285デフォルトの名無しさん:2006/01/30(月) 16:41:30
stdio.h の中は ↓ のようになっていたんですが、これは2重インクルードガード
というやつですよね?!

#if _MSC_VER > 1000
#pragma once // ●
#endif

#ifndef _INC_STDIO // ◎
#define _INC_STDIO

それで今回コメント●の部分で疑問を感じました。
ここは、バージョンによってコンパイルするだのしないだのを分岐しているんだと考えてます。
コメント◎の部分と●の部分は期待する結果は同じはずです。
なら、●の部分はいらないと思うのが・・・なぜ

意味がなんとか通じた方いらっしゃいましたらご解説のほどを!!!
286デフォルトの名無しさん:2006/01/30(月) 17:06:12
>>285
スレ違いだけど。

#pragma onceはプリプロセッサが同じファイルを2度以上インクルードしないという情報を知らされる分、
普通のインクルードガードよりもプリプロセスにかかるオーバーヘッドの削減が期待できる(はず)。

しかし#pragma onceが使えるコンパイラは限られている(というより独自拡張だ)から、
使えるかどうかを確かめるための#if _MSC_VER > 1000がある。
そして#pragma onceが使えないプリプロセッサのために
通常のインクルードガード(#ifndef _INC_STDIO)も用意されている。
287デフォルトの名無しさん:2006/01/30(月) 17:07:32
>>285
「将来的には◎の方を廃止してしまいたい」と言う、強い願望の現れ
ではあるまいか?

288デフォルトの名無しさん:2006/01/30(月) 17:23:17
>>286-287
そうなのですか。ありがとうございました! すっきり致しましたです そして勉強になりました!
289デフォルトの名無しさん:2006/01/30(月) 18:32:42
Linuxなんですが(Winでも一緒?)

# include <signal.h>
(void)signal(SIGALRM, func);

とやりたいんですが、
funcに複数の引数を持たせる事は出来ないのでしょうか。
funcからある変数の中身を弄りたいんですが、
その変数をfuncにpointerで渡したいんです。
その変数をglobalにすればfuncの引数は1つでいいのですが、
変数はglobalに出したくないので。
複数引数が駄目なら、何か同等の機能を持たせる方法はありますか?
290デフォルトの名無しさん:2006/01/30(月) 18:50:20
全然わかりません><
291デフォルトの名無しさん:2006/01/30(月) 19:15:33
>>289
多分、確保したリソース系を解放したいんだよな
ポインタをstatic変数で持って、解放する関数を用意するしかないと思う。

getHoge();とかしてシングルトンもどきという手もあるけど
Cでそこまでする必要があるのかという疑問がある
292289:2006/01/30(月) 21:59:36
>>291
実はC++で書いてるんでsingletonもどきでもいいのですが、
使ってる関数がCのものなのでここで聞きました。
293デフォルトの名無しさん:2006/01/30(月) 22:27:00
signalはsignalでも、boost::signalなら関数オブジェクトが使えるんだけどな。
294デフォルトの名無しさん:2006/01/30(月) 23:48:36
ぶっちゃけ、何気に読んでて勉強になる俺がいる
295デフォルトの名無しさん:2006/01/31(火) 00:10:04
組み合わせを表示するプログラムを作りたいのですが、誰か分かる人いますか?

例えば、(a,b,c)(b,c,k)(h,j,u)のような文字のグループが与えられていて、
同じ文字は重複せずに組み合わせていくプログラムなんですが・・・。

わかる人いたら教えてください!!お願いします!!
296デフォルトの名無しさん:2006/01/31(火) 00:16:33
(1,2,3)(4,5,6)(7,8,9)
297デフォルトの名無しさん:2006/01/31(火) 00:20:00
>296
C言語で書くとどのような感じになりますか?
よろしければ教えていただきたいのですが・・・。
298デフォルトの名無しさん:2006/01/31(火) 00:31:45
>>295,297
考えられる全ての組み合わせを作る
その過程で重複するのは除く
299デフォルトの名無しさん:2006/01/31(火) 00:32:43
まず組み合わせの計算式
4C2とかについて
なぜ二つの枠がある時
4P2 / 2!をしなければいけないのか理解してね
300デフォルトの名無しさん:2006/01/31(火) 00:35:46
どっちかっつーと数学だな
あとはいかにCで表現するかか。

俺は数学苦手だ
301デフォルトの名無しさん:2006/01/31(火) 00:54:25
>>295
もうちょっと厳密に書いてくれないか?というか宿題?
C/C++の宿題を片付けます 59代目
http://pc8.2ch.net/test/read.cgi/tech/1138320520/
302デフォルトの名無しさん:2006/01/31(火) 01:02:34
初学者には基本的に開発環境が無料で手に入るのと、解説本は豊富な言語がいいと思う。
ただ、方向性で何から始めるべきかかわるよね。
将来、PGになりたいのなら、断然Java。潰しもきくし。
C/C++でプログラミングの基礎を覚えるのは難しいよ。
本当は無料版さえあればDelphiがおすすめなんだけどね。
Webデザイナーになりたいなら、HTMLとJavaScriptから入ってPHPに進めばいい。
日曜プログラマでさもよくば趣味を生かして仕事の効率化を図りたい人にはVB(VBA)が一応おすすめ。
ただ今後はC#にとって代わられる可能性も否めないので。
303デフォルトの名無しさん:2006/01/31(火) 01:11:36
プログラミングってなんだっけ?
やりたいことを表現する為の規則が言語の文法でしょ?
304デフォルトの名無しさん:2006/01/31(火) 01:18:34
やりたいことがプログラミングである場合はどう
表現すりゃいいの?
305デフォルトの名無しさん:2006/01/31(火) 01:21:14
やりたいことがプログラミングな場合それはオナニーだろ
306デフォルトの名無しさん:2006/01/31(火) 02:22:17
ジッサイ、組み込み系とUNIXとWindowsSDKしか得意分野ないじゃん
307デフォルトの名無しさん:2006/01/31(火) 02:24:30
windowsだったらあんまりC使うメリットなさげ。。
308デフォルトの名無しさん:2006/01/31(火) 02:26:18
今や。
309デフォルトの名無しさん:2006/01/31(火) 02:41:41
ゲームとか
310デフォルトの名無しさん:2006/01/31(火) 03:13:21
Cだけ覚えてても、金に結びつきズラス orz
311デフォルトの名無しさん:2006/01/31(火) 03:29:51
>>307
Windows のデバイスドライバ作るときとか・・・。
312デフォルトの名無しさん:2006/01/31(火) 03:30:50
>>306
LinuxもCだな。
313デフォルトの名無しさん:2006/01/31(火) 03:34:56
>>311
C言語一年くらいかかって覚えて、制御系の会社へ面接行ったら
「共に成長していきましょう。電気電子で」とか言われますた
314デフォルトの名無しさん:2006/01/31(火) 04:59:07
>>302
Delphi無料版あるぞ
315デフォルトの名無しさん:2006/01/31(火) 09:04:23
>>302
言語の前に、コンピュータの基礎知識を身につけて欲しい。
CPU・記憶装置・入力装置・出力装置・バスなどはもちろん、
メモリイメージやN進数、CPUの動作概要など、
制御すべきコンピュータがどういうものなのか?
を理解しないで言語を勉強しても、効率が悪いと思う。
316デフォルトの名無しさん:2006/01/31(火) 09:48:37
ハードウェアの基本的なことがまるでわかってないど素人でも
習いたてのカタコト言語で書いたコードがそこそこ「効率」よかったりはするな

問題は習ったことから少しでも外れるとお手上げってとこだ
スクラッチで書くことはできてもバグが直せないとか
応答時間を制約された途端トンズラとかな
317デフォルトの名無しさん:2006/01/31(火) 11:17:49
int foo();

int foo( void );

の違い教えて。
速度とかでなく
何故、この記述でやるのかっての
318デフォルトの名無しさん:2006/01/31(火) 11:56:17
>>317
voidは引数ねぇよってことで呼び出しのとき引数指定したらエラー
何も書かないのは何を何個引数として呼び出そうが怒られなかったハズ
319デフォルトの名無しさん:2006/01/31(火) 11:57:06
その処理系はchar型は符号付き1bit変数で定義されていたとして

なぜsigned charと宣言できるのかと同じ質問
320デフォルトの名無しさん:2006/01/31(火) 12:28:22
>>319
>その処理系はchar型は符号付き1bit変数で定義されていたとして
アリエナス
321デフォルトの名無しさん:2006/01/31(火) 12:32:51
>>319
CHAR_BIT >= 8 は規格で定められていた気がする

ビットフィールドが1bit幅の時、
なぜ、signed intと宣言できるのか?
という例えのほうが現実味があるな
322デフォルトの名無しさん:2006/01/31(火) 12:34:28
突っ込まないでwwwwwwwwwwwww
8bitだったね
323デフォルトの名無しさん:2006/01/31(火) 12:40:53
>>317
引数の型チェックを行うか行わないかの違い。
324デフォルトの名無しさん:2006/01/31(火) 14:07:42
a = a + 1
というのと、
a += 1
はどっちが早い?
325デフォルトの名無しさん:2006/01/31(火) 14:11:46
>>324
5文字 a = a + 1
4文字 a += 1
3文字 ++a

結論 a += 1、のほうが1文字少ないのでa = a + 1よりは早くタイプできる。
ただし、++aのほうがさらにタイプ数が少ない。

コードの速度ならどれもCなら差が発生するほうが珍しい
326デフォルトの名無しさん:2006/01/31(火) 14:17:15
>>325
なるほど。


Thanks
327デフォルトの名無しさん:2006/01/31(火) 14:35:30
>>324
速度は実測するのが何より正確
328デフォルトの名無しさん:2006/01/31(火) 14:38:49
volatileで宣言していたら違うコード吐くかもしれないね。
329デフォルトの名無しさん:2006/01/31(火) 14:46:20
>>327
あんなちっちゃい差計測できるか?
330デフォルトの名無しさん:2006/01/31(火) 14:50:54
どれもこれもincだけで済ませてるみたいだよ。
volatileつけても同様。メモリーにしまう処理が増えるだけ。
331デフォルトの名無しさん:2006/01/31(火) 15:00:02
抽象的な質問をしてしまい、申し訳ない。
332デフォルトの名無しさん:2006/01/31(火) 15:28:51
>>324
その程度だとどんなCPU向けのコンパイラでも最適化したら同じだと思うぞ。
なので実行時に違いはないんじゃないの?

てか、その程度を最適化できないコンパイラはクソ。
333デフォルトの名無しさん:2006/01/31(火) 15:29:53
>>328
ああ。そりゃちょっとだけ遅いかも。
でもCPUによっては同じかも。
334デフォルトの名無しさん:2006/01/31(火) 15:38:06
mallocで延々確保続けたら最後どうなんの?
335デフォルトの名無しさん:2006/01/31(火) 15:42:11
nullを返す
336デフォルトの名無しさん:2006/01/31(火) 15:46:07
あ、そっか確保失敗したらNULLだったか
337デフォルトの名無しさん:2006/01/31(火) 16:15:34
char cd= 0xB6;
unsigned short ud;

と宣言されてる時、udに0xB6が入る様にするには、どの様にキャストすれば良いですか?

ud = (unsigned int)cd; // ud = 0xFFB6・・・

338デフォルトの名無しさん:2006/01/31(火) 16:28:14
君の環境はchar型はsignedで定義されてるんだと思うよ
つまり君の環境でのcharが表現できる数値の範囲は128〜-127ぐらい
そして0xB6ってのは128以上だからMSB(符号ビット)が入れ替わっちゃって変な意図しない値が代入されてるんだよ
だからunsigned charと宣言すれば解決するはず
339337:2006/01/31(火) 16:36:54
実は、文字の操作(UNICODE変換等)を行いたいのですが、
charをunsigned charで宣言すると、あっちこっち直さなきゃならないので・・・
どうしても、char型を一時的に符号無視して、unsigned short(16bit)に拡張したいのです
キャストなら、なんとかなるかなと思いまして・・・
340デフォルトの名無しさん:2006/01/31(火) 16:47:03
だってsigned charで宣言してる時点で0xB6なんて値は不正な値だよ?
最初から欠陥プログラムだったんだよ

解決方法はいくらでもあるけど、それを実行するとあっちが立たないになるからお勧めできない
341デフォルトの名無しさん:2006/01/31(火) 16:52:57 BE:52408139-
>>340
>だってsigned charで宣言してる時点で0xB6なんて値は不正な値だよ?

意図してるかどうかは別として、不正ではないと思うが。
342デフォルトの名無しさん:2006/01/31(火) 16:54:14
>>337
ud = (unsigned char)cd;
343デフォルトの名無しさん:2006/01/31(火) 16:56:21
> だってsigned charで宣言してる時点で0xB6なんて値は不正な値だよ?
お前の頭が欠陥品だ。
お前がこのスレでレスをするのはお勧めできない。半年ROMれ
344デフォルトの名無しさん:2006/01/31(火) 17:11:59
へぇ文句たれてる暇あったら
彼に解決策でも与えなよ
345デフォルトの名無しさん:2006/01/31(火) 17:14:56 BE:69876566-
誤りを積極的に正すのは解決策を与える以上に重要。
346337:2006/01/31(火) 17:15:33
>>342
どうもです
できました!
347デフォルトの名無しさん:2006/01/31(火) 17:15:55
子供たちよ 332 みたいにはなるなよ
最適化の幻想と実際の差にあごが外れるのが怖くて
アセンブラろくに読まずにてきとーこくようなクルクルパーは
日常の言動から誰も本気で信用してないぞ
348デフォルトの名無しさん:2006/01/31(火) 17:19:54
平気だよ
もうCPUとかメモリとか理解しなくてもプログラミングできる時代だから
まぁCはメモリ知らないとダメだけど
349デフォルトの名無しさん:2006/01/31(火) 17:21:01
実行環境に CPU やメモリが必ずしも存在しない時代だかんね
350デフォルトの名無しさん:2006/01/31(火) 19:17:55
>>339
コンパイラにchar を unsigned にするか signed にするかの
オプションついてないか?
ついてればラッキー, なければ地道に直す
351デフォルトの名無しさん:2006/01/31(火) 19:41:52
ud = cd & 0xff;
いかんか? いかんか? キャストすべきか?
んじゃこうだ。
ud = (unsigned short) (cd & 0xff);
可読性悪いか?
んじゃこうだ。
ud = (unsigned short) (cd & 0x00ff);
352デフォルトの名無しさん:2006/01/31(火) 20:23:37
B言語なら俺に聞け!
http://news18.2ch.net/test/read.cgi/news7/1138194094/

まず問題を冷静に吟味してBの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどのBではありえないものについては他言語を学んでください。
353デフォルトの名無しさん:2006/01/31(火) 20:47:54
>>316
コードの書き方で応答時間意識するのって組み込みのひと?
354デフォルトの名無しさん:2006/01/31(火) 20:53:46
応答時間はコード云々じゃなくて、ネットワークの話だった気が、、。
355デフォルトの名無しさん:2006/01/31(火) 21:07:06
>>316
言ってること何かおかしくないかな?
356デフォルトの名無しさん:2006/01/31(火) 21:17:34
316の
357デフォルトの名無しさん:2006/01/31(火) 22:27:34
ncurseで現在のカーソル位置を得るにはどうすれば良いのでしょうか。
358357:2006/01/31(火) 22:31:06
自己解決しました。getyxですね。すみません。
359デフォルトの名無しさん:2006/01/31(火) 23:08:15
>>357
どちらにしろ、スレ違いだから
360デフォルトの名無しさん:2006/01/31(火) 23:58:06
数値計算やっても応答時間意識する. data 突っ込んで
から output 出てくるまでの時間って意味だけどね.

通常, 数値計算なんてのはアルゴリズムの選択がとんで
もなくものを言うんだけど, 大量にループがあるのが
当たり前なので, ループ内のコードに関しては結構気を
使ってコーディングする.
361デフォルトの名無しさん:2006/02/01(水) 00:18:06
char m[] = "■";
char t[] = "■";

というような変数宣言をして, 二つ同時(m, t 共に)にパラメータを溜めていき二つとも
20個まで溜めたいのですがやり方がわかりません
ちなみに「二つ同時に」というのはパラメータ開始時が二つ同時というだけです
終わりはどちらが先に溜まって終わるかというのは分からないようにしたい

同期を取るというのも調べてみましたが…よく分からないので教えてください
362デフォルトの名無しさん:2006/02/01(水) 00:27:11
>>361
パラメータを溜めるとはどういうことか?もっと詳しく。
363361:2006/02/01(水) 00:38:49
インストーラのような感じです

mの場合:■■■■■・・・■(20個まで溜まる)
tの場合:■■■■■・・・

で・これの開始時は同じだが終わりはどちらが先に終わるか分からないと
364デフォルトの名無しさん:2006/02/01(水) 00:46:56
エスパーかもーん
365デフォルトの名無しさん:2006/02/01(水) 01:09:49
乱数で割ったあまりが偶数か奇数か判断して改行を入れたらどうかねー
それならきっちり二行になるとおもわれ。
366デフォルトの名無しさん:2006/02/01(水) 01:19:35
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++;
}

よく分からん。
367361:2006/02/01(水) 01:34:39
それで合っていると思うのでちゃんと書いていただけるとうれしいです・・
368デフォルトの名無しさん:2006/02/01(水) 01:44:48
ヒント:ubuntu
369デフォルトの名無しさん:2006/02/01(水) 02:10:30
APIを勉強してるんですがBccDevなどのGUI環境のCコンパイラに簡単にGUIのウィンドウやメニューなどを作れる機能があります。
将来仕事していくに当たってはこれに頼らず自分でAPIの基礎から学んだ方が良いのでしょうか?
それともGUIなどはそういった枠組みがあるものを組み立てるような存在なのでしょうか?
370デフォルトの名無しさん:2006/02/01(水) 02:35:33
>>369
> 将来仕事していくに当たってはこれに頼らず自分でAPIの基礎から
> 学んだ方が良いのでしょうか?
一から作れる能力を養っておくに越した事はない。しかし何も知らないのは厳しい。

> それともGUIなどはそういった枠組みがあるものを組み立てるような
> 存在なのでしょうか?
意味が分からない。
371デフォルトの名無しさん:2006/02/01(水) 02:49:44
プログラミングなんてできても仕事は降ってこないから
372デフォルトの名無しさん:2006/02/01(水) 06:25:49
すいません。ちょっと便乗させて下さい。
char a = "■";
printf("%c",a);

"■"の出力がD,Hに化けてしまうんですが ■の変換指定子を教えて下さい。
373デフォルトの名無しさん:2006/02/01(水) 06:26:32
%aでやってみて駄目でした。
374デフォルトの名無しさん:2006/02/01(水) 07:12:43
まちがえた' ' OTL
375デフォルトの名無しさん:2006/02/01(水) 07:14:06
でも、ASCIIとかJISのコード表に載ってない文字だから
printf("■");
で、やらないと駄目かな。。
376デフォルトの名無しさん:2006/02/01(水) 09:01:34
>>372
char a[] = "■";
printf( "%s", a );
377デフォルトの名無しさん:2006/02/01(水) 12:34:43
>>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 の変数に入れたいのですが、どうすればいいですか?
380デフォルトの名無しさん:2006/02/01(水) 16:14:26 BE:52406993-
int a;
unsigned char b;

(中略)

b = (unsigned char)(a & 0xff);
381379:2006/02/01(水) 16:24:17
>>380
ありがとうございます。
おかげさまで、ばっちりイキました。
382デフォルトの名無しさん:2006/02/01(水) 17:21:15
>>380
b = (unsigned char)a;

でいいだろ。
383デフォルトの名無しさん:2006/02/01(水) 17:27:55 BE:23292162-
>>382
sizeof(char) >= 8
384デフォルトの名無しさん:2006/02/01(水) 17:59:01
CHARBIT >= 8
と言いたかった?
385デフォルトの名無しさん:2006/02/01(水) 18:17:37
いつかcharが8バイトを超える日がやってくるのだろうか
386デフォルトの名無しさん:2006/02/01(水) 18:22:59
charは1バイトって決まってるからな。
1バイトが何ビットかというのはまた違う話だし。
387デフォルトの名無しさん:2006/02/01(水) 18:23:29
Unicodeが統一されたら8byteを超えるかな?
恐らく統一はされないと思うけど
388デフォルトの名無しさん:2006/02/01(水) 18:23:56 BE:46584083-
>>384
オーイェー
389デフォルトの名無しさん:2006/02/01(水) 18:24:41
この世の全ての文字に対応したら8バイトでも足りないじゃなかろうか
390デフォルトの名無しさん:2006/02/01(水) 18:31:56 BE:81522476-
391デフォルトの名無しさん:2006/02/01(水) 19:37:21
>>385
9bit のやつが太古より・・・
392デフォルトの名無しさん:2006/02/01(水) 20:01:15
>>391
(,,゚Д゚)∩先生単位が違います
393デフォルトの名無しさん:2006/02/01(水) 20:07:02
>>392
あ? typo じゃなかったのか (ゲラゲラ
394デフォルトの名無しさん:2006/02/01(水) 20:19:48
fscanfで読み込んだデータ(名前、体重等)を構造体(5人分)に格納するには
どうしたらいいんですか?
395デフォルトの名無しさん:2006/02/01(水) 20:22:09
>>394
初心者向けの本を買ってきたらいいですよ。
396デフォルトの名無しさん:2006/02/01(水) 21:08:42
激しく同意
397デフォルトの名無しさん:2006/02/01(水) 21:44:35
変数に全角文字「あ」を代入ってどうやればいいですか?

char *c;

c='あ';

にしても変な文字になる・・。
398デフォルトの名無しさん:2006/02/01(水) 21:46:19
char s[] = "あ";
or
wchar_t s[] = L"あ";
399デフォルトの名無しさん:2006/02/01(水) 21:51:56
このスレタイの無意味さにワロタ
400デフォルトの名無しさん:2006/02/01(水) 21:54:06
>>398
なるほど1次元配列が未定な変数に代入する時は宣言時じゃないといけないのか・・
それと全角文字は""になるのか
ありがとう
401デフォルトの名無しさん:2006/02/01(水) 22:05:43
>>400
わかってない悪寒
402デフォルトの名無しさん:2006/02/01(水) 22:07:07
char s[];

s[]="あ"; だとエラー

s="あ"; でもエラー
403デフォルトの名無しさん:2006/02/01(水) 22:25:57
>>400
そうだよ
全角文字は特殊でね""で囲まないといけないんだよ
Lはノイズだから無視してね♥
404デフォルトの名無しさん:2006/02/01(水) 22:30:41
文字コードについてもっと知るべきだな
405デフォルトの名無しさん:2006/02/01(水) 22:31:49
>>403
お前最低だな
406デフォルトの名無しさん:2006/02/01(水) 23:02:12
自作関数って何のために使うんですか?

何度も呼び出す際は便利だとは思うけど、ほかにどのような利便性があるのでしょうか?
また長文ではない・・簡単なソースの場合はmainに駄々がきでもいいのかな
会社とか実用的な場ではどうやってるんでしょうか
407デフォルトの名無しさん:2006/02/01(水) 23:04:38
>>406
自作関数使わずに数千、数万行にわたるソース書いてみろ
イヤでも分かる
408デフォルトの名無しさん:2006/02/01(水) 23:06:07
なるほど、それは理解できます。
他には?
409デフォルトの名無しさん:2006/02/01(水) 23:09:34
>>408
例えば、処理の中に
status = security_chk(hoge);
if(FALSE == status)
{
return ERROR;
}
とかあったら、「あーなんかセキュリティのチェックしてんだな〜」くらい分かる

全体として処理フローが分かりやすくなったりな。
410デフォルトの名無しさん:2006/02/01(水) 23:16:23
>>408
一言でいうと抽象化
411デフォルトの名無しさん:2006/02/01(水) 23:22:41
>>409
なるほど、流れが分かりやすくなりますね。
412デフォルトの名無しさん:2006/02/01(水) 23:25:35
>>400
全角文字は通常マルチバイト(たとえば2バイトとか)で表現されているから、
charには格納できない。だから、文字「列」として扱うしかない。
413デフォルトの名無しさん:2006/02/01(水) 23:27:54
> if(FALSE == status)

キモイ
414デフォルトの名無しさん:2006/02/01(水) 23:39:30
>>408
いや、理解できているようには見えない

その証として、今のあなたに聞くが
>自作関数って何のために使うんですか?

長文のある部分を要約して隠すことがなぜ「わかりやすく」なると思うんだ?
これは構造化プログラミングをしていない場合であっても、
ものすごく大事なことなんだが、あなたはどう思ったんだ?
415デフォルトの名無しさん:2006/02/01(水) 23:50:18
>>413
流し読みしてて気づかなかった
というかおまい良く気づいたな
416デフォルトの名無しさん:2006/02/01(水) 23:50:22
>>413
よくあるテクだよ。
好きになれない人もいるし、好んで使う人もいる。
あんま宗教論争起こしそうなレスするなよ。
417デフォルトの名無しさん:2006/02/01(水) 23:52:14
>>414
main(){
処理1
処理2
〜中略〜
処理99999999998
処理99999999999
}
よりも
main(){
関数1()
関数2()
〜中略〜
関数20()
}

関数1(){
処理1
処理2
}
〜中略〜
関数20(){
処理99999999998
処理99999999999
}

後者の方が本体であるmainの流れが分かり安くなるからじゃないの
また同じ処理をする場合関数を呼ぶだけでいいから(>>406)
あと関数の名前でどんな処理をするのかが分かる(>>409)
418デフォルトの名無しさん:2006/02/01(水) 23:55:35
>>415
ナニに?w
419デフォルトの名無しさん:2006/02/01(水) 23:58:29
> if(FALSE == status) 

遺憾の念を禁じ得ない
420デフォルトの名無しさん:2006/02/02(木) 00:00:28
IDが出ないのを良いことに粘着してる香具師が1名いるな
421デフォルトの名無しさん:2006/02/02(木) 00:07:09
>>406
> 自作関数って何のために使うんですか?

「利用可能な物をどの様にして有効に活用するか?」
それを考えることもプログラマの仕事ではないかね?
何とかとハサミは使いよう、と言うだろ?

 「何のために使うのか?」

それは、使う人が考えるのであって、
他人に教わるものではない。

他人から得られることは「他人はどう使っているのか?」であって、
「あなたにとってその使い方が最善かどうか」は、
あなたにしか判断できないことだ。

そして、「あなたが何に使うか?」もあなた自身が考えることだ。
422デフォルトの名無しさん:2006/02/02(木) 00:11:34
なぜそこで、「僕がメインディッシュになってやる!」
と言わない
423デフォルトの名無しさん:2006/02/02(木) 00:18:09
>>421
>それを考えることもプログラマの仕事ではないかね?
他人の意見も聞く事も成長に繋がると思います。

>何とかとハサミは使いよう、と言うだろ?
何とかってなんですか?気になりますので人に発言する時はきちんと覚えている言葉を使ってください。

>それは、使う人が考えるのであって、 他人に教わるものではない。
何故ですか?あなたは他人の考え方、料理の仕方など参考にしようと考えた事はありませんか?

>他人から得られることは「他人はどう使っているのか?」であって、
だから「会社とか実用的な場ではどうやってるんでしょうか」と聞いているけど読んだのかな。

>「あなたにとってその使い方が最善かどうか」は、 あなたにしか判断できないことだ
そうだね。けどそんな事聞いてもいないし、言われるまでもないですけど何を断言しているのですか?

>そして、「あなたが何に使うか?」もあなた自身が考えることだ。
上の発言と同じ意味だと思うけど2度言う必要はあったのですか?
それで別にあなたに言われるもまでもなく使う時に考えますよ。
そういうのをおせっかいと言います。
424デフォルトの名無しさん:2006/02/02(木) 00:33:37
質問です。。。
#include <stdio.h>

int main(void)
{
printf("hello,world\n")

return 0;

}

hello.cという名前で、Cドライブのctestの中にあります。

こういう基礎中の基礎をやっているのですが、
コマンドプロンプトで、
C:\ctest>bcc32 hello.c

と、コンパイル?してもhello,woridが表示されません。
教材だと表示されているのですが。。。
ご指摘お願いします
425デフォルトの名無しさん:2006/02/02(木) 00:37:37
>>424
(1) printfの末尾のセミコロン抜け
(2) コンパイルしただけではだめ。できたexeを実行する。
426デフォルトの名無しさん:2006/02/02(木) 00:39:19
ありがとうございます!
セミコロン忘れてました^^;
とりあえずexe実行してみます
427デフォルトの名無しさん:2006/02/02(木) 00:42:36
つーかbcpad使え
428デフォルトの名無しさん:2006/02/02(木) 00:44:57
bcc developerってツール使うとGUIで簡単にコンパイルや編集できるよ
429デフォルトの名無しさん:2006/02/02(木) 00:50:07
無料のVC++使えばよくね?
430424:2006/02/02(木) 00:50:54
すみmせん・・
C:\ctest>bcc32 hello.cでも
C:\ctest>gcc hello.cでも
exe化できないのですが、どうすれば・・・
431デフォルトの名無しさん:2006/02/02(木) 00:51:29
>>430
kwsk
432424: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’は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。
とのこと。・・
433デフォルトの名無しさん:2006/02/02(木) 01:25:47
まずは、PC初心者板へいけ。
434デフォルトの名無しさん:2006/02/02(木) 05:44:17
>>417
int a0;
main()
{
for(a0 = 0; a0 < 10; a0++)
{
a1();
}
}
a1()
{
a = 0;
}

馬鹿げたことに見えるかも知れないが
数千行からのプログラムではやってしまいがちなミスを
単純化したものだ

407 によってか否かはわからんが
なぜ関数化するのかが理解できたのなら
このミスの根底にあるものを指摘できるはず
435デフォルトの名無しさん:2006/02/02(木) 05:56:41
>>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;/

関数原型に関するあるスタイルを知らないのはこっちのせいじゃないが
439デフォルトの名無しさん:2006/02/02(木) 08:03:09
>>434
グローバル変数なんか使うからそうなる
440デフォルトの名無しさん:2006/02/02(木) 09:10:01
>>439
なぜ、グローバル変数を使ってはいけないんだ?
441デフォルトの名無しさん:2006/02/02(木) 09:12:16
あらゆる場所から使えるってことは、
グローバル変数にまつわるバグはあらゆる場所に
埋め込まれうるという事だ。
442デフォルトの名無しさん:2006/02/02(木) 09:15:32
で、話もどるが、なぜ関数化するんだ?
443デフォルトの名無しさん:2006/02/02(木) 09:17:19
関数化出来ない事を考えればいいだろ。
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とエラーになってしまいます
回避するにはどうすればいいんでしょうか?
446デフォルトの名無しさん:2006/02/02(木) 12:28:29
ちゃんと math.h インクルードしてる?
447デフォルトの名無しさん:2006/02/02(木) 13:21:04
>>442
Cは関数型プログラムサポートしてるから、標準ライブラリ使うのだってmain()から関数呼び出してるっしょ?
別にひとりで組むのならmain()関数一本でもいいと思うけど、標準ライブラリ使って効率よくプログラム書きたいのなら、
そんなひとの為に「関数」は必要だった。
448デフォルトの名無しさん:2006/02/02(木) 13:26:42
それだけみたい。無理に自作関数作らなくても、main()関数一本のみのコードがわかりやすいなら必要ない。
中にはmain()に処理を全部詰め込んだ方が分かり易い。ってひともいるらしいし。
449デフォルトの名無しさん:2006/02/02(木) 13:33:00
test(){
  calloc
}

void main(){
  test();
}

上記のように関数内でcallocを使った場合freeした方がいいんでしょうか?
それともstatic変数のように自動的に開放されるのでしょうか?
450デフォルトの名無しさん:2006/02/02(木) 13:37:08
>>449
開放されるわけがない。
451デフォルトの名無しさん:2006/02/02(木) 13:41:31
>>450
そうなのですか・・・・・・・・・・ありがとうございます
452デフォルトの名無しさん:2006/02/02(木) 13:41:52
まぁ。「利用可能な物をどの様にして有効に活用するか?」
って考えなんじゃないの?
453デフォルトの名無しさん:2006/02/02(木) 13:43:35
>>449
当たり前だが、ちゃんと解放される
454デフォルトの名無しさん:2006/02/02(木) 13:53:40
走り続けるんでないならfreeなんかせんでもいいとは思うけどね
455デフォルトの名無しさん:2006/02/02(木) 14:14:54
配列の質問なんですが、

int i, a[i];
(a[10]とかなら当然いいんですが)

これはダメなんですか?家のコンパイラだと定型式がないとか出てきて無理なんですが・・・
456デフォルトの名無しさん:2006/02/02(木) 14:16:14
>>455
その書き方に対応していないコンパイラでは駄目
457デフォルトの名無しさん:2006/02/02(木) 14:24:17
>>456
対応してるの教えてもらえませんか?・・・
458デフォルトの名無しさん:2006/02/02(木) 14:30:03
C99対応なら使える
っつーか、使うな
459デフォルトの名無しさん:2006/02/02(木) 14:38:46
え〜!! 学校だといけるので困るんですよ・・・
460デフォルトの名無しさん:2006/02/02(木) 14:42:15
俺は困らない
461デフォルトの名無しさん:2006/02/02(木) 14:50:03
>>457
gcc
462デフォルトの名無しさん:2006/02/02(木) 14:56:20
>>447
> Cは関数型プログラムサポートしてるから
まさか Functional Programming の事ではないよな?
463デフォルトの名無しさん:2006/02/02(木) 14:58:44
>>455
Cでその書き方は基本的にまずいだろう
464デフォルトの名無しさん:2006/02/02(木) 15:06:01
>>463
C99なら基本的にも応用的にも無問題
465デフォルトの名無しさん:2006/02/02(木) 15:10:03
>>447=448 か?

>中にはmain()に処理を全部詰め込んだ方が分かり易い。
どうやら話が循環したようだな
いいからコンパイラを main だけで書いてみろよ
別にコンパイラでなくてもいいが数千行かそれ以上の main をな

できれば途中でやめて他の人に続きを頼んでみるといい


>ってひともいるらしいし。
そんな奴のコードを引き継がされてみたいか?
466デフォルトの名無しさん:2006/02/02(木) 15:12:26
やだやだぁ
alloc系使わないとやだぁ
467デフォルトの名無しさん:2006/02/02(木) 15:23:57
ってかどんなプログラムでもmain()は20行以下にするべきだろう。
何万行もあったら後から死ぬほど読みにくいぞ。
468デフォルトの名無しさん:2006/02/02(木) 15:24:55
大学で間に合わせ用にmainの中身1000行越えるの作ったが本当にありがとうございました状態になった
改良する気はもうない
469デフォルトの名無しさん:2006/02/02(木) 15:30:52
あるデータファイルを読み込んで、そのファイル内に出て来た管理番号の順に数値を与える。
というプログラムを作ろうと思っています。
ここで、管理番号は「英字+数字5文字」の6字からなっているのですが、
この管理番号の6文字のみをファイルから抜き出して配列に格納するにはどのようにすれば良いのでしょうか?
分かる方がいましたら教えてください。よろしくお願いします。


ちなみに、例としてデータファイルの内容は下記のようになっています。
---------------------------------------------
文字列(長さは各行ごと異なる) 管理番号 日付
:
:
---------------------------------------------
470デフォルトの名無しさん:2006/02/02(木) 15:36:19
>>467
main以外に関数使ったほうが逆に分かりにくくない?
と初心者は思う
471デフォルトの名無しさん:2006/02/02(木) 15:40:24
ひとつの関数で済ます=変数の9割がグローバルと言う事
これ程恐ろしい事はない
472デフォルトの名無しさん:2006/02/02(木) 15:41:43
グローバルマンセーニダ━━━━━━<ヽ`∀´>━━━━━━ !!!!!
473デフォルトの名無しさん:2006/02/02(木) 15:44:55
でも20行以下はいいすぎ
200行以下にしとき
474デフォルトの名無しさん:2006/02/02(木) 15:50:26
>>473
教条主義的に行数制限するのは如何な最中とは思うが、
目安としてなら200行よりは20行の方がいい。
475デフォルトの名無しさん:2006/02/02(木) 15:56:02
初心者なんですがC言語で質問があります。
突然 mkdir でフォルダが作れなくなってしまいました。
エラーメッセージは「ユーザーまたはグループのクオータを超えることはできません」
とでます。どうにかならないでしょうか?お願いします。
476デフォルトの名無しさん:2006/02/02(木) 15:58:04
>>475
C言語の質問じゃねえし、丁寧にメッセージ出てるじゃないか
477デフォルトの名無しさん:2006/02/02(木) 16:20:19
「ユーザーまたはグループのクオータを超えることはできません」ってとこが
わけわからんのです。
ちなみにスレ違いなんでしょうか?
478デフォルトの名無しさん:2006/02/02(木) 16:22:17
スレ違い
479デフォルトの名無しさん:2006/02/02(木) 16:30:50
ほな、どこいったらエエの??
480デフォルトの名無しさん:2006/02/02(木) 16:36:17
>>414,434
なぜ人が「分かった」という返答に対して「お前は分かっていない」と決め付けるような事ができるわけ?
これはこの業種特有の性格なの?
この前のポインタの時も分かったというレスに対して「分かっていない」→結果「分かっていた」んだが同一人物なのか?
こう説明したがりの上から目線の。
普段職場で「分かっていない」と上司にこき使われてるそれらの反動かな
481デフォルトの名無しさん:2006/02/02(木) 16:38:02
ttp://dream.my-sv.net/upload/src/up0127.c.html

このソースを見てどう思いますか?
自分の中では初めて作成した高難易度ゲームです。
482デフォルトの名無しさん:2006/02/02(木) 16:47:14
むりやりっぽい感じもするけどいいんでない?
盤面でかくなったらきついかもだけど
483デフォルトの名無しさん:2006/02/02(木) 17:21:04
>>480
よく読んでね

414 の目にどう映ったかしか書いてないでしょ
それが正しいかどうかを反問で確かめようともしているよね
で、今のところ帰ってきた返事からはますます見間違いではなさそうに思えている

434 でもそんなに難しいことは聞いてないよ
現に 441 あたり、ようやくいい線ついてきたと思った矢先
次のレスで元の木阿弥に戻っちまった

上から目線が気に入らないのはあなたの勝手だが
悪いが互角にやり合える相手に見えてないもので
484デフォルトの名無しさん:2006/02/02(木) 17:27:11
>>455
> int i, a[i];

藻前は、この時点で「i」にどんな値が入っているか判るか?
「i」は初期化されていないから、
何個の配列が確保されるか判らないがいいのか?
485デフォルトの名無しさん:2006/02/02(木) 17:29:55
さすがにそんな質問じゃ無いだろ
486デフォルトの名無しさん:2006/02/02(木) 17:32:28
>>455はちょっとアホだが>>484はド低脳だな
487デフォルトの名無しさん:2006/02/02(木) 17:35:45
おまえら心の中だけで言うのもやさしさですよ
488デフォルトの名無しさん:2006/02/02(木) 17:40:49
(´-`).。oO(>>455>>>>>>(池沼の壁)>>>>>>>>>484)
489デフォルトの名無しさん:2006/02/02(木) 17:43:51
>>483
よく読んでね??

>414 の目にどう映ったかしか書いてないでしょ
で?だから勝手に決め付けるなって話だけど?
そもそも>>408の2行のレスに対して>>414
あの2行でどう見えたもくそもない あ、エスパーですか

そして>>414の自分の出した反問にも関わらず、答え>>417をスルーして>>434の発言
それで何か勘違いしているようだが>>414のレス以降、レスはしてないわけだが?
>>441やその後のレスなんて知ったことではない
他人の発言を見て勝手に木阿弥にされてもね

>上から目線が気に入らないのはあなたの勝手だが
>悪いが互角にやり合える相手に見えてないもので
上から目線は否定しないわけか
そうやって見下してる時点で、あんたは他人の発言を理解することはできないよ
部下のやってることにたいして「お前は分かっていない・できていない」と言って自分の他人への理解力のなさから部下の言ってることを理解できていない
まるでワンマン部長と同じだよ
490デフォルトの名無しさん:2006/02/02(木) 17:45:35
>>414のレス以降=>>417のレス以降
491デフォルトの名無しさん:2006/02/02(木) 17:50:05
ポインタを理解していないとか言って下手な問題を出して散々叩かれてた奴と同一の悪寒がする
492481:2006/02/02(木) 17:52:03
>>482
そうですか、よかったぁ・・
自分ひとりでもくもくとやってきたもんですから他から見たら変なソースになってないかどうか不安だったもんで
ちなみにアルゴリズムというんでしょうか処理の仕方は変えないとしてソース自体の改善点をあげるとしたらどういったところがあるでしょうか?
493デフォルトの名無しさん:2006/02/02(木) 17:58:25
>>489
再び、よく読んでね

あなたが解ってないかどうかは、こちらから見てって立場をはっきり示してるでしょ
違うのなら違うと思わせる発言をすればいい
今のところそれがないわけだが 441 があなたではないなら、なおさらだね
それこそこっちはエスパーじゃないんだから突っ張るだけじゃ伝わらないよ

ここはプログラム技術板なんで、技術的な話がどのくらい噛み合うかが論客の主要な価値であって
今のあなたはそれを低く見られているのに悪態までつくとクレーマーさながらだよ、およしなさい
494デフォルトの名無しさん:2006/02/02(木) 17:59:37
こんな所でイチャイチャするな!!
495デフォルトの名無しさん:2006/02/02(木) 18:05:28
久々のフレームか?これぞCスレの醍醐味だぜ
で、何を議論してんの?
496デフォルトの名無しさん:2006/02/02(木) 18:10:38
>>492
ざっとしか見てないけどチェック関数がごり押し過ぎるか
盤面広げるとかすると書くのきつい
ついでにそれで行くとしてもif文の最初のa[][]&&部分必要ないような・・・
497デフォルトの名無しさん:2006/02/02(木) 18:16:06
>>493
君が間違っているように見える。とにかく二人とも別でやってくださいね。

では質問とかどうぞ。
498デフォルトの名無しさん:2006/02/02(木) 18:16:24
>>492
いや、あちこち拙い。
言語仕様上の(警告レベルの)問題点が2点、悪魔が鼻から出る問題点が1点、
誤入力で暴走する問題点が1点、可読性の観点での問題点が2点、
衒学的なファイル管理上の問題点が1点あるな。
499デフォルトの名無しさん:2006/02/02(木) 18:18:19
>>498
それ厳しいだろ
多分随分前に来た○×の盤面表示わかりませんの初心者でしょこの人
500デフォルトの名無しさん:2006/02/02(木) 18:21:02
>>481
間が悪かったようだね、可哀想に。

コードはイイ感じ。プログラムセンスがあるようだ。ただし、デバグが甘い。
数字以外の入力があった場合の対処法を覚えないと、使い物にならないよ。
501デフォルトの名無しさん:2006/02/02(木) 18:24:02
>>481 つfgets
502デフォルトの名無しさん:2006/02/02(木) 18:24:51
http://dream.my-sv.net/upload/src/up0128.zip.html

この中のtest.hでは
typedef struct _test *Test;
って書いていてtest.cでstruct _testの実体を書いているんですが、
普通はヘッダファイルに実体を書きませんか?
これっておかしくないですか?
503デフォルトの名無しさん:2006/02/02(木) 18:28:55
>>502
確かにおかしい。
_test なんて名前を使っているのもおかしいw
ユーザー定義にアンダーバーを頭に付けるのはタブーだぞ。

504デフォルトの名無しさん:2006/02/02(木) 18:31:10
>>502
構造体の中身に触れられたくない時とか、
コンパイル時の依存を断ち切るのに、結構良く使う普通のテクニック。
505デフォルトの名無しさん:2006/02/02(木) 18:33:47
>>504
そんなこと出来たんですか。
ありがとうございます。
506デフォルトの名無しさん:2006/02/02(木) 18:34:34
>>502
> 普通はヘッダファイルに実体を書きませんか?
全然おかしくないぞ。
お前に見せるとろくな事をしないんで見せない。

FILE構造体とかがどちらかというと変なだけ
507481:2006/02/02(木) 18:44:07
>>496
確かにこれ以上チェックの条件増やしていくのは厳しくなりますね・・

>>500
数字以外の場合〜の問題点は対処しきれてませんね
正直そこまではいいかと思ってましたが考えて見ます
508デフォルトの名無しさん:2006/02/02(木) 18:46:03
>>507
前にオセロ作りたいとか言ってた人?
509498: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の単純変数でいいし、配列を使用するとすっきりするだろう。
510デフォルトの名無しさん:2006/02/02(木) 18:50:40
>>509
シミュレーションGAMEとかでプレイヤーフェーズとかあるあれじゃない?
スペル知らないけど
511デフォルトの名無しさん:2006/02/02(木) 18:54:25
あー、phase? どっちかと言うと、turnな気がするが。
512481:2006/02/02(木) 19:41:03
>>508
んーオセロ作りたいといってた人は私以外にも何人かいたみたいですが
基礎を学んだだけで実力つけるためにゲーム作ってみようといったものです。
それで最初はオセロを作る予定だったけどまだ技術的に無理だったからマルバツにのりかえたって話してました。

>>509
参考にさせていただきます。
・配列の範囲外をアクセスしてはいけない。
・b配列に入れる必然性がない。
ってところはまだよく理解できてないところが有りますが・・。

faseはフェイズのつもりでしたが誤字だったかな。
513デフォルトの名無しさん:2006/02/02(木) 19:45:49
フェーズ フェイズ phase

>>498
言語仕様上の(警告レベルの)問題点が2点って?
514デフォルトの名無しさん:2006/02/02(木) 19:46:03
>※fgets()とatoi()/strtol()/sscanf()を組み合わせるのが無難か。

その「用心」ができない人たちのポピュラーな対応らしいが
はっきり言って、どれ使おうがそいつが書く限り気休めの域を出ないだろ
てきとーこかずに仕様をちゃんと確認して使うって基本がない以上ね
515デフォルトの名無しさん:2006/02/02(木) 19:48:12
scanf("%[123]",&i);

1,2,3以外入力拒否になる,では?
516509=498:2006/02/02(木) 19:58:23
>>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デフォルトの名無しさん:2006/02/02(木) 20:23:31
この説明したがりの上から目線って

ポインタ問題で叩かれ、そしてさっき喧嘩していたやつなのか?
519509=498:2006/02/02(木) 20:29:15
>>518
漏れのことなら違うよん。
#って書く辺り、「説明したがり」の自覚がないでもないらしい。

>>517
やけに絡むなぁ。ではどうしろと?
520デフォルトの名無しさん:2006/02/02(木) 20:36:22
>>519
「暴走」が起きているのは scanf ではなく、あなたのプログラムってことを理解しろ
ISO/IEC9899 に完全準拠しバグが絶対にない(悪魔の証明だが) scanf でも
あなたのプログラムは相変わらず「暴走」するだろう

ここまで来るとど素人でも Failed Module がどこなのかを言い当てることはできる
521デフォルトの名無しさん:2006/02/02(木) 20:39:51
>>519
たぶんとりあえず、ポインタとかさっきの喧嘩と同じく、
とりあえず喧嘩吹っかけたい人が居るみたいなので落ち着いて無視すれば良いと思うよ
522デフォルトの名無しさん:2006/02/02(木) 20:42:27
sage つけて自作自演に走った「論客」さん、よっぽど悔しかったんだね
523デフォルトの名無しさん:2006/02/02(木) 20:43:57
初心者の時から scanf を一度も使ったことが無い
手持ちの本にも載っていなかったので
%dだの%sだの指定するのがメンドイと感じてしまう
そんな私からすれば
なぜscanfを使いたがる人が多いのかと
逆にふしぎだったりする
524デフォルトの名無しさん:2006/02/02(木) 20:45:34
>>512
いや、予想通りの人だ多分

scanf()は読み込めないとストリームに放置したままヌルーするから嫌われてるだけ
自分で作って自分でPLAYする分には使っても一向に問題ないよ
525デフォルトの名無しさん:2006/02/02(木) 20:47:29
>>523
とりあえず楽じゃん
数値ならatoiやらstrtolやらせんでもいいし
ちょっとやりたい時とかfgets(str,256,stdin);とか書くの・・・やってみたらむしろ楽だなヲイww
526デフォルトの名無しさん:2006/02/02(木) 20:49:05
>>523
あなたに動機がなければそんなもん
scanf どころか printf すら滅多に使わないバリバリ現役の人ふつーにいるし
527509=498:2006/02/02(木) 20:54:54
>>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 なんか使ったら説得力ないでしょうが
ね、だから気休めの域を出ないって言うのよ
529デフォルトの名無しさん:2006/02/02(木) 21:01:03
mallocで確保したものにsizeofされかねん
530デフォルトの名無しさん:2006/02/02(木) 21:04:23
○×ゲームの数値チェック(1,2,3以外はエラー)だったらatoiで十分じゃん
531デフォルトの名無しさん:2006/02/02(木) 21:07:03
>>530
scanf なら1回で済むね
532>>447=>>448=>>452:2006/02/02(木) 21:07:24
>>465
>どうやら話が循環したようだな

漏れに関しては「main()に処理を全部詰め込んだ方が分かり難い」と感じます。
初期化部分とメインループと終了処理ぐらいは.ファイルを分割して分かり易い状態で保存してる

>>480
>この前のポインタの時も分かったというレスに対して「分かっていない」→結果「分かっていた」んだが同一人物なのか?
>こう説明したがりの上から目線の。
>普段職場で「分かっていない」と上司にこき使われてるそれらの反動かな
そんな気ガス。。
533>>447=>>448=>>452 :2006/02/02(木) 21:13:23
レスが多くてどのレスが誰なのかわからん

同一人物かどうかわからないけど>>519はいい香具師そう
534デフォルトの名無しさん:2006/02/02(木) 21:14:15
>>527
う〜ん場合にとっては配列MAXまで読み込まないほうが処理手抜きできると思うのだよね
535481: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等を調べてみます
536デフォルトの名無しさん:2006/02/02(木) 21:42:12
数式で、

A /= 5

ってどういう意味ですか?割ってるのに=?・・・
537デフォルトの名無しさん:2006/02/02(木) 21:44:43
>>536

A /= 5は A = A / 5と一緒
538481:2006/02/02(木) 21:53:48
scanfの部分をこう追加や変更を加えればscanfの問題はOKですか?
char x;
fgets(x,sizeof(x),stdin);
i = atoi(x);
で、エラー文をiの値が1,2,3以外のときは数字が違うと言うエラー
539デフォルトの名無しさん:2006/02/02(木) 21:56:33
>>537
なるほど〜、どうもありです。

てか中途半端に略せるの止めてほしいなぁ・・・
i=i+1 → i++
とかだってたった2文字だけじゃん
そんなところで時間省けても、プログラム考えるのに何時間とかかるんだから意味なくない?
540デフォルトの名無しさん:2006/02/02(木) 21:58:44
>>539
視野が狭いな
541デフォルトの名無しさん:2006/02/02(木) 22:00:56
>>540
まだ初心者なんですんません・・・
542デフォルトの名無しさん:2006/02/02(木) 22:01:11
>539
int a[N];

a[rand()%N] /= 2;

a[rand()%N] = a[rand()%N] / 2;
が等価でないことは分かるか?
543デフォルトの名無しさん:2006/02/02(木) 22:01:33 BE:38820454-
>>539
変数名が
jugemu.jugemu.goko.no.surikire.kaijari.suigyo.no.fuuraimatsu.suiraimatsu.unraimatsu
だったら84文字の節約になるよ。
544デフォルトの名無しさん:2006/02/02(木) 22:03:00
>>542
分からないです・・・
ちなみにあなたの言いたいことも分からないです・・・
545デフォルトの名無しさん:2006/02/02(木) 22:04:02
*i++ = *n++;
546デフォルトの名無しさん:2006/02/02(木) 22:04:03
>>543
アルファベットだけで大文字、小文字あわせて54個あるのに長くする意味あるんですか?
547デフォルトの名無しさん:2006/02/02(木) 22:08:04 BE:48525555-
>>546
まず数の数え方から勉強した方がいいのではないかと…
548デフォルトの名無しさん:2006/02/02(木) 22:09:21
>>542
int n;

n = rand() % N;
a[n] = [n] / 2;
こうならa[rand()%N] /= 2;と等価。

[]の中に副作用のある式を書かれたら今度こそ説明が付かないけれど。

>>544
ようするにrandは毎回ランダムな数を返すから、
a[rand()%N] = a[rand()%N] / 2;では=の右辺と左辺で異なる要素を扱うことになってしまう。
549デフォルトの名無しさん:2006/02/02(木) 22:19:02
>>539
おまえ CPU がどうやって動いているか一回勉強しろ.
> i=i+1 → i++
の i++ ってのは, CPU の物によったら 1命令.
今のコンパイラは, 最適化がそこそこ頑張ってくれるが,
昔のコンパイラは i = i + 1 と i++ だと計算時間が
違う奴が結構いた.
そもそも C を高級言語と思うな!
せいぜい, 高級アセンブラだぞ...
550デフォルトの名無しさん:2006/02/02(木) 22:21:27
>>549
CISC のアセンブラ知らねー奴に後置++ の説明は一苦労だな
551デフォルトの名無しさん:2006/02/02(木) 22:23:26
>>539
++演算子については文字数の問題ではない。

a = b++;

a = ++b;
は違う。

ポインタ変数が絡むと更に違う。
552デフォルトの名無しさん:2006/02/02(木) 22:23:39
add ax, 1

inc ax
の違いだな。
553デフォルトの名無しさん:2006/02/02(木) 22:24:22
増やすだけなら前でも後ろでもええがな(-ωー)
554デフォルトの名無しさん:2006/02/02(木) 22:27:09
>>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;などと書くようでは
「郷に入っては郷に従え」という言葉を知らないただの馬鹿。
555デフォルトの名無しさん:2006/02/02(木) 22:28:44
C言語には二つの変数を交換する式みたいなのはないの?
556デフォルトの名無しさん:2006/02/02(木) 22:28:51
a = a+2 とかはわかりやすい書き方だとは思うけどね
初めて知った時 a += 2 とかなんかとっつきにくかったし
557デフォルトの名無しさん:2006/02/02(木) 22:29:37
>>555
なかった気がする
つーかそんくらい自分でやってください
558デフォルトの名無しさん:2006/02/02(木) 22:30:30
>>551その他は言ってることは正しいんだが
>>539の例に出している単なる1加算の場合は
中途半端な略と思うのも分かるなぁと
559デフォルトの名無しさん:2006/02/02(木) 22:30:45
560デフォルトの名無しさん:2006/02/02(木) 22:31:45
タイムマシンで過去に戻ってPDP-11にxchg命令みたいなのを追加すれば、Cにも変数を交換する式ができますか?
561デフォルトの名無しさん:2006/02/02(木) 22:35:46
>>538
たったの3種類[1.2.3.]なら数字に変換する必要ないだろう
if文に直で'1''2''3'を判定すればすむじゃないか
562デフォルトの名無しさん:2006/02/02(木) 22:36:51
>556
私は逆だったな。"aに2を足す。"と読めるんで、"aはaに2を足したものとする"よりわかりやすかった。
563デフォルトの名無しさん:2006/02/02(木) 22:46:11
>>538
つかそれ、何入れてもx=='\0'
564デフォルトの名無しさん:2006/02/02(木) 22:50:51
C++ になら swap 関数テンプレートがあるのだが、
C だとマクロ使わないとこの手の汎用ルーチンは作れないね。

#define swap(type, a, b) do { type C_ = (a); (a) = (b); (b) = C_; } while(0)
565デフォルトの名無しさん:2006/02/02(木) 22:50:59
>>538 fgetc と fgets の違いを述べよ
566デフォルトの名無しさん:2006/02/02(木) 22:53:40
>>562
a += 2
これを見て,"aに2を足す。"と読めるなんてお前天才だなwww

シグマの求め方は、"aはaに2を足したものとする" って考えていくんだから、分かりにくいってよほど最初に習わないと無理だろ
567デフォルトの名無しさん:2006/02/02(木) 22:57:45
>>565
一番後ろの文字が違う
568デフォルトの名無しさん:2006/02/02(木) 22:58:06
>>561
あ、そうなんですか
文字として1,2,3が認識されると思ってたんですが数字の1も文字の1も一緒なんですね(?)
って・・・悪魔のささやきってメル欄にあるのですが・・。

>>563
x[2]にしないといけないって事ですか?
569デフォルトの名無しさん:2006/02/02(木) 23:00:13
>>568
文字として判定せーよ
同じじゃないよ
570デフォルトの名無しさん:2006/02/02(木) 23:01:28
>>568
文字と文字配列の違いが分からないなら絶対やるなよ
571デフォルトの名無しさん:2006/02/02(木) 23:01:46
>>568
1や2や3は数値。
'1'や'2'や'3'は文字。
572デフォルトの名無しさん:2006/02/02(木) 23:02:18
つーか。盤が大きくなったら使えない技を勧めるなよと。
573デフォルトの名無しさん:2006/02/02(木) 23:02:43
>>568
fgetsの2番目の引数は引数-1まで読んで最後の\0だ
1-1はいくつだ
574デフォルトの名無しさん:2006/02/02(木) 23:03:44
ところで途中読んでないけどこれまさかさっきの○×の話じゃないだろうな?
575デフォルトの名無しさん:2006/02/02(木) 23:18:47
mallocで開放せずに処理を行っていました。
こういう場合、int hoge[100] みたいなスタック領域を破壊することはありますか?
ヒープ領域とスタック領域とあるので領域が別?とか考えるのは間違いでしょうか?
576519他:2006/02/02(木) 23:21:19
>>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がよきに計らってくれるのであんまり意識しなくてもいい。
但し、繰り返し処理で毎回確保するようだといつかメモリが足りなくなる。
577デフォルトの名無しさん:2006/02/02(木) 23:21:29
破壊はしないと思うが
確保できなきゃNULL返るだけだし
578デフォルトの名無しさん:2006/02/02(木) 23:27:26
>確保した領域は、プロセス終了時にOSがよきに計らってくれるのであんまり意識しなくてもいい。

どのように「よきに計らって」くれるのかをきちんと調べておくことが大切
そのソースが将来移植される全ての処理系をいま予測する必要がある

main という実行環境とのインターフェイス部分で問題処理までやるからそうなるんだよ!
579デフォルトの名無しさん:2006/02/02(木) 23:27:52
とりあえず、入門変を読み終えて、実際に仕事でCを使い
メカ制御を行うファームウェアを作っています。
そんな俺も春で3年目。

仕事も落ち着いたので、もう一歩ステップアップするための書籍を探しています。
お勧めはありますか?

とりあえず、今はITRONやSHなどのマイクロ関係の本を読んでますが、
Cでよい本があれば教えてください。
580519他:2006/02/02(木) 23:32:26
>>579
只ステップアップと言っても要求するもんが判らないなぁ。
書籍スレ辺りを覗いてみてはどうだろう。
581デフォルトの名無しさん:2006/02/02(木) 23:33:05
>>579
そこから上は尻に火がつかないと・・・
とりあえずハードも憶えるあたりからじゃないか?
とりあえずで済むような甘い相手じゃないが
582デフォルトの名無しさん:2006/02/02(木) 23:38:28
>>576-577さん、レスありがとうございます。
実は、スタック破壊起こしてますね〜みたいな話をされてる
方がいたんですが、どういう場合にスタック破壊がおこるのでしょうか?
str = malloc(10)とかやってmemcpy(str, hoge,11)とかをやってしまった場合
スタックを破壊する可能性はあるんでしょうか?
583初心者の嘆きを聞いてくれ:2006/02/02(木) 23:38:42
ttp://www.sgnet.co.jp/c/2-1.htm
ってやつ(結局はC言語超初心者向け講座らしい)

サンプルプログラムのスペースが 全 角 になってやがる。。。
おかげでHelloWordでつまづくところだった。
584481: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はまだまだ分かりきれてないようです・・勉強します。
585デフォルトの名無しさん:2006/02/02(木) 23:42:21
>>535じゃなくて>>576でした。
586デフォルトの名無しさん:2006/02/02(木) 23:48:19
>>582
それはmallocの問題じゃないと思うが
587デフォルトの名無しさん:2006/02/02(木) 23:58:38
>>586さん、レルありがとうございます。
malloc云々は関係ないですね。
確保した領域をオーバーして書き込んでしまった場合、
そのアドレスがスタック領域であった場合、破壊してしまう事になるんでしょうか
588デフォルトの名無しさん:2006/02/03(金) 00:01:18
>>587
大抵のコンパイラが吐くコードならスタック領域では無い
589デフォルトの名無しさん:2006/02/03(金) 00:02:44
>>549,550
「インクリメント/デクリメント演算子は
*--sp = x --> push x
x = *sp++ --> pop x
したかったので導入した」
ってのを Usenet だか IEEE だかの論文か何かで
読んだ記憶が...
590519他:2006/02/03(金) 00:15:20
>>584
>配列は戻したあと受け取られてないんですか?これ・・。

・main()のaは関数から戻ってきたのではない。
main()のaの内容が書き換わっているのは、main()のaの場所を関数に教えて
そこを関数が書き換えているから。
・関数の戻り値の型がintなのに配列は戻せない。
だから、return a;ではエラーが出る。当然だ。
例えばa[0][0]なら返せるが、それは配列ではなく、只の整数値だ。
・そもそも呼び出し側で受け取っていない。
受け取るには、例えば int foo = PLAYER(a);などとする必要がある。

配列は関数に渡せない。渡しているのはその場所(即ちポインタ)のみ。
逆に、場所を渡しているから関数から書き換え可能となっている。
関数の引き数と戻り値の仕掛けについて、もっと単純な関数で色々試してみることをお勧めしておく。
591デフォルトの名無しさん:2006/02/03(金) 00:20:22
>>588さん
ではスタック破壊とはどういった時におきるんでそう(?_?)
コンパイラはなんだか分からないんですが、組込み系の処理なですが、。
592デフォルトの名無しさん:2006/02/03(金) 00:45:42
>>591
mallocでスタック破壊といった人間にきけば?
593デフォルトの名無しさん:2006/02/03(金) 00:54:55
>>590
なるほど・・そういうことだったんですね
じゃあ書き換えは関数内でやって関数自体はvoidでいいですね、勉強になりました。
594デフォルトの名無しさん:2006/02/03(金) 01:13:19
>>591
{
int i;
(&i)[32] = 0;
}
呼び出し側のスタックとか、
返りアドレス上書きするとスタック破壊になると思う。タヴン。
呼んだのとは違う場所に帰ったりさせると面白い。
595デフォルトの名無しさん:2006/02/03(金) 01:45:15
質問なのですが、文字列の連結の時は
596デフォルトの名無しさん:2006/02/03(金) 01:50:37
時は?
597デフォルトの名無しさん:2006/02/03(金) 01:52:09
誤爆しましたorz 文字列の連結の時には while(*s1++); while(*s1++ = *s2++);
で上手く連結することができるのですが、これで文字列の比較をしようとするときに、
while(*s1++ == *s2++){ if(*s1 == '\0') printf("等しいです"); とやったのですが、
これだと違う文字列を比較したときにも「等しいです」。
とでてしまうのですが、これは何でこうなるのでしょうか?
どなたか教えて頂けると助かります<(_ _)>
598デフォルトの名無しさん:2006/02/03(金) 02:00:49
そんなトリッキーなコードを書こうとするから分からなくなる。
素直に分かりやすく書け。
どうせ最適化が効いてパフォーマンス変わらん。
599デフォルトの名無しさん:2006/02/03(金) 02:01:13
>>597
s1="A";
s2="AB"とする

最初の比較で*s1++==*s2++は真なのでwhileに入る。
次にs1をインクリメントしたので*s1=='\0'なのでif文が真になって等しいですと表示。

というかstrcmp使え
600デフォルトの名無しさん:2006/02/03(金) 02:06:16
おお!そういうことだったんですか!
>599さんありがとうございます<(_ _)>
文字を格納後、格納先が真か偽か判断ということでいいんですね!
本当に助かりました。ありがとうございます!
601デフォルトの名無しさん:2006/02/03(金) 02:52:43
>>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; //まとめて宣言と追加

とする方法、どちらがメジャーで使いやすいのでしょうか?
603デフォルトの名無しさん:2006/02/03(金) 04:02:45
後者のが気分が(・∀・)イイ!!
604デフォルトの名無しさん:2006/02/03(金) 07:50:39
俺は構造体の宣言時はstructをつける派だな。
605デフォルトの名無しさん:2006/02/03(金) 10:44:39
>>602
どちらもコンパイルエラーとなる訳だが
606デフォルトの名無しさん:2006/02/03(金) 10:48:53
>>602
前者と後者は等価でない事を判っているのか?
607デフォルトの名無しさん:2006/02/03(金) 10:54:38
突然ごめんなさい。
あの、自分のコンピュータから同じネットワーク内にあるコンピュータのファイルを見れるようなコマンドありませんか?
608607:2006/02/03(金) 10:56:40
あと堀江由衣って、顔マルいよね?
609デフォルトの名無しさん:2006/02/03(金) 11:03:52
マルいしキモイ
610デフォルトの名無しさん:2006/02/03(金) 11:12:17
>>607
板違い
611デフォルトの名無しさん:2006/02/03(金) 11:13:49
>>606
あーゆー事を人に訊くくらいだから
解ってないんでしょう。
612デフォルトの名無しさん:2006/02/03(金) 16:38:33
>>607
ls
613デフォルトの名無しさん:2006/02/03(金) 16:44:38
lsはリナ糞じゃないの
614デフォルトの名無しさん:2006/02/03(金) 16:46:34
>>591
自動変数のバッファオーバーランの時。
例: void func() { char s[1]; s[2] = '\0'; }
でも、これも自動変数をスタックに作らないコードを作る
コンパイラだったらスタックは破壊されない。(破壊する
ことには代わりはないが、別の場所が壊れる)。

ところでなんで未だにリターン値を入れるスタックに自動変数を
作るようになってるんだろう? 高速だから? 互換性の問題?
スタック代りになる別レジスタ作ってコンパイラをそれに合わせ
ればもっと安全になるのに。
615デフォルトの名無しさん:2006/02/03(金) 17:20:46
「関数の戻り値がポインタとなる」
File関連、メモリ関連の標準関数で使用されるのは解ったのですが、
実際に関数を自作する時に「関数の戻り値がポインタとなる」場合、
または、そうする事により便利になる場合というのは、
どのような時なのですか?
616デフォルトの名無しさん:2006/02/03(金) 17:36:04
>>615
FILEのように、具体的な処理内容を隠蔽した関数群を作る際に。
617デフォルトの名無しさん:2006/02/03(金) 17:36:09
俺大学生だけど
ここって、研究室の先輩とか教授とかより頼りになるよ。
おれの研究室終わってる。
618デフォルトの名無しさん:2006/02/03(金) 17:50:52
俺の教授も尾わっ採る
619デフォルトの名無しさん:2006/02/03(金) 17:52:35
教授なんて所詮政治力
620デフォルトの名無しさん:2006/02/03(金) 17:59:12
>>615
C言語でオブジェクト指向風に作る時。FILE関係はその例でもある。
621デフォルトの名無しさん:2006/02/03(金) 18:07:21
>>616、620
thx。

>>620
C言語で構造体を使ってclass風に組む、という事でしょうか?
622デフォルトの名無しさん:2006/02/03(金) 18:17:36
>>621
読んでみると面白いかも。使うのどうかと思うが。

C 言語によるオブジェクト記述法 COOL
ttp://www.sage-p.com/process/cool.htm
623デフォルトの名無しさん:2006/02/03(金) 18:32:07
中身を公開していない構造体へのポインタを返すのは
オブジェクト指向じゃなく、単なるカプセル化だな。
624デフォルトの名無しさん:2006/02/03(金) 18:39:00
>>623
オブジェクト指向「風」ってことだよ。
X Window System の Xlib もそんな感じだな。
625デフォルトの名無しさん:2006/02/03(金) 18:41:17
>>622
昔はC++ってCに変換してからコンパイルしてたからな
C++に出来てCに出来ないことはなかった。

あの凶悪な「テンプレート」さえなければ
626デフォルトの名無しさん:2006/02/03(金) 19:16:50
「template という識別子は将来の為に予約されています」

だったから大丈夫。
627デフォルトの名無しさん:2006/02/03(金) 19:31:07
#defineと#includeをうまく使えばCでジェネリック・プログラミングも不可能ではないんだけどね。
628デフォルトの名無しさん:2006/02/03(金) 20:01:54
/* 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
629デフォルトの名無しさん:2006/02/03(金) 20:03:05
/* 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;
}
630デフォルトの名無しさん:2006/02/03(金) 20:59:35
>>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;
}
と言うプログラム作ったんだが
これって俺が思ってるよりも危険?
632デフォルトの名無しさん:2006/02/03(金) 21:20:42
無能はプログラムなんかしなくていいのに
633デフォルトの名無しさん:2006/02/03(金) 21:34:55
>>631
オマエは ネ 申
634デフォルトの名無しさん:2006/02/03(金) 21:39:16
後はこれを勝手に増殖するようにすれば・・・・
は秤ス考えてんだ、俺orz
635デフォルトの名無しさん:2006/02/03(金) 21:51:48
C言語とFortranの違いって何ですか???
636デフォルトの名無しさん:2006/02/03(金) 22:03:22
>>635
ちょwwwwwwwwwwおまwwwwwwwwFortranww
もうダメポ
637デフォルトの名無しさん:2006/02/03(金) 22:04:45
可変長の引数を取る関数に、動的な数の引数を与えたいのですが、
どうやれば出来るんでしょうか。
↓こんな関数にある時は2個、ある時は3個の引数を与えたいんです。

void test(char *fmt, ...)
{
 va_list ap;
 va_start(fmt, ap)

...
}
638デフォルトの名無しさん:2006/02/03(金) 22:17:17
test("", a); /* 2個 */
test("", a, b); /* 3個 */
639637:2006/02/03(金) 23:06:12
言葉が足りませんでした。
2個、3個と限定せずに、ある時は2個、ある時は1000個と渡します。
if文で1000個分岐させるのもありかもしれませんが、C言語として
動的な引数を一つの関数呼び出しで行うことは可能なんでしょうか。
スタックを積むことが出来れば、可能なんでしょうが。
640デフォルトの名無しさん:2006/02/03(金) 23:08:31
>>637
ヒント:文字列の長さの場合はどうやっているか?
641デフォルトの名無しさん:2006/02/03(金) 23:10:23
>>639
まだ状況が分からん。
言葉だけじゃなくコードを交えて説明しちくり。
642デフォルトの名無しさん:2006/02/03(金) 23:17:25
可変長の引数を取る関数が分かるなら
可変個の引数を取る関数でググれば分かるはず
643デフォルトの名無しさん:2006/02/03(金) 23:19:27
>>637 自分が書いた関数の挙動を理解していないんジャマイカ
644637:2006/02/03(金) 23:26:41
/* ユーザーから数値または文字を複数入力、個数不明 */
int *number;
char *c;

/* これを前述のtest関数に渡す */
test(number[0], number[1], number[2]....);

こんな感じでどうでしょうか。
関数を作り直して配列で渡してしまえば、もちろんそれでいいのですが、
動的な数の引数を渡すことが、出来るか出来ないか知りたいので。
645637:2006/02/03(金) 23:28:05
もちろん、可変長の引数を受け取る方法は分かります。
646デフォルトの名無しさん:2006/02/03(金) 23:32:16
やりたいことは分かるが、多分できんよ。
わざわざ可変長で実装せず、void*の配列などで実装したほうがいいと思う。
printfを呼びたいんじゃぁってのなら、無理だが。
647637:2006/02/03(金) 23:34:37
やはりそうですか。
自分で書いた物なので変更は可能ですが、色々な使い方を考えると
可変長の引数を取れた方がライブラリとして便利なので質問しました。
どうもありがとうございました。
648デフォルトの名無しさん:2006/02/03(金) 23:42:43
printfに対するvsprintfというのもあるから
実際の可変長関数と、可変長引数を取る関数とをそれぞれ作っておいて
前者から後者を呼び出すってのも、ありかと思う
649デフォルトの名無しさん:2006/02/03(金) 23:43:27
×printf
○sprintf
650デフォルトの名無しさん:2006/02/03(金) 23:49:57
test(number, sizeof(number)/sizeof(number[0]));
651デフォルトの名無しさん:2006/02/04(土) 00:37:28
ダミーの値を入れて渡すという手もあるけど、
1000 個とかなるとやめてくれと言うしか無いなぁ。
まあ、実際は 1000 個もはやらないんだろうけど。
652デフォルトの名無しさん:2006/02/04(土) 02:01:32
例えば以下のような動的に確保されたメモリがあるとします。

int *hoge = (int*)calloc(num ,sizeof(int));

このhoge配列が持つ要素の数を調べるにはどうすればいいでしょうか?
本来は把握するべきなのですが・・・
653デフォルトの名無しさん:2006/02/04(土) 02:07:21
num おいとけ
654デフォルトの名無しさん:2006/02/04(土) 02:07:22
>>652
記憶しておくこと
655デフォルトの名無しさん:2006/02/04(土) 03:35:28
K&Rが読みにくくて仕方ないんだけど。。
webを見て翻訳を線引っ張って消して書き換えてみた訳だけども

索引もちょっと(贔屓目に見ても)わかりにくいし。。
本当に皆んなこの本読んでるんでしょうか?
656デフォルトの名無しさん:2006/02/04(土) 03:35:59
age
657655:2006/02/04(土) 03:37:46
文法の本だけで4冊持ってるからもうCの本そろそろ買いたくないし orz
658655:2006/02/04(土) 03:47:03
続編を含んでいるものもあるから、必然的にあと2冊は買わなきゃいけない
659デフォルトの名無しさん:2006/02/04(土) 04:21:13
画面消去して再出力するとき画面ちらつくんですが解消方法あります?
660デフォルトの名無しさん:2006/02/04(土) 04:44:30
PAINTSTRUCT構造体のメンバをうまく使えばいいんじゃね
661デフォルトの名無しさん:2006/02/04(土) 05:35:36
>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言語始めたばっかりなんでプログラムで教えてくれたらうれしいです!おねがいします。。
665デフォルトの名無しさん:2006/02/04(土) 08:03:09
>>660
あ、すいません
GUIでなくてCUIのプロンプト画面の方のことです
666デフォルトの名無しさん:2006/02/04(土) 08:28:49
>>665
消去しないで書き換えればよい。
標準Cではできないので、詳しくは適切なスレで聞きなおしなさい。
667デフォルトの名無しさん:2006/02/04(土) 08:31:35
>>666
ええと・・・どこで・・・
668デフォルトの名無しさん:2006/02/04(土) 08:47:32
>>667
WindowsならWin32APIのスレ、DOSならDOSのスレがある。
669デフォルトの名無しさん:2006/02/04(土) 08:48:24
ループを使って、1.aaa,2.aaa・・・10.aaaをfopenしたいんですけど、
どのようにすれば良いですかね?
670デフォルトの名無しさん:2006/02/04(土) 08:51:19
fprintf(fname,"%d.aaa",i)とでもしてfnameで開く
671デフォルトの名無しさん:2006/02/04(土) 08:54:58
>>668
ありがとうございます
672デフォルトの名無しさん:2006/02/04(土) 09:12:55
>>670
その場合はfnameはFILE構造体で宣言して良いのですかね?
fopenしてfnameのポインタを代入してないから、なんかおかしい気がするんですが。
673デフォルトの名無しさん:2006/02/04(土) 09:19:46
寝惚けてた
sprintfだ
674デフォルトの名無しさん:2006/02/04(土) 09:20:15
たぶん670のfprintfはsprintfの間違いだと思う。
675デフォルトの名無しさん:2006/02/04(土) 09:26:55
C言語超入門っていう本を読んだんですが
次に読むおすすめの本ありませんか?
どれが良書かよくわからなくて(汗
まだ初めて一週間くらいですが本の内容はいちお理解しました
676デフォルトの名無しさん:2006/02/04(土) 09:49:07
>>675
1) K&R、655が読みにくいと言っているが気にスンナ
2) C言語ポインタ完全制覇:冬休みに斜め読みしただけだかニヤニヤしながら読める本だ
677デフォルトの名無しさん:2006/02/04(土) 09:53:14
>>676
ありがとうございます
休み中に買って読んでみます。
678デフォルトの名無しさん:2006/02/04(土) 09:54:21
>>673-674ありがとうございました。
679デフォルトの名無しさん:2006/02/04(土) 10:00:32
突拍子もな位質問をするようで申し訳ないのですが、
教えて下さい。

メモリ上の話なんですが、

int A = 100 ;

って変数宣言した時、メモリ上にint型でAの領域を確保して、その箱の中に100という値を格納するは分かるのですが、
その確保した領域に対して「ここがAだ!」という情報を格納しているのはメモリのどこに存在するのですか?

よろしくお願いします。
680デフォルトの名無しさん:2006/02/04(土) 10:11:15
>>679
そのどちらも存在するとは限らない。
そもそも関数内のローカル変数かどうかでも違うし、最適化によって変数そのものが消えるかもしれない。
681デフォルトの名無しさん:2006/02/04(土) 10:22:43
>>679
>その確保した領域に対して「ここがAだ!」という情報を格納しているのはメモリのどこに存在するのですか?

「その箱の中に100という値を格納する」命令自体は、
メモリのどこに格納されているか知っているか?
682デフォルトの名無しさん:2006/02/04(土) 14:58:36
あえていうなら実行コードの中。
683679:2006/02/04(土) 15:09:26
>>680
グローバル変数でもローカル変数でもいいので教えていただけませんか?

>>681
存じておりません…

>>682
exeの中ってことですか?


自分がアホさに情けなくなってきます…('A`)
684デフォルトの名無しさん:2006/02/04(土) 15:18:36
>>679
アセンブリでも覚えれば全て氷解
685デフォルトの名無しさん:2006/02/04(土) 15:24:42
>683
そもそも、なぜ、変数のアドレスがどこに格納されてるかを知りたいか?
686デフォルトの名無しさん:2006/02/04(土) 15:25:41
>>679
おそらくコンパイルされた後にはそのような情報は跡形もない。
強いて言えば名前ではなくアドレスを使っているとでも言えばよいか。
687デフォルトの名無しさん:2006/02/04(土) 16:02:46
>>679
1. 静的な変数の場合
命令部にアドレスが直接埋め込まれている。
ただし、実行ファイルの状態では実行時の実際のアドレスにはなっておらず、
実行ファイルをメモリ上にロードする際に実際のアドレスに書き換えられる。

2. スタック上に確保される変数の場合(非静的内部変数)
スタックのアドレスからのオフセット(ずれ)として命令部に直接埋め込まれている。
実際のアドレスは、スタックのアドレスにオフセットを加減する事により得られる。
スタックのアドレスは、その関数が呼ばれる場所により変化するので、
具体的なアドレスを実行前に決定することはできない。
スタックのアドレスはレジスタに入れられている。

3. 最適化により A がレジスタになった場合
4. 最適化により A が消去され、100 が直接使われる場合
アドレスは存在しない。


まあ、アセンブリ言語勉強するのが手っ取り早い。
688デフォルトの名無しさん:2006/02/04(土) 16:08:25
>>683
いあいあ、ラディカルな考え方を継続できるなら大物になれるよ
689デフォルトの名無しさん:2006/02/04(土) 16:35:07
doubleは桁数が大きい時や精度が必要なときに使うと
書いてたのですがいつもdoubleじゃダメなんですか。
690デフォルトの名無しさん:2006/02/04(土) 16:42:26
>>679
変数名からその内容を参照することのできるデバッガならAがどこにあるかということを把握しているだろう。

>>689
むしろいつもdoubleが一般的。
floatは浮動小数点数版shortのような存在。
691デフォルトの名無しさん:2006/02/04(土) 16:43:18
だぼー!
692デフォルトの名無しさん:2006/02/04(土) 16:53:25
ありがとうございました。
693デフォルトの名無しさん:2006/02/04(土) 16:58:37
掛け算をするためのプログラムとして
#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関数はどこに定義されてるのですか?初心者ですみません。
694デフォルトの名無しさん:2006/02/04(土) 17:02:58
ヴェテランですみません
695デフォルトの名無しさん:2006/02/04(土) 17:08:58
>>693
int main(int argc, char *sa[])
あとatoiはprintfなどと同じ標準関数。<stdlib.h>の中で宣言されている。
696693:2006/02/04(土) 17:14:00
>>695
無理でした。「パラメータ 'argc' は一度も使用されない(関数 main(int,char * *) 」)というエラーメッセージ
がでてきました。でもatoi関数についてはありがとうございます。というかそもそもコマンドライン引数と言うのは
何なんですか?
697デフォルトの名無しさん:2006/02/04(土) 17:18:55
>>696
このままエラーと警告の区別つかないまま頑張ってください。
698デフォルトの名無しさん:2006/02/04(土) 17:19:11
>>696
エラーと警告の区別くらい付けてから出直しましょう。
699デフォルトの名無しさん:2006/02/04(土) 17:20:56
>>696
おとといになりましたらお越しください。
700693:2006/02/04(土) 17:21:34
>>697-698
すいませんでした。
無理でした。「パラメータ 'argc' は一度も使用されない(関数 main(int,char * *) 」)という警告がでてきました。
でもatoi関数についてはありがとうございます。というかそもそもコマンドライン引数と言うのは何なんですか?
701デフォルトの名無しさん:2006/02/04(土) 17:25:30
ここまでくると教えて君の愚問ですな

C言語 コマンドライン 引数
702デフォルトの名無しさん:2006/02/04(土) 17:35:53
>>700
糞汁で洗顔してからおいでください
703デフォルトの名無しさん:2006/02/04(土) 17:40:03
この程度の無能はリアルでもまあまあお目にかかれるから
イマイチおもしろみに欠けるなあ・・・
704デフォルトの名無しさん:2006/02/04(土) 17:41:12
リアルだったらその場にグーグル様がいらっしゃらないから仕方なかろ
705デフォルトの名無しさん:2006/02/04(土) 17:45:47
プログラミング中
 ↓
パソコン使用中
 ↓
今時ネットにも繋げない環境の方が少ない気が
 ↓
グーグル先生登場
706デフォルトの名無しさん:2006/02/04(土) 17:51:31
今日は狭量な香具師が多いなw
707デフォルトの名無しさん:2006/02/04(土) 18:10:44
まぁな
708デフォルトの名無しさん:2006/02/04(土) 18:11:17
ヾ(o゚ω゚o)ノ゙ プニプニ!プニプニ!
709679: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のアドレス
711デフォルトの名無しさん:2006/02/05(日) 01:52:30
アセンブリ言語はアドレス関係のことを理解するのに最適だな。
その他、効率のいいコード悪いコードというのもよく見えてくるようになる。
712デフォルトの名無しさん:2006/02/05(日) 02:03:27
>>679
外部結合を持つ変数の場合はリンカへの入力となるオブジェクトファイル内
外部結合を持たない変数の場合はコンパイラのヒープ内に保持されている

いずれにせよ実行時には A などというシンボル情報は完全に取り除かれ
単に「何番地」という呼び方になっている

このおかげで、
int A;
main()
{
A = 100;
}

int B, A;
main()
{
A = 100;
}
で実行時間に差が出る可能性を考慮する必要がない
(シンボル情報を参照していれば、B をスキップする時間が必要)
713デフォルトの名無しさん:2006/02/05(日) 12:50:08
デバッグシンボルを埋め込んだ場合はどこかにあるんじゃないの?
714デフォルトの名無しさん:2006/02/05(日) 12:53:27
まあそうだけど。
715デフォルトの名無しさん:2006/02/05(日) 19:09:55
primeってなんですか?
716デフォルトの名無しさん:2006/02/05(日) 19:12:12
>>715
文脈によって異なる。
が、このスレで聞くということから推論するとたぶん素数
717デフォルトの名無しさん:2006/02/05(日) 19:16:15
そうなんです、素数のかかわってるものなんです。
718デフォルトの名無しさん:2006/02/05(日) 19:30:18
メトロイド素数?
719デフォルトの名無しさん:2006/02/05(日) 20:15:56
素元と言えヘ(゚∀゚ヘ)
720デフォルトの名無しさん:2006/02/05(日) 20:25:26
そげんこといわれても・・・
721デフォルトの名無しさん:2006/02/05(日) 20:26:51
いっちょんおもしんなか
722デフォルトの名無しさん:2006/02/06(月) 00:02:40
なんか、いなかのほうげんにやっちゃにとっとけど…
723デフォルトの名無しさん:2006/02/06(月) 00:13:47
九州男児が「寒い寒い」うるさいです。
扉閉めないとすぐ怒鳴ります。なんとかしてください。
724デフォルトの名無しさん:2006/02/06(月) 00:18:51
芋焼酎でも与えておいて下さい
725デフォルトの名無しさん:2006/02/06(月) 00:54:16
芋焼酎は下のほうだ
一緒にするな
726デフォルトの名無しさん:2006/02/07(火) 11:43:56
#include <stdio.h>
main()
{
int i = 1;
printf("%d\n", i);
return 0;
}

65535以下の数値を使う場合unsigned shortを使うように心掛けて
長いソースの中でメモリを節約していく事が綺麗なソースと言うことですか?
727デフォルトの名無しさん:2006/02/07(火) 11:52:01
intをdoubleにキャストすると精度が損なわれるって聞いたのですが、
int型の46を1/100にしたdouble型の0.46に精度を損なわずに変更するにはどうすればよいですか?
728デフォルトの名無しさん:2006/02/07(火) 11:52:14
inlineって、プロトタイプに付ければいいんですか?
それとも、関数本体に付ければいいんですか?
729デフォルトの名無しさん:2006/02/07(火) 12:17:14
>>727
typedef base100 long
base100 hoge = 46;
730デフォルトの名無しさん:2006/02/07(火) 12:32:16
>>726
チガウヨ
731デフォルトの名無しさん:2006/02/07(火) 12:55:14
>>726
いえ、型のサイズに依存するならそれ用のヘッダを使ってください。
#include<stdint.h>
uint_fast16_t

# とか言えるようにC99が早く一般的になってくれー
# 自前で定義するの面倒だよー
732デフォルトの名無しさん:2006/02/07(火) 13:16:36
int
long
double
short

使い分けがわからねええええええええええええええええええええ!!!!
おっぱん的な使い方を教えてくださいm(_ _)m
733デフォルトの名無しさん:2006/02/07(火) 13:19:25
教える気が失せる言葉遣いだ
734デフォルトの名無しさん:2006/02/07(火) 13:39:00
>>730-731
理解を急ぎすぎたようなので勉強してきます。
ありがとうございました。
735デフォルトの名無しさん:2006/02/07(火) 14:09:57
>>732
C-FAQ 1.1どの整数型を使えばよいか、どうやって決めればよいか。
の答えを256回読め
736デフォルトの名無しさん:2006/02/07(火) 14:38:57
Borland Developer Studio
Eclipse+CDT
値段を考えないとするとどちらの開発環境が良いですか?
経験者の方、メリットデメリットで教えてください。
737デフォルトの名無しさん:2006/02/07(火) 14:42:31
>>736
ここで聞くな。
738デフォルトの名無しさん:2006/02/07(火) 14:44:44
>>735
あざーす
739デフォルトの名無しさん:2006/02/07(火) 14:50:30
C99はCOBOL2000やpngと同じようにマイナー規格になるね
740デフォルトの名無しさん:2006/02/07(火) 15:12:22
BCCて何に準拠してんだよ
いろいろ仕様が不明だ
741デフォルトの名無しさん:2006/02/07(火) 15:13:39
>>726
> 長いソースの中でメモリを節約していく事が綺麗なソースと言うことですか?

メモリの節約と綺麗なソースは、

 全 く 別 の 問 題 だ!
742デフォルトの名無しさん:2006/02/07(火) 15:16:36
今のPCスペック高いからメモリ節約とかあんま考えないでいいよ
743デフォルトの名無しさん:2006/02/07(火) 15:19:27
さらに言えば、メモリ節約したつもりになっても、
alignmentのことを考えると1byteも節約出来てないのに、
速度だけ遅くなったとかありえるからなぁ。
744728:2006/02/07(火) 15:28:05
よろしくお願いします
745デフォルトの名無しさん:2006/02/07(火) 15:29:35
>>744
いいよ#includeなんて書かないで
746デフォルトの名無しさん:2006/02/07(火) 15:31:55
>>745
>>728のどこにincludeと書かれているのか?と(ry
747デフォルトの名無しさん:2006/02/07(火) 15:34:10
>>746
やべぇincludeと読み間違えたorz
ブラウザの文字の大きさ変えようかな
748デフォルトの名無しさん:2006/02/07(火) 15:43:38
何で無視されたかわかんないんだろうな。

標準Cには、inlineなんて無いよ。
749デフォルトの名無しさん:2006/02/07(火) 15:46:42
>>748
(,,゚Д゚)∩先生C99は標準Cじゃないんでしょうか
750デフォルトの名無しさん:2006/02/07(火) 15:50:52
C99は亜種です
近づいてはなりません
あんなんCと認めません
751デフォルトの名無しさん:2006/02/07(火) 15:59:55
現時点での標準CはC99だけです
規格書のど頭にそう書いてあります
誰が認めようが認めまいが、標準化委員会が一番偉いんだから仕方ありません
みんなあきらめて非標準Cを使いましょう
752デフォルトの名無しさん:2006/02/07(火) 16:48:39
unsigned intて何ですか?
753デフォルトの名無しさん:2006/02/07(火) 16:49:56
>>752
ガンダム
754デフォルトの名無しさん:2006/02/07(火) 16:56:50
>>753
正解
755デフォルトの名無しさん:2006/02/07(火) 17:01:12
  int year;
  time_t t = mktime(&(struct tm){.tm_year = year, .tm_mon = 0, .tm_mday = 1});
C99 なんてキモいだけだよね。
756デフォルトの名無しさん:2006/02/07(火) 18:15:50
>>755
いや、それぐらいは可愛いもんだ。

一番まずいのは、alloca を無理にでも
標準化しようとしたために起こった
可変長配列の扱いの汚さ。
757デフォルトの名無しさん:2006/02/07(火) 18:17:14
C99なんて知らない俺が真の勝ち組
758デフォルトの名無しさん:2006/02/07(火) 18:19:30
C99はきんもーっ☆
みんな非標準Cを使おうでFA?
759デフォルトの名無しさん:2006/02/07(火) 18:28:20
きもかろうが、何だろうが
便利でお得ならば使う。

そうでなければ使わない。

それだけ。

正直、使用する価値がいまいち見えないんだよな。
760デフォルトの名無しさん:2006/02/07(火) 18:30:32
このスレのみんなでC100を決める
761デフォルトの名無しさん:2006/02/07(火) 18:41:05
可変長配列は

void func(void *base, int nmemb, int size, /* ... */) {
    char (*work)[size] = base;

    for (int i = 0; i < nmemb; i++) {
        work[i]をあれこれ
    }
}

みたいな感じで使うと便利かもしれないような気がしないでもない。
762デフォルトの名無しさん:2006/02/07(火) 18:52:26
とりあえず、途中での変数宣言はいい。
だが、これだけなら C++ を better C として使った方が・・・。
763デフォルトの名無しさん:2006/02/07(火) 19:00:54
ブロックの先頭以外で変数が宣言できるのなんてCじゃないやい!ヽ(`Д´)ノ
764デフォルトの名無しさん:2006/02/07(火) 19:15:20
>>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) のように [*] という記述方法を使用することでそのエラーを回避することができるのです。

まさに泥沼・・・
765デフォルトの名無しさん:2006/02/07(火) 19:46:07
Cの仕様は最初から十分おかしい。
staticが場所によってリンケージを指定したり記憶域期間を指定したり、
voidの意味が3通りあったり
負数同士のわり算が未定義とか

泥沼じゃない仕様なんてCじゃない、ということでFA。
766デフォルトの名無しさん:2006/02/07(火) 20:09:28
>>765
割り算のは処理系定義。
ちなみにC99で改善された。
767デフォルトの名無しさん:2006/02/07(火) 20:13:30
片方が負数の場合は処理系定義
両方が負数の場合は未定義

だったと言ってる人がいる
ttp://forums.belution.com/ja/cpp/000/048/94.shtml
768デフォルトの名無しさん:2006/02/07(火) 20:40:12
Cの仕様で一番突っ込むとこは「ビット演算子の優先順位」だろ
この悪しき優先順位はJavaにも継承されてしまった...
769デフォルトの名無しさん:2006/02/07(火) 20:58:29
>>768
Javaで直されたらかえって混乱するだろうから仕方がなかったのだろう。
770デフォルトの名無しさん:2006/02/07(火) 20:58:46
C言語初心者で、やっと入門書が終ったんですけど、次にどんな本を読もう
か迷ってます。
数値計算とアルゴリズムに興味があって
図書館でみた、奥村先生のC言語最新アルゴリズム事典が面白そうだったん
ですけど、これって改訂版とかはでてないですか?本屋で探しても、初版
しか置いてなかったんですけど。

あと、Art of なんたらかんたらにも挑戦してみたいです。
771デフォルトの名無しさん:2006/02/07(火) 21:07:31
ええ、あなた程度でも思いつくような事はさすがにやってます^^;;
772デフォルトの名無しさん:2006/02/07(火) 21:46:35
>>770
スレ違い
推薦書スレ行け
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

だそうです。
どんな感じでしょうか?
775デフォルトの名無しさん:2006/02/08(水) 00:58:18
>>774
処理系はオリジナルのyacc?bison?
776デフォルトの名無しさん:2006/02/08(水) 01:03:14
>>775
iBookのFreeBSDにデフォルトで入っているyaccだから、
たぶんオリジナルだと思います。
777デフォルトの名無しさん:2006/02/08(水) 01:09:16
YYSTYPE を #define してないからでしょ。
778デフォルトの名無しさん:2006/02/08(水) 01:15:01
%union{
char *str;
char ch;
}

とかやっているんですが、
それとは別にYYSTYPEも#defineしないとまずいんでしょうか?
779デフォルトの名無しさん:2006/02/08(水) 01:18:56
申し訳ありません。
オプションで -d をつけるのを忘れていましたorz

780デフォルトの名無しさん:2006/02/08(水) 02:48:03
0〜X、0〜Y、0〜Zのような3つのenumがあって、
X,Y,Zの一番大きい値を定義するdefineを書く方法ってないでしょうか?
781デフォルトの名無しさん:2006/02/08(水) 03:10:42
#define MAX(X,Y,Z) ((X>=Y)?((X>=Z)?X:Z):((Y>=Z)?Y:Z))

こんなん?
782デフォルトの名無しさん:2006/02/08(水) 03:17:03
ありません
783デフォルトの名無しさん:2006/02/08(水) 03:36:36
>>780
こういうMAXが欲しいということか?
#define MAX max(max(X, Y), Z)
784デフォルトの名無しさん:2006/02/08(水) 04:14:03
#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'

という順に格納されているのでしょうか?
786デフォルトの名無しさん:2006/02/08(水) 09:03:04
"■"は複数バイト文字だから
char ch;
では扱えなくて、文字列として使用するならば、配列として扱われる。で、合ってます?でしょうか
787デフォルトの名無しさん:2006/02/08(水) 09:13:21
#define MOJI "■" は使い方合ってるんでしょうか?
質問攻めですいません。
788デフォルトの名無しさん:2006/02/08(水) 09:15:45
charと配列とポインタの関係を研究している訳です。。
789デフォルトの名無しさん:2006/02/08(水) 09:48:01
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 変数一つで扱えるかも
知れない(しかしそれに期待して書かれたプログラムは移植性がなくなる)。
790デフォルトの名無しさん:2006/02/08(水) 09:49:04
あ、間違えた。誰か直しておいて。
791デフォルトの名無しさん:2006/02/08(水) 10:04:10
>>789
> 2. シングルクォーテーションで括った文字は char の値となる。

シングルクォーテーションで括った文字定数はintな訳だが
792デフォルトの名無しさん:2006/02/08(水) 10:11:29
>>789さん
本当に有難うございます。とても参考になります。なので、メモに取って絶対忘れないようにしておくつもりです。
以前はよく分からなかったwchar_t 型の使い方まで繋げることができたので、本当に感謝です。
793デフォルトの名無しさん:2006/02/08(水) 10:20:14
我らがロクサス隊は中山としょういちを潰した。次は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ならここの住民全員がロクサス隊に強制入隊!!
794デフォルトの名無しさん:2006/02/08(水) 17:50:48
めちゃめちゃおかしい質問なのですが
THESPOKEってC言語のコンパイラとしてつかえるのですか??
日本語おかしくてすいません。
795デフォルトの名無しさん:2006/02/08(水) 17:57:45
796デフォルトの名無しさん:2006/02/08(水) 18:01:35
>>794
それです
797デフォルトの名無しさん:2006/02/08(水) 18:02:19
みすったwww
>>795さん
それです
798デフォルトの名無しさん:2006/02/08(水) 18:10:24
>>797
>>795のリンク先にも書いてあるがtheSpokeはあくまでMSがやってる学生向けコミュニティを指す。
多分君がイメージしているのはVisual Studio .net 2003 theSpoke Premiumのことだろうと思うのだが。
Visual StudioはMS製のIDE(統合開発環境。要はアプリの開発やソースの管理を支援する便利な代物)で、
勿論C/C++コンパイラも付属している。コンパイラだけ欲しいのなら無料で手に入るけど、
開発を支援するものは何もないので自分でエディタを探したり、Eclips使ったりする必要がある。
799デフォルトの名無しさん:2006/02/08(水) 18:14:12
いみわかんねwww
800デフォルトの名無しさん:2006/02/08(水) 18:15:00
>>798さん
ありがとうございました
801デフォルトの名無しさん:2006/02/08(水) 20:01:34
>791
C++にどっぷり浸かって忘れてるけど、Cではintだっけ?
'0xFFFF'とかも常に有効ってこと?
802デフォルトの名無しさん:2006/02/08(水) 20:08:03
>Cではintだっけ?
その通り
>'0xFFFF'とかも常に有効ってこと?
未定義
803デフォルトの名無しさん:2006/02/08(水) 20:09:59
未規定
804デフォルトの名無しさん:2006/02/08(水) 20:10:37
>>803
ミキティとつなげればいいんだろ?
805デフォルトの名無しさん:2006/02/08(水) 20:19:57
期待できないと?
うまいこと言ったつもりか〜〜〜〜〜!!!!!!11
806デフォルトの名無しさん:2006/02/08(水) 20:27:05
>>805
おまえ、「くそっ、やられた」と思っただろ?
807デフォルトの名無しさん:2006/02/08(水) 20:31:18
処理系定義
808デフォルトの名無しさん:2006/02/08(水) 21:48:23
datファイルの書き換えをしたいのですがfopen(, ,"r+")すれば問題ないのでしょうか?
それともほかに書き換えしやすい命令があるんでしょうか
809デフォルトの名無しさん:2006/02/08(水) 21:53:24
>>801
'\xFFFF'の間違いか?

それでC++に浸かってるなんて、よく言えたものだな
810デフォルトの名無しさん:2006/02/08(水) 22:05:00
フローチャートってどこまで詳しくかけばいいの?
811デフォルトの名無しさん:2006/02/08(水) 22:19:06
>>810
その学校の先生次第。
812デフォルトの名無しさん:2006/02/08(水) 22:53:30
フローチャートはそれを書くことそのものが目的ではないから
その目的にかなうだけ詳しくかけばよい
逆にそれを超えて詳しく書いてはいけない
C言語はまったく関係ないな
813デフォルトの名無しさん:2006/02/08(水) 23:00:54
>>810
まだフローチャートを書いているひとがいるんだ。

フローチャートをどのレベルで書けばよいかは、書いたフローチャートを
利用する次の工程による。
814デフォルトの名無しさん:2006/02/08(水) 23:06:21
フローチャートを高レベルで書くと、

プログラムの開始

メインの処理

終了
815デフォルトの名無しさん:2006/02/08(水) 23:22:25
>>811-814
藻前ら優しすぎ。
「スレ違い」の一言で十分。
816デフォルトの名無しさん:2006/02/08(水) 23:52:19
>>810
脳内イメージとソースとがうまく相互変換できるようになればいいんじゃないのかな、それは君自身の糧になる。
817デフォルトの名無しさん:2006/02/09(木) 00:18:47
フローチャートでいいじゃない。
形を変えたところで大差ないだろう。
それにUMLで図書いたところでその中味はどう書きゃいいのさ、
という問題が残る。
818デフォルトの名無しさん:2006/02/09(木) 00:23:24
けど、フローチャートよりUMLのActivity図の方が良くね?
とゆうか俺がそれで代用してるんだが
819デフォルトの名無しさん:2006/02/09(木) 00:34:49
間を割り込んですいません。ちょっと教えてください。
配列で100個のデータがある(A[100])とすると、
その中から10個のデータを抜き出して
(A[1]〜A[10]の和、A[11]〜A[20]の和など)
和を計算することは可能でしょうか?
820デフォルトの名無しさん:2006/02/09(木) 00:36:10
可能です
821デフォルトの名無しさん:2006/02/09(木) 00:40:26
ちょっと手を貸してもらえないでしょうか?
なにとぞよろしくお願いします。
822デフォルトの名無しさん:2006/02/09(木) 00:42:27
何が解らないのかが、分からない
823デフォルトの名無しさん:2006/02/09(木) 00:43:59
>>822
それをおしえていただきたいのです。
824デフォルトの名無しさん:2006/02/09(木) 00:45:11
いま、
#include<stdio.h>
#include<math.h>

main()
{
int i;
double sumA=0,A[100];

for(i=1; i<=100; i++)
{
sumA+=A[i];
}
}

こんな感じです。うまく抜き出したいのですが・・・
825デフォルトの名無しさん:2006/02/09(木) 00:47:06
・A[100]は初期化されてないから、どんな値が入っているか不明
・この場合、配列はA[0]〜A[99]まで
826810:2006/02/09(木) 00:47:16
実はもうプログラムができていて、発表会のためにフローチャートを書いているんですが
だいたいの感じで書くと、ほとんど四角の箱だけで、中に抽象的な処理を書くだけになってしまいます。
かといってちょっとでも具体的に書くと、量が多くて発表には合わない感じです。
827デフォルトの名無しさん:2006/02/09(木) 00:50:26
>>825
すいませんでした。A[0]〜A[100]には1をどんどん足していく感じで作りたいのです。
その後、10個ずつ抜き出してその10個の和を計算したいのです。
828デフォルトの名無しさん:2006/02/09(木) 00:57:19
>>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);
}

 
 
829819:2006/02/09(木) 01:03:59
>>828
できました!
sumA += A[k * 10 + i];
の一文が書けなくて、困っていました。
とりあえず、数学の計算に応用したかったのです。

本当にありがとうございました!
830デフォルトの名無しさん:2006/02/09(木) 01:05:45
ファイル入出力について質問させてください。

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" にしろ。
832デフォルトの名無しさん:2006/02/09(木) 01:32:38
>>830
10は改行\nと同じ
試しにまっさらなテキストでエンター1回だけ押して保存して見てみろ
0A0DなんだよWINでは
833830:2006/02/09(木) 01:35:08
解決しました!
お早い返答ありがとうございます。
834デフォルトの名無しさん:2006/02/09(木) 01:35:40
ごめんなさい
0D0Aですた(・∀・)
835デフォルトの名無しさん:2006/02/09(木) 01:40:23
Mac は昔から改行が 0d だけらしいな。
で、MS-DOS とか Windows は 0d0a。
UNIXやLinuxは 0a。

但しこの頃は改行コードや文字コードの違いを吸収してしまうエディタとかが
あるのでOSのデフォルトというものは段々なくなっているように思う。

836デフォルトの名無しさん:2006/02/09(木) 06:31:21
アサ○ビールの大五郎って焼酎
味全然付いてね
837デフォルトの名無しさん:2006/02/09(木) 06:32:52
。。。
838726:2006/02/09(木) 14:45:51
>>741
わかりました。まず買った参考書を読破してからソースの美しさについて考えてみます。
>>742
そうなんですか。まぁ1バイト2バイト変わったところで・・・とは思いますけど何万行も書いてると変わってくるかなとも思ったので。心掛け程度なんでしょうか
>>743
ちょっと分からないです。まだ質問するレベルにも達していないようなので勉強します。ありがとうございました。
839デフォルトの名無しさん:2006/02/09(木) 16:09:02
Time-stampってどうやってやんの?
誰か教えて栗!
840デフォルトの名無しさん:2006/02/09(木) 16:11:00
友達になって栗!
841デフォルトの名無しさん:2006/02/09(木) 16:34:57
>>840
鼬害。

>>839
何のタイムスタンプか判らんが、ファイルのタイムスタンプの取得方法なら
標準Cだけでは解決しないので該当環境スレなどへどうぞ。

>>838
メモリ量の問題ではなく、ソースを読んで意味が判るように心掛けるべきでしょう。
842デフォルトの名無しさん:2006/02/09(木) 16:44:41
>>839
文房具屋に行くと売ってるよ。
843デフォルトの名無しさん:2006/02/09(木) 17:33:59
windows.hをインクルードしたヘッダファイル( MyHeader1.h )と
winsock2.hをインクルードしたヘッダファイル( MyHeader2.h )があったとして、

#include "MyHeader1.h"
#include "MyHeader2.h"

なんてやるとコンパイルできません。
winsock2.hを先に、windows.hを後にインクルードできればいいのですが、
ラップされたヘッダーだと解らない場合があります。

このような問題はどのように解決すればいいのでしょうか?
というか、いちいち全部のヘッダみて、どれがwindows.hをインクルードしてるか調べなきゃだめなんでしょうか?
844デフォルトの名無しさん:2006/02/09(木) 17:36:30
書いた順に読み込むんだから当然
845デフォルトの名無しさん:2006/02/09(木) 17:37:10
不安なら全部書いておけ
include重なったって問題ない
846デフォルトの名無しさん:2006/02/09(木) 17:37:39
>>843
> winsock2.hを先に、windows.hを後にインクルードできればいいのですが、

どっちが先でも問題ないはずだが?
847デフォルトの名無しさん:2006/02/09(木) 17:38:55
>>843
#include <winsock2.h>
#include <windows.h>
#include "MyHeader1.h"
#include "MyHeader2.h"
848843:2006/02/09(木) 17:46:21
847氏の見て「なるほど」って思いました。
全部書いておきます。
ありがとうございました。
849デフォルトの名無しさん:2006/02/09(木) 18:22:53
動的に確保された構造体の配列a[n]があり、その構造体のメンバはポインタ*bを持ち、
そのポインタは、動的に確保された別の構造体の配列をさします(この配列は全て異ります)。

この状況で、a[i].bが指している配列を解放したいのですが、うまくいきません。
原因がどうしてもわからないため、動的な構造体の配列の各要素が、それぞれ
別の動的な配列をさしている場合、freeはうまくいかないのではないかと勝手に思っているのですが、
違いますか??勘違いでしょうか。。。・
850デフォルトの名無しさん:2006/02/09(木) 18:32:49
>>849
free()の引数は合ってるか?
851デフォルトの名無しさん:2006/02/09(木) 18:32:53
勘違いです。
852デフォルトの名無しさん:2006/02/09(木) 19:08:22
free(a[i].b)でいいんですよね?for文で片付けているので間違えないんですが・・・。
俺のプログラムがウンコだからっぽいですね。。
ただ、相当な回数繰り返し計算にこの配列を用いているんですが、
freeしなければ正常に動くんです、、、。
853デフォルトの名無しさん:2006/02/09(木) 19:14:40
>>852
>俺のプログラムがウンコだからっぽいですね。。 

いや、「だからっぽい」ではなく「だから」。
854デフォルトの名無しさん:2006/02/09(木) 19:30:44
int 型とdouble型を演算してint型もしくはdouble型の変数に保存する時、
保存先の変数の型にあわせてから計算して、その後保存すればOKですよね?
855デフォルトの名無しさん:2006/02/09(木) 19:31:22
合わせて=キャストして、です。失礼しました。
856デフォルトの名無しさん:2006/02/09(木) 19:48:16
>>849
考えられる例
・動的配列aを解放してから各構造体メンバを解放している
・2回以上同一アドレスに対してfreeした
・処理しているときにメモリ破壊している。freeの時に運良く「上手くいかなかった」
857デフォルトの名無しさん:2006/02/09(木) 19:48:47
別にキャストしなくても勝手に格上げされる
intに入れれば勝手にけつが無くなる
まぁしたほうがいいとは思うけどね
858デフォルトの名無しさん:2006/02/09(木) 20:24:09
>>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を使ってます。

よろしくお願いします。
860デフォルトの名無しさん:2006/02/09(木) 20:35:12
>>852
解放の直後に0を入れてみてうまく動くようなら、二重解放をどこかでしている。
861デフォルトの名無しさん:2006/02/09(木) 20:36:41
>>859
リビルドしても?
862デフォルトの名無しさん:2006/02/09(木) 20:38:55
>>859
2つのファイルでincludeしてそれを共にinckudeしたら
宣言ダブルんだからダメだろそりゃ
include被ってもどうにかなるのは標準のだけだよ
863デフォルトの名無しさん:2006/02/09(木) 20:39:28
まぁNET使ったことないいけどナー
864デフォルトの名無しさん:2006/02/09(木) 20:42:41
>>862
馬鹿?

>>859
どう見てもスレ違いです。
865デフォルトの名無しさん:2006/02/09(木) 20:43:45
インクルードファイルに書けるのは宣言だけ。
866デフォルトの名無しさん:2006/02/09(木) 20:47:46
……というのは、ガセ
867デフォルトの名無しさん:2006/02/09(木) 20:48:03
ここでアンケート
あなたはstdio.hなどのファイルのことをなんと呼びますか?
・ヘッダファイル
・インクルードファイル
・その他
868デフォルトの名無しさん:2006/02/09(木) 20:48:56
>>859
そのヘッダ見せてよ。
869デフォルトの名無しさん:2006/02/09(木) 20:50:07
・ヘッダファイル
870デフォルトの名無しさん:2006/02/09(木) 20:51:22
>>867
おにいちゃんエッチ
871デフォルトの名無しさん:2006/02/09(木) 20:56:21
>>861-866
リビルドしたら、どちらとも無事エラーになってくれました。
Cとは関係ないことですみませんでした。


もうひとつ質問
>>865さんがおっしゃるようにヘッダに「宣言」だけ書いた場合
重複include防止って意味があるんでしょうか?
宣言だけだったら重複していても害はないとあるサイトでは書いてあったんですけど。

重複include防止って具体的にどういう時に役に立つんですか?
872デフォルトの名無しさん:2006/02/09(木) 21:07:21
>>871
関数や変数の宣言は何度あっても問題ないが、
構造体の定義など同じものが複数あっては駄目なものもある。
873デフォルトの名無しさん:2006/02/09(木) 21:08:20
インクルードが循環する時とか。
874デフォルトの名無しさん:2006/02/09(木) 21:10:04
#defineが重複すると警告とかでてうぜー
enumとかtypedefが重複するとエラーになる
875デフォルトの名無しさん:2006/02/09(木) 21:11:01
>>872
そうなんですか。
今、構造体の宣言で実験してみたらエラーになりました。
includeについてスッキリしました。
ありがとうございました。
876デフォルトの名無しさん:2006/02/09(木) 21:13:28
>>873-874
構造体以外に他にもいろいろ問題があるんですね。
いやあ、かなり助かりました。
ありがとうございます。
877デフォルトの名無しさん:2006/02/09(木) 21:22:57
「書けるだけ」っつーか、「書いていいのは」だな。
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@ドコモ
ウイルス送りまくってくれ
880デフォルトの名無しさん:2006/02/09(木) 21:52:30
携帯用のウイルスてCで作れるのか?
Javaじゃないとダメじゃないの?
881デフォルトの名無しさん:2006/02/09(木) 21:57:02
ヘッダファイルの先頭に

#ifndef hoge1_header_file
#define hoge1_header_file
...
#endif

とかもしくは

#pragma once

とかつけてる?
882デフォルトの名無しさん:2006/02/09(木) 22:00:48
携帯なら別にウィルスじゃなくてもメールボムの方が効果でかくねーか?
でかい添付ファイル付きの奴でメールサーバを溢れさせるとか
883デフォルトの名無しさん:2006/02/09(木) 22:53:02
#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
となるか分かりません。どのように展開されてるか
教えてください。
884デフォルトの名無しさん:2006/02/09(木) 22:56:20
>>883
そんなネタはおもろない 出直してきなせい
885デフォルトの名無しさん:2006/02/09(木) 22:58:57
>>883
y=square(++x); 

y=square(x++); 
を試してみろ
886デフォルトの名無しさん:2006/02/09(木) 23:00:24
ああ、副作用か・・・
887デフォルトの名無しさん:2006/02/09(木) 23:01:24
>>883
あっかんべー
888デフォルトの名無しさん:2006/02/09(木) 23:02:18
>>883
これって未定義動作じゃね?
889デフォルトの名無しさん:2006/02/09(木) 23:03:18
++square(x)とかどう?
890883:2006/02/09(木) 23:04:11
y=square(x++);
としたら
x=4
y=4
になりましたが…!?
やっぱ分からないです。
891デフォルトの名無しさん:2006/02/09(木) 23:04:55
x=4;
y=16/square(x);
さてyはいくつ?
892デフォルトの名無しさん:2006/02/09(木) 23:05:13
わからないままでいいよ
893デフォルトの名無しさん:2006/02/09(木) 23:06:51
>>890
それは偶然の産物
いくら注視しても帰納は無理
素直に規格票を入手してそこから演繹を試みなさい
894デフォルトの名無しさん:2006/02/09(木) 23:08:50
{
int x,y;
x=2;
y=(++x)*(++x);
printf("x=%d\n",x);
printf("y=%d\n",y);
return 0;
}

実際、Eオプションでコンパイラに展開させるとこれ。
895デフォルトの名無しさん:2006/02/09(木) 23:11:09
アセンブリよくわからないけど、
かけ算するときに、命令に変数のアドレスそのまま渡してるからじゃない?

こんな感じ。
TASU a
TASU a
KAKELU a a b
896デフォルトの名無しさん:2006/02/09(木) 23:16:13
y=(++x)*(++x);が
括弧さきにやるから、3になって4になるxが。
で4*4=16

x++とした場合は、2*2やってから
3になって4になるxが。みたいね。
897デフォルトの名無しさん:2006/02/09(木) 23:20:23
だから以下は未定義だと何度言ったら分かる
y=(++x)*(++x);
JIS X 3010:2003規格表嫁

P48 6.5
直前の副作用完了点から次の副作用完了点までの間に
式の評価によって一つのオブジェクトに格納された値を変更する
回数は、高々1回でなければならない。さらに、変更前の
値の読み取りは、格納される値を決定するためだけに行われ
なければならない。

今回のでは、副作用完了点から次の副作用完了点の間で
++xが2回有ることから未定義の式文
よってこれが3になろうが5になろうが、画面から猫が飛び出そうが
知ったこっちゃない
898デフォルトの名無しさん:2006/02/09(木) 23:26:36
猫は飛び出さないだろう
899デフォルトの名無しさん:2006/02/09(木) 23:28:58
>>897
引用サンクス。
900デフォルトの名無しさん:2006/02/09(木) 23:30:13
>>898
未定義動作の時に画面から猫が飛び出るという実装がなされた
そんな遊び心満載の処理系があれば可能
901デフォルトの名無しさん:2006/02/09(木) 23:30:18
クララは立つけどね
902デフォルトの名無しさん:2006/02/09(木) 23:30:58
そんなもん読んでるやついるのか?
初めて知った。1万4千8百円だって。
見たこと無い。
903デフォルトの名無しさん:2006/02/09(木) 23:31:07
>>897のこの部分って、何度も何度も引用されてねーか?
つかこれぐらい入門書に書いておけよな
904デフォルトの名無しさん:2006/02/09(木) 23:33:02
未定義って、コンパイラがもっと積極的に教えてくれても
いい気がする今日この頃
905デフォルトの名無しさん:2006/02/09(木) 23:33:07
>>902
高いが手元に置いておいて損はない(勿論ちゃんと読んでの話な)
それに糞見づらいのでいいんなら正規にPDF(スキャンされた画像をPDF化した奴)
を読めるサイトもある。もっとも全文検索や索引は一切無いがな
906デフォルトの名無しさん:2006/02/09(木) 23:34:43
ウォーニングデネー(´A`)
907デフォルトの名無しさん:2006/02/09(木) 23:35:03
>>897
おまえ、他人に理解されることを恐れているのか?
他人に理解してもらいたいなら、和訳しろ。
908デフォルトの名無しさん:2006/02/09(木) 23:35:09
++猫;
909デフォルトの名無しさん:2006/02/09(木) 23:36:15
>>900
#pragma でゲームが起動するってのはあったらしいな。

910デフォルトの名無しさん:2006/02/09(木) 23:41:20
>>907
何が分からんのか言ってみろ
911デフォルトの名無しさん:2006/02/09(木) 23:51:07
>>897
マジに教えて欲しいんだが、なんでそれが 「 未定義 」 なんだ?
y=(++x)*(++x);
一番優先順位の高い演算は、2つある ( ) の中身。 同一優先順位の演算が2つあるから、
結合順位に照らし合わせる。 結果、代入演算子の右辺から評価。
右辺は乗算だから、左の項から評価。
従って、
左の(++x)を評価:xは3に
右の(++x)を評価:xは4に
3と4を掛ける:12
yに代入:yは12に
Cの言語仕様だと、こうなるのではないか? 曖昧(動作が未定義)な点は、無いと思うが・・・
912デフォルトの名無しさん:2006/02/09(木) 23:52:26
>>911
> 右辺は乗算だから、左の項から評価。
ここが間違い。
913デフォルトの名無しさん:2006/02/09(木) 23:55:24
>>911
だから++xが二度出てくることで、xの値を2度更新してる
その式文中に副作用完了点は末尾以外存在しない
よって未定義動作
914デフォルトの名無しさん:2006/02/10(金) 00:00:36
>>911
偉い人たちには曖昧にしか見えなかったんどすえ。
915デフォルトの名無しさん:2006/02/10(金) 00:06:40
>>911
++xを両方先に計算すると、4x4でyは16
曖昧な事極まりない
916デフォルトの名無しさん:2006/02/10(金) 00:06:43
>>912 >>913
演算の優先順位と、評価順序は異なるってことか?
A + B * C は、B の評価結果と C の評価結果を掛けて、それを A の評価結果と合算する、
っていう順位は決まっているけれども、A・B・C の評価順序は、演算の順位とは全く関係なく
不定である、って解釈であってる?
917デフォルトの名無しさん:2006/02/10(金) 00:09:42
>>916
その通り
918デフォルトの名無しさん:2006/02/10(金) 00:10:21
>>916
まぁ1行目は間違ってないな

とりあえずここで問題なのは、隣接する2つの副作用完了点の間で
同一オブジェクトを2度変更していること
よって、演算子の優先順位だの評価順序だのを持ち出すのはナンセンス
んなのは全く関係ない


ちなみに蛇足だが、関数呼び出しの実引数並びの評価順序も未定義
919デフォルトの名無しさん:2006/02/10(金) 00:10:28
>>916
演算子の優先順位は評価済みの各要素を結合する順番。
評価の順序は定義されてない。

こういうこったね。
920デフォルトの名無しさん:2006/02/10(金) 00:11:09
釣られ乙
921デフォルトの名無しさん:2006/02/10(金) 00:12:00
まさかと思ってC FAQみてみたらあるじゃねーか
ttp://www.kouno.jp/home/c_faq/c3.html#2
922デフォルトの名無しさん:2006/02/10(金) 00:15:38
未定義って、定義し忘れでしょ?結局
リッチもまだまだだな
923911 = 916:2006/02/10(金) 00:17:03
>>915
「 両方先に計算すると ・・・ 」
なんだか、直感的にとっても判りやすい表現。 何となく ワカテキタ 希ガス。
924デフォルトの名無しさん:2006/02/10(金) 00:18:15
>>922
そこに実装系の腕の見せ所があるんじゃないかァー
遊び心の分からない人だナー
925デフォルトの名無しさん:2006/02/10(金) 00:18:59
>>922
評価順序を定義しない方が高速なコードを生成できるかもしれないからじゃなかったっけ?
926デフォルトの名無しさん:2006/02/10(金) 00:22:10
それと、それまでに出てたコンパイラにも配慮
927911 = 916:2006/02/10(金) 00:23:26
>>918
> 関数呼び出しの実引数並びの評価順序も未定義
それは、各引数の評価結果をスタックに積む順番はケツから、ってのは決まってるけれども、
その前段階の 「 各引数を評価する順序 」 は未定義ってことだね!
928デフォルトの名無しさん:2006/02/10(金) 00:28:03
そういうこった
929911 = 916:2006/02/10(金) 00:32:43
マジで、スゲー勉強になった。 ほんとにありがとう > レスくれたみんな。
2ch ってクズの集まりだと思ってたけど、なんだ、まともな連中もいるんじゃねーか。
オイラ、泣けてくるゼ。
930デフォルトの名無しさん:2006/02/10(金) 00:33:46
そのクズに教わる気分はどうかね?
931911 = 916:2006/02/10(金) 00:34:55
気分はサイコーでつ。
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;
を省略して記述したような感じに思いますがどうなんでしょう?
お手数ですが教えてください。
933デフォルトの名無しさん:2006/02/10(金) 01:15:55
int i,*p;
934デフォルトの名無しさん:2006/02/10(金) 01:18:49
tagOAMEntry構造体の別名をOAMEntryとした上で
同時にその構造体へのポインタの別名をpOAMEntryとしている
935デフォルトの名無しさん:2006/02/10(金) 01:39:40
>>932
んじゃおまえ typedef int INT, *PINT; はどうなるんだよ。
わかんねえなら入門書読め。
936デフォルトの名無しさん:2006/02/10(金) 01:48:56
入門書にはそこまで書いてないだろ
937932:2006/02/10(金) 01:49:09
>typedef int INT, *PINT;
このような記述ができるということが入門書に書いてなかったので
質問しました。上記の記述方法を知っていたら質問しませんでした。
申し訳ないです。
938デフォルトの名無しさん:2006/02/10(金) 02:08:25
Javaなら副作用があいまいな部分なんてないけどな
副作用が怖いお子様はJavaでもやっていろ
939デフォルトの名無しさん:2006/02/10(金) 02:17:32
>>938
そんなに怖がるなよ、お子様。
940デフォルトの名無しさん:2006/02/10(金) 02:25:12
>>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。
ただ読みやすくするには似たような名前が良いかと思われる。
941940:2006/02/10(金) 02:33:01
>>940
内部で同じ型の変数は使えないかも・・・
942デフォルトの名無しさん:2006/02/10(金) 02:39:56
構造体タグと構造体変数名のこといってるなら名前空間が違うからおk
入れ子structのこといってるならそれはおk
943デフォルトの名無しさん:2006/02/10(金) 02:48:16
>>937
そんなの入門書じゃねえ。捨てろ。
944デフォルトの名無しさん:2006/02/10(金) 02:49:10
>>937
typedef int INT, *PINT; は typedef int INT; typedef int *PINT; を一回で書いただけだ。
945デフォルトの名無しさん:2006/02/10(金) 02:56:46
>>935
入門書にんなこと載ってねぇよバカ
946デフォルトの名無しさん:2006/02/10(金) 02:59:10
なんか今夜は喧嘩が多いな糞野郎
947デフォルトの名無しさん:2006/02/10(金) 09:26:24
副作用が怖いならSchemeでも使ってろボケ
948デフォルトの名無しさん:2006/02/10(金) 09:33:12
そこは Haskell だろ
949デフォルトの名無しさん:2006/02/10(金) 10:00:51
         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
(>Д<)ゝ”イエッサ!!
951デフォルトの名無しさん:2006/02/10(金) 12:52:55
入力バッファを破棄する方法ないですか?
952デフォルトの名無しさん:2006/02/10(金) 12:56:55
>>951
入力バッファを破棄する
953デフォルトの名無しさん:2006/02/10(金) 13:02:50
>>952
どうやってですか?
954951=953:2006/02/10(金) 13:24:42
すいませんどうもAPI関連っぽい話だったみたいなんで
質問取り下げます
955デフォルトの名無しさん:2006/02/10(金) 14:29:23
別にAPIでもなんでも無いんだがな

scanf("%*[^\n]"); これで改行まで読み飛ばし
scanf("%*c"); その後これで改行読み飛ばし
956デフォルトの名無しさん:2006/02/10(金) 14:38:41
FlushConsoleInputBuffer()
使ったほうがキモチイイ
957デフォルトの名無しさん:2006/02/10(金) 14:39:01
>>955
ヘェヘェヘェ(゚∀゚)ノシ!
958デフォルトの名無しさん:2006/02/10(金) 14:41:10
>>955
それってどうゆう使い方をしてるのかkwsk
959デフォルトの名無しさん:2006/02/10(金) 14:44:20
微妙な質問来るとおまえら質問者去ってから正解出す傾向ないか?w
960デフォルトの名無しさん:2006/02/10(金) 14:46:09
>>956
入力バッファを流すと詰まりそうだからそんなAPIは存在自体気持ち悪い
961デフォルトの名無しさん:2006/02/10(金) 14:46:49
それが俺に聞けクオリティ
962デフォルトの名無しさん:2006/02/10(金) 14:49:15
>>960
詰まるってトイレ?
963デフォルトの名無しさん:2006/02/10(金) 15:35:24
fseek(stdin, 0, SEEK_END); って駄目なの?
964デフォルトの名無しさん:2006/02/10(金) 15:40:18
>>962
まあそんな感じ
流してもプログラム側には文字は流れてこないから

# 別なところに流れていってるってのが正しい解釈なんだろうけど
965デフォルトの名無しさん:2006/02/10(金) 15:45:26
>>955
バッファの破棄ってさ・・・直接コンソール入力で使いたいんじゃないか?
それ以外の場合なら破棄しなくてもどうにかなる気がするんだよね
966デフォルトの名無しさん:2006/02/10(金) 15:45:39
>>963
規格では未定義
gccでは何も起こらなかった(クリアされなかった)
MSDNには多分期待した動作が載ってる、調べてないけど
967デフォルトの名無しさん:2006/02/10(金) 16:02:57
>>963
bccだとダメだった
968デフォルトの名無しさん:2006/02/10(金) 16:03:56
>>964
破棄ってぽ〜んと消滅させてくれるんじゃなくて
どっか他のところに流すの?
なんか嫌だなそれ
969デフォルトの名無しさん:2006/02/10(金) 16:12:17
970デフォルトの名無しさん:2006/02/10(金) 16:18:25
標準入出力はfseekで送ったり巻き戻したりできんでしょ。
そんなこんなでgetchみたいな関数が巷で流行してる。
971デフォルトの名無しさん:2006/02/10(金) 16:19:39
本当気持ち悪いな
なんだあの破棄ってAPI・・・
972デフォルトの名無しさん:2006/02/10(金) 16:21:20
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
}


このような書き方をしていいですか?
974デフォルトの名無しさん:2006/02/10(金) 16:25:08
>>973
そのままだと当然、駄目
最初のi=0の時に思いっきり範囲外アクセスしてるから
975デフォルトの名無しさん:2006/02/10(金) 16:26:13
>>973
てか何がしたいんだ
976973:2006/02/10(金) 16:34:32
>>974
了解しました。

>>975
実はプログラム中に誤りを見つけて、条件を付け加えたいのです。
977デフォルトの名無しさん:2006/02/10(金) 16:56:05
>>976
まず、質問の仕方を勉強した方がいい。

# 具体的に、どんな事をしたいのか?
# を聞いているのに>>976は無いだろう。
978973: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]とかのデータを見て処理をするようにしたいです。
979デフォルトの名無しさん:2006/02/10(金) 17:42:16
じゃあ
a[i-1]とかa[i-2]入れちゃえ
ただ実行前にif(i>0)とかi<1で範囲外にアクセスしないようにすりゃいい
980デフォルトの名無しさん:2006/02/10(金) 17:43:12
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] とする */
981デフォルトの名無しさん:2006/02/10(金) 18:31:06
>>932
まだ見てるかな・・・?

> 最後の
> >}OAMEntry,*pOAMEntry;
> 部分がよくわかりません。

struct tagOAMEntry { いろいろ };
typedef tagOAMEntry OAMEntry;
typedef tagOAMEntry *pOAMEntry;

って分割して書くとわかるかな?

突っ込んでる人がいないんだけど、
>>940 は、typedef が消えてて実は同じ意味じゃない。
前者は型のエイリアス、後者は変数宣言。
982デフォルトの名無しさん:2006/02/10(金) 19:22:39
2個前だか3個前だか知らんけど別のバッファに保存しとけば良いだけじゃ?
983デフォルトの名無しさん:2006/02/10(金) 20:07:47
次スレテンプレ
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は専門の別スレッドがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
C言語なら俺に聞け! Part 121
http://pc8.2ch.net/test/read.cgi/tech/1138409094/

次スレがたたない場合の避難所
C言語を語ろう
http://pc8.2ch.net/test/read.cgi/tech/1138718221/
984デフォルトの名無しさん:2006/02/10(金) 20:11:27
もうそんな時期か
立ててみるからまってなー
985デフォルトの名無しさん:2006/02/10(金) 20:14:36
986デフォルトの名無しさん:2006/02/10(金) 20:16:47
乙鰈
987デフォルトの名無しさん:2006/02/11(土) 01:40:58
>>985

ワロタ
988デフォルトの名無しさん:2006/02/11(土) 01:47:15
989デフォルトの名無しさん:2006/02/11(土) 02:23:37
うめぇ!m9っ`・ω・´)
990デフォルトの名無しさん:2006/02/11(土) 07:31:42
不定長の1次元配列を作りたいのですがうまく出来ません。

その配列には要素を加えたり、取り除いたりしたいのですが、、任意の要素を動かすわけではなく、スタックのように一番最後のものだけを加えるか取り除くかすることを想定しています。

最初から固定的な配列をメモリに確保するともともとのサイズ以上の要素を入れたい場合たとえメモリが余っていてもダメです。ちょっとしか要素を使わなかった場合にはメモリがもったいないです。

かと言ってリンクドリスト構造にすると例えば100番目の要素にアクセスするのに100個の要素を辿る必要がありオーバーヘッドが大きいです。

要素を加える時と取り除く時に新たな配列を作り、古い配列の内容を全コピーした後、古い配列を削除するというのも考えたのですが、やはりオーバーヘッドが大きいし、メモリがガベージだらけになってしまうと思います。

どうやればいいのでしょうか?
991デフォルトの名無しさん:2006/02/11(土) 07:35:51
間を取って、配列をリスト状に繋ぐといいよ。
992デフォルトの名無しさん:2006/02/11(土) 08:20:28
スタックとして使うことを想定するんなら、何番目の〜は考えなくてもいいのでは?
993デフォルトの名無しさん:2006/02/11(土) 08:42:16
使用目的によってはそうでもない。
994デフォルトの名無しさん:2006/02/11(土) 09:48:45
>>990
reallocは?
995デフォルトの名無しさん:2006/02/11(土) 09:50:49
|    ヽ
|.´。.  γ
|'; 'ё;゚ソ
|    ノ
|    ヘ、
|  /`\_つ
|∩ 人
|ω、 \
996デフォルトの名無しさん:2006/02/11(土) 09:51:22
|  ヽ
|。.  γ
| 'ё;゚ソ
|  ノ
|  ヘ、
|/`\_つ
|人
| \
997デフォルトの名無しさん:2006/02/11(土) 09:53:09
|  ヽ
|。.  γ
| 'ё;゚ソ
|  ノ
|  
|/`
|人
| \
998デフォルトの名無しさん:2006/02/11(土) 09:53:57
|  ヽ
|。.  γ
| 'ё;゚ソ
|  ノ
|  ヘ、
|/`\_つ ∩
|人 ω
| \
999デフォルトの名無しさん:2006/02/11(土) 09:55:50
|ヽ
|  γ
|ё;゚ソ
|ノ
|ヘ、
|\_つ ∩
| ω
|
1000デフォルトの名無しさん:2006/02/11(土) 10:04:39
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。