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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Убрать обрезание по ноль символу 
:(
    Опции темы
Xaotuk
Дата 8.4.2009, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема: необходимо обрабатывать массив байт, но так как такого типа в С++ нет использую unsigned char. При записи в массив должны использоваться любые символы, в том числе может встречаться и ноль символ '\0'. При обработке полученного массива не могу корректно определить конец строки, при записи str[i]!=NULL все равно идет остановка на ноль символе.

К примеру функция определения длины массива:

Код

typedef unsigned char byte;

long strLength(byte * str)
{
    int i=0;
    while(str[i++]!=NULL);
    return i;
}


Вернет только до '\0' несмотря на то что проверяется на NULL.

Вопрос: как сделать проверку на инициализацию ячеек памяти, а не на их содержимое в этом случае. Использую динамические массивы, на всякий случай полный код:

Код

#include <stdlib.h>

typedef unsigned char byte;

long strLength(byte * str)
{
    int i=0;
    while(str[i++]!=NULL);
    return i;
}

class f_string
{
    byte * items;
    long count;
public:
    f_string();    
    void Add(byte *);
    long length(void);
    ~f_string();
    byte * toArray(void);
    long Count(void);
};

long f_string::Count(void)
{
    return count;
}

byte * f_string::toArray(void)
{
    return items;
}

f_string::f_string()
{
    count=0;    
    items=(byte*)malloc(sizeof(byte));
}

f_string::~f_string()
{
    free(items);
}

void f_string::Add(byte * str)
{
    int i=count,j=0;
    count+=strLength(str);
    items=(byte*)realloc(items,sizeof(byte)*(count+1));
    for(i;i<count;i++)
        items[i]=str[j++];
    items[i]='\0';
}


В функции Add при определении длины входного массива и начинаются косяки если в середине массива встречается '\0'.
PM MAIL ICQ   Вверх
GoldFinch
Дата 8.4.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Xaotuk, 0==NULL

"инициализацию ячеек памяти"
такого понятия не существует

Это сообщение отредактировал(а) GoldFinch - 8.4.2009, 12:26
PM MAIL ICQ   Вверх
Xaotuk
Дата 8.4.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Тогда как решить проблему?
PM MAIL ICQ   Вверх
zim22
Дата 8.4.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Xaotuk @  8.4.2009,  12:30 Найти цитируемый пост)
Тогда как решить проблему?

Код

#include <vector>
...
std::vector<unsigned char> vc;



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


Новичок



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

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



Не годится. Во-первых, vector не вернет мне указатель на массив, а он мне нужен чтобы вызывать функцию генерации хэш кода, во-вторых, если и сделать возврат указателя будет первая проблема...
PM MAIL ICQ   Вверх
cutwater
Дата 8.4.2009, 13:06 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Явно хранить и передавать размер массива (или размер хранящихся данных)


--------------------
user posted image
PM MAIL   Вверх
Xaotuk
Дата 8.4.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Поясню подробнее.
1. Есть массив типа unsigned char, служащий для накопления данных извне.
2. Есть поток байт приходящий извне, его я пихаю в массив накопитель.
3. Мне надо определять длину приходящего потока, причем определением конца потока не должен быть ноль-символ.
И вот как сделать последнее не знаю.
PM MAIL ICQ   Вверх
X-3R1
Дата 8.4.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Xaotuk @  8.4.2009,  11:03 Найти цитируемый пост)
Не годится. Во-первых, vector не вернет мне указатель на массив, а он мне нужен чтобы вызывать функцию генерации хэш кода, во-вторых, если и сделать возврат указателя будет первая проблема... 


Вектор это последовательный контейнер, т.е. память в нём находится последовательно. Поэтому указатель на первый элемент. Это и будет твой "указатель на массив".

Только советую получать указатель на массив, перед его использованием, ибо при добавлении новых элементов, м. произойти перераспределение памяти, и указатель станет невалидным.

Это сообщение отредактировал(а) X-3R1 - 8.4.2009, 13:26
PM MAIL   Вверх
zim22
Дата 8.4.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(X-3R1 @  8.4.2009,  13:23 Найти цитируемый пост)
Поэтому указатель на первый элемент. Это и будет твой "указатель на массив".

Код

&vc.front();



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


Эксперт
***


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

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



Код

vector не вернет мне указатель на массив

сделай так 
Код

#include <vector>
...
std::vector<char *> vc;
char *pc = new char[20];
vc.push_back(pc);
strcpy(vc[0], "Привет");


Код

3. Мне надо определять длину приходящего потока, причем определением конца потока не должен быть ноль-символ.

Выбери концом данных другой символ

Это сообщение отредактировал(а) Dem_max - 8.4.2009, 13:43


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
X-3R1
Дата 8.4.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Dem_max @  8.4.2009,  11:39 Найти цитируемый пост)
сделай так 

Да ну , ты чего ? Это ж надо заботиться о выделенной памяти. Ладно бы ещё потом не забыть её через delete удалить. А если исключение ?

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



****


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

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



X-3R1, и что, что исключение? в исключении и освобождай, по finally
PM MAIL ICQ   Вверх
X-3R1
Дата 8.4.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



GoldFinch, удачи smile
PM MAIL   Вверх
JackYF
Дата 8.4.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(GoldFinch @  8.4.2009,  13:42 Найти цитируемый пост)
в исключении и освобождай, по finally 

Двойная работа, не комильфо.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Fazil6
Дата 8.4.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Xaotuk @  8.4.2009,  12:21 Найти цитируемый пост)
Вернет только до '\0' несмотря на то что проверяется на NULL.

Вопрос: как сделать проверку на инициализацию ячеек памяти, а не на их содержимое в этом случае. 

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


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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