powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Откуда появился терминатор?
25 сообщений из 28, страница 1 из 2
Откуда появился терминатор?
    #34312594
sax_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перед вызовом функции BinToDec app содержит массив элементов 0и1, а после вызова фукции - тот же массив, но нулевой элемент app - терминатор '\0'
Код: plaintext
1.
2.
3.
4.
5.
6.
char app[ 10 ];
memset(app, 0 , 10 );
strncat(app, (char*)&bitArray[ 0 ],  10 );//bitArray - массив, длинной 128, состоящий из 0 и 1.
//Здесь app "принимает значение" "0110001001"
sax->app = BinToDec((char*)app);
//Здесь app уже "\0110001001"
Функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int BinToDec(char* value){

        int result =  0 ;
        for(int i =  0 ;i <  strlen(value);i++){
                result *=  2 ;
                if (value[i] == '1') result++;
        }
        return result; ..Возвращается естественно  0 
}
Не "догоняю", в чём дело?
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313021
sax_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может всё дело в моей кривой функции перевода двоичного числа в десятичное. Может есть у кого-нить функция покрасивее?
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313261
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int BinToDec(char* value){

        int result =  0 ;
        for(int i =  0 ;i <  strlen(value);i++){
                result *=  2 ;
                if (value[i] == '1') result++;
        }
        return result; ..Возвращается естественно  0 
}
Не "догоняю", в чём дело?[/quot]

resut*=2;
до вызова
result==0
во время
0*=2;
получаем 0
result==0
во время
0*=2;
получаем 0
result==0
во время
0*=2;
получаем 0
result==0
во время
0*=2;
получаем 0
result==0
во время
0*=2;
получаем 0
result==0
во время
0*=2;
получаем 0
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313272
там такая штучка есть Дебаггер называется :-)
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313277
sax_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МысльСреды
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int BinToDec(char* value){

        int result =  0 ;
        for(int i =  0 ;i <  strlen(value);i++){
                result *=  2 ;
                if (value[i] == '1') result++;
        }
        return result; ..Возвращается естественно  0 
}
Не "догоняю", в чём дело?

resut*=2;
до вызова
result==0
во время
0*=2;
получаем 0
result==0
во время
0*=2;
получаем 0
result==0
во время
0*=2;
получаем 0
result==0
во время
0*=2;
получаем 0
result==0
во время
0*=2;
получаем 0
result==0
во время
0*=2;
получаем 0[/quot]
Это если только при вызове функции в качестве параметра дать 0, а я про другое спрашивал.
У меня app было объявлено через memset , попробовал через new - значения принимает правильные, но в конце выкидывает ошибку на память
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313286
sax_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МысльСредытам такая штучка есть Дебаггер называется :-)
См. внимательно 1ое сообщение, как по вашему я узнал про "содержание" переменных, иссесвенно с помощью дебаггера
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313291
Я говорю

int BinToDec(char* value){

int result = 0;
for(int i = 0;i < strlen(value);i++){
result *= 2;
if (value == '1') result++;
}
return result; ..Возвращается естественно 0
}

ВСЕГДА будет возвращать 0 (ноль)
В функции Ты(Вы) выполняешь умножение 0(нуля) на 2 то кол-во раз которое соответствует кол-ву символов в строке.
И в итоге ВСЕГДА получаешь ноль
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313303
сорри бес попутал

Попробуй
if (value == '1') result++;
заменить на
if (value == '1') ++result;
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313307
sax_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В чем может быть загвоздка. Объявил в теле функции app через (
Код: plaintext
char* app = new char[ 11 ]
)

Далее все операции, в которых участвует app

Код: plaintext
1.
strcpy (app, "\0");
strncpy(app, (char*)&Array[ 0 ],  10 );

если перед return поставить delete[] app;? то сругнется на память, если память не освободить - то без ошибок.
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313313
sax_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МысльСредысорри бес попутал

Попробуй
if (value == '1') result++;
заменить на
if (value == '1') ++result;

Да не в том проблема, если на вход функции подать значение(параметр), то функция возвращает то что надо, но в моем случает "портится указатель", который я передаю в качестве указателя.
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313324
sax_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sax_ МысльСредысорри бес попутал

Попробуй
if (value == '1') result++;
заменить на
if (value == '1') ++result;

Да не в том проблема, если на вход функции подать значение(параметр), то функция возвращает то что надо, но в моем случает "портится указатель", который я передаю в качестве указателя.
И "портится" по всей по всей видимости не в BinToDec. Я что-то явно неправильно сделал или с объявлением функции, или с выделением ей памяти или же неправильно использовал функции для работы с указателями.
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313349
Извиняюсь Гнал..

int BinToDec(char* value){

int result = 0;
for(int i = 0;i < strlen(value);i++)
{
result *= 2;
if (value == '1') result++;
}
return result;
}

int _tmain(int argc, _TCHAR* argv[])
{

char app[]="0110001001";
//Здесь app "принимает значение" "0110001001"
std::cout<< BinToDec(app);
//Здесь app уже "\0110001001"

return 0;
}

работает нормально
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313358
bitArray как объявлен?
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313365
sax_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу наших ГУРУ разъяснить мне следущее:

Код: plaintext
1.
2.
3.
4.
unsigned char* bitArray = new char[ 128 ];
unsigned char* num = new char[ 31 ];
***
strncpy(num, (char*)&bitArray[ 16 ],  30 );
***

Это как бы "начало" кода, естественным завершением долно быть освобождение памяти;

если сделать так
Код: plaintext
1.
delete[] num;
delete[] bitArray;
, то после первой строчки вылетит exception, а если так:

Код: plaintext
1.
delete[] bitArray;
delete[] num;
то всё "ок". Почему? Видимо num становиться как-то зависим от bitArray?
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313389
sax_В чем может быть загвоздка. Объявил в теле функции app через (
Код: plaintext
char* app = new char[ 11 ]
)

Далее все операции, в которых участвует app

Код: plaintext
1.
strcpy (app, "\0");
strncpy(app, (char*)&Array[ 0 ],  10 );

если перед return поставить delete[] app;? то сругнется на память, если память не освободить - то без ошибок.

Гхм

int _tmain(int argc, _TCHAR* argv[])
{
char Array[]="hello";
char* app = new char[11];
strcpy (app, "\0");
strncpy(app, (char*)&Array[0], 10);
std::cout<<app;
delete[] app;
return 0;
}

Компилится и работет без проблем
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313392
sax_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё! Если при объявлении я знаю, что массив char будет содержать 10 элементов, как правильно его объявить?

Код: plaintext
char* array = new char[ 10 ]
или
Код: plaintext
char* array = new char[ 11 ]
???
Надо ли оставлять место для терминатора "\0"?
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313407
sax_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МысльСреды sax_В чем может быть загвоздка. Объявил в теле функции app через (
Код: plaintext
char* app = new char[ 11 ]
)

Далее все операции, в которых участвует app

Код: plaintext
1.
strcpy (app, "\0");
strncpy(app, (char*)&Array[ 0 ],  10 );

если перед return поставить delete[] app;? то сругнется на память, если память не освободить - то без ошибок.

Гхм

int _tmain(int argc, _TCHAR* argv[])
{
char Array[]="hello";
char* app = new char[11];
strcpy (app, "\0");
strncpy(app, (char*)&Array[0], 10);
std::cout<<app;
delete[] app;
return 0;
}

Компилится и работет без проблем

Не спорю, это работоспособно, но попробуй array объявить как
Код: plaintext
unsigned char* array = new char[?]
и освободить память от него перед освобождением app
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313413
sax_Прошу наших ГУРУ разъяснить мне следущее:

Код: plaintext
1.
2.
3.
4.
unsigned char* bitArray = new char[ 128 ];
unsigned char* num = new char[ 31 ];
***
strncpy(num, (char*)&bitArray[ 16 ],  30 );
***

Это как бы "начало" кода, естественным завершением долно быть освобождение памяти;

если сделать так
Код: plaintext
1.
delete[] num;
delete[] bitArray;
, то после первой строчки вылетит exception, а если так:

Код: plaintext
1.
delete[] bitArray;
delete[] num;
то всё "ок". Почему? Видимо num становиться как-то зависим от bitArray?

Гхм
int _tmain(int argc, _TCHAR* argv[])
{
char* bitArray = new char[128];
char* num = new char[31];

strncpy(num, (char*)&bitArray[16], 30);
std::cout<<num;
std::cout<<bitArray;
delete[] num;
delete[] bitArray;
return 0;
}

Компилится и работает без проблем
Почему делаешь указатель unsigned ???
unsigned char* num = new char[31];
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313443
А ещё красивее получается если
int _tmain(int argc, _TCHAR* argv[])
{
char* bitArray = new char[128];
char* num = new char[31];

strcpy(bitArray, "Hello");
strncpy(num, bitArray, 30); //Вот тут перетурбации с & лишние
std::cout<<num;
std::cout<<bitArray;
delete[] num;
delete[] bitArray;
return 0;
}
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313467
sax_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МысльСредыА ещё красивее получается если
int _tmain(int argc, _TCHAR* argv[])
{
char* bitArray = new char[128];
char* num = new char[31];

strcpy(bitArray, "Hello");
strncpy(num, bitArray, 30); //Вот тут перетурбации с & лишние
std::cout<<num;
std::cout<<bitArray;
delete[] num;
delete[] bitArray;
return 0;
}
А у меня чего-то ругается! Насчет перетурбаций - это я делаю, когда надо скопировать начиная не с нелевого элемента
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313503
int _tmain(int argc, _TCHAR* argv[])
{

char* bitArray = new char[128];
char* num = new char[31];

strcpy(bitArray, "Hello");
//++bitArray;
strncpy(num, bitArray, 30);
//--bitArray;
std::cout<<num;
std::cout<<bitArray;
delete[] num;
delete[] bitArray;
return 0;
}

Так вывод :
HelloHello
Раскомментируй где //. Будет:
elloHello
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313523
или так
char* bitArray = new char[128];
char* num = new char[31];
strcpy(bitArray, "Hello");

char* from3=bitArray;
from3+=3;
strncpy(num, from3, 30);

std::cout<<num;
std::cout<<bitArray;

Вывод
loHello
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313541
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sax_Прошу наших ГУРУ разъяснить мне следущее:

Код: plaintext
1.
2.
3.
4.
unsigned char* bitArray = new char[ 128 ];
unsigned char* num = new char[ 31 ];
***
strncpy(num, (char*)&bitArray[ 16 ],  30 );
***

Это как бы "начало" кода, естественным завершением долно быть освобождение памяти;

если сделать так
Код: plaintext
1.
delete[] num;
delete[] bitArray;
, то после первой строчки вылетит exception, а если так:

Код: plaintext
1.
delete[] bitArray;
delete[] num;
то всё "ок". Почему? Видимо num становиться как-то зависим от bitArray?

Где то при обращении bitArray[X] занчение X превышает размерность ( 128 ).



автор
Может всё дело в моей кривой функции перевода двоичного числа в десятичное. Может есть у кого-нить функция покрасивее?


идея такова:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
int BinToDec(char* value){

        int result =  0 ;
        int mask =  1 ;
        int size =strlen(value);

        if( size > sizeof(result) ) // проверка  
         {
           throw some_exception("Подозревается потеря разрядов при преобразовании\n");
         };
         
        for(int i = size- 1  ; i >= 0  ;i--){
                if (value[i] == '1')
                 {
                   result=result|mask;
                  };
              mask<< 1 ;
        }
        return result; 
};
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313642
sax_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-[quot sax_]
int BinToDec(char* value){

int result = 0;
int mask = 1;
int size =strlen(value);

if( size > sizeof(result) ) // проверка
{
throw some_exception("Подозревается потеря разрядов при преобразовании\n");
};

for(int i = size-1 ; i >=0 ;i--){
if (value == '1')
{
result=result|mask;
};
mask<<1;
}
return result;
};
[/src]


Работает или не правильно, или вы меня не поняли. На вход (char* value) подается последовательность 0 и 1, т.е. если подать value="10000000" , то функция должна выдать 128
...
Рейтинг: 0 / 0
Откуда появился терминатор?
    #34313682
sax_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
//onstat-
Тем более вариант, изложенный вами будет ругаться на любое двоичное число(находящееся в value), большее 255, т.к.

если value 255? т.е value ='100000000' т.е strlen(value) = 9, а sizeof(result) , где result - типа int равен 8
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Откуда появился терминатор?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]