2013-11-26 3 views
0

У меня возникли проблемы с выяснением того, как исправить ошибку БЕЗ изменения чего-либо в основной процедуре, как говорят инструкции. Компилятор дает мне ошибку в строке 20, строке в основной подпрограмме, которая вызывает функцию findMax, потому что ptr используется без инициализации.Ошибка инициализации

Я не понимаю, почему компилятор говорит, что ptr не инициализируется, потому что в функции findMax значение pToMax устанавливается равным arr.

Я попытался сделать pToMax указателем на ptr, изменив его инициализацию на int ** pToMax и добавив * ко всем последующим экземплярам pToMax в функции findMax. Однако после того, как я это сделал, компилятор сказал, что он не может преобразовать из int * в int ** в строке 20.

Единственное другое исправление, о котором я мог думать, это инициализировать int * ptr до nullptr в основной процедуре , но в инструкциях говорится, что мне не разрешено изменять основную процедуру.

void findMax(int arr[], int n, int* pToMax) 
{ 
    if (n <= 0) 
     return;  // no items, no maximum! 

    pToMax = arr; 

    for (int i = 1; i < n; i++) 
    { 
     if (arr[i] > *pToMax) 
       pToMax = arr + i; 
    } 
}  

int main() 
{ 
    int nums[4] = { 5, 3, 15, 6 }; 
    int* ptr; 

    findMax(nums, 4, ptr); 
    cout << "The maximum is at address " << ptr << endl; 
    cout << "It's at position " << ptr - nums << endl; 
    cout << "Its value is " << *ptr << endl; 
} 
+3

Вы передаете значение «pToMax». Либо верните его как возвращаемое значение функции, либо передайте его по адресу ('int ** ppToMax') и соответствующим образом скопируйте его. – WhozCraig

+0

@WhozCraig, конечно, это ответ? :) –

+1

@ Moo-Juice до сих пор я смотрел на тег C и C++ и не совсем был уверен, чего хочет OP. К счастью, полдюжины человек будут отвечать на ответы на вопросы об основах независимо от того, что укрепило сильный показатель [исследования] (http://meta.stackexchange.com/questions/182266/how-much-research -effort-is-expected-of-stack-overflow-users/182380 # 182380) перед публикацией этого. – WhozCraig

ответ

5

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

void findMax(int arr[], int n, int*& pToMax) 
{ 
    // ... 
} 
+0

Yup. (Еще 11 to go) –

+0

@ user2752992, если инструкции такие, как вы говорите (немодифицируемый 'main()') это только способ *. * – WhozCraig

+0

Спасибо, это сработало. Я все еще путаюсь, почему. Когда я вызываю findMax с ptr, int * & pToMax устанавливается в ptr. int * & pToMax в основном то, на что указывает указатель на pToMax, который является pToMax? Но тогда какого типа pToMax? Это должен быть указатель, если он может быть установлен на ptr, но тогда почему у него есть &? Прошу прощения, я не знаю технического жаргона, но я очень смущен – gallardoelise

1

findMax() должен получить указатель на указатель на INT, а не указатель на INT, если вы хотите передать указатель сам по ссылке. Помните, что каждое значение в C передается копией, то есть вы передаете копию ptr в findMax(). Внутри findMax() вы можете указать его где-то в другом месте, но эти изменения не будут видны в main(). Таким образом, использование ptr в main() приводит к неопределенному поведению при печати его адреса.

Используйте указатель на указатель на добавить еще один уровень косвенности, например:

void findMax(int arr[], int n, int **pToMax) 
{ 
    if (n <= 0) 
     return;  // no items, no maximum! 

    *pToMax = arr; 

    for (int i = 1; i < n; i++) 
    { 
     if (arr[i] > **pToMax) 
       *pToMax = arr + i; 
    } 
} 

Компилятор жалуется, не будучи в состоянии преобразовать int * в int **, когда вы делаете это потому, что ptr имеет тип int *. Вы должны использовать оператор реферирования &, чтобы получить указатель на ptr и передать его findMax():

int main() 
{ 
    int nums[4] = { 5, 3, 15, 6 }; 
    int *ptr; 

    findMax(nums, 4, &ptr); 
    cout << "The maximum is at address " << ptr << endl; 
    cout << "It's at position " << ptr - nums << endl; 
    cout << "Its value is " << *ptr << endl; 
} 

Это должно исправить.

+0

Правильно, но ОП сказал, что он не может изменить функцию 'main'. –

+0

Да, вопрос был помечен C, я не думаю, что вы можете исправить это, не изменяя 'main', если вы используете C. С C++ ваш ответ, безусловно, то, что он искал. –

Смежные вопросы