Увеличение указателя, возвращаемого функцией, перед разыменованием этого указателя в C ++ - PullRequest
0 голосов
/ 09 марта 2011

В настоящее время я озадачен проблемой домашней работы, включающей функцию, которая перебирает первый столбец массива из 2 столбцов, чтобы найти минимальное значение, а затем возвращает указатель на элемент с минимальным значением.Эта часть не так уж плоха, но моя проблема заключается в следующем:

    cout<<"The minimum travel time is "<<*minimumTravelTime(travelTime)<<endl; //Prints minimum travel time

    //FIX THIS PART
    methodDeterminator = (*minimumTravelTime(travelTime))++;
 cout<<"THE CASE IS "<<methodDeterminator<<endl;
    //FIX THIS PART

switch(methodDeterminator)
{
    case 0: transportMethod = "transporter";
              break;
    case 1: transportMethod = "stargate";
              break;
    case 2: transportMethod = "Alcubierre drive";
              break;
    case 3: transportMethod = "hyperdrive";
              break;
    case 4: transportMethod = "TARDIS";
              break;
    default: cout<<"Error.  Could not find transport mode."<<endl;
}

cout<<"Travel by "<<transportMethod<<" will take "<<*minimumTravelTime(travelTime)<<" months."<<endl; //Prints travel method and time

Функция найти минимальное время здесь

int *minimumTravelTime(int travelArray[][2])
{
    int *pMinimum; //Pointer for minimum time
    int currentMin, pastMin; //Holding places for finding minimum travel time

    for(int r = 0; r < 5; r++) //5 rows
    {
        for(int c = 0; c < 2; c++) //2 columns
        {
            if(c == 0) //If first column
            {
                if(r == 0) //If first row
                {
                    currentMin = travelArray[r][c]; //First row value stored as currentMin
                }
                else
                {
                    pastMin = currentMin; //Set previously determined currentMin as pastMin
                    currentMin = travelArray[r][c]; //Get current value

                    if(currentMin > pastMin) //If current value is greater than pastMin
                    {
                        currentMin = pastMin; //Set currentMin to be pastMin
                    }
                }
            }
        }
    }

    pMinimum = &currentMin; //Points to memory location of currentMin

    return pMinimum; //Return address of minimum value
}

Часть с надписью "// FIX THIS PART"вот где у меня проблемы.Я хочу, чтобы он увеличивал адрес памяти, который функция возвращает ДО разыменования (чтобы я мог получить значение во втором столбце массива, что будет соответствовать случаям в операторе switch).Я не могу удалить * в имени функции в реализации функции, а также не могу удалить внутренние скобки, иначе это выдаст мне ошибку «Выражение является неизменяемым lvalue».

Спасибо залюбая помощь.Я часами работал над этой проблемой, пытаясь разобраться.Я также не смог найти ни одного примера кода того, что конкретно я пытаюсь сделать (увеличить указатель перед разыменованием, и указатель возвращается функцией).

Ответы [ 4 ]

0 голосов
/ 09 марта 2011

Я хочу увеличить адрес памяти, который функция возвращает ДО разыменования.

Указатель, возвращаемый minimumTravelTime(), не является l-значением (он не имеетадрес в памяти (насколько это касается вашей программы), что означает, что вы не можете изменять его значение так, как если бы указатель был объявлен как переменная.

Что вы можете do - добавить значение к возвращаемому указателю и разыменовать результат, например, так:

methodDeterminator = *(minimumTravelTime(travelTime) + 1);

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

methodDeterminator = minimumTravelTime(travelTime)[1];

Вы также можете сделать что-то вроде этого:

int *p = minimumTravelTime();

methodDeterminator = *(++p); // increment first, then dereference

... но нет веской причины делать это, если вы не хотите использовать указатель в другом месте.

0 голосов
/ 09 марта 2011

Кажется, есть несколько проблем с кодом, который вы дали.

for(int c = 0; c < 2; c++) //2 columns
        {
            if(c == 0) //If first column

Эта часть гарантирует, что ваш цикл никогда не будет проверять второй столбец, что неверно.

Логика приращения возвращенного значения указателя не будет работать, поскольку возвращаемое значение не является указателем внутри массива, а указателем на локальную переменную (проблемы, уже указанные Nawaz) Более того, вы уже нашли минимальное значение из второго столбца внутри функцииimumTravelTime, поэтому дополнительная обработка не требуется.

Если вы все еще хотите увеличить возвращаемый указатель перед разыменованием, вам придется выполнить предварительное увеличение. Однако возвращаемое значение должно быть сначала собрано в локальный указатель, а затем предварительно увеличено, в противном случае вы получите ошибку 'lvalue'.

0 голосов
/ 09 марта 2011
methodDeterminator = minimumTravelTime(travelTime)[1];

или эквивалентно

methodDeterminator = *(minimumTravelTime(travelTime) + 1);

Однако, как объяснил Наваз, вы не возвращаете указатель на столбец.Вам нужно установить

pMinimum = travelArray[r];

там, где вы установили currentMin, и просто вернуть его из функции minimumTravelTime.Чем использование [1] должно быть даже понятно - функция возвращает массив с одним индексом, а вы добавляете второй индекс.

Однако, поскольку это C ++, вы должны использовать std::map впервое место. C ++ предоставляет множество концепций высокого уровня, чтобы избежать манипулирования указателями, и вы должны использовать их, чтобы поддерживать ваш код в удобном для сопровождения и избежать глупых ошибок (у вас есть как минимум 3 серьезные проблемы в коде, которые будут обнаружены компиляторомесли вы использовали соответствующие конструкции).

0 голосов
/ 09 марта 2011
pMinimum = &currentMin; //Points to memory location of currentMin
return pMinimum; //Return address of minimum value

currentMin - локальная переменная, поэтому вы возвращаете указатель на локальную переменную.Это проблема, поскольку локальная переменная не существует после возврата функции, но вы все еще пытаетесь получить к ней доступ на вызывающем сайте.Это не даст желаемого результата.

Лучше изменить тип возвращаемого значения функции, а затем вернуть currentMin по значению как,

int minimumTravelTime(int travelArray[][2]) //changed the return type!
{
    //your code
    return currentMin;
}

И назвать его как,

 int minTravelTime = minimumTravelTime(travelTime);

РЕДАКТИРОВАНИЕ:

Если вы получили указание вернуть указатель из функции, то вы можете сделать это:

  return new int(currentMin); //allocate memory, initialize it, and return it!

Обратите внимание на синтаксис new int(currentMin), а не new int[currentMin].Существует разница между этими двумя синтаксисами!

и на вызывающем сайте:

  int *minTravelTime = minimumTravelTime(travelTime);

  //use minTravelTime

  delete minTravelTime; //delete the memory once you're done!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...