Указатели, Массивы, printf - PullRequest
       7

Указатели, Массивы, printf

1 голос
/ 29 января 2010

Я пытаюсь использовать массив для хранения входных данных для опроса, которые будут иметь равные положительные значения на каждой стороне, но иметь указатель на центр массива, чтобы отрицательные значения указателя можно было использовать для доступа к массиву.

Например, массив будет содержать значения от 0 до 30, указатель будет указывать на 15, и пользователю будет предложено ввести значения в диапазоне от -15 до 15, где будет увеличиваться массив на значение пользователя.

Я в порядке, если моя логика еще не совсем верна, но проблема, с которой я сейчас сталкиваюсь, заключается в увеличении значения (что я не уверен, правильно ли я делаю это на ptr[userInput]++, и выводе эти значения с printf. Я видел, как чей-то пост о передаче массива в printf фактически передает указатель на массив, и тот человек сказал, что дважды отменяет ссылку на него либо **ptr или (*ptr)[0], но моему компилятору (Mac XCode) это не нравится.

Есть мысли? Вот мой код Я прокомментировал, где мои вопросы были:

#define ENDPOINT 15
#define TERMINATE 999
#define TEST_FILE "TestFile6.txt"

void RecordOpinions(void)
{
    int record[2 * ENDPOINT + 1];
    int *ptr = &record[ENDPOINT + 1];
    int userInput;
    int loopCount = -ENDPOINT;

    printf("ptr:%d\n", *ptr);  // this was a test for me trying to figure out how to 
                               // print the value of the ptr.

    printf("Please enter your opinion of the new TV show, Modern Family from ");
    printf("-%d(worst) to 0 to +%d(best).  Entering %d ", ENDPOINT, ENDPOINT, TERMINATE);
    printf("will terminate and tabulate your results: \n");

    scanf("%d", &userInput);
    while (userInput != TERMINATE) {
        if (userInput > ENDPOINT || userInput < -ENDPOINT) {
            printf("Invalid entry.  Enter rating again: ");
        }
        else {
            printf("You entered: %d\n", userInput);

            ptr[userInput]++;      // not sure if this is the right way to increment 
                                   // the array at the user's input value.
        }
        scanf("%d", &userInput);
    }
    printf("Rating entry terminated.\n");
    printf("Ratings:.\n");
    for (; loopCount <= ENDPOINT; ) {
        printf("%d\n", ptr[loopCount++]);   // this part is where I also need help
                                                // in trying to print out the value of
                                                // the ptr, not the address.
    }
}

Ответы [ 2 ]

3 голосов
/ 29 января 2010

Что касается непосредственных вопросов, которые вы подняли в своем вопросе, ваш код в порядке. То есть вы работаете с вашим «двусторонним» массивом правильно (и нет, вам не нужны никакие дополнительные разыменования при printf значениях в массиве).

Единственная проблема, которую я вижу, заключается в том, что вы забыли инициализировать (назначить начальные значения) свой массив record, что означает, что вывод в любом случае будет мусором, независимо от того, как вы с ним работаете. 1006 *

Кроме того, как отметил Дейв Хинтон в комментариях, если вы хотите использовать диапазон -ENDPOINT до +ENDPOINT от источника ptr, вам нужно инициализировать ptr с &record[ENDPOINT], а не с &record[ENDPOINT + 1]. В противном случае, если пользователь введет значение ENDPOINT в качестве индекса, вы получите доступ за пределами допустимого диапазона справа. (И значение record[0] всегда останется неиспользованным на левом конце.)

P.S. Я бы сделал немало «стилистических» изменений, но в данном случае они не имеют смысла.

0 голосов
/ 29 января 2010

Почему бы вам не вычесть 15 из числа, которое вводит пользователь? И.Е.

ptr[userInput - ENDPOINT]++;

Где ptr указывает на начало массива? Это гораздо проще понять и более условно.

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