colder の回答履歴

全87件中61~80件表示
  • 引数の受け渡し

    以下のコード(C言語)を見てください。 int i; int a[3]; void swap(int x, int y); void main() { i= 1; a[0]= 2; a[1]= 1; a[2]=0; swap (i, a[i]); printf("%d %d %d %d\n", i,a[0],a[1],a[2]); swap (a[i], a[i]); printf("%d %d %d \n",a[0],a[1],a[2]); } void swap(int x, int y) { x=2; y=0; x = x+y; y = x-y; x = x-y; } 今取り組んでいる問題が 上のC言語風のコードを実行したとき、 以下の引数の渡し方をすると、このプログラムはどんな値を 返しますか(printfでどんな値を表示するか) a. pass-by-value (値渡し) b. pass-by-result (引数を右から左への順で渡す) c. pass-by-reference (参照渡し) d. pass-by-value-result e. pass-by-name (名前渡し) という問題です。 eのpass-by-nameというのがいまいちよくわからないので 上のコードを例に解説、アドバイスをいただきたいと思い、質問しました。どなたかアドバイスをいただけないでしょうか。 あと、他の4問も自分の答えが合っているか確かめたいので、もしよろしければみていただけないでしょうか。お願いします。 a. 1 2 1 0 / 2 1 0 b. 2 2 0 0 / 2 0 2 c. 0 2 2 0 / 0 2 0 d. 0 2 2 0 / 2 2 0

  • C++ template コンパイルできないパターン

    度々お世話になります。 以下のソースがコンパイルできません。 ご存知の方がいらっしゃれば教えて下さい。 #include <iostream> #include <exception> template<typename T, T C> inline T check(T x) { if (x == C) { throw(std::exception()); } return x; } int main() { using namespace std; int x; try { char * p = "abc"; check<char*, 0>(p); // コレがコンパイルできない int i = 2; check<int, 4>(i); // コレはコンパイルできる } catch (...) { cerr << "err" << endl; } return 0; } 手元の環境だと % g++ foo.cc foo.cc: In function 'int main()': foo.cc:18: error: no matching function for call to 'check(char*&)' となります。 関係するのか分からないのですが char* をテンプレートの引数にしているのに コンパイラのエラーメッセージは char*& となっているのがよく分かりません。 目的としては、エラーチェックをして エラーをであれば、例外を投げるというものです。

  • 引数の受け渡し

    以下のコード(C言語)を見てください。 int i; int a[3]; void swap(int x, int y); void main() { i= 1; a[0]= 2; a[1]= 1; a[2]=0; swap (i, a[i]); printf("%d %d %d %d\n", i,a[0],a[1],a[2]); swap (a[i], a[i]); printf("%d %d %d \n",a[0],a[1],a[2]); } void swap(int x, int y) { x=2; y=0; x = x+y; y = x-y; x = x-y; } 今取り組んでいる問題が 上のC言語風のコードを実行したとき、 以下の引数の渡し方をすると、このプログラムはどんな値を 返しますか(printfでどんな値を表示するか) a. pass-by-value (値渡し) b. pass-by-result (引数を右から左への順で渡す) c. pass-by-reference (参照渡し) d. pass-by-value-result e. pass-by-name (名前渡し) という問題です。 eのpass-by-nameというのがいまいちよくわからないので 上のコードを例に解説、アドバイスをいただきたいと思い、質問しました。どなたかアドバイスをいただけないでしょうか。 あと、他の4問も自分の答えが合っているか確かめたいので、もしよろしければみていただけないでしょうか。お願いします。 a. 1 2 1 0 / 2 1 0 b. 2 2 0 0 / 2 0 2 c. 0 2 2 0 / 0 2 0 d. 0 2 2 0 / 2 2 0

  • 三角形の判別

    正三角形、二等辺三角形、直角三角形、直角二等辺三角形、不等辺三角形、三角形ではないを判別するプログラムを以下のように書きました。 #include<stdio.h> int main(void) { int a,b,c; printf("三角形の3辺の長さを入力して下さい:"); scanf("%d %d %d",&a,&b,&c); if(a+b<c||a+c<b||b+c<a) { printf("これは三角形ではありません。"); } else{ if((a==b==c)) printf("これは正三角形です。"); else if(((c*c==a*a+b*b)||(a*a==b*b+c*c)||(b*b==a*a+c*c))&&(a==b||a==c||b==c)) printf("これは直角二等辺三角形です。"); else if((c*c==a*a+b*b)||(a*a==b*b+c*c)||(b*b==a*a+c*c)) printf("これは直角三角形です。"); else if((a==b||a==c||b==c)) printf("これは二等辺三角形です。"); else printf("これは不等辺三角形です。"); } return 0; } しかし、これではなぜか入力1,1,1だと正三角形とでるのですが、2,2,2以降は二等辺三角形と出てしまいます。原因が分からないので教えてくださいお願いします。あとこうしたらいいところとか間違いがあればお願いします。

  • newされたポインタとdeleteされるポインタが…

    いま私は、std::mapを使って、newされたポインタ(メモリの先頭アドレス)をkeyとして記録し、newされた場所のファイルや行番号、サイズ、何回目のnewか、などなどをvalueとして構造体にまとめて保存してデバッグなどに役立て、deleteされると同時にこの情報を破棄し、最後にすべて破棄されているかどうかを調べる(メモリリークのチェック)という機構を作っています。 ですが、keyとなっているメモリのアドレスは、多重継承や仮想継承とキャストの組み合わせ次第では、newされた時点のものとdeleteされる時点のもので異なっている場合があるため、情報を破棄することができず、行き詰ってしまいました。(無論、delete以外にも情報を引き出す際に影響が…) deleteするポインタから、そのポインタがnewで作成されたときのメモリの先頭アドレスを求める方法はないでしょうか? 以下に問題の部分だけ抽出したようなコードを挙げます。 ---------------- #include <stdio.h> class CLS1{ public: int x,y,z; virtual ~CLS1(){} }; class CLS2{ public: int x,y; virtual ~CLS2(){} }; class CLS3:public CLS1, public CLS2{ public: int x; virtual ~CLS3(){} }; void print(void* p){printf("%p\n",p);} template<typename T> T* create(T* p){ // ここで、たとえば 00854880 と記録されたとして… print(p); return p; } template<typename T> void releace(T* p){ // ここでも 00854880 と記録されてほしいが、 // 00854890 と記録されてしまう。 // この場所で 00854880 と同じインスタンスであることを確かめる方法はないでしょうか? print(p); delete p; } int main(){ CLS2* x = create(new CLS3); // 多重継承しているため、 00854890 と記録される。 print(x); release(x); return 0; }

  • newされたポインタとdeleteされるポインタが…

    いま私は、std::mapを使って、newされたポインタ(メモリの先頭アドレス)をkeyとして記録し、newされた場所のファイルや行番号、サイズ、何回目のnewか、などなどをvalueとして構造体にまとめて保存してデバッグなどに役立て、deleteされると同時にこの情報を破棄し、最後にすべて破棄されているかどうかを調べる(メモリリークのチェック)という機構を作っています。 ですが、keyとなっているメモリのアドレスは、多重継承や仮想継承とキャストの組み合わせ次第では、newされた時点のものとdeleteされる時点のもので異なっている場合があるため、情報を破棄することができず、行き詰ってしまいました。(無論、delete以外にも情報を引き出す際に影響が…) deleteするポインタから、そのポインタがnewで作成されたときのメモリの先頭アドレスを求める方法はないでしょうか? 以下に問題の部分だけ抽出したようなコードを挙げます。 ---------------- #include <stdio.h> class CLS1{ public: int x,y,z; virtual ~CLS1(){} }; class CLS2{ public: int x,y; virtual ~CLS2(){} }; class CLS3:public CLS1, public CLS2{ public: int x; virtual ~CLS3(){} }; void print(void* p){printf("%p\n",p);} template<typename T> T* create(T* p){ // ここで、たとえば 00854880 と記録されたとして… print(p); return p; } template<typename T> void releace(T* p){ // ここでも 00854880 と記録されてほしいが、 // 00854890 と記録されてしまう。 // この場所で 00854880 と同じインスタンスであることを確かめる方法はないでしょうか? print(p); delete p; } int main(){ CLS2* x = create(new CLS3); // 多重継承しているため、 00854890 と記録される。 print(x); release(x); return 0; }

  • Mapleで連立方程式の解が正常に出力されません

    こんにちは。 Windows2000でMaple7の環境です。 A(-1,-2),B(3,4),C(5,6)の△ABCの内心の座標を求めています。 各辺の直線の方程式を求めて点と直線間の距離の公式を使って内心の座標を求めようと試みたのですが何故か最後の連立方程式の解が4組も出力されてしまいます。これは何が原因なのでしょうか? x1=-1;y1=-2;x2=3;y2=4;x3=5;y3=6; subs({x1=1,y1=1,x2=3,y2=2,x3=2,y3=3},{y-y1=(y1-y2)/(x1-x2)*(x-x1)}); {y - 1 = 1/2 x - 1/2} subs({x1=1,y1=1,x2=3,y2=2,x3=2,y3=3},{y-y1=(y1-y3)/(x1-x3)*(x-x1)}); {y - 1 = 2 x - 2} subs({x1=1,y1=1,x2=3,y2=2,x3=2,y3=3},{y-y3=(y3-y2)/(x3-x2)*(x-x3)}); {y - 3 = -x + 2} d1:=abs((1/2*x-y-1/2))/((1/2)^2+(-1)^2)^(1/2); d1 := 1/5 | 1/2 x - y - 1/2 | sqrt(5) sqrt(4) d2:=abs((2*x-y-1))/((2)^2+(-1)^2)^(1/2); d2 := 1/5 | 2 x - y - 1 | sqrt(5) d3:=abs((x+y-1))/((1)^2+(1)^2)^(1/2); d3 := 1/2 | x + y - 1 | sqrt(2) solve({d1=d2,d2=d3,d3=d1},{x,y}); {y = 1/18*sqrt(5)*sqrt(2)+2/9, x = 8/9+1/18*sqrt(5)*sqrt(2)}, {y = -1/6*sqrt(5)*sqrt(2)-1/3, x = 1/6*sqrt(5)*sqrt(2)+1/3}, {y = 2/9-1/18*sqrt(5)*sqrt(2), x = 8/9-1/18*sqrt(5)*sqrt(2)}, {x = 1/3-1/6*sqrt(5)*sqrt(2), y = -1/3+1/6*sqrt(5)*sqrt(2)}

  • Mapleで連立方程式の解が正常に出力されません

    こんにちは。 Windows2000でMaple7の環境です。 A(-1,-2),B(3,4),C(5,6)の△ABCの内心の座標を求めています。 各辺の直線の方程式を求めて点と直線間の距離の公式を使って内心の座標を求めようと試みたのですが何故か最後の連立方程式の解が4組も出力されてしまいます。これは何が原因なのでしょうか? x1=-1;y1=-2;x2=3;y2=4;x3=5;y3=6; subs({x1=1,y1=1,x2=3,y2=2,x3=2,y3=3},{y-y1=(y1-y2)/(x1-x2)*(x-x1)}); {y - 1 = 1/2 x - 1/2} subs({x1=1,y1=1,x2=3,y2=2,x3=2,y3=3},{y-y1=(y1-y3)/(x1-x3)*(x-x1)}); {y - 1 = 2 x - 2} subs({x1=1,y1=1,x2=3,y2=2,x3=2,y3=3},{y-y3=(y3-y2)/(x3-x2)*(x-x3)}); {y - 3 = -x + 2} d1:=abs((1/2*x-y-1/2))/((1/2)^2+(-1)^2)^(1/2); d1 := 1/5 | 1/2 x - y - 1/2 | sqrt(5) sqrt(4) d2:=abs((2*x-y-1))/((2)^2+(-1)^2)^(1/2); d2 := 1/5 | 2 x - y - 1 | sqrt(5) d3:=abs((x+y-1))/((1)^2+(1)^2)^(1/2); d3 := 1/2 | x + y - 1 | sqrt(2) solve({d1=d2,d2=d3,d3=d1},{x,y}); {y = 1/18*sqrt(5)*sqrt(2)+2/9, x = 8/9+1/18*sqrt(5)*sqrt(2)}, {y = -1/6*sqrt(5)*sqrt(2)-1/3, x = 1/6*sqrt(5)*sqrt(2)+1/3}, {y = 2/9-1/18*sqrt(5)*sqrt(2), x = 8/9-1/18*sqrt(5)*sqrt(2)}, {x = 1/3-1/6*sqrt(5)*sqrt(2), y = -1/3+1/6*sqrt(5)*sqrt(2)}

  • 入力した文字列から母音だけを出力するプログラム

    文字列を入力し母音だけを出力するプログラムを作りました。 以下だと小文字の母音しか出力できないので大文字にも対応させたいのですが、switch文のcaseを増やすと冗長になってしまう気がします。 switch文以外の方法でもっと簡潔に書く方法はありますか?ご教授お願い致します。 /* 入力した文字列のうち、母音「a,i,u,e,o」だけ出力する */ #include <stdio.h> #include <string.h> #define MAXSTR 256 int main(void) { char str[MAXSTR]; int i; gets(str); for (i = 0; i < strlen(str); i++) switch (str[i]) { case 'a': putchar(str[i]); break; case 'i': putchar(str[i]); break; case 'u': putchar(str[i]); break; case 'e': putchar(str[i]); break; case 'o': putchar(str[i]); break; } putchar('\n'); return 0; } 実行結果: What time is it now? aieiio

  • ftn77のコンパイルエラー

    ftn77でfortranのプログラムをコンパイルしたところ、 文字情報のみでテストしたらコンパイルに成功したのですが、 数値計算の入ったものをコンパイルしたら、 実行時に以下のようなエラーが起こりました。 ーーーーーーーーーーーーーーーーーーーーーーーー RUN-TIME ERROR 00401000 main [+00c5] [recur= 1] メッセージ WARNING the following symbols are missing: IMAG C:\fortran\(ファイル名).obj (C:\FORTRAN\(ファイル名).FOR) ーーーーーーーーーーーーーーーーーーーーーーーーー 元々別のパソコンでコンパイルが成功したものを、 まったく書き換えずにftn77でコンパイルしてみたのにもかかわず、 UNTIME EROORと表示されました。 原因が何か分からないので、どなたか教えてください。 ちなみに10行程度の単純なプログラムなら、数値計算をしてもエラーは怒りませんでした。

  • 対称行列の固有値

    次の対称行列 1 -3 2 -3 2 1 2 1 3 の固有値xを求めたいのですが、 固有方程式が x^3-6x^2-3x+42=0 となり因数分解ができません。 対称行列の固有値は必ず実数となる らしいので私の計算間違いかと思いますが、 何度計算しても同じ固有方程式になってしまいます(T T) どなた様か御指導願います。

    • ベストアンサー
    • noname#18851
    • 数学・算数
    • 回答数5
  • COBOLを自宅PCでプログラムを組みたい

    自宅でCOBOLを学習しているのですが、実際にプログラムを組んで見たくなりました。フリーソフト等でCOBOLのプログラミングソフトがありますでしょうか。ご存知のかた教えてください。

  • 直角三角形

    直角三角形の直角をはさむ2辺をa,b(a≦b)とし,斜辺をcとします。a≦100,b≦100で,a,b,cがすべて整数となる組み合わせをすべて出力するプログラムを作りたいんです。 直角三角形ならば1(真),でなければ0(偽)と出るようにすればいいのでしょうか?こうなのかなとかいろいろ考えてると,どんどん頭がこんがらがって(>_<)

    • ベストアンサー
    • noname#157126
    • C・C++・C#
    • 回答数4
  • gccを使ってのリンク時のライブラリの指定法

    gccを使って、c++の勉強を始めようとしています。 hello.cpp(どこにでもある一行のプログラム)のコンパイルはできましたが、リンクができません。 私の機械では iostream は /usr/include/c++/3.3.2 にあります。( iostream.hは /usr/include/c++/3.3.2/backward にあります。) また、makefileにこの情報を書くには、どのように書けばよいのでしょうか。

    • 締切済み
    • noname#22708
    • C・C++・C#
    • 回答数3
  • 【FORTRAN77】DO WHILE文 これで正しいの?

    まったくさわったことのないFORTRAN77の解読をさせられています。 次のような場合はどうなるのでしょうか? コンパイル・実行できる環境がないので、教えて下さい。 データ数5の実数型配列をA(5)とする。 マイナスのデータは必要ないので、データ数を、今の5つから、マイナスデータを引いた数字に変更したい。 (ここでは、データ数のみを変更するものとします) N = 5 A(1) = -3. A(2) = -5. A(3) = -1. A(4) = 5. A(5) = 3. の時、次の使い方は正しく動くの? DO WHILE (A(N) .LE. 0.) N = N - 1 END DO 最初のWHILEループ N = 1から見ていって、A(1)がマイナスだから、 Nが4になる。 次のWHILEループ ・N = 4になったから、A(4)を見る? ・それともちゃんと順番にA(2)を見る? WHILEループが終わったら、ちゃんとN = 2になっている?

  • Fortranでのファイル名操作について

     Fortranを使っているものです。 プログラムで、ファイル名は文字列形式でしか付けれないと思いますが、そのファイル名をメインプログラムから何か値をもらって、それをサブルーチンでファイル名につけるということはできるのでしょうか?  例えば、iをメインプログラムで10~100まで10ずつ動かすとします。そのiの値をわかりやすくするためにファイル名に付けたいと思っていて、do文でサブルーチン中でまわしてファイル名に入れる・・・なんてことは可能でしょうか?

  • SolarisとLinuxのグローバル変数の扱いについて

    Solaris用のソースをLinuxで使えるように変更したいのですが、 グローバル変数について以下のようなことが発生していて困っています。 なにか、コンパイルオプションなどで対応はできないものでしょうか? Solaris (CC)では 特にextern宣言しなくても同じシンボルの外部変数はコモンセグメントに1つだけ作成しコンパイル自体は正常である。 しかし、Linux (g++)では externを宣言しないと同じシンボルを再定義したことになりエラーとなる。 これにより、グローバル変数を多用しているプログラムはLinuxでうまくコンパイルができない。 しかし、単純にextern宣言での対応は難しい。 extern宣言は外部で定義してあるグローバル変数を参照する というものだがLinux では 1つの定義を意外は全てexternしなければ、2重定義エラーになってしまう。 つまり、実体が1つであとはそれを参照しているという形でなければいけない。 ところが、その実体をどこにするか特定することができない。 例えば、gというグローバル変数を仮定する。 A.c,B.c,C.cはその3つのソースよりAA.aという静的ライブラリを構成する。 gはA.cで定義してありB.c,C.cはそれを参照する。 ところが C.cは個別にC.oというオブジェクトで他からの呼び出しがあり 別LMにリンクされる。 その時C.c内のgは実体を失うことになり未定義となる。 つまり、どれが実体になるかは何にリンクするかで決まるため 実態を特定できない。 また、共通のヘッダにグローバル変数が定義されている場合も、重複するというエラーを起こすため、 共通ヘッダからグローバル変数を分離し、何れかのソースにグローバル変数の実態を定義させる必要がある。 共通ヘッダを使っている他のソースはそのグローバル変数の実態を参照するようにexternの宣言をする。

  • g++コンパイルしながら使用されたヘッダー・ライブラリのフルパスを表示させたい

    宜しくお願い足します。 : posix gcc 3.2.2 20030222 (Red Hat Linux 3.2.2-5) g++: no input files の環境です。 $ g++ -o hoge hoge.cc としてコンパイルしながらにコンパイラがどのヘッダー、ライブラリを使用したかフルパスで表示させるにはどのようなオプションを指定すればいいのでしょうか?

  • inline

    プロセッサを調べるプログラムをコンパイルしたところ、 以下のような static inline void cpuid (int op, int *eax, int *ebx, int *ecx, int *edx) { asm("cpuid": "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx); : "a" (op) : "cc"); } ところで error C2054: 'inline' の後にはカッコが必要です。 error C2085: 'cpuid' : 仮引数リスト内にありません。 error C2143: 構文エラー : ';' が '{' の前に必要です。 というエラーが出てきました。 何か間違っているところがあれば教えてください。 お願いします。

  • 「髙(はしごたか)」を文字コード変換

    PHPにて、シフトJISで書かれたファイルを読みこみ、文字コードをEUCに変換して出力させる処理を書いています。 mb_convert_encoding($str, "EUC-JP", "SJIS")にて変換させています。 ただ、以下の文字が 髙(はしごたか)、 﨑(たつさき) うまく変換できずに 「?」という文字になってしまいます。 何か解決方法はないでしょうか??

    • ベストアンサー
    • sada_7
    • PHP
    • 回答数2