web-dev-qa-db-ja.com

高校生に動的メモリ割り当てを教えようとしています-そうするための最良の方法は何ですか?

フィードバックによるスタックオーバーフローからコピー

そこで、ブロックパディングモデルを使用して動的メモリ割り当てを行う方法を誰かに教えたいと思います。つまり、すべてのメモリブロックには、ブロックの長さをバイト単位で保持する4バイトと、ブロックが空いているか割り当てられているかを示すビット(使用されるべきではないため、左端のビットに保持されます)がプレフィックスとポストフィックスで付けられます。

動的メモリ割り当てのすべてには、二重にリンクされたリスト内のノードと私が考える傾向があるブロックのパディングの操作が含まれます。技術的にはまったく同じではありませんが、考え方と使用される操作をかなり適切に比較するには十分です。

私は、C++とJava(とにかく彼の主張に基づく)の基本的なプログラミング知識を持つはるかに若い高校生と一緒にプロジェクトに取り組むつもりです。基本的に彼の先生は彼の次のことを知っています年の先生と彼らは彼に学生が選んだ誰とでも夏の間彼にある種のプログラミングをさせています(私は選ばれたことを光栄に思います)。

とにかく、壊れたオブジェクト/ポインターインターフェイスを使用してかなり不格好なプログラミング言語(ゲームメーカーであり、それはgamedevで実行できるため)で何かを達成することを決定した解決策は、配列を使用して構造体を実装することです。ヒープスペースでした。したがって、配列インデックスに作用するDMAアルゴリズムを実装しています。これは私にとってそれほど難しいことではなく、ファイルのどこかに適切なコードが含まれている可能性があります。私たちの利益。

しかし、それはプログラムの中心的なサブシステムの1つであるため、他の人にそれを行う機会を与えたいと思います。それで最後の質問につながります:

動的メモリ割り当ての概念と、比較を行うための概念としてポインタやリンクリストに依存せずにそれを行う関数をコーディングする方法をどのように説明しますか?

アレイ上でのアロケーターのアクションを示すために、回答と手順を使用して問題セットを作成することを考えていましたが、すぐに作業を開始し、時間を無駄にしないようにする必要があることを考えると、それはやり過ぎかもしれません。素人でも理解できるブロックパディングなどを説明する良い方法はありますか?

それが文脈に役立つなら、私は3年生のコンピュータサイエンス専攻です。したがって、私は実際に教えた経験がありません。

1
user64742

私が受け取ったフィードバックとそれについてしばらく考えたことに基づいて、私はこの問題の解決につながると思う私の質問のかなりの数の重要なポイントに気づきました。

  1. 私が一緒に仕事をしている人は、低レベルのコードについてほとんど知識がなく、おそらく動的メモリ割り当ての概念を理解できますが、実際に最初からコーディングする方法を理解するにはかなりの時間が必要です。

  2. そのコードを書く必要がある唯一の理由は、選択した言語がその機能を備えているはずであり、正しく機能しないであるためです。特に、メモリを解放した後、ポインタが別のものを指すようになる可能性があります。

  3. コード自体は、メモリを割り当て、リンクされた構造を構築する目的でのみ必要です。実装に関して特別なことは何もする必要はありません。

  4. 私はすでにこのコードの書き方を知っており、おそらく過去に書いたバージョンがいくつかあるので、少しクリーンアップする必要があります。

  5. このプロジェクトの目的は、学生が物理学とプログラミングを使用してビデオゲームを作成することです。割り当てモジュールを作成しようとしてほとんどの時間を無駄にすることは、長期的には賢明ではないでしょう。

ですから、おそらく私の特定の状況では、本質的に私の仲間のチームメイトである人がプログラムの隅々まで知っていると主張するのではなく、自分で問題を修正して対処することが最善の行動だと思います。結局のところ、言語の設計にバグがなければ、これを行うのに時間を無駄にすることはありません。それなら、なぜ誰かにそれを自分でコーディングするように教えようとしてさらに多くの時間を無駄にし、それから彼らが自分で動作するバージョンを作ることを期待するのですか?.

私が彼らに教えるつもりだったと仮定して、(私たちはデジタルでしか通信しないので)最善の行動は、生の記憶とそれがいつどのように変化するかを示す何らかの形の問題の例を作成することだと思いますさまざまな機能と入力が使用されます。

1
user64742

このトピックを説明するには、似たような、学生が理解できる現実のものを見つける必要があります。

たとえば、本棚と本の概念を使用できます。本を一冊ずつ本棚に置いていっぱいにすることもできますが、本を取り出すと穴が開いて他の本を埋めることができます。他の本よりも大きい本があり、それらがそれらの穴に収まらない場合があります。したがって、既存の穴を使用するのではなく、本を最後に置く(または別の本棚を入手する)必要があります。書籍を「コンパクト」にすることもできますが、これにより、それらの書籍への直接のポインタが無効になります(つまり、3番目の棚の左から15番目の書籍)。 (はい、マネージド言語がこの問題に対処していることは知っていますが、技術的になりすぎないようにしています)

割り当てのサイズについてのビットは、実際には本のサイズを目で確認するための単なるプレースホルダーです。

0