掲示板

From すみません at 2005年2月19日 13時53分

c++ 2章

4.ファイル

fotreamクラスはostreamの子クラスで、ifstreamクラスはistreamクラスの子クラスです。子クラスについては後述しますが、ここではofstreamはostreamつまりcoutと同じようにして使用することができ、ifstreamクラスはistreamつまりcinと同じように使うことができると覚えておいてください。

どこか変です、よく分かりません。修正おねがいします。


From 管理人 at 2005年2月19日 0時57分

re:アセンブラについて


>mov命令の時の練習問題で答えに[si+5]に代入する命令がありましたが、
>これって必要なのですか?
必要ありませんでしたね。(^^ゞ

>最後にmov al,[si+5]で24hを入れるとすると全て入る
これも間違えでしたね。
mov al,[si+4] が24hでコピーする分ですね。

いろいろ混乱させてしまい申し訳ございませんでした。


From c03105 at 2005年2月18日 14時5分

アセンブラについて

こんにちは。
説明でやっと分かりました。ところで、また戻りますが、mov命令の時の練習問題で答えに[si+5]に代入する命令がありましたが、これって必要なのですか?dbはバイト単位で確保するなら5バイト分なのは分かりますが、mov al,[si]とするとAがalに入り、[si+1]にBが入ると考えると[si+5]はなんかいらないような気がするのですがやはりこれは必要なのでしょうか?ちなみに、mov ax,[si]の場合は、axが2バイトだからA,Bが入り、さらにmov ax,[si+2]でC,Dを入れて、最後にmov al,[si+5]で24hを入れるとすると全て入るということになると判断しました。


From 管理人 at 2005年2月18日 1時53分

re:アセンブラの算術命令についての質問

>[si+4]まで演算するプログラムを書いてました。
>これでは間違いなのでしょうか?
残念ながら間違えになります。

DDはダブルワードすなわち、4バイト分の領域を意味します。
[si]で1バイト
[si+1]で2バイト
[si+2]で3バイト
[si+3]で4バイト分の計算が終わったことになります。
[si+4]まで計算すると5バイト目になり、ダブルワードの領域外まで
計算してしまいます。すなわち別の領域のメモリを破壊してしまうことに
なります。


From c03105 at 2005年2月17日 21時5分

アセンブラの算術命令についての質問

こんにちは。
また、質問したいのですが、アセンブラの算術命令の練習問題で一応答えを出したのですが、解答を見ると、以下のようになったいました。
START:
mov si,offset DATA1
mov di,offset DATA2
mov bx,offset ANS

mov al,[si]
add al,[di]
mov [bx],al

mov al,[si+1]
adc al,[di+1]
mov [bx+1],al

mov al,[si+2]
adc al,[di+2]
mov [bx+2],al

mov al,[si+3]
adc al,[di+3]
mov [bx+3],al

mov ax,4c00h
int 21h

DATA1 dd 0EFFFFFFFh
DATA2 dd 1
ANS dd ?
ここで思ったのですが、[si+3]のアドレスで演算処理がおわっていますが、僕の場合、[si+4]まで演算するプログラムを書いてました。これでは間違いなのでしょうか?


From 管理人 at 2005年2月16日 23時20分

re:アセンブラ言語について

こんばんは。

mov命令に関しては、2-1MOV命令を参照ください。
dbについては、data byteという意味で、バイト単位でメモリーを確保する
という意味になります。

DATA1 db 'ABCD',24h
というのは、バイト単位で、5バイト分のメモリを確保し、その中に'ABCD'と
24Hというデータを確保しなさいという意味です。

C言語風に書くと、
  char DATA[] = "ABCD$";
となります。


From c03105 at 2005年2月16日 19時29分

アセンブラ言語について

こんにちは。また質問させてください。
しばらく勉強して、mov命令の練習問題をやってみて、うまく回答できなかったので、一度回答例を見たら以下のような命令がありました。
     mov   al,[si+1]
mov [di+1],al

mov al,[si+2]
mov [di+2],al

mov al,[si+3]
mov [di+3],al

mov al,[si+4]
mov [di+4],al

mov al,[si+5]
mov [di+5],al

これを見た瞬間にこれはどういう意味だろうと思い、考えたのですが良く分かりません。すみませんがこれはどういう意味か教えていただけませんか?あと、最後のところにDATA   db   'ABCD'とありましたが、このdbとは何のことですか?これも出来れば教えていただけませんか?


From c03105 at 2005年2月16日 15時14分

アセンブラ言語について

できました。ありがとうございます。
この調子で少しずつですがアセンブラ言語を勉強していこうと思います。


From 管理人 at 2005年2月16日 0時1分

re:アセンブラ言語について

c03105さん、はじめまして。
最後の2行を以下のように書き換えてみてください。

CODE ENDS
END START

それでは今後ともよろしくお願いします!


From c03105 at 2005年2月15日 17時27分

アセンブラ言語について

こんにちは。初めて書き込みをさせていただきます。
まず、アセンブラをやってみようと思い、MASM32をインストールして、その後、16bitリンカーを手順どおりに導入して、test.asmのファイルを作って実行してみたら、次のようなエラーが帰ってきました。
test.asm(14) : error A2008: syntax error : ENDS
test.asm(15) : fatal error A1010: unmatched block nesting : CODE
です。これは何故発生するのでしょうか?なにせ、全くの初心者なので、ご指導お願いします。


From すみません at 2005年2月14日 18時43分

そうでしたか

コンパイルできました。続き頑張ります。


From 管理人 at 2005年2月14日 3時4分

re:ほんと、初歩の質問なんですけど

こんばんは。

> 初っ端のhello worldからエラーでendlが未定義のシンボルと出てきました。
おそらく2章の1項だと思いますが、すみません。こちらの間違えです。
#include <iostream> を
#include <iostream.h> に変えてみてください。

それでは、今後ともよろしくお願い致します。


From すみません at 2005年2月14日 1時6分

ほんと、初歩の質問なんですけど

いまc言語からc++に移ったところで
初っ端のhello worldからエラーでendlが未定義のシンボルと出てきました。
コンパイラはborland c++ 5.5 で、bcpadを通して操作しています。
どうすれば動くのでしょうか?なにかアドバイスがあればおねがいします。


From 管理人 at 2005年1月23日 17時2分

re:それでは・・・

またまた間違えのご指摘ありがとうございます。
早速訂正致しました。

> 大変参考にさせてもらってます。
> Java入門がんばってください。
そういって頂けるのが、何よりの励みになります。
今後ともよろしくお願い致します。


From 恒 at 2005年1月21日 9時37分

それでは・・・

些細なことですが
同じくデータ構造の単方向リストの例題で
getnext関数の中で宣言のないppreメンバ変数が使用されていました。

ここは情報量が多く
大変参考にさせてもらってます。
Java入門がんばってください。

ありがとうございました。では。


From 管理人 at 2005年1月21日 1時26分

恒さん、はじめまして。

こんばんは。

> freeで解放しなくてもいいんでしょうか?
その通りでございます。修正致しましたのでご確認ください。

また、間違えなどありましたらお教えください。

それでは、今後ともよろしくお願いいたします。


From 恒 at 2005年1月20日 21時31分

はじめまして。

質問です。
c言語入門のデータ構造の項目、ベクター構造の使用例のところなんですけど
freeで解放しなくてもいいんでしょうか?


From 大村 at 2005年1月20日 17時38分

なるほど わかりました。

fflushを使って、こちらでも 上手く行きました。
RAPTさん、管理人さん、本当にありがとうございました。


From 阿部。 at 2005年1月20日 9時58分

あの

C言語入門で14の構造体から、コンパイラが変わっているみたいなんですけど、
どのコンパイラを使ってあるのでしょうか?


From 管理人 at 2005年1月20日 1時41分

おー、知りませんでした。

そのような機能があるとは知りませんでした(^^ゞ
RAPTさんと同じ意見だと思います。ですので一度フラッシュすれば直ります。

for( j=0;j<2;j++){
scanf("%s%n" ,str ,&i);

printf("%s\n", str);
printf("%d\n",i);

fflush(stdin);
}

のように、fflushを入れてみてください。私の環境ではこれで
うまくいきました。


From RAPT at 2005年1月20日 1時22分

%nについて

なんとなく、改行分で1文字分カウントされているような気がします。
試しに、改行を何回か入れてから文字入力すると、改行入力分だけ値が上乗せされました。

ちなみに、当方VC++6ですが、拡張子.cで%nが使用できました。
MSDNにも「scanf の type フィールド文字」のタイトルで説明がありました。


From 大村 at 2005年1月19日 20時1分

わずかに書式が違ったようです

すみません 同じLightC体験版でも %sと%nの間にスペースが入っていると
上手く行かないようです。
それでも スペースを入れないようにすると 確かに iに数が入ります。

 LightC 体験版のヘルプファイルには、入力変換指定子 の type(型) という項に
整数の d や 実数の f,e  文字列の s などと並べて
「 n   これまでに入力したバイト数を int に格納します。」と書かれてあります。
LightC特有の機能を表す[LC]マークも付いていなかったので
これを使おうと考えたんです。
 また 大学の授業で使っている Linuxの gccコンパイラでも
やはり 初回は入力したバイト数が正しく入り、
2回目以降は1多い数が入ってしまうという 同じ状況が見られました。

 しかし 今のところそれ以上の裏付けは無いです。

なお、プログラムそのものは 別のアプローチから進めて
 無事 目的を達成することができました。


From 管理人 at 2005年1月19日 2時53分

re:scanf と %n についての質問

はじめまして。

私の勉強不足かもしれませんが、
> scanf("%s %n" ,str ,&i);
> のように書くと int型変数の i に それまでに
> キーボードから入力したデータ(文字列)のバイト数が入る
と言う話は聞いたことがありませんでした。

実際、Visual C++では、できませんでした。
もう少し詳しい情報をお教え願えないでしょうか?


From 大村 at 2005年1月16日 21時6分

scanf と %n についての質問

はじめまして 大村といいます。
初めてでいきなりなんですが 質問させて下さい。
C言語でscanf関数を使うときに

scanf("%s %n" ,str ,&i);

のように書くと int型変数の i に それまでに
キーボードから入力したデータ(文字列)のバイト数が入る
ということを知って、それを利用したプログラムを考えたのですが
1つのプログラムの中で複数回このようにscanf関数を使うと どういう訳か
 2回目以降は入力したデータのバイト数よりも 1だけ多い数が入ってしまうんです。
理由がわからず困っています。
あるいは もし対処法があるなら それも合わせて教えていただけると幸いです。
使っているコンパイラは 多摩ソフトウェアの Light C 体験版という物です。
よろしくお願いします。


From 管理人 at 2005年1月9日 5時22分

納得いかん

某大手ビデオレンタル&ショップTS○TAYAなんですが納得いかないことが・・・。

オンラインクーポンで12月下旬から1月下旬まで旧作半額なんです。
さらにメリークリスマス&ハッピーニューイヤー特典で1月末まで旧作
1本無料なんです。
ここまでは許せます。

でも、1月誕生日の僕は、ハッピーバースデーで、1月1日から1月6日
まで旧作半額クーポンが送られてきたんです。

一番最初に書いた普通のクーポンと相殺されて、誕生日でもなんのメリット
もないんです。

なんか、納得いかないぞ〜TSUTA○A!


From 管理人 at 2005年1月9日 3時6分

re:質問です。

化人さん、はじめまして。管理人です。

さて、質問ですが、これだけでは何とも答えられません。
というのはnodeがどのような構造になっているのかわからないからです。

二分探索木については、当サイトのC言語入門の14-9に掲載しており、
そこではノードの追加、削除はもちろん検索についてもサンプルプログラムも
ありますので、そちらを参照くださいますようお願い致します。

それでは、今後ともよろしくお願いいたします。


From 化人 at 2005年1月8日 1時36分

質問です。

初めまして、化人ともうします。
初めてでいきなりなんで申し訳ないですが質問させてください。
いま、このような問題に遭遇したのですがやり方がよくわからないのです。

二分探索木を用いて探索を実行するプログラムを作成しなさい。 

以下のような骨格のプログラムを書き、実行結果を出しなさい。 

int main(int argc, char *argv[]) {
    FILE *fp;
    node *root;
    int n;

    fp = fopen(argv[1], "r");
    while (fscanf(fp, "%d", &n) != EOF)
        root = gentree(root, n); /* 実装済み */
    fclose(fp);

    for (;;) {             /* 繰り返すための無限ループ、CTRL-Cで抜ければよい */
        scanf("%d", &n);         /* 探索するキーを入力 */
        binary_search(root, n);  /* キーnを探索し、その順路を表示する */
    }

    return 0;
}

もうなにがなんだかわかりません。
どうかよろしくお願いします。


From 管理人 at 2005年1月1日 8時15分

携帯メール。。。

みなさんも仲の良い方からすでに携帯のメールでお年賀メールのやりとりを
されている事と思います。やっぱり、こういう時はメールの届くのに遅延が
出ていますね。

PCやPHSから私のPHSには、ほとんど遅延なく届いていますが、
docomoからのメールは1時間以上遅延しています。
ez-webからのメールは20分程度遅延しています。
vodafoneは、使っている友達は多いんですがメールを誰もしてくれないので
どれだけ遅延しているかわかりませんでした(T_T)

ちなみに、0:00〜0:30頃に送信してくれた物を計測対象にしてみました。

やっぱり、docomoを使っている人が多いからかな〜。普段からdocomoは遅延する
ことが多いし。


From 管理人 at 2005年1月1日 2時44分

あけましておめでとうございます

あけましておめでとうございます。

2004年は災害が多い年でした。みなさまのおかげで集まりました
当サイトの広告費3万円を各団体に寄付することができました。
広告をクリックしてくれた方、提携先で商品を購入してくださった方
心より感謝致します。

2005年はみなさまにとって良い年になることを心より願っております。
また、被害に遭われました方は早く今までの生活に戻れるようお祈り
いたします。

2005年も、そしてこれからも当サイトをよろしくお願い致します。


From 管理人 at 2005年1月1日 2時33分

re:74

takaさんがすでに解凍されていらっしゃいますように、変数の寿命は
ブロックの中のみです。(C++の3-6章参照)変数がクラスのインスタンス
の場合はデストラクタが呼ばれて破壊されますので注意が必要です。

takaさんフォローありがとうございます。