Mohit Tomar Ответов: 3

Что не так с моим кодом?


Ниже приведен мой код. На самом деле я пытаюсь перевернуть массив. Хотя я могу легко сделать это, используя реальные массивы, т. е. "int arr[]" но я подумал, почему бы не попробовать что-то новое, Указатели :-) но теперь я не могу понять, в чем проблема.

Я новичок в Си и имею некоторые предварительные очень базовые знания в области кодирования.
int i, *arr, num, numImg, temp;
printf("Enter num: ");
scanf("%d", &num);

numImg = num - 1;

arr = (int*)malloc(num * sizeof(int));

for(i = 0; i < num; i++)
{
    scanf("%d", arr + i);
}


for(i = 0; i < num; i++)
{
    temp = *(arr + numImg);
    *(arr + numImg) = *(arr + i);
    *(arr + i) = temp;
    numImg--;
    printf("%d, ", *(arr + i));
}


И у меня есть еще один вопрос. Не уверен, Нужно ли создавать новый поток или нет, но то, что я хочу знать, - это "как настроить KDevelop для отладки?" Пока удалось только получить ошибку "&"предупреждение: GDB: не удалось установить управляющий терминал: работа не разрешена\n"
Введите кол-во:
"


Что я уже пробовал:

Попытался проверить, возможно ли вообще то, чего я пытаюсь достичь, и написал следующий код, и он сработал, но вышеприведенный код не сработал
int n, m, *ptrN, *ptrM;

n = 10;
ptrN = &n;

m = 50;
ptrM = &m;

*ptrN = *ptrM;

printf("%d", *ptrN);

Выход =--> 50

Christian Graus

Кроме того, все хотят знать, что не так с их кодом. Описательный заголовок привлечет людей, использующих то, что вы используете. Особенно полезно с языком, который находится на периферии, как C

3 Ответов

Рейтинг:
23

Patrice T

Цитата:
На самом деле я пытаюсь перевернуть массив.

Вы переворачиваете массив, меняя местами элементы 2 на 2, но вы должны остановиться, когда достигнете середины массива.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Mohit Tomar

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

Теперь я использовал переменную как < n/2, и теперь она работает.

Спасибо снова

Рейтинг:
2

Mohit Tomar

int i, *arr, num, numImg, temp;
printf ( "Enter num: " );
scanf ( "%d", &num );
numImg = num - 1;

arr = ( int* ) malloc ( num * sizeof ( int ) );

for ( i = 0; i < num; i++ ) {
    scanf ( "%d", arr + i );
}

for ( i = 0; i < num / 2; i++ ) {
    temp = * ( arr + numImg );
    * ( arr + numImg ) = * ( arr + i );
    * ( arr + i ) = temp;
    numImg--;
    //printf("%d, ", *(arr + i));
}

for ( i = 0; i < num; i++ ) {
    printf ( "%d ", * ( arr + i ) );
}


Я публикую окончательное решение проблемы выше, на случай, если оно понадобится кому-то еще. Спасибо


Рейтинг:
1

Christian Graus

С какой стати ты учишь Си?

Вы ссылаетесь на элемент массива следующим образом:

arr[numImg]


Если бы это был символ *, этот код работал бы так, как символ-это один байт. Как бы то ни было, вы оказываетесь в случайных точках ваших данных.


Stefan_Lang

На самом деле его код работает с любым типом. В C и C++ любое из следующих действий дает один и тот же результат:
arr[numImg]
*(arr+numImg)
*(numImg+arr)
numImg[Арр]
0[numImg+arr]

Во всех этих случаях arr и numImg добавляются, а затем интерпретируются и разыменовываются как указатель на int (или любой другой тип, на который они указывают).

С. П.:
Попробуйте этот код по адресу https://www.tutorialspoint.com/compile_c_online.php :
#включить <stdio.h>

тап_п()
{
int arr [] = { 3,4,5 };
int i = 2;
функции printf("ОБР[я]: %Д\П", модуль arr[я]);
функции printf("*(ОБР+я): %Д\П", *(ОБР+я));
функции printf("*(я+ОБР): %д\п", *(я+ОБР));
printf("i[arr]: %d\n", i[arr]);
printf("0[i+arr]: %d\n", 0[i+arr]);

возвращает 0;
}

Mohit Tomar

У меня полно времени, вот почему.