Проблемы с указателями и массивом - PullRequest
0 голосов
/ 30 мая 2018

Публикация этого вопроса после 3-4 дней безумного поиска в Интернете, но ничего не помогло.Честно говоря, на данный момент, я думаю, я даже не знаю, что искать больше.Мне действительно нужны некоторые «указатели» о том, как обращаться с указателями и массивами, это убивает меня.

Я просто пытаюсь вычислить целочисленное возведение в степень, используя метод двоичного возведения в степень.Вот мой код для вычисления 2 ^ n в качестве примера -

#include <stdlib.h> 
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <gmp.h>

// Compute z = x^n
void mpz_binexp_pow(mpz_t z, const mpz_t x, const mpz_t n) {

/*
 * Local variables
 */
    char *pointer = NULL;
    char *pc = NULL;
    char *c = NULL;

    pointer = (char*) malloc(sizeof(mpz_t));
    pc = pointer;

/*
 *  Get the binary representation of the exponent
 */
    c = mpz_get_str(pointer,2,n);
    c[strlen(c)+1] = '\0';

    printf("%s\n\n",c);

/*
 *  Perform left to right binary exponentiation steps
 */
    /*for(int i = 0;i<strlen(c);i++) {
        mpz_pow_ui(z, z, 2);
        if (c[i] == '1')
            mpz_mul(z, z, x);
        printf("%c - \n", c[i]);
        //gmp_printf("%Zd\n", z);
    }*/

    while(*c){
        mpz_pow_ui(z, z, 2);
        if (*c == '1')
            mpz_mul(z, z, x);
        c++;
        printf("%c - \n", *c);
        //gmp_printf("%Zd\n", z);
    }

    free(pc);
}

int main(int argc, char *argv[]) {

mpz_t z;    mpz_init(z);    mpz_set_ui(z,1);
mpz_t x;    mpz_init(x);    mpz_set_ui(x,2);
mpz_t n;    mpz_init(n);    mpz_set_ui(n,1449728);
mpz_binexp_pow(z,x,n);

return 0;
}

Все отлично работает для небольших показателей, таких как 2, 3 и т. Д., Но на самом деле все сходят с ума от сравнительно больших чисел, как показано на рисунке (мне нужноэто работает для показателей, значительно превышающих показанные здесь)

Теперь, когда я запускаю этот код несколько раз, я получаю правильный вывод только примерно в 1 из 15 выполнений, что, на мой взгляд, не имеет большого значения.Я не могу понять, что происходит не так.Я получаю правильный бинарный респ.показателя, который я могу увидеть, распечатав его.Например, бинарный респ.экспоненты 1449728 равен 101100001111100000000. Теперь, когда я захожу в цикл для выполнения шагов l2r, почти каждый раз, когда программа запутывается после третьего нуля в последней нулевой последовательности, т.е. она выполняется правильно до 1011000011111000 этой точки ,Иногда я вижу некоторые другие символы, такие как «?»и «>» вместо остальных нулей, а иногда я просто ничего не вижу, программа зависает.Что происходит?

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

РЕДАКТИРОВАТЬ Этот вопрос был решен.Я хочу, чтобы этот вопрос был закрыт или удален.

...