Начинающему программисту C нужна помощь с указателями (я думаю) - PullRequest
3 голосов
/ 26 декабря 2008

Я начинающий программист, и я изучаю свой первый язык, C.

Я учусь в основном из книги «Как программировать» Дейтеля и Дейтеля, но также использую примеры заданий и вещи из университета, однако я застрял на одном.

У меня есть очень очень базовое понимание указателей - добавление & перед переменной заставляет ее печатать адрес и * использует указатель для использования значения, хранящегося по этому адресу или около того.

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

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

Спасибо, если вы прочитали это далеко. Я слишком много бродил.

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

Код

#include <stdio.h>
int greatestCD (int num1, int num2);

int main(void)
{
    int a=0, b=0;
    int result;
    printf("Please enter two numbers to calculate the greatest common denominator from\n");
    scanf("%d%d", &a, &b);
    result = greatestCD (a,b);
    printf("Using the correct in main way:\nThe greatest common denominator of %d and %d is %d\n",a,b, result);
}

int greatestCD (int num1 ,int num2)
{ 

    if (num2==0){
        printf("Using the cheaty in gcd function way:\nThe greatest common denominator is %d\n",num1);
        return num1;
    } else {
        greatestCD(num2,(num1%num2));
    }    
}

Вывод (используя 12 и 15 - ответ должен быть 3)

C:\Users\Sam\Documents\C programs>gcd
Please enter two numbers to calculate the greatest common denominator from
12
15
Using the cheaty in gcd function way:
The greatest common denominator is 3
Using the correct in main way:
The greatest common denominator of 12 and 15 is 2293524

Такое простое решение от frankodwyer. Это такие крошечные вещи, которые я либо не могу разглядеть, либо не знаю. Так что возвращалось не указатель, а просто мусор?

Спасибо за миллион.

Ответы [ 5 ]

10 голосов
/ 26 декабря 2008

В последней строке функции greatCD ()

отсутствует оператор return
greatestCD(num2,(num1%num2));

Сделать это

return greatestCD(num2,(num1%num2));

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

edit: Я бы также предложил, чтобы при компиляции в будущем вы включали все предупреждения компилятора ... если вы используете gcc, попробуйте добавить флаг -Wall в вашу команду компиляции. Это должно предупредить вас, когда вы делаете вещи, которые могут привести к таким ошибкам. (Не каждое такое предупреждение обязательно является ошибкой, следовательно, «предупреждение», но обычно оно указывает на возможную проблему.)

4 голосов
/ 26 декабря 2008

Поскольку вы изучаете C, независимо от ошибки пропущенного возврата, вот несколько замечаний и советов:

  • Указатели - самая сложная особенность языка для изучения , особенно когда вы попадаете в malloc() и free(). Не расстраивайтесь .

  • Выбросьте Дейтеля и Дейтеля и получите себе копию Кернигана и Ричи . Это одна из лучших когда-либо написанных языковых книг.

  • Постоянно включайте все предупреждения. Если вы можете использовать MacOS или Linux, gcc -Wall -Werror -O довольно хорошо.

  • Запустить каждую программу на C под valgrind . Valgrind - замечательный инструмент, предназначенный для ловли ошибок при использовании указателей . Это спасет ваш бекон!

Удачи!

2 голосов
/ 27 декабря 2008

См. Вопрос Если я не буду использовать книгу Херба Шильдта, чтобы учиться у , и, в частности, список, на который ссылаются http://www.cs.technion.ac.il/users/yechiel/CS/BadBooksC+C++.html. Хотя в нем перечислены книги С ++, написанные Дейтелем и Дейтелем, в них есть тенденция быть сильным семейным сходством между книгами данной пары авторов. Я был бы склонен получить для себя хорошую книгу о C. Я узнал от Kernighan & Ritchie (первое издание, когда было только одно издание), поэтому я бы порекомендовал - он краткий и точный (как и сам C).

2 голосов
/ 26 декабря 2008

Вы ничего не возвращаете из своей функции, поэтому значение 2293524 является просто случайным мусором. Разве ваш компилятор не выдает предупреждение о пропущенном возвращаемом значении?

0 голосов
/ 26 декабря 2008

Более странно то, что программа работает на моем компьютере с Linux. Ошибка или особенность gcc?

/dev/shm $ gcc x.c
/dev/shm $ ./a.out
Please enter two numbers to calculate the greatest common denominator from
12
15
Using the cheaty in gcd function way:
The greatest common denominator is 3
Using the correct in main way:
The greatest common denominator of 12 and 15 is 3
/dev/shm $ gcc --version
gcc (Debian 4.3.2-1) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...