Продолжение Power Function Message - PullRequest
0 голосов
/ 03 октября 2018

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

#include "stdio.h"
#include "string.h" //Needed for strlen()
#include "math.h"

#define MAX_BITS 32
#define MAX_LENGTH 49
#define NUMBER_TWO 2
#define NUMBER_ONE 1
#define TERMINATOR '\0'

//Code to find the index of where the string ends
int last_index_of(char in_str[], char ch) {
        for (int i = 0; i < MAX_LENGTH; i++) {
                if(in_str[i] == ch) {
                        last_index_of == i;
                }
        }
        return last_index_of;
}

//Code to find the start of the fractional aspect
void sub_string(char in_str[], char out_str[], int start, int end){
        int i = 0;
        while (i < 1) {
                out_str[i] = in_str[start] + in_str[end-1];
                i++;
        }
}

int main()
{
        //Declaration of variable
        char input[MAX_LENGTH +1]; // +1 for '\0'
        int number;
        double exponent;
        char output[MAX_BITS];
        int fraction;

 sub_string(input, output, 0, TERMINATOR);

        //Input from the user
        printf("Enter a floating point value in binary: ");
        scanf("%s", input);

        //Calculates the Decimal Part
        for (int i = 0; i < last_index_of(input, TERMINATOR) ; i++) {
                number = number + number + input[i];
        }
        printf("%d", number);

        exponent = -1;
        //Calculates the Fractional Part
        for (int j = 0; j < last_index_of(input, TERMINATOR); j++) {
                if (j == last_index_of) {
                        fraction = NUMBER_ONE/(pow(NUMBER_TWO, exponent));
                        printf("%d/n", fraction);
                }
                else {
                        fraction = NUMBER_ONE/(pow(NUMBER_TWO, exponent));
                        printf("%d + ", fraction);
                        exponent--;
                }
        }

        return 0;

}

1 Ответ

0 голосов
/ 03 октября 2018

Некоторые проблемы:

  • вам нужна опция -lm для компоновщика, чтобы сообщить ему, где найти pow функция
  • last_index_of написана неправильно,вы используете имя функции как внутреннюю переменную, вы можете исправить это следующим образом:

    //Code to find the index of where the string ends
    int last_index_of(char in_str[], char ch) {
        int ret = 0;
        for (int i = 0; i < MAX_LENGTH; i++) {
            if(in_str[i] == ch) {
                ret = i;
            }
        }
        return ret;
    }
    

    Обратите внимание, что вы можете заменить вашу last_index_of() функцию на strlen()

  • как указано в комментарии, sub_string() не является функциональным.Исправленная версия может быть:

    //Code to find the start of the fractional aspect
    void sub_string(char in_str[], char out_str[], int start, int end){
        int i = 0;
        while (start != end) {
            /* warning, bounds are still not tested...*/
            out_str[i++] = in_str[start++];            
        }
        out_str[i] = '\0'
    }
    
  • Вместо вызова last_index_of() в вашем существующем for условии цикла, вы должны принять его значение, чтобы использовать его снова:

    for (int j = 0; j < last_index_of(input, TERMINATOR); j++) {
        /* Error here: will never be TRUE */
        if (j == last_index_of) {
            /* ... */   
        }
        else {
            /* ... */   
        }
    }
    

    станет:

    int last_index = last_index_of(input, TERMINATOR);
    for (int j = 0; j < last_index; j++) {
        if (j == last_index) {
            /* ... */   
        }
        else {
            /* ... */   
        }
    }
    
  • Другая проблема, вы используете переменную number без ее инициализации, вы должны написать int number = 0 вместо int number;


После этого также возникает проблема с вашей логикой.

У вас есть представление о том, что вы хотите сделать, но это неясно в вашем коде.

Похоже, вы хотите

  • , чтобы пользователь ввел некоторую строку в виде 10010.100111
  • , чтобы разбить эту строку на две части 10010 и100111
  • для преобразования первой части в целочисленную часть 10010 -> 18
  • для преобразования второй части в дробную часть 100111 -> 0.609...

Эта декомпозиция может привести к написанию кода такого типа:

#include "stdio.h"
#include "string.h"

#define MAX_BITS 32
#define MAX_LENGTH 49

//Code to find the index of where the string ends
int last_index_of(char in_str[], char ch)
{
    int ret = 0;
    for (int i = 0; i < MAX_LENGTH; i++) {
        if (in_str[i] == ch) {
            ret = i;
        }
    }
    return ret;
}

void sub_string(char in_str[], char out_str[], int start, int end)
{
    int i = 0;
    while (start != end) {
        /* warning, bounds are still not tested... */
        out_str[i++] = in_str[start++];
    }
    out_str[i] = '\0';
}

void split(char *input, char *first, char *second)
{
    int idx = last_index_of(input, '.');

    sub_string(input, first, 0, idx);

    sub_string(input, second, idx + 1, strlen(input));

}

int main()
{
    //Declaration of variable
    char input[MAX_LENGTH + 1]; // +1 for '\0'
    char first[MAX_BITS];
    char second[MAX_BITS];

    /* Input from the user */
    printf("Enter a floating point value in binary: ");
    scanf("%s", input);

    /* split integer and fractionnal parts */
    split(input, first, second);

    /* decode integer part */
    printf("integer part:\n");
    for (int i = strlen(first) - 1, j = 1; i > -1; --i, j <<= 1) {
        if (first[i] == '1') {
            printf("%d ", j);
        }
    }

    /* decode frac part */
    printf("\nfractionnal part:\n");
    for (int i = 0; i < strlen(second); ++i) {
        if (second[i] == '1') {
            printf("1/%d ", 2 << i);
        }
    }

    return 0;
}
...