• 締切済み

スモールコンパイラの制作という参考書について

 現在大学で, 「スモールコンパイラの制作で学ぶプログラムのしくみ」という参考書を勉強しているのですが, 出題された課題の中でどうしても解らない問題があるのです.上記の参考書を学習した方だけではなく, 幅広い方からご教授を頂きたいと思っておりますので何卒宜しくお願いいたします.  課題の内容は, (1) 関数の引数として 1 次元配列を渡せるように機能拡張せよ.   渡し方は C言語の方法に習え.すなわち, 配列の要素全体のコピーを渡すのではなく, 配列の先頭の番地を渡せ.以下のプログラム ( 配列の要素の和と配列のコピー ) で動作を確認せよ.    I sum(aI a[], I n){ vI s = 0, i; for(i = 0; i < n; i = i+1;){ s = s + a[i]; } return s; } aI a[16]; for(i = 0; i < 16; i = i+1;){ a[i] = i * i; } println sum(a, 16); }$  { I copy(aI a[], aI b[], I n){ vI i; for(i = 0; i < n; i = i+1;){ b[i] = a[i]; } return 0; } vI i; aI a[16], b[16]; for(i = 0; i < 16; i = i+1;){ a[i] = i; } dummy = copy(a, b, 16); for(i = 0; i < 16; i = i+1;){ println b[i]; } }$  用いるコンパイラは Java 言語で記述されており, ソースファイルは, http://book.gihyo.co.jp/s-com/ から取得できるようになっております.宜しくお願いいたします.

  • Java
  • 回答数1
  • ありがとう数0

みんなの回答

  • hisappy
  • ベストアンサー率46% (184/392)
回答No.1

「どうしても解らない」というのが、どういう「解らない」なのかが 回答予定者にも解るように質問文を記述されませんと、 回答のしようがありません。 ひとまず、 ・中括弧の上下の数が合わない。 ・データ型の宣言がない。もしくは不足している。 ・記述されているリンク先が見れない。(私だけ?) ・そもそもmainが無い・・・? ・HTML形式なので、インデントは仕方ないにしても  コーディグスタイルが・・・は流派があるので取り消し。。。 などなど。 この手の問題の場合、「課題が何言っているのか解らない」 というのまであります。 あなたが解らないのは何ですか?

No-001
質問者

補足

 hisappy さん解答ありがとうございます.hisappy さんは当参考書を読んだことがありますか?当参考書は, コンパイラと言語を新たに作成する ( と言ってもすでに作成されていて, http://book.gihyo.co.jp/s-com/ からどなたでもダウンロード出来るようになっているのですが….) と言った内容です.  そして用意されているコンパイラは, 関数の引数として 1 次元配列を渡すことが出来ないのでそれを実現可能にして上プログラムが正常に動作するようにコンパイラを拡張するのが目的なのです….しかし私は, プログラムの記述方法つまり追加方法が解らない状態なので解りましたらアドバイスをお願いいたします.

関連するQ&A

  • Javaコンパイルエラー

    Javaにて以下のようなプログラムを作成していますが、 「演算子 ^ は引数の型 double, int で未定義です。」とエラーになりました。 色々な方のご協力もあり、ここまで作れましたが、 これより先が行き詰っています。 教えていただけないでしょうか。 ---------------------------------------------- // 分散を返すメソッド public class Kadai16 { public static void main(String args[]){ //double型の配列の生成 double[]a=new double[10]; argument(a); //配列aの要素[0]から[9]の内容を表示 System.out.println(a[0]); System.out.println(a[1]); System.out.println(a[2]); System.out.println(a[3]); System.out.println(a[4]); System.out.println(a[5]); System.out.println(a[6]); System.out.println(a[7]); System.out.println(a[8]); System.out.println(a[9]); //double total=sum(a)を実行する double total =sum(a); System.out.println("合計は"+total+"です。"); //使って平均を出す double heikin; mean(total); heikin = mean(total); System.out.println("平均は"+heikin+"です。"); //分散を返す double bunsan; bunsan = total-heikin^2/10; System.out.println("分散は"+bunsan+"です。"); } /** * ランダムな数値を入れるメソッド * @param a ランダムな数値を入れる配列 */ private static void argument(double[]a) { //引数の配列aの[0]から[9]までランダムな数値を設定する。 for(int i=0; i<a.length;i++) { a[i]=Math.floor(Math.random()*10); } } //配列を受け取って要素の合計を出すメソッド public static double sum(double[] x) { double t=0; for(int i=0; i<x.length;i++) { t= x[i]+t; } return t; } //配列を受け取って平均を出すメソッド public static double mean(double b) { return b/10; } //分散を返すメソッド public static double bunsan(double c) { double t=0; double bnsan =0; for(int i=0; i<c.length; i++) { t =c[i]+t } } }

  • 配列を後ろから数えるには?

    例えば配列を前からならこのようになるはずです class TestIntArray { public static void main(String args[]) { int vi[] = {0, 1, 2, 3, 4, 5, 6}; for (int i = 0; i < vi.length; i++) System.out.println("vi[" + i + "] = " + vi[i]); } ですが逆に配列を後ろからならどうしたらいいのでしょうか? 今回の場合は6543210を出力させるのが目的です 今までずっと配列って言ったら for (int i = 0; i < vi.length; i++)がほぼ定形分ように頭にはいっていますので考え方がわからないです。 ヒントやアドレスをお願いします。

    • ベストアンサー
    • Java
  • 教えてください!!

    perlに関するサイトで 合計を求めるプログラムは @dat(1,2,3,4,5,6,7,8,9,10); $sum = 0; for($i = 0;$i <10; $i++){ $sum+ = $dat[$i]; print "sum = $sum "; } というのを見つけました。 いくつか質問があります。 (1)これは1234・・・と続いているから$i++で1の次は2とあらわされているのか、それとも@datの配列の1番目の次が2番目というのを表しているのか。 もしたまたま続いているからならば、列の1番目の次の処理が2番目というふうにするにはどうすればよいか。 (2)$dat[$i]の[]は何を表しているのか (3)$sum+ = $dat[$i]は合計を求めるものだと思うのですが、$sumが合計のことですよね。$dat[$i]についてなのですが、for文なので順番に$iから足しているということなのでしょうか??いまいちピンと来ません。それに$sum+の+は何を意味しているのでしょうか??? 分かりやすく教えていただけると嬉しいです。

  • phpのfor文の中で配列を作りたいです。

    $a = array(); $a[0]="あ"; $a[1]=""; $a[2]="い"; $a[3]=""; $a[4]=""; $a[5]="う"; のような配列がありfor文の中で文字列が一文字以上だったら配列$bに入れるということをしたいのですが、 $b=array(); for($i=0; $i<count($a); $i++){ $c = mb_strlen($a[$i]); if($c>=1){ $b = $a[$i]; } } var_dump($b); とすると$bには最後の”う”しか入りません。 $bを $b[0]="あ"; $b[1]="い"; $b[2]="う"; とするようにするにはどうしたらいいですか?

    • ベストアンサー
    • PHP
  • C言語の配列について

    配列を20 定義し値を入力して合計値を出したいのですがどうすればよいのでしょうか 下のソースでエラーはおこりませんでした 何がちがうのでしょうか #include <stdio.h> int main() { int a[20]={}; int i, sum; printf("整数を入力してください:"); scanf("%d",&a); printf("\n"); for (i = 0; i < 10; i++) { sum += a[i]; } printf("sum= %d\n", sum); return 0; }

  • コンパイラーの不具合?

    AIX(5.3)の環境でプログラムソースをコンパイルし実行したところ、 コンパイラーのバージョンの違いによる、挙動の違いを発見しました。 これは、コンパイラーの不具合なのでしょうか? コンパイラーのバージョンは、vacpp 6.0とvacpp 9.0です。 サンプルソースコードと実行結果は以下の通りです <sample.c> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> int aaa( char * a, char *b,char *c,... ) { va_list arglist; char *temp; printf("1.a=%x\n",&a); printf("2.b=%x\n",&b); printf("----------------------\n"); va_start( arglist, a ); printf( "3.%x=%x=%s\n",arglist,*(char **)arglist,*(char **)arglist); for( ; (temp = va_arg( arglist, char * )) != 0; ){ printf( "%x=%x=%s\n", arglist, temp, temp ); } va_end( arglist ); printf("----------------------\n"); va_start( arglist, b ); printf( "3.%x=%x=%s\n",arglist,*(char **)arglist,*(char **)arglist); for( ; (temp = va_arg( arglist, char * )) != 0; ){ printf( "%x=%x=%s\n", arglist, temp, temp ); } va_end( arglist ); printf("----------------------\n"); va_start( arglist, c ); printf( "3.%x=%x=%s\n",arglist,*(char **)arglist,*(char **)arglist); for( ; (temp = va_arg( arglist, char * )) != 0; ){ printf( "%x=%x=%s\n", arglist, temp, temp ); } va_end( arglist ); return 0; } int main(void) { aaa("1","A","B","C","D",0); return 0; } <コンパイルコマンド> xlC -o sample sample.cpp <バージョン6.00実行結果=正しい結果> 1.a=2ff22568 2.b=2ff2256c ---------------------- 3.2ff2256c=10002460=A 2ff22570=10002460=A 2ff22574=10002462=B 2ff22578=10002464=C 2ff2257c=10002466=D ---------------------- 3.2ff22570=10002462=B 2ff22574=10002462=B 2ff22578=10002464=C 2ff2257c=10002466=D ---------------------- 3.2ff22574=10002464=C 2ff22578=10002464=C 2ff2257c=10002466=D <バージョン9.00実行結果=正しい結果> 1.a=2ff22a48 2.b=2ff22a4c ---------------------- 3.2ff22a4c=10000a30=A ←おかしい 2ff22a54=10000a32=B 2ff22a58=10000a34=C 2ff22a5c=10000a36=D ---------------------- 3.2ff22a50=10000a32=B ←ただしい 2ff22a54=10000a32=B 2ff22a58=10000a34=C 2ff22a5c=10000a36=D ---------------------- 3.2ff22a54=10000a34=C ←おかしい 2ff22a5c=10000a36=D

  • C言語課題!C言語初心者です。お願いします。

    課題内容 要素数10の(0~9の順)配列Aの値を2倍して配列Bに格納して  その後配列Aの値を配列Bに、配列Bの逆順を配列Aに格納し  入れ替える前と入れ替えた後の配列A,Bの値を表示するプログラム 書いてみたプログラム #include <stdio.h> int main(void) { int i; int va[10] = {0,1,2,3,4,5,6,7,8,9}; /* 初期化 */ int vb[10]; puts("入れ替え前"); puts("-----------"); for(i=0 , i<10 , i++){ printf("va[%d] = %d\n" , i , va[i]); /* 入れ替え前の配列A */ } for(i=0 , i<10 , i++){ vb[10] = 2*va[10]; } for(i=0 , i<10 , i++){ printf("vb[%d] = %d\n" , i ,vb[i]); /* 入れ替え前の配列B */ } puts("入れ替え後"); puts("-----------"); for(i=0 , i<10 , i++){ vb[10] = va[10]; } for(i=0 , i<10 , i++){ printf("vb[%d] = %d\n" , i ,vb[i]); /* 入れ替え後の配列B */ } for(i = 0 , i < 5 , i++){ /* 配列Bの逆順を配列Aに格納 */ int temp = va[i]; va[i] = vb[4-i]; vb[4-i] = temp; } for(i=0 , i<10 , i++){ printf("va[%d] = %d\n" , i ,va[i]); /* 入れ替え後の配列A */ } return(0); } コンパイルできません。 教えてください。お願いします。

  • 配列について質問です。

    学校で以下のような内容のプログラムを組む課題が出されました。 「数を格納した配列の各要素の和を出力せよ。」 一応組むことはできたのですが、引っかかることがあります。 私が組んだのは下のような要素の個数は引数で定義、 各要素は標準入力で読み込むというものです。 import java.io.*; class main{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); int n =Integer.parseInt(args[0]); int[] a = new int[n]; for(int i=0;i<n;i++){ a[i] = Integer.parseInt(br.readLine()); } int b=0; for(int i=0;i<n;i++){ b+=a[i]; } System.out.println("sum = "+b); } } ここで質問なのですが、仮に引数で5と入力すると 配列a[]はa[0]~a[5]の計6個できると思うんです。 でも、実行してみると要素数はa[4]の5個までしかできず、 最後のa[5]はどこに行ったのだろう?というものです。

    • ベストアンサー
    • Java
  • 数の大きさ

    C++初心者です。以下の様なプログラムで、合計を求めたいのですが、あまり桁数の大きい数だと、正確な値がでません。(20桁とか・・・)これは一体どういうことが考えられますか?//配列の全要素の合計を求める #include<iostream.h> int main(void) { int i; int a[5]={0}.; cout<<"5個の整数値を入力しましょう。 \n"; for(i=0; i<5; i++) { cout<<"No."<<i+1<<": "; cin>>a[i]; } int sum=0; for(i=0; i<5; i++) sum=sum+a[i]; cout<<"合計は"<<sum<<"です。\n"; return(0); }

  • windowsのコンパイラーで正しく実行されたのに、gccのコンパイラーでエラーがでた

    windowsのコンパイラーで正しく実行されたのに、gccのコンパイラーでエラーがでたソースコードです。ファィル名test.c です。Linux(Red Hat9) gccです。windowsのコンパイラーはCPad for Borland C++Compilerです。 #include <stdio.h> void main() //intからvoidに変更した { int i, j; for (i=1; i<=9; i++){ printf("%2d ",i); //%2dで、iが2桁に表示 } printf("\n"); printf("***************************\n"); //この罫線もどきの書き方はダサいので工夫してください for (i = 1; i<=9; i++){ for (j = 1; j<= 9; j++) { printf("%2d ", i*j); if (j == 9) printf("\n"); //1行表示後改行 } } return; //voidにしたので0を取った! } これがLinux(RedHat9)gccでは以下のエラーが出ます。 (test.c: 関数 `main' 内: test.c:4: 警告: `main' の戻り値の型が `int' ではありません)  なぜ、同じソースコードでエラーが起こるのですか?  Linux gccでは、この場合`int' 以外の何が必要なのでしょうか? 以上よろしくお願いします。

専門家に質問してみよう