C言語なら俺に聞け(入門篇) Part 44
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/02/07(土) 08:23:42教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 122代目
http://pc11.2ch.net/test/read.cgi/tech/1232029287/
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 43
http://pc11.2ch.net/test/read.cgi/tech/1232791213/
過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
0002デフォルトの名無しさん
2009/02/07(土) 09:51:39with the name of the program, CPAC, followed by a series of
parameters. If you type CPAC without any parameters, you see the
following short help screen:
Usage Syntax: CPAC <command> [<options>] <PACfile> <file>* -<file>*
<command> = Add | eXtract | DELETE | List | ListMore | Replace |
View | reFormat | Print | Help | ?
<options> = Format={Text | Ascii | Binary} Blksize=nn
eXCludechars=<character list> +/-Subdirectories
+/-UsePath +/-UseDevice +/-Overwrite
MessageLevel={All|Warnings|Errors|None}
OutPath=<pathname>
StorePath={Full|Recursed|None}
<PACfile> = Name of PAC file to use. Wildcards not permitted
Extension of .PAC will be assumed
<file> = [<filespec> | IndeXfile=<filename>]
-<file> = filename or wildcard to exclude
<character list> = List of characters or decimal equivalents
specified as \"\\nnn\" where nnn is the decimal value
of the character
<filespec> = Explicit file name or wildcard specification
<filename> = Explicit file name
これはどういうことですか?
0003デフォルトの名無しさん
2009/02/07(土) 09:53:04スレ違いということです。
00052
2009/02/07(土) 11:00:500006デフォルトの名無しさん
2009/02/07(土) 11:05:41AAで答えて
0007デフォルトの名無しさん
2009/02/07(土) 15:10:211.cnt += 1;
2.cnt++;
3.++cnt;
0008デフォルトの名無しさん
2009/02/07(土) 15:12:34全部。
0009デフォルトの名無しさん
2009/02/07(土) 15:27:370010デフォルトの名無しさん
2009/02/07(土) 15:33:54組み込み整数型なら多分どれも一緒。
001110
2009/02/07(土) 15:34:390013デフォルトの名無しさん
2009/02/07(土) 15:53:38exeをダブルクリックして起動するような一般的なプログラムにするのは難しいのでしょうか?
具体的には、
1.起動
↓
2.参照からcsv形式のファイルを選択
↓
3.そのファイルをargv[1]に入れる
↓
4.プログラム実行
↓
5.終了
みたいなことだけ出来ればいいのですが・・・。
0014デフォルトの名無しさん
2009/02/07(土) 15:55:47ダブルクリックで動かないのか? OSは何?
exeと言っているからにはWindowsじゃないのか?
「参照」とはなんだ? 「起動」と「実行」は何が違うんだ?
0015デフォルトの名無しさん
2009/02/07(土) 16:23:20OSはXPです。
普段はコマンドプロンプトを開いて、cdコマンドでexeファイルのある場所まで移動して、
そこでプログラム名とコマンドライン引数を入力して実行しています。
exeダブルクリックでウインドウを開いたりさせる方法を全く知らないということです。
コンパイルを行えばexeファイルはできますが、
ダブルクリックしてもコマンドプロンプトらしきものが一瞬ちらつくだけで終わってしまいます。
コマンドプロンプト上で動く、CSVファイルを集計してファイルに書き込みを行うプログラムは作ってみたのですが、
このプログラムではコマンドライン引数に、直接CSVファイルを指定しなければなりません。
これをもっとわかりやすく、exeダブルクリックから実行して、
よくある参照ボタンからファイルを選択してOKボタンを押し、集計結果をファイルに書き出すようにしたいんです。
0016デフォルトの名無しさん
2009/02/07(土) 16:40:46csvファイルをexeにドロップしてみては?
0017デフォルトの名無しさん
2009/02/07(土) 16:41:15char str[] = "Hello\n";
sscanf(s, "%s",s);
という風にやってもいいんでしょうか?
0018デフォルトの名無しさん
2009/02/07(土) 16:42:160019デフォルトの名無しさん
2009/02/07(土) 16:44:220020デフォルトの名無しさん
2009/02/07(土) 16:48:14sscanf(str, "%[^\n]", s)
0021デフォルトの名無しさん
2009/02/07(土) 17:00:54sscanf(str, "%s ", s);
でいいの?
0022デフォルトの名無しさん
2009/02/07(土) 17:04:56とりあえず画面にウィンドウを表示する方法を調べよう
それからコンソールアプリも中で無限ループさせておけばダブルクリックで実行結果が表示されたままにできるしGUIのアプリも中で無限ループしてるから表示されたままになる
0023デフォルトの名無しさん
2009/02/07(土) 17:11:28で、自分でコンパイルしてみて、どの辺が予想外の反応してるの?
002417
2009/02/07(土) 17:14:51char str[] = "Hello\n";
sscanf(str, "%s",str);
strから読み込んだのをstrに入れるというような使い方はできるんでしょうか?
期待通りに改行はとれたんですけど、なんか変だなぁと。
fgetsで入力された文字列から改行を無くす方法をあれこれと勉強しててsscanf()で
疑問に思った次第です。
>>18
入力の時点でスペースを入力されることをすっかり考えてませんでした。
>>20
スキャン集合も勉強したのにすっかり忘れてました
002513
2009/02/07(土) 17:23:28私が作っていたのはコンソールアプリというものだったんですね。
調べてみたら、こんなHPを見つけたので、ここで勉強してみます。
http://www.geocities.jp/ky_webid/win32c/index.html
>>16
無限ループを入れてみたら、その方法で表示することができました。
ですがもう少し頑張ってみようと思います。
回答ありがとうございました。
0026デフォルトの名無しさん
2009/02/07(土) 23:31:05EXEファイルへのドラッグアンドドロップや関連付けでも
argvからファイル名を取り出せることを知ると楽しいと思う。
0027デフォルトの名無しさん
2009/02/08(日) 06:25:32の最初の例題のprintf関数の所の引数を*ary[get_n]にして↓
#include <stdio.h>
int main() {
int get_n;
char *ary[] = { "デ・ジ・キャラット" , "プ・チ・キャラット" , "ラビアンローズ" };
printf("どんな娘がお好み?\n");
printf("目からビーム = 1\n突っ込みトラ娘 = 2\nサイコロ少女 = 3\n");
printf("1〜3の半角英数>");
scanf("%d",&get_n);
if (( get_n <= 3 ) && ( get_n >= 1))
printf("あなたは%sさんが好きなのですね☆" , *ary[get_n - 1]);
else printf("不正な値です");
return 0;
}
実行したらエラーで強制終了しました。
いまいちポインタ配列とprintf関数の引数指定が理解できてないので
何がだめなのかわかりません。
ary[get_n - 1]ではなく*ary[get_n - 1]ではダメな理由を教えて下さい。
0028デフォルトの名無しさん
2009/02/08(日) 06:40:07*ary[n] は、ary[n]という文字列の、先頭の1文字を意味する。
0029デフォルトの名無しさん
2009/02/08(日) 06:47:38丁寧に解説していただきありがとうございます。
二行目が初めは理解できなかったのですが、なんどか例題と見合わせてるうちに
なんとなくわかりました。
*ary[n]は文字列、ary[n]は文字列へのポインタって勘違いしてました。
0030デフォルトの名無しさん
2009/02/08(日) 14:31:11それは大抵「配列(文字列)の先頭要素へのポインタ」を意味する
0031デフォルトの名無しさん
2009/02/08(日) 14:33:39似てるけど違います。
char *p = "abcd";
putchar(*p);
0032デフォルトの名無しさん
2009/02/08(日) 14:35:420033デフォルトの名無しさん
2009/02/08(日) 15:20:15例えばこの場合だと(あまり複雑ではないが)
if (get_n...) {
char *s = ary[get_n - 1];
printf(..., s);
}
もし何らかの勘違いミスがあっても
コンパイラのエラーメッセージが代入の行を示してくれるのでわかりやすい。
この場合に char *s = *ary[..]; だと、コンパイラが意味のあるエラーメッセージを出してくれるはず。
まあループの中などでレジスタ割付に期待する面も無くはないが
その辺はコンパイラの最適化がやってくれる場合もある。
もちろん、一時変数自体は可読性を落とす要因にもなるので
バランスを考えてのことになる。
特に宣言と使用箇所が分離するようだとまずい。
0034デフォルトの名無しさん
2009/02/08(日) 15:34:43デバッグが楽ですよね
0035デフォルトの名無しさん
2009/02/08(日) 17:59:170036デフォルトの名無しさん
2009/02/08(日) 18:40:37推薦図書/必読書のためのスレッド 44
http://pc11.2ch.net/test/read.cgi/tech/1232206156/
0037デフォルトの名無しさん
2009/02/08(日) 19:33:19座標をtxtファイルに書き込み、頂点をつなぎ合わせた多角形の面積を求めるプログラムです。
例えば引数に使うtxtファイルに
4 2
0.00000 0.00000
0.00000 1.00000
1.00000 1.00000
1.00000 0.00000
と入力しておくとしてこのプログラムを実行すると
V_{1}( 2.00, 0.00)
V_{2}( 0.00, 0.00)
V_{3}( 1.00, 1,00)
V_{4}( 1.00, 1.00)
menseki: 0.500000
となってしまいます。
txtファイルに入力した座標と出力される点の座標が異なってしまいます。
txtファイルに入力した値を正しく出力させるには、どこをどう直せばいいのでしょうか?
0038デフォルトの名無しさん
2009/02/08(日) 19:44:00fscanf(fp,"%d",n);
*v = (double **)malloc(sizeof(double *)*((*n)+1));
int m; ←☆
fscanf(fp,"%d",m); ←☆
for (i = 1; i <= *n; i++)
(*v)[i] = (double *)malloc(sizeof(double)*m); ←☆
for (i = 1; i <= *n; i++)
fscanf(fp,"%lf%lf",&((*v)[i][0]),&((*v)[i][1]));
fclose(fp);
0039デフォルトの名無しさん
2009/02/08(日) 19:52:190040デフォルトの名無しさん
2009/02/08(日) 20:58:27以下の文で教えて欲しいです。
memcpy(&byteData ,pTimData ,2 ); /* pTimDataからbyteDataへコピー */
byteData = byteData & 0x7c00; /*15bit分のマスクを掛ける。*/
byteData = byteData >> 12; /*12bit移動*/
read(byteData, bmpData, sizeof(short));/*処理後のデータを格納*/
/*次の2byeを格納するためループ。全て格納し終えたらループから抜け出す*/
memcpyでpTimDataからbyteDataへ2byte分切り出した後
論理積でマスクをかけビットシフトしたあと、bmpDataに格納するというものなのですが
このままだと2byte分だけbmpDataに格納して処理を終了してしまいます。
処理後の全pTimDataのデータをbmpDataを入れたいのですが、どのようなループ文を書いたらいいのでしょうか?
0041デフォルトの名無しさん
2009/02/08(日) 21:15:390042デフォルトの名無しさん
2009/02/08(日) 22:43:27今、エスケープシーケンスを習っていてエンターを押したら表示が消えてメニュー
に戻るようにしたいんです。
0043デフォルトの名無しさん
2009/02/08(日) 23:03:56if (strlen(s) == 0) {
/* エンターだけ */
}
0044デフォルトの名無しさん
2009/02/08(日) 23:07:260045デフォルトの名無しさん
2009/02/08(日) 23:16:26エンターのみを押したとき、getsならバッファに'\0'が入るから'\0'でチェック。
strlenで文字長0でもいい。
scanfだとエンターのみだとscanfを抜けてこないからダメ。
getsを使って'\0'のみか、stdinに対してfgetsをして'\n'のみかをチェックすればよろしいのでは。
0046デフォルトの名無しさん
2009/02/08(日) 23:18:090047デフォルトの名無しさん
2009/02/09(月) 11:09:080048デフォルトの名無しさん
2009/02/09(月) 12:42:13コピーされて渡されるのですか?
それともアドレスが渡されるのですか?
0049デフォルトの名無しさん
2009/02/09(月) 12:43:22アドレスを渡すとアドレス
0050デフォルトの名無しさん
2009/02/09(月) 15:05:30関数の呼び出しでは ど ん な と き も 引数に与えた値がコピーされて渡される。
その値が整数であるか実数であるか構造体であるかポインタであるかは別の問題。
0051デフォルトの名無しさん
2009/02/09(月) 17:53:430052デフォルトの名無しさん
2009/02/09(月) 17:57:31二つの関数の位置を単に逆にすると
「プロトタイプ宣言のない関数' 'の呼び出し(関数main)」というエラー
メッセージが出るのはどうして? すなわち、
オリジナル関数が先だとなぜ関数の型の宣言は必要ないかが分かりません。
ちなみに本の説明は「オリジナル関数を呼び出す前にその本体が書かれて
いると、関数の型がわかる」というものです。
0053デフォルトの名無しさん
2009/02/09(月) 18:02:00CとC++が同じ。その中ではJavaが劣る。
>>52
コンパイラは上から下にしかコードを読まないから。
0054デフォルトの名無しさん
2009/02/09(月) 18:02:420055デフォルトの名無しさん
2009/02/09(月) 18:17:39誰の本か知らないけど、激しくインチキ臭い…
0056デフォルトの名無しさん
2009/02/09(月) 18:30:15>>53
ありがとうございます。ご指摘に沿ってもう一度考えます。
0057デフォルトの名無しさん
2009/02/09(月) 18:47:280058デフォルトの名無しさん
2009/02/09(月) 19:43:510059デフォルトの名無しさん
2009/02/09(月) 19:54:40kwsk
見てみたい
0060デフォルトの名無しさん
2009/02/09(月) 20:10:45ttp://www.nicovideo.jp/watch/sm5999791
「関数の型」が分からないと正しく呼び出せない。
で答えになってると思うが。
0061デフォルトの名無しさん
2009/02/09(月) 20:12:04前・後編になってるけど、こっちの後編だけでいいと思う。
ttp://www.nicovideo.jp/watch/sm6000231
0062デフォルトの名無しさん
2009/02/09(月) 20:39:490063デフォルトの名無しさん
2009/02/09(月) 21:00:35さんくす。
重くて見れないのでまた後で見てみる。
0064デフォルトの名無しさん
2009/02/09(月) 22:00:41どのようなC言語環境からでも呼び出せるのですか?
例外は関数外には送出しないとしてください。
0065デフォルトの名無しさん
2009/02/09(月) 22:55:54スレ違いです
C++スレ行ってください
0066デフォルトの名無しさん
2009/02/09(月) 23:15:360067デフォルトの名無しさん
2009/02/09(月) 23:20:28DLLにしたときはどうなんだろう。まずくないか?
0068デフォルトの名無しさん
2009/02/09(月) 23:25:20どうしてまずいと思うの?
0069デフォルトの名無しさん
2009/02/09(月) 23:26:280070デフォルトの名無しさん
2009/02/09(月) 23:26:480071デフォルトの名無しさん
2009/02/09(月) 23:27:18引数に副作用のある式が書いてある
0072デフォルトの名無しさん
2009/02/09(月) 23:28:49モジュール化が不完全になる
strtok 見たいに利用者側がなに突っ込んだか把握してなきゃいけないのばっかだとわけわからないことに
0073デフォルトの名無しさん
2009/02/09(月) 23:29:39デバッグ用に簡単なメッセージと変数の値しか表示していない場合でお願いします
0074デフォルトの名無しさん
2009/02/09(月) 23:32:14printfを実行するかしないかで処理時間が違うとか?
0075デフォルトの名無しさん
2009/02/09(月) 23:33:27ifとかwhileの直後がprintfの単文のとき
0076デフォルトの名無しさん
2009/02/09(月) 23:35:18どっかでメモリ壊してるよ
0077デフォルトの名無しさん
2009/02/09(月) 23:42:58printfとは無関係などこかの処理で、ということですか。
その場合どうやってバグ発生箇所を特定すればよいでしょうか
0078デフォルトの名無しさん
2009/02/09(月) 23:44:190079デフォルトの名無しさん
2009/02/09(月) 23:50:090080デフォルトの名無しさん
2009/02/09(月) 23:56:11初期化していない変数を参照している可能性がある。
ある関数を呼んだ場合と呼ばない場合でスタックの状況が変わってしまうからだ。
コンパイル時にWARNINGが出ていたら、それをすべてチェックする。
0081デフォルトの名無しさん
2009/02/09(月) 23:56:160082デフォルトの名無しさん
2009/02/09(月) 23:58:19どっかでリターンアドレスを壊してるんだろうな。
デバッカが使えるなら、スタックのリターンアドレスのある場所に
ブレークポイントかけるとかできるかも。
0083デフォルトの名無しさん
2009/02/10(火) 00:07:58warningは全て消しているので、ポインタ関係ですかね。。面倒そう。。
>>82
デバッガは使わないでprintfデバッグばかりでやってきたので、
これを機会にちょっと調べてみます。
情報提供ありがとうございました。
0084デフォルトの名無しさん
2009/02/10(火) 10:36:38デバッガを使わなくても構わないよ。
そもそも、printf()すると巧く動くと言うことはどこかコードが間違っていると言うことだから。
printf()の代わりに、単にputchar()にしてみても動くかどうか辺りから始めてみたら?
# なんとなく、マクロの可能性も含めて副作用の罠に嵌っているだけの気がする。
0085デフォルトの名無しさん
2009/02/10(火) 17:39:20---global.h---
void set_foo(int);
int get_foo(void);
------------
---global.c---
#include "global.h"
int foo = 0;
void set_foo(int bar){
foo = bar;
}
int get_foo(void){
return foo;
}
------------
---main.c---
#include "global.h"
int main(void){
set_foo(hoge);
printf("%d", get_hoge());
return 0;
}
-----------
みたいなアクセス関数をいちいち全部つくったほうがいいのかな?
後々排他処理を加えたりするとしたら用意したほうが安全なんだろうけど
マルチスレッドを使わないときは意味がないような気がして・・・
0086デフォルトの名無しさん
2009/02/10(火) 18:20:36マルチスレッド対応は必要になってから考えろ
0087デフォルトの名無しさん
2009/02/10(火) 18:21:350088デフォルトの名無しさん
2009/02/10(火) 20:20:130089デフォルトの名無しさん
2009/02/10(火) 20:26:060090デフォルトの名無しさん
2009/02/10(火) 21:06:13「文字列の配列」の意味するところによって異なる。
文字配列の配列が欲しいのか、文字配列とそれを指すポインタの配列が欲しいのか、
既にある文字配列を指すポインタの配列が欲しいのか、はっきりすること。
0091デフォルトの名無しさん
2009/02/10(火) 21:31:17複数の文字列を返す関数を書きたいので
その戻りを受け取るための変数をつくりたいんです。
0092デフォルトの名無しさん
2009/02/10(火) 21:34:06そのそれぞれの要素に文字列を malloc して入れる。
0093デフォルトの名無しさん
2009/02/10(火) 21:48:020094デフォルトの名無しさん
2009/02/10(火) 21:58:51わざと言葉を足りなくしてる
0095デフォルトの名無しさん
2009/02/10(火) 22:00:180096デフォルトの名無しさん
2009/02/10(火) 22:00:480097デフォルトの名無しさん
2009/02/10(火) 22:02:540098デフォルトの名無しさん
2009/02/10(火) 22:04:240099デフォルトの名無しさん
2009/02/10(火) 22:05:430100デフォルトの名無しさん
2009/02/10(火) 22:11:350101デフォルトの名無しさん
2009/02/10(火) 22:13:10は意識的に発声を ゆっくり にして思考は もっと 高速にすべきだな
0102デフォルトの名無しさん
2009/02/10(火) 22:15:17hige
hage
0103デフォルトの名無しさん
2009/02/10(火) 22:15:55ありがとうございます。
ちょっとイメージできました
ぐぐってみます。
0104デフォルトの名無しさん
2009/02/10(火) 22:16:000105デフォルトの名無しさん
2009/02/10(火) 22:16:470106デフォルトの名無しさん
2009/02/10(火) 22:17:110107デフォルトの名無しさん
2009/02/10(火) 22:19:04で、どっちが偉いんだ?
0108デフォルトの名無しさん
2009/02/10(火) 22:20:30もし文字列の最大長が固定でよいなら
char (*p)[LEN];
と宣言して
p=malloc(LEN*count);
func(p);
のようにする。
文字列の長さも動的に決定したいなら、
char **p;
と宣言して
p=malloc(sizeof(char *)*count);
for(int i=0 ; i < count ; i++) p[i]=malloc(len);
のようにする。
いずれにせよ忘れずにfree()すること。
0109デフォルトの名無しさん
2009/02/10(火) 22:20:53オブジェクト指向的に考えてください
0110デフォルトの名無しさん
2009/02/10(火) 22:22:23まずはポインタの概念は理解して
0111デフォルトの名無しさん
2009/02/10(火) 22:24:14半年ROMれ
0112デフォルトの名無しさん
2009/02/10(火) 22:28:00ありがとうございます!
なんとなくイメージできました。
まだよく理解できないんで勉強してみます。
0113デフォルトの名無しさん
2009/02/10(火) 22:29:02ありがとうございます!
なんとなくイメージできました。
まだよく理解できないんで勉強してみます。
0114デフォルトの名無しさん
2009/02/10(火) 22:39:08なんとなくイメージできました。
まだよく理解できないんで勉強してみます。
0115デフォルトの名無しさん
2009/02/10(火) 22:52:27ありがとうございます!
なんとなくイメージできました。
まだよく理解できないんで勉強してみます。
0116デフォルトの名無しさん
2009/02/10(火) 22:57:39ありがとうございます!
なんとなくイメージできました。
まだよく理解できないんで勉強してみます。
0117デフォルトの名無しさん
2009/02/10(火) 23:39:300118デフォルトの名無しさん
2009/02/10(火) 23:41:36だめなところです。
データベース関連スレにどうぞ。
で、どんな質問?
0119デフォルトの名無しさん
2009/02/10(火) 23:46:54駄目なとこですか。すいませんでした。
単純に、
SELECT INTOでホスト変数に入れた場合と、
CURSOR使った場合と、
どっちが速いのかなと思っただけです。
0120デフォルトの名無しさん
2009/02/10(火) 23:53:18SELECT INTOは一行しかとれないのでは?
複数行ある時にはCURSORを使う。
1行しかない時にはどちらも同じ。
0121デフォルトの名無しさん
2009/02/11(水) 00:20:38ですよね。
カウント取るのにINTOからCURSORに修正しろって指示されて、
なんの意味があるのかと思った次第で。
とりあえず、なんか弊害あるのかはもう少し調べて見ますけど
結局一緒ですよね。
ありがとうございました。
0122デフォルトの名無しさん
2009/02/11(水) 15:22:24scanf("%s", MojiC); の箇所で
8 [main] test1 3524 _cygtls::handle_exceptions: Error while dumping state
(probably corrupted stack) Segmentation fault (core dumped)
というエラーが出てしまうのですが何がまずいのでしょうか?
ポインタの話だと思うのですが、教えてください。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char MojiA[100];
char MojiB;
char *MojiC;
printf("MojiA = "); scanf("%s", MojiA);
printf("MojiB = "); scanf("%s", &MojiB);
printf("MojiC = "); scanf("%s", MojiC);
// printf("atoi(MojiA) = %d\n", atoi(MojiA));
// printf("atoi(MojiB) = %d\n", atoi(MojiB));
// printf("atoi(&MojiC) = %d\n", atoi(&MojiC));
return(0);
}
0123デフォルトの名無しさん
2009/02/11(水) 15:31:270124デフォルトの名無しさん
2009/02/11(水) 15:32:170125デフォルトの名無しさん
2009/02/11(水) 16:11:05三つ目の入力が出ませんどうしたらいいですか?
0126デフォルトの名無しさん
2009/02/11(水) 16:14:27↓
char *MojiC = MojiA + 50;
0127デフォルトの名無しさん
2009/02/11(水) 16:14:380128デフォルトの名無しさん
2009/02/11(水) 16:39:12どういう結果が出力してほしいの?
0129デフォルトの名無しさん
2009/02/11(水) 16:41:310130デフォルトの名無しさん
2009/02/11(水) 16:47:04printf("MojiB = "); scanf(" %c", &MojiB);
printf("MojiC = "); scanf("%s", MojiC);
0131122
2009/02/11(水) 17:15:16もともとは、atoi関数の引数と返り値の関係を調べたくて
下記のコードを書いたら
Segmentation fault (core dumped)
エラーが出たので、何がまずいのか調べようと
>>122のようにscanf関数に与える引数をいろいろ試していました。
自分としては
char *MojiC;
scanf("%s", MojiC);
とすれば、scanf関数はMojiCというポインタを受け取るから
問題ないのではと思っています。
int main(void)
{
char *MojiC;
printf("MojiC = "); scanf("%s", MojiC);
printf("atoi(MojiC) = %d\n", atoi(MojiC));
return(0);
}
0132デフォルトの名無しさん
2009/02/11(水) 17:18:37ポインタを受け取っても、ポインタの指す先がなければ、問題ありだろ。
そのプログラムでMojiCが何処を指してるか理解してる?
0133デフォルトの名無しさん
2009/02/11(水) 17:22:18ていうかそのコードだと、住所すら意味不明。地球上のどこか、ってのと同じ。
0134デフォルトの名無しさん
2009/02/11(水) 17:23:26この時点で未初期化の適当な数字が入っている
>scanf("%s", MojiC);
その数字のアドレスの場所に入力した文字列が書き込まれる。
0135122
2009/02/11(水) 17:39:28int main(void)
{
char *MojiC;
printf("MojiC = "); scanf("%s", MojiC);
printf("atoi(MojiC) = %d\n", atoi(MojiC));
return(0);
}
というコードで実行後、文字列を入力してエラーが出た理由は、
char *MojiC;
のところで、アクセスしてはまずい適当なアドレス値がMojiCに代入されてしまい、
scanf("%s", MojiC);
のところでMojiCが指すオブジェクトにアクセスできなかったからでしょうか?
今ちょっと試していたら、上のコードに char c; を追加した
int main(void)
{
char c;
char *MojiC;
printf("MojiC = ");
scanf("%s", MojiC);
printf("atoi(MojiC) = %d\n", atoi(MojiC));
return(0);
}
というコードだと実行後、文字列を入力してもエラーが出なかったのですが、この理由は、
char *MojiC;
のところで、アクセスしても問題ないアドレス値がMojiCにたまたま代入されたので
scanf("%s", MojiC);
のところでMojiCが指すオブジェクトに問題なくアクセスできたからでしょうか?
0136122
2009/02/11(水) 17:49:39int main(void)
{
char *MojiC;
printf("MojiC = "); scanf("%s", MojiC);
return(0);
}
というコードだと、MojiCのアドレスが不定で、
MojiCが指す先にアクセスできる保証がないから、
scanf("%s", MojiC); はアクセスできないところにアクセスすることにつながるので問題である(エラーが出る)。
int main(void)
{
char MojiC;
printf("MojiC = "); scanf("%s", &MojiC);
return(0);
}
というコードなら、char MojiC;のところで
MojiCのアドレスはアクセスできるアドレスになることが決まるので
scanf("%s", &MojiC); は問題ない。
ということでしょうか?
まだまだポインタの基本がわかっていないのでもうチョット勉強します。
0137デフォルトの名無しさん
2009/02/11(水) 18:01:21データを保存などしてはいけない。
たまたま問題がなかったなどという恥ずかしい発言はやめたまえ。
0138デフォルトの名無しさん
2009/02/11(水) 18:03:11char *MojiC;
MojiC = &MojiA[0];
printf("MojiC = "); scanf("%s", MojiC);
これでもいい。
0139デフォルトの名無しさん
2009/02/11(水) 18:03:11scanf の %s は文字列を受け取る指定。
つまりバグってる。
0140デフォルトの名無しさん
2009/02/11(水) 19:56:32問題あり。
char MojiC は1バイトしか領域がないから、その後ろの領域をぶち壊してる。
ぶち壊した領域にたまたま何も無かったから目に見えることがおきなかっただけ。
0141デフォルトの名無しさん
2009/02/11(水) 20:04:410142デフォルトの名無しさん
2009/02/11(水) 20:09:06それとも偶然なんともないこともあれば偶然重大な被害をもたらすこともある?
0143デフォルトの名無しさん
2009/02/11(水) 20:13:51#include<stdio.h>
int main(void){
volatile int a=2, b=3, c=4;
for(;a;a--){
(&b)[1]=b;
printf("a=%d\n", a);
}
for(;c;c--){
(&b)[1]=b;
printf("c=%d\n", c);
}
return 0;
}
0144デフォルトの名無しさん
2009/02/11(水) 20:17:16駅で刃物振り回すキチガイがいたら、
ケガ人が出ていなくても、マズイだろ?
0145デフォルトの名無しさん
2009/02/11(水) 20:18:58こ、これなに・・・?
volatile修飾子って初めて見たからググってみたら最適化を抑止するのか。
怖くて実行できない><
>>144
まぁそうなんだけど、大抵エラーウィンドウが出てなんもおこらないままだからさ〜
0146デフォルトの名無しさん
2009/02/11(水) 20:20:29自分の内部を壊しながら動いてるわけだから、一見して死ぬはずのないところで死ぬ。free()したときとか。
なんともないときがあるのは、たまたま壊した部分を動かさなかっただけ。
DVD+HDDレコーダのDVD部分が壊れてても、DVDを使わなきゃ気付かないように。
あと、死ななくてもデータがいつの間にか壊れてたりする。
時間が経ってから壊れてることに気付くと、バックアップも含めて全部壊れてたりする。
0147デフォルトの名無しさん
2009/02/11(水) 20:24:29ファイル操作API含んでるだけで偶然が重なって
boot.ini消しちまったとか
簡単にあり得るからね。
0148デフォルトの名無しさん
2009/02/11(水) 20:34:07これじゃあ学習できないよ
0149デフォルトの名無しさん
2009/02/11(水) 20:36:250150デフォルトの名無しさん
2009/02/11(水) 20:47:25>>143 は printf の無限ループだからどうってことはない
0151デフォルトの名無しさん
2009/02/11(水) 20:56:03マジこええ
0152デフォルトの名無しさん
2009/02/11(水) 21:00:29それに*が付くと(char*, int*)アドレスを代入する変数
例:
○ char hoge = 10;
× char hoge = &MojiB;
× char* phoge = 10;
○ char* phoge = &MojiB;
0153デフォルトの名無しさん
2009/02/11(水) 21:05:050154デフォルトの名無しさん
2009/02/11(水) 21:08:16PC上だと共有メモリとか使ってない限りは
OSが上手いことしてくれるから大丈夫。
組込みでやっちまったら暴走する。
最悪火事とか起こって人が死ぬ。
0155122
2009/02/11(水) 21:16:35ご指摘頂きありがとうございます。
変換指定子を十分意識できていませんでした。
たびたび申し訳ありませんが、
>>136を一部改良した、以下の2つのコードについての私の理解を以下に記載しました。
私の理解に問題がないか、回答よろしくお願いします。
int main(void)
{ char *MojiC;
printf("MojiC = "); scanf("%c", MojiC);
return(0); }
では、char *MojiC; の箇所でMojiCに適当なアドレス値が入る(明示的なメモリ領域は確保されない)。
このとき、アクセスしてはいけない(あるいは存在しない)アドレス値がMojiCに割り当てられると、
scanf("%c", MojiC); の箇所で、キーボードから入力された文字をアクセスしてはいけない(あるいは存在しない)メモリ領域に
書き込もうとするが、アクセスできないので Segmentation fault (core dumped) というエラーが発生した。
このような、明示的に確保されていない領域へアクセスすることになるプログラムは作ってはならない。
int main(void)
{
char MojiC;
printf("MojiC = "); scanf("%c", &MojiC);
return(0);
}
では、char MojiC; の箇所でchar型のMojiCを格納するためのメモリ領域が明示的に確保される。
scanf("%c", &MojiC); の箇所で、MojiCのために確保された1バイトの領域にキーボードから入力された文字が保存される。
0156デフォルトの名無しさん
2009/02/11(水) 22:05:01日本語でおkは無しにしてくれ
0157デフォルトの名無しさん
2009/02/11(水) 22:07:09あんなの全部理解してる人いるのか?
0158デフォルトの名無しさん
2009/02/11(水) 22:14:39理解できなくても リファレンスを見て扱えればいいんじゃねえの
0159デフォルトの名無しさん
2009/02/11(水) 22:19:14処理系依存
ただしポインタは配列末尾 + 1 や、配列先頭 -1 を正しく指すことが保証されている。
内容書き換えはダメだが。
0160デフォルトの名無しさん
2009/02/11(水) 22:22:44配列先頭 -1 なんてあったっけ?
0161デフォルトの名無しさん
2009/02/11(水) 22:25:59func2(int n, ...);
を作って
func1から...をfunc2に渡すにはどうすれば?
0162デフォルトの名無しさん
2009/02/11(水) 22:27:57方法は無い。
printf/vprintfみたいに、予め...版とva_args版の両方を作っておくのが常套手段。
0163デフォルトの名無しさん
2009/02/11(水) 22:28:16多分、合ってる。厳密には char *Mojic の場合でも char*型の値
1つ分のメモリ領域が明示的に確保されるけどね。
>>156
いろいろな事が起こる。
OSが許可していない領域にアクセスすると、保護違反でプロセスが強制終了。
スタック、コード等を書き換えてプログラムを暴走させたり、OSの特権を奪ったりできる。
>>157
理解してるけど、暗記はしていない。良く使うAPIの数は、そんなに多くないから
長くやっていれば自然に覚える。基本的に過去のプログラムをコピペして使う。
使い方を忘れた時だけリファレンス参照。
0164デフォルトの名無しさん
2009/02/11(水) 22:30:200165デフォルトの名無しさん
2009/02/11(水) 22:53:38処理系依存なので、OSやコンパイラの種類によって結果は違うが、
以下はWindows XP + Cygwin GCC 3.4.4 (最適化無し)で実験した結果。
自分の環境ではどうなるか、実際に動かして試してくれ。
#include <stdio.h>
int main(void) {
volatile int count = 1;
volatile int ia = 10;
volatile char sa[4] = "";
volatile int ib = 20;
volatile char sb[4] = "";
volatile int ic = 30;
for (;;) {
printf("%d:sa> ", count);
scanf("%s", sa);
printf("%d:sb> ", count);
scanf("%s", sb);
printf("[%d][%s][%d][%s][%d]\n", ia, sa, ib, sb, ic);
count++;
}
return 0;
}
1:sa> aaa ← 3文字入力。末尾に'\0'が付くので4バイトになる。
1:sb> bbb ← 同上。
[10][aaa][20][bbb][30] ← 問題なし。
3:sa> aaaaaa ← 6文字入力。同7バイト。
3:sb> bbbbbb ← 同上。
[24929][aaaaaa][25186][bbbbbb][30] ← 配列の範囲をはみ出してia, ibを壊した。icは無事。
1:sa> aaaaaaaaaa ← 10文字入力。同11バイト。
24929:sb> bbbbbbbbbb ← 同上。saをはみ出し過ぎてcountまで壊した。(実はこのとき、iaも壊してる)
[1633771873][bb][1650614882][bbbbbbbbbb][30] ← sbをはみ出し過ぎて、ibだけでなくsaも壊した。
0166デフォルトの名無しさん
2009/02/11(水) 22:55:34補足。コピペしたのを一部削ったので、countの表示がずれてるが無視してくれ。
0167デフォルトの名無しさん
2009/02/12(木) 05:01:36ttp://f4.aaa.livedoor.jp/~pointc/106/No.28723.htm#28742
ここに書かれてある数独を解くプログラムについてなのですが、
サブルーチンstepの10行目あたりの、
b[r][c] = ' ';
は、なぜ必要なのでしょうか?
その上の行に、
step(r, c + 1)
があるので、そこに辿りつくことはないと思うのですが・・・。
でもそれを抜くとやっぱり機能しません。
分かる方いらっしゃれば、教えてください。
よろしくお願いします。
0168デフォルトの名無しさん
2009/02/12(木) 05:16:02step()関数から戻ってきてから実行される。
検索のヒント:「再帰」
そのコードは、初心者には読み難いトリッキーなところがあるから余りお勧めできないが。
0169デフォルトの名無しさん
2009/02/12(木) 06:47:33仕様に反しないで行う方法はないが
スタックフレームのメモリ全体をそのまま渡すことで大抵の環境では動かすことが出来る。
ただし、この文章の意味がわからないようなら諦めたほうが無難。
コードを示すのは簡単だけど、意味がわからなければバグの元だから。
0170デフォルトの名無しさん
2009/02/12(木) 10:36:26は解りますが
unsigned 変数名;
だとどうなるのですか?
0171デフォルトの名無しさん
2009/02/12(木) 10:39:30unsigned int と同じ
省略時には int と解釈される
0172デフォルトの名無しさん
2009/02/12(木) 17:15:52#include <stdio.h>
int uru(int seireki)
{
int x;
if (seireki % 4 != 0)
{
x = 0;
}
else if (seireki % 100 != 0)
{
x = 1;
}
else if (seireki % 400 == 0)
{
x = 1;
}
else
{
x = 0;
}
return x;
}
void main()
{
int y;
y = uru(2004);
printf("%d", y);
}
コンパイルしようとすると、printf("%d", y);が
「不正な文字」のようですが、分かりません。
0173167
2009/02/12(木) 17:19:23再帰について調べてみましたが・・・、難しいです。
とりあえず、途中で行き詰まった時のやり直しをそこで行っているということですね。
ありがとうございました。
0174デフォルトの名無しさん
2009/02/12(木) 17:22:50全角空白が入っている
0175デフォルトの名無しさん
2009/02/12(木) 17:23:50○int main()
0176デフォルトの名無しさん
2009/02/12(木) 18:05:190177デフォルトの名無しさん
2009/02/12(木) 18:07:440178デフォルトの名無しさん
2009/02/12(木) 18:14:46#これはなんと読みますか?
0179デフォルトの名無しさん
2009/02/12(木) 18:18:08普通読まない
0180デフォルトの名無しさん
2009/02/12(木) 18:19:28しゃーぷいんくるーど
0181デフォルトの名無しさん
2009/02/12(木) 18:25:270182デフォルトの名無しさん
2009/02/12(木) 18:29:35いげたとかシャープとか
でも普通読まない
0183デフォルトの名無しさん
2009/02/12(木) 18:29:58インクルード ストリングエイチと言ってinclude stringhなんて書くのはアホ以外の何でもない
0184デフォルトの名無しさん
2009/02/12(木) 18:41:350185デフォルトの名無しさん
2009/02/12(木) 18:46:46情報処理用語の読み方を確認するスレ
http://pc11.2ch.net/test/read.cgi/tech/1056173956/
0186デフォルトの名無しさん
2009/02/12(木) 19:07:06トン
なかなか面白いスレだw
0187デフォルトの名無しさん
2009/02/12(木) 23:16:13別ファイルで宣言した構造体の配列を
extern struct info info_list[];
sizeof(info_list);
とやるとまぁ当然コンパイルエラーになるんですが、
配列のサイズを知る方法はありますかね?
0188デフォルトの名無しさん
2009/02/12(木) 23:39:20#defube INFO_SIZE 10
extern struct info info_list[INFO_SIZE];
[a.c]--------------------
#include "a.h"
struct info info_list[INFO_SIZE];
------------------------
[b.c]
#include "a.h"
:
:
0189デフォルトの名無しさん
2009/02/12(木) 23:40:27○ #define
0190デフォルトの名無しさん
2009/02/13(金) 00:55:54戻り値をミリ秒単位に変換したいのですが
どうしたらいいですか?
0191デフォルトの名無しさん
2009/02/13(金) 01:07:29何から何まで間違ってる
gettimeofdayのマニュアルを読み直すこと
0192デフォルトの名無しさん
2009/02/13(金) 07:32:36マイクロをミリにしたいなら1000で割る
1000マイクロ = 1ミリ
0193デフォルトの名無しさん
2009/02/13(金) 15:45:57http://science6.2ch.net/test/read.cgi/denki/1231687664/343-
上のAVRというマイコンのスレで、volatile付き構造体の動作が
おかしいんじゃないかって話題が出たのですが、
どう解釈するのが正しいんでしょうか?
コンパイラはgccです。gccのバージョンは不明ですが恐らく3か4。
要約すると、
割り込み中にvolatile付き構造体変数を更新して、外からその変数の
構造体メンバを参照したとき、上手く反映されないというものです。
1) C言語の仕様(構造体メンバ変数個別にvolatileを付けるべき)
2) gccのバグ
3) AVRのポーティングバグ
4) その他
0194デフォルトの名無しさん
2009/02/13(金) 16:09:11むこうに回答しといた
0195test ご迷惑おかけします
2009/02/13(金) 17:03:26늚는닿늖닒녪늑ꛩꡑ늙늂늂늃닿늘
〜〄【〛〖〞〔】『、뉻뉼뉤뉰뉻뉶뉾뉴뉱뉸
0196デフォルトの名無しさん
2009/02/13(金) 17:34:20桁数が大きくなった場合はどうすればいいのでしょうか?
#include<stdio.h>
int kansu(int,int);
main(){
int i,j;
for(;;){
printf("整数ij(i^j)を入力(i<0:終了)>");
scanf("%d%d", &i,&j);
if(i<0)break;
else if(i==0) printf("%d^%dの時、下1桁目の値=0\n",i,j);
printf("%d^%dの時、下1桁目の値=%d\n",i,j,kansu(i,j));
}
printf("Good bye!\n");
}
int kansu(int i,int j)
{
int k,keta=0;
keta=i;
for(k=1;k<j;k++){
keta*=i;
}
keta = keta%10;
return keta;
}
0197デフォルトの名無しさん
2009/02/13(金) 18:03:27+ keta = (keta * i) % 10;
0198デフォルトの名無しさん
2009/02/13(金) 18:50:54C言語でアスペクト思考プログラミングってどうやるの?
0199デフォルトの名無しさん
2009/02/13(金) 19:08:370200196
2009/02/13(金) 19:15:51ありがとうございました。無事できました。
0201デフォルトの名無しさん
2009/02/13(金) 21:19:29直したいです。
#include<stdio.h>
#define STUDENTS 3
#define EXAMS 4
main(){
int i,j,total=0;
float avgGrade[STUDENTS];
int studentGrades[STUDENTS][EXAMS]={77,68,86,73,96,87,89,78,70,90,86,81};/*各学生の平均点*/
/*平均*/
for(i=0;i<STUDENTS;i++){
for(j=0;j<EXAMS;j++){
total+=studentGrades[i][j];
avgGrade[i]=(float)total/EXAMS;
}
printf("学生%dの平均点は%.2f\n",i+1,avgGrade[i]);
}
}
0202デフォルトの名無しさん
2009/02/13(金) 21:30:28なぜそうなるかはわかってるんだが、もはや標準ライブラリではないだろ。
ライブラリから消せよ。
0203デフォルトの名無しさん
2009/02/13(金) 21:35:05何周目だよ・・・
0204デフォルトの名無しさん
2009/02/13(金) 21:37:58total=0;
あと、配列の初期化がおかしい
コンパイラに文句言われるだろ?
0205デフォルトの名無しさん
2009/02/13(金) 21:50:11#define STUDENTS 3
#define EXAMS 4
void main(void){
int i,j,total=0;
float avgGrade[STUDENTS];
int studentGrades[STUDENTS][EXAMS]={{77,68,86},{73,96,87},{89,78,70},{90,86,81}};/*各学生の平均点*/
/*平均*/
for(i=0;i<STUDENTS;i++){
for(j=0;j<EXAMS;j++){
total = total + studentGrades[i][j];
}
avgGrade[i]=(float)total/EXAMS;
printf("学生%dの平均点は%.2f\n",i+1,avgGrade[i]);
}
}
これでいけるはず。コンパイルしてません
0206デフォルトの名無しさん
2009/02/13(金) 21:51:55#define STUDENTS 3
#define EXAMS 4
void main(void){
int i,j,total=0;
float avgGrade[STUDENTS];
int studentGrades[STUDENTS][EXAMS]={{77,68,86},{73,96,87},{89,78,70},{90,86,81}};/*各学生の平均点*/
/*平均*/
for(i=0;i<STUDENTS;i++){
for(j=0;j<EXAMS;j++){
total = total + studentGrades[i][j];
}
avgGrade[i]=(float)total/EXAMS;
printf("学生%dの平均点は%.2f\n",i+1,avgGrade[i]);
total = 0;
}
}
0207デフォルトの名無しさん
2009/02/13(金) 21:52:31www
0209赤西仁
2009/02/13(金) 22:47:36アークザラッド�Uというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッド�Uは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
スクリーンショットじゃ嫌なんです。どうか皆さん、お力をお貸しください。
0210デフォルトの名無しさん
2009/02/13(金) 22:50:340211デフォルトの名無しさん
2009/02/13(金) 22:53:500212デフォルトの名無しさん
2009/02/13(金) 23:20:240213デフォルトの名無しさん
2009/02/13(金) 23:29:30ネット上の知を駆使してダメなんだから、無理なんじゃないの?
0214デフォルトの名無しさん
2009/02/13(金) 23:43:460215赤西仁
2009/02/13(金) 23:50:02おねがいします! 御礼はします!
0216デフォルトの名無しさん
2009/02/13(金) 23:53:570217デフォルトの名無しさん
2009/02/13(金) 23:56:040218デフォルトの名無しさん
2009/02/13(金) 23:56:26ゲーム持ってないけど
0219デフォルトの名無しさん
2009/02/13(金) 23:58:470220赤西仁
2009/02/14(土) 00:02:210221デフォルトの名無しさん
2009/02/14(土) 00:03:46どっかいってください
0222デフォルトの名無しさん
2009/02/14(土) 00:03:470223デフォルトの名無しさん
2009/02/14(土) 00:04:310224デフォルトの名無しさん
2009/02/14(土) 00:06:04画像抽出が無理なら別の方法を考えろよ
PSで表示できるということは・・・
0225デフォルトの名無しさん
2009/02/14(土) 00:06:260226デフォルトの名無しさん
2009/02/14(土) 00:06:480227デフォルトの名無しさん
2009/02/14(土) 00:10:050228デフォルトの名無しさん
2009/02/14(土) 00:11:54抽出意外に全パターン取り出すのは大変だろう
0229デフォルトの名無しさん
2009/02/14(土) 00:12:110230デフォルトの名無しさん
2009/02/14(土) 00:14:03わざわざこういうこと書くやつに限って違法行為するよね
0231デフォルトの名無しさん
2009/02/14(土) 00:14:280232デフォルトの名無しさん
2009/02/14(土) 00:15:34そう言うお前は人殺しだろ
0233赤西仁
2009/02/14(土) 00:33:32画像データがいっぱい埋め込まれてるファイルをアップしたいんですが
0234デフォルトの名無しさん
2009/02/14(土) 00:35:060235デフォルトの名無しさん
2009/02/14(土) 00:35:43そのゲームが他人の著作物なら、一部でも無断でアップしたら違法
0236デフォルトの名無しさん
2009/02/14(土) 00:38:30と
#define test(h){ h->data}
って動作かわりますかね?
0237デフォルトの名無しさん
2009/02/14(土) 00:46:010238デフォルトの名無しさん
2009/02/14(土) 00:51:010239デフォルトの名無しさん
2009/02/14(土) 00:51:28すいません
#define test(h){ h->data; }
でした
0240デフォルトの名無しさん
2009/02/14(土) 00:52:270241デフォルトの名無しさん
2009/02/14(土) 00:52:420242デフォルトの名無しさん
2009/02/14(土) 00:53:45if(hoge(h))
hoge(h);
else
a = hoge(h);
全然違うお
0243デフォルトの名無しさん
2009/02/14(土) 00:54:06test(h) だった
0244デフォルトの名無しさん
2009/02/14(土) 00:54:21ショックだ
0245デフォルトの名無しさん
2009/02/14(土) 00:54:470246デフォルトの名無しさん
2009/02/14(土) 00:55:48( ´∀`)< オマエモナー
( ) \_____
| | |
(__)_)
0247デフォルトの名無しさん
2009/02/14(土) 00:56:490248デフォルトの名無しさん
2009/02/14(土) 01:01:46プリプロセッサディレクティブを if などの構文と同じものだと勘違いしているように見えるな。
0249赤西仁
2009/02/14(土) 01:06:17お礼はかなりします。
本当にします。約束します。
0250デフォルトの名無しさん
2009/02/14(土) 01:07:440251デフォルトの名無しさん
2009/02/14(土) 01:15:24いいかげんスレ違いですよ
2chで聞くのは諦めてメーカーや知人に頼んでみてはどうですか
0252デフォルトの名無しさん
2009/02/14(土) 01:16:28SSを切り抜けばいい
一年もかからず終わるだろw
0253デフォルトの名無しさん
2009/02/14(土) 01:18:11{
f();
g();
}
こんなコードでもコンパイルが通るらしい。謎だ
0254デフォルトの名無しさん
2009/02/14(土) 01:18:28こんなコード危険だから書くな
0255デフォルトの名無しさん
2009/02/14(土) 01:20:54そのコードはこう書いても同じこと。
if (a == 1) {}
f();
g();
要は、ブロック化は任意に行なえるのでそうなる。
0256デフォルトの名無しさん
2009/02/14(土) 01:21:07お礼っていくら?
0257デフォルトの名無しさん
2009/02/14(土) 01:27:22勉強になりますた
0258赤西仁
2009/02/14(土) 01:27:40zaken@e.email.ne.jp
メールください
zと@は半角で。
0259赤西仁
2009/02/14(土) 01:30:07z.emailでした
0260デフォルトの名無しさん
2009/02/14(土) 01:58:12厳密には違うだろw
0261デフォルトの名無しさん
2009/02/14(土) 03:37:51f()やg()がマクロだとスコープの影響を受けるかもしれないけど、それは「違う」と言えないでしょ。
0262デフォルトの名無しさん
2009/02/14(土) 06:58:18結果として動作が同じになるかもしれないけど、
少なくともコード上ではスコープは違う。
0263デフォルトの名無しさん
2009/02/14(土) 09:42:41「f()やg()がマクロだとスコープの影響を受けるかもしれない」
ってどういう場合、具体的な例で説明して
0264デフォルトの名無しさん
2009/02/14(土) 10:10:520265デフォルトの名無しさん
2009/02/14(土) 10:37:570266デフォルトの名無しさん
2009/02/14(土) 10:57:40どう影響受けるの?
0267デフォルトの名無しさん
2009/02/14(土) 11:08:16スコープが変わる。
0268デフォルトの名無しさん
2009/02/14(土) 11:15:35{}で囲ってるんだからあたり前。マクロとか関係ない。
0269デフォルトの名無しさん
2009/02/14(土) 11:21:09>>267
×{}で囲ってるんだからあたり前。マクロとか関係ない。
○{}で囲ってないんだからあたり前。マクロとか関係ない。
0270デフォルトの名無しさん
2009/02/14(土) 11:31:40スコープが同じだと再定義エラーになる
0271デフォルトの名無しさん
2009/02/14(土) 11:38:52スレ違いと言われてるのにいつまでやる気だボケ。
C言語と何の関係もないだろう。
0272デフォルトの名無しさん
2009/02/14(土) 11:44:32「#define f(x) int a = x 」この例ではそうなるだけで
>>253 と >>255 では違う。(厳密も何もない、まったく別物です)
0273デフォルトの名無しさん
2009/02/14(土) 11:49:44>253と>255では何が違うのですか?
0274デフォルトの名無しさん
2009/02/14(土) 11:52:10スコープが違う。
>>262にも書いてある。
0275デフォルトの名無しさん
2009/02/14(土) 11:55:22「f()やg()がマクロだと」って限定する意味がわからん。
0276デフォルトの名無しさん
2009/02/14(土) 11:58:43それが>253と>255においてどんな影響があるのですか?
全く影響がないなら、違うと言えない気がするのですけど。
0277デフォルトの名無しさん
2009/02/14(土) 12:00:170278デフォルトの名無しさん
2009/02/14(土) 12:08:24影響の有無は、コードによるけど、コードとしては>>253と>>255は別物です。
f()とg()がifのスコープの外か内だけの違いだけではない。
>>253 も >>255 もifのスコープの外だが、
>>253 はf()とg()が別のスコープ内にある。
>>255 はmain(){}のスコープ内にある。
0279デフォルトの名無しさん
2009/02/14(土) 13:12:32つーか、>253がmain()内でもmain()のスコープ外なんですか?
もう少し整理してから書いてください。
0280デフォルトの名無しさん
2009/02/14(土) 14:56:03( ゚∀゚)彡 スコープ、スコープ
⊂彡
0281デフォルトの名無しさん
2009/02/14(土) 15:05:19> >>255が自作関数内でもmain()のスコープ内なんですか?
mainでも他の関数でもいい。
>>255 のコードが存在するスコープにある。
>つーか、>253がmain()内でもmain()のスコープ外なんですか?
あ〜言い方が悪かった、{}で囲まれてるから別スコープってこと
そのブロックはmain(){}のスコープ内にあるかもしれんし
別のスコープ内にあるかもしれん。(書かれてない部分はしらん。)
>>255
int main()
{
if (a == 1) {}
f();
g();
}
>>253
int main()
{
if (a == 1);
{
f();
g();
}
}
として説明してる。
0283デフォルトの名無しさん
2009/02/14(土) 16:56:53や質問文だけで答えが導けず条件をつけたり、面接官に訊ねなければならないなどユニークな面接試験を行っているらしい。
マイクロソフト入社試験 面接官 ウィリアム・ヘンリー
問 以下のC言語プログラムの違いを論じよ
--- <0> ---
void main(){
foo(x,y);
Foo(x,y);
}
--- <1> ---
void main(){
if(1) { foo(x,y);
Foo(x,y); }
}
--- <2> ---
void main(){
do{ foo(x,y);
Foo(x,y); }while(0);
}
こんなのあったら、どうする?
0284デフォルトの名無しさん
2009/02/14(土) 17:06:53int i;
i=20;
なんですが
int i;
&i=20;
メモリアドレスにアクセスするには&をつけるんですが
なぜ変数をセットする場合
&をつけずに値をきめられるんでしょうか教えてください。
0285晒し
2009/02/14(土) 17:17:36int i; &i = 20;
これコンパイルエラーにならないか?以下のわからない部分言ってみな
&iはiのアドレスで、iはiという箱を指す。アドレスに直値放り込んじゃだめ。
int i; i = 20; //OK 普通の値代入
int j; &j= 20; //NG アドレスへの値の代入????
int &k; k=i; //NG??でもないけど原則だめ(int*にintの値を代入)
/* */ k = &i; //OK ポインタ変数へのアドレスの代入
/* */ i = k; //NG??でもないけど原則だめ(intにint*の代入)
/* */ i = *k; //OK int型にアドレスを参照した値を代入
0286デフォルトの名無しさん
2009/02/14(土) 17:22:450番のプログラムを基本とすると、1番は最適化で0番と同じになると期待すると、ビルドするしないの
切り替えを1文字書き換えで実現できて便利なコーディングスタイルといえる。
2番も機能的には同じだが、コンティニューした場合の挙動が意図した条件にマッチしなくなってくるため
あまり推奨しない。
0287デフォルトの名無しさん
2009/02/14(土) 17:46:56error C2064: 302 引数を取り込む関数には評価されません。
と、エラーが出て躓きました。
どこがまずいのかご教授願います。
#include<stdio.h>
#include<math.h>
main()
{
double y,yy,x,d,h,e,x1,x0;
y=x*x-5*x+6;
yy=((x+h)(x+h)-5*(x+h)+6-y)/h;
h=0.001;
x0=1.0,5.0;
e=0.000001;
printf("%f %f %f",x,x+h,yy);
for(;;)
{
x1=x-y/yy;
d=x1-x;
if(fabs(d)<=e)break;
}
printf("%f\n",x);
}
0288デフォルトの名無しさん
2009/02/14(土) 17:48:020289デフォルトの名無しさん
2009/02/14(土) 17:54:010290デフォルトの名無しさん
2009/02/14(土) 17:55:45↑は何?x1の書き忘れでもないだろうが・・・・・必要なきゃ消せば?
0291デフォルトの名無しさん
2009/02/14(土) 17:58:09y=x*x-5*x+6;
yy=((x+h)(x+h)-5*(x+h)+6-y)/h;
h=0.001;
って感じかな?xが初期化されてないのに式で使われてるね。
0292デフォルトの名無しさん
2009/02/14(土) 18:06:04y=x*x-5*x+6;
yy=((x+h)(x+h)-5*(x+h)+6-y)/h;
この2行は後のループのところで評価されるわけじゃないよ
0293デフォルトの名無しさん
2009/02/14(土) 19:11:12初期値を与えないと解けない気がして……
皆さんの意見をもとにいくらか書き直してみましたが、どうにもうまく行きません
#include<stdio.h>
#include<math.h>
main()
{
double y,yy,x,d,h,e,x1,x0;
x0=1.0,5.0;
h=0.001;
e=0.000001;
y=x*x-5*x+6;
yy=((x+h)*(x+h)-5*(x+h)+6-y)/h;
for(;;)
{
x1=x0-y/yy;
d=x1-x0;
if(fabs(d)<=e)break;
y=x*x-5*x+6;
yy=((x+h)*(x+h)-5*(x+h)+6-y)/h;
}
printf("%f\n",x1);
}
'aaa.exe': 'C:\Users\yuma\Documents\Visual Studio 2008\Projects\aaa\Release\aaa.exe' を読み込みました。シンボルが読み込まれました。
'aaa.exe': 'C:\Windows\System32\ntdll.dll' を読み込みました
'aaa.exe': 'C:\Windows\System32\kernel32.dll' を読み込みました
'aaa.exe': 'C:\Windows\winsxs\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_none_e163563597edeada\msvcr90.dll' を読み込みました
スレッド 'Win32 スレッド' (0x3dc) はコード -1073741510 (0xc000013a) で終了しました。
プログラム '[2196] aaa.exe: ネイティブ' はコード -1073741510 (0xc000013a) で終了しました。
0294デフォルトの名無しさん
2009/02/14(土) 19:41:01関数呼出の括弧内以外での式の中に置かれたカンマには、式を複数並べる効果しかない。
0295デフォルトの名無しさん
2009/02/14(土) 20:37:30この場合、Aが真であればBは評価されないことが保障されるのでしょうか
0296デフォルトの名無しさん
2009/02/14(土) 20:39:040297デフォルトの名無しさん
2009/02/14(土) 20:39:16はい。保障されます。
0299デフォルトの名無しさん
2009/02/14(土) 20:51:20ありがとうございます
その他のみなさんもありがとうございました
解決できるように考えてみます
0300デフォルトの名無しさん
2009/02/14(土) 21:12:45#include <stdio.h>
int *sub(void)
{
int ad;
int *p = &ad;
return(p);
}
void main(void)
{
int *p = NULL;
p = sub();
printf("p -> %p",p);
}
sub関数内のローカル変数のアドレスを取得したいのですが、なぜかmain関数ではNULL値が
表示されてしまうのです。さぁみんなで考えようではありませんか
0301デフォルトの名無しさん
2009/02/14(土) 21:15:26質問が間違っているのでは?
0302デフォルトの名無しさん
2009/02/14(土) 21:19:110303デフォルトの名無しさん
2009/02/14(土) 21:23:46どこかまずいところがあるんでしょうか。
ポインタのお勉強ということで、思いつきで作ってみました。
で、意図した動作にならないので何がまずかったのか・・。←いまここ
0304デフォルトの名無しさん
2009/02/14(土) 21:25:41> NULL値が表示され
どこの処理系でだよ? でたらめじゃねえだろうな
0305デフォルトの名無しさん
2009/02/14(土) 21:26:440306デフォルトの名無しさん
2009/02/14(土) 21:28:02ローカル変数のアドレスは、関数から脱出した時点で無効です。諦めましょう。
>なぜかmain関数ではNULL値が表示されてしまうのです。
普通、不定値が表示されると思うけどまぁいいや。
>さぁみんなで考えようではありませんか
釣り?
0307デフォルトの名無しさん
2009/02/14(土) 21:35:23関数内で宣言されたローカルはその関数内で有効で、関数を抜けると無効になるんですね。
サンクスです
0308デフォルトの名無しさん
2009/02/14(土) 21:37:430309デフォルトの名無しさん
2009/02/14(土) 21:38:23すげぇ、他人のレスに書いてある回答を読んだだけで自己解決だって言っちゃってるよ。
きっと、他人のプログラムをコピペしても、自作って言い張るんだろうな。
0310デフォルトの名無しさん
2009/02/14(土) 21:44:270311デフォルトの名無しさん
2009/02/14(土) 21:44:590312デフォルトの名無しさん
2009/02/14(土) 21:48:40知りたかったのは、別関数のローカル変数のアドレスを取得できるかということです。
0313デフォルトの名無しさん
2009/02/14(土) 21:51:03できる
0314デフォルトの名無しさん
2009/02/14(土) 21:52:44ビルドエラーになるし ワーニングがでる
それをなくしてから実行すべきだと思う
0315デフォルトの名無しさん
2009/02/14(土) 21:55:49ローカル変数の頭にstaticをつけることですね!
0316デフォルトの名無しさん
2009/02/14(土) 21:55:57どうせ処理系がどうとか、細かいことは質問に答えられないってレベルだろうし、
どうでもいいか。
0317デフォルトの名無しさん
2009/02/14(土) 21:57:560318デフォルトの名無しさん
2009/02/14(土) 21:58:24static つけなくてもいいよ
アドレスを得ることは可能
関数を抜けた時点でそのアドレスに意味が無くなるだけで
0319デフォルトの名無しさん
2009/02/14(土) 22:29:26とりあえず「ローカル変数 スタック」でググれ
0320デフォルトの名無しさん
2009/02/14(土) 22:41:33なにもまずくないよ。ただしNULLが表示されるのはおかしい。
0321デフォルトの名無しさん
2009/02/14(土) 22:42:14ローカル変数 static でぐぐったり
auto 変数とかもぐぐれ
0322デフォルトの名無しさん
2009/02/14(土) 22:43:38staticを付ける必要はないよ。>>300で正しい。
ただし、>>300が正しく動けばNULLではない値が表示されるはず。
0323デフォルトの名無しさん
2009/02/14(土) 23:00:53NULL が出たという話はでたらめだったのか、本当なのかはっきりしろ!
0324デフォルトの名無しさん
2009/02/14(土) 23:03:010325デフォルトの名無しさん
2009/02/14(土) 23:17:080326デフォルトの名無しさん
2009/02/14(土) 23:23:160327デフォルトの名無しさん
2009/02/14(土) 23:43:32printf("%d", (int)*arg);
}
sub() {
int a = 1;
pthread_t tid;
pthread_create(&tid, NULL, sub2, (void *)&a);
pthread_join(tid);
}
0328デフォルトの名無しさん
2009/02/15(日) 00:02:520329デフォルトの名無しさん
2009/02/15(日) 00:17:18NULLは表示されません。不定値が表示されます。
0330デフォルトの名無しさん
2009/02/15(日) 00:20:45誰だ?
0331デフォルトの名無しさん
2009/02/15(日) 00:26:25ソース張る前にあちこちいじっていたので、その余分なコードを削除して
貼り付けたのが>>300
なので、300に掲載されているコードを実行すると不定値が表示されました。
でたらめいってすみませんでした。
0332デフォルトの名無しさん
2009/02/15(日) 00:27:570333デフォルトの名無しさん
2009/02/15(日) 00:28:14>>300で表示されるのはローカル変数のアドレス。
不定値ではない。
0334デフォルトの名無しさん
2009/02/15(日) 00:30:59なるほど。でも意味のないアドレスなので、不正領域へのアクセスになるか。
0335デフォルトの名無しさん
2009/02/15(日) 00:33:38>>300ではポインタの参照先をアクセスしていないので全く問題ない。
アドレスを表示したかったんだろ?不正でも何でもない。完全に正しい動作。
0336デフォルトの名無しさん
2009/02/15(日) 00:34:390337デフォルトの名無しさん
2009/02/15(日) 00:36:42なるほど、参考になりました。
おかげさまでC言語のスキルが0.3upしました。
0338デフォルトの名無しさん
2009/02/15(日) 01:01:43実行環境に依って値が変わるわけで
不定値の定義にもよるな
0339デフォルトの名無しさん
2009/02/15(日) 01:10:06あちこちいじる前には NULL が出ていたのか?
0340デフォルトの名無しさん
2009/02/15(日) 01:17:02特定の実行環境でのローカル変数のアドレスを返すことを目的とした特定の関数の実行時のローカル変数の確定したアドレスを返しているわけだから、
仕様通りの完全な値であって、不定値ではない。
パラメータによって戻り値が変わるからと言って、それを不定値とは言わないだろう。
//+2を取得する関数
int get_plus_2(int i) { return i+2; }
//ローカル変数のアドレスを取得する関数
int* get_local_variable_address() { int i; return &i; }
0341339
2009/02/15(日) 01:22:010342デフォルトの名無しさん
2009/02/15(日) 01:28:59だ・か・ら
不定値の定義もよるだろって言ってんだよ
0343デフォルトの名無しさん
2009/02/15(日) 01:30:01じゃあ、君は不定値をどう定義をしたんだ?
0344デフォルトの名無しさん
2009/02/15(日) 01:42:07だから 作っている人が何を返してほしいかによる。
よって スタックのアドレスが知りたければ 不定値ではないのでは?
0345デフォルトの名無しさん
2009/02/15(日) 01:44:493行目には同意。
0346デフォルトの名無しさん
2009/02/15(日) 01:49:130347デフォルトの名無しさん
2009/02/15(日) 01:50:420348デフォルトの名無しさん
2009/02/15(日) 01:55:18そういうことだ
0349デフォルトの名無しさん
2009/02/15(日) 02:01:490350デフォルトの名無しさん
2009/02/15(日) 02:07:49つまり、お前の世界では
malloc(100);
の戻り値も不定であるということだな。
0351デフォルトの名無しさん
2009/02/15(日) 02:10:50空いたところのどことってくるかわかんないとでも考えてるんだろう
0352デフォルトの名無しさん
2009/02/15(日) 02:11:51どこかの規定で正確に不定値の定義が定められてんのか?
0353デフォルトの名無しさん
2009/02/15(日) 02:13:33だから、お前の不定値の定義では、malloc()の戻り値も不定値なんだろ。
そんな定義がお前以外に通用するとでも思ってるのか?
0354デフォルトの名無しさん
2009/02/15(日) 02:16:20libcの実装次第
つまり不定とも捉えることができる
0355デフォルトの名無しさん
2009/02/15(日) 02:16:35仮想アドレスが返ってくることは想定できるが
アドレスの値は不定
>>350 は何が返ってくるのか想定できるの?
0356デフォルトの名無しさん
2009/02/15(日) 02:22:37不定値
不定な値
定まってない値
malloc(100)
は毎回固定値が返ってくるの?
0357デフォルトの名無しさん
2009/02/15(日) 02:24:16固定値の反義語じゃない。
0358デフォルトの名無しさん
2009/02/15(日) 02:26:04ソースだせ
0359デフォルトの名無しさん
2009/02/15(日) 02:30:16C言語 JIS X3010
3.17.2 不定の値 見規定の値又はトラップ表現
少なくともC言語においては、上記のように定義されている。
0360デフォルトの名無しさん
2009/02/15(日) 02:32:000361デフォルトの名無しさん
2009/02/15(日) 02:32:50見規定 → 未規定
0362デフォルトの名無しさん
2009/02/15(日) 02:38:570363デフォルトの名無しさん
2009/02/15(日) 02:40:060364デフォルトの名無しさん
2009/02/15(日) 02:40:430365デフォルトの名無しさん
2009/02/15(日) 02:42:470366デフォルトの名無しさん
2009/02/15(日) 02:44:14putc("\a"); -> プー
0367デフォルトの名無しさん
2009/02/15(日) 02:45:16詳細を実装が選択する。何を選んだかは文書になっていければならない。
未規定(unspecified)
処理系定義に似ているが、文書にする必要がない。
0368デフォルトの名無しさん
2009/02/15(日) 02:48:380369デフォルトの名無しさん
2009/02/15(日) 02:48:45その未規定な部分に依存したコードを書かなければ正しいコードになるが、
未規定な部分に依存したコードを書くとどんな動きになるか分からないってものだ。
例えば、 foo(a(), b()); の a() と b() の実行順は未規定。
a() と b() の実行順に依存していないコードは正しいコードだが、
a() と b() の実行順に依存したコードの場合、その実行順がどうなるかは保証されない。
0370デフォルトの名無しさん
2009/02/15(日) 02:51:09ぜんぜん違う
&で得たものにせよ、mallocで帰ってきたものにせよ、
Cの正当な手続きで得られたアドレスは、「固定」ではないが、
正当にアクセスできるメモリのアドレスとして「規定」されたもの
不定というのはそれが何か意味のあるものである保証がないことを言う
0371デフォルトの名無しさん
2009/02/15(日) 02:52:33未規定: 場合によって動作が保証されない
処理系定義: 動作は保証されるが、処理系ごとに動作が異なる
いささか不正確だが(未定義ってのも、別に処理系が動作を定義することを禁止しているわけじゃないしね)、
大まかに言うとこんな感じ。
0372デフォルトの名無しさん
2009/02/15(日) 02:53:38処理系定義は、これは処理系ごとに動作が違うので詳細を確認してくださいねということ
未規定というのは、処理系ごとに動作が違うので推奨しませんよということ
未定義というのは、どんなことが起こっても知りませんよということ
0373デフォルトの名無しさん
2009/02/15(日) 02:55:590374デフォルトの名無しさん
2009/02/15(日) 02:56:22未規定: unspecified
未定義: undefined
0375デフォルトの名無しさん
2009/02/15(日) 02:57:17実行順が右からか、左からかは処理系で定めてねってK&Rにあった気がする
0376デフォルトの名無しさん
2009/02/15(日) 03:00:10ローカル変数を返したらその値は不定値となるわけだ
>>340が悪い
0377デフォルトの名無しさん
2009/02/15(日) 03:06:23関数を抜けると無効になるだけで。
0378デフォルトの名無しさん
2009/02/15(日) 03:09:11【初心者お断り】ガチ規格準拠C専用スレ Part133
http://pc11.2ch.net/test/read.cgi/tech/1201153965/
0379デフォルトの名無しさん
2009/02/15(日) 03:09:18それを不定と呼ぶのでは?
0380デフォルトの名無しさん
2009/02/15(日) 03:15:32いいえ。
例えば>>340のget_local_variable_addressの戻り値を何度出力しても、get_local_variable_address内で宣言されたローカル変数のアドレス以外の値が出力される事はないでしょう。
指している先が無効なだけであって、アドレス値は不定じゃないでしょ。
処理系定義ではあるけどね。
0381デフォルトの名無しさん
2009/02/15(日) 03:39:35無効=過去に初期化されたが、現在は利用不可
ってことかな。利用できないという意味では同じだから
熱く議論することでも無い希ガス
0382デフォルトの名無しさん
2009/02/15(日) 03:41:33これ以上やるなら>>378へどうぞ。寝るけど。
0383デフォルトの名無しさん
2009/02/15(日) 05:04:570384デフォルトの名無しさん
2009/02/15(日) 10:54:250385デフォルトの名無しさん
2009/02/15(日) 11:01:52レベルの高いお前様の解説を希望しますよ。
0386デフォルトの名無しさん
2009/02/15(日) 16:02:420387デフォルトの名無しさん
2009/02/15(日) 16:20:250388デフォルトの名無しさん
2009/02/15(日) 16:39:26なんで未定義動作になってるのかわからんが、いいじゃん見ても
0389デフォルトの名無しさん
2009/02/15(日) 16:47:32お前はポインタを怖がり過ぎ。
>>300は単にポインタ型の変数の値を表示しているだけ。
何も問題なく正しくローカル変数のアドレスが表示される。
0390デフォルトの名無しさん
2009/02/15(日) 17:13:29結構調べたんだが結局直せなかった。スレ違ですまないですけど誰か対象法知ってたらおしえてください。
0391デフォルトの名無しさん
2009/02/15(日) 17:16:220392デフォルトの名無しさん
2009/02/15(日) 17:20:50今はクリップボードに格納して対処してるんだがなんとかならないかな〜?
0393デフォルトの名無しさん
2009/02/15(日) 17:23:05猫でもわかるC、C言語ポインタ完全制覇、Cプログラミング専門課程を読み一通り理解したので今から色々プログラムを組んで練習しようと思っています。
ただ、C言語はできる事が多すぎて初心者なので何からしていいか悩んでいます。
自分では、猫でもわかるシリーズのWindowsアプリの本を読もうかと思うのですが、どうでしょうか?
何か良いアドバイスがありましたらお願いいたします。
0394デフォルトの名無しさん
2009/02/15(日) 17:24:16それでいいよ。その調子で頑張って。
0395デフォルトの名無しさん
2009/02/15(日) 17:24:460396デフォルトの名無しさん
2009/02/15(日) 17:26:200397デフォルトの名無しさん
2009/02/15(日) 17:27:36言語の設定で英語にするといいよ。記号類の刻印が殆ど役に立たなくなるけど。
つーか、どうみてもスレ違いだから二度と帰ってこないでね。
0398デフォルトの名無しさん
2009/02/15(日) 17:27:37\のキーを押しても反応無しって事?
他の文字が代わりに入力されてるとかは無いよね
0399デフォルトの名無しさん
2009/02/15(日) 17:27:49本読んだこと無いが、WEBみる限りいらない
0400デフォルトの名無しさん
2009/02/15(日) 17:32:29何故いらないのか?何がお勧めなのか?
0401デフォルトの名無しさん
2009/02/15(日) 17:35:41カスタマーレビュー
猫でもわかるWindowsプログラミング
評価が高くない有用性のあるレビュー
初心者にはオススメしません
この本はWin32APIの入門書にもかからわず妙に高度なことが多く書いており
逆に初心者に必要な基礎的な部分の説明はていねいされてるとはまったく思えません。
初心者が意味が分からないままコードを写すことに終始する可能性が高いと思います
なので初心者には決してオススメしません
むしろ入門を終えた人にオススメしたいです
0402デフォルトの名無しさん
2009/02/15(日) 17:37:47Cの入門書としてはとてもおすすめできない
0403デフォルトの名無しさん
2009/02/15(日) 17:38:41じゃあ、これで。
Amazon.co.jp: プログラムを作ろう! Microsoft Visual C♯2008 Express Edition 入門 (マイクロソフト公式解説書) (DVD付) (マイクロソフト公式解説書 Microsoft Visual Studi): 池谷 京子: 本
http://www.amazon.co.jp/dp/4891005831/
0404デフォルトの名無しさん
2009/02/15(日) 17:39:570405デフォルトの名無しさん
2009/02/15(日) 17:40:43Windowsプログラミングをするなら、C++かC#かVBが無難だよ。
0406デフォルトの名無しさん
2009/02/15(日) 17:45:11本もWEBと一緒だったら初めから読みすすめるのは、効率悪い。
0407デフォルトの名無しさん
2009/02/15(日) 17:50:04猫でもわかるね。学習向けとは思えない。
0408デフォルトの名無しさん
2009/02/15(日) 17:50:38アドバイスを参考に頑張ってみます。
>>405
ありがとうございます。
いずれC++に移行しようと思っています。しかし、まずは基礎となるCを覚えてからと思っています。
0409デフォルトの名無しさん
2009/02/15(日) 17:52:340410デフォルトの名無しさん
2009/02/15(日) 17:54:410411デフォルトの名無しさん
2009/02/15(日) 17:55:560412デフォルトの名無しさん
2009/02/15(日) 18:42:47int main( void )
{
int i;
char *p;
char str[16] = "0123456789abcdef";
p = str;
for(i = 0; i < (sizeof(str)) ; i++)
{
printf("%c",p);
p++;
}
return 0;
}
これを実行すると、結果は「フヘホマミムメモヤユヨラリルレロ」と
表示されてしまいます。何故ですか?
0413デフォルトの名無しさん
2009/02/15(日) 18:45:190414412
2009/02/15(日) 18:46:58おお! それでうまくいきました。
ありがとうございました。m(_ _)m
0415デフォルトの名無しさん
2009/02/15(日) 19:37:08バッファオーバーランする
0416デフォルトの名無しさん
2009/02/15(日) 19:44:43ぴったりの時はコンパイラがよきにはからってくれる
0417デフォルトの名無しさん
2009/02/15(日) 19:45:17はぁ?どこにバッファがあって、どうやってするんだよ。
0418デフォルトの名無しさん
2009/02/15(日) 19:45:36しません
0420デフォルトの名無しさん
2009/02/15(日) 19:52:32>>416 バカ
>>419 バカ
0421デフォルトの名無しさん
2009/02/15(日) 19:56:11ぴったりって何が??
>>412でバッファオーバーランする要素なんて全くないのだが。
0422デフォルトの名無しさん
2009/02/15(日) 19:59:05本当のところどうなのかは>>415がバッファオーバーランをどういうつもりで言ったのかによる
0423デフォルトの名無しさん
2009/02/15(日) 19:59:48文字列の最後にnull文字(\0)が入るんだから、正しくは
char str[17] = "0123456789abcdef";
こうすべきじゃないの?
0424デフォルトの名無しさん
2009/02/15(日) 20:04:18>419から察するに意味としては>416の想像したとおりだったと思われる。
一応貼っておくか
|11.22
|質問:
|char a[3] = "abc"; は正しいのか。何を意味するのか。
|解答:
|ANSI Cでは文法的に正しい(たぶんANSI C成立以前のシステムでも
|正しく動くものもあるだろう)。ただし本当に稀な状況でだけ役立つ。
|これは大きさが3の配列を宣言し、中身を'a', 'b', 'c'で初期化する。
|通常の終端記号の'\0'は付かない。よってこの配列はC言語の意味での
|文字列ではなく、strcpyやprintfの%sなどでは使えない。
|たいていの場合、配列を初期化するときは、初期化子の個数は
|コンパイラに数えさせるべきである。(上の初期化子"abc"の場合は
|もちろん計算結果は4になる)。
0425デフォルトの名無しさん
2009/02/15(日) 20:07:200426デフォルトの名無しさん
2009/02/15(日) 20:10:15べき論で言えば、
char str[16] = "0123456789abcdef";
でも
char str[17] = "0123456789abcdef";
でもなく
char str[] = "0123456789abcdef";
こうすべき。
0427デフォルトの名無しさん
2009/02/15(日) 20:14:47べき論で言うなら
char array[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
とすべき
0428デフォルトの名無しさん
2009/02/15(日) 20:18:040429デフォルトの名無しさん
2009/02/15(日) 20:21:55char *p = "略";
for (;*p; p++) 略
でいいだろが
0430デフォルトの名無しさん
2009/02/15(日) 20:26:410431デフォルトの名無しさん
2009/02/15(日) 20:27:05#include<stdio.h>
main()
{
char a[10];
strcpy(a,"imagine");
printf("%s",a);
}
↑のソースコードで何故かstrcpyが未定義の関数扱いされてします。
これは何が原因なのでしょうか?
0432デフォルトの名無しさん
2009/02/15(日) 20:30:410433デフォルトの名無しさん
2009/02/15(日) 20:30:550434デフォルトの名無しさん
2009/02/15(日) 20:33:08strcpy関数は標準ライブラリstringというヘッダファイルに定義されているので、
ファイルの冒頭に「#include <string.h>」を追加する必要がある。
0435デフォルトの名無しさん
2009/02/15(日) 20:36:340436デフォルトの名無しさん
2009/02/15(日) 20:42:48>>433
>>434
お陰様で無事解決することが出来ました。
迅速かつ的確なご回答ありがとうございました。
0437デフォルトの名無しさん
2009/02/15(日) 20:44:19visual studio 2008 コマンドプロンプトでcファイルをコンパイルしようとすると
LINK : fatal error LINK1104: ファイル 'C:\DOCUME~1\(ユーザー名)'を開くことができません。
と表示されcファイルの保存場所にはobjファイルだけが出来上がってる状態になります。
cファイルの保存場所はまったく別の場所なのにC:\DOCUMENT〜〜を開こうと知るのかもわかりません
問題点をご指摘ください
またスレ違いでしたら誘導していただければ助かります
0438デフォルトの名無しさん
2009/02/15(日) 20:47:470439デフォルトの名無しさん
2009/02/15(日) 20:49:07C:\c-lang です
0440デフォルトの名無しさん
2009/02/15(日) 20:56:14という問題が出されたのですが、
整数部分を10進数にするのは、簡単なのですが、少数部分の2進数→10進数を
どのように求めればよいか、わかりません><;
ググっても10進数→2進数の小数点の求め方しか出てこないので困っております・・・
もし、お分かりの方がおられましたら、ご指導お願いします><
もしくは、解説されているHPがあれば教えていただければ光栄です。
スレ違いだったら申し訳ありません><;
0441デフォルトの名無しさん
2009/02/15(日) 21:03:01スレ違いどころか鼬害。寧ろ何故ここで聞こうと思ったのか知りたいくらい。
まぁ、整数と見做して変換してから適当に割ればいいだけだけどね。
0442デフォルトの名無しさん
2009/02/15(日) 21:06:360443デフォルトの名無しさん
2009/02/15(日) 21:12:25どういうコマンド打ったかくらい書けっつーかVSのスレで聞け
0444デフォルトの名無しさん
2009/02/15(日) 21:16:13>どういうコマンド打ったか
#include<stdio.h>
int main(void)
{
printf("テスト\n");
return 0;
}
すらコンパイルできませんでした
>VSのスレで聞け
すみませんでした。VSスレで聞いてみます
ありがとうございました
0445デフォルトの名無しさん
2009/02/15(日) 21:28:40なら
b5*8 + b4*4 + b3*2 + b2*1 + b1*(1/2) + b0*(1/4)
>>442でももちろんいい
0446デフォルトの名無しさん
2009/02/15(日) 21:49:59消せないバナー表示がある,標準入出力からの入力ってどうやって実現するの?
c:> ← これね
backspaceをマスクしてるのかな?
0447デフォルトの名無しさん
2009/02/15(日) 21:52:52???
0448デフォルトの名無しさん
2009/02/15(日) 21:58:58DOSのコマンドプロンプト見たいな事をやりたいのよ.コマンド入力して結果を表示する流れ.
DOSのプロンプトの場合,左側にC:\>見たいなバナーが表示されているじゃないですか?
そしてこの表示だけは,ユーザがいくらDeleteキー押してもBackspaceを押しても消せない
じゃないですか?
これを実現したい.
0449デフォルトの名無しさん
2009/02/15(日) 22:02:00@echo off
のことか?
0450デフォルトの名無しさん
2009/02/15(日) 22:02:060451デフォルトの名無しさん
2009/02/15(日) 22:02:24#include <stdio.h>
int main(void)
{
char buf[100+1];
printf("私をバックスペースで消してみろw");
scanf("%100s", buf);
return 0;
}
0452デフォルトの名無しさん
2009/02/15(日) 22:04:08printf("C:\>");
fflush(stdout);
scanf();
処理
}
こういう事か?
0453デフォルトの名無しさん
2009/02/15(日) 22:06:330454デフォルトの名無しさん
2009/02/15(日) 22:08:23いや、自分のCUIプログラムでプロンプトを表示させたいってことじゃね?
0455448
2009/02/15(日) 22:09:57そうだ...こういうのは環境依存なんだなきっと.
Linuxでやりたいんだが...
0456デフォルトの名無しさん
2009/02/15(日) 22:17:19ncursesとかでググって見たらどうよ?
0457デフォルトの名無しさん
2009/02/15(日) 22:21:29>>451とかじゃダメなのか?
0458デフォルトの名無しさん
2009/02/15(日) 22:24:20なんか牛刀な感じがするんですよね...ncurses使うのは...
やっぱそれしか手はないのかぁ
0459デフォルトの名無しさん
2009/02/15(日) 22:25:28DOSの場合はファンクションコールの一行入力を使っている。
0460デフォルトの名無しさん
2009/02/15(日) 22:31:54バックスペース押したら消える、ってコードで既にncursesが要るんじゃないか?
あとはターミナルが対応してるならエスケープシーケンス(だっけ?)でも出来るかも。
こっちはあんま遣ったこと無いからよく知らない。
0461デフォルトの名無しさん
2009/02/15(日) 22:40:17普通にGUIで作ったら?
0462デフォルトの名無しさん
2009/02/15(日) 22:42:360463デフォルトの名無しさん
2009/02/15(日) 23:25:020464デフォルトの名無しさん
2009/02/15(日) 23:28:17論点がずれてる。
0465デフォルトの名無しさん
2009/02/15(日) 23:30:56中身云々が問題になるんなら生のtelnetはつかわんだろし
0466デフォルトの名無しさん
2009/02/16(月) 00:00:31GUIのほうがもっと厄介だろw
0467デフォルトの名無しさん
2009/02/16(月) 00:01:300468デフォルトの名無しさん
2009/02/16(月) 00:26:430469デフォルトの名無しさん
2009/02/16(月) 00:35:500470デフォルトの名無しさん
2009/02/16(月) 00:43:23つ[ssh -X]
0471デフォルトの名無しさん
2009/02/16(月) 00:46:430472デフォルトの名無しさん
2009/02/16(月) 04:15:290473デフォルトの名無しさん
2009/02/16(月) 04:15:57死ね
0474デフォルトの名無しさん
2009/02/16(月) 04:19:250475デフォルトの名無しさん
2009/02/16(月) 04:39:440476デフォルトの名無しさん
2009/02/16(月) 11:13:14ここでつまずく。
0477デフォルトの名無しさん
2009/02/16(月) 12:24:39C言語における配列は1次元のみ。多次元配列というデータ型は無いから
単純にキャストは出来ないよ(多分
C言語における多次元配列は、他の言語における多次元配列と違っていて
配列を指し示すポインタの配列だから。詳しくは↓とか参考にするといいかも
http://www.nurs.or.jp/~sug/soft/tora/tora10.htm
0478デフォルトの名無しさん
2009/02/16(月) 12:36:48配列を[ ]してみたら、そこはまだ配列だった。というのがCの2次元配列
0479デフォルトの名無しさん
2009/02/16(月) 12:58:27アホ
0480デフォルトの名無しさん
2009/02/16(月) 13:53:44何か不満か?文句はANSIルールブック作った奴に言ってくれ
0481デフォルトの名無しさん
2009/02/16(月) 13:55:210482デフォルトの名無しさん
2009/02/16(月) 14:20:54いや、いくらなんでも「配列を指し示すポインタの配列」というのは有り得ない。
0483デフォルトの名無しさん
2009/02/16(月) 14:30:25では何?
0484476
2009/02/16(月) 14:31:59float *p;
p=(float *) balance;
でbalance[3][1]にアクセスする場合なんですが
*(p+(3*5)+1)
なんですが。
キャストすることなんですが、何故キャストするんでしょうか?
2次元っていっても(3*5)これ1次元ですよね?
(3*5)って言う場所がbalance[3]なんですか?
+1がbalance[1]ですか?
詳しく教えてください
キャストする理由など
0485476
2009/02/16(月) 14:33:23balance[10][5];
これで 12345 12345 12345これをたすと15で[3]の位置ですよね??
キャストの理由なども
0486デフォルトの名無しさん
2009/02/16(月) 14:37:00char array[SIZE]; //配列
char (*ptr)[SIZE]; //配列を指し示すポインタ
char (*ptr[SIZE2])[SIZE]; //配列を指し示すポインタの配列
0487デフォルトの名無しさん
2009/02/16(月) 14:44:05では char array[SIZE][SIZE]; は?
0488デフォルトの名無しさん
2009/02/16(月) 14:47:07配列の配列と言えば十分。
例えば、484のbalanceなら、メモリ上では10 * 5 == 50個のfloatオブジェクトがびっしり並んで配置されている。
それなのに、ポインタの配列と言うのは違和感を拭えない。
0489デフォルトの名無しさん
2009/02/16(月) 14:47:09それは二次元配列を一次元配列に変換してるようなものだ
(別に問題は無いが)
float balance[10][5];
float (*p)[5];
p= balance;
というのがある
0490デフォルトの名無しさん
2009/02/16(月) 14:53:41×ポインタの配列
○配列を指し示すポインタの配列
0491デフォルトの名無しさん
2009/02/16(月) 14:55:19そう記述されているから、違和感があるといわれてオレに突っ込まれても困る
0492デフォルトの名無しさん
2009/02/16(月) 14:58:300493デフォルトの名無しさん
2009/02/16(月) 15:00:06不適切な表現や訳を当てにするのかお前は
0494デフォルトの名無しさん
2009/02/16(月) 15:01:36ちゃんとした日本語を話せるようになってから出なおしてきなさい
主語を省くな
0495デフォルトの名無しさん
2009/02/16(月) 15:01:42キャストするほかに、p = &balance[0][0];とする方法もあるが、結果的には同じこと。
やりたいことは、489の言うように1次元配列のようにしたいということ。
多次元配列の要素はすべて連続して置かれており、
*(p + 4)で、balance[0][4]にアクセスでき、
*(p + 5)で、balance[1][0]にアクセスできる。
ちょうど、*(p+(i*5)+j)がbalance[i][j]に相当するので、
基の2次元配列を意識してそういう書き方をすることがある。
どちらかというと、逆に1次元配列を多次元配列として扱いたい場合によく使う。
0496デフォルトの名無しさん
2009/02/16(月) 15:02:310497デフォルトの名無しさん
2009/02/16(月) 15:03:21>481
0498デフォルトの名無しさん
2009/02/16(月) 15:06:30JIS X 3010を見たがchar array[SIZE][SIZE]などといったものを
「配列を指し示すポインタの配列」と称している個所は見つけられなかったぞ。
0499デフォルトの名無しさん
2009/02/16(月) 15:07:45ざっと流し読んだけどそこの作者は微妙に勘違いしてる節があるので参考にするのはやめたほうがいい
0500486
2009/02/16(月) 15:08:24まあ世の中の「Cできます」とかほざく奴の90%くらいはこの程度の理解な訳だが。
0501デフォルトの名無しさん
2009/02/16(月) 15:09:28では先生、良く分かる解説をお願いします。
0502デフォルトの名無しさん
2009/02/16(月) 15:14:17きみの知ったかがどのレス番号なのか教えてくれれば、間違いを指摘してやってもいいが。
0503デフォルトの名無しさん
2009/02/16(月) 15:19:17&x[0]がtype* へのポインタ値であると解釈するかどうかは
処理系依存
でおk?
0504デフォルトの名無しさん
2009/02/16(月) 15:24:15間違っている。
x[0]はtype型の配列であり、配列へ&演算子を作用させた結果は配列へのポインタであるから、
&x[0]はtype (*)[]でなければならない。
0505デフォルトの名無しさん
2009/02/16(月) 15:25:49違う。少なくともANSI以降、type x[m][n]とあったら、
&x[0]はtype [n]へのポインタ型。type (*)[n]と書く。
0506デフォルトの名無しさん
2009/02/16(月) 15:54:160507デフォルトの名無しさん
2009/02/16(月) 15:54:25処理系作る人間でもない限り理解しなくてもいい事だよ。
なんせその処理系作る側の人間ですら判りにくくて使わないからだ。
配列のポインタ云々は関数引数に受け渡す時しか出てくる機会がない。
保守性を考えればそこは素直に構造体でも使うべきだ。
0508デフォルトの名無しさん
2009/02/16(月) 15:58:091次元配列だけ使うことにします><;
0509デフォルトの名無しさん
2009/02/16(月) 16:10:39配列の配列を使う以上は理解してないとトラブルのもとだ
0510デフォルトの名無しさん
2009/02/16(月) 17:10:310511476
2009/02/16(月) 17:53:33何故キャストするんですか?
p=(float *) balance;
0512デフォルトの名無しさん
2009/02/16(月) 17:56:050513476
2009/02/16(月) 17:58:28配列では名前だけだとポインタなどと書いてあって。
pにbalanceの先頭ポインタを代入して、何故float *という意味深な物でキャストするんですか?
balanceはfloatで宣言してあるんですが。
float balance[10]5] 何故またfloat *という物でキャストするんでしょう。
本には全然詳しく書かれて無く
上記の例ではbalanceをfloat *にキャストする必要がありました。配列要素を手作業で指定する都合上、ポインタ演算を
floatポインタに基づいて行わなければなりません。しかし、balanceによって生産されるポインタの型はfloatの2次元配列です。
そこでキャストが必要になるわけです。
と書いてありました。
0514デフォルトの名無しさん
2009/02/16(月) 18:03:50>floatポインタに基づいて行わなければなりません。しかし、balanceによって生産されるポインタの型はfloatの2次元配列です。
>そこでキャストが必要になるわけです。
この部分は忘れろ
0515デフォルトの名無しさん
2009/02/16(月) 18:09:00つまり、メモリ的にはbalance[0][0]を指すんだけど、balance++とかのポインタ演算した時に
balance[1][0]を指してしまうの
balance++でbalance[0][1]を指したいなら、キャストするしかない
0516デフォルトの名無しさん
2009/02/16(月) 18:12:12そんな説明で初心者にわかるかぼけ
balanceの型はfloat(*)[5]
これをfloat*に代入するから型が合わない
だからキャストしている
これで充分だろ
0517デフォルトの名無しさん
2009/02/16(月) 18:15:06これがわからないのならまだ質問できるレベルにもない。
0518476
2009/02/16(月) 18:15:28私が知ってるのは
int *p
int i=10;
p=&a;
*p=20;
など
int ar[5];
int *p;
p=ar;
printf *p
printf *(p+2);
(*p)++;
などデクリメントやインクリメント、1次元配列まで知ってますが。
どうもここでつまずくんですよ
float[n]とかでてきても、よくわかりません。
balance[1][0]を目指すってことは[2][0] [3][0]などを目指し右の値を換えれないなどはわかりますが。
balanceはfloat[n]へのポインタ型など用語がむずかしいです
噛み砕いて教えてくれませんか?
0519516
2009/02/16(月) 18:19:540520デフォルトの名無しさん
2009/02/16(月) 18:20:590521デフォルトの名無しさん
2009/02/16(月) 18:23:030522デフォルトの名無しさん
2009/02/16(月) 18:32:23int i[5][5]; と
int* i[5];
を混ぜてるだろ。
0523デフォルトの名無しさん
2009/02/16(月) 18:33:220524デフォルトの名無しさん
2009/02/16(月) 18:48:30また、『支持高いけど、あれってどうよ?』ってやつは?
理由含めて。 K&R買おうか迷ってる。独習はなくてもいいよな
0525デフォルトの名無しさん
2009/02/16(月) 18:50:13K&Rだったら独学の方がまし
0526デフォルトの名無しさん
2009/02/16(月) 18:51:360527515
2009/02/16(月) 18:52:20"float[n]へのポインタ型"とは、nこのfloatをまとめたものを指すポインタ
具体的に言うと、balance[0][0]からbalance[0][n-1]までのメモリ領域を指していると考える
だから、balance++などをすると次のbalance[0][n]からbalance[0][2n-1]までを指すことになる
この領域の先頭はbalance[1][0]に等しく、この領域の最後がbalance[1][n-1]に等しいの。
なんか書いてて、これは理解できないと思い始めてきた
この辺は図に書いて説明するとすぐわかるんだけどな
どんな本で勉強しているのかな?良かったら教えて欲しいんだけど
0528デフォルトの名無しさん
2009/02/16(月) 18:59:130529デフォルトの名無しさん
2009/02/16(月) 19:18:57自画自賛かよ
説明もさっぱりわからん
0530476
2009/02/16(月) 19:22:04独習C第3版とやさしいCとC言語体当たり学習徹底入門で勉強しています
0531デフォルトの名無しさん
2009/02/16(月) 19:47:110532デフォルトの名無しさん
2009/02/16(月) 19:50:300533デフォルトの名無しさん
2009/02/16(月) 20:10:58まず、配列についてのもっとも基礎的な知識として、以下のことを記憶すること。
1) 配列とは、その要素となるある特定の型のオブジェクトが、連続したメモリ上に一定の個数並べられたものである。
2) 配列は、3つの例外を除いて、「その先頭の要素を指すポインタ値」に意味が格下げになる。
3つの例外とは、&演算子を作用させたとき(配列全体へのポインタ値が得られる)、sizeofを作用させたとき(配列全体の大きさが得られる)、charの配列を文字列定数で初期化するとき、を指す。
次に、以下のことを理解すること。
A) 1)に言う「要素」は、大きさの明らかなオブジェクトならば何でもよい。つまり、配列であってもよいし、配列の配列であってもよい。
B) 2)の格下げが起こることにより、配列に[]演算子を作用させることができる。[]演算子はポインタに作用する演算子で、たとえばpがポインタでnが整数であるとき、p[n]は*(p+n)と同じ意味になる。
C) 2)により、たとえば「intの配列の配列」が「intへのポインタ値」や「intへのポインタへのポインタ値」に格下げされると考えるのは勘違いである。「配列の配列」は「配列へのポインタ値」に格下げされる。
それでもまだ理解できないことがあれば、論点を整理して質問すること。
0534デフォルトの名無しさん
2009/02/16(月) 20:24:12コンピュータの基礎的なアーキテクチャを理解してるなら、K&Rは良い本だ。
独習はどうでもええよ
0535デフォルトの名無しさん
2009/02/16(月) 20:28:08自信を持ってアーキテクチャーなら俺に任せてくれって奴がこのスレに何人いることやら・・・
0536476
2009/02/17(火) 00:01:32キャストする意味が分からないし、ここでの説明も難しいんですが。
(float *)の意味をききたいんですが脱線してるきがするんですが。
すごい噛み砕いて教えてくれるとうれしいです
0537デフォルトの名無しさん
2009/02/17(火) 00:05:41> (float *)の意味をききたいんですが脱線してるきがするんですが。
floatを指すポインタにキャストする。
0538デフォルトの名無しさん
2009/02/17(火) 00:26:07balance[10][5];とあったとき、
float *p;
p = (float *)balance;
とすると、pを通してあたかも[0]から[49]まである要素数50の配列と見なして扱える。
実体はbalanceの各要素に対応付けられているんだけど。
なんでそこにキャストが要るのかと言うと、本来2次元配列であるものを1次元であるかのように扱うため、
コンパイラは、親切にも警告・エラーを出そうとするため。
しかし、こっちは意図的にやろうとしており、キャストを書くことでその意思をコンパイラに示すことになる。
0539デフォルトの名無しさん
2009/02/17(火) 00:28:19知らんがな。
>>484のコードだけでは特にポインタにキャストしてから
変数を扱うことに意味は無い。
あえて言えば、配列とポインタの関係とポインタの使い方を
学習するためにキャストしているように見える。
配列をポインタにキャストして使う必要があるケースは
実際のコードでは殆ど無い。
と、こういう意味での「意味」では無い?
0540デフォルトの名無しさん
2009/02/17(火) 00:34:43http://eggrice.no.land.to/up/src/tohoh0279.png
0541デフォルトの名無しさん
2009/02/17(火) 00:37:320542デフォルトの名無しさん
2009/02/17(火) 00:38:360543デフォルトの名無しさん
2009/02/17(火) 01:11:50縦横固定で問題のないケースって行列演算くらいしか思い付かない。(少なくとも俺は使ったことがない)
構造体で幅と高さ持たせて、1次元配列上の位置を計算で求めるのはよくあるけど。
0544デフォルトの名無しさん
2009/02/17(火) 01:15:56多次元配列はCのネックの部分だから、小さなものでない限り
実用では使わないでしょう。
0545デフォルトの名無しさん
2009/02/17(火) 01:20:340546デフォルトの名無しさん
2009/02/17(火) 01:22:46行列もFortran形式にしたりするから多次元配列はめったに使わないな
0547デフォルトの名無しさん
2009/02/17(火) 01:38:220548デフォルトの名無しさん
2009/02/17(火) 02:39:250549デフォルトの名無しさん
2009/02/17(火) 03:05:320550デフォルトの名無しさん
2009/02/17(火) 03:11:38他のコンピュータ言語でプログラムを組めますか?
それともコンピュータ言語は初めてですか?
0551デフォルトの名無しさん
2009/02/17(火) 03:19:20もしもプログラミングそのものの初心者でないならK&R一択だが
まあそんなことはないだろうから「どれを使ってもそれほど大した差はない」と言っておく
むしろ絶対に必要だと思うのは、全部を修了したあとでK&RかCFAQを読んでおくこと
0552デフォルトの名無しさん
2009/02/17(火) 03:29:14初心者のためのポイント学習C言語 http://www9.plala.or.jp/sgwr-t/
とりあえず、サイト知識で、プログラム打ってみて、
『ポインタってなんだ?』『〜〜ってなんだ?』という疑問が生まれるくらい上達したら好きな参考書勝ったほうがいいと思う。
触ったことない人が、選ぶのと上記ぐらいで選ぶのでは、雲泥の差がある。
0553デフォルトの名無しさん
2009/02/17(火) 04:05:31うん、ダメになるね。
>質問掲示板も良質だし。
これには賛成。エピステーメーが常駐していて、しっかりやる気を殺いでくれる。
0554デフォルトの名無しさん
2009/02/17(火) 04:07:42ダメだこりゃ。
0555デフォルトの名無しさん
2009/02/17(火) 04:10:030556デフォルトの名無しさん
2009/02/17(火) 04:13:510557デフォルトの名無しさん
2009/02/17(火) 04:20:55>これには賛成。エピステーメーが常駐していて、しっかりやる気を殺いでくれる。
試しに開いたトピに、
>それだけで理解できるとお思いですか?
といきなり書かれてて笑った。
慇懃無礼で2chより酷いな。
0558デフォルトの名無しさん
2009/02/17(火) 04:28:22%xのトピックもかなり酷いよ。
で、このサイトも%gを取り扱ってくれない。初心者には%fより使い勝手がいいと思うのだけど。
# まぁ、どうせ%.10sなんかもないしね。
0559デフォルトの名無しさん
2009/02/17(火) 04:55:18>慇懃無礼で2chよりひどいな。
慇懃無礼ねぇ。。。。くすくす
0561デフォルトの名無しさん
2009/02/17(火) 06:01:17初心者の人には、書物の善し悪しなどわかりませんので
出来るだけたくさんの本を買いましょう。すでにC言語が世に
知れてから既に20年近い歳月が流れており、この間に
出版されたC言語の文法書、準文法書は膨大な数になります。
絶版になった本はプレミアがついてオークションでは実に
高価になっています。それだけでも買う価値があるのでは
ないでしょうか?
0562デフォルトの名無しさん
2009/02/17(火) 06:09:060563デフォルトの名無しさん
2009/02/17(火) 07:20:220564デフォルトの名無しさん
2009/02/17(火) 07:27:350565デフォルトの名無しさん
2009/02/17(火) 10:07:33釣り針多くてうぜー
0566476
2009/02/17(火) 10:28:10(float *)は2次元を1次元に扱うっていう意味でわかりました
539さんの 配列をポインタにキャストして使う必要があるケースは
実際のコードでは殆ど無い
ポインタっていうのはアドレスを格納するものと覚えてるんですが
配列をポインタにキャストするとbalance[10][5]のアドレスが
float *p; pのなかに&balance[0]]0] &balance[0][1] &balance[0][2]〜&balance[10][5]
って感じで入るんですよね?
p=balanceで 名前だけど先頭の要素を表すので balanceとやると全部のアドレスが代入されるって意味ですよね?
0567デフォルトの名無しさん
2009/02/17(火) 10:30:380568476
2009/02/17(火) 10:41:13int array[10];
array[0];
array[1];
array[2];
array[3];
array[4];
〜〜
array[9];
0569デフォルトの名無しさん
2009/02/17(火) 10:44:27ここから先は?
0570476
2009/02/17(火) 10:45:531次元配列なので(int *)しないです
0571デフォルトの名無しさん
2009/02/17(火) 10:50:12その答えと>>566の疑問は矛盾してるだろう。
>>566の内容を1次元配列で置き換えてみてよ。
0572476
2009/02/17(火) 10:54:3510*5で[50]の配列になるとおもいます
0573デフォルトの名無しさん
2009/02/17(火) 11:18:390574デフォルトの名無しさん
2009/02/17(火) 11:33:240575デフォルトの名無しさん
2009/02/17(火) 12:27:08{
tt=((0xff&(2^j))>>j); //あるビットを調べてるつもり ttはunsigned char、
if (tt==0)
printf("0です");
else if (tt==1)
printf("1です");
else
printf("0でも1でもない");
}
これだと0xff(11111111)だから「1です」が8回表示されると
思うんですが0でも1でもないも出ます。
どこがおかしいんでしょう?
0576デフォルトの名無しさん
2009/02/17(火) 12:29:060577デフォルトの名無しさん
2009/02/17(火) 12:30:222^j
0578デフォルトの名無しさん
2009/02/17(火) 12:46:290579デフォルトの名無しさん
2009/02/17(火) 13:12:20だから
2^0>>0 = 2
0580赤西仁
2009/02/17(火) 14:44:44かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッド�Uは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
どうか皆さん、お力をお貸しください。
0581デフォルトの名無しさん
2009/02/17(火) 14:51:23100年ROMれ
0582デフォルトの名無しさん
2009/02/17(火) 15:29:10だまされちゃいけませんよ。
あいつ(>>580)は赤西を名乗るルパンだー
14:44:44を奪われたんだよ。
200年考えてもだめだったので、1億年と二千年くらい牢に入れときましょう
0583デフォルトの名無しさん
2009/02/17(火) 15:36:12まったく違う。
理解できるまで>>533を読み直すこと。
0584デフォルトの名無しさん
2009/02/17(火) 15:58:290585デフォルトの名無しさん
2009/02/17(火) 17:26:070586476
2009/02/17(火) 17:30:59http://www.e-chishiki.com/jpn/articles/programming_languages/c/arrays/pointers_and_2_dimensional_arrays
ここのサイトの配列でちょっとわかってきて
ポインタpにbalanceを代入しないでbalanceのままつかうと
* (balance[2] + 1 )でアクセスできるのをしりました ですが1次元配列みたいに使うと*(*(balance+2))でアクセスできました
だけど p=(float *)balance;とp=&balance[0][0]は同じ事を知りました。
ですが なぜp=balanceではダメなのか balance(配列の名前 先頭の[0][0]を表す)と書いてあり
p=&balance[0][0]とp=balanceは同じなんですが
それとfloat[n]がまだ実感わかずfloat[n]っていうのは*(balance[1]+1)でしょうか?
*(balance[1]+1)はbalanceをpに代入せずそのまま使ったらこんな感じになりました。
たしかにインクリメントしたらbalance[10][5]の[10の方がインクリメントされて右の[5]のほうは+1や+2で指定しないと値を表示できませんでした
もしかするとfloat[n]っていうのはbalance[10][5]でいう balance[10]ってことでいいんでしょうか???
0587デフォルトの名無しさん
2009/02/17(火) 17:41:440588476
2009/02/17(火) 18:43:07http://oshiete1.goo.ne.jp/qa3829390.html
この良い回答が良いと思います
私もこの通り最初は、やさしいCとか明解C言語入門で勉強して基礎がわかったら
アルゴリズムなどを覚えてプログラムをつくればいいとおもいます
0589デフォルトの名無しさん
2009/02/17(火) 18:45:270590デフォルトの名無しさん
2009/02/17(火) 19:07:51両者は似ているようで別物。配列がポインタ演算上連続した
領域に割り当てられるというのは処理系依存な話。
従って配列をポインタと同一視出来るか、あるいはポインタ値への
ポインタと同一視出来るかどうかも処理系依存。
大抵のC処理系ではそれが可能だが、決まっているわけではない、
仮に決められているとしても、その規約が将来に渡って守られる
保証すらない。
0591デフォルトの名無しさん
2009/02/17(火) 19:17:43読み込みサイズと位置を指定してループさせてるけど冗長な気がする。
0592デフォルトの名無しさん
2009/02/17(火) 19:22:49e[f]は*(e+f)と定義されているのだから、一般にそれは有り得ない話だ。
二次元配列balanceを一次元として扱うのが気持ち悪いという主張の下でなら分かるが。
0593デフォルトの名無しさん
2009/02/17(火) 19:23:22単純に頭から順番に読み取るだけなら、位置していなんていらないと思うが。
0594デフォルトの名無しさん
2009/02/17(火) 19:56:22超ダウト。配列要素へのアクセスは常にポインタによって行われるのだから
ポインタ演算上連続した領域であることは自明。
0595デフォルトの名無しさん
2009/02/17(火) 20:03:20具体的に何をやりたいのかがいまいちよくわからんが、
今のOSならファイルアクセスも効率的にやってくれるので
ファイルがでかいかどうかなんか気にする必要はない
開いて読んで閉じるだけ
0596デフォルトの名無しさん
2009/02/17(火) 20:08:050597デフォルトの名無しさん
2009/02/17(火) 20:08:450598デフォルトの名無しさん
2009/02/17(火) 20:22:52C FAQ 6.19
0599デフォルトの名無しさん
2009/02/17(火) 20:47:29発生したらポインタでリニアにアクセスできないだろ、構造体じゃあるまいし
もし>>598の言っている意味なら、「配列がポインタ演算上〜」という言い方がおかしい
「多重配列がその要素配列の要素へのポインタ演算上〜」と言わなきゃ意味が通らない
0600デフォルトの名無しさん
2009/02/17(火) 21:00:4740年位前だが、現実として奇数番地へのアクセスでエラーになるアーキテクチャはあっただろ。
だが単純なポインタ操作では、コンパイラがよきに計らってくれた気がする。
どちらにしても、将来に渡って保障されるものなど、何もない。
0601デフォルトの名無しさん
2009/02/17(火) 21:04:26無理なキャストをしたら、そのあとアクセスできなかろうが
処理系定義・未定義の事項に触れているはずだから問題ない。
0602デフォルトの名無しさん
2009/02/17(火) 21:52:340603デフォルトの名無しさん
2009/02/17(火) 22:07:530604デフォルトの名無しさん
2009/02/17(火) 22:18:0824年前にあっただろうがよ
0605476
2009/02/17(火) 22:19:45int main(void)
{
int k[4][2]={
{30,40},
{50,60},
{70,80},
{90,100}
};
int *p;
p=(int *)k; /* p=k[0]か p=&k[0][0]*/これでもできることが判明しました
printf("%d\n",*(p+1));
return 0;
}
たぶんp=k[0];にするとpがk[0]って感じになり p[1]とやると k[0][1]みたいな感じになりました
先ほどキャストをしらべてたら アドレスをあわせるっていうことで
kのまま使うとk[0][0] k[1][0] k[2][0]って左の配列だけ繰り上がるので
(int *)にすると4バイトずつ繰り上がるのでk[0][0] k[0][1] k[0][2]ってかんじになるんですか?
キャストすることによって4バイトずつくりあがる?
キャストをしないと左の配列だけがint[n]っていうのは左の配列のことですよね?
0606デフォルトの名無しさん
2009/02/17(火) 22:46:04「int *」と「double *」が違う型であるのと同様に「float *」と「float (*)[5]」は違う型である、というのが理解できていない気がする。
0607デフォルトの名無しさん
2009/02/17(火) 22:47:070608476
2009/02/17(火) 23:00:21float *はfloatの変数を入れられる?
float (*)[5];は配列の balance[10][5]の[10]の部分を代入できる?
いきなり独習Cでキャストがでてきて意味が分かりませんでした
検索したらbalanceのキャストでつまずいてる人けっこういたので
0609デフォルトの名無しさん
2009/02/17(火) 23:15:17「Tの配列」という型のオブジェクト(変数など)は、「Tへのポインタ」型に変換できる。
float a[5];
aはfloatの配列(要素数5)なので、floatへのポインタ、即ちfloat*型へ変換できる。
float balance[10][5];
balanceは「floatの配列(要素数5)」の配列(要素数10)なので、
「floatの配列(要素数5)」へのポインタ、float (*)[5]型へ変換できる。
0610476
2009/02/17(火) 23:24:54float *型はfloat *p;のことで float i;などの 変数のメモリアドレスを格納できる p=&i
それで2次元配列はfloat balance[10][5]; float (*p)[5]; p=balanceってことでいいんですか?
0611デフォルトの名無しさん
2009/02/17(火) 23:32:350612デフォルトの名無しさん
2009/02/17(火) 23:34:02お前はまず日本語からやりなおせ
0613デフォルトの名無しさん
2009/02/17(火) 23:42:012行目と3行目に繋がりを感じないが、まあ間違ってはいない。
0614デフォルトの名無しさん
2009/02/17(火) 23:43:44http://kmaebashi.com/programmer/pointer.html
0615476
2009/02/17(火) 23:46:28みなさんの考えた得とく方法で教えてください
キャストの意味などその(*p)の意味などわかるまでの問題を出して教えてください本当おねがいします
0616デフォルトの名無しさん
2009/02/17(火) 23:48:10お前のように日本語が怪しい人間にいくら教えても
お前が本当に理解したかどうかこっちが確認できないんだよ
0617デフォルトの名無しさん
2009/02/17(火) 23:50:110618デフォルトの名無しさん
2009/02/17(火) 23:53:430619デフォルトの名無しさん
2009/02/17(火) 23:57:110620デフォルトの名無しさん
2009/02/17(火) 23:59:20問1
ポインタとは何か説明せよ
0621デフォルトの名無しさん
2009/02/18(水) 00:07:07Asterisk(*) is interpreted by the compiler as part of attributes of variables when you're declaring them,
whereas it is seen as part of type names when you're casting types. The same rule holds true of arrays.
If I were to redesign C, I would change this rule and the operators priority so that you can declare like:
int[3] a; // corresponding to int a[3]; of normal C;
int* p; //int *p; (int* p is OK in C too, but * is connected to p, not int.)
p = a; // you can cast implicitly.
(int[4])[3] b; //int b[3][4];
(int[4])* q; //int (*q)[4];
q = b; // you can! (Compare with above)
This conversion might help you understand ointers and arrays in C.
0622デフォルトの名無しさん
2009/02/18(水) 00:13:080623476
2009/02/18(水) 00:15:16ポインタとは変数などのメモリアドレスを格納するものです
intは4バイト
charは1バイト
floatは4バイト
doubleは8バイト
32bitパソコンの場合です
インクリメントするとintのポインタだと4メモリアドレスがくりあがります
0624デフォルトの名無しさん
2009/02/18(水) 00:18:26char型のポインタ変数(char *p)のサイズは何バイトですか?
0625デフォルトの名無しさん
2009/02/18(水) 00:18:490626デフォルトの名無しさん
2009/02/18(水) 00:18:560627デフォルトの名無しさん
2009/02/18(水) 00:19:36おめーに聞いてないよ
0628デフォルトの名無しさん
2009/02/18(水) 00:20:280629476
2009/02/18(水) 00:20:59ちなみに&xでメモリアドレスを習得 *xでそのメモリアドレスにある値を出力します
次の質問お願いします
0630デフォルトの名無しさん
2009/02/18(水) 00:22:03キャストすんのは型が違うからゆーのは理解したん?
0631デフォルトの名無しさん
2009/02/18(水) 00:22:55ちがうよ
0632デフォルトの名無しさん
2009/02/18(水) 00:23:06ん? じゃあ x は?
0633デフォルトの名無しさん
2009/02/18(水) 00:23:150634デフォルトの名無しさん
2009/02/18(水) 00:24:190635デフォルトの名無しさん
2009/02/18(水) 00:25:11その本は間違っている。
32ビット環境なら大抵は4バイトだが、保障されているわけではない。
ポインタのサイズが必要なときはsizeofを使って取得すること。
0636476
2009/02/18(水) 00:25:28今わからないのは
(*p)[5]と(float *)balanceをやったら balanceはどうなるかなど
こういう細かいのが独習CややさしいCや体当たりC言語に書いてないので
しょうじきむかついてです
0637476
2009/02/18(水) 00:28:00631さん632さん
xは
int i=10;
int *x;
x=&i;これでメモリアドレスをとります
printf("%d",*x);でxの値をだします
0638デフォルトの名無しさん
2009/02/18(水) 00:28:440639デフォルトの名無しさん
2009/02/18(水) 00:29:27ち が う よ
0640デフォルトの名無しさん
2009/02/18(水) 00:30:08そこはまだ君には早いのでまずポインタを学習しなおしなさい
0641デフォルトの名無しさん
2009/02/18(水) 00:30:26慣れてくると常識になってくるんだが。
わかる、わかるぞその気もち、476よ!
0642デフォルトの名無しさん
2009/02/18(水) 00:31:550643476
2009/02/18(水) 00:33:00(*p)[5]や(float *)などがあまりのってなく
他の事ばっかりのててむかつきます
640さん
641さん
お願いです教えてください
一次元配列の代入ならわかってます
int a[10]:
int *p;
int p=a &aでもなくていいです a(名前)は先頭のアドレスをあらわします
一次元までわかってるんです
どうすれば良いですか本当に?
0644デフォルトの名無しさん
2009/02/18(水) 00:34:11char *A = "hogehoge";
とか平気にやってエラーを出して悩むんだよ。
だが最初は悩んで悩み抜いて理解にたどり着く努力をするしかない。
いずれ自分の財産となる。
0645デフォルトの名無しさん
2009/02/18(水) 00:34:23いいや、絶対にわかってないね
その例で&aと書いたら何になるか答えられるか?
0646デフォルトの名無しさん
2009/02/18(水) 00:35:120648デフォルトの名無しさん
2009/02/18(水) 00:36:170649476
2009/02/18(水) 00:37:14もう教えてください
どうすれば(*p)[5]と(float *)までたどり着けるか教えてください
脳みそ取り替えたいくらいです
脳みそ取り替えてください本当に
0650デフォルトの名無しさん
2009/02/18(水) 00:37:380651デフォルトの名無しさん
2009/02/18(水) 00:38:34アドレスの概念を理解する。
この辺がうまいことできればすぐだと思うが。
0652デフォルトの名無しさん
2009/02/18(水) 00:39:030653デフォルトの名無しさん
2009/02/18(水) 00:42:231.関数外で定義された変数 例えばint NNN;
2.関数外でstaticで定義された変数 static int MMM;
3.ヘッダでextern宣言され関数外で定義された変数 int LLL;
の違いがわかりません。スコープの範囲と、扱っているメモリについて教えてください。
0654476
2009/02/18(水) 00:42:47よくある本の最初に書いてあるポインタくらいならわかります
int x;
printf("%p",&x);など 一次元配列のポインタなどわかります
ですがある日突然
float balance[10][5];
float *p;
p=(float *) balance;
*(p+(3+5)+1)という最悪のパターンにであいました
独習Cですんなりいってたんですが165ページという最悪のページでモヤモヤが一気にでしました
キャストは前のページにでてきて doubleをint型に変換する簡単なものでした
double i=100.2;
printf("%d",(int)i);みたいな簡単なキャスト
ですがポインタのキャストという説明も無くそんなのがでました
(float *)という意味深な物が とまどいました
調べました よくわかりません
float[n]とかいわれてもわかりません nっていうのはfloat[1]とかfloat[2]ですか?
さっぱりわかりません脳みそとりかえたいくらいです 助けてください
0655デフォルトの名無しさん
2009/02/18(水) 00:45:05> nっていうのはfloat[1]とかfloat[2]
そういうこと。1とか2とかって書くのがだるいからnで一括させているだけのこと。
0656476
2009/02/18(水) 00:46:14一次元配列ではキャストしません
そのままp=balanceって言う感じです
モヤモヤするかぎり夜更かししてしまいます
夜遅くまで悩み続けて寿命がちじまります 助けてください
独習Cとかかって最悪です。やさしいCにも(*p)[5]の意味も書いてありません
ポインタのキャストの理由を書かない本です3冊とも
どなたかわかりやすくまとめてください
0657デフォルトの名無しさん
2009/02/18(水) 00:52:572以上の値はどこにいったの?
オールオアナッシングなの?
0658デフォルトの名無しさん
2009/02/18(水) 00:56:46負の値はどこに行ったと思う?
0659デフォルトの名無しさん
2009/02/18(水) 00:57:18ほら間違ってる
もう一度ポインタとただの配列を勉強しなおすまでそのbalanceとやらから目を離せ
0660デフォルトの名無しさん
2009/02/18(水) 00:57:33この問題分かるか?ポインタがきちんと理解できていれば分かるだろう。
long x;
short y[5] = {1,2,3,4,5};
x = (long) y;
x++;
printf("%d\n",*((int*)x));
このコードを実行した際に表示される数値は何か予想せよ。
(理由とともに。なお、longは8バイト、intは4バイト、shortは2バイトとする)
0661476
2009/02/18(水) 00:57:39おかしすぎです
なにやってたんですか
私はもう寝ます
明日もまた質問するのでよろしくお願いします
この問題が解消されないとむかついてストレスたまります
0662デフォルトの名無しさん
2009/02/18(水) 00:59:37javaに毒されすぎじゃないか?
0663デフォルトの名無しさん
2009/02/18(水) 00:59:47>>661は、もう寝たか?
0664デフォルトの名無しさん
2009/02/18(水) 00:59:50typedef unsigned short WORD;
別にどこにも行ってない。
BOOLの戻り値で3値が帰ってくる関数も有馬。
0665デフォルトの名無しさん
2009/02/18(水) 01:01:52C言語にはいわゆるbool型がないからBOOLは1バイト整数で代用してるだけ。
BOOL flag = 3;
flag++;
if(flag)...
みたいに普通に使えてしまう。文法的には。
ただしWindowsプログラミングにおいては
flag = TRUE;
flag = FALSE;
だけを代入、比較するように使いなさいというお約束がある。
0666デフォルトの名無しさん
2009/02/18(水) 01:06:410667641
2009/02/18(水) 01:17:33float balance[10][5];
これは何を表わしているだろうか?
配列は常にリニアなメモリに格納されるので、これは
float型のデータが入る領域が 5つ連続で並んでいる状態 が 10個並んでいる と考えてほしい。
p=(float *) balance;
と
p=balance;
の違いはなにか?
まず、(float *)とキャストしなくても俺の環境では警告は出なかった。
ただし、
p = *balance;
としないとだめだ。なぜか?
まず、キャストなしのbalance、これはbalance[0][0]のアドレスが格納されている領域を示すアドレスをしめす。
つまりポインタのポインタだ。
なので、
p=balance;
とすると、アドレスが格納されている領域を示すアドレス を floatが格納されている領域を示すアドレス に格納しようとしていることになる。
これはまずい。
キャストするのはこのためだ。
キャストすることによって、
(float * )アドレスが格納されている領域を示すアドレス;
の形になり、アドレスの*はそのアドレスの値(つまりこの場合float)を指すことになるので、
アドレスが入っている領域を示すアドレス ではなく floatが入っている領域を示すアドレス を表わせる。
これで、pに代入が可能となる。
間違ってたらごめんだが、たぶん大丈夫だと思う。
本だとエキスパートCプログラミングの259ページあたりを参照にするといいが、まだこの本は早いだろうな。
0668デフォルトの名無しさん
2009/02/18(水) 01:20:12厳密に文法に即していたら、現実的にはほとんどのコードが
エラーやら警告やらでコンパイル通せないし、そうなると
場合によっては他のコンパイラに逃げられてしまうので、
コンパイラには何かと適当に融通を効かせる実装時規約が入っ
てるのが常だと思っていい。(そこの当たりがまた不満で
癪に触るのだが、どうしてもというのあれば使わないという
最善の手段が残されている)
すべてを理詰で考えるのは良い態度だが、こと文法に関しては
過去(文法が完全に確立しているとは言い難い時代)との互換性も
絡んでくるので、まともな理屈や規則を見いだすのが困難なケースも
また多い。(歴史の因果を引きずっている部分が多々あり)
何がして良くて何がしてはいけないかなんて、
コンパイラを使ってみて、エラーを出してみて、実行時エラーで
コケたりする経験を踏んでつかんでいくもので、エラーが出たら
修正し覚えて行くという方法以外にこういった問題の回避方法は
無いんじゃないかと思われ。
0669デフォルトの名無しさん
2009/02/18(水) 01:20:310670デフォルトの名無しさん
2009/02/18(水) 01:20:39ごめん。超テキトーに言ってしまった。
intだったのね。
0671デフォルトの名無しさん
2009/02/18(水) 01:21:54お前も勉強しなおせ
0672デフォルトの名無しさん
2009/02/18(水) 01:23:57規格というものに意味を認めないのならそんなもの言語でもなんでもない。
個別のコンパイラのスレでも立ててひきこもっていることをオススメする。
0673デフォルトの名無しさん
2009/02/18(水) 01:24:48ぜんぜん大丈夫じゃないよ
0674デフォルトの名無しさん
2009/02/18(水) 01:25:34**balanceでもbalance[0][0]にアクセスできるのでこの場合の説明では問題ないと思うが。
ってかもっとだれもが納得できる説明できんのかだれか?
俺にはよくわからんかったが。
0675デフォルトの名無しさん
2009/02/18(水) 01:26:050676デフォルトの名無しさん
2009/02/18(水) 01:27:47マ板とかム板って説明放棄で実際無知な奴らがいるので説明するのが怖い
俺は無理だ。
0677デフォルトの名無しさん
2009/02/18(水) 01:29:280678641
2009/02/18(水) 01:31:340679デフォルトの名無しさん
2009/02/18(水) 01:33:28だから476から200以上レスがあるのにまともな回答が無いわけだ。
0680デフォルトの名無しさん
2009/02/18(水) 01:34:480681デフォルトの名無しさん
2009/02/18(水) 01:35:56> つまりポインタのポインタだ。
これがもう、馬鹿らしい程よく見る、大嘘だろ。
4次元配列 int PPPP[1][2][3][4];
と宣言して、PPPPをポインタのポインタの・・・・・・(ry
ぬるぽ!
0682デフォルトの名無しさん
2009/02/18(水) 01:37:42説明のためだ。
他には?
0683デフォルトの名無しさん
2009/02/18(水) 01:38:18諦めているのはこのスレの住人だろ。
0684デフォルトの名無しさん
2009/02/18(水) 01:38:55違う。balanceは配列そのものを表す。
ただし、これは一部の例外を除いてすぐにbalanceの最初の要素へのポインタ値に成り下がる。
|つまりポインタのポインタだ。
違う。配列へのポインタ値になる。
|とすると、アドレスが格納されている領域を示すアドレス を floatが格納されている領域を示すアドレス に格納しようとしていることになる。
違う。配列へのポインタ値をfloatへのポインタ変数に代入しようとしている。
|キャストすることによって、
|(float * )アドレスが格納されている領域を示すアドレス;
|の形になり、
違う。(float * )配列へのポインタ値; の形になる。
|アドレスの*はそのアドレスの値(つまりこの場合float)を指すことになるので、
意味がわからない。ポインタに*演算子を作用させた結果はその指すオブジェクトへの参照となる。
|アドレスが入っている領域を示すアドレス ではなく floatが入っている領域を示すアドレス を表わせる。
違う。配列へのポインタではなくfloatへのポインタに変換できる、が正しい。
0685デフォルトの名無しさん
2009/02/18(水) 01:39:20>4次元配列 int PPPP[1][2][3][4];
>と宣言して、PPPPをポインタのポインタの・・・・・・(ry
お前ノ場合は突っ込み方が既に間違っておるw
理解してないな
0687デフォルトの名無しさん
2009/02/18(水) 01:44:27「規格の規格」を論じており、そこに一貫性が見いだせない場合が
あるという意味だから。念のため
0688デフォルトの名無しさん
2009/02/18(水) 01:45:05ポインタ配列という言葉を使えば良かったかもしれないが、
いずれにしてもエキスパートCは俺もお勧めだと思う。
0689デフォルトの名無しさん
2009/02/18(水) 01:46:37お前が一貫性を見出せなかろうと、規格として成立している以上はそれに従うのが当然だよ
0690デフォルトの名無しさん
2009/02/18(水) 01:48:17そこまで懇切丁寧に教える必要あるのか?別に万人が理解できなきゃならないもんでもないし。
0691デフォルトの名無しさん
2009/02/18(水) 01:49:26奴にはどうせ伝わらないのは最初からわかっている。
だがそれは厳密な説明を理解する言語力に欠けるほうに問題があるのであって
すんなり納得はしてもらえるかもしれないが正しくない説明を是とするのは間違っている。
0692デフォルトの名無しさん
2009/02/18(水) 01:51:51ポインタで躓く原因の多くは、入門書などで簡略的あるいは便宜上の嘘を教わったために、
その本当の意味を知らないことにより混乱が生じるためだと思う。
0693681
2009/02/18(水) 01:52:06でも、>>667はPPPPから先頭アドレスの取得をint**** p;に入れるか、
キャストの際の*を演算子と勘違いしてint *p; へ (int ***) p
だかなんだかするんじゃないか?
もう、何するかわからんから略した。
ところで
ポインタのポインタと2次元配列を
「ポインタのポインタでも同じようにアクセスできるよ」
とかなんとかいうなら
「±10000程度の整数計算するのに、doubleもintもあまり変わらないよ」
程度のもんだと思うぞ。(1024を10乗して1024の9乗で割るとバグったりするが)
違いがある、のを、同じように扱える、というだけで同一視はしないほうがいいだろ
0694デフォルトの名無しさん
2009/02/18(水) 01:53:10言ってわからなけりゃわからないほうが悪い
わかってもらうために間違ったことを教えるなんて本末転倒だ
0695デフォルトの名無しさん
2009/02/18(水) 01:55:09ど素人だろうと小学生だろうと、理解力があるやつはポインタなんてすぐに理解できるよ。
これだけ大量の説明で理解できないやつは、Cには向いてないと思う。。。
0696デフォルトの名無しさん
2009/02/18(水) 01:56:51int *xx=x;//融通を効かせて通してくれるコンパイラが多いが、こういったケースのみ。出来そうで出来ない場合もあるのでこの点でフラストレーションが
発生する。
int *xx=(int*)x;//融通を効かせてこのキャストを許してくれるコンパイラが多い
int *xx=(int*) (&x[0]); //これを通さないコンパイラはあってはならない。
int **xx=x; //これを通してしまうコンパイラは壊れてる
int **xx=(int**)x;//警告無しで通してしまうコンパイラは腐ってる
同様に
int y[100][100]
int *yy=y;//融通を効かせて(int*)&y[0][0]と解釈して通してしまうコンパイラの
言う事や出すコードは病気持ちの可能性が高いのでかな〜り心配したほうがいい
int **yy=y;//これも通してしまうのは何だかな〜って感じ。
int *yy=(int*)&y[0][0];//これを通さないコンパイラはモグリ
int **yy=(int**)&y[0];//これを通さないコンパイラは世間ズレしている。
0697デフォルトの名無しさん
2009/02/18(水) 01:57:12誰も最初からすぐにわかったやつはいないだろう。
ここの説明だけで理解できるとも俺は思えない。
苦戦に苦戦を重ねているk分かる時が来るもんだ。
0698デフォルトの名無しさん
2009/02/18(水) 01:59:52それを通さないコンパイラは企画に準拠してないだろ
0699デフォルトの名無しさん
2009/02/18(水) 02:00:01本人はそこそこポインタやC言語に慣れてるように感じるけど?
ズブの素人というわけでもなかろうて。
あと、そんなに難しいことか?これまでの説明で十分だろう。
まあCの文法にも分かりにくい問題点はあるんだけどさ。
0700デフォルトの名無しさん
2009/02/18(水) 02:02:09規格に一貫性がないから従わないとか言ってる奴はただのバカ。
0701デフォルトの名無しさん
2009/02/18(水) 02:04:20前のものを削除するのは極めて難しいということ。
後々に矛盾が発生しないかどうかを十分検討できず、慣習化しているという
理由でなし崩し的に規格化されてしまったケースもあり得る。
その点は法律と同じだね。
0702デフォルトの名無しさん
2009/02/18(水) 02:04:27>int **yy=(int**)&y[0];//これを通さないコンパイラは世間ズレしている。
ためしにgcc3.4でコンパイルしてみたらwarningが出た。
0703デフォルトの名無しさん
2009/02/18(水) 02:06:18俺にはなれているようにはあまり感じられない。
なれてるやつは自分でいろいろ試して自己解決するもんだ。
0704デフォルトの名無しさん
2009/02/18(水) 02:08:00今まで、1KByteくらいのデータをHDD上のファイルから順次fread関数で読み出していました。
データを予めまとめてHDDからRAM上に移して使うほうが高速になる、という情報を得たので、
1000個まとめてHDDから読み出して、そこから順次1KB分を引き出して使う、というやり方に
変えたのですが、1000個分の読み出しで比較すると10数msほど速くなっただけでした。
こんなものなのでしょうか?
0705デフォルトの名無しさん
2009/02/18(水) 02:10:23一体誰に聞いたかしらないけれど、その「予めまとめてHDDからRAM上に移す」のは
大抵OSが(状況を見て。だからちょっと時間はかかるかもしれない)やってくれる。
だからほとんどの場合速くならない。
0706デフォルトの名無しさん
2009/02/18(水) 02:11:020707デフォルトの名無しさん
2009/02/18(水) 02:12:23実測結果に納得いかなくなる場合が多いよ。
0708デフォルトの名無しさん
2009/02/18(水) 02:12:40どういうファイル構造か知らないけど、
>1000個まとめてHDDから読み出して
これが1000回の関数呼び出しをしているなら、
1000回呼んでることには変わりないわけで、大して早くならないだろう。
0709デフォルトの名無しさん
2009/02/18(水) 02:14:14ファイルからデータを読み取るとき、ソースコード上のその位置で
直にディスクから読んでいるとは限らない、むしろそうであるほうが今は珍しい
同様に書き出すときもfprintfなどを呼び出した時点で
ディスクに書き込まれているとは限らない
大抵はfclose()した時点でfflush()されている
0710デフォルトの名無しさん
2009/02/18(水) 02:15:32なんかのタイミングでデータをメモリから読むってことなんじゃないの?
あらかじめメモリに入れておけば後で読むとき速いっていうことかと。
0711デフォルトの名無しさん
2009/02/18(水) 02:17:06OSに1kbyteとか1byteだけファイルから読ませる
ということ位難しいことはない。
あのMS−DOSですら、不可能で、ファイルのデータ
の256バイト程度は、勝手にメモリに取り込んでしまう。
もちろんそれは次の命令時に再利用されるが.
しかしそういうことが腹立たしいと感じる貴方の
精神も相当病んでいる。
0712デフォルトの名無しさん
2009/02/18(水) 02:18:24int *xx=(int*) (&x[0]); //これを通さないコンパイラはあってはならない。
int **xx=x; //これを通してしまうコンパイラは壊れてる
int **xx=(int**)x;//警告無しで通してしまうコンパイラは腐ってる
↑
こういうのってコンパイラの企画で決まってるの?
0713657
2009/02/18(水) 02:21:25負の値ですか・・・考えてませんでした。というよりCで負の値が出てくることを今更知りました。
これは・・・・補数というものを理解できていないということでしょうか・・・?
よく分かりませんが、私の予想では負の数は-1の時だけBOOLで1となり、他は全て0でしょうか?
>>664
>>665
正の数であれば、0かそうでないかによってif(flag)...の判定が分かれるということでしょうか?
だとすれば、「0の時だけ判定がFALSEになる」という考えでOKでしょうか?
0714デフォルトの名無しさん
2009/02/18(水) 02:21:46キャストしてるからコンパイルはできるだろうけど
これは意味あるの?
0715デフォルトの名無しさん
2009/02/18(水) 02:24:312番目はCの規格で決まっている
4番目はコンパイラの好みと設定の問題
1番目と3番目は書いてある内容のほうがまちがってる
0716704
2009/02/18(水) 02:25:17読み出すデータはファイル上では連続しているのですが、そういう場合、続きを読むだろうという
推測がし易いですし、OSが気を利かして先の分までRAM上に移しておいてくれたのでしょうか?
すばらしい仕事です。
>>706
いえ、一つのファイル上のデータで、読み出す単位(約1KB)の1000個という意味です。
>>707
たしかにそうですね・・・
ウィンドウのメッセージ処理を意識するようになっただけでもだいぶ理解が深まりましたし。
>>708
fread( buff, sizeof( DWORD ), 1, fp )を何度も繰り返して、最終的に1KB読み出していました。
これが1回の読み込み処理で、この後、読み込んだ1KB分にたいして処理を施します。
それが終われば、再び上記の要領で1KB読み出す、というふうに繰り返します。
これが今までです。
0717704
2009/02/18(水) 02:25:37続き
「1000個分読むようにした」というのは、ファイルのデータ構造などの見直しも行い、
fread関数1回で1KB×1000個(1MB)分読むというふうにしました。
fread( buff, sizeof( struct KOUZOUTAI ), 1, fp ) (KOUZOUTAI:1MBくらい)
>>709
そうだったんですか・・・
考え方を改めないといけません(汗)
>>710
ファイル自体は1個だけです。
狙いとしては、おっしゃる通り、HDDへのアクセスを減らし、メモリから読むだけにして高速化
しようとしていました。
>>711
そ、そうだったんですか・・・
てっきり、キレイに指定したバイト分読んでるものだと・・・
勉強になります。
0718デフォルトの名無しさん
2009/02/18(水) 02:26:20お前らまともに書いてて誰が正解か怪しいぜ?
0719デフォルトの名無しさん
2009/02/18(水) 02:29:23この場合と言うが、どの場合でも、式における*と[]の演算子は交換可能だ。
a[b]は*(a+b)と定義されているシンタックスシュガーなのだから。
0720デフォルトの名無しさん
2009/02/18(水) 02:29:24そもそもプログラミングできねぇよ。
実際に動くコンパイラ見つけて、GCC4系で動作確認済みとかやればいい話だし。
実際オープンソースとかそういう注釈必ず付くしね。
0721デフォルトの名無しさん
2009/02/18(水) 02:30:16そう思ったならK&Rをお読みください
0722デフォルトの名無しさん
2009/02/18(水) 02:31:28これもK&Rに書いてんの?
0723デフォルトの名無しさん
2009/02/18(水) 02:31:46最後の審判として規格書読め。
大元はANSIやISOだが、JISが翻訳しているので、日本語でも読める。
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3010
これらの問いに対する答えがどれだけ載っていると感じるかはともかく。
0724デフォルトの名無しさん
2009/02/18(水) 02:32:43この場合問題になっているのは、**pointerでも**arrayでも正しくアクセスできるかどうかではないよ
*pointerと*arrayが違うものであることが問題なんだ
0725デフォルトの名無しさん
2009/02/18(水) 02:34:20ありがとう。読んでみる。
0726デフォルトの名無しさん
2009/02/18(水) 02:36:160728デフォルトの名無しさん
2009/02/18(水) 02:45:26char a[BUFLEN];
とあるとき、aに文字列を詰めるときは事前に
memset(a, 0, BUFLEN);
などとして0クリアしたほうがいいんですか?
0729デフォルトの名無しさん
2009/02/18(水) 02:48:41別に普通はやらなくてもいいけと思うけど、やっておいたほうがいいという人もいる
その程度の話
個人的にはやるのであれば、宣言時なら
char a[BUFLEN] = {0};
とか
char a[BUFLEN] = "";
にしといたほうがいいかとは思うけど
0730デフォルトの名無しさん
2009/02/18(水) 02:48:44なんでするの?
最後に'\0'を置くの忘れそうだから?
0731デフォルトの名無しさん
2009/02/18(水) 02:50:06一度しか入れないんならいらないだろうけど。
0732デフォルトの名無しさん
2009/02/18(水) 02:52:06公共の場所にあるパソコンを触る場合は、キーボードを
ウェットテッィシュで拭いてから使い、使い終わったら
同じように拭いておくのはマナーだが、変数を必要も無
いのに一々ゼロクリアしなければ使いたく無いというの
は潔癖性を超えて精神の病気の兆候かもな。
0733デフォルトの名無しさん
2009/02/18(水) 02:53:00何度も入れなおすたびにmemsetするの?
基本的に要らない気がするが、いろんなソース読んでると必ずmemsetしてるのを見かけるときがある。
0734デフォルトの名無しさん
2009/02/18(水) 02:55:23使ったあとに文字列を空にするためにmemsetするんジャマイカと思う。
0735デフォルトの名無しさん
2009/02/18(水) 02:56:29プログラマ的ジョークなのかもしれないが、こういう表現をすること自体病んでいると思わないか?
0736デフォルトの名無しさん
2009/02/18(水) 03:01:56つまり一人でやってるならいいんだけど、
その領域を他のPMがちゃんと扱ってくれるか信用できないときには…
0737デフォルトの名無しさん
2009/02/18(水) 03:12:11アプリがクラッシュする場合もあり得るバグの検出が遅れる傾向が
あると思われ。必要な場所以外はランダムに近いデータがメモリに
残ってると、変な文字列が出力されるなど、プログラムの問題を
検出しやすい。
ただ最近は、セキュリティの関係から、作業で使用した文字列等の
データはゼロクリアしてからじゃないと、returnできないという
コーディングルールを採択しているケースが多くなってきている
と感じる。(>>734も本質的に同じことを述べている)
0738デフォルトの名無しさん
2009/02/18(水) 07:08:41無視される場合もあるって言ってた。
0739デフォルトの名無しさん
2009/02/18(水) 07:22:430740デフォルトの名無しさん
2009/02/18(水) 07:27:18FILE構造体を見てみると内部にバッファがある
バッファ以下のファイル操作ならバッファ分を先に読み込んでその中でファイルポインタを移動する
fread関数を256回呼び出すより1回呼び出すほうが関数呼び出しのオーバーヘッド分早くなるというだけ
0741デフォルトの名無しさん
2009/02/18(水) 07:55:04float balance[5][10]
この2次元配列に対してポインタを使ってみよう
1)
balanceと同じ型のポインタを用意すれば
balance[x][y]にアクセスするようにp[x][y]と使えるだろう
float (*p)[10];
p = balance;
2)
それぞれの列(balance[0][0]〜、balance[1][0]〜、)の先頭を指すポインタを用意してみよう
float *p1 = balance[0][0];
float *p2 = balance[1][0];
float *p3 = ・・・
float *p5 = balance[4][0];
これらのポインタをグループ化しちゃえ
float *P[5] = {p1, p2, p3, p4, p5};
あら、P[x][y]でbalance[x][y]の要素にたどりつけるわ
3)
所詮メモリ上では1次元の配列だから、float[50]で攻めてみよう
float *p;
p = (float *)balance;
balance[x][y]の場所は x*10+y だから *(p + (x*10) + y)でなんとかたどり着けたわ
4)
所詮メモリ上では1次元の配列だから、float[50]で攻めてみよう
float *p;
p = &balance[0][0];
balance[x][y]の場所は x*10+y だから *(p + (x*10) + y)でなんとかたどり着けたわ
0743デフォルトの名無しさん
2009/02/18(水) 08:25:31もし必要なら自分で用意したバッファをFILEに割り当てることもできるから、
バッファサイズを目的に合わせて最適化することも考えられる。
尤も、昔と違ってディスクキャッシュが善きに計らってくれるから大差ないけどw
0744476
2009/02/18(水) 10:37:33歯磨きと顔洗う
0745デフォルトの名無しさん
2009/02/18(水) 11:29:05知人が柴田って人の明解C言語ってのと10日で覚える(ryってのをもってるって言ってたけど近くに大きめな図書館があるから良さそうなのがあれば借りてこようと思う。
0746デフォルトの名無しさん
2009/02/18(水) 11:30:29FILEの仕様はコンパイラで違うから自分で用意したバッファを割り当てるとかありえない
0747476
2009/02/18(水) 11:34:40やめたほうがいいですよ (float *)の意味とかのってませんしね
ここの人が言うように なんとかCがいいですよ
0748デフォルトの名無しさん
2009/02/18(水) 11:38:12setbuf, setvbuf のことを言ってるんじゃないの?
0749デフォルトの名無しさん
2009/02/18(水) 11:38:54ありがとうござます
そのなんとかの部分が知りたい^-^;
0750デフォルトの名無しさん
2009/02/18(水) 11:39:11(float *)の意味って本に書くほどの内容じゃないだろ
float型のポインタにキャストだろ
0752デフォルトの名無しさん
2009/02/18(水) 11:41:350753476
2009/02/18(水) 11:43:01他には良い本あると思います
私的には明解Cとか
よさそうかとおもいます
ここの回答よかったからみてください
http://oshiete1.goo.ne.jp/qa3829390.html
745さん
0754デフォルトの名無しさん
2009/02/18(水) 11:54:45度々どうもです。
リンク先も参照して図書館に言ってきますわ。
ありがとうござました。
0756476
2009/02/18(水) 13:07:07float balance[10][5]をポインタに通してつかわず
balanceのまま使うと
*(balance[1])という感じでbalance[1][0]にアクセスできました
balanceの型はfloat(*)[5]この意味はもしかすると
*(balance[1]+1)だと balance[1][1]にアクセスできるってかんじであってますか?
(float *) balanceをするとfloat *(4バイトずつ進む物に変換するので)
balanceのままだと balance[0][0] balance[1][0] balance[2][0] balance[3][0]の左の縦の配列だけインクリメント
されるので(4x5)20バイトずつ進んでしまうので (float *)で4バイトすすめれば balance[0][1] balance[0][2]っていうかんじですすめるので
キャストする理由は 4バイトずつ進められて*(balance+1)の場合+1で4バイトすすむのでbalance[0][1]とかの考えであってますか?
なんとなく自分的には4バイトずつ進めさせるためと思ったんですが
0757476
2009/02/18(水) 13:14:03int main(void)
{
int k[4][3]={
{30,40,20},
{50,60,10},
{70,80,30},
{90,100,45}
};
printf("%p\n",&k[1]);
printf("%p\n",&k[2]);
printf("%p\n",&k[3]);
return 0;
}
これで確かめました
30(k[0][0])の場所のメモリアドレスが0だとしたら
50(k[1][0]の場所がメモリアドレス12
70(k[2][9])の場所がメモりアドレス24
intは4バイトなので配列が3こあるので 4x3で12バイト 3個の配列の合計が12バイトで
1つが4バイト
キャストすると4バイトに扱えるって意味であってますよね?
ですが何故キャストしないと 12バイトずつk[1][0] k[2][0]と左の配列だけ増えてあがるんですか?
これは仕様なんですか?
0758デフォルトの名無しさん
2009/02/18(水) 15:19:20悪意なく聞くが、実年齢いくつだ? 別に小中高とかから選択でいい。(任意だが、それだけで回答もしやすい)
文章が上手くかけてないから、回答もしかねてる部分多いから注意しようぜ。
まず、配列のこと忘れよう。 キャストを知ろう。(データ型を覚えて!)
まず、大きな間違いを指摘する。 キャストで (float *) の*をアドレスの演算子と思うのは×
int型 float型 があるように、 int* 型 、 float*型という型が存在してる。
キャストというのは、型の違う(データ構造も違ったり)ものを、強制的に別の型に置き換える処理
キャストの典型例は、 int i = 2; double x = 3.14; がmainで宣言されているとする。
次の演算結果の値と型両方答えよ。
[1] (i * i) [2] (double) i * i [3] (double) i * (int) x
これらが、正確に分かるなら次のステップ
[4] (i * x) [5] i * (double) ( (int) x ) [6] i + (int *) i
キャストと切っても切れないのが、暗黙の型変換。これ、今考えると新出単語?
暗黙の型変換が分からないなら、[1]を質問する前に、そっちを聞かないと話がおかしくなる。
[0] 暗黙の型変換が分からない → http://www9.plala.or.jp/sgwr-t/c/sec04.html
とりあえず、[3]まで回答、質問してみ。
0759デフォルトの名無しさん
2009/02/18(水) 15:27:17何様?
0760デフォルトの名無しさん
2009/02/18(水) 15:29:31[2] 4.0
[3] 6.28
[4] 6.28
[5] 6.28
[6] i[0] + 2
0761デフォルトの名無しさん
2009/02/18(水) 15:31:17[2] double
[3] double
[4] double
[5] double
[6] int
0762デフォルトの名無しさん
2009/02/18(水) 15:32:31[3] 6
0763デフォルトの名無しさん
2009/02/18(水) 15:33:47[5] 6
0764476
2009/02/18(水) 15:33:53[2]も4です
[3]は6です なぜなら3.14はキャストされて下2桁は切り捨てられます
0765デフォルトの名無しさん
2009/02/18(水) 15:35:230766デフォルトの名無しさん
2009/02/18(水) 15:39:06[6] 処理系依存
0767758
2009/02/18(水) 15:39:57[1][2][3] データ型は? ただ、3.14が3に変換されるんじゃなくて、
(+2^1×11.001.....) みたいなのが(00000011)みたいなの(実際はもっと長いが)に変換されてるって分かってる?
計算結果にも型があるんだから、それを答えて。
0769デフォルトの名無しさん
2009/02/18(水) 15:43:010770476
2009/02/18(水) 15:47:34[5]これはややこしいですね さきに(int x)でキャストして下二桁カットされて3になってそれを(double)でキャストしても3なので 2*3で6です
[6]これなんですか i=2;を (int *)iってなんですか?むかつきます
iを*iにするってことですか? むかつくんですけど!なんですかほんとに
0771デフォルトの名無しさん
2009/02/18(水) 15:49:51先生様じゃね?
0772デフォルトの名無しさん
2009/02/18(水) 15:51:50[1]の解答は int型の4 [2]の解答は double型の4.0
上の二つが理解できてないようだが?
もんだいにむかつくな。あと、(int *) と アドレス演算子一緒にするなと何度(ry
0773476
2009/02/18(水) 15:56:02キャストの部分を何回も見ても(int *)と書いてませんでした
どうすれば良いんですか本当に?
キャストの場所に(int *)がのってません
教えてください(int *)(float *) (char *)など頭がいかれて爆発しそうです
0774デフォルトの名無しさん
2009/02/18(水) 15:57:07【1】以下を因数分解せよ
(1) 3x^2 + 15x + 2xy + 10y (2)
(3)
0775デフォルトの名無しさん
2009/02/18(水) 16:00:05整数 + ポインタ という演算は見たことないな…
0776デフォルトの名無しさん
2009/02/18(水) 16:13:50>どうすれば良いんですか本当に?
他の本、他のサイトで勉強してからまたおいで。いくらでも(int *)が載ってるサイトあるよ。
本が悪いなら出版社に苦情だせば?
0777476
2009/02/18(水) 16:26:11int i = 100;
short *psh = (short *)&i;
&iっていうのはint *型ってことなんですね?
int *型とかいっててよくわかんなかったけど &iはint型かと思ってました
0778デフォルトの名無しさん
2009/02/18(水) 16:43:290779476
2009/02/18(水) 16:51:13{
int i = 100;
short *psh = (short *)&i;
TRACE( "%X, %X\n", &i, psh ); // 64F530, 64F530
}
『あ、 (short *) っていうのが増えたね、これがキャスト?』
「そう。 &i は int * 型。それを無理矢理 short * 型に見せかけるのが
(short *) 。〈変えたい型を小カッコで囲む〉ってだけね
0780デフォルトの名無しさん
2009/02/18(水) 16:54:280781デフォルトの名無しさん
2009/02/18(水) 16:55:310782758
2009/02/18(水) 17:02:05int main(){
int i[3] = {1,2,3};
short *psh = (short *)&i;
printf( "%X, %X\n", &i, psh ); // 64F530, 64F530
for(int j=0;j<3;j++) printf( "%X, %X\n", i[j], *(psh+j) ); // 1 1 , 2 0 , 3 2
return 0
}// int : 4byte , short 2byte
0783デフォルトの名無しさん
2009/02/18(水) 17:06:04An integer may be converted to any pointer type. Except as previously specified, the
result is implementation-defined, might not be correctly aligned, might not point to an
entity of the referenced type, and might be a trap representation
6.5.6
When an expression that has integer type is added to or subtracted from a pointer, the
result has the type of the pointer operand
0784デフォルトの名無しさん
2009/02/18(水) 17:06:20C言語では、以下のようにしないと、コンパイルできないときがある
だいたい、キャストの仕方(文法)としてはあってるけど、 こういうことなのは理解しといてね。
int main(){
int i[3] = {1,2,3};
/*修正*/ int j;
short *psh = (short *)&i;
printf( "%X, %X\n", &i, psh ); // 12FF78, 12FF78 <コメントアウトも自分の値に
/*修正*/ for(j=0;j<3;j++) printf( "%X, %X\n", i[j], *(psh+j) ); // 1 1 , 2 0 , 3 2
return 0
}// int : 4byte , short 2byte
0785デフォルトの名無しさん
2009/02/18(水) 18:04:290786476
2009/02/18(水) 18:38:32理解しようとして理解できない私はばかにされてばっかです
0787赤西仁
2009/02/18(水) 18:38:56かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッド�Uは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
どうか皆さん、お力をお貸しください。御礼はします!
0788デフォルトの名無しさん
2009/02/18(水) 18:48:42そのうちわかるかもしれん
0789デフォルトの名無しさん
2009/02/18(水) 19:31:12プログラミングは通常は何年も経験するうちにいつの間にか身についているっていうくらいのものなんだから。
>>788が言うように同じところで立ち止まるより先に進んだ方がいい。
後で戻ってくるとすんなり理解できるかもしれないし。
0790デフォルトの名無しさん
2009/02/18(水) 19:41:560791デフォルトの名無しさん
2009/02/18(水) 19:47:36スッ飛ばしてきたツケだな
これからも同じ様にスッ飛ばすのがいい
0792デフォルトの名無しさん
2009/02/18(水) 19:49:28どんなひねくれかただよ。
これからは色々考えて、勉強した方がいい。今回は
・ 質問が悪い (本に対する愚痴を書くな)
・ 質問の仕方が悪い (日本語が通っているか書き込む前に見直せ)
・ 質問する場所が悪い (ここは2chだぞ)
・ 調べ方が悪い (同じところ参照して、いっぱい調べましたって?)
・ 調べてないお前が悪い (2chよりGoogle使え)
そもそも、プログラムはパソコンの基本操作じゃないんだから、
弱音しか吐かない人にはあまりやる意味がない。
風景画描きなが、喚いてる奴はいない。なのにプログラムには沢山いる。謎だ。
0793デフォルトの名無しさん
2009/02/18(水) 19:53:26まともな答えなんて出てくるわけねぇ。
レベル的にも親切度的にも別のBBSを探した方が早いかもね。
0794デフォルトの名無しさん
2009/02/18(水) 19:56:12まあ、がんばれやw
0795476
2009/02/18(水) 19:58:13「int *」と「double *」が違う型であるのと同様に「float *」と「float (*)[5]」は違う型である、というのが理解できていない気がする。
この意味がやっとわかりました int *はint aのポインタ double * はdouble a;のポインタ float * は float a;のポインタ
使い方は int *p; p=&a
それで配列はfloat *は1次元配列のfloat a[10]に対応;
二次元の場合
float (*)[n]
float a[10][5];
float (*p)[5];
p=a; それか p=&a[0];
たぶんあってます この考えであってると思います
自信あります
残るはキャストの(float *)を理解すれば解放されます
0796デフォルトの名無しさん
2009/02/18(水) 20:02:56探せば普通に見つかるwww盲目乙
0797デフォルトの名無しさん
2009/02/18(水) 20:03:41もともとか田和の集団だから気付かないんだわこれが。
0798デフォルトの名無しさん
2009/02/18(水) 20:08:09C言語でのポインタの立ち位置 と
Windowsにおけるレジストリの立ち位置 って
だいたい、同じ気がしてきた。
知らなくても、普通の操作はできるけど、なんか細かい設定とかが
知ってないと、身動き取れない、って感じしないっすかね。
>>476 はこのスレで聞くのあきらめたら?
0799デフォルトの名無しさん
2009/02/18(水) 20:12:25キャストとは、違う型を「無理矢理」指定した型に変換するためのもの、ってことは理解してるか?
0800デフォルトの名無しさん
2009/02/18(水) 20:15:13実は476の存在を心のどこかで歓迎していたのだろう。
0801デフォルトの名無しさん
2009/02/18(水) 20:20:04実は799の存在を心のどこかで歓迎していたのだろう。
0802デフォルトの名無しさん
2009/02/18(水) 20:21:39long型の変数で情報量的には十分だから。
それで*と&の演算子だけあれば、Cでやれることは全てできる。
long ptr = &value;
printf("%d",*ptr);
このようなことをすればいいだけ。
わざわざポインタという型を用意して安全性を高めているのは、Cのやさしさだよ。
0803デフォルトの名無しさん
2009/02/18(水) 20:22:49悔しかったのかもしれないが、2番目は流石につまらん
0804476
2009/02/18(水) 20:23:07キャストは違う方を変換するっていうのは知ってます
float i=10.2;
printf("%d",(int)i);
10.2の下の桁はint型によりカットされます
なぜならintは小数点を扱えないので
そのくらいはわかってます。
独習Cの165ページまで理解できたので
0805デフォルトの名無しさん
2009/02/18(水) 20:29:260806476
2009/02/18(水) 20:36:16やさしいCはポインタの場所は簡単にまとめてあって理解しやすかったんですけど
float (*)[n]型 float *型などと説明が無く
ポインタの宣言は float *pとします。という感じでした
特に初めて聞いたのが float (*)[n]型っていうのです。
型っていうのは私が買った本には、int char double float voidが型でしたこの事を型と呼んでいて
今日やっと int *型っていうのが int *p;とわかりました
int *へのというのは &p;ってことがわかりました
0807デフォルトの名無しさん
2009/02/18(水) 20:39:570808デフォルトの名無しさん
2009/02/18(水) 20:40:26それが嫌なら、ちゃんとした洋書(またはその翻訳本)を買いなさい。
0809デフォルトの名無しさん
2009/02/18(水) 20:44:15習得の手助けになることはあってもね
0810デフォルトの名無しさん
2009/02/18(水) 20:48:40対象としている本。
教科書を読みたい=Cがわかる人になりたい
のか、プログラムを書けるようになりたいのかはっきりしたいところ。
0811デフォルトの名無しさん
2009/02/18(水) 20:50:37あれば教えてほしい。
0812デフォルトの名無しさん
2009/02/18(水) 21:01:45具体的な目標(与えられた問題でも良い)を設定し、自分で
コードを書いてみること。これ以外に無いと思う。
途中で言語や数学の問題にぶつかるかもしれないが。
0813デフォルトの名無しさん
2009/02/18(水) 21:06:200814デフォルトの名無しさん
2009/02/18(水) 21:21:21文法書から入ると頭でっかちなだけで使えないプログラマになるとは聞くね。
0815476
2009/02/18(水) 21:25:58ありがとうございました!
ちなみに皆さんは何でそんな頭がいいんですか?
普通に売ってる参考書などを見てここまで知識を蓄えたのでしょうか?
C言語とポインタがわかれば電光掲示板に表示したりする物など作れますか?
自動販売機のデジタル表示など?
0816デフォルトの名無しさん
2009/02/18(水) 21:33:070817デフォルトの名無しさん
2009/02/18(水) 21:33:35他人にアヤつけるのは50年早いンだと思ってる
賢明な人はここで質問なんかしないだろうな
0818デフォルトの名無しさん
2009/02/18(水) 21:53:50あ、文字列ポインタ使ってたwww
0819デフォルトの名無しさん
2009/02/18(水) 21:56:24>>805
推薦図書スレ行け。自分で読んで判断するしか無いけどな
0820デフォルトの名無しさん
2009/02/18(水) 21:59:13ご教授よろしくお願いします
0821デフォルトの名無しさん
2009/02/18(水) 22:01:13『2chの人が総出でチェックしてくれるデバッガ』という奴か。頭構造までデバッグしてくれるとは性能いいな
0822デフォルトの名無しさん
2009/02/18(水) 22:01:20ネットに転がってる入門文書読んで基礎知識を身につけた後
ひたすら他人の書いた良質のソースコードを理解するように努める
0823デフォルトの名無しさん
2009/02/18(水) 22:03:14なるほど!そういえばうちの大学の教授も他人の書いた良質なソースコード読めばいいとか言ってました。
そうしてみますありがとうございました。
0824デフォルトの名無しさん
2009/02/18(水) 22:04:36CのプロはC++のどの機能が便利だと思うわけ?
0825デフォルトの名無しさん
2009/02/18(水) 22:05:01わからなかったら実際にその部分だけ自分で書いてみて動かして調べる。
0826デフォルトの名無しさん
2009/02/18(水) 22:05:370827デフォルトの名無しさん
2009/02/18(水) 22:06:01ベターCとして使うとC++の人たちが笑うので、
一概にいいとは言えない。
0828デフォルトの名無しさん
2009/02/18(水) 22:07:41クラス、クラスの継承、演算子のオーバーロード。
これらのC++に機能を使いながらprintf。
これが通。
0829デフォルトの名無しさん
2009/02/18(水) 22:08:340830デフォルトの名無しさん
2009/02/18(水) 22:10:59これが通。
0831デフォルトの名無しさん
2009/02/18(水) 22:22:01xに入力されている10進数とbitの論理積には、どんな意味があるのでしょうか?
void d2b(int x){
int i;
int bit = 1;
char c[BitSize];
for(i=0;i<BitSize;i++)
{
if(x & bit)
c[i] = '1';
else
c[i] = '0';
bit <<= 1;
}
printf("2進数: ");
for(i=BitSize-1;i>=0;i--){
putchar(c[i]);
}
printf("\n");
}
0832デフォルトの名無しさん
2009/02/18(水) 22:29:280834デフォルトの名無しさん
2009/02/18(水) 22:33:56だから10111101 & 00000001 = 00000001
10111101 & 00000010 = 00000000
10111101 & 00000100 = 00000100
みたいにしていくと、2進表示にできる
0835デフォルトの名無しさん
2009/02/18(水) 22:36:00コードには悪質性は定義できても、良質性を定義するのは不可能に近い。
だから文学部とかのゼミでやるような、高貴な文学書を熟読するような感じ
で読むのだけはやめたほうがいい。
書いた本人が書いた瞬間がもっとも良質で、時間の経過と共に劣化していくw
生モノに近いな
0836デフォルトの名無しさん
2009/02/18(水) 22:37:26{
int b;
for(b=31;b>=0;b--){
printf("%d",(x>>b)&1);
}
0837デフォルトの名無しさん
2009/02/18(水) 22:40:13まずxを表示しないその限り進数は無意味だよ。
で、x=13(10進)を2進で表現するとx=1101(2進)
これはそれぞれ、x=1*10+3*1(10進)と、x=1*8+1*4+0*2+1*1(2進)
で、bitはループが進むごとに1,2,4,8,…(10進)、これを2進で表現すると1,10,100,1000,…(2進)となっていく、
即ち、一つの桁だけが1となっている数である。
これとxの論理積求めて、0であればその桁は0、0以外であればその桁は1ということになる。
それを各桁ごとに配列に入れて、最後にまとめて表示すればxの2進表現となる。
0838デフォルトの名無しさん
2009/02/18(水) 22:45:53ここがよく分かりません。入力した値が、いつの間に0と1で表現できる形になっているのでしょうか。
0839デフォルトの名無しさん
2009/02/18(水) 22:49:400840デフォルトの名無しさん
2009/02/18(水) 22:50:44もうちょい良くなる。
void d2b(int x)
{
unsigned int bitmask = 1 << (sizeof(int)*8 - 1); //1byte==8bits
for(; bitmask; bitmask >>= 1){
putchar((x & bitmask) ? '1' : '0');
}
}
0841476
2009/02/18(水) 22:50:58#include <stdio.h>
int main(void)
{
char u[50],*p;
int i;
p=u;
for(i=0; i<50; i++)
p[i]='a'+i;
for(i=0; i<50; i++){
printf("%c",p[i]);
if(p[i]=='z')break;
}
printf("\n");
return 0;
}
if(p[i]=='z')break;を使わないで
配列にabc~zを入れるところでzまで入力をしたいんですが
break;をつかわないとz以上の{|}~などと表示されてしまい
for(i=0; i<50; i++)
p[i]='a'+i;の部分を
for(i=0; p[i]!='z'; i++)
p[i]='a'+i;
とやってもSegmentation faultと出てしまいます
どうすればいいでしょう?
0842デフォルトの名無しさん
2009/02/18(水) 22:55:38という表現の裏に潜む意味
「あやつのコードは悪い」
その悪いコードを理解したい(せざるを得ない?)人の立場を
理解しないのもCプログラマの特徴
bitが2のべき数の時( bit=1,2,4,8,16,32...)
整数(x & bit)は0またはbitに等しく
bit=2^mの時(m=0,1,2,3...)
(x & bit)が0であるか否かはxを2進数であらわした時のmビット目が0か1であるかに
対応する。
以降詳しくは数学板で
ここで聞いても無駄
0843デフォルトの名無しさん
2009/02/18(水) 22:59:310844デフォルトの名無しさん
2009/02/18(水) 23:02:09進数は表示するときの表示方法でしかない。
表示しなければ進数なんて無い。
0845デフォルトの名無しさん
2009/02/18(水) 23:02:34プログラム内というより、コンピュータは基本的に全部2進だよ
メモリとかでも電気があるか無いかで01
CDだと光が反射するかしないかで01
HDDだと磁化されているかされてないかで01
0846デフォルトの名無しさん
2009/02/18(水) 23:03:11はい。
0847デフォルトの名無しさん
2009/02/18(水) 23:03:590848デフォルトの名無しさん
2009/02/18(水) 23:04:4810進数との論理積に疑問を感じていたんですが、納得できました。
ありがとうございます。
0849デフォルトの名無しさん
2009/02/18(水) 23:07:050850デフォルトの名無しさん
2009/02/18(水) 23:11:18それは嘘。
多値で記録しているものもある。
NAND型フラッシュなら1素子で0から15まで記録するものがある。
0851デフォルトの名無しさん
2009/02/18(水) 23:12:270852デフォルトの名無しさん
2009/02/18(水) 23:12:55http://pc11.2ch.net/test/read.cgi/tech/1230466044/
0853デフォルトの名無しさん
2009/02/18(水) 23:13:240854デフォルトの名無しさん
2009/02/18(水) 23:19:27常にゴミデータと比較することになるから永遠にzと比較できない
0855デフォルトの名無しさん
2009/02/18(水) 23:23:44多値といっても2のN乗
0856デフォルトの名無しさん
2009/02/18(水) 23:24:34量子コンピュータは無限の値で表わしてるようなもんだしな
0857デフォルトの名無しさん
2009/02/18(水) 23:25:22だから01しか記録できないとは書いてないだろ?w
わざと曖昧に書いているのわかれ
0858デフォルトの名無しさん
2009/02/18(水) 23:26:45いちいち細かいところに突っ込むのがおまいらの悪いところだ。
正確じゃないとだめだというのは気持ちはわかるが、友達一生できないぞ。
0859デフォルトの名無しさん
2009/02/18(水) 23:27:08まずi=0の時とi=1の時にどんなループになっているか考えるんだ
そうすれば自ずとわかるんじゃね?
0860デフォルトの名無しさん
2009/02/18(水) 23:27:33http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8911.c
この8911.cの61,62行目の
j = rand() % (i + 1);
swap(int, a[i], a[j]);
という2行を swap(int, a[i], a[rand() % (i + 1)]); という1行に変更すると
生成される数字列がおかしくなってしまいます(具体的には数字が重複してしまいます)。
(例 8 3 5 4 4 9 5 1)
#define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
の部分が何か変な動作をしているからなのでしょうが、
数字列がおかしくなる原因がいまいちよくわかりません。
どなたか回答よろしくお願いします。
0861デフォルトの名無しさん
2009/02/18(水) 23:29:070862デフォルトの名無しさん
2009/02/18(水) 23:30:46一回手作業で置き換えてみればわかる
0863デフォルトの名無しさん
2009/02/18(水) 23:31:41それはどうかと思うな。
はじめは噛み砕いた説明で概要をつかませて、その後にちゃんとした情報で修正していった方が速いと思う。
その後に〜を進まなかったときにえらいことになる可能性があるが。
0864デフォルトの名無しさん
2009/02/18(水) 23:32:50そういう入門書は沢山あるよね
すべて糞本なんだけど
0865デフォルトの名無しさん
2009/02/18(水) 23:34:15無限の値で表わしてるわけじゃないよ
o 関数の入力の値は固定
o 関数内部の初期状態は、確率的に取り得るだけの状態が存在する
o 観測する[1]と関数内部の状態が収束して出力が固定される
てなわけで、無限の値はどこにも出てこない
[1] おおざっぱに言うと入力を与えるとか
0866デフォルトの名無しさん
2009/02/18(水) 23:42:00「基本的に全部」と書いてあるだろ。全然曖昧じゃない。明らかな嘘。
0867デフォルトの名無しさん
2009/02/18(水) 23:42:34これが実際には無限じゃなかったっけ?
0868デフォルトの名無しさん
2009/02/18(水) 23:45:480869デフォルトの名無しさん
2009/02/18(水) 23:47:40で、基本以外は?
0870デフォルトの名無しさん
2009/02/18(水) 23:50:18量子ビット1つで2状態、n個で2^n状態、を重ね合わせる。
有限個の量子ビットで取りうる状態は、有限。無限ではない。
>>869
そんなの>>845に訊け。
0871デフォルトの名無しさん
2009/02/18(水) 23:50:40置き換えてみたらわかりました。
swap(int, a[i], a[rand() % (i + 1)]); が置き換わった
do {
int t = a[i];
a[i] = a[rand() % (i + 1)];
a[rand() % (i + 1)] = t;
} while (0);
について考えると、
3行目の a[i] = a[rand() % (i + 1)]; の rand() % (i + 1) と
4行目の a[rand() % (i + 1)] = t の rand() % (i + 1) の値が異なるからですね。
つまり、
a[i] = a[rand() % (i + 1)];
a[rand() % (i + 1)] = t;
では、値が交換されることにならないので、
値が重複してしまうことになる。
0872デフォルトの名無しさん
2009/02/18(水) 23:52:020873デフォルトの名無しさん
2009/02/18(水) 23:52:470874デフォルトの名無しさん
2009/02/18(水) 23:53:200875デフォルトの名無しさん
2009/02/18(水) 23:54:030876デフォルトの名無しさん
2009/02/18(水) 23:54:280877デフォルトの名無しさん
2009/02/18(水) 23:54:360878デフォルトの名無しさん
2009/02/18(水) 23:56:36フラッシュメモリーのような一般的に普及しているデバイスが「基本的」とやらに含まれていないことがそもそも嘘だ。
0879デフォルトの名無しさん
2009/02/18(水) 23:56:520880デフォルトの名無しさん
2009/02/18(水) 23:57:190881デフォルトの名無しさん
2009/02/18(水) 23:58:180882デフォルトの名無しさん
2009/02/19(木) 00:00:480883デフォルトの名無しさん
2009/02/19(木) 00:05:03>CDだと光が反射するかしないかで01
これウソだろw
0884デフォルトの名無しさん
2009/02/19(木) 00:06:05B:ハア?オーストラリアじゃ暑くて火事が起こってんだぜ?アフォ?
A:いや、東京の話だよw
今このレベル
0885デフォルトの名無しさん
2009/02/19(木) 00:07:09>HDDだと磁化されているかされてないかで01
これもウソだww
酷いww
0886デフォルトの名無しさん
2009/02/19(木) 00:07:29845の言う基本的か否かを一般的に普及しているかどうかという問題にすりかえようとしていることがそもそも間違い
0887デフォルトの名無しさん
2009/02/19(木) 00:09:01反射率の変化点が1、それ以外0
>>885
磁化されているかではなく、磁性体の方向だろうな
0888デフォルトの名無しさん
2009/02/19(木) 00:11:07一般的に普及しているものを含まないなんて、全然一般的じゃないだろ。
即ち、「コンピュータは基本的に全部2進」と言うのは嘘。
0889デフォルトの名無しさん
2009/02/19(木) 00:12:51○ > >>843
嘘 > プログラム内というより、コンピュータは基本的に全部2進だよ
嘘 > メモリとかでも電気があるか無いかで01
嘘 > CDだと光が反射するかしないかで01
嘘 > HDDだと磁化されているかされてないかで01
アンカー以外全部ウソだろwwww
0890デフォルトの名無しさん
2009/02/19(木) 00:13:01x86系のCPUなんてその最たるものだと思うが
0891デフォルトの名無しさん
2009/02/19(木) 00:13:120892デフォルトの名無しさん
2009/02/19(木) 00:13:220893デフォルトの名無しさん
2009/02/19(木) 00:13:35それは君の考える基準なだけ(たとえ他にも居たとしても)であって
845の示した基準が不明なわけだから断定するのが間違い
0894デフォルトの名無しさん
2009/02/19(木) 00:13:530895デフォルトの名無しさん
2009/02/19(木) 00:14:130896デフォルトの名無しさん
2009/02/19(木) 00:15:16もちろんそうじゃないっていう人がいるのはわかるぜ。だけどここは流石に突っ込まないだろお前らでも?
0897デフォルトの名無しさん
2009/02/19(木) 00:15:330898デフォルトの名無しさん
2009/02/19(木) 00:16:41だから>>896は嘘つきだ。
0899デフォルトの名無しさん
2009/02/19(木) 00:16:53わかりやすくどころか混乱させる事しかしない
馬鹿なの?
0900デフォルトの名無しさん
2009/02/19(木) 00:17:36クラスに1人はいたわ
0901デフォルトの名無しさん
2009/02/19(木) 00:18:130902デフォルトの名無しさん
2009/02/19(木) 00:18:56ならばしょうがない
0903デフォルトの名無しさん
2009/02/19(木) 00:19:59メディアに載ってる状態は 1/0 ではない場合も多々あるが、基本的アーキテ
クチャとして, 1/0 を扱う方向で設計されているものがほとんどであることは
事実だわな.
だからと言って、>>845 の例は全く間違いであることは確なんだが.
0904デフォルトの名無しさん
2009/02/19(木) 00:20:05誰もがわかっているのに無理やりそらしてるのはお前らじゃね?
ワイドショーのマスコミみたいに。
0905デフォルトの名無しさん
2009/02/19(木) 00:20:20その時点で>>845のレヴェルが知れる。ド素人。
0906デフォルトの名無しさん
2009/02/19(木) 00:20:480907デフォルトの名無しさん
2009/02/19(木) 00:22:00他人の揚げ足取りでメシウマする連中がいるスレなんだろう。
0908デフォルトの名無しさん
2009/02/19(木) 00:22:09もちろんそうじゃないっていう人がいるのはわかるぜ。だけどここは流石に突っ込まないだろお前らでも?
0909赤西仁
2009/02/19(木) 00:22:29かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッド�Uは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
どうか皆さん、お力をお貸しください。
0910デフォルトの名無しさん
2009/02/19(木) 00:23:32ごちゃごちゃ横道にそれずに正しい事を話せばいいのに
0911デフォルトの名無しさん
2009/02/19(木) 00:23:45汚いかどうか考えたことないので突っ込み以前の問題です。
0912476
2009/02/19(木) 00:24:300913デフォルトの名無しさん
2009/02/19(木) 00:27:39常に初期化する前のp[i]と比較している。
p[i] = 'a' + i した後にiをインクリメントしているから、p[i]がさっき代入したものと比較できていない。常にゴミデータが入っているp[i]を使っている。
これで十分でないか?
0914デフォルトの名無しさん
2009/02/19(木) 00:29:17for(i=0; i<50; i++) {
p[i]='a'+i;
if(p[i] == 'z') break;
}
0915デフォルトの名無しさん
2009/02/19(木) 00:30:10さっき代入を行ったときのp[i]とは違うものになっているので、p[i]の中身が・・・・
ってことね。
0916デフォルトの名無しさん
2009/02/19(木) 00:34:590917476
2009/02/19(木) 00:35:47ゴミデータとかレベル高いですね
やっぱりif(p[i]=='z')break;使うしか無いんですね
回答ありがとうございました
0918デフォルトの名無しさん
2009/02/19(木) 00:38:19アルファベットは何文字?
0919デフォルトの名無しさん
2009/02/19(木) 00:38:44いや、>>841をなるべく変更しないならそうだが、
aからzを表示するのに普通は>>841のようには書かないだろ。
0920デフォルトの名無しさん
2009/02/19(木) 00:40:56i = -1;
do{
++i;
p[i]='a'+i;
}while(p[i]!='z');
0921デフォルトの名無しさん
2009/02/19(木) 00:43:21int main(void)
{
char u[50],*p;
char c;
p=u;
for(c='a'; c < 'z'+1; c++)
p[i]=c;
p[i] = '\0';
for(i=0; p[i] != '\0'; i++)
printf("%c",p[i]);
printf("\n");
return 0;
}
0922デフォルトの名無しさん
2009/02/19(木) 00:44:33センスあるボケですね
0923デフォルトの名無しさん
2009/02/19(木) 00:50:47p = u;
for(*p='a'; *p!='z'; ++p) *(p+1) = *p+1;
p = u;
for(printf("%c", *p); *p!= 'z'; ++p) printf("%c", *(p+1));
0924デフォルトの名無しさん
2009/02/19(木) 00:52:300925476
2009/02/19(木) 00:52:56ドラゴンレーダーとか人造人間って作れるんですか?
ドクターゲロや則巻センベエになるには電子工作とかしなきゃだめですか?
ドラゴンレーダーとか作れるんでしょうか?ドラゴンボールの位置とか
0926デフォルトの名無しさん
2009/02/19(木) 00:53:54ダウト
0927デフォルトの名無しさん
2009/02/19(木) 00:54:17まずドラゴンボールを持って来い。話はそれからだ。
(元ネタは一休さんです)
0928デフォルトの名無しさん
2009/02/19(木) 00:55:51マ板ム版は昔からだ。
2chでも釣り堀として愛好されてるくらいだし。
0929デフォルトの名無しさん
2009/02/19(木) 00:56:34ヨンナム
0930デフォルトの名無しさん
2009/02/19(木) 00:57:460931デフォルトの名無しさん
2009/02/19(木) 00:59:33作れるよ。
0932デフォルトの名無しさん
2009/02/19(木) 01:27:27>for(c='a'; c < 'z'+1; c++)
> p[i]=c;
おかしいだろ、これ
0933デフォルトの名無しさん
2009/02/19(木) 01:41:320934赤西仁
2009/02/19(木) 01:41:42かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッド�Uは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
どうか皆さん、お力をお貸しください。
0935デフォルトの名無しさん
2009/02/19(木) 02:40:31あと、1レス見たらアク禁にしてもいいか?
0936赤西仁
2009/02/19(木) 02:42:14かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッド�Uは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
どうか皆さん、お力をお貸しください。
0937デフォルトの名無しさん
2009/02/19(木) 04:06:59i++が必要だな
0938デフォルトの名無しさん
2009/02/19(木) 04:22:54#include<string.h>
void main(void)
{
int max_sincho=0,sincho=0,i;
char namae[20],max_namae[20];
for(i=0;i<=5;i++){
printf("名前と身長を入力\n");
scanf("%s,%d",&namae,&sincho);
if(sincho>max_sincho){
strcpy(max_namae,namae);
max_sincho=sincho;
}
}
printf("%s,%d",max_namae,max_sincho);
}
最終結果がおかしくでるんですが、、
受け渡しがうまく行ってない??
初歩的ですいません、ご回答お願いします。
0939デフォルトの名無しさん
2009/02/19(木) 04:36:50× scanf("%s,%d",&namae,&sincho);
○ scanf("%s %d",&namae,&sincho);
半角スペース区切りで名前と慎重を入力
0940デフォルトの名無しさん
2009/02/19(木) 04:37:28namaeそれ自体がアドレスだから
0941デフォルトの名無しさん
2009/02/19(木) 04:40:15ありがとうございます!!結果正常にでました。
ところで、なぜコンマで区切るとエラるんですか??
0942デフォルトの名無しさん
2009/02/19(木) 04:40:55ありがとうございます!!
配列自体がアドレスってこと忘れてましたw
0943デフォルトの名無しさん
2009/02/19(木) 05:09:31%sはカンマ区切りを分離しないから。つまり、「foo,bar」と入力するとnamaeにfoo,barがコピーされてsinchoが入力待ちになる。
どうしてもカンマ区切りにしたいなら、%d,%sで済ませるか%[^,],%dとする必要がある。
どの場合もscanf()を使う限り、フォーマットを間違って入力するとフォローできなくなるので要注意。
0944デフォルトの名無しさん
2009/02/19(木) 05:53:28別に&namaeでも通るだろ
(char*)(&name[0])とか
&namae[0]のほうがベターだが
慣習的にnamaeが一次元配列の場合、namaeでも
通用するというのが正しく
nameの前に&はいらないというのは
言い過ぎ
簡潔最小表現の盲目的礼賛=Cプログラマーの趣味
というプロパガンダを流そうとしていることミエミエ
0945デフォルトの名無しさん
2009/02/19(木) 06:16:56同値性のみを云々するなら兎も角、意味論的には& namaeは間違い。
そういう意味では& namae[0]は正しいが、その型がchar *なのは自明なので(char *)とキャストするのは愚の骨頂。
プロパガンダ云々と言った電波を垂れ流す前に勉強するべきだ屑。
0946デフォルトの名無しさん
2009/02/19(木) 06:26:15int main(void){
char x[1024];
x++;
return 0;
}
このプログラムがコンパイルとおりません。コンパイラ壊れてるんですね?
0947デフォルトの名無しさん
2009/02/19(木) 06:32:40コンパイラの名前と出力されたエラーメッセージを書きなさい。
0948デフォルトの名無しさん
2009/02/19(木) 06:45:54char x[1024], *p = x;
p++;
とかやっとけ
0950デフォルトの名無しさん
2009/02/19(木) 07:53:00そりゃそうだ。それはそうとして、この程度の知識はあったのねw
0951デフォルトの名無しさん
2009/02/19(木) 08:31:14ないのでしょうか?
0952デフォルトの名無しさん
2009/02/19(木) 08:32:44malloc を使うときに必要
コマンドライン引数を使うときに必要
0953デフォルトの名無しさん
2009/02/19(木) 09:18:15int x[1024];
でxは配列名であると同時に、x[0]へのintポインタ定数
ポインタ変数ではないので、++演算子を使うことが出来ない。
より正確を期するとxをx[0]へのintポインタ定数と見なして
もらえるのは慣習上の特認(この特認を認めなければソースコードが
*や&や()だらけの読めた代物ではなくなってしまう)
0955デフォルトの名無しさん
2009/02/19(木) 11:35:29配列 の ポインタ
0956デフォルトの名無しさん
2009/02/19(木) 12:36:180957ヨンナム
2009/02/19(木) 13:10:38#include <ctype.h>
int main(void)
{
char str[80],*p;
gets(str);
p=str;
while(*p)
*p++=toupper(*p);
printf("%s\n",str);
return 0;
}
これなんですが、printf("%s\n",str);ここをポインタで表示したいのですが
*pとやってもpとやっても表示できません
どうすればいいんですか?おしえてください
0958デフォルトの名無しさん
2009/02/19(木) 13:18:24%pのこと?
0959デフォルトの名無しさん
2009/02/19(木) 13:19:26p はp++でインクリメントしてstrの末尾の\0を指してるんだから
そのままじゃ何も出ないだろうよ。
0960476
2009/02/19(木) 13:21:14printf("%s\n",str); をprintf("%s\n",p);
とやったんですが空白が表示されるだけです
もしかして*pの位置が最後になってるからですか?
インクリメントをしたせいで本来pですが読み込んだ分のインデックスがaiueoだとしたらp[5]からはじまるので
pがp[5]になってしまい
表示されるときp[5]からなのでp[5]以上は何も入ってないから空白が表示されるんでしょうか?教えてください
0961476
2009/02/19(木) 13:24:21やはりインクリメントで読み込んだ分の最後の行になり*pの最後が\0になってしまうから
インクリメントのせいでpのインデックスがstr[0]から読み込んだ分のstr[5]から始まってしまうってことですね!
ありがとうございます理解しました
0962476
2009/02/19(木) 13:32:13p=str;
printf("%s",p);でできました
p=strでstrの先頭にもどせば&str[0]なのでそこから表示できました
自分って頭良いと思います
0963デフォルトの名無しさん
2009/02/19(木) 13:34:410964476
2009/02/19(木) 13:38:02次へ進むとすんなりいけます
次は構造体とかなんか難しそうなので、まだ構造体へいってなく文字列とポインタなので
ポインタをクリアすればもう完ぺきだとおもいます。
早くファイル操作などやってみたいです ファイルを保存したり
インデックスではp[5-5]などと調整しましたができなく。
p=str;でインデクスを戻す方法をあみだしました
この掲示板の人たちはとても親切でありがたいです
この掲示板がなかったらポインタでつまづいてましたありがとうござじます
0965デフォルトの名無しさん
2009/02/19(木) 13:43:120966デフォルトの名無しさん
2009/02/19(木) 13:59:25テンプレート無しの単継承ならそれっぽくできそうだけど…
多重継承やテンプレートはどうやれば良いか皆目検討がつかん
0967デフォルトの名無しさん
2009/02/19(木) 14:04:12コンパイラが高機能になりましたよってことだからナー
0968デフォルトの名無しさん
2009/02/19(木) 14:16:240969デフォルトの名無しさん
2009/02/19(木) 14:59:080970デフォルトの名無しさん
2009/02/19(木) 15:00:270971デフォルトの名無しさん
2009/02/19(木) 15:08:520972デフォルトの名無しさん
2009/02/19(木) 17:03:54多重継承は単純に継承先が継承元をメンバとして保持し、
テンプレートはマクロで実現するんだ。
0973デフォルトの名無しさん
2009/02/19(木) 18:17:56他の関数にそのまま渡すにはどうしたらいいんでしょうか?
具体的には以下のようなものを作ろうとしているのですが、
何分勉強不足でして、思うようにいきません。
ご教授いただけたら幸いです。
#include <stdio.h>
void Enumerate(int, char *[]);
int main(int argc, char *argv[])
{
Enumerate(argc, *argv);
return 0;
}
void Enumerate(int num, char *name[])
{
int i;
for (i = 0; i < num; i++) {
printf("%s\n", *name[i]);
}
}
0974デフォルトの名無しさん
2009/02/19(木) 18:26:32したいことがよくわからんが、そのソースを動くようにするには
Enumerate(argc, argv); にして
printf("%s\n", name[i]); でいい。
0975デフォルトの名無しさん
2009/02/19(木) 18:27:22void Enumerate(int, char *[]);
int main(int argc, char *argv[]){
Enumerate(argc, argv);
return 0;
}
void Enumerate(int num, char *name[]){
int i;
for (i = 0; i < num; i++) {
printf("%s\n", name[i]);
}
}
0976デフォルトの名無しさん
2009/02/19(木) 18:33:46ありがとうございます。これでうまくいきました。
* を外せばよかったんですね。盲点でした。
0977デフォルトの名無しさん
2009/02/19(木) 18:40:170978デフォルトの名無しさん
2009/02/19(木) 18:40:560979デフォルトの名無しさん
2009/02/19(木) 18:41:30マップは作成工数に入れる?
0980デフォルトの名無しさん
2009/02/19(木) 18:44:33暇が出来たら作ってみたいな
0981デフォルトの名無しさん
2009/02/19(木) 18:45:230982デフォルトの名無しさん
2009/02/19(木) 18:55:36C言語なら俺に聞け(入門篇) Part 45
http://pc11.2ch.net/test/read.cgi/tech/1235044065/
0984デフォルトの名無しさん
2009/02/19(木) 20:52:590985476
2009/02/19(木) 21:20:461.int a; &aは何へのポインタでしょう?
2.int a[5]; aは何へのポインタでしょう? &a[0]は何へのポインタでしょう
3.int a[10][5]; aは何へのポインタでしょう? a[1]は何へのポインタでしょう?
これができなければだめです
0986デフォルトの名無しさん
2009/02/19(木) 21:30:032. intへのポインタ、int*(に変換される)/int[5]へのポインタ、int(*)[5]
3. int[5]へのポインタ¥nt(*)[5](に変換される)/intへのポインタ、int*
ここでも読め。
http://kmaebashi.com/programmer/pointer.html
0987デフォルトの名無しさん
2009/02/19(木) 21:31:04そこもintへのポインタ、int*な。
0988デフォルトの名無しさん
2009/02/19(木) 21:37:01コマンドプロンプトで入力するとき、全角入力はできないのでしょうか?
0989デフォルトの名無しさん
2009/02/19(木) 21:41:17ほかから張り付けという手もある。
次からWindows板行け。
0990デフォルトの名無しさん
2009/02/19(木) 21:43:45了解です(`・ω・´)ゞ
ありがとうございました
0991デフォルトの名無しさん
2009/02/19(木) 22:35:341.int a; &aは、ポインタでしょうか?
>>476がんばってくれ。
↓参考
#include<stdio.h>
int main(){
printf( "476を応援 %d \(^O^)/%sTEL\n"+0XA,0x1dc,'-'/'-'+"POW\bWAT\b");
return 0;
}
0992デフォルトの名無しさん
2009/02/19(木) 22:45:25のa[0][1];のアドレスを得たいんですが
&a[0][1]では無く
ポインタ演算子でやるにはどうしたらいいんでしょうか?
いろいろ試したあげく
(a+0)+0などとやってみて 他には(a+0)+(a+1);とやってみましたがダメでした
どうすればいいでしょう?
0993デフォルトの名無しさん
2009/02/19(木) 22:49:35a+1*5+0
0994デフォルトの名無しさん
2009/02/19(木) 22:52:530995デフォルトの名無しさん
2009/02/19(木) 22:58:28デバッガで何とかなる?
0996デフォルトの名無しさん
2009/02/19(木) 23:05:360997デフォルトの名無しさん
2009/02/19(木) 23:10:14decltype()
0998デフォルトの名無しさん
2009/02/19(木) 23:10:48とかやると〜はstruct{} Aに変換できないみたいなエラーを吐いてくれるものもある。
0999デフォルトの名無しさん
2009/02/19(木) 23:11:18???
1000デフォルトの名無しさん
2009/02/19(木) 23:18:2310011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。