Форум программистов, компьютерный форум CyberForum.ru

itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.86
LeX
136 / 136 / 32
Регистрация: 30.06.2010
Сообщений: 554
27.02.2011, 18:48     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #1
доброе утор, день, вечер. нужна реализация itoa, у меня получилось следующее

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char ito(int value)
    {
        int tmp_value = value;
        value /= 10;
        if (value) result[j]=ito(value);
        j++;
        int k=tmp_value-value*10;
        return ptr[k];
    }
char *itoa(int value) 
    {
        char *result="";
        char *ptr= "0123456789abcdef";
        int j=0;
        result=result+ito(value);
        return result;
    }
компилится. но вылетает на строке

C++
1
return ptr[k];
выскакиевает уведомление. ругается благим компиляторским матом:
Необработанное исключение типа "System.NullReferenceException" произошло в my bnf.exe

Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
пробовал по разному, выдает ошибки при компиляции

Добавлено через 5 минут
и еще, кто скажет, почему конкат срабатывает криво

C++
1
2
3
4
String^ s=richTextBox1->Lines[i];
String^ t=gcnew String(itoa(253));
String^ k=". ";
String^ h=String::Concat( t, k, s);
в итоге h=t

Добавлено через 6 минут
а если есть другие способы конвертирования числа в String ^ или в char *?)буду благодарен)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2011, 18:48     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию)))
Посмотрите здесь:

Перевод числа в строку C++
C++ Перевод числа в строку
C++ Перевод вещественного числа в строку!
Написать функцию itoa (n,s) преобразования целого числа n в стринг s C++
C++ Перевод из числа в строку
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pavel876
 Аватар для pavel876
2 / 4 / 0
Регистрация: 02.03.2011
Сообщений: 56
02.03.2011, 23:04     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #21
ЭХ ВОТ ТАК
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LeX
136 / 136 / 32
Регистрация: 30.06.2010
Сообщений: 554
02.03.2011, 23:05  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #22
pavel876, первый мессаг решил запостить сюда?)
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
02.03.2011, 23:07     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #23
завтра напишу простейшую реализацию стека
LeX
136 / 136 / 32
Регистрация: 30.06.2010
Сообщений: 554
02.03.2011, 23:09  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #24
ValeryS, ладно, с конструктором в таком случае понятно. а деструктор как вызываться будет?

Добавлено через 1 минуту
C++
1
~stack StackSymb;
как то так?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
02.03.2011, 23:09     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #25
Цитата Сообщение от LeX BB Посмотреть сообщение
ммм) push - конструктор, pop - деструктор) интересная идея)
с какого перепугу
mystack() конструктор
~mystack() деструктор
LeX
136 / 136 / 32
Регистрация: 30.06.2010
Сообщений: 554
02.03.2011, 23:10  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #26
Цитата Сообщение от ValeryS Посмотреть сообщение
с какого перепугу
mystack() конструктор
~mystack() деструктор
описать внутри mystack() push, а внутри ~mystack() - pop?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
02.03.2011, 23:14     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #27
Цитата Сообщение от LeX BB Посмотреть сообщение
ладно, с конструктором в таком случае понятно. а деструктор как вызываться будет
деструктор как и конструктор явно не вызываетсь
он вызывается при разрушении объекта
LeX
136 / 136 / 32
Регистрация: 30.06.2010
Сообщений: 554
02.03.2011, 23:18  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #28
Цитата Сообщение от ValeryS Посмотреть сообщение
деструктор как и конструктор явно не вызываетсь
он вызывается при разрушении объекта
т.е. получается как вариант реализации внутри структуры вышеописанным образом объявить push и pop, потом их вызывать?

это получается как то так?:
C++
1
2
StackSymb->push(c);
StackSymb->pop();
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
03.03.2011, 19:22     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #29
реализация стека через классы
Stack.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#pragma once
 
// класс элемента стека
class CStack
{
public:
    CStack(void);      // конструктор
    ~CStack(void);     // деструктор
 
    CStack* pNext;
    int value;
 
 
};
// класс кадра стека
class CFrameStack
{
public:
    CFrameStack(void);   // конструктор 
    ~CFrameStack(void);  // деструктор
    bool IsEmpty(void);  // проверка Пустой ли стек
    int pop(void);
    void push(int v);
private:
   CStack *TopStack;      //указатель вершины стека
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Stack.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "Stack.h"
 
 
 
CStack::CStack(void) // конструктор инициализирует  переменные
: pNext(NULL)
, value(0)
{
}
 
CStack::~CStack(void)
{
 
}
CFrameStack::CFrameStack(void)//конструктор инициализирует  переменные
:TopStack(NULL)
{
}
CFrameStack::~CFrameStack(void) //деструктор 
{
while(!IsEmpty())             // если стек не пуст 
     pop();                   // удаляем элементы
}
 
bool CFrameStack::IsEmpty(void)
{
    return (TopStack==NULL);   // проверка пустоты стека
}
 
int CFrameStack::pop(void)      // достать с вершины стека 
{
    if(IsEmpty()) return -1;    // если стек пуст выйти
    CStack * tmp=TopStack;      // выделяем элемент стека 
    TopStack=tmp->pNext;        // указатель на предыдущий элемент
    int res=tmp->value;         // значение 
    delete tmp;                 // удаляем элемент стека
    return res;                  // вернуть значение
    
}
 
void CFrameStack::push(int v)  // положить на вершину стека
{
    CStack * tmp1=new CStack;  // создать новый элемент
    tmp1->value=v;             // присвойть значение 
    tmp1->pNext=TopStack;     // указатель на старый элемента
    TopStack=tmp1;             //вершина стека новай элемент
    return ;
}
 
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    CFrameStack st;
  for(int i=0;i<10;i++)
    {
      printf("%d ",i);
      st.push(i);
    }
      printf("\n");  
     for(int i=0;i<10;i++)
     {
      printf("%d ",st.pop());
     } 
 
      return 0;
}
С уважением Валерий
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.03.2011, 20:22     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #30
Цитата Сообщение от ValeryS Посмотреть сообщение
деструктор как и конструктор явно не вызываетсь
Деструктор можно вызвать явно, ничего этому не мешает.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
03.03.2011, 21:15     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #31
можно а зачем
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.03.2011, 21:20     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #32
Цитата Сообщение от ValeryS Посмотреть сообщение
можно а зачем
Это другой вопрос. Вы сказали, что деструктор явно не вызывается так же, как и конструктор, я это опроверг.
Я это написал потому, что конструктор ведь действительно явно вызвать нельзя (он вызывается один раз при создании объекта и больше никогда), а вот деструктор может вызвать и сам программист, причём несколько раз в разных местах (в некоторых случаях это, естественно, может привести к UB, но это не исключает того, что это сделать можно).
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
03.03.2011, 21:35     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #33
есть много друг Горацио на свете
человек переходит с паскаля зачем ему сейчас эти нюансы???
под тем что деструктор вызывается неявно я имел ввиду
C++
1
2
3
{
MyClass a // создается класс вызывается конструктор
} // переменная выходит из области видимости,разрушается деструктор мы не вызываем он вызывается сам
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.03.2011, 21:38     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #34
ValeryS, "вызывается неявно" и "явно не вызывается" - это как-бы разные вещи...
Лучше сразу научиться правильно, чем сначала запомнить неправильно, а потом переучиваться.
LeX
136 / 136 / 32
Регистрация: 30.06.2010
Сообщений: 554
05.03.2011, 23:02  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #35
и снова я тут. вернулся к этому делу.
Цитата Сообщение от ValeryS Посмотреть сообщение
реализация стека через классы
Stack.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class CStack
{
public:
    CStack(void);      // конструктор
    ~CStack(void);     // деструктор
 
    CStack* pNext;
    int value;
 
 
};
 
CStack::CStack(void) // конструктор инициализирует  переменные
: pNext(NULL)
, value(0)
{
}
ValeryS, у меня в конструкторе указатель и переменная не инициализируются со соответствующими значениями. мой код:

хидер:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class stack
{
public:
    stack(void);
    stack *prew;
    char ch;
};
class stacks
{
public:
    void pop();
    void push(char c);
    stack *StackSymb;
};
cpp:
C++
1
2
3
4
5
stack::stack(void)
    : prew(0)
    , ch('>')
{
}
как быть, не посоветуете?

Добавлено через 4 минуты
да, и NULL упорно признавать не хочет. поэтому 0 ставлю

Добавлено через 4 часа 43 минуты
ValeryS, так получается надо все функции, работающие с указанным классом, её переменными, включать в класс?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
07.03.2011, 21:22     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #36
ValeryS, у меня в конструкторе указатель и переменная не инициализируются со соответствующими значениями
какой компилятор???
можно и так
C++
1
2
3
4
5
6
CStack::CStack(void) // конструктор инициализирует  переменные
 
{
pNext=NULL;
 value=0;
}
инициализацию через конструкторы
могут не поддерживать старые компиляторы (????)
да, и NULL упорно признавать не хочет. поэтому 0 ставлю
какие h файлы подключены ?
так получается надо все функции, работающие с указанным классом, её переменными, включать в класс?
да
в классе должны быть необходимые ему переменные и функции(методы)
если ты будешь работать с данными(переменными) класса сторонними функциями значит класс спроектирован не правильно, этим ты нарушаешь идеологию ООП
смотри
C++
1
2
3
4
5
6
7
class man
{
public:
int age;
}
man Buba;
Buba.age=-200;// я ввел нереальный возраст, потому что имею доступ к данным класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class man
{
private:
int age; // никто снаружи сюда не достучится
public:
void SetAge(int a);      // функции обертки позволяют задать/считать возраст
int GetAge(){return age;};
}
void man.SetAge(int a)
{
  if((a<0)||(a>100))     // проверяем чтобы возраст был реальным
             return ;
 age=a;
}
man Buba;
Buba.age=-200;// компилятор даст ошибку
Buba.SetAge(-200);// не выполнится нереальный возраст
Buba.SetAge(25); // усе путем
Добавлено через 2 минуты
void man.SetAge(int a)
пардон
void man::SetAge(int a)
LeX
136 / 136 / 32
Регистрация: 30.06.2010
Сообщений: 554
09.03.2011, 15:53  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #37
ValeryS, компилятор vs2010.
подключенные хидеры:
C++
1
2
3
4
5
6
#include "stdafx.h"
#include <string.h>
#include <math.h>
#include <ymath.h>
#include "my systems.h"
#include <stdio.h>
спасибо)с классами разобрался, все нужные функции описал и запихнул, все работает

а это еще попробую, может получится.
Цитата Сообщение от ValeryS Посмотреть сообщение
какой компилятор???
можно и так
C++
1
2
3
4
5
6
CStack::CStack(void) // конструктор инициализирует  переменные
 
{
pNext=NULL;
 value=0;
}
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
09.03.2011, 16:13     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #38
странно
stdio.h
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2011, 16:27     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию)))
Еще ссылки по теме:

Перевод из числа в строку C++
C++ перевод числа в строку
C++ Какая dll содержит функцию itoa?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
LeX
136 / 136 / 32
Регистрация: 30.06.2010
Сообщений: 554
09.03.2011, 16:27  [ТС]     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) #39
Цитата Сообщение от ValeryS Посмотреть сообщение
странно
stdio.h
да и черт с ним)и без константы 0 прокатывает)
Yandex
Объявления
09.03.2011, 16:27     itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию)))
Ответ Создать тему
Опции темы

Текущее время: 01:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru