Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при работе с динамической памятью, Обращение, посредством sscanf 
V
    Опции темы
Anark1
Дата 3.3.2010, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

Репутация: нет
Всего: 11



Здравствуйте,
такая подзадача - считать из файла данные построчно и записать в массив строк в динамическую память (число строк около 150 000), а затем преобразовать этот массив строк в массив структур.
Уже измучался, какие-то непонятные ошибки, вылетающие в разных местах. По всей вероятности, или память как-то криво выделяется, или я где-то её запортил.
Сам код:

Код

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#define SECTION_SIZE 5000 //Размер одной секции, при исчерпании которой происходит realloc с увеличением места на еще одну секцию
#define ID_SECTION_SIZE 3000 
#define STR_LIMIT 300

//структуры для внутреннего представления данных
typedef struct
{
    int year;
    int month;
    int day;
} date;


typedef struct 
{
    char fam[15];
    char name[15];
    char otch[15];
    char s;
    date * dat;
    char town[15];
    int group;
    int marks[50];
} student;

//функция построчного чтения данных из файла
int ReadStrings(char * path, char *** StringList, long * count)
{
    FILE * f;
    long i;
    char line[STR_LIMIT], *temp;
    if (!(f = fopen(path,"r"))) return 1;
    i = 0;
    temp = (char*)malloc(sizeof(char)*STR_LIMIT);    
    while(fgets(temp,STR_LIMIT,f))
    {    
        if (i == *count)
        {
                        //при исчерпании секции, происходит реаллок с увеличением места на одну секцию
            *StringList = (char **)realloc(*StringList,sizeof(char**)*(*count+SECTION_SIZE));
            *count+=SECTION_SIZE;
        }
        *(*StringList+i) = temp;
        temp = (char*)malloc(sizeof(char)*STR_LIMIT);
        i++;
    }
    *count = i;
    fclose(f);
}

//функция создания массива структур
void StringsToStructs(char ** StringList,student ** students, long count)
{
    student * stud;
    int i, k;
    long num;
    char _date[20];
    for (num=0;num<count;num++)
    {
        stud = (student *)malloc(sizeof(student));
        i = 0;
        sscanf(StringList[num]+i,"%s",stud->fam);        i+=strlen(stud->fam);
        sscanf(StringList[num]+i,"%s",stud->name);        i+=strlen(stud->name);
        sscanf(StringList[num]+i,"%s",stud->otch);        i+=strlen(stud->otch); 
        stud->s = StringList[num][i]; i+=2;
        sscanf(StringList[num]+i,"%s",_date);        i+=strlen(_date); //Ошибка вот тут
        stud->dat = GetDateFromStr(_date);
        sscanf(StringList[num]+i,"%s",stud->town);        i+=strlen(stud->town);
        free(StringList[num]);
        for (k=0;k<50;k++)
        {
            sscanf(StringList[num]+i,"%d",stud->marks[k]);        
            i++; 
        }

        students[num] = stud;
    }
    free(StringList);
}

int main (int argc, char ** argv)
{
char ** StringList;
long count = SECTION_SIZE, ids_count = ID_SECTION_SIZE;
char * path = "Students.DB";
student ** students;
id_bal ** ids;
av_date * av_age;
double time1, time2;

StringList = (char **)malloc(sizeof(char *) * SECTION_SIZE);
ReadStrings(path, &StringList, &count);
students = (student **)malloc(sizeof(student*)*count);
StringsToStructs(StringList, students, count);    
return 0;
}


функция GetDateFromStr(date *) тоже моя, но её смысла указывать наверное нет, она из строки выделяет 3 числа и записывает в нужную структуру.
Еще важно сказать, что когда я нажал "отладить при помощи MS VS", то ошибка, которую я там увидел - "Необработанное исключение, нарушение прав доступа в 0x000000". Это как минимум странно.
Также гарантируется, что 15 символов, выделяемых в структуре для фамилии, имени и прочего хватит на размещение там данных.
Компилятор tcc.
Заранее спасибо.


Это сообщение отредактировал(а) Anark1 - 3.3.2010, 18:52


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
Albor
Дата 4.3.2010, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: нет
Всего: 9



Указатели нужно проверять после выделения паммяти.
PM MAIL ICQ   Вверх
Anark1
Дата 4.3.2010, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

Репутация: нет
Всего: 11



Вчера вечером потерял остатки разума, а сегодня вновь их обрел. Проблема во free и возможно некорректном использовании  sscanf.



--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
Albor
Дата 4.3.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: нет
Всего: 9



Anark1, ткните пальцем почему free проблемная? У вас память выделяется в цикле, если в какой-то момент указатель получит NULL, то проблема будет где угодно, где этот указатель используется
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.