Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6302
Последний выпуск: 19.06.2015

вылет программы

74K
20 марта 2012 года
PupSeeK
7 / / 05.12.2011
Доброго времени суток. Возник вопрос по коду.Есть матрица произвольной размерности и надо её считать в массив. При этом,длина строки должна быть максимальной. при нехватке элементов строки производится забивание недостающих элементов нулями. вылет происходит на строке
 
Код:
memset(mass2, 0, sizeof(size));

ниже приведен полный код программы:


Код:
#include <stdlib.h>
#include <stdio.h>

int main()
{
    char* fName;
    FILE* pFile;
    char* bufer;
    int i=0;
    int i_prew=0;//predidush'ee znacheniye i
    int i_max=0;//dlya max dliny stroki
    int i_max_final=0;//final max dlina stroki massiva
    int nl=0, nw=0, flag=0;
    char* endptr;
    char* bseek;
    int element, currow, curcol;
    int j=0;
    int l=0;
    int osn_avt;
    int q;
    int m=0;
    int size=0;
    int ** mass2 = (int **)calloc(nl, sizeof(int*));
         for(i = 0; i < nl; i++)

            {mass2 = (int *)calloc(i_max_final, sizeof(int));}


    if((fName=(char*)malloc(256))==NULL)
        {
            printf("\n!Error into malloc!\n");
            return 0;
        }
    printf("Input name of file: "); scanf("%s", fName);
    if((pFile=fopen(fName, "rt"))==NULL)
    {
        printf("\n!Error into the file name!\n");
        free(fName);
        return 0;
    }



    fseek(pFile, 0, SEEK_END);
    if((bufer=(char*)malloc(ftell(pFile)+1))==NULL)
    {
        printf("\n!Error into malloc!\n");
        fclose(pFile);
        return 0;
    }
    fseek(pFile, 0, SEEK_SET);
    while((bufer=getc(pFile))!=EOF) i++;
        fclose(pFile);
        i=0;
    while(1)
    {
        if(bufer=='\n' || bufer==EOF)
        {
            nl++;
            i_max=i-i_prew;
            if(i_max>i_max_final)
            {
              i_max_final=i_max;//poluchaem max dlinu stroki
            }
        }

        if(bufer==EOF) break;
        if(bufer==' ' || bufer=='\n' || bufer=='\t') flag=0;
        else if(flag==0)
                {
                flag=1;
                nw++;
                }
        i++;
    }
    printf("Strok:\t%d\n Chisel v matritse:\t%d\n", nl, nw);
    //-----------------------------first block ended
        size=sizeof(int)*nl*i_max_final;
        memset(mass2, 0, sizeof(size));
        for(i=0;i<nl;i++)
    {
        for(j=0;j<i_max_final;j++)
        {
            printf("\t%d",mass2[j]);
        }
        printf("\n");}


    bseek = bufer;
    currow = curcol = 0;
    while(1)
{
        element = strtol(bseek, &endptr, 0);
        if( endptr == bseek )
        break; //parsing finished
        mass2[currow][curcol++]=element;
    //put_element_to_matrix(element, currow, curcol++);
        if(*endptr == '\0')
        break; //parsing finished
        if( *endptr == '\n' || *endptr == '\r' )
        currow=currow+1;
        bseek = endptr + 1;
}
    free(bufer);
    for(i=0;i<nl;i++)
    {
        for(j=0;j<i_max_final;j++)
        {
            printf("\t%d",mass2[j]);
        }
        printf("\n");
    }

    //----------------------------------------second block ended




    }

заранее спасибо.
9
20 марта 2012 года
Lerkin
3.0K / / 25.03.2003
1. Ты передаешь размер, равный sizeof(int), т.е. 4 байта
 
Код:
memset(mass2, 0, size);

Но, ни в этом дело. Ты с выделениями памяти намудрил.
74K
20 марта 2012 года
PupSeeK
7 / / 05.12.2011
полностью согласен.переделал. но матрица не обнуляется, и того хуже,не заполняется. Возникло еще 2 вопроса:почему неправильно определяется i_max_final и как правильно написать memset для mass2? вот "исправленный" код


Код:
#include <stdlib.h>
#include <stdio.h>

int main()
{
    char* fName;
    FILE* pFile;
    char* bufer;
    int i=0;
    int i_prew=0;//predidush'ee znacheniye i
    int i_max=0;//dlya max dliny stroki
    int i_max_final=0;//final max dlina stroki massiva
    int nl=0, nw=0, flag=0;
    char* endptr;
    char* bseek;
    int element, currow, curcol;
    int j=0;
    int l=0;
    int osn_avt;
    int q;
    int m=0;
    int size=0;
    int *mass2;
    mass2=(int*)malloc(nl*i_max_final*sizeof(int));
    /*int ** mass2 = (int **)calloc(nl, sizeof(int*));
         for(i = 0; i < nl; i++)

            {mass2 = (int *)calloc(i_max_final, sizeof(int));}*/

    if((fName=(char*)malloc(256))==NULL)
        {
            printf("\n!Error into malloc!\n");
            return 0;
        }
    printf("Input name of file: "); scanf("%s", fName);
    if((pFile=fopen(fName, "rt"))==NULL)
    {
        printf("\n!Error into the file name!\n");
        free(fName);
        return 0;
    }



    fseek(pFile, 0, SEEK_END);
    if((bufer=(char*)malloc(ftell(pFile)+1))==NULL)
    {
        printf("\n!Error into malloc!\n");
        fclose(pFile);
        return 0;
    }
    fseek(pFile, 0, SEEK_SET);
    while((bufer=getc(pFile))!=EOF) i++;
        fclose(pFile);
        i=0;
    while(1)
    {
        if(bufer=='\n' || bufer==EOF)
        {
            nl++;
        }
        if(bufer==EOF) break;
        if(bufer==' ' || bufer=='\n' || bufer=='\t') flag=0;
        else if(flag==0)
                {
                flag=1;
                nw++;
                }
        i++;
    }
    i=0;
    while(1)
    {
        if(bufer=='\n')
        {
            i_max=i-i_prew;
            i_prew=i;
            if(i_max>i_max_final)
            {
              i_max_final=i_max;//poluchaem max dlinu stroki
            }
        }
        if(bufer==EOF) break;
        i++;
        printf("\n%d",i_max_final);
    }

    printf("Strok:\t%d\n Chisel v matritse:\t%d\n", nl, nw);
    //-----------------------------first block ended
        size=sizeof(int)*nl*i_max_final;
        memset(mass2, 0, sizeof(size));
        for(i=0;i<nl;i++)
    {
        for(j=0;j<i_max_final;j++)
        {
            printf("\t%d",mass2[i*i_max_final+j]);
        }
        printf("\n");}
        printf("\n");
        printf("\n");

    bseek = bufer;
    currow = curcol = 0;
    while(1)
{
        element = strtol(bseek, &endptr, 0);
        if( endptr == bseek )
        break; //parsing finished
        mass2[currow*i_max_final+curcol+1]=element;
    //put_element_to_matrix(element, currow, curcol++);
        if(*endptr == '\0')
        break; //parsing finished
        if( *endptr == '\n' || *endptr == '\r' )
        currow=currow+1;
        bseek = endptr + 1;
}
    free(bufer);
    for(i=0;i<nl;i++)
    {
        for(j=0;j<i_max_final;j++)
        {
            printf("\t%d",mass2[i*i_max_final+j]);
        }
        printf("\n");
    }

    //----------------------------------------second block ended




    }
9
20 марта 2012 года
Lerkin
3.0K / / 25.03.2003
Ну посмотрите внимательно:
 
Код:
int i_max_final=0;//final max dlina stroki massiva
int nl=0, nw=0, flag=0;
...
int *mass2;
mass2=(int*)malloc(nl*i_max_final*sizeof(int));

как вы думаете, сколько байт выделит malloc, если перемножить: 0 * 0 * 4 = ???
74K
20 марта 2012 года
PupSeeK
7 / / 05.12.2011
http://www.uchi-it.ru/7/9/10.html я думаю примерно так. ввиду того,что массив индексируется и выводится после memsetосновная проблема возникает при запуске функции strtol
9
21 марта 2012 года
Lerkin
3.0K / / 25.03.2003
Цитата: PupSeeK
http://www.uchi-it.ru/7/9/10.html я думаю примерно так. ввиду того,что массив индексируется и выводится после memset основная проблема возникает при запуске функции strtol


Ну, что же. Ваша воля.

Я умываю руки. /(с) Понтий Пилат

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог