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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> strtok и new, процесс завершается по сигналу 11 
:(
    Опции темы
День
Дата 28.11.2005, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



привет всем.
Есть такой код

Код

int main(int arc, char **argv)
{
    MainFunc();
    return 0;
}

void MainFunc()
{
    int pid;
    if ((pid = fork()) == -1)
    {
        printf("err: Fork");
        return;
    }
    if (pid == 0)
        ...
        split(....);
        ...
    else
    {
        wait(&status) и проверка кода завершения
    }
}



int split (char* massive[], int massive_size, char* str, char* delim)
{
    int j = 0;
    char *workstr = new char [strlen (str) + 1];
    char *temp;
    bzero (workstr, strlen (str) + 1);
    strcpy (workstr, str);
    temp = workstr;
    char *token = strtok (temp, delim);

    while ((token != NULL) && (j < massive_size))
    {
        massive [j] = new char [strlen (token)+1];
        if (long (massive[j]) == 0)
        {
            printf("err: Memory %d\n",strlen(token)+1);
            delete workstr;
            return -1;
        }
        bzero (massive [j], strlen(token)+1);
        strcpy (massive [j], token);
        printf("!%s!\n", massive [j]);
        j++;
        
        token = strtok (NULL, delim);
    }
    delete workstr;

    return j;
}


дочерний процесс завершается с кодом 0 по сигналу 11 - ошибка обращения к памяти.
дочерний процесс только один

где у меня косяк?
Я еще неопытен, потому прошу ногами больно не бить, если что smile

буду рад любому мнению по поводу кода.
PM MAIL   Вверх
comcon1
Дата 30.11.2005, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



Не разбирался, но скажу - strtok коряво реализована во многих *NIX-ах. У меня в ман-е написано:
Код

BUGS
       Never use these functions. If you do, note that:

              These functions modify their first argument.

              These functions cannot be used on constant strings.

              The identity of the delimiting character is lost.

              The strtok() function uses a static  buffer  while  parsing,  so
              it's not thread safe. Use strtok_r() if this matters to you.


Удачи!

Юзай boost::tokenizer. Могу кинуть пример, если будет желание.


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


Новичок



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

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



Цитата(comcon1 @ 30.11.2005, 19:21)
strtok коряво реализована во многих *NIX-ах

не корректно так говорить -она реализована во-первых везде одинаково, а во-вторых не-коряво(насколько это и должно быть)
просто она НЕ дла многопоточных приложений
в многопоточных исользуют strtok_r которой если память не изменяет(лень лазить в man) надо передовать доп буфер (для её жизнедеятельности)

PM MAIL   Вверх
День
Дата 7.12.2005, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не поверите smile
поменял new на malloc и ошибка исчезла!
Когда стал тестировать программу на нескольких дочерних процессах, переписал strtok на strtok_r - и все ОК.

подскажите boost на каких условиях распространяется и где ее можно скачать?
PM MAIL   Вверх
AndrK
Дата 13.7.2006, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



При выделении массива с помощью new, он должен удаляться как массив, а не как динамическая переменная...

char* buff=new char[10];
//... что-то делаем ...
delete[] buff;

Обрати внимание на последнюю строку... именно delete[], а не delete...

З.Ы.
Но это не должно давать ошибку обращения к памяти (хотя возможно я ошибаюсь),
это просто первое что бросилось в глаза, если это пренципиально, то пройдись дебагером,
узнаешь где прога вылетает... 
PM MAIL   Вверх
bsa
Дата 14.7.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(День @ 7.12.2005,  21:36)
подскажите boost на каких условиях распространяется и где ее можно скачать?

http://www.boost.org/LICENSE_1_0.txt 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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