C統合・質問スレッド ..
[2ch|▼Menu]
869:デフォルトの名無しさん
08/02/23 12:33:19
>>865
C#なら配列の長さを調べることができるから
for (int i = 0; i < array.Length; i++) {
  〜
}
ってやればいいんじゃね

870:デフォルトの名無しさん
08/02/23 13:07:04
そもそもarray[3]はポインタじゃないのに何でNULLになるんだよ…

871:デフォルトの名無しさん
08/02/23 13:10:44
たぶんあちこちでNULL文字とかNULL終端といった言葉が使われてるせいかと

872:デフォルトの名無しさん
08/02/23 14:55:05
糞入門書の弊害か…
ASCIIの0の略語はNULLじゃなくてNULだな。
Wikipedia項目リンク
混乱起こすから「ヌル文字」とか区別して書くべき。

873:865
08/02/23 16:21:31
>>867
3個である事を前提にループさせるんですね
発想が悪かったみたいです。。。
終端ばっかり調べようとしてました
配列のサイズ取得して割ったら出来ました
ありがとうございます

874:デフォルトの名無しさん
08/03/06 22:24:02
サイトからダウンロードしたMicrosoft Windows SDKのIMGファイルが1.32GBもあって大きすぎてCDに入らないんですけどどうやってインストールするんですか??

875:デフォルトの名無しさん
08/03/06 23:26:53
300行で1つの関数と、それと同等の処理を30行の関数が100個で構成するのとでは何が違うのでしょうか?
スタックがどうのこうのとブツブツ上司が呟いたのだが、なにが問題なのでしょうか


876:デフォルトの名無しさん
08/03/06 23:48:44
>>874
Daemon ToolsでマウントするとかDVDに焼くとか。

877:デフォルトの名無しさん
08/03/06 23:52:01
>>874
CDじゃなくてDVD用でしょそれ

878:300 * 1 < 30 * 100
08/03/07 01:04:42
>>875
プログラムの規模が違う。

879:デフォルトの名無しさん
08/03/07 22:49:11
その関数が呼び出されてスタックに詰まれる量が違う

300行分のコードが詰まれるのと
30行分のコードが詰まれるかの違い

けど、其れだけでブツブツ言うとも考えにくいので
他の問題があったのではと予想
明日聞くんだな

880:デフォルトの名無しさん
08/03/08 00:48:30
>300行分のコードが詰まれるのと
>30行分のコードが詰まれるかの違い
はぁ? コードが詰まれる? どこの実装ですか?
おたくさまの脳内?

881:デフォルトの名無しさん
08/03/08 20:35:29
int *ptr;
int array[10];
for(ptr=array; ptr<array+10; ptr++)
{
*ptr = 0;
}
array+10は何を表しているのですか?

882:デフォルトの名無しさん
08/03/08 20:39:22
arrayの終端。

883:デフォルトの名無しさん
08/03/09 15:23:37
>>880
そんな質問の仕方じゃ答えてあげないよ
とりあえず関数作って自動変数のメモリを表示させて確認する作業に戻るんだ

884:デフォルトの名無しさん
08/03/09 15:39:23
そりゃ自動変数は積まれるだろうよ
コードが積まれるってのは訳分からん

885:デフォルトの名無しさん
08/03/09 16:11:31
なんだ、>879の阿呆は未だ自分の間違いに気付いていなかったのか。
とっくに尻尾を丸めて引き篭もっているのかと思った。

886:デフォルトの名無しさん
08/03/09 17:15:35
コードを詰む=スタックに実行アドレス(IP)を詰む

という意味なら通じるが、普通コードを詰むとは表現しないな

887:デフォルトの名無しさん
08/03/10 14:28:02
>>886
詰むなよ。ゲームオーバーじゃねぇか。

888:デフォルトの名無しさん
08/03/11 01:58:55
んあ?
よくわからない

コードをじゃなくて
「実行アドレスを積む」なら俺リアルで恥かかない・・・?

コードって全体をさしてるものと思ってたんだけど。
処理のみの部分をいうのかな

889:デフォルトの名無しさん
08/03/11 02:26:33
実際に実行命令をスタックに積んでるわけじゃないから

890:デフォルトの名無しさん
08/03/12 08:05:39
ほんとはよく知らないんですよ
誰も質問答えないのに見かねてしまった
ごめんね、適当答えて。


まとめると

関数に入ったら
 変数はスタックに詰まれる
 処理はスタックに詰まれない

てことですね ( 信じるかどうかは貴方次第!

掘り返し875の違いを、ソースを見ずに言える事は、
やはり上司に聞けとしか、言えないですね

891:デフォルトの名無しさん
08/03/12 08:08:55
>>890
>878は読めないんですか?
特に名前の辺りは。

892:デフォルトの名無しさん
08/03/12 08:13:17
例えばgooなどでああいう回答してもポイント貰えませんよ
自分はそんな目的ではありませんけども

893:デフォルトの名無しさん
08/03/12 08:20:49
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


894:デフォルトの名無しさん
08/03/12 08:22:47
でもコード量が十倍も違うなら、それが一番重要な差異だろ

895:デフォルトの名無しさん
08/03/29 08:59:59
>>893
可能です。
以上。
↓次どうぞ

896:デフォルトの名無しさん
08/03/30 18:20:29
VC++.NET の質問良いでしょうか?

1.UAC ダイアログを「インストール」ボタン押下時にのみ出したい
  1つの EXE でWindowsサービスのインストール、アンインストール、
  Windowsサービスの実行の機能を入れたんですが、
  VISTA のユーザーアカウント制御機能(UAC)のせいで、
  「管理者で実行」でプログラムを立ち上げないと上手く動きません。

  フォームの「インストール」ボタンをクリックした時だけ
  ユーザーアカウント制御のダイアログを出すように出来ませんか?

  常時Admin権限で動作ってのも都合悪いのですが・・・
  ユーザーに Admin 権限を持つのユーザー名、パスワードを入れて下さい、
  なんて画面を作った所で「???」だろうし
   ( VISTA インストール時に Admin パスワード入力しませんものねぇ。)

2.Windows サービスの設定ファイル、XXX.ini
  ってどこに置けばいいんですか?
  VISTA だと users 以下に入っちゃう空気ですが、exe と
  同じ位置だとNG?
  PC汚染を覚悟の上で windows 以下に入れるのが良い??

教えて君ですがよろしくお願いします。
UAC の情報ねーんですよぉぉぉ!!(絶叫

897:デフォルトの名無しさん
08/03/30 21:40:07
>>896
1
任意のタイミングで昇格は不可能ではないが、面倒そうなんで、
管理者権限が必要な部分だけ別プロセスにすることを勧める。

2
複数ユーザが同時ログオンしたら破綻するという点で、
Windowsフォルダもアウト、常考。

898:デフォルトの名無しさん
08/06/15 12:50:03
スタックに関してよくみかける記述について1つ疑問。

1)スタックはLIFO(Last In First Out)方式であり
 後に入れたデータから先に読みだされる
2)関数の引数及びローカル変数はスタックに積まれる

さて、問題。

int add(int a, int b)
{
int c;

c = b;
c = a+c;
return c;
}

という関数があった場合、スタックにはこのように
データが積まれると考えられる。

変数 c (ローカル変数)
変数 a
変数 b (最後の引数から積まれる)
(スタック領域の先頭アドレス)

1)に従えば、データはc->a->bの順番でしか取り出せない
はずだが、プログラムでは明らかにaより先にbの値を参照
して値を読みだしている。これはスタックのルールに
反するのではないか?

あなたはこの疑問を明確に説明できますか?


899:デフォルトの名無しさん
08/06/15 13:33:21
>>898
int add(int a,int b);
では、内部的に
struct {
int a,b;
int c;//ローカル変数用
}add_param;
を積んでるんだと考える。
スタックに一度に積めるデータの単位は別に固定じゃない
スタックは抽象概念だからね。

900:898
08/06/15 13:52:30
899さんの考えではint型変数a,b,cを含んだ構造体を一度に
PUSHしたから、取り出すのも同時にPOPできる・・・だから
変数を使用する順番は関係ないのだ、とこういう理屈でしょうか?
そうだとしたら何かおかしくありませんか?

ヒントですが898の日本語の文章はわざと誤解を生じるような
表現が使われています。スタックの本質は、PUSHにしろPOPに
しろ、それは必ずスタックポインタの遷移を伴う操作でなければ
ならないということです。POPするということはスタックから
データを取り除く、つまり”そのデータはもう使わないよ”
という意味ですよね? さて、898で私が書いた"値を参照"
する行為は果たしてPOPでしょうか?
ここをじっくり考えると何が問題だったか見えてくると
思いますよ。








901:デフォルトの名無しさん
08/06/15 14:04:38
何かおかしくありませんか?と書いてどこがおかしいのか指摘しないのはどうよwww

ともあれ、関数呼びだしに使われるスタックとデータ構造の議論でいうスタックは似ているが別のものってことで

902:デフォルトの名無しさん
08/06/15 14:06:55
寧ろ、struct {int a, b;}をスタックから取り出していると捉えてもいいかもしれない。
その後の仮引き数やローカル変数がスタックに積まれるかどうかは実装依存だし。

903:デフォルトの名無しさん
08/06/15 14:20:03
スタックといっても色々あって、pushされたら、popするまで
一切アクセスすることが出来ないものもあれば、アクセスでき
るものもある。
Cの関数の引き数用のスタックは、当然アクセスできるタイプが
使われる。問題はスタックポインタをどうやって関数は知らされたか
だが、まぁ隠しグローバル変数(register属性)とでも思って桶

904:898
08/06/15 14:34:42
>>ともあれ、関数呼びだしに使われるスタックとデータ構造の議論でいうスタックは似ているが別のものってことで

こういう中途半端な理屈で自分を納得させて学習を止めてしまうのが
一番良くありません。疑問があれば納得するまで調査するべきです。

私はCを勉強したての頃に前述の疑問を持ちその理由がよく説明
できませんでした。そこで自分なりに調べた結果、出した結論が
以下の答えです。

1)スタックはLIFO(Last In First Out)方式であり
 後に入れたデータから先に読みだされる
という記述の”読みだされる”というのがあたかもPOP
をしたかのように誤解を与える記述ですが、実際は内部の
動作としては”値を読みだす(参照する)行為”は”POP操作”
ではありません。スタックポインタが移動してないからです。

(続く)

905:898
08/06/15 14:35:26
898のスタック構造は若干、はしょった部分があり正確には
関数add()内部でのスタック構造はこんな感じになります。

ebpレジスタ
変数 c (ローカル変数)
関数の戻り先アドレス
変数 a
変数 b (最後の引数から積まれる)
(スタック領域の先頭アドレス)

そして関数内部ではesp(スタックポインタ)を一旦ebpレジスタ
に格納したうえで(アセンブラではmov (ebp,esp) )、変数a,変数b
への参照を以下のように行っています。
変数a dword ptr[ebp+12]
変数b dword ptr[ebp+16]
変数c dword ptr[ebp+4]
add()関数内部の処理はこれらをアキュムレータで演算しているに
過ぎません。

(続く)

906:898
08/06/15 14:37:19
関数を抜けるときに初めてPOPが行われます。
1)変数cをPOP
2)POPで呼び出し元に復帰
3)変数aをPOP
4)変数bをPOP
※実際にはPOPを行わずにスタックポインタの値を進める事で
 代用する場合が多いです。

結局、関数の中でスタックに積まれた引数やローカル変数の値
を使用することはスタックからそのデータを取り出した(POPした)
わけではないのだから、スタックの定義と全く矛盾しませんよ
ということを言うためにこんなまわりくどい説明をしました。

でも、案外誤解している人って多いかもしれないと思います。
なお、これらは日経BP社の「プログラムはなぜ動くのか」という
本の第10章「アセンブリ言語からプログラムの本当の姿を知る」
を読めば完全に理解できると思います。

(終)

907:898
08/06/15 14:58:50
>>903
ここはCに関するスレッドなので、スタックの概念や実装についても
Cの範疇でのみ回答しております。


908:デフォルトの名無しさん
08/06/15 15:00:23
>>904-906
だから、その話を踏まえて「似ているが別のもの」って言ったんだよ
Cの普通の実装で使われる呼び出しスタックは、配列上に構築したスタックと同じで、
スタックポインタからのオフセットを指定することで任意の要素のO(1)読み書きができるけど、
これは「スタック」というデータ構造が元々持ってる機能ではないってこと

基本的な意味でのスタックでは、値を取り出すにはpopするしかない
そこを混同してると>>898みたいな疑問が生まれる

909:898
08/06/15 15:12:50
あらま、詳しいお方でしたのね。失礼。

910:ebpなんて、極一部のCPUにしかないレジスタ持ち出すなよpgr
08/06/15 15:19:18
つーか、Cの仕様レベルでの話に実装を持ち出す>905はいかがなものかと。

911:898
08/06/15 15:55:18
>>910
正論だ。まったくもって正論だ。
「プログラムはなぜ動くのか」の本にもPentiumなどのx86系
マイクロプロセッサ用アセンブリ言語を対象として解説する
って書いてあった。どんなレジスタが使われるかはコンパイラ
依存だとも・・・。説明不足でした。まあ実装はちょっと置いといた
としても、なぜに「スタック」という名前なのに下のデータにアクセス
できてしまうのかという疑問については解決ってことで...(苦しい)

912:デフォルトの名無しさん
08/06/15 20:44:45
ポーランド記法で計算を行う為のアルゴリズムを教えてください。

913:デフォルトの名無しさん
08/06/16 08:28:06
CPUのスタックはスタックポインタいじればどこでもアクセスできるだろ
引数の渡し方も呼び出し規約で変わる
fastcallだとレジスタ渡しだし


914:デフォルトの名無しさん
08/06/16 17:48:41
C#での質問です。

string[] str = new string[10];
char[,] moji = new char[10,30];

このstrにファイルを読み込んで文字列として格納したものを、
mojiにコピーするにはどうしたら良いのでしょうか?

ToCharArray()を使おうと思ったのですが上手くいかずに困っています。

どなたかご鞭撻の程宜しくお願いします。

915:デフォルトの名無しさん
08/06/16 22:15:25
ここがC#のスレッドに見えたんだろうか。

916:デフォルトの名無しさん
08/06/16 23:37:02
>>915
>>1を見ればC#スレにしか見えないだろ。

>>914
ジャグ配列で良ければ、ToCharArrayが使える。
矩形のchar[,]でないといけないなら、自分でループ回す方法しか俺には思い浮かばない。
char[][] moji = new char[str.Length][]; //別にnew char[10][]でも
for (int i = 0; i < str.Length; i++)
{
  moji[i] = str[i].ToCharArray();
}


917:914
08/06/17 09:18:37
>>916さん

わざわざお答え頂きありがとうございます。

なるほど、出来なかった理由は宣言の時点での間違えだったのですね。

大変助かりました。


918:914
08/06/17 17:11:58
連投してすみません;

914の者ですが
配列mojiにstring型の文字列を格納することは出来たのですが、
もう一つmojiと同じ方の多次元配列を用意して、
それにmojiをコピーしたいのですが上手くいきません;

Array.Copyなどを使えば動作はするのですが、配列の中身が変わっておらず
どうすればいいのか分かりません。

度々すみませんが、宜しくお願いします。

919:デフォルトの名無しさん
08/06/17 22:45:18
>>917
いいえ、「間違え」ではありません、「間違い」です。

920:914と918
08/06/18 16:53:48
918のものですが自己解決しました。

お騒がせしてしまい、すみません;

>>919
おぉ、確かに間違えてる;
ご指摘どうも。


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5384日前に更新/239 KB
担当:undef