C言語なら俺に聞け! Part 121
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/01/28(土) 09:44:54質問する前には最低限検索を。
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/
0002デフォルトの名無しさん
2006/01/28(土) 10:13:200003デフォルトの名無しさん
2006/01/28(土) 10:28:10乙
0004デフォルトの名無しさん
2006/01/28(土) 18:32:470005デフォルトの名無しさん
2006/01/28(土) 18:35:31レルどうも
なにやら話が盛り上がってますね
なにやらってテメーが振った話だろボケが
0006デフォルトの名無しさん
2006/01/28(土) 18:40:37>>5
なんだか血の気が多い人だ
0007デフォルトの名無しさん
2006/01/28(土) 18:48:11答えないけど参考に。
0008デフォルトの名無しさん
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();
}
0009デフォルトの名無しさん
2006/01/28(土) 19:30:200010デフォルトの名無しさん
2006/01/28(土) 19:40:470011デフォルトの名無しさん
2006/01/28(土) 19:52:160012デフォルトの名無しさん
2006/01/28(土) 20:18:110013デフォルトの名無しさん
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;
}
0014デフォルトの名無しさん
2006/01/28(土) 20:27:17お手本よろ
0015デフォルトの名無しさん
2006/01/28(土) 20:28:20お手本よろ
0016デフォルトの名無しさん
2006/01/28(土) 20:29:06釣りか基地外
0017デフォルトの名無しさん
2006/01/28(土) 20:38:13全角スペースが変なところにあるとか?
0018デフォルトの名無しさん
2006/01/28(土) 20:44:19スペース全部消して見たら出来ました!!
やっと起動できるようになりました!
くだらないミスをしてしまい、すいませんでした(;´Д`)
本当にありがとうございました。
0019デフォルトの名無しさん
2006/01/28(土) 20:46:20(1)意味もなくlong
(2)もし意味があってもscanf,printfでint型を指定している
(3)sort部分の比較でif(...){}else{...}となっている。普通に条件式を否定しろ
(4)#includeをしていない。
(5)getchなどという処理系依存の関数の使用
(6)Cのくせに最後にreturn 0;をしていない
以上の点をもってソート如きで悪いソースですが?
0020デフォルトの名無しさん
2006/01/28(土) 20:52:3500218
2006/01/28(土) 20:59:331,2、前回のプログラムからの引用だった為書き換えミス
3、何か間違ってる?
4、省略(>>9参照)
5、結果出力後入力待ちにしている
6 mainがvoidのため不要
0022デフォルトの名無しさん
2006/01/28(土) 21:02:32>6 mainがvoidのため不要
Σ(゚Д゚;エーッ!
0023デフォルトの名無しさん
2006/01/28(土) 21:02:47int main に見えるのだが・・・。
0024デフォルトの名無しさん
2006/01/28(土) 21:03:00>6
mainがvoidのため不要
>int main(void)
(ノ∀`)
002522
2006/01/28(土) 21:03:030026デフォルトの名無しさん
2006/01/28(土) 21:05:14(3) そもそも a[i]>a[j] にすればいい話。
0027デフォルトの名無しさん
2006/01/28(土) 21:05:26>5、結果出力後入力待ちにしている
なんの反論にもなってないが…?
日本語ワカル?
0028デフォルトの名無しさん
2006/01/28(土) 21:06:59(5) のツッコミは無理があると思った。
0029デフォルトの名無しさん
2006/01/28(土) 21:07:08俺は書くけど。
0030デフォルトの名無しさん
2006/01/28(土) 21:21:51それは処理系依存の関数を使う理由にはならないが。
それ以前になんでそんなことしたいんだ?
画面がなくなっちゃうんですぅとかいう間抜けな答えは聞きたくないぞ?
0031デフォルトの名無しさん
2006/01/28(土) 21:43:59落ち着いてひとつにまとめてレスしてくれ
前スレでCを勉強するために書いてるって言ってるし、「処理系に依存」とかそこまで知った事ではない。
getchは解説サイトに、プログラムの流れを途中途中で止める時によく使うし便利とあったから使ってるまで。
まぁ叩かれてるが
俺にとっては書き方があってるかどうか知りたかったからソース乗せたんだし勉強になってるからいいけど。
0032デフォルトの名無しさん
2006/01/28(土) 21:55:260033デフォルトの名無しさん
2006/01/28(土) 21:57:180034デフォルトの名無しさん
2006/01/28(土) 21:58:280035デフォルトの名無しさん
2006/01/28(土) 21:59:500036デフォルトの名無しさん
2006/01/28(土) 22:05:22longの意味がない
returnで返していない
if文の改善
>>19
(3)はelseで否定の条件式は不要
0037デフォルトの名無しさん
2006/01/28(土) 22:08:41intだと処理系で変わってしまう場合あり
まぁ・・・・宿題とか勉強ならどうでもいいけどね
0038デフォルトの名無しさん
2006/01/28(土) 22:10:070039デフォルトの名無しさん
2006/01/28(土) 22:14:140040デフォルトの名無しさん
2006/01/28(土) 22:15:43>longは常にサイズが同じ
>longは常にサイズが同じ
>longは常にサイズが同じ
>longは常にサイズが同じ
0041デフォルトの名無しさん
2006/01/28(土) 22:17:143とか4の指定あたりでおかしいと判断できるけど
0042デフォルトの名無しさん
2006/01/28(土) 22:18:42あれ?間違ってた?
0043デフォルトの名無しさん
2006/01/28(土) 22:20:35�Cは単に2ちゃんには書き込んでないってだけだと思うがw
�Bはどうしようもないけどw
0044デフォルトの名無しさん
2006/01/28(土) 22:23:10例えばPS2(ee-gcc)でのlongは8バイトだぞ
0045デフォルトの名無しさん
2006/01/28(土) 22:23:29え?だから指定するまでもないのにおかしいなって
0046デフォルトの名無しさん
2006/01/28(土) 22:25:30マジで?long4バイトぢゃないの?
つかえねぇ・・・今後全部変数ダブルにしたろか
>>45
あ、そゆことか
0047デフォルトの名無しさん
2006/01/28(土) 22:25:59仕様かこれかと
0048デフォルトの名無しさん
2006/01/28(土) 22:26:48......と、堂々と言える時代に早くなってほしいなぁ。
0049デフォルトの名無しさん
2006/01/28(土) 22:47:37無ければ自分で typedef すりゃいい。
サイズ固定なのにプリミティブ型直接使ってるような奴はクビ。
0050デフォルトの名無しさん
2006/01/28(土) 22:52:480051デフォルトの名無しさん
2006/01/28(土) 23:09:13それ系、指定の方法がわからない(ノ´∀`*)
0052デフォルトの名無しさん
2006/01/28(土) 23:22:374バイトとか8バイト固定したいときってどうすればいいの?
環境はWindows固定ということ前提にすると。
0053デフォルトの名無しさん
2006/01/28(土) 23:25:58getchはconio.hをインクルードしないと使えないけど分かってるのかな
0054デフォルトの名無しさん
2006/01/28(土) 23:27:020055デフォルトの名無しさん
2006/01/28(土) 23:33:01俺のタイプでふv
0056デフォルトの名無しさん
2006/01/28(土) 23:33:14でも、charは1バイトのままなの?
なんか俺の昔の記憶だと
char 1バイト
short 2バイト
long 4バイト
int 環境依存(Win32だと4バイト)
float 4バイト(浮動小数点)
double 8バイト(浮動小数点)
で、注意するのはintだけだったという記憶があるんだけど
実際はそうじゃないってこと?
環境はWindows固定ということで頼む。
0057デフォルトの名無しさん
2006/01/28(土) 23:35:47規格で決まっているのは、各型のバイト数の大小関係と、
sizeof(cahr)が1になると言うこと。
# ちなみに、CHAR_BITS(charのビット数)も環境依存
0058デフォルトの名無しさん
2006/01/28(土) 23:38:18> 環境はWindows固定ということで頼む。
その時点で環境の依存について無視してるだろ、ボケ。
0059デフォルトの名無しさん
2006/01/28(土) 23:41:31いや、とりあえず他の環境はそんなにかわることないし、
大抵Windowsにあわせてくる(移植楽だしね)から、
やっぱり、注目するべきはWindowsでしょ。これは現実の話(別にゴヒイキって話題じゃないよ)
0060デフォルトの名無しさん
2006/01/28(土) 23:42:51おお、そうなんだ。
大小とcharのバイトが1としか決まってないとはしらなんだ・・・。
ありがとう。
もう、こだわらないでプログラムするよ。
0061デフォルトの名無しさん
2006/01/28(土) 23:42:59floatも微妙に曲者
整数型との計算で制度落ちることある
doubleを使うべき
0062デフォルトの名無しさん
2006/01/28(土) 23:43:23> とりあえず他の環境はそんなにかわることないし
変わるから環境依存な訳だし、
そもそも、環境依存で環境を特定してどうするのかと(ry
0063デフォルトの名無しさん
2006/01/28(土) 23:45:19よっぽど使えないテキストで勉強したようだな。
本は複数読んでおけよ。
0064デフォルトの名無しさん
2006/01/28(土) 23:46:01たとえ違う環境で8バイトになっててもメモリ使用量あがるだけだし
intが常に4バイトって勘違いしてるのが問題なんだろ?
環境によってはもっと小さくなることがあるわけだし
0065デフォルトの名無しさん
2006/01/28(土) 23:47:40INT_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かそれ相当を自分で定義しろって結論になるけど
0066デフォルトの名無しさん
2006/01/28(土) 23:48:33> たとえ違う環境で8バイトになっててもメモリ使用量あがるだけだし
> intが常に4バイトって勘違いしてるのが問題なんだろ?
どういう勉強をしたら、こんなアホな発言が出来るんですか?
0067デフォルトの名無しさん
2006/01/28(土) 23:50:010068デフォルトの名無しさん
2006/01/28(土) 23:55:44あほ
0069デフォルトの名無しさん
2006/01/29(日) 00:01:58> intが常に4バイトって勘違いしてるのが問題なんだろ?
違う。
typedefも使わずにサイズに依存したコードを書くことが問題。
0070デフォルトの名無しさん
2006/01/29(日) 00:19:270071デフォルトの名無しさん
2006/01/29(日) 01:18:05int32_t a;
0072デフォルトの名無しさん
2006/01/29(日) 02:13:48アホか。
整数型のサイズを決めてるのはコンパイラであって OS じゃない。
0073デフォルトの名無しさん
2006/01/29(日) 02:20:59マジで?
例えばWin32APIをコンパイルしたとして、
そのコンパイラがlongを8バイトとすればlongは8バイトになっちゃうってこと?
つーことは、俺がlongを4バイトとして組んでたのはあくまでも、
VCのコンパイラ仕様にあわせただけであって、
Windowsに対応したわけではなかったわけ?
あ、そうかも。
そうだな。64BitOSでも
32Bitモードってのがあってこれまで作った奴も動くらしいしねぇ。
これってそういうこといってんのかな?
0074デフォルトの名無しさん
2006/01/29(日) 02:23:030075デフォルトの名無しさん
2006/01/29(日) 02:24:15嫌味はいいから、結論だけいってよw
0076デフォルトの名無しさん
2006/01/29(日) 02:26:010077デフォルトの名無しさん
2006/01/29(日) 02:26:53どうせロートルがたまに自分のわかる話で
自分より知識なさそうなの見つけたからレスつけたんでしょ?
ほら、わかる範囲で語ってきなよw
0078デフォルトの名無しさん
2006/01/29(日) 02:41:21ポインタ、ポインタノポインタ、ポインタノポインタノポインタまで理解はできたけど。
0079デフォルトの名無しさん
2006/01/29(日) 02:48:54あぁもううるさい奴だな。
それぞれの型がどうなるかはコンパイラ依存だと言ってるだろう。
実行ファイルの状態でも型情報が C の形で表現されてる訳が無いだろうが。
全く、こういう奴いたら先ずクビだな。
0080デフォルトの名無しさん
2006/01/29(日) 02:50:20『トリプルポインタは分かるけどクワドルプルポインタは分かりません >< 』
返答
『そんなこと言ってる時点で理解できてないのは明白です』
0081デフォルトの名無しさん
2006/01/29(日) 02:51:32経験上、「理解できた」と軽々しく口にする奴ほど分かってない事が多い。
0082デフォルトの名無しさん
2006/01/29(日) 02:53:54ポインタのポインタはポインタでしかないから、ポインタを正しく理解できているのなら
ポインタのポインタはそんなに難しくないと思う。まして、
ポインタのポインタのポインタはポインタのポインタと解釈できるのだから
ポインタのポインタのポインタのポインタになったところで大したことはない。
必要なら、適宜typedefでもしとけと。
0083デフォルトの名無しさん
2006/01/29(日) 02:58:54経験上この時間帯に二人にレスされることはめったにないから。
明日が休日だからという理由もあるかもしれないが。
とりあえず
「>軽々しく」と軽々しく判断した基準と。
疑うんなら力試しにでもなるような問題作れるなら出してみてよ
0084デフォルトの名無しさん
2006/01/29(日) 03:01:54と言いたいわけで
理解できてるなら使いこなせる、か。
0085デフォルトの名無しさん
2006/01/29(日) 03:07:31大丈夫、しばしばこの板で>80みたいなことを書いている漏れは、ここ最近のこのスレでは>82しか書いてないから。
0086デフォルトの名無しさん
2006/01/29(日) 03:07:44>「>軽々しく」と軽々しく判断した基準
読んだだけで理解できたとか言ってる所だろw
0087デフォルトの名無しさん
2006/01/29(日) 03:09:06ポインタは絵で理解するといいよ
0088デフォルトの名無しさん
2006/01/29(日) 03:14:34本を熟読して、本についている絵をガンミしながら、頭の中フル回転で、さらに自分で試しながらコンパイルして、ポインタを理解したつもりだけど〜
って書けばよかったね。
0089デフォルトの名無しさん
2006/01/29(日) 03:16:28実際にプログラムにポインタを組み込む事はあるの?
0090デフォルトの名無しさん
2006/01/29(日) 03:17:540091デフォルトの名無しさん
2006/01/29(日) 03:18:260092デフォルトの名無しさん
2006/01/29(日) 03:18:31そこまで書けば、信用しなくもないが、
ポインタのポインタのポインタのポインタのポインタが何かくらいは分かるよな?
0093デフォルトの名無しさん
2006/01/29(日) 03:21:520094デフォルトの名無しさん
2006/01/29(日) 03:23:360095!88
2006/01/29(日) 03:26:02ポインタ
どんなに修飾しようがただのポインタ。それ以上でもそれ以下でもない
(この文章を論理的に考えると空集合になるのは気づいても言ってはいけない)
0096デフォルトの名無しさん
2006/01/29(日) 03:26:14うはw漏れ頭いいww
0097デフォルトの名無しさん
2006/01/29(日) 03:29:060098デフォルトの名無しさん
2006/01/29(日) 03:30:35よろしい。
んじゃ、次。
x, y を引数に取り、sqrt(x*x+y*y) と atan2(y, x) を返す関数を作れ。
ただし、構造体とグローバル変数は使わないこと。
x == 0 && y == 0 の場合は考慮しなくていい。
0099デフォルトの名無しさん
2006/01/29(日) 03:34:49関数に仕様は?計算値はどうやって返すんだい?
0100デフォルトの名無しさん
2006/01/29(日) 03:35:42ポインタ以前に言ってる意味が分かりません
sprtは平方根か何かだと思うけど・・atan2とか知らない
0101デフォルトの名無しさん
2006/01/29(日) 03:43:55ポインタの問題なんだから・・・。
>>100
別に知らなくてもそのまま書けばいいだけだし、
何の関数かくらい調べられるはずだ。
0102デフォルトの名無しさん
2006/01/29(日) 03:44:48double func( double x, double y )
{
return sqrt(x*x+y*y) + atan2(y, x);
}
>>98の文章の内容に一致する正解だと思うw
0103デフォルトの名無しさん
2006/01/29(日) 03:47:15atan2はarctan。tanの逆関数。tan(θ)=y/x <=> θ=atan2(y, x)。
0104デフォルトの名無しさん
2006/01/29(日) 03:48:07全然一致してない。死ね。
0105デフォルトの名無しさん
2006/01/29(日) 03:49:440106デフォルトの名無しさん
2006/01/29(日) 03:50:56atan関数がtanの逆関数
atan2は引数がxとyがあり、y/xのアークタンジェントを返す
xのアークタンジェントとは違う
0107デフォルトの名無しさん
2006/01/29(日) 03:53:04日本語出来ない人?
完全に一致してると思うが?
因みに”返す”なんだからリターンだろ
ポインタ渡しは、返すとは言わないよな?
0108デフォルトの名無しさん
2006/01/29(日) 03:53:490109デフォルトの名無しさん
2006/01/29(日) 03:54:12atan2が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);
}
0110デフォルトの名無しさん
2006/01/29(日) 03:54:39どういったプログラムなのかも分からない
ただ>>102を見たからかもしれないけど
void a(float x, float y)
{
return sqrt(x*x;y*y),atan2(x;y);
}
で>>105の様になるよね?
けどポインタをどこで使えばいいのかも分からないし、基本自体が意味不明
0111デフォルトの名無しさん
2006/01/29(日) 03:55:390112デフォルトの名無しさん
2006/01/29(日) 03:56:58それはダメすぎだろう。一眠りしておいで。
0113デフォルトの名無しさん
2006/01/29(日) 03:57:570114デフォルトの名無しさん
2006/01/29(日) 03:58:56それともfloat→doubleにしないといけないの?
0115デフォルトの名無しさん
2006/01/29(日) 04:00:16仕様が文章である限り、プログラム以前の問題が多いなw
言いたい事は
sqrt(x*x+y*y) と atan2(y, x) の値を取得出切る関数じゃないの?w
0116デフォルトの名無しさん
2006/01/29(日) 04:01:28sqrt(x*x+y*y) と atan2(y, x) を返せと言ったのに、
足した値を返してどうする。
アホか。死ね。
>>108
標準関数じゃないからこのスレでは御法度。
C99 ならあるけど、C99 は普及率低杉なので。
>>110
void で return 使ってどうやって値を返すのか。
しかも 2 つもの値を。
>>109
それであってるが、あんた >>88 じゃないよな?
というか、>>88 のレスはどれだ?
0117デフォルトの名無しさん
2006/01/29(日) 04:03:170118デフォルトの名無しさん
2006/01/29(日) 04:05:33限りなく言いたい事を組んだ関
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;
}
0119デフォルトの名無しさん
2006/01/29(日) 04:08:05float 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)
}
0120デフォルトの名無しさん
2006/01/29(日) 04:08:29”sqrt(x*x+y*y) と atan2(y, x) を返せ”
それを個別だとも、足してはいけないとも記述は一切ないが?
そのさ…、自分の中の当り前って感覚をどうに出来ない?w
ドキュメントとか作れない人だろw
0121デフォルトの名無しさん
2006/01/29(日) 04:09:29命名規則には立ち入るべからず。
_ + (大文字 or _) から始まるのなら話は別だが。
>>118-119
はいはい、ワロスワロス。
>>120
Kusakabe みたいなこと言うなよ。
0122デフォルトの名無しさん
2006/01/29(日) 04:10:29198とかのソース見た時点でわけわかめなのに分かるわけない。
0123デフォルトの名無しさん
2006/01/29(日) 04:11:35確かに、それも文章通りの正解だw
感服した
0124デフォルトの名無しさん
2006/01/29(日) 04:15:06当り前の普通の様に言ってるレス主は98?
通常の仕事では、文章で説明なんて当然。
それが、あやふやなのに、その態度は頂けない。
つーか、仕事出来ないだろw
0125デフォルトの名無しさん
2006/01/29(日) 04:20:050126デフォルトの名無しさん
2006/01/29(日) 04:23:170127デフォルトの名無しさん
2006/01/29(日) 04:24:29そこを考えるのも問題のうち。
というか、先ず前提として「ポインタの問題」ってのがあるのに、
ポインタ使わない答えが「文章通り」とかあり得ない。
逆に言えば、ポインタ使ってるなら、
足したの返すのは論外としても、
>>118-119 みたいな仕様でも正解と見なす。
問題があやふやな分、そこは寛容にいくよ。
0128デフォルトの名無しさん
2006/01/29(日) 04:26:16今後の身の振り方を考えるかもなw
0129デフォルトの名無しさん
2006/01/29(日) 04:28:0988は119なわけだけど正解なんだ、やった・・
ポインタをどこでどう使えばいいのかも分からない(知識の問題で)からどうしようもない
0130デフォルトの名無しさん
2006/01/29(日) 04:28:24いや、待て118-119はポインタ使ってないw
0131130
2006/01/29(日) 04:29:410132デフォルトの名無しさん
2006/01/29(日) 04:30:12>ポインタ使わない答えが「文章通り」とかあり得ない。
それが自分の中の当り前を決め付けで、説明をしないで仕事を進める駄目人間の特徴。
お前さん、仕事できないタイプだねw
>足したの返すのは論外としても、
足しても>>98の何処にも引っかからないが?
引っかかるのは、アンタの当り前だろw
>逆に言えば、ポインタ使ってるなら、
>足したの返すのは論外としても、
>>>118-119 みたいな仕様でも正解と見なす。
118と119のどこがポインタを使ってるか説明を求めるw
0133デフォルトの名無しさん
2006/01/29(日) 04:30:46いや、不正解だって・・・。
ポインタ使ってないっしょ。
0134デフォルトの名無しさん
2006/01/29(日) 04:32:36(もしも)ポインタを使ってるなら(現実は違うけど)正解と書いてますから
残念ながら不正解ということですね。
うむ、構文解析を俺も一回ミスって>>118-119が正解と読み間違えた
0135デフォルトの名無しさん
2006/01/29(日) 04:33:00>それが自分の中の当り前を決め付けで
流れ読めよ・・・。
>足しても>>98の何処にも引っかからないが?
a と b を返せと言われて a + b を返す奴がいたら
気が狂ってるとしか思えない。
>118と119のどこがポインタを使ってるか説明を求めるw
・・・。
0136デフォルトの名無しさん
2006/01/29(日) 04:33:59>そこを考えるのも問題のうち。
>というか、先ず前提として「ポインタの問題」ってのがあるのに、
大いなる矛盾だなw
ポインタを使って返そうとかいったらネタバレ
なのに
先ず前提として「ポインタの問題」
なのか…
ww
0137デフォルトの名無しさん
2006/01/29(日) 04:35:14ドツボにハマってるなお前・・・。
0138デフォルトの名無しさん
2006/01/29(日) 04:37:12a と b を返せとしか書かない奴がいたら
気が狂ってるとしか思えない。
aとbが分けられないだけで
a + b でも a と b を返しているだろw
0139デフォルトの名無しさん
2006/01/29(日) 04:37:53たぶん、どこでポインタを使うかを考える問題なんじゃない。
少なくとも正解がわかれば、ポインタがなぜ必要かが分かるのだからね。
まとめ ポインタの使い道
複数の返り値を返せない貧弱言語のCの欠陥を誤魔化すのに使える。
あとは動的なデータ構造を構成したいときとかだな
0140デフォルトの名無しさん
2006/01/29(日) 04:38:040141デフォルトの名無しさん
2006/01/29(日) 04:39:50まとめ乙。
そういうこと。
0142デフォルトの名無しさん
2006/01/29(日) 04:40:07float 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・・?
0143デフォルトの名無しさん
2006/01/29(日) 04:41:34Null Pointer Exception (言語違うけど)
0144デフォルトの名無しさん
2006/01/29(日) 04:41:53ダメ。
x や y を 0 (ヌルポインタ)で初期化してるのに
*x や *y に代入しちゃダメ。
0145デフォルトの名無しさん
2006/01/29(日) 04:43:420146デフォルトの名無しさん
2006/01/29(日) 04:43:53が関数のポインタ渡しの解答、と言えるのも
>>98と>>132の言い分があるからだねw
ばっかじゃねーのw
文章がしっかり書けないのに
流れとか、それらしい言い訳を後から言うからだ
ほんとに、仕事出来ない人間だろ
0147デフォルトの名無しさん
2006/01/29(日) 04:46:04>>139 が出題者の意図を最大限に酌んだ解説だから、
読んどくように。
>>146
はいはい、ワロスワロス。
0148デフォルトの名無しさん
2006/01/29(日) 04:48:16これを仕事で当てはめられる
”出題者”と同義の立場の人は、主に仕事が出来ないと言われますw
0149デフォルトの名無しさん
2006/01/29(日) 04:50:25ほほぅ・・。
0150デフォルトの名無しさん
2006/01/29(日) 04:51:51float 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
から、これが関数のポインタ渡し
と言えてしまうのか……
0151デフォルトの名無しさん
2006/01/29(日) 04:52:38間違いが無いことを要求する「仕事」を
同列で語ってる奴テライタス
0152デフォルトの名無しさん
2006/01/29(日) 04:55:19間違いが無いことを要求するものだが…
間違っても考えれば良いってか?
日本、馬鹿量産だな……
0153デフォルトの名無しさん
2006/01/29(日) 04:56:57言い訳が、”考え方を言ったんだよ”
って言い訳してる、使えない奴だなw
0154デフォルトの名無しさん
2006/01/29(日) 05:00:36誘導していくつもりだったのに
横から答えられたからこうなったんだよw
まあ、間違えてもいいから考えて、
そして正解にたどり着けば、
単に正解を教えるだけの場合より
理解が深まるというものなのだ。
0155デフォルトの名無しさん
2006/01/29(日) 05:04:13>誘導していくつもりだったのに
と、考える為の文章が拙いのは意味が違うと思うが?
分からなければ”文章を変更しつつ”
誘導していくつもりだったのに
じゃないの?w
0156デフォルトの名無しさん
2006/01/29(日) 05:10:01はぁ・・・。
お前、どうしようもない奴だな。
これは「ポインタを理解してる」かどうかの試金石となる問題なんだから、
先ずかなりぼやかしてでも意図が酌めるかどうか確認しただけだ。
「ポインタを理解してる」ならあの文章で十分意図は酌めるし、
実際そういう人がいる。
あんた、ダメダメだ。
もう相手にしないよ。
0157デフォルトの名無しさん
2006/01/29(日) 05:11:59文章能力に欠如があるのは一目瞭然なんだが…
0158デフォルトの名無しさん
2006/01/29(日) 05:14:34>実際そういう人がいる。
これを前提に物事を語る奴が、問題を引き起こすんだよw
実際そういう人がいる。
あんた、ダメダメだ。
もう相手にしないよ。
0159デフォルトの名無しさん
2006/01/29(日) 05:18:29誰の事か分るだろ
こう言ってるのと同義って事かなww
で、お互いが相手を”究極の馬鹿”と思うわけだ
文章は正しく書こうなw
0160デフォルトの名無しさん
2006/01/29(日) 05:23:54>実際そういう人がいる。
この姿勢を散々指摘されてるのを自覚してないんだ……
友達同士の雑談ならともかく、どんな場面(学校、会社)だとうろNGだろ
まして、教えるって場合はなお更だ
0161デフォルトの名無しさん
2006/01/29(日) 05:46:12w の無い人は w のある人とは別人? 自演じゃないよね?
とりあえず、>>78 から一言一句逃さず全部読んで理解しろ。特に >>83 。
力試しとか試金石とかそういうところ全部読み飛ばされても、
困るとしか言いようが無い。
正直な所、流れも把握してないやつまで理解させる気はないよ。
流れも把握してないのに勝手に横レスして訳分からんとか、ふざけてるのかと。
0162デフォルトの名無しさん
2006/01/29(日) 06:00:44話の流れが無いと成立しな文章を書く事が指摘されるのは
まったくの別問題だと思う……
なんども言うが、
話の流れがあるからって略しても良い部分と悪い部分があり
アンタは略してはいけない部分を略したって事だよ
話の流れがあるからって、問題の内容自体を略しちゃいけないだろ
例えば、食べ物の話をしてて
”悪い物ってなんだ?”
って質問に、
”殺人”
と答えたら、
話の流れを理解してない食べ物に関して悪い事だよ
って言い出すような奴は、ほぼ他人とコミュニケーションが上手く出来ない
0163デフォルトの名無しさん
2006/01/29(日) 06:05:27いや、どう考えてもその場合は後者のコミュニケーション能力不足だろw
文脈からの推論くらいしろよ。
0164デフォルトの名無しさん
2006/01/29(日) 06:06:04じゃあ、そう言う奴にはレスを返すなよ
見苦しいよ、お前
0165デフォルトの名無しさん
2006/01/29(日) 06:10:26コミュニケーション能力不足と言うのであって
文章の意味、内容的に合っている解答なのに
文章製作者の勝手な前提を汲めない事を
コミュニケーション能力不足とは言わない
0166デフォルトの名無しさん
2006/01/29(日) 06:11:38数学のテストでそんなに親切な指定があるか?
この公式を使えだの、こういう道筋で解きなさいだの。
普通は無いだろ。
そういうのを「知っているか」「理解してるか」「思いつくか」を見るものだし、
出題範囲って前提条件も酌んで答える事も要求されるだろ。
それがテストってもんだ。
隠した仕様があるのは、その仕様が定石で、
その仕様を答えさせることも問題の一部だったから。
それはもう >>127 で言ってる話だ。
0167デフォルトの名無しさん
2006/01/29(日) 06:14:16その理屈が成り立つなら
ヒューザーの小嶋社長が、国会や住民説明会で言ってる意味不明な内容も
流れを理解してない国民のコミュニケーション能力不足なのか……
0168デフォルトの名無しさん
2006/01/29(日) 06:16:56状況違いすぎるだろw
0169デフォルトの名無しさん
2006/01/29(日) 06:17:04>この公式を使えだの、こういう道筋で解きなさいだの。
>普通は無いだろ。
>そういうのを「知っているか」「理解してるか」「思いつくか」を見るものだし、
>出題範囲って前提条件も酌んで答える事も要求されるだろ。
>それがテストってもんだ。
馬鹿確定?
数学のテストは、他に答え様が無いように設問される。
当然、文章問題もな。
それで、文章、内容ともにあってるなら正解なる。
で、あとで設問者がこってり絞られるんだよw
0170デフォルトの名無しさん
2006/01/29(日) 06:20:22数学の問題を解いた事ないのは判った
0171デフォルトの名無しさん
2006/01/29(日) 06:24:35>その仕様を答えさせることも問題の一部だったから。
>それはもう >>127 で言ってる話だ。
ポインタ渡しを隠す為に、
”返す”と不適切な言葉を使うのは
値を得る方法と言って濁したりする事とは
まったく別の問題だと思う
百歩譲って、あんたの理屈が成り立っても
あんたの文章が、あんたの理屈道理じゃ無いんだから
文章能力が無いのを認めなよ…
0172デフォルトの名無しさん
2006/01/29(日) 06:29:52足算で全部解いても、正解を貰ったよけどね
今の授業が掛け算を教えてるとか
流れを読めとか先生は言わなかったぞw
以下、中高大でも同じ
それがテスト設問者の能力だろ
で、それがテストってもんだw
0173デフォルトの名無しさん
2006/01/29(日) 06:32:15数学のテストの答えなんて、
出題範囲超えればいくらでもバリエーションがあるし、
出題範囲内でも色々解法があることも多い。
エレガントな解法もあれば、愚鈍な解法もある。
最終的な答えが1つでないこともある。
例を上げさせるような問題の場合はな。
日本じゃ滅多にないだろうが。
この問題の曖昧さは、>>127 の事情がある以上、ある程度は避けられない。
だから、その曖昧さの範囲内であれば一応正解とせざるを得ない。
でも、その答えにはエレガントなものもあれば、愚鈍なものもある。
だから、愚鈍な解法を提示されれば、一応それでもできるけど、
もっといい方法がある・・・とヒントを出しつつ誘導していくわけだ。
普通のテストと違うのは、質問を限定的に受け付けられるってこった。
>>171
「計算結果は、第3、4引数からポインタを介して返される」
どっかおかしいか?
0174デフォルトの名無しさん
2006/01/29(日) 06:33:21”この公式を使えだの、こういう道筋で解きなさいだの”
を言わずに、それを使わざるを得ない問題を出せないレベルの設問者って事でFA?
0175デフォルトの名無しさん
2006/01/29(日) 06:34:48じゃあ、お前が問題作れよ。10分で。
あんまり長いといなくなるかもしれないぞ?
0176デフォルトの名無しさん
2006/01/29(日) 06:35:35初 め て 提 示 さ れ た 内 容 で す
初 め て 提 示 さ れ た 内 容 で す
初 め て 提 示 さ れ た 内 容 で す
三回言っちゃたよw
0177デフォルトの名無しさん
2006/01/29(日) 06:36:42「返す」という言葉がおかしいかどうか聞いてるだけだ。
0178デフォルトの名無しさん
2006/01/29(日) 06:37:59ただし、構造体とグローバル変数は使わないこと。
関数の戻り値はvoid型とすること。
x == 0 && y == 0 の場合は考慮しなくていい。
0179デフォルトの名無しさん
2006/01/29(日) 06:38:49うん。戻り値の型が void だってのは言った方が良かったね。
それは認める。
0180デフォルトの名無しさん
2006/01/29(日) 06:40:41”返す”とは言わないだろw
0181デフォルトの名無しさん
2006/01/29(日) 06:41:43http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpwinui/html/_win32_getclientrect.asp
0182デフォルトの名無しさん
2006/01/29(日) 06:45:20憂さ晴らしコバンザメプログラマー住人の揚げ足取りと
教えてあげる君教師ヅラの逆切れ持論全開の全面戦争勃発か。
お前らキモイよ
0183デフォルトの名無しさん
2006/01/29(日) 06:45:31それをあっさり認めたにも関らず、今までの指摘を認めない件について
0184デフォルトの名無しさん
2006/01/29(日) 06:48:08ウィンドウのクライアント領域の左上端と右下端の座標を返します。座標は、クライアント座標で返されます。
lpRect
RECT 構造体へのポインタを指定します。この構造体にクライアント領域の座標が格納されます。left メンバと top メンバは 0 になります。right メンバと bottom メンバは、クライアント領域の幅と高さになります。
戻り値
関数が成功すると、0 以外の値が返ります。
関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、GetLastError 関数を使います。
関数の説明と戻り値には”返す”とあるが、引数には一切”返す”と使われないww
0185デフォルトの名無しさん
2006/01/29(日) 06:50:06再提示を求めてたんじゃなくて、新しく問題を作る事を想定してたけど。
今までの議論を踏まえて考えられるんだから、
そりゃ再提示くらいならすぐできるわさ。
>>184
つまらん揚げ足取りだな。
それに、その論理なら >>98 には問題がない事になる。
0186デフォルトの名無しさん
2006/01/29(日) 06:52:01取得とか格納されます
だよな、普通は
”lpRectを介して”ウィンドウのクライアント領域の左上端と右下端の座標を返します。
なんて書かれてるならともかく…
0187デフォルトの名無しさん
2006/01/29(日) 06:55:58もう疲れた。
もういいよ。あとは好きに遊んでて。
0188デフォルトの名無しさん
2006/01/29(日) 06:56:07…お前…つまらん揚げ足取りじゃなくて
ポインタの重要なニュアンスだぞ?
日本語的にも、関数説明の”返す”と戻り値説明の”返す”はまったく意味が違うだろ
「計算結果は、第3、4引数からポインタを介して返される」
これは、どう見ても
戻り値説明で使われてる”返す”を、関数説明で使われる”返す”と混同してる文章だw
0189デフォルトの名無しさん
2006/01/29(日) 06:59:30馬鹿翻訳したものを自論の根拠に提示してる時点で
”…もしかして…ポインタを詳しく知らない?”
ってレベルかも?
0190デフォルトの名無しさん
2006/01/29(日) 07:08:41The 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
019188
2006/01/29(日) 07:10:150192デフォルトの名無しさん
2006/01/29(日) 07:19:47真っ赤になって、鼻の穴膨らまして
反論の文章を練ってるんだよw
0193デフォルトの名無しさん
2006/01/29(日) 07:26:29人に教える能力はゼロだよ。
とりあえず88はこんなセンパイに出会ったら適当にあしらって相手にしないが吉だね。
引数arrとnを取り、arrに大きさnのint配列として利用できる領域を確保し、
その成否を返す(失敗=0、成功=非0)関数を作れ
とか言ってみる。
0194デフォルトの名無しさん
2006/01/29(日) 07:43:20{
if( !arr && n > 0 ) {
arr = (int*)malloc( sizeof(int) * n );
if( arr ) {
memset( arr, 0, sizeof(int) * n );
return 1;
}
}
return 0;
}
0195デフォルトの名無しさん
2006/01/29(日) 07:52:58(2) ではそれを使用するコードを作れ
(3) (1)(2)でキャストを使用している場合、キャストの不要な形で作り直せ。
「キャストを使用している」は、引数渡しでキャストしている部分を含む。
ただしmallocの戻り値を格納するときに使用しているキャストはそのままでよい。
0196デフォルトの名無しさん
2006/01/29(日) 08:03:46int 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;
}
0197デフォルトの名無しさん
2006/01/29(日) 08:11:20それ、おちるよ。
0198デフォルトの名無しさん
2006/01/29(日) 08:20:49http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1567.txt
0199デフォルトの名無しさん
2006/01/29(日) 08:23:580200デフォルトの名無しさん
2006/01/29(日) 08:24:49int 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;
}
0201デフォルトの名無しさん
2006/01/29(日) 08:44:240202デフォルトの名無しさん
2006/01/29(日) 09:52:28「L」を付ける意味はなんですか?
どんな効果なのかを教えてください。
0203デフォルトの名無しさん
2006/01/29(日) 10:01:030204デフォルトの名無しさん
2006/01/29(日) 10:02:49ロング型にキャストした整数なんですね。解答ありがとうございました!!
0205デフォルトの名無しさん
2006/01/29(日) 10:17:00違う。
「long型の整数リテラル」と言う事。
0206デフォルトの名無しさん
2006/01/29(日) 10:29:47整数リテラルなのですか。何度も解答すいません。ありがとうございます!!
0207デフォルトの名無しさん
2006/01/29(日) 10:36:31言いたい事は解るが、その文章だと、回答は以下になる。
double *fnc( double x, double y )
{
static double ans[2];
ans[0] = sqrt( x*x+y*y );
ans[1] = atan2( y, x );
return ans;
}
0208デフォルトの名無しさん
2006/01/29(日) 10:39:15接尾子でググルといい。
0209デフォルトの名無しさん
2006/01/29(日) 10:50:59親切に有難う御座います・゚・(つД`)・゚・ サイトを見て回りたいと思います。
0210デフォルトの名無しさん
2006/01/29(日) 10:58:03早く寝て損した
0211デフォルトの名無しさん
2006/01/29(日) 14:44:04sexmanual.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]);
}
0212デフォルトの名無しさん
2006/01/29(日) 15:09:23> 質問です。このプログラムで「いやん あはん やめてぇ〜」を
> sexmanual.txtから読み込みたいのですが、想定以上にいやがられます。
童貞捨てて経験積めば嫌がられなくなると思うよ。
あと全角スペースが入ってるのはなんで?
0213デフォルトの名無しさん
2006/01/29(日) 15:17:45ワロタwww早く童貞が捨てられるよう頑張ってみますw
上は打ち間違えました。
「いやん あはん やめてぇ〜」を「いやん,あはん,やめてぇ〜」に読み替えてください。
それにしてもやはり私が童貞だから・・・orz。
0214デフォルトの名無しさん
2006/01/29(日) 15:19:260215デフォルトの名無しさん
2006/01/29(日) 15:20:22test[1] とかに読み込もうとしてるからだね。
test[1] には "いやん" のアドレスが入ってるわけだが、
ここに書き込もうとすることは、
文字列リテラルの置いてある領域に書き込もうとしてることになる。
文字列リテラルの置いてある領域には普通書き込めず、エラーになる。
まあ、環境によっては書き込める場合もあるけど、
だからといってこんな事はやっちゃだめ。
0216デフォルトの名無しさん
2006/01/29(日) 15:26:540217デフォルトの名無しさん
2006/01/29(日) 15:29:14レスありがとうございます。
えっとsave()はtest[]でやってもいいけどload()ではtest[]を使うと
文字を入れてある領域に不正がでるから違う変数で読み込ませてそれをtest[]に
コピーすればいいってことですか?C言語はむつかしいですね。
0218デフォルトの名無しさん
2006/01/29(日) 15:32:08違う
0219デフォルトの名無しさん
2006/01/29(日) 15:32:35十分なバッファが確保されているchar型配列へのアドレスだよ
0220デフォルトの名無しさん
2006/01/29(日) 15:37:58本当に感謝します。ありがとうございました。m(- -) m
0221デフォルトの名無しさん
2006/01/29(日) 15:41:380222デフォルトの名無しさん
2006/01/29(日) 17:36:32/* 直行座標から極座標に変換(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;
}
0223デフォルトの名無しさん
2006/01/29(日) 17:44:00int i;
int a;
for (i=0;i<100;i++){
if (d[i] == 0xb1){
a=i;
}
}
とやって、ある特定のデータがきたらそこの配列の番号をしりたいのですが
うまくいきません。
どうすればいいでしょう?
0224デフォルトの名無しさん
2006/01/29(日) 17:47:45ソースがそれだけじゃわからん
0225デフォルトの名無しさん
2006/01/29(日) 17:48:27特定のデータがfreadで全く読み込まれてないから、一回もaが変わらず(エラーになる)。
int長は環境にもよるから、unsigned char d[100]で100バイト読み込みましょう。
0226デフォルトの名無しさん
2006/01/29(日) 17:57:44とかやってんなら、FILEからsizeof(int)=(32ビットPCだとだいたい4、環境依存)バイトずつだとか読み込まれるから。
さらにx86とかだとリトリエンディアンになるからry
全部int型で書き込んだファイルをそう読みたいんなら他のところが違うんだろう。
0228211
2006/01/29(日) 18:27:36#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);
}
0229211
2006/01/29(日) 18:28:14すぐに気がついたのですが、皆さんの好意を無駄にしたくないと思って入門書の配列とポインタのところや皆さんの
アドバイスを何度も読み直してさきほどようやく原因を究明してコードを完成させました。
これでようやく私の作りたいものができそうです。改めてありがとうございました。
0230デフォルトの名無しさん
2006/01/29(日) 20:13:21FILE *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]と等価なのである
しかしそのコードではポインタのポインタを引数として与えているので我輩の脳内コンパイラではエラーが起こるであろう
0231デフォルトの名無しさん
2006/01/29(日) 20:57:070232質問
2006/01/29(日) 20:59:32自動的にこちらの指定したlispのコードを実行させるようにしたいのですが、
どうすればいいでしょうか?
0233デフォルトの名無しさん
2006/01/29(日) 21:10:07ポインタのポインタじゃなくて、配列へのポインタ。
アドレスは一緒なんで、動作的には問題は起こらない。
>>232
CommonLisp スレで聞け。
0234デフォルトの名無しさん
2006/01/29(日) 21:11:33char t[100]
scanf("%s",&t);ってscanf("%s",&t[0]);
ってやってるって認識される訳か
0235232
2006/01/29(日) 21:12:58lispスレでは、スレ違いと言われました。
実行時に、ユーザ指定のコードを実行させるようにする方法は、
わかんないでしょうか?
0236デフォルトの名無しさん
2006/01/29(日) 21:27:25違う。&t は &t だ。
型は int (*)[100] になる。
&t[0] の型は int * 。
>>235
スレ違いと言ってる人もいれば、
答えてる人もいるような感じだなぁ。
俺は Lisp スレでスレ違いではないと思うが
(GCL 固有のスレがあるわけでもないし)、
とりあえずマニュアル精読しろって言われてるんじゃないのかな?
0237デフォルトの名無しさん
2006/01/29(日) 21:32:43だから
char lpStr[128];と唱えて
fscanf(stdin,"%s",&lpStr);
ってのは不味くない?
0238232
2006/01/29(日) 21:33:53処理系の解説は載ってませんからね。
gclのコードは大きすぎで、mainとか読んでもわかんないしで、
困ってるところです。
stdinにfprintfかなんかで、書き込んで、実行させる方法とかないでしょうか?
0239デフォルトの名無しさん
2006/01/29(日) 21:51:53lpStr を渡すのが最善なのは分かるよ。
一応 &lpStr でも動くと言ってるだけ。
ただ、厳密なことを言えば、
char * と char (*)[128] とでアドレッシングが違う可能性があるから、
環境によっては動かない可能性はあるね。
>>238
CommonLisp の本でもなく、
gcl のコードでもなく、
gcl のマニュアルってのはないの?
知らんけど。
0240238
2006/01/29(日) 21:57:080241デフォルトの名無しさん
2006/01/29(日) 22:16:28ソースをいじって実現したいのか。
それなら確かに C の質問か・・・。
でも、それはちゃんとソースを読んで
頑張ってちょうだいとしか言いようが無い気が。
0242デフォルトの名無しさん
2006/01/29(日) 22:22:53一文字ずつアスキーコードに変えて配列に入れたいんですけど
なんだか混乱してきたのでやり方おしえてもらえませんか?
0243デフォルトの名無しさん
2006/01/29(日) 22:29:17どこまでできて、どこまでできてないのか。
ちゃんとソースを提示する事。
0244デフォルトの名無しさん
2006/01/29(日) 22:43:13char配列なら大抵はASCIIコードで入ってると思うが?
0245デフォルトの名無しさん
2006/01/29(日) 23:11:14C言語を始めるにあたりお勧めの解説書教えて下さい
0246デフォルトの名無しさん
2006/01/29(日) 23:13:52何でもいいよ。
0247デフォルトの名無しさん
2006/01/29(日) 23:20:42規格見れば確実
0248デフォルトの名無しさん
2006/01/29(日) 23:27:030249デフォルトの名無しさん
2006/01/29(日) 23:28:28文字を読めない人間に本を紹介しても無駄無駄
0250デフォルトの名無しさん
2006/01/29(日) 23:30:03「何を伝えるか?」までは誰にも教えることの出来ない事だから、
それで問題ないと思うが?
0251デフォルトの名無しさん
2006/01/29(日) 23:32:50あなたが何を伝えたいのかがわからない。
0252デフォルトの名無しさん
2006/01/29(日) 23:56:30色いろ違うが(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);
となる。
0253デフォルトの名無しさん
2006/01/30(月) 00:44:11Perl 使えるなら、それで十分。
0254デフォルトの名無しさん
2006/01/30(月) 00:50:090255デフォルトの名無しさん
2006/01/30(月) 00:52:085年前なら釣られてやったものを
といいつつ釣られてみる
0256デフォルトの名無しさん
2006/01/30(月) 01:18:505年前は学生でした
0257デフォルトの名無しさん
2006/01/30(月) 01:27:240258デフォルトの名無しさん
2006/01/30(月) 01:42:12Linuxかよ!
0260デフォルトの名無しさん
2006/01/30(月) 02:13:271.文字列を読み込む
2.格納されたをループさせてint型配列に一つづつぶち込む
だけでいいと思うんだが。
0262デフォルトの名無しさん
2006/01/30(月) 02:26:29あのねえ。char型は数値なんだよ。
char c = 'a';
ってなってるとして
printf("%d\n", c);
ってやるとだな、97が出て来るんだよ。ASCIIならばな。
0263デフォルトの名無しさん
2006/01/30(月) 02:28:25char s[] = "abc";
ってなってるとするだろ。これで
printf("%d %d %d\n", s[0], s[1], s[2]);
なんてやるとだな、97 98 99 って出るわけだよ。
文字として出したいなら puts(s); とかな。色々あるがな。
文字コード出したいなら %d とかで出せばいいだけ。
0264242
2006/01/30(月) 02:40:03たとえばabdcbac→aabbccdみたいな形に。
それでただ数字ならソートの部分は配列使ってできています。
ただそのプログラムは読み取るデータが一つずつ改行されているので
改行されずにそのまま並んでいる文字を一つずつ数字で配列にいれたい
ということで質問させてもらいました。
0265デフォルトの名無しさん
2006/01/30(月) 02:57:06使用ソフトはvisualC++なんですが、
配列を使って、例えば
double A[000],B[000];
int i;
という風に定義するとします。
すると、AとBの000の数字はどこまで大きくできるんでしょうか?
当方、なぜか40000以上にするとエラーでvisualC++がとまってしまいます。
原因の分かる方、ご教授願いますm(__)m
0266デフォルトの名無しさん
2006/01/30(月) 03:03:57改行読みとばせばいいのでは?
0267デフォルトの名無しさん
2006/01/30(月) 03:07:32原因はわかるが適したスレで聞けよ。
0268デフォルトの名無しさん
2006/01/30(月) 03:07:51自動変数はおそらくスタックに作られるのでスタックの限界までしか作れないと
思っておけ。もちろんスタックを使わないようなコードを作るコンパイラもある
かも知れないが、この頃のメジャーなやつはだいたいスタックを使っている。
逆に言うと、スタックを大きくしてしまえばその分だけ大きく作れる。
しかしそこまでしなければならないということは何か設計がおかしいような
気もする。場合にもよるが。
どうしても必要なら static にしてしまうとか、関数の外に出してしまうとか、
malloc() で確保するようにするとか、とにかく自動変数以外の変数にしろ。
0269デフォルトの名無しさん
2006/01/30(月) 03:18:06すいません。使用ソフトはvisualCなんですが、
C言語なんで質問してもいいかな…と思いまして。
原因がわかればなにとぞご助言を。
0270デフォルトの名無しさん
2006/01/30(月) 03:19:55だから書いただろうが。読めよ。
0271デフォルトの名無しさん
2006/01/30(月) 03:30:31親切にありがとうございました。助かりますm(__)m
迷惑かけてすいません。以後、気をつけます。
0272デフォルトの名無しさん
2006/01/30(月) 05:31:50死ねよ
0273デフォルトの名無しさん
2006/01/30(月) 05:43:35また来ていただかないとダメだろ
0274242
2006/01/30(月) 06:27:20すんまそ
0275デフォルトの名無しさん
2006/01/30(月) 10:05:02ワロタw
0276デフォルトの名無しさん
2006/01/30(月) 13:22:36×気分悪くして
○気分悪くして
じゃないのか?
0277276
2006/01/30(月) 13:23:15○気分悪くさせて
じゃないのか?つか俺莫迦?
0278デフォルトの名無しさん
2006/01/30(月) 13:43:460279デフォルトの名無しさん
2006/01/30(月) 14:14:11それとも複数人でオナニーすれば無問題なのか?
0280デフォルトの名無しさん
2006/01/30(月) 14:41:56草加せんべいドゾー
つ○
0281デフォルトの名無しさん
2006/01/30(月) 14:46:48LINUXで動くプログラムの処理速度をμ秒単位で計測したいのですが
どの関数で時間を取得すればいいとですか?
0282デフォルトの名無しさん
2006/01/30(月) 15:05:27UNIXプログラミング質問スレってのがあるけど、とりあえず
gettimeofday()
0283デフォルトの名無しさん
2006/01/30(月) 15:53:44つ「プロファイラ」
0284デフォルトの名無しさん
2006/01/30(月) 16:03:15プログラムが始まってから終わるまででいいのであれば time コマンドを使え。
0285デフォルトの名無しさん
2006/01/30(月) 16:41:30というやつですよね?!
#if _MSC_VER > 1000
#pragma once // ●
#endif
#ifndef _INC_STDIO // ◎
#define _INC_STDIO
それで今回コメント●の部分で疑問を感じました。
ここは、バージョンによってコンパイルするだのしないだのを分岐しているんだと考えてます。
コメント◎の部分と●の部分は期待する結果は同じはずです。
なら、●の部分はいらないと思うのが・・・なぜ
意味がなんとか通じた方いらっしゃいましたらご解説のほどを!!!
0286デフォルトの名無しさん
2006/01/30(月) 17:06:12スレ違いだけど。
#pragma onceはプリプロセッサが同じファイルを2度以上インクルードしないという情報を知らされる分、
普通のインクルードガードよりもプリプロセスにかかるオーバーヘッドの削減が期待できる(はず)。
しかし#pragma onceが使えるコンパイラは限られている(というより独自拡張だ)から、
使えるかどうかを確かめるための#if _MSC_VER > 1000がある。
そして#pragma onceが使えないプリプロセッサのために
通常のインクルードガード(#ifndef _INC_STDIO)も用意されている。
0287デフォルトの名無しさん
2006/01/30(月) 17:07:32「将来的には◎の方を廃止してしまいたい」と言う、強い願望の現れ
ではあるまいか?
0288デフォルトの名無しさん
2006/01/30(月) 17:23:17そうなのですか。ありがとうございました! すっきり致しましたです そして勉強になりました!
0289デフォルトの名無しさん
2006/01/30(月) 18:32:42# include <signal.h>
(void)signal(SIGALRM, func);
とやりたいんですが、
funcに複数の引数を持たせる事は出来ないのでしょうか。
funcからある変数の中身を弄りたいんですが、
その変数をfuncにpointerで渡したいんです。
その変数をglobalにすればfuncの引数は1つでいいのですが、
変数はglobalに出したくないので。
複数引数が駄目なら、何か同等の機能を持たせる方法はありますか?
0290デフォルトの名無しさん
2006/01/30(月) 18:50:200291デフォルトの名無しさん
2006/01/30(月) 19:15:33多分、確保したリソース系を解放したいんだよな
ポインタをstatic変数で持って、解放する関数を用意するしかないと思う。
getHoge();とかしてシングルトンもどきという手もあるけど
Cでそこまでする必要があるのかという疑問がある
0293デフォルトの名無しさん
2006/01/30(月) 22:27:000294デフォルトの名無しさん
2006/01/30(月) 23:48:360295デフォルトの名無しさん
2006/01/31(火) 00:10:04例えば、(a,b,c)(b,c,k)(h,j,u)のような文字のグループが与えられていて、
同じ文字は重複せずに組み合わせていくプログラムなんですが・・・。
わかる人いたら教えてください!!お願いします!!
0296デフォルトの名無しさん
2006/01/31(火) 00:16:330297デフォルトの名無しさん
2006/01/31(火) 00:20:00C言語で書くとどのような感じになりますか?
よろしければ教えていただきたいのですが・・・。
0298デフォルトの名無しさん
2006/01/31(火) 00:31:45考えられる全ての組み合わせを作る
その過程で重複するのは除く
0299デフォルトの名無しさん
2006/01/31(火) 00:32:434C2とかについて
なぜ二つの枠がある時
4P2 / 2!をしなければいけないのか理解してね
0300デフォルトの名無しさん
2006/01/31(火) 00:35:46あとはいかにCで表現するかか。
俺は数学苦手だ
0301デフォルトの名無しさん
2006/01/31(火) 00:54:25もうちょっと厳密に書いてくれないか?というか宿題?
C/C++の宿題を片付けます 59代目
http://pc8.2ch.net/test/read.cgi/tech/1138320520/
0302デフォルトの名無しさん
2006/01/31(火) 01:02:34ただ、方向性で何から始めるべきかかわるよね。
将来、PGになりたいのなら、断然Java。潰しもきくし。
C/C++でプログラミングの基礎を覚えるのは難しいよ。
本当は無料版さえあればDelphiがおすすめなんだけどね。
Webデザイナーになりたいなら、HTMLとJavaScriptから入ってPHPに進めばいい。
日曜プログラマでさもよくば趣味を生かして仕事の効率化を図りたい人にはVB(VBA)が一応おすすめ。
ただ今後はC#にとって代わられる可能性も否めないので。
0303デフォルトの名無しさん
2006/01/31(火) 01:11:36やりたいことを表現する為の規則が言語の文法でしょ?
0304デフォルトの名無しさん
2006/01/31(火) 01:18:34表現すりゃいいの?
0305デフォルトの名無しさん
2006/01/31(火) 01:21:140306デフォルトの名無しさん
2006/01/31(火) 02:22:170307デフォルトの名無しさん
2006/01/31(火) 02:24:300308デフォルトの名無しさん
2006/01/31(火) 02:26:180309デフォルトの名無しさん
2006/01/31(火) 02:41:410310デフォルトの名無しさん
2006/01/31(火) 03:13:210311デフォルトの名無しさん
2006/01/31(火) 03:29:51Windows のデバイスドライバ作るときとか・・・。
0312デフォルトの名無しさん
2006/01/31(火) 03:30:50LinuxもCだな。
0313デフォルトの名無しさん
2006/01/31(火) 03:34:56C言語一年くらいかかって覚えて、制御系の会社へ面接行ったら
「共に成長していきましょう。電気電子で」とか言われますた
0314デフォルトの名無しさん
2006/01/31(火) 04:59:07Delphi無料版あるぞ
0315デフォルトの名無しさん
2006/01/31(火) 09:04:23言語の前に、コンピュータの基礎知識を身につけて欲しい。
CPU・記憶装置・入力装置・出力装置・バスなどはもちろん、
メモリイメージやN進数、CPUの動作概要など、
制御すべきコンピュータがどういうものなのか?
を理解しないで言語を勉強しても、効率が悪いと思う。
0316デフォルトの名無しさん
2006/01/31(火) 09:48:37習いたてのカタコト言語で書いたコードがそこそこ「効率」よかったりはするな
問題は習ったことから少しでも外れるとお手上げってとこだ
スクラッチで書くことはできてもバグが直せないとか
応答時間を制約された途端トンズラとかな
0317デフォルトの名無しさん
2006/01/31(火) 11:17:49と
int foo( void );
の違い教えて。
速度とかでなく
何故、この記述でやるのかっての
0318デフォルトの名無しさん
2006/01/31(火) 11:56:17voidは引数ねぇよってことで呼び出しのとき引数指定したらエラー
何も書かないのは何を何個引数として呼び出そうが怒られなかったハズ
0319デフォルトの名無しさん
2006/01/31(火) 11:57:06なぜsigned charと宣言できるのかと同じ質問
0320デフォルトの名無しさん
2006/01/31(火) 12:28:22>その処理系はchar型は符号付き1bit変数で定義されていたとして
アリエナス
0321デフォルトの名無しさん
2006/01/31(火) 12:32:51CHAR_BIT >= 8 は規格で定められていた気がする
ビットフィールドが1bit幅の時、
なぜ、signed intと宣言できるのか?
という例えのほうが現実味があるな
0322デフォルトの名無しさん
2006/01/31(火) 12:34:288bitだったね
0323デフォルトの名無しさん
2006/01/31(火) 12:40:53引数の型チェックを行うか行わないかの違い。
0324デフォルトの名無しさん
2006/01/31(火) 14:07:42というのと、
a += 1
はどっちが早い?
0325デフォルトの名無しさん
2006/01/31(火) 14:11:465文字 a = a + 1
4文字 a += 1
3文字 ++a
結論 a += 1、のほうが1文字少ないのでa = a + 1よりは早くタイプできる。
ただし、++aのほうがさらにタイプ数が少ない。
コードの速度ならどれもCなら差が発生するほうが珍しい
0326デフォルトの名無しさん
2006/01/31(火) 14:17:15なるほど。
Thanks
0327デフォルトの名無しさん
2006/01/31(火) 14:35:30速度は実測するのが何より正確
0328デフォルトの名無しさん
2006/01/31(火) 14:38:490329デフォルトの名無しさん
2006/01/31(火) 14:46:20あんなちっちゃい差計測できるか?
0330デフォルトの名無しさん
2006/01/31(火) 14:50:54volatileつけても同様。メモリーにしまう処理が増えるだけ。
0331デフォルトの名無しさん
2006/01/31(火) 15:00:020332デフォルトの名無しさん
2006/01/31(火) 15:28:51その程度だとどんなCPU向けのコンパイラでも最適化したら同じだと思うぞ。
なので実行時に違いはないんじゃないの?
てか、その程度を最適化できないコンパイラはクソ。
0333デフォルトの名無しさん
2006/01/31(火) 15:29:53ああ。そりゃちょっとだけ遅いかも。
でもCPUによっては同じかも。
0334デフォルトの名無しさん
2006/01/31(火) 15:38:060335デフォルトの名無しさん
2006/01/31(火) 15:42:110336デフォルトの名無しさん
2006/01/31(火) 15:46:070337デフォルトの名無しさん
2006/01/31(火) 16:15:34unsigned short ud;
と宣言されてる時、udに0xB6が入る様にするには、どの様にキャストすれば良いですか?
ud = (unsigned int)cd; // ud = 0xFFB6・・・
0338デフォルトの名無しさん
2006/01/31(火) 16:28:14つまり君の環境でのcharが表現できる数値の範囲は128〜-127ぐらい
そして0xB6ってのは128以上だからMSB(符号ビット)が入れ替わっちゃって変な意図しない値が代入されてるんだよ
だからunsigned charと宣言すれば解決するはず
0339337
2006/01/31(火) 16:36:54charをunsigned charで宣言すると、あっちこっち直さなきゃならないので・・・
どうしても、char型を一時的に符号無視して、unsigned short(16bit)に拡張したいのです
キャストなら、なんとかなるかなと思いまして・・・
0340デフォルトの名無しさん
2006/01/31(火) 16:47:03最初から欠陥プログラムだったんだよ
解決方法はいくらでもあるけど、それを実行するとあっちが立たないになるからお勧めできない
0341デフォルトの名無しさん
NGNG>だってsigned charで宣言してる時点で0xB6なんて値は不正な値だよ?
意図してるかどうかは別として、不正ではないと思うが。
0342デフォルトの名無しさん
2006/01/31(火) 16:54:14ud = (unsigned char)cd;
0343デフォルトの名無しさん
2006/01/31(火) 16:56:21お前の頭が欠陥品だ。
お前がこのスレでレスをするのはお勧めできない。半年ROMれ
0344デフォルトの名無しさん
2006/01/31(火) 17:11:59彼に解決策でも与えなよ
0345デフォルトの名無しさん
NGNG0347デフォルトの名無しさん
2006/01/31(火) 17:15:55最適化の幻想と実際の差にあごが外れるのが怖くて
アセンブラろくに読まずにてきとーこくようなクルクルパーは
日常の言動から誰も本気で信用してないぞ
0348デフォルトの名無しさん
2006/01/31(火) 17:19:54もうCPUとかメモリとか理解しなくてもプログラミングできる時代だから
まぁCはメモリ知らないとダメだけど
0349デフォルトの名無しさん
2006/01/31(火) 17:21:010350デフォルトの名無しさん
2006/01/31(火) 19:17:55コンパイラにchar を unsigned にするか signed にするかの
オプションついてないか?
ついてればラッキー, なければ地道に直す
0351デフォルトの名無しさん
2006/01/31(火) 19:41:52いかんか? いかんか? キャストすべきか?
んじゃこうだ。
ud = (unsigned short) (cd & 0xff);
可読性悪いか?
んじゃこうだ。
ud = (unsigned short) (cd & 0x00ff);
0352デフォルトの名無しさん
2006/01/31(火) 20:23:37http://news18.2ch.net/test/read.cgi/news7/1138194094/
まず問題を冷静に吟味してBの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
GUIなどのBではありえないものについては他言語を学んでください。
0353デフォルトの名無しさん
2006/01/31(火) 20:47:54コードの書き方で応答時間意識するのって組み込みのひと?
0354デフォルトの名無しさん
2006/01/31(火) 20:53:460355デフォルトの名無しさん
2006/01/31(火) 21:07:06言ってること何かおかしくないかな?
0356デフォルトの名無しさん
2006/01/31(火) 21:17:340357デフォルトの名無しさん
2006/01/31(火) 22:27:340358357
2006/01/31(火) 22:31:060359デフォルトの名無しさん
2006/01/31(火) 23:08:15どちらにしろ、スレ違いだから
0360デフォルトの名無しさん
2006/01/31(火) 23:58:06から output 出てくるまでの時間って意味だけどね.
通常, 数値計算なんてのはアルゴリズムの選択がとんで
もなくものを言うんだけど, 大量にループがあるのが
当たり前なので, ループ内のコードに関しては結構気を
使ってコーディングする.
0361デフォルトの名無しさん
2006/02/01(水) 00:18:06char t[] = "■";
というような変数宣言をして, 二つ同時(m, t 共に)にパラメータを溜めていき二つとも
20個まで溜めたいのですがやり方がわかりません
ちなみに「二つ同時に」というのはパラメータ開始時が二つ同時というだけです
終わりはどちらが先に溜まって終わるかというのは分からないようにしたい
同期を取るというのも調べてみましたが…よく分からないので教えてください
0362デフォルトの名無しさん
2006/02/01(水) 00:27:11パラメータを溜めるとはどういうことか?もっと詳しく。
0363361
2006/02/01(水) 00:38:49mの場合:■■■■■・・・■(20個まで溜まる)
tの場合:■■■■■・・・
で・これの開始時は同じだが終わりはどちらが先に終わるか分からないと
0364デフォルトの名無しさん
2006/02/01(水) 00:46:560365デフォルトの名無しさん
2006/02/01(水) 01:09:49それならきっちり二行になるとおもわれ。
0366デフォルトの名無しさん
2006/02/01(水) 01:19:35char ts[64]={0,};
int mc = 0;
int tc = 0;
・・・
if(mc<20){
strcat(ms,m);
mc++;
}
if(tc<20){
strcat(ts,t);
tc++;
}
よく分からん。
0367361
2006/02/01(水) 01:34:390368デフォルトの名無しさん
2006/02/01(水) 01:44:480369デフォルトの名無しさん
2006/02/01(水) 02:10:30将来仕事していくに当たってはこれに頼らず自分でAPIの基礎から学んだ方が良いのでしょうか?
それともGUIなどはそういった枠組みがあるものを組み立てるような存在なのでしょうか?
0370デフォルトの名無しさん
2006/02/01(水) 02:35:33> 将来仕事していくに当たってはこれに頼らず自分でAPIの基礎から
> 学んだ方が良いのでしょうか?
一から作れる能力を養っておくに越した事はない。しかし何も知らないのは厳しい。
> それともGUIなどはそういった枠組みがあるものを組み立てるような
> 存在なのでしょうか?
意味が分からない。
0371デフォルトの名無しさん
2006/02/01(水) 02:49:440372デフォルトの名無しさん
2006/02/01(水) 06:25:49char a = "■";
printf("%c",a);
"■"の出力がD,Hに化けてしまうんですが ■の変換指定子を教えて下さい。
0373デフォルトの名無しさん
2006/02/01(水) 06:26:320374デフォルトの名無しさん
2006/02/01(水) 07:12:430375デフォルトの名無しさん
2006/02/01(水) 07:14:06printf("■");
で、やらないと駄目かな。。
0376デフォルトの名無しさん
2006/02/01(水) 09:01:34char a[] = "■";
printf( "%s", a );
0377デフォルトの名無しさん
2006/02/01(水) 12:34:43char の変数にダブルクォーテーションで括って文字列へのポインタを入れてはいかん。
それ以前の問題として、今のところだいたいの有名なCPU用コンパイラでは、
charは8ビットだ。なので'■'は入らない。エンコードによりけりだがこの
文字は16ビット〜24ビットないとダメだ。
ということで wchar_t などがあるわけだが、こういう複数バイト文字だったと
しても文字列のまま扱うのならできる。
0378デフォルトの名無しさん
2006/02/01(水) 15:09:04>> 将来仕事していくに当たってはこれに頼らず自分でAPIの基礎から
>> 学んだ方が良いのでしょうか?
>一から作れる能力を養っておくに越した事はない。しかし何も知らないのは厳しい。
なるほど。
>> それともGUIなどはそういった枠組みがあるものを組み立てるような
>> 存在なのでしょうか?
>意味が分からない。
GUIを作る場合
いちいちソースを覚えるような存在ではなく、あらかじめ準備されてるソースなどをコピペしてそれを組み立てるような存在
または、ソースをいちから入力するものではなくBccFormみたいに簡単なGUI操作で作るもの
なのかなと。
0379デフォルトの名無しさん
2006/02/01(水) 16:10:04unsigned char の変数に入れたいのですが、どうすればいいですか?
0380デフォルトの名無しさん
NGNGunsigned char b;
(中略)
b = (unsigned char)(a & 0xff);
0382デフォルトの名無しさん
2006/02/01(水) 17:21:15b = (unsigned char)a;
でいいだろ。
0383デフォルトの名無しさん
NGNGsizeof(char) >= 8
0384デフォルトの名無しさん
2006/02/01(水) 17:59:01と言いたかった?
0385デフォルトの名無しさん
2006/02/01(水) 18:17:370386デフォルトの名無しさん
2006/02/01(水) 18:22:591バイトが何ビットかというのはまた違う話だし。
0387デフォルトの名無しさん
2006/02/01(水) 18:23:29恐らく統一はされないと思うけど
0388デフォルトの名無しさん
NGNGオーイェー
0389デフォルトの名無しさん
2006/02/01(水) 18:24:410391デフォルトの名無しさん
2006/02/01(水) 19:37:219bit のやつが太古より・・・
0392デフォルトの名無しさん
2006/02/01(水) 20:01:15(,,゚Д゚)∩先生単位が違います
0393デフォルトの名無しさん
2006/02/01(水) 20:07:02あ? typo じゃなかったのか (ゲラゲラ
0394デフォルトの名無しさん
2006/02/01(水) 20:19:48どうしたらいいんですか?
0395デフォルトの名無しさん
2006/02/01(水) 20:22:09初心者向けの本を買ってきたらいいですよ。
0396デフォルトの名無しさん
2006/02/01(水) 21:08:420397デフォルトの名無しさん
2006/02/01(水) 21:44:35char *c;
c='あ';
にしても変な文字になる・・。
0398デフォルトの名無しさん
2006/02/01(水) 21:46:19or
wchar_t s[] = L"あ";
0399デフォルトの名無しさん
2006/02/01(水) 21:51:560400デフォルトの名無しさん
2006/02/01(水) 21:54:06なるほど1次元配列が未定な変数に代入する時は宣言時じゃないといけないのか・・
それと全角文字は""になるのか
ありがとう
0401デフォルトの名無しさん
2006/02/01(水) 22:05:43わかってない悪寒
0402デフォルトの名無しさん
2006/02/01(水) 22:07:07s[]="あ"; だとエラー
s="あ"; でもエラー
0403デフォルトの名無しさん
2006/02/01(水) 22:25:57そうだよ
全角文字は特殊でね""で囲まないといけないんだよ
Lはノイズだから無視してね♥
0404デフォルトの名無しさん
2006/02/01(水) 22:30:410405デフォルトの名無しさん
2006/02/01(水) 22:31:49お前最低だな
0406デフォルトの名無しさん
2006/02/01(水) 23:02:12何度も呼び出す際は便利だとは思うけど、ほかにどのような利便性があるのでしょうか?
また長文ではない・・簡単なソースの場合はmainに駄々がきでもいいのかな
会社とか実用的な場ではどうやってるんでしょうか
0407デフォルトの名無しさん
2006/02/01(水) 23:04:38自作関数使わずに数千、数万行にわたるソース書いてみろ
イヤでも分かる
0408デフォルトの名無しさん
2006/02/01(水) 23:06:07他には?
0409デフォルトの名無しさん
2006/02/01(水) 23:09:34例えば、処理の中に
status = security_chk(hoge);
if(FALSE == status)
{
return ERROR;
}
とかあったら、「あーなんかセキュリティのチェックしてんだな〜」くらい分かる
全体として処理フローが分かりやすくなったりな。
0410デフォルトの名無しさん
2006/02/01(水) 23:16:23一言でいうと抽象化
0411デフォルトの名無しさん
2006/02/01(水) 23:22:41なるほど、流れが分かりやすくなりますね。
0412デフォルトの名無しさん
2006/02/01(水) 23:25:35全角文字は通常マルチバイト(たとえば2バイトとか)で表現されているから、
charには格納できない。だから、文字「列」として扱うしかない。
0413デフォルトの名無しさん
2006/02/01(水) 23:27:54キモイ
0414デフォルトの名無しさん
2006/02/01(水) 23:39:30いや、理解できているようには見えない
その証として、今のあなたに聞くが
>自作関数って何のために使うんですか?
長文のある部分を要約して隠すことがなぜ「わかりやすく」なると思うんだ?
これは構造化プログラミングをしていない場合であっても、
ものすごく大事なことなんだが、あなたはどう思ったんだ?
0415デフォルトの名無しさん
2006/02/01(水) 23:50:18流し読みしてて気づかなかった
というかおまい良く気づいたな
0416デフォルトの名無しさん
2006/02/01(水) 23:50:22よくあるテクだよ。
好きになれない人もいるし、好んで使う人もいる。
あんま宗教論争起こしそうなレスするなよ。
0417デフォルトの名無しさん
2006/02/01(水) 23:52:14main(){
処理1
処理2
〜中略〜
処理99999999998
処理99999999999
}
よりも
main(){
関数1()
関数2()
〜中略〜
関数20()
}
関数1(){
処理1
処理2
}
〜中略〜
関数20(){
処理99999999998
処理99999999999
}
後者の方が本体であるmainの流れが分かり安くなるからじゃないの
また同じ処理をする場合関数を呼ぶだけでいいから(>>406)
あと関数の名前でどんな処理をするのかが分かる(>>409)
0418デフォルトの名無しさん
2006/02/01(水) 23:55:35ナニに?w
0419デフォルトの名無しさん
2006/02/01(水) 23:58:29遺憾の念を禁じ得ない
0420デフォルトの名無しさん
2006/02/02(木) 00:00:280421デフォルトの名無しさん
2006/02/02(木) 00:07:09> 自作関数って何のために使うんですか?
「利用可能な物をどの様にして有効に活用するか?」
それを考えることもプログラマの仕事ではないかね?
何とかとハサミは使いよう、と言うだろ?
「何のために使うのか?」
それは、使う人が考えるのであって、
他人に教わるものではない。
他人から得られることは「他人はどう使っているのか?」であって、
「あなたにとってその使い方が最善かどうか」は、
あなたにしか判断できないことだ。
そして、「あなたが何に使うか?」もあなた自身が考えることだ。
0422デフォルトの名無しさん
2006/02/02(木) 00:11:34と言わない
0423デフォルトの名無しさん
2006/02/02(木) 00:18:09>それを考えることもプログラマの仕事ではないかね?
他人の意見も聞く事も成長に繋がると思います。
>何とかとハサミは使いよう、と言うだろ?
何とかってなんですか?気になりますので人に発言する時はきちんと覚えている言葉を使ってください。
>それは、使う人が考えるのであって、 他人に教わるものではない。
何故ですか?あなたは他人の考え方、料理の仕方など参考にしようと考えた事はありませんか?
>他人から得られることは「他人はどう使っているのか?」であって、
だから「会社とか実用的な場ではどうやってるんでしょうか」と聞いているけど読んだのかな。
>「あなたにとってその使い方が最善かどうか」は、 あなたにしか判断できないことだ
そうだね。けどそんな事聞いてもいないし、言われるまでもないですけど何を断言しているのですか?
>そして、「あなたが何に使うか?」もあなた自身が考えることだ。
上の発言と同じ意味だと思うけど2度言う必要はあったのですか?
それで別にあなたに言われるもまでもなく使う時に考えますよ。
そういうのをおせっかいと言います。
0424デフォルトの名無しさん
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が表示されません。
教材だと表示されているのですが。。。
ご指摘お願いします
0425デフォルトの名無しさん
2006/02/02(木) 00:37:37(1) printfの末尾のセミコロン抜け
(2) コンパイルしただけではだめ。できたexeを実行する。
0426デフォルトの名無しさん
2006/02/02(木) 00:39:19セミコロン忘れてました^^;
とりあえずexe実行してみます
0427デフォルトの名無しさん
2006/02/02(木) 00:42:360428デフォルトの名無しさん
2006/02/02(木) 00:44:570429デフォルトの名無しさん
2006/02/02(木) 00:50:070430424
2006/02/02(木) 00:50:54C:\ctest>bcc32 hello.cでも
C:\ctest>gcc hello.cでも
exe化できないのですが、どうすれば・・・
0431デフォルトの名無しさん
2006/02/02(木) 00:51:29kwsk
0432424
2006/02/02(木) 01:01:32えっと、>>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’は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。
とのこと。・・
0433デフォルトの名無しさん
2006/02/02(木) 01:25:470434デフォルトの名無しさん
2006/02/02(木) 05:44:17int a0;
main()
{
for(a0 = 0; a0 < 10; a0++)
{
a1();
}
}
a1()
{
a = 0;
}
馬鹿げたことに見えるかも知れないが
数千行からのプログラムではやってしまいがちなミスを
単純化したものだ
407 によってか否かはわからんが
なぜ関数化するのかが理解できたのなら
このミスの根底にあるものを指摘できるはず
0435デフォルトの名無しさん
2006/02/02(木) 05:56:41とりあえずコンパイルエラーだな
ちゃんとプロトタイプ宣言汁
0436デフォルトの名無しさん
2006/02/02(木) 06:05:31エラーの意味わかってる?
他に警告ってのもあるな
0437デフォルトの名無しさん
2006/02/02(木) 06:07:130438デフォルトの名無しさん
2006/02/02(木) 06:07:30s/a = 0;/a0 = 0;/
関数原型に関するあるスタイルを知らないのはこっちのせいじゃないが
0439デフォルトの名無しさん
2006/02/02(木) 08:03:09グローバル変数なんか使うからそうなる
0440デフォルトの名無しさん
2006/02/02(木) 09:10:01なぜ、グローバル変数を使ってはいけないんだ?
0441デフォルトの名無しさん
2006/02/02(木) 09:12:16グローバル変数にまつわるバグはあらゆる場所に
埋め込まれうるという事だ。
0442デフォルトの名無しさん
2006/02/02(木) 09:15:320443デフォルトの名無しさん
2006/02/02(木) 09:17:190444デフォルトの名無しさん
2006/02/02(木) 09:29:42406 または似た立場の者に対する発言なんで
お間違いのないように
0445デフォルトの名無しさん
2006/02/02(木) 09:56:48Xの値が整数になったときに-1.#INF00とエラーになってしまいます
回避するにはどうすればいいんでしょうか?
0446デフォルトの名無しさん
2006/02/02(木) 12:28:290447デフォルトの名無しさん
2006/02/02(木) 13:21:04Cは関数型プログラムサポートしてるから、標準ライブラリ使うのだってmain()から関数呼び出してるっしょ?
別にひとりで組むのならmain()関数一本でもいいと思うけど、標準ライブラリ使って効率よくプログラム書きたいのなら、
そんなひとの為に「関数」は必要だった。
0448デフォルトの名無しさん
2006/02/02(木) 13:26:42中にはmain()に処理を全部詰め込んだ方が分かり易い。ってひともいるらしいし。
0449デフォルトの名無しさん
2006/02/02(木) 13:33:00calloc
}
void main(){
test();
}
上記のように関数内でcallocを使った場合freeした方がいいんでしょうか?
それともstatic変数のように自動的に開放されるのでしょうか?
0450デフォルトの名無しさん
2006/02/02(木) 13:37:08開放されるわけがない。
0451デフォルトの名無しさん
2006/02/02(木) 13:41:31そうなのですか・・・・・・・・・・ありがとうございます
0452デフォルトの名無しさん
2006/02/02(木) 13:41:52って考えなんじゃないの?
0453デフォルトの名無しさん
2006/02/02(木) 13:43:35当たり前だが、ちゃんと解放される
0454デフォルトの名無しさん
2006/02/02(木) 13:53:400455デフォルトの名無しさん
2006/02/02(木) 14:14:54int i, a[i];
(a[10]とかなら当然いいんですが)
これはダメなんですか?家のコンパイラだと定型式がないとか出てきて無理なんですが・・・
0456デフォルトの名無しさん
2006/02/02(木) 14:16:14その書き方に対応していないコンパイラでは駄目
0457デフォルトの名無しさん
2006/02/02(木) 14:24:17対応してるの教えてもらえませんか?・・・
0458デフォルトの名無しさん
2006/02/02(木) 14:30:03っつーか、使うな
0459デフォルトの名無しさん
2006/02/02(木) 14:38:460460デフォルトの名無しさん
2006/02/02(木) 14:42:150461デフォルトの名無しさん
2006/02/02(木) 14:50:03gcc
0462デフォルトの名無しさん
2006/02/02(木) 14:56:20> Cは関数型プログラムサポートしてるから
まさか Functional Programming の事ではないよな?
0463デフォルトの名無しさん
2006/02/02(木) 14:58:44Cでその書き方は基本的にまずいだろう
0464デフォルトの名無しさん
2006/02/02(木) 15:06:01C99なら基本的にも応用的にも無問題
0465デフォルトの名無しさん
2006/02/02(木) 15:10:03>中にはmain()に処理を全部詰め込んだ方が分かり易い。
どうやら話が循環したようだな
いいからコンパイラを main だけで書いてみろよ
別にコンパイラでなくてもいいが数千行かそれ以上の main をな
できれば途中でやめて他の人に続きを頼んでみるといい
>ってひともいるらしいし。
そんな奴のコードを引き継がされてみたいか?
0466デフォルトの名無しさん
2006/02/02(木) 15:12:26alloc系使わないとやだぁ
0467デフォルトの名無しさん
2006/02/02(木) 15:23:57何万行もあったら後から死ぬほど読みにくいぞ。
0468デフォルトの名無しさん
2006/02/02(木) 15:24:55改良する気はもうない
0469デフォルトの名無しさん
2006/02/02(木) 15:30:52というプログラムを作ろうと思っています。
ここで、管理番号は「英字+数字5文字」の6字からなっているのですが、
この管理番号の6文字のみをファイルから抜き出して配列に格納するにはどのようにすれば良いのでしょうか?
分かる方がいましたら教えてください。よろしくお願いします。
ちなみに、例としてデータファイルの内容は下記のようになっています。
---------------------------------------------
文字列(長さは各行ごと異なる) 管理番号 日付
:
:
---------------------------------------------
0470デフォルトの名無しさん
2006/02/02(木) 15:36:19main以外に関数使ったほうが逆に分かりにくくない?
と初心者は思う
0471デフォルトの名無しさん
2006/02/02(木) 15:40:24これ程恐ろしい事はない
0472デフォルトの名無しさん
2006/02/02(木) 15:41:430473デフォルトの名無しさん
2006/02/02(木) 15:44:55200行以下にしとき
0474デフォルトの名無しさん
2006/02/02(木) 15:50:26教条主義的に行数制限するのは如何な最中とは思うが、
目安としてなら200行よりは20行の方がいい。
0475デフォルトの名無しさん
2006/02/02(木) 15:56:02突然 mkdir でフォルダが作れなくなってしまいました。
エラーメッセージは「ユーザーまたはグループのクオータを超えることはできません」
とでます。どうにかならないでしょうか?お願いします。
0476デフォルトの名無しさん
2006/02/02(木) 15:58:04C言語の質問じゃねえし、丁寧にメッセージ出てるじゃないか
0477デフォルトの名無しさん
2006/02/02(木) 16:20:19わけわからんのです。
ちなみにスレ違いなんでしょうか?
0478デフォルトの名無しさん
2006/02/02(木) 16:22:170479デフォルトの名無しさん
2006/02/02(木) 16:30:500480デフォルトの名無しさん
2006/02/02(木) 16:36:17なぜ人が「分かった」という返答に対して「お前は分かっていない」と決め付けるような事ができるわけ?
これはこの業種特有の性格なの?
この前のポインタの時も分かったというレスに対して「分かっていない」→結果「分かっていた」んだが同一人物なのか?
こう説明したがりの上から目線の。
普段職場で「分かっていない」と上司にこき使われてるそれらの反動かな
0481デフォルトの名無しさん
2006/02/02(木) 16:38:02このソースを見てどう思いますか?
自分の中では初めて作成した高難易度ゲームです。
0482デフォルトの名無しさん
2006/02/02(木) 16:47:14盤面でかくなったらきついかもだけど
0483デフォルトの名無しさん
2006/02/02(木) 17:21:04よく読んでね
414 の目にどう映ったかしか書いてないでしょ
それが正しいかどうかを反問で確かめようともしているよね
で、今のところ帰ってきた返事からはますます見間違いではなさそうに思えている
434 でもそんなに難しいことは聞いてないよ
現に 441 あたり、ようやくいい線ついてきたと思った矢先
次のレスで元の木阿弥に戻っちまった
上から目線が気に入らないのはあなたの勝手だが
悪いが互角にやり合える相手に見えてないもので
0484デフォルトの名無しさん
2006/02/02(木) 17:27:11> int i, a[i];
藻前は、この時点で「i」にどんな値が入っているか判るか?
「i」は初期化されていないから、
何個の配列が確保されるか判らないがいいのか?
0485デフォルトの名無しさん
2006/02/02(木) 17:29:550486デフォルトの名無しさん
2006/02/02(木) 17:32:280487デフォルトの名無しさん
2006/02/02(木) 17:35:450488デフォルトの名無しさん
2006/02/02(木) 17:40:490489デフォルトの名無しさん
2006/02/02(木) 17:43:51よく読んでね??
>414 の目にどう映ったかしか書いてないでしょ
で?だから勝手に決め付けるなって話だけど?
そもそも>>408の2行のレスに対して>>414
あの2行でどう見えたもくそもない あ、エスパーですか
そして>>414の自分の出した反問にも関わらず、答え>>417をスルーして>>434の発言
それで何か勘違いしているようだが>>414のレス以降、レスはしてないわけだが?
>>441やその後のレスなんて知ったことではない
他人の発言を見て勝手に木阿弥にされてもね
>上から目線が気に入らないのはあなたの勝手だが
>悪いが互角にやり合える相手に見えてないもので
上から目線は否定しないわけか
そうやって見下してる時点で、あんたは他人の発言を理解することはできないよ
部下のやってることにたいして「お前は分かっていない・できていない」と言って自分の他人への理解力のなさから部下の言ってることを理解できていない
まるでワンマン部長と同じだよ
0490デフォルトの名無しさん
2006/02/02(木) 17:45:350491デフォルトの名無しさん
2006/02/02(木) 17:50:050492481
2006/02/02(木) 17:52:03そうですか、よかったぁ・・
自分ひとりでもくもくとやってきたもんですから他から見たら変なソースになってないかどうか不安だったもんで
ちなみにアルゴリズムというんでしょうか処理の仕方は変えないとしてソース自体の改善点をあげるとしたらどういったところがあるでしょうか?
0493デフォルトの名無しさん
2006/02/02(木) 17:58:25再び、よく読んでね
あなたが解ってないかどうかは、こちらから見てって立場をはっきり示してるでしょ
違うのなら違うと思わせる発言をすればいい
今のところそれがないわけだが 441 があなたではないなら、なおさらだね
それこそこっちはエスパーじゃないんだから突っ張るだけじゃ伝わらないよ
ここはプログラム技術板なんで、技術的な話がどのくらい噛み合うかが論客の主要な価値であって
今のあなたはそれを低く見られているのに悪態までつくとクレーマーさながらだよ、およしなさい
0494デフォルトの名無しさん
2006/02/02(木) 17:59:370495デフォルトの名無しさん
2006/02/02(木) 18:05:28で、何を議論してんの?
0496デフォルトの名無しさん
2006/02/02(木) 18:10:38ざっとしか見てないけどチェック関数がごり押し過ぎるか
盤面広げるとかすると書くのきつい
ついでにそれで行くとしてもif文の最初のa[][]&&部分必要ないような・・・
0497デフォルトの名無しさん
2006/02/02(木) 18:16:06君が間違っているように見える。とにかく二人とも別でやってくださいね。
では質問とかどうぞ。
0498デフォルトの名無しさん
2006/02/02(木) 18:16:24いや、あちこち拙い。
言語仕様上の(警告レベルの)問題点が2点、悪魔が鼻から出る問題点が1点、
誤入力で暴走する問題点が1点、可読性の観点での問題点が2点、
衒学的なファイル管理上の問題点が1点あるな。
0499デフォルトの名無しさん
2006/02/02(木) 18:18:19それ厳しいだろ
多分随分前に来た○×の盤面表示わかりませんの初心者でしょこの人
0500デフォルトの名無しさん
2006/02/02(木) 18:21:02間が悪かったようだね、可哀想に。
コードはイイ感じ。プログラムセンスがあるようだ。ただし、デバグが甘い。
数字以外の入力があった場合の対処法を覚えないと、使い物にならないよ。
0501デフォルトの名無しさん
2006/02/02(木) 18:24:020502デフォルトの名無しさん
2006/02/02(木) 18:24:51この中のtest.hでは
typedef struct _test *Test;
って書いていてtest.cでstruct _testの実体を書いているんですが、
普通はヘッダファイルに実体を書きませんか?
これっておかしくないですか?
0503デフォルトの名無しさん
2006/02/02(木) 18:28:55確かにおかしい。
_test なんて名前を使っているのもおかしいw
ユーザー定義にアンダーバーを頭に付けるのはタブーだぞ。
0504デフォルトの名無しさん
2006/02/02(木) 18:31:10構造体の中身に触れられたくない時とか、
コンパイル時の依存を断ち切るのに、結構良く使う普通のテクニック。
0505デフォルトの名無しさん
2006/02/02(木) 18:33:47そんなこと出来たんですか。
ありがとうございます。
0506デフォルトの名無しさん
2006/02/02(木) 18:34:34> 普通はヘッダファイルに実体を書きませんか?
全然おかしくないぞ。
お前に見せるとろくな事をしないんで見せない。
FILE構造体とかがどちらかというと変なだけ
0507481
2006/02/02(木) 18:44:07確かにこれ以上チェックの条件増やしていくのは厳しくなりますね・・
>>500
数字以外の場合〜の問題点は対処しきれてませんね
正直そこまではいいかと思ってましたが考えて見ます
0508デフォルトの名無しさん
2006/02/02(木) 18:46:03前にオセロ作りたいとか言ってた人?
0509498
2006/02/02(木) 18:46:06一応指摘しておいたほうがよさそうなところだけ掻い摘んで。
>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の単純変数でいいし、配列を使用するとすっきりするだろう。
0510デフォルトの名無しさん
2006/02/02(木) 18:50:40シミュレーションGAMEとかでプレイヤーフェーズとかあるあれじゃない?
スペル知らないけど
0511デフォルトの名無しさん
2006/02/02(木) 18:54:250512481
2006/02/02(木) 19:41:03んーオセロ作りたいといってた人は私以外にも何人かいたみたいですが
基礎を学んだだけで実力つけるためにゲーム作ってみようといったものです。
それで最初はオセロを作る予定だったけどまだ技術的に無理だったからマルバツにのりかえたって話してました。
>>509
参考にさせていただきます。
・配列の範囲外をアクセスしてはいけない。
・b配列に入れる必然性がない。
ってところはまだよく理解できてないところが有りますが・・。
faseはフェイズのつもりでしたが誤字だったかな。
0513デフォルトの名無しさん
2006/02/02(木) 19:45:49>>498
言語仕様上の(警告レベルの)問題点が2点って?
0514デフォルトの名無しさん
2006/02/02(木) 19:46:03その「用心」ができない人たちのポピュラーな対応らしいが
はっきり言って、どれ使おうがそいつが書く限り気休めの域を出ないだろ
てきとーこかずに仕様をちゃんと確認して使うって基本がない以上ね
0515デフォルトの名無しさん
2006/02/02(木) 19:48:121,2,3以外入力拒否になる,では?
0516509=498
2006/02/02(木) 19:58:23そも、それでは「数字以外を入力すると暴走」と同じ現象になる。
#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]]);でも充分。
0517デフォルトの名無しさん
2006/02/02(木) 20:06:17ああマシだね
おまえさんはプログラムを作るんじゃなく買った方がマシだ
0518デフォルトの名無しさん
2006/02/02(木) 20:23:31ポインタ問題で叩かれ、そしてさっき喧嘩していたやつなのか?
0519509=498
2006/02/02(木) 20:29:15漏れのことなら違うよん。
#って書く辺り、「説明したがり」の自覚がないでもないらしい。
>>517
やけに絡むなぁ。ではどうしろと?
0520デフォルトの名無しさん
2006/02/02(木) 20:36:22「暴走」が起きているのは scanf ではなく、あなたのプログラムってことを理解しろ
ISO/IEC9899 に完全準拠しバグが絶対にない(悪魔の証明だが) scanf でも
あなたのプログラムは相変わらず「暴走」するだろう
ここまで来るとど素人でも Failed Module がどこなのかを言い当てることはできる
0521デフォルトの名無しさん
2006/02/02(木) 20:39:51たぶんとりあえず、ポインタとかさっきの喧嘩と同じく、
とりあえず喧嘩吹っかけたい人が居るみたいなので落ち着いて無視すれば良いと思うよ
0522デフォルトの名無しさん
2006/02/02(木) 20:42:270523デフォルトの名無しさん
2006/02/02(木) 20:43:57手持ちの本にも載っていなかったので
%dだの%sだの指定するのがメンドイと感じてしまう
そんな私からすれば
なぜscanfを使いたがる人が多いのかと
逆にふしぎだったりする
0524デフォルトの名無しさん
2006/02/02(木) 20:45:34いや、予想通りの人だ多分
scanf()は読み込めないとストリームに放置したままヌルーするから嫌われてるだけ
自分で作って自分でPLAYする分には使っても一向に問題ないよ
0525デフォルトの名無しさん
2006/02/02(木) 20:47:29とりあえず楽じゃん
数値ならatoiやらstrtolやらせんでもいいし
ちょっとやりたい時とかfgets(str,256,stdin);とか書くの・・・やってみたらむしろ楽だなヲイww
0526デフォルトの名無しさん
2006/02/02(木) 20:49:05あなたに動機がなければそんなもん
scanf どころか printf すら滅多に使わないバリバリ現役の人ふつーにいるし
0527509=498
2006/02/02(木) 20:54:54fgets()の第二パラメータは、sizeof(str)がお勧め。
つまりこうなる。
char buf[200];
fgets(buf, sizeof(buf), stdin);
int foo = atoi(buf);
厳密にチェックしたいときは、strtol()かsscanf()でやるけどね。
>>523
一番困るのは、printf()とscanf()の書式指定を「同じモノ」として
説明している入門書だったりするのであなたは運がよかったと思います。
0528デフォルトの名無しさん
2006/02/02(木) 20:57:53そこで atoi なんか使ったら説得力ないでしょうが
ね、だから気休めの域を出ないって言うのよ
0529デフォルトの名無しさん
2006/02/02(木) 21:01:030530デフォルトの名無しさん
2006/02/02(木) 21:04:230531デフォルトの名無しさん
2006/02/02(木) 21:07:03scanf なら1回で済むね
0532>>447=>>448=>>452
2006/02/02(木) 21:07:24>どうやら話が循環したようだな
漏れに関しては「main()に処理を全部詰め込んだ方が分かり難い」と感じます。
初期化部分とメインループと終了処理ぐらいは.ファイルを分割して分かり易い状態で保存してる
>>480
>この前のポインタの時も分かったというレスに対して「分かっていない」→結果「分かっていた」んだが同一人物なのか?
>こう説明したがりの上から目線の。
>普段職場で「分かっていない」と上司にこき使われてるそれらの反動かな
そんな気ガス。。
0533>>447=>>448=>>452
2006/02/02(木) 21:13:23同一人物かどうかわからないけど>>519はいい香具師そう
0534デフォルトの名無しさん
2006/02/02(木) 21:14:15う〜ん場合にとっては配列MAXまで読み込まないほうが処理手抜きできると思うのだよね
0535481
2006/02/02(木) 21:24:58あ、なるほど
この場合戻り値は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等を調べてみます
0536デフォルトの名無しさん
2006/02/02(木) 21:42:12A /= 5
ってどういう意味ですか?割ってるのに=?・・・
0537デフォルトの名無しさん
2006/02/02(木) 21:44:43A /= 5は A = A / 5と一緒
0538481
2006/02/02(木) 21:53:48char x;
fgets(x,sizeof(x),stdin);
i = atoi(x);
で、エラー文をiの値が1,2,3以外のときは数字が違うと言うエラー
0539デフォルトの名無しさん
2006/02/02(木) 21:56:33なるほど〜、どうもありです。
てか中途半端に略せるの止めてほしいなぁ・・・
i=i+1 → i++
とかだってたった2文字だけじゃん
そんなところで時間省けても、プログラム考えるのに何時間とかかるんだから意味なくない?
0540デフォルトの名無しさん
2006/02/02(木) 21:58:44視野が狭いな
0541デフォルトの名無しさん
2006/02/02(木) 22:00:56まだ初心者なんですんません・・・
0542デフォルトの名無しさん
2006/02/02(木) 22:01:11int a[N];
a[rand()%N] /= 2;
と
a[rand()%N] = a[rand()%N] / 2;
が等価でないことは分かるか?
0543デフォルトの名無しさん
NGNG変数名が
jugemu.jugemu.goko.no.surikire.kaijari.suigyo.no.fuuraimatsu.suiraimatsu.unraimatsu
だったら84文字の節約になるよ。
0544デフォルトの名無しさん
2006/02/02(木) 22:03:00分からないです・・・
ちなみにあなたの言いたいことも分からないです・・・
0545デフォルトの名無しさん
2006/02/02(木) 22:04:020546デフォルトの名無しさん
2006/02/02(木) 22:04:03アルファベットだけで大文字、小文字あわせて54個あるのに長くする意味あるんですか?
0547デフォルトの名無しさん
NGNGまず数の数え方から勉強した方がいいのではないかと…
0548デフォルトの名無しさん
2006/02/02(木) 22:09:21int n;
n = rand() % N;
a[n] = [n] / 2;
こうならa[rand()%N] /= 2;と等価。
[]の中に副作用のある式を書かれたら今度こそ説明が付かないけれど。
>>544
ようするにrandは毎回ランダムな数を返すから、
a[rand()%N] = a[rand()%N] / 2;では=の右辺と左辺で異なる要素を扱うことになってしまう。
0549デフォルトの名無しさん
2006/02/02(木) 22:19:02おまえ CPU がどうやって動いているか一回勉強しろ.
> i=i+1 → i++
の i++ ってのは, CPU の物によったら 1命令.
今のコンパイラは, 最適化がそこそこ頑張ってくれるが,
昔のコンパイラは i = i + 1 と i++ だと計算時間が
違う奴が結構いた.
そもそも C を高級言語と思うな!
せいぜい, 高級アセンブラだぞ...
0550デフォルトの名無しさん
2006/02/02(木) 22:21:27CISC のアセンブラ知らねー奴に後置++ の説明は一苦労だな
0551デフォルトの名無しさん
2006/02/02(木) 22:23:26++演算子については文字数の問題ではない。
a = b++;
と
a = ++b;
は違う。
ポインタ変数が絡むと更に違う。
0552デフォルトの名無しさん
2006/02/02(木) 22:23:39と
inc ax
の違いだな。
0553デフォルトの名無しさん
2006/02/02(木) 22:24:220554デフォルトの名無しさん
2006/02/02(木) 22:27:09それらは人間がキーを打つのを楽するためではなく、コンパイラが楽をするためのもの。
それに加えCはかなり低レベルな言語であり、つまりかなりCPU寄りな言語であるという事情も絡んでいる。
大抵のCPUは加算・減算とは別にインクリメント・デクリメントの命令を持っていて、
最適化技術が貧弱だった昔のCコンパイラでは++と--の演算子を使わないと、
そのインクリメント・デクリメントの機械語にコンパイルしてくれないという事情があった。
(現代のコンパイラならこの心配は要らない。i = i + 1;もi++;も同じコードを作る)
さらに大抵のCPUの命令は2オペランド。
「〜に―を加える」というような命令はあっても「〜にー + …の結果を代入する」という命令を持っているCPUは少ない。
これもやはり最適化技術が貧弱だった昔はa = a + 4よりも
直接前者の命令に当てはめられるということでa += 4のような複合代入演算子が作られた。
(これも現代のコンパイラなら心配は要らない。a = a + 4;もa += 4;も同じコードを作る)
ただ、最適化でどうせ同じになるからと++や+=を使えるのに敢えてa = a + 4;などと書くようでは
「郷に入っては郷に従え」という言葉を知らないただの馬鹿。
0555デフォルトの名無しさん
2006/02/02(木) 22:28:440556デフォルトの名無しさん
2006/02/02(木) 22:28:51初めて知った時 a += 2 とかなんかとっつきにくかったし
0557デフォルトの名無しさん
2006/02/02(木) 22:29:37なかった気がする
つーかそんくらい自分でやってください
0558デフォルトの名無しさん
2006/02/02(木) 22:30:30>>539の例に出している単なる1加算の場合は
中途半端な略と思うのも分かるなぁと
0559デフォルトの名無しさん
2006/02/02(木) 22:30:45ttp://www.dd.iij4u.or.jp/~okuyamak/Information/xor_fixed_swapping.html
0560デフォルトの名無しさん
2006/02/02(木) 22:31:450561デフォルトの名無しさん
2006/02/02(木) 22:35:46たったの3種類[1.2.3.]なら数字に変換する必要ないだろう
if文に直で'1''2''3'を判定すればすむじゃないか
0562デフォルトの名無しさん
2006/02/02(木) 22:36:51私は逆だったな。"aに2を足す。"と読めるんで、"aはaに2を足したものとする"よりわかりやすかった。
0563デフォルトの名無しさん
2006/02/02(木) 22:46:11つかそれ、何入れてもx=='\0'
0564デフォルトの名無しさん
2006/02/02(木) 22:50:51C だとマクロ使わないとこの手の汎用ルーチンは作れないね。
#define swap(type, a, b) do { type C_ = (a); (a) = (b); (b) = C_; } while(0)
0565デフォルトの名無しさん
2006/02/02(木) 22:50:590566デフォルトの名無しさん
2006/02/02(木) 22:53:40a += 2
これを見て,"aに2を足す。"と読めるなんてお前天才だなwww
シグマの求め方は、"aはaに2を足したものとする" って考えていくんだから、分かりにくいってよほど最初に習わないと無理だろ
0567デフォルトの名無しさん
2006/02/02(木) 22:57:45一番後ろの文字が違う
0568デフォルトの名無しさん
2006/02/02(木) 22:58:06あ、そうなんですか
文字として1,2,3が認識されると思ってたんですが数字の1も文字の1も一緒なんですね(?)
って・・・悪魔のささやきってメル欄にあるのですが・・。
>>563
x[2]にしないといけないって事ですか?
0569デフォルトの名無しさん
2006/02/02(木) 23:00:13文字として判定せーよ
同じじゃないよ
0570デフォルトの名無しさん
2006/02/02(木) 23:01:28文字と文字配列の違いが分からないなら絶対やるなよ
0571デフォルトの名無しさん
2006/02/02(木) 23:01:461や2や3は数値。
'1'や'2'や'3'は文字。
0572デフォルトの名無しさん
2006/02/02(木) 23:02:180573デフォルトの名無しさん
2006/02/02(木) 23:02:43fgetsの2番目の引数は引数-1まで読んで最後の\0だ
1-1はいくつだ
0574デフォルトの名無しさん
2006/02/02(木) 23:03:440575デフォルトの名無しさん
2006/02/02(木) 23:18:47こういう場合、int hoge[100] みたいなスタック領域を破壊することはありますか?
ヒープ領域とスタック領域とあるので領域が別?とか考えるのは間違いでしょうか?
0576519他
2006/02/02(木) 23:21:19なんだかよく判らんけど、ありがと♪
>>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がよきに計らってくれるのであんまり意識しなくてもいい。
但し、繰り返し処理で毎回確保するようだといつかメモリが足りなくなる。
0577デフォルトの名無しさん
2006/02/02(木) 23:21:29確保できなきゃNULL返るだけだし
0578デフォルトの名無しさん
2006/02/02(木) 23:27:26どのように「よきに計らって」くれるのかをきちんと調べておくことが大切
そのソースが将来移植される全ての処理系をいま予測する必要がある
main という実行環境とのインターフェイス部分で問題処理までやるからそうなるんだよ!
0579デフォルトの名無しさん
2006/02/02(木) 23:27:52メカ制御を行うファームウェアを作っています。
そんな俺も春で3年目。
仕事も落ち着いたので、もう一歩ステップアップするための書籍を探しています。
お勧めはありますか?
とりあえず、今はITRONやSHなどのマイクロ関係の本を読んでますが、
Cでよい本があれば教えてください。
0581デフォルトの名無しさん
2006/02/02(木) 23:33:05そこから上は尻に火がつかないと・・・
とりあえずハードも憶えるあたりからじゃないか?
とりあえずで済むような甘い相手じゃないが
0582デフォルトの名無しさん
2006/02/02(木) 23:38:28実は、スタック破壊起こしてますね〜みたいな話をされてる
方がいたんですが、どういう場合にスタック破壊がおこるのでしょうか?
str = malloc(10)とかやってmemcpy(str, hoge,11)とかをやってしまった場合
スタックを破壊する可能性はあるんでしょうか?
0583初心者の嘆きを聞いてくれ
2006/02/02(木) 23:38:42ってやつ(結局はC言語超初心者向け講座らしい)
サンプルプログラムのスペースが 全 角 になってやがる。。。
おかげでHelloWordでつまづくところだった。
0584481
2006/02/02(木) 23:39:29scafの代用として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はまだまだ分かりきれてないようです・・勉強します。
0585デフォルトの名無しさん
2006/02/02(木) 23:42:210586デフォルトの名無しさん
2006/02/02(木) 23:48:19それはmallocの問題じゃないと思うが
0587デフォルトの名無しさん
2006/02/02(木) 23:58:38malloc云々は関係ないですね。
確保した領域をオーバーして書き込んでしまった場合、
そのアドレスがスタック領域であった場合、破壊してしまう事になるんでしょうか
0588デフォルトの名無しさん
2006/02/03(金) 00:01:18大抵のコンパイラが吐くコードならスタック領域では無い
0589デフォルトの名無しさん
2006/02/03(金) 00:02:44「インクリメント/デクリメント演算子は
*--sp = x --> push x
x = *sp++ --> pop x
したかったので導入した」
ってのを Usenet だか IEEE だかの論文か何かで
読んだ記憶が...
0590519他
2006/02/03(金) 00:15:20>配列は戻したあと受け取られてないんですか?これ・・。
・main()のaは関数から戻ってきたのではない。
main()のaの内容が書き換わっているのは、main()のaの場所を関数に教えて
そこを関数が書き換えているから。
・関数の戻り値の型がintなのに配列は戻せない。
だから、return a;ではエラーが出る。当然だ。
例えばa[0][0]なら返せるが、それは配列ではなく、只の整数値だ。
・そもそも呼び出し側で受け取っていない。
受け取るには、例えば int foo = PLAYER(a);などとする必要がある。
配列は関数に渡せない。渡しているのはその場所(即ちポインタ)のみ。
逆に、場所を渡しているから関数から書き換え可能となっている。
関数の引き数と戻り値の仕掛けについて、もっと単純な関数で色々試してみることをお勧めしておく。
0591デフォルトの名無しさん
2006/02/03(金) 00:20:22ではスタック破壊とはどういった時におきるんでそう(?_?)
コンパイラはなんだか分からないんですが、組込み系の処理なですが、。
0592デフォルトの名無しさん
2006/02/03(金) 00:45:42mallocでスタック破壊といった人間にきけば?
0593デフォルトの名無しさん
2006/02/03(金) 00:54:55なるほど・・そういうことだったんですね
じゃあ書き換えは関数内でやって関数自体はvoidでいいですね、勉強になりました。
0594デフォルトの名無しさん
2006/02/03(金) 01:13:19{
int i;
(&i)[32] = 0;
}
呼び出し側のスタックとか、
返りアドレス上書きするとスタック破壊になると思う。タヴン。
呼んだのとは違う場所に帰ったりさせると面白い。
0595デフォルトの名無しさん
2006/02/03(金) 01:45:150596デフォルトの名無しさん
2006/02/03(金) 01:50:370597デフォルトの名無しさん
2006/02/03(金) 01:52:09で上手く連結することができるのですが、これで文字列の比較をしようとするときに、
while(*s1++ == *s2++){ if(*s1 == '\0') printf("等しいです"); とやったのですが、
これだと違う文字列を比較したときにも「等しいです」。
とでてしまうのですが、これは何でこうなるのでしょうか?
どなたか教えて頂けると助かります<(_ _)>
0598デフォルトの名無しさん
2006/02/03(金) 02:00:49素直に分かりやすく書け。
どうせ最適化が効いてパフォーマンス変わらん。
0599デフォルトの名無しさん
2006/02/03(金) 02:01:13s1="A";
s2="AB"とする
最初の比較で*s1++==*s2++は真なのでwhileに入る。
次にs1をインクリメントしたので*s1=='\0'なのでif文が真になって等しいですと表示。
というかstrcmp使え
0600デフォルトの名無しさん
2006/02/03(金) 02:06:16>599さんありがとうございます<(_ _)>
文字を格納後、格納先が真か偽か判断ということでいいんですね!
本当に助かりました。ありがとうございます!
0601デフォルトの名無しさん
2006/02/03(金) 02:52:43{ は ; のtypo?
同じ文字列だと末尾の'\0'も等しいから、その先に行っちゃうぞ。
0602デフォルトの名無しさん
2006/02/03(金) 04:00:23struct TEST {
char *name;
int age;
} a,b,; //宣言する時はここ
main()
{
struct TEST c; //追加する時はここ
とする方法と
typedef struct{
char *name;
int age;
} TEST;
main()
{
TEST,a,b,c; //まとめて宣言と追加
とする方法、どちらがメジャーで使いやすいのでしょうか?
0603デフォルトの名無しさん
2006/02/03(金) 04:02:450604デフォルトの名無しさん
2006/02/03(金) 07:50:390605デフォルトの名無しさん
2006/02/03(金) 10:44:39どちらもコンパイルエラーとなる訳だが
0606デフォルトの名無しさん
2006/02/03(金) 10:48:53前者と後者は等価でない事を判っているのか?
0607デフォルトの名無しさん
2006/02/03(金) 10:54:38あの、自分のコンピュータから同じネットワーク内にあるコンピュータのファイルを見れるようなコマンドありませんか?
0608607
2006/02/03(金) 10:56:400609デフォルトの名無しさん
2006/02/03(金) 11:03:520610デフォルトの名無しさん
2006/02/03(金) 11:12:17板違い
0611デフォルトの名無しさん
2006/02/03(金) 11:13:49あーゆー事を人に訊くくらいだから
解ってないんでしょう。
0612デフォルトの名無しさん
2006/02/03(金) 16:38:33ls
0613デフォルトの名無しさん
2006/02/03(金) 16:44:380614デフォルトの名無しさん
2006/02/03(金) 16:46:34自動変数のバッファオーバーランの時。
例: void func() { char s[1]; s[2] = '\0'; }
でも、これも自動変数をスタックに作らないコードを作る
コンパイラだったらスタックは破壊されない。(破壊する
ことには代わりはないが、別の場所が壊れる)。
ところでなんで未だにリターン値を入れるスタックに自動変数を
作るようになってるんだろう? 高速だから? 互換性の問題?
スタック代りになる別レジスタ作ってコンパイラをそれに合わせ
ればもっと安全になるのに。
0615デフォルトの名無しさん
2006/02/03(金) 17:20:46File関連、メモリ関連の標準関数で使用されるのは解ったのですが、
実際に関数を自作する時に「関数の戻り値がポインタとなる」場合、
または、そうする事により便利になる場合というのは、
どのような時なのですか?
0616デフォルトの名無しさん
2006/02/03(金) 17:36:04FILEのように、具体的な処理内容を隠蔽した関数群を作る際に。
0617デフォルトの名無しさん
2006/02/03(金) 17:36:09ここって、研究室の先輩とか教授とかより頼りになるよ。
おれの研究室終わってる。
0618デフォルトの名無しさん
2006/02/03(金) 17:50:520619デフォルトの名無しさん
2006/02/03(金) 17:52:350620デフォルトの名無しさん
2006/02/03(金) 17:59:12C言語でオブジェクト指向風に作る時。FILE関係はその例でもある。
0622デフォルトの名無しさん
2006/02/03(金) 18:17:36読んでみると面白いかも。使うのどうかと思うが。
C 言語によるオブジェクト記述法 COOL
ttp://www.sage-p.com/process/cool.htm
0623デフォルトの名無しさん
2006/02/03(金) 18:32:07オブジェクト指向じゃなく、単なるカプセル化だな。
0624デフォルトの名無しさん
2006/02/03(金) 18:39:00オブジェクト指向「風」ってことだよ。
X Window System の Xlib もそんな感じだな。
0625デフォルトの名無しさん
2006/02/03(金) 18:41:17昔はC++ってCに変換してからコンパイルしてたからな
C++に出来てCに出来ないことはなかった。
あの凶悪な「テンプレート」さえなければ
0626デフォルトの名無しさん
2006/02/03(金) 19:16:50だったから大丈夫。
0627デフォルトの名無しさん
2006/02/03(金) 19:31:070628デフォルトの名無しさん
2006/02/03(金) 20:01:54#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
0629デフォルトの名無しさん
2006/02/03(金) 20:03:05#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;
}
0630デフォルトの名無しさん
2006/02/03(金) 20:59:35テンプレートありのC++ソースをCに機械的に変換することは可能だと思うが。
ていうか、どんな言語からでも変換可能では? 実際に実装があるかどうかは
別として。アセンブリ言語に変換できてCに変換できないわけがないと思うが。
0631デフォルトの名無しさん
2006/02/03(金) 21:15:53int 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;
}
と言うプログラム作ったんだが
これって俺が思ってるよりも危険?
0632デフォルトの名無しさん
2006/02/03(金) 21:20:420633デフォルトの名無しさん
2006/02/03(金) 21:34:55オマエは ネ 申
0634デフォルトの名無しさん
2006/02/03(金) 21:39:16は秤ス考えてんだ、俺orz
0635デフォルトの名無しさん
2006/02/03(金) 21:51:480636デフォルトの名無しさん
2006/02/03(金) 22:03:22ちょwwwwwwwwwwおまwwwwwwwwFortranww
もうダメポ
0637デフォルトの名無しさん
2006/02/03(金) 22:04:45どうやれば出来るんでしょうか。
↓こんな関数にある時は2個、ある時は3個の引数を与えたいんです。
void test(char *fmt, ...)
{
va_list ap;
va_start(fmt, ap)
...
}
0638デフォルトの名無しさん
2006/02/03(金) 22:17:17test("", a, b); /* 3個 */
0639637
2006/02/03(金) 23:06:122個、3個と限定せずに、ある時は2個、ある時は1000個と渡します。
if文で1000個分岐させるのもありかもしれませんが、C言語として
動的な引数を一つの関数呼び出しで行うことは可能なんでしょうか。
スタックを積むことが出来れば、可能なんでしょうが。
0640デフォルトの名無しさん
2006/02/03(金) 23:08:31ヒント:文字列の長さの場合はどうやっているか?
0641デフォルトの名無しさん
2006/02/03(金) 23:10:23まだ状況が分からん。
言葉だけじゃなくコードを交えて説明しちくり。
0642デフォルトの名無しさん
2006/02/03(金) 23:17:25可変個の引数を取る関数でググれば分かるはず
0643デフォルトの名無しさん
2006/02/03(金) 23:19:270644637
2006/02/03(金) 23:26:41int *number;
char *c;
/* これを前述のtest関数に渡す */
test(number[0], number[1], number[2]....);
こんな感じでどうでしょうか。
関数を作り直して配列で渡してしまえば、もちろんそれでいいのですが、
動的な数の引数を渡すことが、出来るか出来ないか知りたいので。
0645637
2006/02/03(金) 23:28:050646デフォルトの名無しさん
2006/02/03(金) 23:32:16わざわざ可変長で実装せず、void*の配列などで実装したほうがいいと思う。
printfを呼びたいんじゃぁってのなら、無理だが。
0647637
2006/02/03(金) 23:34:37自分で書いた物なので変更は可能ですが、色々な使い方を考えると
可変長の引数を取れた方がライブラリとして便利なので質問しました。
どうもありがとうございました。
0648デフォルトの名無しさん
2006/02/03(金) 23:42:43実際の可変長関数と、可変長引数を取る関数とをそれぞれ作っておいて
前者から後者を呼び出すってのも、ありかと思う
0649デフォルトの名無しさん
2006/02/03(金) 23:43:27○sprintf
0650デフォルトの名無しさん
2006/02/03(金) 23:49:570651デフォルトの名無しさん
2006/02/04(土) 00:37:281000 個とかなるとやめてくれと言うしか無いなぁ。
まあ、実際は 1000 個もはやらないんだろうけど。
0652デフォルトの名無しさん
2006/02/04(土) 02:01:32int *hoge = (int*)calloc(num ,sizeof(int));
このhoge配列が持つ要素の数を調べるにはどうすればいいでしょうか?
本来は把握するべきなのですが・・・
0653デフォルトの名無しさん
2006/02/04(土) 02:07:210654デフォルトの名無しさん
2006/02/04(土) 02:07:22記憶しておくこと
0655デフォルトの名無しさん
2006/02/04(土) 03:35:28webを見て翻訳を線引っ張って消して書き換えてみた訳だけども
索引もちょっと(贔屓目に見ても)わかりにくいし。。
本当に皆んなこの本読んでるんでしょうか?
0656デフォルトの名無しさん
2006/02/04(土) 03:35:590657655
2006/02/04(土) 03:37:460658655
2006/02/04(土) 03:47:030659デフォルトの名無しさん
2006/02/04(土) 04:21:130660デフォルトの名無しさん
2006/02/04(土) 04:44:300661デフォルトの名無しさん
2006/02/04(土) 05:35:36そうか?
そもそもC言語の文法なんて大した情報量じゃないんだから、
全部覚えて、記憶が怪しければK&Rを参照でいい。
0662デフォルトの名無しさん
2006/02/04(土) 06:03:23#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");
}
}
だったら、全部の数に素数ですと、素数ではありません、が出てしまいます。。
0663デフォルトの名無しさん
2006/02/04(土) 06:10:18やればいいんじゃない?
0664デフォルトの名無しさん
2006/02/04(土) 06:19:150665デフォルトの名無しさん
2006/02/04(土) 08:03:09あ、すいません
GUIでなくてCUIのプロンプト画面の方のことです
0666デフォルトの名無しさん
2006/02/04(土) 08:28:49消去しないで書き換えればよい。
標準Cではできないので、詳しくは適切なスレで聞きなおしなさい。
0667デフォルトの名無しさん
2006/02/04(土) 08:31:35ええと・・・どこで・・・
0668デフォルトの名無しさん
2006/02/04(土) 08:47:32WindowsならWin32APIのスレ、DOSならDOSのスレがある。
0669デフォルトの名無しさん
2006/02/04(土) 08:48:24どのようにすれば良いですかね?
0670デフォルトの名無しさん
2006/02/04(土) 08:51:190671デフォルトの名無しさん
2006/02/04(土) 08:54:58ありがとうございます
0672デフォルトの名無しさん
2006/02/04(土) 09:12:55その場合はfnameはFILE構造体で宣言して良いのですかね?
fopenしてfnameのポインタを代入してないから、なんかおかしい気がするんですが。
0673デフォルトの名無しさん
2006/02/04(土) 09:19:46sprintfだ
0674デフォルトの名無しさん
2006/02/04(土) 09:20:150675デフォルトの名無しさん
2006/02/04(土) 09:26:55次に読むおすすめの本ありませんか?
どれが良書かよくわからなくて(汗
まだ初めて一週間くらいですが本の内容はいちお理解しました
0676デフォルトの名無しさん
2006/02/04(土) 09:49:071) K&R、655が読みにくいと言っているが気にスンナ
2) C言語ポインタ完全制覇:冬休みに斜め読みしただけだかニヤニヤしながら読める本だ
0677デフォルトの名無しさん
2006/02/04(土) 09:53:14ありがとうございます
休み中に買って読んでみます。
0678デフォルトの名無しさん
2006/02/04(土) 09:54:210679デフォルトの名無しさん
2006/02/04(土) 10:00:32教えて下さい。
メモリ上の話なんですが、
int A = 100 ;
って変数宣言した時、メモリ上にint型でAの領域を確保して、その箱の中に100という値を格納するは分かるのですが、
その確保した領域に対して「ここがAだ!」という情報を格納しているのはメモリのどこに存在するのですか?
よろしくお願いします。
0680デフォルトの名無しさん
2006/02/04(土) 10:11:15そのどちらも存在するとは限らない。
そもそも関数内のローカル変数かどうかでも違うし、最適化によって変数そのものが消えるかもしれない。
0681デフォルトの名無しさん
2006/02/04(土) 10:22:43>その確保した領域に対して「ここがAだ!」という情報を格納しているのはメモリのどこに存在するのですか?
「その箱の中に100という値を格納する」命令自体は、
メモリのどこに格納されているか知っているか?
0682デフォルトの名無しさん
2006/02/04(土) 14:58:360683679
2006/02/04(土) 15:09:26グローバル変数でもローカル変数でもいいので教えていただけませんか?
>>681
存じておりません…
>>682
exeの中ってことですか?
自分がアホさに情けなくなってきます…('A`)
0684デフォルトの名無しさん
2006/02/04(土) 15:18:36アセンブリでも覚えれば全て氷解
0685デフォルトの名無しさん
2006/02/04(土) 15:24:42そもそも、なぜ、変数のアドレスがどこに格納されてるかを知りたいか?
0686デフォルトの名無しさん
2006/02/04(土) 15:25:41おそらくコンパイルされた後にはそのような情報は跡形もない。
強いて言えば名前ではなくアドレスを使っているとでも言えばよいか。
0687デフォルトの名無しさん
2006/02/04(土) 16:02:461. 静的な変数の場合
命令部にアドレスが直接埋め込まれている。
ただし、実行ファイルの状態では実行時の実際のアドレスにはなっておらず、
実行ファイルをメモリ上にロードする際に実際のアドレスに書き換えられる。
2. スタック上に確保される変数の場合(非静的内部変数)
スタックのアドレスからのオフセット(ずれ)として命令部に直接埋め込まれている。
実際のアドレスは、スタックのアドレスにオフセットを加減する事により得られる。
スタックのアドレスは、その関数が呼ばれる場所により変化するので、
具体的なアドレスを実行前に決定することはできない。
スタックのアドレスはレジスタに入れられている。
3. 最適化により A がレジスタになった場合
4. 最適化により A が消去され、100 が直接使われる場合
アドレスは存在しない。
まあ、アセンブリ言語勉強するのが手っ取り早い。
0688デフォルトの名無しさん
2006/02/04(土) 16:08:25いあいあ、ラディカルな考え方を継続できるなら大物になれるよ
0689デフォルトの名無しさん
2006/02/04(土) 16:35:07書いてたのですがいつもdoubleじゃダメなんですか。
0690デフォルトの名無しさん
2006/02/04(土) 16:42:26変数名からその内容を参照することのできるデバッガならAがどこにあるかということを把握しているだろう。
>>689
むしろいつもdoubleが一般的。
floatは浮動小数点数版shortのような存在。
0691デフォルトの名無しさん
2006/02/04(土) 16:43:180692デフォルトの名無しさん
2006/02/04(土) 16:53:250693デフォルトの名無しさん
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関数はどこに定義されてるのですか?初心者ですみません。
0694デフォルトの名無しさん
2006/02/04(土) 17:02:580695デフォルトの名無しさん
2006/02/04(土) 17:08:58int main(int argc, char *sa[])
あとatoiはprintfなどと同じ標準関数。<stdlib.h>の中で宣言されている。
0696693
2006/02/04(土) 17:14:00無理でした。「パラメータ 'argc' は一度も使用されない(関数 main(int,char * *) 」)というエラーメッセージ
がでてきました。でもatoi関数についてはありがとうございます。というかそもそもコマンドライン引数と言うのは
何なんですか?
0697デフォルトの名無しさん
2006/02/04(土) 17:18:55このままエラーと警告の区別つかないまま頑張ってください。
0698デフォルトの名無しさん
2006/02/04(土) 17:19:11エラーと警告の区別くらい付けてから出直しましょう。
0699デフォルトの名無しさん
2006/02/04(土) 17:20:56おとといになりましたらお越しください。
0700693
2006/02/04(土) 17:21:34すいませんでした。
無理でした。「パラメータ 'argc' は一度も使用されない(関数 main(int,char * *) 」)という警告がでてきました。
でもatoi関数についてはありがとうございます。というかそもそもコマンドライン引数と言うのは何なんですか?
0701デフォルトの名無しさん
2006/02/04(土) 17:25:30C言語 コマンドライン 引数
0702デフォルトの名無しさん
2006/02/04(土) 17:35:53糞汁で洗顔してからおいでください
0703デフォルトの名無しさん
2006/02/04(土) 17:40:03イマイチおもしろみに欠けるなあ・・・
0704デフォルトの名無しさん
2006/02/04(土) 17:41:120705デフォルトの名無しさん
2006/02/04(土) 17:45:47↓
パソコン使用中
↓
今時ネットにも繋げない環境の方が少ない気が
↓
グーグル先生登場
0706デフォルトの名無しさん
2006/02/04(土) 17:51:310707デフォルトの名無しさん
2006/02/04(土) 18:10:440708デフォルトの名無しさん
2006/02/04(土) 18:11:170709679
2006/02/04(土) 18:21:32ちょっと分かったような気もしますが、いまいち納得いってない部分もあるので
アセンブラを勉強してきます。
>>685
思いつきで気になったことがあったら、完全に理解するまで気になってしょうがない性格でして…
それでは。
0710デフォルトの名無しさん
2006/02/05(日) 01:27:48アセンブラとコンパイラ+リンカーを勉強すればわかるでしょう。
int A = 100;
機械語ではAという情報は存在しません。すべてはアドレスに変換されます。
例)適当な機械語ですけどw
MOV 0x5012ab4, 100 ;0x5012ab<-100 0x5012ab4はAのアドレス
0711デフォルトの名無しさん
2006/02/05(日) 01:52:30その他、効率のいいコード悪いコードというのもよく見えてくるようになる。
0712デフォルトの名無しさん
2006/02/05(日) 02:03:27外部結合を持つ変数の場合はリンカへの入力となるオブジェクトファイル内
外部結合を持たない変数の場合はコンパイラのヒープ内に保持されている
いずれにせよ実行時には A などというシンボル情報は完全に取り除かれ
単に「何番地」という呼び方になっている
このおかげで、
int A;
main()
{
A = 100;
}
と
int B, A;
main()
{
A = 100;
}
で実行時間に差が出る可能性を考慮する必要がない
(シンボル情報を参照していれば、B をスキップする時間が必要)
0713デフォルトの名無しさん
2006/02/05(日) 12:50:080714デフォルトの名無しさん
2006/02/05(日) 12:53:270715デフォルトの名無しさん
2006/02/05(日) 19:09:550716デフォルトの名無しさん
2006/02/05(日) 19:12:12文脈によって異なる。
が、このスレで聞くということから推論するとたぶん素数
0717デフォルトの名無しさん
2006/02/05(日) 19:16:150718デフォルトの名無しさん
2006/02/05(日) 19:30:180719デフォルトの名無しさん
2006/02/05(日) 20:15:560720デフォルトの名無しさん
2006/02/05(日) 20:25:260721デフォルトの名無しさん
2006/02/05(日) 20:26:510722デフォルトの名無しさん
2006/02/06(月) 00:02:400723デフォルトの名無しさん
2006/02/06(月) 00:13:47扉閉めないとすぐ怒鳴ります。なんとかしてください。
0724デフォルトの名無しさん
2006/02/06(月) 00:18:510725デフォルトの名無しさん
2006/02/06(月) 00:54:16一緒にするな
0726デフォルトの名無しさん
2006/02/07(火) 11:43:56main()
{
int i = 1;
printf("%d\n", i);
return 0;
}
65535以下の数値を使う場合unsigned shortを使うように心掛けて
長いソースの中でメモリを節約していく事が綺麗なソースと言うことですか?
0727デフォルトの名無しさん
2006/02/07(火) 11:52:01int型の46を1/100にしたdouble型の0.46に精度を損なわずに変更するにはどうすればよいですか?
0728デフォルトの名無しさん
2006/02/07(火) 11:52:14それとも、関数本体に付ければいいんですか?
0729デフォルトの名無しさん
2006/02/07(火) 12:17:14typedef base100 long
base100 hoge = 46;
0730デフォルトの名無しさん
2006/02/07(火) 12:32:16チガウヨ
0731デフォルトの名無しさん
2006/02/07(火) 12:55:14いえ、型のサイズに依存するならそれ用のヘッダを使ってください。
#include<stdint.h>
uint_fast16_t
# とか言えるようにC99が早く一般的になってくれー
# 自前で定義するの面倒だよー
0732デフォルトの名無しさん
2006/02/07(火) 13:16:36long
double
short
使い分けがわからねええええええええええええええええええええ!!!!
おっぱん的な使い方を教えてくださいm(_ _)m
0733デフォルトの名無しさん
2006/02/07(火) 13:19:250734デフォルトの名無しさん
2006/02/07(火) 13:39:00理解を急ぎすぎたようなので勉強してきます。
ありがとうございました。
0735デフォルトの名無しさん
2006/02/07(火) 14:09:57C-FAQ 1.1どの整数型を使えばよいか、どうやって決めればよいか。
の答えを256回読め
0736デフォルトの名無しさん
2006/02/07(火) 14:38:57Eclipse+CDT
値段を考えないとするとどちらの開発環境が良いですか?
経験者の方、メリットデメリットで教えてください。
0737デフォルトの名無しさん
2006/02/07(火) 14:42:31ここで聞くな。
0738デフォルトの名無しさん
2006/02/07(火) 14:44:44あざーす
0739デフォルトの名無しさん
2006/02/07(火) 14:50:300740デフォルトの名無しさん
2006/02/07(火) 15:12:22いろいろ仕様が不明だ
0741デフォルトの名無しさん
2006/02/07(火) 15:13:39> 長いソースの中でメモリを節約していく事が綺麗なソースと言うことですか?
メモリの節約と綺麗なソースは、
全 く 別 の 問 題 だ!
0742デフォルトの名無しさん
2006/02/07(火) 15:16:360743デフォルトの名無しさん
2006/02/07(火) 15:19:27alignmentのことを考えると1byteも節約出来てないのに、
速度だけ遅くなったとかありえるからなぁ。
0744728
2006/02/07(火) 15:28:050745デフォルトの名無しさん
2006/02/07(火) 15:29:35いいよ#includeなんて書かないで
0746デフォルトの名無しさん
2006/02/07(火) 15:31:55>>728のどこにincludeと書かれているのか?と(ry
0747デフォルトの名無しさん
2006/02/07(火) 15:34:10やべぇincludeと読み間違えたorz
ブラウザの文字の大きさ変えようかな
0748デフォルトの名無しさん
2006/02/07(火) 15:43:38標準Cには、inlineなんて無いよ。
0749デフォルトの名無しさん
2006/02/07(火) 15:46:42(,,゚Д゚)∩先生C99は標準Cじゃないんでしょうか
0750デフォルトの名無しさん
2006/02/07(火) 15:50:52近づいてはなりません
あんなんCと認めません
0751デフォルトの名無しさん
2006/02/07(火) 15:59:55規格書のど頭にそう書いてあります
誰が認めようが認めまいが、標準化委員会が一番偉いんだから仕方ありません
みんなあきらめて非標準Cを使いましょう
0752デフォルトの名無しさん
2006/02/07(火) 16:48:390753デフォルトの名無しさん
2006/02/07(火) 16:49:56ガンダム
0754デフォルトの名無しさん
2006/02/07(火) 16:56:50正解
0755デフォルトの名無しさん
2006/02/07(火) 17:01:12time_t t = mktime(&(struct tm){.tm_year = year, .tm_mon = 0, .tm_mday = 1});
C99 なんてキモいだけだよね。
0756デフォルトの名無しさん
2006/02/07(火) 18:15:50いや、それぐらいは可愛いもんだ。
一番まずいのは、alloca を無理にでも
標準化しようとしたために起こった
可変長配列の扱いの汚さ。
0757デフォルトの名無しさん
2006/02/07(火) 18:17:140758デフォルトの名無しさん
2006/02/07(火) 18:19:30みんな非標準Cを使おうでFA?
0759デフォルトの名無しさん
2006/02/07(火) 18:28:20便利でお得ならば使う。
そうでなければ使わない。
それだけ。
正直、使用する価値がいまいち見えないんだよな。
0760デフォルトの名無しさん
2006/02/07(火) 18:30:320761デフォルトの名無しさん
2006/02/07(火) 18:41:05void func(void *base, int nmemb, int size, /* ... */) {
char (*work)[size] = base;
for (int i = 0; i < nmemb; i++) {
work[i]をあれこれ
}
}
みたいな感じで使うと便利かもしれないような気がしないでもない。
0762デフォルトの名無しさん
2006/02/07(火) 18:52:26だが、これだけなら C++ を better C として使った方が・・・。
0763デフォルトの名無しさん
2006/02/07(火) 19:00:540764デフォルトの名無しさん
2006/02/07(火) 19:15:20で、そうやって規格を拡張した結果がこれか?
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) のように [*] という記述方法を使用することでそのエラーを回避することができるのです。
まさに泥沼・・・
0765デフォルトの名無しさん
2006/02/07(火) 19:46:07staticが場所によってリンケージを指定したり記憶域期間を指定したり、
voidの意味が3通りあったり
負数同士のわり算が未定義とか
泥沼じゃない仕様なんてCじゃない、ということでFA。
0766デフォルトの名無しさん
2006/02/07(火) 20:09:28割り算のは処理系定義。
ちなみにC99で改善された。
0767デフォルトの名無しさん
2006/02/07(火) 20:13:30両方が負数の場合は未定義
だったと言ってる人がいる
ttp://forums.belution.com/ja/cpp/000/048/94.shtml
0768デフォルトの名無しさん
2006/02/07(火) 20:40:12この悪しき優先順位はJavaにも継承されてしまった...
0769デフォルトの名無しさん
2006/02/07(火) 20:58:29Javaで直されたらかえって混乱するだろうから仕方がなかったのだろう。
0770デフォルトの名無しさん
2006/02/07(火) 20:58:46か迷ってます。
数値計算とアルゴリズムに興味があって
図書館でみた、奥村先生のC言語最新アルゴリズム事典が面白そうだったん
ですけど、これって改訂版とかはでてないですか?本屋で探しても、初版
しか置いてなかったんですけど。
あと、Art of なんたらかんたらにも挑戦してみたいです。
0771デフォルトの名無しさん
2006/02/07(火) 21:07:310772デフォルトの名無しさん
2006/02/07(火) 21:46:35スレ違い
推薦書スレ行け
0773デフォルトの名無しさん
2006/02/08(水) 00:40:26インターネットで検索して調べりゃいいじゃん。
0774デフォルトの名無しさん
2006/02/08(水) 00:44:14ttp://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
だそうです。
どんな感じでしょうか?
0775デフォルトの名無しさん
2006/02/08(水) 00:58:18処理系はオリジナルのyacc?bison?
0776デフォルトの名無しさん
2006/02/08(水) 01:03:14iBookのFreeBSDにデフォルトで入っているyaccだから、
たぶんオリジナルだと思います。
0777デフォルトの名無しさん
2006/02/08(水) 01:09:160778デフォルトの名無しさん
2006/02/08(水) 01:15:01char *str;
char ch;
}
とかやっているんですが、
それとは別にYYSTYPEも#defineしないとまずいんでしょうか?
0779デフォルトの名無しさん
2006/02/08(水) 01:18:56オプションで -d をつけるのを忘れていましたorz
0780デフォルトの名無しさん
2006/02/08(水) 02:48:03X,Y,Zの一番大きい値を定義するdefineを書く方法ってないでしょうか?
0781デフォルトの名無しさん
2006/02/08(水) 03:10:42こんなん?
0782デフォルトの名無しさん
2006/02/08(水) 03:17:030783デフォルトの名無しさん
2006/02/08(水) 03:36:36こういうMAXが欲しいということか?
#define MAX max(max(X, Y), Z)
0784デフォルトの名無しさん
2006/02/08(水) 04:14:030785デフォルトの名無しさん
2006/02/08(水) 08:58:03char *ch;
ch = "now is the time";
この文でしたら、文字'w'へアクセスするにはch[3]になる訳ですが、本体は
ch[0] = 'n'
ch[1] = 'o'
ch[2] = 'w'
という順に格納されているのでしょうか?
0786デフォルトの名無しさん
2006/02/08(水) 09:03:04char ch;
では扱えなくて、文字列として使用するならば、配列として扱われる。で、合ってます?でしょうか
0787デフォルトの名無しさん
2006/02/08(水) 09:13:21質問攻めですいません。
0788デフォルトの名無しさん
2006/02/08(水) 09:15:450789デフォルトの名無しさん
2006/02/08(水) 09:48:01となってメモリ中に置かれ、その領域の先頭へのポインタとなる。
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 変数一つで扱えるかも
知れない(しかしそれに期待して書かれたプログラムは移植性がなくなる)。
0790デフォルトの名無しさん
2006/02/08(水) 09:49:040791デフォルトの名無しさん
2006/02/08(水) 10:04:10> 2. シングルクォーテーションで括った文字は char の値となる。
シングルクォーテーションで括った文字定数はintな訳だが
0792デフォルトの名無しさん
2006/02/08(水) 10:11:29本当に有難うございます。とても参考になります。なので、メモに取って絶対忘れないようにしておくつもりです。
以前はよく分からなかったwchar_t 型の使い方まで繋げることができたので、本当に感謝です。
0793デフォルトの名無しさん
2006/02/08(水) 10:20:14かかってこい。メンバー随時更新中!! ロクサス隊メンバー紹介!
ロクサス 隊長 ←俺。最強のコテ
バルボッサ 副隊長 ←俺に次ぐ最強のコテ
以下部下・家来
レオン ←最後まで戦うこの部隊に欠かせない人材
クロノトリガースレの全住民 ※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ならここの住民全員がロクサス隊に強制入隊!!
0794デフォルトの名無しさん
2006/02/08(水) 17:50:48THESPOKEってC言語のコンパイラとしてつかえるのですか??
日本語おかしくてすいません。
0795デフォルトの名無しさん
2006/02/08(水) 17:57:45↓これの事か?
ttp://www.microsoft.com/japan/msdn/student/spoke/
0796デフォルトの名無しさん
2006/02/08(水) 18:01:35それです
0797デフォルトの名無しさん
2006/02/08(水) 18:02:19>>795さん
それです
0798デフォルトの名無しさん
2006/02/08(水) 18:10:24>>795のリンク先にも書いてあるがtheSpokeはあくまでMSがやってる学生向けコミュニティを指す。
多分君がイメージしているのはVisual Studio .net 2003 theSpoke Premiumのことだろうと思うのだが。
Visual StudioはMS製のIDE(統合開発環境。要はアプリの開発やソースの管理を支援する便利な代物)で、
勿論C/C++コンパイラも付属している。コンパイラだけ欲しいのなら無料で手に入るけど、
開発を支援するものは何もないので自分でエディタを探したり、Eclips使ったりする必要がある。
0799デフォルトの名無しさん
2006/02/08(水) 18:14:120800デフォルトの名無しさん
2006/02/08(水) 18:15:00ありがとうございました
0801デフォルトの名無しさん
2006/02/08(水) 20:01:34C++にどっぷり浸かって忘れてるけど、Cではintだっけ?
'0xFFFF'とかも常に有効ってこと?
0802デフォルトの名無しさん
2006/02/08(水) 20:08:03その通り
>'0xFFFF'とかも常に有効ってこと?
未定義
0803デフォルトの名無しさん
2006/02/08(水) 20:09:590804デフォルトの名無しさん
2006/02/08(水) 20:10:37ミキティとつなげればいいんだろ?
0805デフォルトの名無しさん
2006/02/08(水) 20:19:57うまいこと言ったつもりか〜〜〜〜〜!!!!!!11
0806デフォルトの名無しさん
2006/02/08(水) 20:27:05おまえ、「くそっ、やられた」と思っただろ?
0807デフォルトの名無しさん
2006/02/08(水) 20:31:180808デフォルトの名無しさん
2006/02/08(水) 21:48:23それともほかに書き換えしやすい命令があるんでしょうか
0809デフォルトの名無しさん
2006/02/08(水) 21:53:24'\xFFFF'の間違いか?
それでC++に浸かってるなんて、よく言えたものだな
0810デフォルトの名無しさん
2006/02/08(水) 22:05:000811デフォルトの名無しさん
2006/02/08(水) 22:19:06その学校の先生次第。
0812デフォルトの名無しさん
2006/02/08(水) 22:53:30その目的にかなうだけ詳しくかけばよい
逆にそれを超えて詳しく書いてはいけない
C言語はまったく関係ないな
0813デフォルトの名無しさん
2006/02/08(水) 23:00:54まだフローチャートを書いているひとがいるんだ。
フローチャートをどのレベルで書けばよいかは、書いたフローチャートを
利用する次の工程による。
0814デフォルトの名無しさん
2006/02/08(水) 23:06:21プログラムの開始
↓
メインの処理
↓
終了
0815デフォルトの名無しさん
2006/02/08(水) 23:22:25藻前ら優しすぎ。
「スレ違い」の一言で十分。
0816デフォルトの名無しさん
2006/02/08(水) 23:52:19脳内イメージとソースとがうまく相互変換できるようになればいいんじゃないのかな、それは君自身の糧になる。
0817デフォルトの名無しさん
2006/02/09(木) 00:18:47形を変えたところで大差ないだろう。
それにUMLで図書いたところでその中味はどう書きゃいいのさ、
という問題が残る。
0818デフォルトの名無しさん
2006/02/09(木) 00:23:24とゆうか俺がそれで代用してるんだが
0819デフォルトの名無しさん
2006/02/09(木) 00:34:49配列で100個のデータがある(A[100])とすると、
その中から10個のデータを抜き出して
(A[1]〜A[10]の和、A[11]〜A[20]の和など)
和を計算することは可能でしょうか?
0820デフォルトの名無しさん
2006/02/09(木) 00:36:100821デフォルトの名無しさん
2006/02/09(木) 00:40:26なにとぞよろしくお願いします。
0822デフォルトの名無しさん
2006/02/09(木) 00:42:270823デフォルトの名無しさん
2006/02/09(木) 00:43:59それをおしえていただきたいのです。
0824デフォルトの名無しさん
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];
}
}
こんな感じです。うまく抜き出したいのですが・・・
0825デフォルトの名無しさん
2006/02/09(木) 00:47:06・この場合、配列はA[0]〜A[99]まで
0826810
2006/02/09(木) 00:47:16だいたいの感じで書くと、ほとんど四角の箱だけで、中に抽象的な処理を書くだけになってしまいます。
かといってちょっとでも具体的に書くと、量が多くて発表には合わない感じです。
0827デフォルトの名無しさん
2006/02/09(木) 00:50:26すいませんでした。A[0]〜A[100]には1をどんどん足していく感じで作りたいのです。
その後、10個ずつ抜き出してその10個の和を計算したいのです。
0828デフォルトの名無しさん
2006/02/09(木) 00:57:19イマイチ何がしたいのか、わからん・・・
#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);
}
0829819
2006/02/09(木) 01:03:59できました!
sumA += A[k * 10 + i];
の一文が書けなくて、困っていました。
とりあえず、数学の計算に応用したかったのです。
本当にありがとうございました!
0830デフォルトの名無しさん
2006/02/09(木) 01:05:45file=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は何か特殊なのでしょうか?
0831デフォルトの名無しさん
2006/02/09(木) 01:22:33環境に合わせて \n (0x0a) を \r\n (0x0d, 0x0a) に変換しているからだ。それが
嫌なら fopen() のモードを "w" じゃなくて"wb" にしろ。
0832デフォルトの名無しさん
2006/02/09(木) 01:32:3810は改行\nと同じ
試しにまっさらなテキストでエンター1回だけ押して保存して見てみろ
0A0DなんだよWINでは
0833830
2006/02/09(木) 01:35:08お早い返答ありがとうございます。
0834デフォルトの名無しさん
2006/02/09(木) 01:35:400D0Aですた(・∀・)
0835デフォルトの名無しさん
2006/02/09(木) 01:40:23で、MS-DOS とか Windows は 0d0a。
UNIXやLinuxは 0a。
但しこの頃は改行コードや文字コードの違いを吸収してしまうエディタとかが
あるのでOSのデフォルトというものは段々なくなっているように思う。
0836デフォルトの名無しさん
2006/02/09(木) 06:31:21味全然付いてね
0837デフォルトの名無しさん
2006/02/09(木) 06:32:520838726
2006/02/09(木) 14:45:51わかりました。まず買った参考書を読破してからソースの美しさについて考えてみます。
>>742
そうなんですか。まぁ1バイト2バイト変わったところで・・・とは思いますけど何万行も書いてると変わってくるかなとも思ったので。心掛け程度なんでしょうか
>>743
ちょっと分からないです。まだ質問するレベルにも達していないようなので勉強します。ありがとうございました。
0839デフォルトの名無しさん
2006/02/09(木) 16:09:02誰か教えて栗!
0840デフォルトの名無しさん
2006/02/09(木) 16:11:000841デフォルトの名無しさん
2006/02/09(木) 16:34:57鼬害。
>>839
何のタイムスタンプか判らんが、ファイルのタイムスタンプの取得方法なら
標準Cだけでは解決しないので該当環境スレなどへどうぞ。
>>838
メモリ量の問題ではなく、ソースを読んで意味が判るように心掛けるべきでしょう。
0842デフォルトの名無しさん
2006/02/09(木) 16:44:41文房具屋に行くと売ってるよ。
0843デフォルトの名無しさん
2006/02/09(木) 17:33:59winsock2.hをインクルードしたヘッダファイル( MyHeader2.h )があったとして、
#include "MyHeader1.h"
#include "MyHeader2.h"
なんてやるとコンパイルできません。
winsock2.hを先に、windows.hを後にインクルードできればいいのですが、
ラップされたヘッダーだと解らない場合があります。
このような問題はどのように解決すればいいのでしょうか?
というか、いちいち全部のヘッダみて、どれがwindows.hをインクルードしてるか調べなきゃだめなんでしょうか?
0844デフォルトの名無しさん
2006/02/09(木) 17:36:300845デフォルトの名無しさん
2006/02/09(木) 17:37:10include重なったって問題ない
0846デフォルトの名無しさん
2006/02/09(木) 17:37:39> winsock2.hを先に、windows.hを後にインクルードできればいいのですが、
どっちが先でも問題ないはずだが?
0847デフォルトの名無しさん
2006/02/09(木) 17:38:55#include <winsock2.h>
#include <windows.h>
#include "MyHeader1.h"
#include "MyHeader2.h"
0848843
2006/02/09(木) 17:46:21全部書いておきます。
ありがとうございました。
0849デフォルトの名無しさん
2006/02/09(木) 18:22:53そのポインタは、動的に確保された別の構造体の配列をさします(この配列は全て異ります)。
この状況で、a[i].bが指している配列を解放したいのですが、うまくいきません。
原因がどうしてもわからないため、動的な構造体の配列の各要素が、それぞれ
別の動的な配列をさしている場合、freeはうまくいかないのではないかと勝手に思っているのですが、
違いますか??勘違いでしょうか。。。・
0850デフォルトの名無しさん
2006/02/09(木) 18:32:49free()の引数は合ってるか?
0851デフォルトの名無しさん
2006/02/09(木) 18:32:530852デフォルトの名無しさん
2006/02/09(木) 19:08:22俺のプログラムがウンコだからっぽいですね。。
ただ、相当な回数繰り返し計算にこの配列を用いているんですが、
freeしなければ正常に動くんです、、、。
0853デフォルトの名無しさん
2006/02/09(木) 19:14:40>俺のプログラムがウンコだからっぽいですね。。
いや、「だからっぽい」ではなく「だから」。
0854デフォルトの名無しさん
2006/02/09(木) 19:30:44保存先の変数の型にあわせてから計算して、その後保存すればOKですよね?
0855デフォルトの名無しさん
2006/02/09(木) 19:31:220856デフォルトの名無しさん
2006/02/09(木) 19:48:16考えられる例
・動的配列aを解放してから各構造体メンバを解放している
・2回以上同一アドレスに対してfreeした
・処理しているときにメモリ破壊している。freeの時に運良く「上手くいかなかった」
0857デフォルトの名無しさん
2006/02/09(木) 19:48:47intに入れれば勝手にけつが無くなる
まぁしたほうがいいとは思うけどね
0858デフォルトの名無しさん
2006/02/09(木) 20:24:09いんだよ。
気になるなら再現する最小限の大きさのプログラムを作ってここに書き込め。
そしたらみんながツッコミ入れるから。
0859デフォルトの名無しさん
2006/02/09(木) 20:32:03まず、「重複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を使ってます。
よろしくお願いします。
0860デフォルトの名無しさん
2006/02/09(木) 20:35:12解放の直後に0を入れてみてうまく動くようなら、二重解放をどこかでしている。
0861デフォルトの名無しさん
2006/02/09(木) 20:36:41リビルドしても?
0862デフォルトの名無しさん
2006/02/09(木) 20:38:552つのファイルでincludeしてそれを共にinckudeしたら
宣言ダブルんだからダメだろそりゃ
include被ってもどうにかなるのは標準のだけだよ
0863デフォルトの名無しさん
2006/02/09(木) 20:39:280864デフォルトの名無しさん
2006/02/09(木) 20:42:41馬鹿?
>>859
どう見てもスレ違いです。
0865デフォルトの名無しさん
2006/02/09(木) 20:43:450866デフォルトの名無しさん
2006/02/09(木) 20:47:460867デフォルトの名無しさん
2006/02/09(木) 20:48:03あなたはstdio.hなどのファイルのことをなんと呼びますか?
・ヘッダファイル
・インクルードファイル
・その他
0868デフォルトの名無しさん
2006/02/09(木) 20:48:56そのヘッダ見せてよ。
0869デフォルトの名無しさん
2006/02/09(木) 20:50:070870デフォルトの名無しさん
2006/02/09(木) 20:51:22おにいちゃんエッチ
0871デフォルトの名無しさん
2006/02/09(木) 20:56:21リビルドしたら、どちらとも無事エラーになってくれました。
Cとは関係ないことですみませんでした。
もうひとつ質問
>>865さんがおっしゃるようにヘッダに「宣言」だけ書いた場合
重複include防止って意味があるんでしょうか?
宣言だけだったら重複していても害はないとあるサイトでは書いてあったんですけど。
重複include防止って具体的にどういう時に役に立つんですか?
0872デフォルトの名無しさん
2006/02/09(木) 21:07:21関数や変数の宣言は何度あっても問題ないが、
構造体の定義など同じものが複数あっては駄目なものもある。
0873デフォルトの名無しさん
2006/02/09(木) 21:08:200874デフォルトの名無しさん
2006/02/09(木) 21:10:04enumとかtypedefが重複するとエラーになる
0875デフォルトの名無しさん
2006/02/09(木) 21:11:01そうなんですか。
今、構造体の宣言で実験してみたらエラーになりました。
includeについてスッキリしました。
ありがとうございました。
0876デフォルトの名無しさん
2006/02/09(木) 21:13:28構造体以外に他にもいろいろ問題があるんですね。
いやあ、かなり助かりました。
ありがとうございます。
0877デフォルトの名無しさん
2006/02/09(木) 21:22:57C99じゃない限り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"
0878デフォルトの名無しさん
2006/02/09(木) 21:42:330879デフォルトの名無しさん
2006/02/09(木) 21:43:28ウイルス送りまくってくれ
0880デフォルトの名無しさん
2006/02/09(木) 21:52:30Javaじゃないとダメじゃないの?
0881デフォルトの名無しさん
2006/02/09(木) 21:57:02#ifndef hoge1_header_file
#define hoge1_header_file
...
#endif
とかもしくは
#pragma once
とかつけてる?
0882デフォルトの名無しさん
2006/02/09(木) 22:00:48でかい添付ファイル付きの奴でメールサーバを溢れさせるとか
0883デフォルトの名無しさん
2006/02/09(木) 22:53:02#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
となるか分かりません。どのように展開されてるか
教えてください。
0884デフォルトの名無しさん
2006/02/09(木) 22:56:20そんなネタはおもろない 出直してきなせい
0885デフォルトの名無しさん
2006/02/09(木) 22:58:57y=square(++x);
と
y=square(x++);
を試してみろ
0886デフォルトの名無しさん
2006/02/09(木) 23:00:240887デフォルトの名無しさん
2006/02/09(木) 23:01:24あっかんべー
0888デフォルトの名無しさん
2006/02/09(木) 23:02:18これって未定義動作じゃね?
0889デフォルトの名無しさん
2006/02/09(木) 23:03:180890883
2006/02/09(木) 23:04:11としたら
x=4
y=4
になりましたが…!?
やっぱ分からないです。
0891デフォルトの名無しさん
2006/02/09(木) 23:04:55y=16/square(x);
さてyはいくつ?
0892デフォルトの名無しさん
2006/02/09(木) 23:05:130893デフォルトの名無しさん
2006/02/09(木) 23:06:51それは偶然の産物
いくら注視しても帰納は無理
素直に規格票を入手してそこから演繹を試みなさい
0894デフォルトの名無しさん
2006/02/09(木) 23:08:50int x,y;
x=2;
y=(++x)*(++x);
printf("x=%d\n",x);
printf("y=%d\n",y);
return 0;
}
実際、Eオプションでコンパイラに展開させるとこれ。
0895デフォルトの名無しさん
2006/02/09(木) 23:11:09かけ算するときに、命令に変数のアドレスそのまま渡してるからじゃない?
こんな感じ。
TASU a
TASU a
KAKELU a a b
0896デフォルトの名無しさん
2006/02/09(木) 23:16:13括弧さきにやるから、3になって4になるxが。
で4*4=16
x++とした場合は、2*2やってから
3になって4になるxが。みたいね。
0897デフォルトの名無しさん
2006/02/09(木) 23:20:23y=(++x)*(++x);
JIS X 3010:2003規格表嫁
P48 6.5
直前の副作用完了点から次の副作用完了点までの間に
式の評価によって一つのオブジェクトに格納された値を変更する
回数は、高々1回でなければならない。さらに、変更前の
値の読み取りは、格納される値を決定するためだけに行われ
なければならない。
今回のでは、副作用完了点から次の副作用完了点の間で
++xが2回有ることから未定義の式文
よってこれが3になろうが5になろうが、画面から猫が飛び出そうが
知ったこっちゃない
0898デフォルトの名無しさん
2006/02/09(木) 23:26:360899デフォルトの名無しさん
2006/02/09(木) 23:28:58引用サンクス。
0900デフォルトの名無しさん
2006/02/09(木) 23:30:13未定義動作の時に画面から猫が飛び出るという実装がなされた
そんな遊び心満載の処理系があれば可能
0901デフォルトの名無しさん
2006/02/09(木) 23:30:180902デフォルトの名無しさん
2006/02/09(木) 23:30:58初めて知った。1万4千8百円だって。
見たこと無い。
0903デフォルトの名無しさん
2006/02/09(木) 23:31:07つかこれぐらい入門書に書いておけよな
0904デフォルトの名無しさん
2006/02/09(木) 23:33:02いい気がする今日この頃
0905デフォルトの名無しさん
2006/02/09(木) 23:33:07高いが手元に置いておいて損はない(勿論ちゃんと読んでの話な)
それに糞見づらいのでいいんなら正規にPDF(スキャンされた画像をPDF化した奴)
を読めるサイトもある。もっとも全文検索や索引は一切無いがな
0906デフォルトの名無しさん
2006/02/09(木) 23:34:430907デフォルトの名無しさん
2006/02/09(木) 23:35:03おまえ、他人に理解されることを恐れているのか?
他人に理解してもらいたいなら、和訳しろ。
0908デフォルトの名無しさん
2006/02/09(木) 23:35:090909デフォルトの名無しさん
2006/02/09(木) 23:36:15#pragma でゲームが起動するってのはあったらしいな。
0910デフォルトの名無しさん
2006/02/09(木) 23:41:20何が分からんのか言ってみろ
0911デフォルトの名無しさん
2006/02/09(木) 23:51:07マジに教えて欲しいんだが、なんでそれが 「 未定義 」 なんだ?
y=(++x)*(++x);
一番優先順位の高い演算は、2つある ( ) の中身。 同一優先順位の演算が2つあるから、
結合順位に照らし合わせる。 結果、代入演算子の右辺から評価。
右辺は乗算だから、左の項から評価。
従って、
左の(++x)を評価:xは3に
右の(++x)を評価:xは4に
3と4を掛ける:12
yに代入:yは12に
Cの言語仕様だと、こうなるのではないか? 曖昧(動作が未定義)な点は、無いと思うが・・・
0912デフォルトの名無しさん
2006/02/09(木) 23:52:26> 右辺は乗算だから、左の項から評価。
ここが間違い。
0913デフォルトの名無しさん
2006/02/09(木) 23:55:24だから++xが二度出てくることで、xの値を2度更新してる
その式文中に副作用完了点は末尾以外存在しない
よって未定義動作
0914デフォルトの名無しさん
2006/02/10(金) 00:00:36偉い人たちには曖昧にしか見えなかったんどすえ。
0915デフォルトの名無しさん
2006/02/10(金) 00:06:40++xを両方先に計算すると、4x4でyは16
曖昧な事極まりない
0916デフォルトの名無しさん
2006/02/10(金) 00:06:43演算の優先順位と、評価順序は異なるってことか?
A + B * C は、B の評価結果と C の評価結果を掛けて、それを A の評価結果と合算する、
っていう順位は決まっているけれども、A・B・C の評価順序は、演算の順位とは全く関係なく
不定である、って解釈であってる?
0917デフォルトの名無しさん
2006/02/10(金) 00:09:42その通り
0918デフォルトの名無しさん
2006/02/10(金) 00:10:21まぁ1行目は間違ってないな
とりあえずここで問題なのは、隣接する2つの副作用完了点の間で
同一オブジェクトを2度変更していること
よって、演算子の優先順位だの評価順序だのを持ち出すのはナンセンス
んなのは全く関係ない
ちなみに蛇足だが、関数呼び出しの実引数並びの評価順序も未定義
0919デフォルトの名無しさん
2006/02/10(金) 00:10:28演算子の優先順位は評価済みの各要素を結合する順番。
評価の順序は定義されてない。
こういうこったね。
0920デフォルトの名無しさん
2006/02/10(金) 00:11:090921デフォルトの名無しさん
2006/02/10(金) 00:12:00ttp://www.kouno.jp/home/c_faq/c3.html#2
0922デフォルトの名無しさん
2006/02/10(金) 00:15:38リッチもまだまだだな
0924デフォルトの名無しさん
2006/02/10(金) 00:18:15そこに実装系の腕の見せ所があるんじゃないかァー
遊び心の分からない人だナー
0925デフォルトの名無しさん
2006/02/10(金) 00:18:59評価順序を定義しない方が高速なコードを生成できるかもしれないからじゃなかったっけ?
0926デフォルトの名無しさん
2006/02/10(金) 00:22:100927911 = 916
2006/02/10(金) 00:23:26> 関数呼び出しの実引数並びの評価順序も未定義
それは、各引数の評価結果をスタックに積む順番はケツから、ってのは決まってるけれども、
その前段階の 「 各引数を評価する順序 」 は未定義ってことだね!
0928デフォルトの名無しさん
2006/02/10(金) 00:28:030929911 = 916
2006/02/10(金) 00:32:432ch ってクズの集まりだと思ってたけど、なんだ、まともな連中もいるんじゃねーか。
オイラ、泣けてくるゼ。
0930デフォルトの名無しさん
2006/02/10(金) 00:33:460931911 = 916
2006/02/10(金) 00:34:550932デフォルトの名無しさん
2006/02/10(金) 01:11:24typedef 構造体等のキーワードでググっても
わからなかったのでよかったら教えてください。
下記のような構造体のコードがあるんですが
>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;
を省略して記述したような感じに思いますがどうなんでしょう?
お手数ですが教えてください。
0933デフォルトの名無しさん
2006/02/10(金) 01:15:550934デフォルトの名無しさん
2006/02/10(金) 01:18:49同時にその構造体へのポインタの別名をpOAMEntryとしている
0935デフォルトの名無しさん
2006/02/10(金) 01:39:40んじゃおまえ typedef int INT, *PINT; はどうなるんだよ。
わかんねえなら入門書読め。
0936デフォルトの名無しさん
2006/02/10(金) 01:48:560937932
2006/02/10(金) 01:49:09このような記述ができるということが入門書に書いてなかったので
質問しました。上記の記述方法を知っていたら質問しませんでした。
申し訳ないです。
0938デフォルトの名無しさん
2006/02/10(金) 02:08:25副作用が怖いお子様はJavaでもやっていろ
0939デフォルトの名無しさん
2006/02/10(金) 02:17:32そんなに怖がるなよ、お子様。
0940デフォルトの名無しさん
2006/02/10(金) 02:25:12typedef 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。
ただ読みやすくするには似たような名前が良いかと思われる。
0942デフォルトの名無しさん
2006/02/10(金) 02:39:56入れ子structのこといってるならそれはおk
0943デフォルトの名無しさん
2006/02/10(金) 02:48:16そんなの入門書じゃねえ。捨てろ。
0944デフォルトの名無しさん
2006/02/10(金) 02:49:10typedef int INT, *PINT; は typedef int INT; typedef int *PINT; を一回で書いただけだ。
0945デフォルトの名無しさん
2006/02/10(金) 02:56:46入門書にんなこと載ってねぇよバカ
0946デフォルトの名無しさん
2006/02/10(金) 02:59:100947デフォルトの名無しさん
2006/02/10(金) 09:26:240948デフォルトの名無しさん
2006/02/10(金) 09:33:120949デフォルトの名無しさん
2006/02/10(金) 10:00:51イ从、从从从从从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、{ | ヽ ヽ // / |
ヽ '´ | ヽ ヽ // /
0950デフォルトの名無しさん
2006/02/10(金) 12:24:360951デフォルトの名無しさん
2006/02/10(金) 12:52:550952デフォルトの名無しさん
2006/02/10(金) 12:56:55入力バッファを破棄する
0953デフォルトの名無しさん
2006/02/10(金) 13:02:50どうやってですか?
0954951=953
2006/02/10(金) 13:24:42質問取り下げます
0955デフォルトの名無しさん
2006/02/10(金) 14:29:23scanf("%*[^\n]"); これで改行まで読み飛ばし
scanf("%*c"); その後これで改行読み飛ばし
0956デフォルトの名無しさん
2006/02/10(金) 14:38:41使ったほうがキモチイイ
0957デフォルトの名無しさん
2006/02/10(金) 14:39:01ヘェヘェヘェ(゚∀゚)ノシ!
0958デフォルトの名無しさん
2006/02/10(金) 14:41:10それってどうゆう使い方をしてるのかkwsk
0959デフォルトの名無しさん
2006/02/10(金) 14:44:200960デフォルトの名無しさん
2006/02/10(金) 14:46:09入力バッファを流すと詰まりそうだからそんなAPIは存在自体気持ち悪い
0961デフォルトの名無しさん
2006/02/10(金) 14:46:490962デフォルトの名無しさん
2006/02/10(金) 14:49:15詰まるってトイレ?
0963デフォルトの名無しさん
2006/02/10(金) 15:35:240964デフォルトの名無しさん
2006/02/10(金) 15:40:18まあそんな感じ
流してもプログラム側には文字は流れてこないから
# 別なところに流れていってるってのが正しい解釈なんだろうけど
0965デフォルトの名無しさん
2006/02/10(金) 15:45:26バッファの破棄ってさ・・・直接コンソール入力で使いたいんじゃないか?
それ以外の場合なら破棄しなくてもどうにかなる気がするんだよね
0966デフォルトの名無しさん
2006/02/10(金) 15:45:39規格では未定義
gccでは何も起こらなかった(クリアされなかった)
MSDNには多分期待した動作が載ってる、調べてないけど
0967デフォルトの名無しさん
2006/02/10(金) 16:02:57bccだとダメだった
0968デフォルトの名無しさん
2006/02/10(金) 16:03:56破棄ってぽ〜んと消滅させてくれるんじゃなくて
どっか他のところに流すの?
なんか嫌だなそれ
0969デフォルトの名無しさん
2006/02/10(金) 16:12:170970デフォルトの名無しさん
2006/02/10(金) 16:18:25そんなこんなでgetchみたいな関数が巷で流行してる。
0971デフォルトの名無しさん
2006/02/10(金) 16:19:39なんだあの破棄ってAPI・・・
0972デフォルトの名無しさん
2006/02/10(金) 16:21:20ボタン押すまで次の処理しませ〜んとかの時には便利だけど
0973デフォルトの名無しさん
2006/02/10(金) 16:22:45int a[10]={0};
int i;
for(i=0;i<10;i++){
if(a[i-2]==xx)
a[i]=xx
}
このような書き方をしていいですか?
0974デフォルトの名無しさん
2006/02/10(金) 16:25:08そのままだと当然、駄目
最初のi=0の時に思いっきり範囲外アクセスしてるから
0975デフォルトの名無しさん
2006/02/10(金) 16:26:13てか何がしたいんだ
0977デフォルトの名無しさん
2006/02/10(金) 16:56:05まず、質問の仕方を勉強した方がいい。
# 具体的に、どんな事をしたいのか?
# を聞いているのに>>976は無いだろう。
0978973
2006/02/10(金) 17:34:21int 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]とかのデータを見て処理をするようにしたいです。
0979デフォルトの名無しさん
2006/02/10(金) 17:42:16a[i-1]とかa[i-2]入れちゃえ
ただ実行前にif(i>0)とかi<1で範囲外にアクセスしないようにすりゃいい
0980デフォルトの名無しさん
2006/02/10(金) 17:43:12int 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] とする */
0981デフォルトの名無しさん
2006/02/10(金) 18:31:06まだ見てるかな・・・?
> 最後の
> >}OAMEntry,*pOAMEntry;
> 部分がよくわかりません。
struct tagOAMEntry { いろいろ };
typedef tagOAMEntry OAMEntry;
typedef tagOAMEntry *pOAMEntry;
って分割して書くとわかるかな?
突っ込んでる人がいないんだけど、
>>940 は、typedef が消えてて実は同じ意味じゃない。
前者は型のエイリアス、後者は変数宣言。
0982デフォルトの名無しさん
2006/02/10(金) 19:22:390983デフォルトの名無しさん
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/
0984デフォルトの名無しさん
2006/02/10(金) 20:11:27立ててみるからまってなー
0985デフォルトの名無しさん
2006/02/10(金) 20:14:36http://pc8.2ch.net/test/read.cgi/tech/1139570025/
俺乙。
0986デフォルトの名無しさん
2006/02/10(金) 20:16:470987デフォルトの名無しさん
2006/02/11(土) 01:40:58乙
ワロタ
0988デフォルトの名無しさん
2006/02/11(土) 01:47:150989デフォルトの名無しさん
2006/02/11(土) 02:23:370990デフォルトの名無しさん
2006/02/11(土) 07:31:42その配列には要素を加えたり、取り除いたりしたいのですが、、任意の要素を動かすわけではなく、スタックのように一番最後のものだけを加えるか取り除くかすることを想定しています。
最初から固定的な配列をメモリに確保するともともとのサイズ以上の要素を入れたい場合たとえメモリが余っていてもダメです。ちょっとしか要素を使わなかった場合にはメモリがもったいないです。
かと言ってリンクドリスト構造にすると例えば100番目の要素にアクセスするのに100個の要素を辿る必要がありオーバーヘッドが大きいです。
要素を加える時と取り除く時に新たな配列を作り、古い配列の内容を全コピーした後、古い配列を削除するというのも考えたのですが、やはりオーバーヘッドが大きいし、メモリがガベージだらけになってしまうと思います。
どうやればいいのでしょうか?
0991デフォルトの名無しさん
2006/02/11(土) 07:35:510992デフォルトの名無しさん
2006/02/11(土) 08:20:280993デフォルトの名無しさん
2006/02/11(土) 08:42:160994デフォルトの名無しさん
2006/02/11(土) 09:48:45reallocは?
0995デフォルトの名無しさん
2006/02/11(土) 09:50:49|.´。. γ
|'; 'ё;゚ソ
| ノ
| ヘ、
| /`\_つ
|∩ 人
|ω、 \
0996デフォルトの名無しさん
2006/02/11(土) 09:51:22|。. γ
| 'ё;゚ソ
| ノ
| ヘ、
|/`\_つ
|人
| \
0997デフォルトの名無しさん
2006/02/11(土) 09:53:09|。. γ
| 'ё;゚ソ
| ノ
|
|/`
|人
| \
0998デフォルトの名無しさん
2006/02/11(土) 09:53:57|。. γ
| 'ё;゚ソ
| ノ
| ヘ、
|/`\_つ ∩
|人 ω
| \
0999デフォルトの名無しさん
2006/02/11(土) 09:55:50| γ
|ё;゚ソ
|ノ
|ヘ、
|\_つ ∩
| ω
|
1000デフォルトの名無しさん
2006/02/11(土) 10:04:3910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。