Необоснованная ошибка вызова функции на C - программа для сортировки массива - PullRequest
0 голосов
/ 14 апреля 2011

Я написал программу, которая получает от пользователя серию чисел (<= 20), в то время как последний «0» означает конец серии (не включается в сохранение серии). 2 массива (x, y) размером 20 (0-19 + 1 для '0') должны быть нулями, а m означает количество органов в массиве Y. </p>

Пользователь должен ввести числа по возрастанию (все в порядке 4ex. 1,2,2,3,7,8, ..., 0) и, конечно, завершить цифрой «0», если нет, появится соответствующее сообщение об ошибке. появится, и программа отключится.

Мы можем быть уверены, что пользователь сохранит <= 20 чисел ввода. </p>

Массив Y будет (если все было в порядке с массивом X) отсортированным массивом X, но без дубликатов. 'm' будет числом органов в Y, за исключением, конечно, '0'.

Функция SIFT должна организовывать массив Y только для печати из main ().

Пример:

Если пользователь будет хранить в X: 1,1,2,3,5,5,5,6

На экране появится: m = 5 Y = 1,2,3,5,6

Моя проба:

#include <stdio.h>
#include <string.h>

void SIFT(int x_arr[ ], int y_arr[]);

int main ()
{
    int x[20] = {0} , y[20] = {0};
    int m=0,temp=0,curr=0,i=0,j=0;

    printf("Please enter your numbers now:\n\n");

    /*enter numbers one by one. if x[i+1] value < x[i] value, err msg.
      when user want to end the series he must enter '0' which means end of string (it wont       included in x[]) */
    while ( ( temp = getchar() ) != '0' )
    {
        if (temp >= curr)
        {
            x[i] = temp;
            curr = temp;
            i++;
        }
        else
        {
            printf("The numbers are not at the right order !\n\nProgram will now terminate...\n\n");
        }
    }

    SIFT(x,y);

    for (i=0 ; y[i]=='0' ; i++) /*strlen(y) without ('0')'s includes*/
        m++;

    /*Prints  m , y's organs*/
    printf("\n\nm = %d",m);
    printf("Y = ");
    while (y[j]!='0')
    {
        printf ("%d ,",y[j]);
        j++;
    }

void SIFT(int x_arr[ ], int y_arr[])
{
    int i=0,j=0;

    while (x_arr[i] != '0')
    {
        if (x_arr[i] == x_arr[i+1]) /*if current val. equals next val. -> jump dbl at x_arr*/
        {
            y_arr[j] = x_arr[i];
            i+=2;
            j++;
        }
        else
        {
            y_arr[j]=x_arr[i];
            i++;
            j++;
        }
    }    

}

return 0;
}

Ошибка, которую я получаю от gcc:

gcc -g -ansi -pedantic -Wall 2.c -o 2   
2.c: In function ‘main’:
2.c:43: warning: ISO C forbids nested functions
2.c:43: warning: ISO C90 forbids mixed declarations and code
/tmp/ccyZNfkF.o: In function `main':
/home/student/Desktop/2/2.c:29: undefined reference to `SIFT'
collect2: ld returned 1 exit status
make: *** [2] Error 1

И еще вопрос:

Я хотел бы преобразовать этот код в код сборки MIPS, есть ли короткий и быстрый способ сделать это?

Спасибо всем вам, ребята !!

1 Ответ

2 голосов
/ 14 апреля 2011

Вы не закрыли основную функцию до объявления SIFT, поэтому SIFT объявляется внутри main, что запрещено.

Исправьте это, вернувшись из main перед определением SIFT():

...
return 0;
}

void SIFT(int x_arr[ ], int y_arr[])
{
    int i=0,j=0;
...
...