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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> массив в СИ как инициализировать вылетает компилят 
:(
    Опции темы
XYZ010
Дата 26.10.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот некая функция которой передается одно строчный массив с читаный из файла массив выглядит так а=a \nб=b\nв=v\n ...размер не известен. Функция записывает этот массив в двух мерный массив типа [0] a=a [1] б=b [2] в=v ...ну или должна записывать в main объявляется массив char** , выделяется память малоком . короче не работает подскажите что делать а?

Код
int array_chars(char*aray_file,char**buf)
{
        int i=0,len=0,lenf=0;
        do
        {
                len = strcspn(aray_file,"\n");
                lenf=strlen(aray_file);
                if (len!=lenf)
                {
                        strncpy(buf[i],aray_file,len);
                        if (len<3,aray_file[0]!='\n'&&strchr(buf[i],'=')==NULL)
                        {
                                printf("\nerror str  %d ",i+1);
                                if (!getch()) getch();
                                exit(2);
                        }
                }
                else buf[i]=aray_file;
                buf[i][len]=0;
                aray_file=strchr(aray_file,'\n')+1;
                i++;
        }

        while (aray_file[0]!=0);
        free(buf);
        return i-1;
}



Модератор: Не забываем пользоваться кнопочкой "Код"

Это сообщение отредактировал(а) XYZ010 - 26.10.2009, 20:03
PM MAIL   Вверх
bsa
Дата 26.10.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



ты уверен, что первый символ aray_file будет не '\0'?
А где собственно main()? В частности, хотелось бы узнать, как ты память выделяешь.
Что говорит компилятор? На какую строку ругается?
PM   Вверх
XYZ010
Дата 26.10.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



нет первый символ не ноль я уверен. И даже цикл какое то количество раз прокручиваться а потом просто компилятор вылетает заканчивает работу аварийно просто  закрывается и все.
вот main

Код

void main()
{
        char*buf_arr=NULL;  buf_arr=(char*)malloc(512);
        char**buf_char=NULL;   buf_char=(char**)malloc(512); //здесь выделяется память
         
        int c=aray_param(buf_arr); // это функция чтения файла она записывает в массив buf_arr 
 //строку из файла при чем если распечатать массив buf_arr то он нормальна печатается принтэфом 
        
        int cc=array_chars(buf_arr,buf_char); //передача массива buf_arr и buf_char в функцию
        printf ("\n%d %s\n ",cc,buf_char[3]); //ну это я экспериментировал
         int ss=0;
        do{
                printf("%s ",buf_char[ss]);
                ss++;
        }
        while(ss!=cc);
        free(buf_arr);free(buf_char);
        if (!getch()) getch();
}


Это сообщение отредактировал(а) XYZ010 - 26.10.2009, 19:14
PM MAIL   Вверх
XYZ010
Дата 26.10.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



чет ни кто ни отвечает 
PM MAIL   Вверх
Anikmar
Дата 26.10.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(XYZ010 @  26.10.2009,  18:10 Найти цитируемый пост)
buf_char=(char**)malloc(512); //здесь выделяется память

Под что выделяется? Чтобы потом с ней работать так?

Цитата(XYZ010 @  26.10.2009,  17:19 Найти цитируемый пост)
strncpy(buf[i],aray_file,len);


Я не увидел инициализацию этого массива.
PM MAIL ICQ   Вверх
bsa
Дата 27.10.2009, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



XYZ010, не путай понятия "компилятор" и "откомпилированная программа". Так как если падает компилятор, то твоя программа даже не запустится, так как не будет создано *.exe файла.
Кстати, пошаговая отладка помогает решить подобные проблемы.
PM   Вверх
XYZ010
Дата 27.10.2009, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @ 27.10.2009,  00:02)
XYZ010, не путай понятия "компилятор" и "откомпилированная программа". Так как если падает компилятор, то твоя программа даже не запустится, так как не будет создано *.exe файла.
Кстати, пошаговая отладка помогает решить подобные проблемы.

Ну может я не правильно сформулировал.
Просто когда запускаешь программу из оболочки оболочка падает в месте с программой 
Вот я и не могу понять в чем проблема именно когда  отлаживаю пошагово. Программа точь но так же вылетает. Во время цикла. На том шаге на котором вылетает программа память почему то не выделяется ну или может и выделяется но строка в нее не записывается и в место обычного мусора в памяти какие то символы одинаковые '255'.
PM MAIL   Вверх
XYZ010
Дата 27.10.2009, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Anikmar @ 26.10.2009,  22:20)
Цитата(XYZ010 @  26.10.2009,  18:10 Найти цитируемый пост)
buf_char=(char**)malloc(512); //здесь выделяется память

Под что выделяется? Чтобы потом с ней работать так?.

 именно так

Цитата
Цитата(XYZ010 @  26.10.2009,  17:19 Найти цитируемый пост)
strncpy(buf[i],aray_file,len);


Я не увидел инициализацию этого массива.

Функция strncpy копирует len первых символов из массива aray_file в массив buf[i] который обьявлен в мейне вот это собственно и инициализация или я что то не правильно понимаю.


Это сообщение отредактировал(а) XYZ010 - 27.10.2009, 07:02
PM MAIL   Вверх
bsa
Дата 27.10.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



XYZ010, ты знаешь, что sizeof(char*) != sizeof(char)? Более того, sizeof(char*) может быть 2, 4 или 8, а sizeof(char) всегда 1. Таким образом, выделяя память на 512 char'ов (а malloc(512) именно это и делает), ты можешь получить 256, 128 или 64 указателей... Чтобы проблем не было, надо делать так: 
Код
char **buffer = (char**)malloc(sizeof(*buffer) * 512);
что позволит тебе быть ВСЕГДА уверенным, что памяти выделится ровно под 512 указателей.
PM   Вверх
xvr
Дата 27.10.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(XYZ010 @ 27.10.2009,  06:59)
Цитата
Цитата(XYZ010 @  26.10.2009,  17:19 Найти цитируемый пост)
strncpy(buf[i],aray_file,len);

Я не увидел инициализацию этого массива.

Функция strncpy копирует len первых символов из массива aray_file в массив buf[i] который обьявлен в мейне вот это собственно и инициализация или я что то не правильно понимаю.

Неправильно. Функция strncpy НЕ ВЫДЕЛЯЕТ память для копируемой строки. Ты ее то же не выделяешь  smile Для каждого buf[i] нужно так же сделать malloc
Код

for(i=0;i<512;++i) buf[i]=malloc(512);
Да и строки 24-25 в array_chars просто отпад
Код

       while (aray_file[0]!=0);
        free(buf);
первая повесит программу, если aray_file[0] вдруг случится быть не нулевым, вторая гарантирует падение программы на таком же free, но уже в main (строка 17)

Еще совет - открой для себя функцию strtok - твоя array_chars запишется в 3 строки  smile 

PM MAIL   Вверх
XYZ010
Дата 27.10.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ребя спасибо все исправил многому наулился особая благодарность господину Хvr вот такая у меня функция получилась 
Код

nt array_chars(char*aray_file,char**buf)
{
        int in=0;
        buf[in]=strtok(aray_file,"\n");
        while (buf[in]!=NULL)
        {
                in++;
                buf[in]=strtok(NULL,"\n");
        }
        return in;
}

а вот обьявление  и инициализация массива
Код

char**buf_char=NULL;

        int c=aray_param(buf_arr);
        buf_char=(char**)malloc(sizeof(*buf_char)*c);
        for (i=0;i<c;++i)
        {
            buf_char[i]=(char*)malloc(64);
        }

PM MAIL   Вверх
xvr
Дата 27.10.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



При реализации через strtok выделять память для buf[i] не надо - strtok нарезает ИСХОДНУЮ строку и в buf[i] складываются указатели на части aray_file

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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