Объявить массив без размера в программировании на C - PullRequest
0 голосов
/ 23 сентября 2018

Я пишу программу, которая преобразует заданную битовую строку (до 32 бит) в десятичную, предполагая, что входные данные даны в беззнаковой величине и дополнении до двух.Я читаю каждый бит от пользователя по одному символу за раз и пытаюсь сохранить его в массиве, но массив не имеет требуемого размера.Есть ли способ заставить массив проходить цикл без определения размера массива?Я также пытаюсь выяснить способ не использовать функции pow и умножения.Я публикую свой код ниже, если у вас есть какие-либо идеи, пожалуйста

#include "stdio.h"
#include "math.h"

#define MAX_BITS 32
#define ENTER '\n'
#define NUMBER_TWO 2

int main()
{
        int unsignedMag;
        int twosComp;
        int negation[n];
        int bitStore[n];
        char enter;

        //Input from the User
        printf("Enter up to 32 bits (hit 'enter' to terminate early): ");

        //Reads the first bit as a character
        char bit = getchar();
        while (getchar != enter) {
                bit = bit - '0';
                scanf("%c", &bitStore[bit]);
                getchar();
        }

        //Terminates if user hits enter
        if (bit == enter) {
                return 0;
        }

        //Continue through code
        else {
                //Loop to calculate unsigned magnitude
                for (int i = 0; i < bitStore[i]; i++) {
                        unsignedMag = unsignedMag + (bitStore[i] * pow(NUMBER_TWO, i));
                }

                //Loop to calculate complete negation
                for (int j = 0; j < bitStore; j++) {
                        negation[j] = ~bitStore[j]
                }
                negation = negation + 1;
                for (int l = 0; l < negation; l++) {
                        twosComp = twosComp + (negation[l] * pow(NUMBER_TWO, l));
                }


        }
        return 0;

}

1 Ответ

0 голосов
/ 23 сентября 2018

"Есть ли способ заставить массив проходить цикл без определения размера массива?"

Нет.Размеры массива фиксированы в точке, в которой объявлен массив, и размер известен: например, @ Observer

size_t size = sizeof bitStore/sizeof bitStore[0];

Вместо этого, поскольку код имеет "заданную битовую строку (до32 бита) ", определите массив как размер 32 (или 33 - это строка , необходимая).
Отслеживайте, какая часть массива была назначена.

//int bitStore[n];
int bitStore[MAX_BITS];
int count = 0;

// char bit = getchar();
int bit = getchar(); // Use `int` to account for potentially 257 different values

//while (getchar != enter) {
while (count < MAX_BITS && (bit == '0' || bit == '1')) {
    bit = bit - '0';

    // Do not read again, instead save result. 
    //scanf("%c", &bitStore[bit]);  
    bitStore[count++] = bit;

    // getchar();
    bit = getchar();
}

чтобы не использовать функции pow и умножения.

Просто добавьте или умножьте на 2 с помощью сдвига.Непонятно, почему у ОП цель не использовать «умножение».Я вижу мало причин, чтобы запретить *.Хороший компилятор будет генерировать эффективный код, когда базовое умножение стоит дорого, так как *2 тривиально для оптимизации.

    // int unsignedMag;
    unsigned unsignedMag = 0; // initialize

    // for (int i = 0; i < bitStore[i]; i++) {
    for (int i = 0; i < count; i++) {
      // preferred code, yet OP wants to avoid * for unclear reasons 
      // unsignedMag = unsignedMag*2 + bitStore[i];
      unsignedMag = unsignedMag + unsignedMag + bitStore[i];
    }

pow() здесь хорошо избегать по многим причинам.Более того, использование double math для целочисленной задачи приводит к проблемам с точностью с широкими целыми числами.


преобразует данную битовую строку (до 32 бит) в десятичную

Обратите внимание, что bitStore[] массив не требуется для этой задачи.Просто введите unsignedMag при чтении данных.

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