Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
MrDreher
1 / 0 / 1
Регистрация: 02.10.2012
Сообщений: 71
#1

Нелогичная работа кода

15.03.2014, 18:39. Просмотров 1054. Ответов 35
Метки нет (Все метки)

Есть код. Но делает он совсем не то, что по идее должен.
Вот код:
1) файл main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//---------------------------------------------------------------------------
#include "LongNumber.hpp"
#include <iostream>
//---------------------------------------------------------------------------
using namespace std;
//---------------------------------------------------------------------------
int main()
{
        LongNumber a;
        a.setdata();
        a.view();
 
        system("pause");
        return 0;
}
//---------------------------------------------------------------------------
2) Файл LongNumber.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef LONGNUMBER_H
#define LONGNUMBER_H
class LongNumber
{
   private:
        char num[];
        int count;
        int base;
   public:
        LongNumber();
        void setdata();
        void view();
};
#endif
3) Файл LongNumber.hpp
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
#include "LongNumber.hpp"
#include <iostream>
//---------------------------------------------------------------------------
using namespace std;
//---------------------------------------------------------------------------
LongNumber::LongNumber()
{ }
//---------------------------------------------------------------------------
void LongNumber::setdata()
{
        printf("Enter the count: ");
        scanf("%d", &count);
        printf("Enter the number: ");
        scanf("%s",num);
        printf("Enter the base: ");
        scanf("%d",&base);
}
//---------------------------------------------------------------------------
void LongNumber::view()
{
        printf ("Number = %s \n", num);
        printf ("Count = %d \n", count);
        printf ("Base = %i \n", base);
}
//---------------------------------------------------------------------------
Есть задача: ввести с клавиатуры "число"(по сути строку, т.к. число не обязательно в 10чной системе счисления), и ввести основание системы счисления введенного числа. Это метод getdata(). Метод view() должен вывести данные в консоль.
Написал код, вроде должен работать. Но, в итоге получаются какие-то дивные вещи:
1) Вводишь count - все ок. Когда вводишь num то в count уже другие значения.
2) View выводит бред взятый непонятно откуда.

Почему код работает таким странным способом? Как исправить ошибку?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2014, 18:39
Ответы с готовыми решениями:

Нелогичная работа mouse_event MOUSEEVENTF_MOVE
void Draw() { HDC hdc = GetDC(HWND_DESKTOP); int cx =...

Сортировка Шелла работа кода
Ребята, вопрос возможно простой, но лично я не совсем понимаю что происходит...

Работа с файлом в виде двоичного кода
Здравствуйте. Продолжаю работу над внедрением в картинку TIFF текстового файла....

Работа со стеками, объяснение кода программы
Есть код программы (вырванный из целой проги кусок). В нем используются стеки....

Работа с двумерным массивом - разобрать строку кода
Изучаю С++ по книге Шилдт Г.(базовый курс 3-е издание). В теме двумерных...

35
0x10
2571 / 1751 / 288
Регистрация: 24.11.2012
Сообщений: 4,377
15.03.2014, 18:45 #2
Размер массива укажите.

Добавлено через 1 минуту

Не по теме:

Вот нафига люди подключают iostream и пишут using namespace когда не используют ни то, ни другое?



Добавлено через 1 минуту
Ссылка по теме (видимо) http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
0
Croessmah
15.03.2014, 18:45
  #3

Не по теме:

Цитата Сообщение от 0x10 Посмотреть сообщение
Вот нафига люди подключают iostream и пишут using namespace когда не используют ни то, ни другое?
потому что в студии там подрубается cstdio и cstdlib :D

0
MrDreher
1 / 0 / 1
Регистрация: 02.10.2012
Сообщений: 71
15.03.2014, 18:57  [ТС] #4
Цитата Сообщение от 0x10 Посмотреть сообщение
Размер массива укажите.
Размер массива заранее неизвестен. Пользователь может ввести один символ, а может и не один.
0
just_freelance
61 / 37 / 16
Регистрация: 15.03.2014
Сообщений: 315
15.03.2014, 19:09 #5
MrDreher, так выделяйте память динамически, используя указатели.
0
MrDreher
1 / 0 / 1
Регистрация: 02.10.2012
Сообщений: 71
15.03.2014, 19:46  [ТС] #6
Вот так работает:
1) Файл LongNumber.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef LONGNUMBER_H
#define LONGNUMBER_H
class LongNumber // класс длинное число
{
   private:
        int feet;
        float inches;
        
        char *num; // указатель на число
        int count; // кол-во знаков
        int base; // основание системы счисления
   public:
        LongNumber();
        LongNumber(int, float);
        void setdata();
        void view();
        LongNumber operator+ ( LongNumber ) const;
        LongNumber operator* ( LongNumber ) const;
};
#endif
Файл LongNumber.cpp
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
#include "LongNumber.hpp"
//---------------------------------------------------------------------------
LongNumber::LongNumber()
{ }
//---------------------------------------------------------------------------
// получение информации от пользователя
void LongNumber::setdata()
{
        printf("Enter the count: ");
        scanf("%d", &count);
 
        printf("Enter the number: ");
        string num_str;
        scanf("%s",num_str);
        num = &num_str[0];
        
        printf("Enter the base: ");
        scanf("%d",&base);
        printf("Enter the base: ");
}
//---------------------------------------------------------------------------
// вывод информации
void LongNumber::view()
{
        printf ("Number = %s \n", &num);
        printf ("Count = %d \n", count);
        printf ("Base = %d \n", base);
}
//---------------------------------------------------------------------------
Всем спасибо за советы/ответы.
0
MarVaL
С++ Beginner
118 / 118 / 77
Регистрация: 28.02.2013
Сообщений: 246
15.03.2014, 19:58 #7
Цитата Сообщение от 0x10 Посмотреть сообщение
Вот нафига люди подключают iostream и пишут using namespace когда не используют ни то, ни другое?

Не по теме:

Шаблон наверное

1
0x10
2571 / 1751 / 288
Регистрация: 24.11.2012
Сообщений: 4,377
15.03.2014, 20:05 #8
MrDreher, делает вид, что работает. Локальный объект num_str уничтожается после выхода из области видимости и указатель становится невалиден.
2
just_freelance
15.03.2014, 20:08
  #9

Не по теме:

Цитата Сообщение от MrDreher Посмотреть сообщение
num = &num_str[0];
А за такое вообще руки отрубать нужно.

0
rikimaru2013
15.03.2014, 20:13
  #10

Не по теме:

Цитата Сообщение от just_freelance Посмотреть сообщение
А за такое вообще руки отрубать нужно.
Потому, что вместо num = num_str он явно для себя ЯКОБЫ НАПОМИНАЕТ, что в Num адрес массива? Если рубать руки, то за то что переменная типа указатель имеет имя num, что не подскажет ему, что там char * через месяц

0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
15.03.2014, 20:16 #11
Цитата Сообщение от MrDreher Посмотреть сообщение
Размер массива заранее неизвестен.
Размер статического массива не может быть не известен.
0
MrDreher
1 / 0 / 1
Регистрация: 02.10.2012
Сообщений: 71
15.03.2014, 20:16  [ТС] #12

Не по теме:

Цитата Сообщение от just_freelance Посмотреть сообщение
А за такое вообще руки отрубать нужно.
Можно хоть правую оставить? :)



Если я в LongNumber.hpp заменяю "char *num" на "string num" при компиляции выдает ошибки:
1) Type name expected
2) Declaration missing
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
15.03.2014, 20:21 #13
Цитата Сообщение от MrDreher Посмотреть сообщение
Пользователь может ввести один символ, а может и не один.
В этот "массив" он вообще ничего ввести не может, вводить просто некуда, так как размер равен нолю.

Добавлено через 2 минуты
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Если рубать руки, то за то что переменная типа указатель имеет имя num, что не подскажет ему, что там char * через месяц
А ничего, что базовый тип указан безо всяких переименований? В моих прогах вообще все такие указатели не зависимо от фактического типа зовут Data и ничего, не путаюсь. А вот за присваивание локального адреса надо не руки рубить, а хвост.
0
MrDreher
15.03.2014, 20:35  [ТС]
  #14

Не по теме:


Цитата Сообщение от taras atavin Посмотреть сообщение
В моих прогах вообще все такие указатели не зависимо от фактического типа зовут Data и ничего, не путаюсь.
Гений. Можешь называть все свои переменный data, ведь это твои проблемы. Пример ты привел не очень удачный - ты не являешься примером для подражания и то что твой код может быть похож на бред сумасшедшего меня не удивит.

0
DrOffset
7782 / 4601 / 1117
Регистрация: 30.01.2014
Сообщений: 7,499
15.03.2014, 23:16 #15
MrDreher, у тебя там еще одна проблема, про которую никто не сказал. Нельзя писать в объект std::string через scanf таким образом как у тебя написано.
Цитата Сообщение от MrDreher Посмотреть сообщение
C++
1
scanf("%s",num_str);
Компилятор это пропустил только потому, что в scanf эллипсис (три точки), который априори не проверяет типы.
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
16.03.2014, 05:26 #16
Цитата Сообщение от MrDreher Посмотреть сообщение
и то что твой код может быть похож на бред сумасшедшего меня не удивит.
Не может, в отличие от кода ТС и твоего. Имя переменной должно говорить только о её назначении, а о типе должен говорить тип. У меня так и есть.
0
alkagolik
Заблокирован
16.03.2014, 06:07 #17
Цитата Сообщение от taras atavin Посмотреть сообщение
В этот "массив" он вообще ничего ввести не может, вводить просто некуда, так как размер равен нолю.
боян. в данном случае массива просто не как такового. Это Си наследованный синтаксис константного указателя. Это гавно вообще и крестов в частности. Убей себя крестами, пиши на си++.
__
Негодующий функциональщик.

Добавлено через 1 минуту
Цитата Сообщение от MrDreher Посмотреть сообщение
Если я в LongNumber.hpp заменяю "char *num" на "string num" при компиляции выдает ошибки:
1) Type name expected
2) Declaration missing
ты должен понимать разницу. Но ты ее не понимаешь и не знаешь. А если будешь пытаться писать программы на с++ то никогда и не узнаешь.
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
16.03.2014, 06:14 #18
Цитата Сообщение от alkagolik Посмотреть сообщение
в данном случае массива просто не как такового.
А почему по-твоему в кавычках?
0
alkagolik
Заблокирован
16.03.2014, 06:15 #19
Цитата Сообщение от taras atavin Посмотреть сообщение
А почему по-твоему в кавычках?
а кто туда сегодня где-то?
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
16.03.2014, 06:15 #20
Цитата Сообщение от alkagolik Посмотреть сообщение
А если будешь пытаться писать программы на с++ то никогда и не узнаешь.
Да ну! А на чём же её ещё узнавать? Неужели на бейсике, где char* просто не предусмотрен? Или ваще не прологе, где нет и string?
0
16.03.2014, 06:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2014, 06:15

Непонятна часть кода программы - работа с файлами
Программа, выводящая символы из файла в обратном порядке. Часть кода: ..... ...

Не правильная работа кода с std::string::empty()
Здравствуйте подскажите в чем проблема? #include &lt;iostream&gt; #include &lt;string&gt;...

Сравнить каждое слово с предыдущи. Непонятна работа кода
Очень стыдно, но не могу не спросить. Вот код: string previous = &quot; &quot;;...


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru