Распределение - указатель на указатель - PullRequest
0 голосов
/ 21 ноября 2010

Я хотел бы попросить помощи в распределении .... Я получил эту домашнюю работу в школу ... Мне нужно написать программу, которая будет загружать одну G-матрицу и вторую G-матрицу и будет искать вторую G-матрицу для определения количества присутствующих.первой матрицы G .... Но, когда я пытаюсь запустить свою программу, я получаю сообщение об ошибке сегментации ... Заранее спасибо.Пример того, как программа должна работать ....

...

Введите количество строк требуемой матрицы g: 3 Введите требуемую матрицу g:
121212
Матрица 212121
121212
G для поиска:
12121212121212
21212121212121
12121212123212
21212121212121
12121212121212
G матрица найдена 8 раз.

...

это мой код:

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


char * get_line(void) // get line
{
    char * string;
    if((string = (char *)malloc(100 * sizeof(char))) == NULL)
    {
        printf("Nedostatek pameti.\n"); // not enough memory
        exit(1);
    }
    int i = 0;
    while((string[i] = fgetc(stdin)) != '\n')
    {
        i++;
        if((i % 100) == 0)
        {
            if((string = (char *)realloc(string, 100 * ( i - 1 ) * sizeof(char))) == NULL)
            {
                printf("Nedostatek pameti.\n"); // not enough memory
                exit(1);
            }
        }
    }
    return ( string );
}

char ** get_wanted_g_matrix(int pocetradek /*number of lines*/) // get wanted g matrix
{
    char ** string;
    printf("Zadejte hledanou matici:\n");
    int i = 0;
    if(( * string = (char ** )malloc(100 * sizeof(char *))) == NULL)
    {
        printf("Nedostatek pameti.\n"); // not enough memory
        exit(1);
    }
    while(i <= (pocetradek - 1))
    {
        string[i] = get_line();
        if((i > 1) && (*string[i-1] != strlen(*string[i])))
        {
               printf("Nespravny vstup.\n"); // not enough memory
               exit(1);
        }
        printf("%s", string[i]);
        i++;
        if((i % 100) == 0)
        {
            if((* string = (char **)realloc(* string, 100 * ( i - 1 ) * sizeof(char *))) == NULL)
            {
                printf("Nedostatek pameti.\n"); // not enough memory
                exit(1);
            }
        }
    }
    return (string);
}

int get_number_of_lines(void) // get number of lines
{
    int number_of_lines;
    printf("Zadejte pocet radek hledane matice:\n"); // enter the number of lines of wanted g matrix
    if(scanf("%d", &number_of_lines) != 1)
    {
        printf("Nespravny vstup.\n"); // Error
        exit(1);
    }
    return ( number_of_lines );
}

char ** get_searched_g_matrix(void) // get wanted g matrix
{
    char ** string;
    printf("Matice, ktera bude prohledana:\n"); // G matrix to be searched
    int i = 0;
    if(( * string = (char ** )malloc(100 * sizeof(char *))) == NULL)
    {
        printf("Nedostatek pameti.\n"); // not enough memory
        exit(1);
    }
    while(!feof(stdin))
    {
        string[i] = get_line();
        if((i > 1) && (*string[i-1] != strlen(*string[i])))
        {
               printf("Nespravny vstup.\n"); // error
               exit(1);
        }
        printf("%s", string[i]);
        i++;
        if((i % 100) == 0)
        {
            if((* string = (char **)realloc(* string, 100 * ( i - 1 ) * sizeof(char *))) == NULL)
            {
                printf("Nedostatek pameti.\n"); // not enough memory
                exit(1);
            }
        }
    }
    if(feof(stdin))
    {
    return string;
    }
}
int search( char ** string1, char ** string2 ) // search
{
    int string1width = strlen(*string1[0]);
    int string2width = strlen(*string2[0]);
    int string2height = strlen(**string2);
    int number_of_lines = get_number_of_lines();
    unsigned int g = 0, h = 0, i2, j2, l = 0, i = 0, j;
            while( i <= (string2height - 2) )
            {
                j = 0;
                while( j <= string2width - 2 )
                {
                    g = 0; h = 0;
                    if(string2[i][j] == string1[g][h])
                    {
                        i2 = i;
                        while((g <= number_of_lines - 1) && (i2 <= string2height - 2))
                        {
                            j2 = j; h = 1;
                            while(((string2[i2][j2] == string1[g][h]) && (j2 <= string2height - 2)) && (h <= string1width - 2))
                            {
                                j2++;
                                h++;
                            }
                            if(h != string1width - 1)
                            {
                                break;
                            }
                            if(g == number_of_lines - 1)
                            {
                                l++;
                                break;
                            }
                            i2++;
                            g++;
                        }
                    }
                    j++;
                }
                i++;
            }
            return ( l );
}

int main(void)
{
    char ** string1;
    char ** string2;
    int number_of_lines = get_number_of_lines();
    string1 = get_wanted_g_matrix(number_of_lines);
    string2 = get_searched_g_matrix();

    if(feof(stdin))
    {
                printf("Matice nalezena %d krat.\n", search( ** string1, **string2 )); // G matrix found %d times.
    }

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 21 ноября 2010

В этом коде:

char ** get_wanted_g_matrix(int pocetradek /*number of lines*/) // get wanted g matrix
{
    char ** string;
    printf("Zadejte hledanou matici:\n");
    int i = 0;
    if(( * string = (char ** )malloc(100 * sizeof(char *))) == NULL)

Вы разыменовываете string, но оно не инициализировано, поэтому вы пишете в произвольное место в памяти. Измените это * string на string. То же самое относится и здесь:

if((* string = (char **)realloc(* string, 100 * ( i - 1 ) * sizeof(char *))) == NULL)

.. и соответствующим строкам в get_searched_g_matrix().

В этой строке:

    if((i > 1) && (*string[i-1] != strlen(*string[i])))

Вы передаете char на strlen(), когда вы должны передавать char *. Я подозреваю, что вы имеете в виду только strlen(string[i]), но эта строка кажется несколько бессмысленной. Та же проблема и в get_searched_g_matrix(), и в первых трех вызовах strlen() в search().

Ваш get_searched_g_matrix() может упасть с конца без возврата значения - вам нужно подумать, что возвращать, если feof(stdin) не соответствует действительности.

В main() ваш вызов search() передает char значения, но функция ожидает char **. Вы, вероятно, имеете в виду:

printf("Matice nalezena %d krat.\n", search( string1, string2 ));

(Вышеприведенного недостаточно для исправления вашего кода - у вас, похоже, есть некоторые логические проблемы. Но это необходимое начало.)

В будущем вы должны скомпилировать свой код с включенным более высоким уровнем предупреждений, а затем исправить проблемы, которые определяет компилятор (если вы используете gcc, скомпилируйте с -Wall).

1 голос
/ 21 ноября 2010

Просто некоторые комментарии и советы по стилю:

Я бы сказал, что он достаточно большой для того, что он должен делать (и трудно следовать), попробуйте немного упростить его.

1) Сохранение вертикального пространства, у большинства людей в настоящее время широкие экраны, и это довольно раздражает, когда вы не видите соответствующую закрывающую скобку.

1.1) Очень хорошо, что вы проверяете на наличие ошибокусловия, но попробуйте использовать что-то вроде

void err(const char* msg){
    printf("\n\nFATAL ERROR: %s\n", msg);
    exit(1);
};

, чтобы вы могли сделать

if (!(x = malloc(sz))) 
    err("Not enough memory!");

1.2) Хотя считается безопаснее использовать скобки для оператора signle в if, ярекомендую избегать их, когда это возможно, или, по крайней мере, использовать меньше новых строк.Скобки предназначены для компилятора, люди предпочитают вкладки.

2) В вашей функции search есть несколько операторов while, которые должны быть записаны как for s.

3) Зачем вам нужны две разные функции для чтения матриц?Одного было бы достаточно.

4) Как указал @caf, у вас также есть ошибки в функциях ввода.Проверьте каждую функцию, прежде чем идти дальше.Требуется многолетний опыт, прежде чем вы сможете написать всю программу сразу.

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