teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

回答を修正

2020/01/11 08:25

投稿

rubato6809
rubato6809

スコア1382

answer CHANGED
@@ -17,7 +17,7 @@
17
17
  質問者の不明点はひとつ見当がついた気がします。たとえば
18
18
  i = *((int*) ((char*)&fmt + argc * sizeof(void*)) );
19
19
 
20
- で整数値にアクセスしようとしていますが、誤りがあります。しかも一箇所に誤りが複数あると何をどう調整したらよいか迷うものです。
20
+ で整数値にアクセスしようとしています。もしかするとデータのあるアドレスは正しくもとめられるかもしれませんが、計算式は不適切です。~~が、誤りがあります。しかも一箇所に誤りが複数あると何をどう調整したらよいか迷うものです。~~
21
21
  - ポインタを使ったアドレス計算がおかしい
22
22
  - キャストのしかたもおかしいかも
23
23
 
@@ -34,10 +34,10 @@
34
34
 
35
35
  第一の誤りは、アドレス計算がおかしいことでした。argc を引数配列のインデックスとしてるんだから、something[argc] のような格好で、まさしく配列のようにアクセスすると間違いが少ないような気がします。
36
36
 
37
- 次にキャストの使い方ですが、%d で int の値を読みだすなら、最初から
37
+ キャストの使い方ですが、%d で int の引数値を読みだすなら、最初から (int*) でキャストし、argc をインデックスとして
38
- ``` ((int*) &fmt) ```
38
+ ``` i = ((int*) &fmt) [argc]; ```
39
39
 
40
- として、ここを基準にして、添字アクセスを付け加えれば良いのでは。
40
+ としたらどうでしょうか。~~ここを基準にして、添字アクセスを付け加えれば良いのでは。~~
41
41
 
42
42
  もうひとつは、引数が文字列の先頭アドレスである %s に対応する引数の場合ですが、この引数は「"mine___"(の先頭アドレス)」のように、それ自体がポインタ変数です。引数配列の一つの要素がポインタ変数である、ということは、**その配列をポイントするポインタ変数は、ポインタのポインタと見做すべき**です(少なくとも文字列の先頭アドレスを読みだす時は)。
43
43
 
@@ -45,4 +45,6 @@
45
45
 
46
46
  > SPIM上でその動作を確認
47
47
 
48
- [SPIM](https://ja.wikipedia.org/wiki/SPIM) はMIPSシミュレータなのね。そして、print_int()、print_string() 等がシステムコールとして用意されている、と。質問者が書いた _print_int、_print_string が動作するかどうか、単体テストは済んでいるんですかね?
48
+ [SPIM](https://ja.wikipedia.org/wiki/SPIM) はMIPSシミュレータなのね。そして、print_int()、print_string() 等がシステムコールとして用意されている、と。質問者が書いた _print_int、_print_string が動作するかどうか、単体テストは済んでいるんですかね?
49
+
50
+ 上記のアドレス計算が(計算式が不適切であっても)計算結果が合っているなら、_print_int などが正しく動作していないだけかもしれません。