Унифицированная локальная переменная и помощь в исправлении - PullRequest
0 голосов
/ 16 февраля 2012

Я изучаю указатели и оператор new в классе.

В моей функции readArray я должен читать в размере. Используйте размер, чтобы динамически создать целочисленный массив. Затем присвойте массив указателю, заполните его и верните размер и массив.

Мне кажется, что я исправил и исправил эту часть, но когда я пытаюсь отсортировать массив, я получаю сообщение об ошибке "неинициализированная локальная переменная temp используется". Проблема в том, что я получаю эту ошибку, когда пытаюсь ее инициализировать. Любая помощь приветствуется, спасибо. Видеть мои ошибки очень полезно для меня.

#include <iostream>
using namespace std;

int* readArray(int&);
void sortArray(int *, const int * );

int main ()
{
    int size = 0;
    int *arrPTR = readArray(size);
    const int *sizePTR = &size;
    sortArray(arrPTR, sizePTR);

    cout<<arrPTR[1]<<arrPTR[2]<<arrPTR[3]<<arrPTR[4];

        system("pause");
        return 0;
}


int* readArray(int &size)
{
    cout<<"Enter a number for size of array.\n";
    cin>>size;
    int *arrPTR = new int[size];

    for(int count = 0; count < (size-1); count++)
    {   
         cout<<"Enter positive numbers to completely fill the array.\n";
         cin>>*(arrPTR+count);
    }

    return arrPTR;
}

void sortArray(int *arrPTR, const int *sizePTR)
{
    int *temp;
    bool *swap;

    do
    {
        swap = false;
        for(int count = 0; count < (*sizePTR - 1); count++)
        {
            if(arrPTR[count] > arrPTR[count+1])
            {
                *temp = arrPTR[count];
                arrPTR[count] = arrPTR[count+1];
                arrPTR[count+1] = *temp;
                *swap = true;
            }
        }
    }while (swap);
 }

Ответы [ 4 ]

3 голосов
/ 16 февраля 2012

Вы создаете временный указатель int (неинициализированный), а затем устанавливаете объект, на который он указывает (все / ничего), равным arrPTR [ccount]. Поскольку вы используете temp только для обмена, это должен быть тот же тип, что и для обмена, в данном случае: int.

Если он абсолютно должен быть указателем (для этого есть нет веская причина, он медленный, запутанный, добавляет вероятность ошибок и увеличивает утечку памяти): 1007 *

int *temp = new int; //make an int for the pointer to point at
bool *swap = new bool; //make an bool for the pointer to point at
do
{
    //your code
}while (swap);
delete temp;
delete swap;
2 голосов
/ 16 февраля 2012

Вы объявили temp в качестве указателя.Вы должны распределить его в куче перед разыменованием и назначить его позже.Однако, возможно, предпочтительнее было бы использовать переменную в стеке?

К вашему сведению: вы должны знать об утечке памяти в readArray, в результате чего вызывающие абоненты несут ответственность за вызов delete []

Редактировать: Надеюсь, это поможет решить некоторые другие проблемы.

#include <iostream>

int* readArray(int&);
void sortArray(int*, int);

int main ()
{
    int size(0); // use stack when possible
    int *arrPTR = readArray(size);
    sortArray(arrPTR, size);

    // arrays are zero based index so loop from 0 to size
    for (int index(0); index < size; ++index)
        std::cout << arrPTR[index];

    delete [] arrPTR; // remember to delete array or we have a memory leak!
    // note: because we did new[] for an array we match it with delete[]
    //       if we just did new we would match it with delete

    system("pause");
    return 0;
}

int* readArray(int& size)
{
    std::cout << "Enter a number for size of array.\n";
    std::cin >> size;
    int *arrPTR = new int[size]; // all news must be deleted!

    // prefer pre-increment to post-increment where you can
    for(int count(0); count < size; ++count)
    {   
         std::cout << "Enter positive numbers to completely fill the array.\n";
         std::cin >> arrPTR[count];
    }

    return arrPTR;
}

// passing size by value is fine (it may be smaller than pointer on some architectures)
void sortArray(int *arrPTR, int size)
{
    // you may want to check if size >= 2 for sanity

    // we do the two loops to avoid going out of bounds of array on last iteration
    for(int i(0); i < size-1; ++i) // the first to compare (all except last)
    {
        for(int j(i+1); j < size; ++j) // the second to compare (all except first)
        {
            // do comparison
            if (arrPTR[i] > arrPTR[j]) // from smallest to biggest (use < to go from biggest to smallest)
            {
                // swap if needed
                int temp(arrPTR[i]); // put this on stack
                arrPTR[i] = arrPTR[j];
                arrPTR[j] = temp;
            }
        }
    }
 }
1 голос
/ 16 февраля 2012

temp - это указатель на int, который вы не инициализируете. Когда вы говорите *temp = ..., вы на самом деле присваиваете тому, что temp указывает, но такЯ не сказал ему, на что указывать, он может писать практически в любом месте адресного пространства вашей программы.

Из-за того, как вы их используете, кажется, что temp и swapвообще не должно быть указателей, просто int и bool.

0 голосов
/ 16 февраля 2012

Вы не инициализировали временный указатель, который выполняется, когда вы разыменовываете его, когда пишете в произвольную часть памяти.Temp не должен быть указателем, это может быть просто int.Просто замените КАЖДЫЙ экземпляр * temp на temp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...