0

私は初心者のコーダーで、C++ を学習してまだ数か月です。これはスタック オーバーフローに関する 2 番目の質問です。回答が私や他の人に役立つことを心から願っています。

このプログラムに取り組み始めたのは、1D ベクターを作成し、その 1D ベクター内の任意の位置に値を割り当て (幅と高さを抽象化して 2D をシミュレートすることによって)、そのベクターを出力できるベクター エンジンを作成したかったからです。このようなプロジェクトの最終目標は、SDL または同等のものを使用して、このベクターの int 値を画面上の画像タイルに変換するレンダリング エンジンを後で持つことです。

以前に、それぞれが文字を含むオブジェクトのベクトルを使用して同様のことを実行できるプログラムを作成しましたが、参照によって値を渡さなかったので、このプログラムで参照によって値を渡すことを本当に釘付けにしたかったのです。

コードは問題なくコンパイルされ、assignToVector 関数の cout ステートメントは、値が適切に割り当てられていることを示しているようです。しかし、最後の print ステートメントを呼び出すと、ベクターに渡したい値が正しく出力されません。問題を絞り込むのに役立つ場合は、 vector.erase を使用して値を割り当てる前に位置をクリアし、 vector.assign を使用して値を入力しています。

この質問に答えてくださった皆様、本当にありがとうございました。ありがとうございました!

編集: 以下の chris の提案により、問題の最初の部分が修正されました (std::cout << printerVector[*it] を std::cout << *it に変更)。

ただし、ポジションを追加する必要があることがわかりました--; 値を適切に揃えるために作成した後。基本的に、入力された幅と高さの値は、グリッド上の実際の位置と一致しません。これについてさらに助けていただければ幸いです。1次元ベクトルとそれらを2Dとして使用することに関連する問題だと思います。

//The purpose of this program is to create a one dimensional vector of integers
//that is equal to the desired screen size.  Look at the preprocessor defines
//to change these values.
//The program also contains a function to print the created vector for testing
//purposes.
#include <iostream>  //Needed for std::cout and std::endl
#include <vector>    //Needed for std::vector and others

#define CONSOLEWIDTH  80;
#define CONSOLEHEIGHT 25;

//This function is supposed to assign a value to a specific point in the 1D vector matrix.
//The posWidth and posHeight are used to compute the location with default console values, mimicking 2D.
void assignToVector(std::vector<int>& intVector, int posWidth, int posHeight, int assignValue);

//This is mostly just a testing function to ensure that the desired
//contents are properly stored in the vector.
void printVector(std::vector<int>& printerVector);

//Creates the test vector, prints it, modifies it, and prints it again
void setupAndRun();

int main()
{
    setupAndRun();
}

void assignToVector(std::vector<int>& intVector, int posWidth, int posHeight, int assignValue)
{
    int position = posWidth + posHeight*CONSOLEWIDTH;
    //std::cout << intVector[position] << std::endl;
    std::cout << position << std::endl;
    intVector.erase(intVector.begin() + position);
    //std::cout << intVector[position] << std::endl;
    std::cout << assignValue << std::endl;
    intVector.insert(intVector.begin() + position, 1, assignValue);
    std::cout << intVector[position] << std::endl;
}

void printVector(std::vector<int>& printerVector)
{
    for(std::vector<int>::iterator it = printerVector.begin(); it != printerVector.end(); it++)
    {
        std::cout << printerVector[*it];
    }
}

void setupAndRun()
{
    int width     = CONSOLEWIDTH;
    int height    = CONSOLEHEIGHT;
    //Creates a vector of size argument1 that each have a value of argument2
    //This syntax doesn't seem to work inside classes
    std::vector<int> testVector(width*height, 8);
    //80*25 8's
    printVector(testVector);
    //Suppossed to assign 200 to the 10th position of the first row of testVector
    assignToVector(testVector, 10, 0, 200);
    //Prints out 200
    std::cout << testVector[10] << std::endl;
    //Prints out default value
    std::cout << testVector[9]  << std::endl;
    //Doesn't have a 200 in it
    printVector(testVector);
}
4

0 に答える 0