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

Почему выводит адреса? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
pun4er
6 / 6 / 1
Регистрация: 06.10.2010
Сообщений: 122
03.12.2011, 00:19     Почему выводит адреса? #1
Всем привет! Программа работает, но почему то выводит данные вместе с адресом (см. скриншот). Скажите, почему так?
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
#include<iostream>
#include<conio.h>
#include<iomanip>
using namespace std;
 
char buf[255]="abcd\n";
 
ostream &fendp(ostream &stream,int n,char* s)
{
    char bb[255];
    static int k=0;
    int i,j;
    for(i=0,j=0;buf[j]!='\0';i++,j++)
    {
        bb[i]=buf[j];
        if(bb[i]=='\n')
        {
            k++;
            if(k==n)
            {
                bb[i+1]='\n';
                stream<<s;
                i=-1;
            }
        }
    }
    if(i<0)
    {
        bb[i+1]='\0';
        stream<<bb;
    }
    return stream;
}
 
void main()
{
    int i;
    for(i=0;i<7;i++)
        cout<<buf<<fendp(cout,5,"\n====================\n");
    getch();
}
скрин в этой теме 3й пост Как передать параметр в собственный манипулятор с параметром?

Добавлено через 3 часа 33 минуты
ребят, ну подскажите хоть кто нибудь в чем проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2011, 00:19     Почему выводит адреса?
Посмотрите здесь:

C++ Почему указатели имеют одинаковые адреса
C++ Почему не выводит m?
C++ Почему не выводит?
Почему адреса одинаковые? C++
почему выводит 0? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diman94x
5 / 5 / 1
Регистрация: 13.06.2009
Сообщений: 67
03.12.2011, 00:26     Почему выводит адреса? #2
Смотри не поставил ли ты или не забыл ли ты где знак адреса - "&"
Bers
Заблокирован
03.12.2011, 00:43     Почему выводит адреса? #3
pun4er, два замечания (хотя вы можете считать, что я просто придераюсь)

1.
Код написан не_читабельно. А значит, что бы точно понимать, что в нем происходит, его логику - пришлось код скопипастить в студию, а затем дебажить. Что кстати, вы могли бы сделать и самостоятельно.

2.
Я вообще не очень хорошо понял задумку автора этого кода. Однако!
Смею заметить, что успешно отработав, манипулятор возвращает ссылку на поток вывода.

То есть, обратите внимание, как завершается операция:

C++
1
2
return stream;
}
Что бы вы лучше поняли с чем столкнулись, специально для вас я локализировал проблему.
Внимательно изучите этот код:
C++
1
2
3
4
5
6
void main()
{
    cout<< std::cout<<endl; //теперь понимаете, 
                                         //что именно вы пихаете в поток вывода,
                                         // и почему он высвечивает адрес?
}
Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
void main()
{
* * * * int i;
* * * * for(i=0;i<7;i++)
* * * * * * * * cout<<buf<<fendp(cout,5,"\n====================\n");
//результатом выражения  fendp(cout,5,"\n====================\n")
//будит является ссылка на объект cout
* * * * getch();
}

/ps Не пойму.. с чем связанно появление звездочек? Может быть в оригинальном тексте использовались символы табуляции вместо пробелов?
pun4er
6 / 6 / 1
Регистрация: 06.10.2010
Сообщений: 122
03.12.2011, 00:58  [ТС]     Почему выводит адреса? #4
Спасибо, я понял, но не понятно, что нужно передать манипулятору fendp чтобы он не возвращал ссылку? Если пишу просто
C++
1
fendp(5,"\n========\n"
, то ругается: "начальное значение ссылки на неконстантный параметр должно быть левосторонним значением" и "слишком мало аргументов".
А задача была в том, что на странице мы определяем x строчек, и через каждые x строк вставляем ========= (типа разделитель страниц)
Bers
Заблокирован
03.12.2011, 01:04     Почему выводит адреса? #5
pun4er, вы разрабатываете манипулятор. Вы, наверное, должны понимать, что ваш манипулятор принимает на входе, и что должен возвращать на выходе?

Зачем ты вообще возвращаете ostream & после успешного выполнения функции?

Цитата Сообщение от pun4er Посмотреть сообщение
но не понятно, что нужно передать манипулятору fendp чтобы он не возвращал ссылку?
Кто автор кода? Если автор - вы, то почему ты сами не понимаете, как работает ваш код?
pun4er
6 / 6 / 1
Регистрация: 06.10.2010
Сообщений: 122
03.12.2011, 01:12  [ТС]     Почему выводит адреса? #6
Цитата Сообщение от Bers Посмотреть сообщение
Зачем ты вообще возвращаете ostream & после успешного выполнения функции?
потому что нас так преподаватель научил =)


Цитата Сообщение от Bers Посмотреть сообщение
Кто автор кода? Если автор - вы, то почему ты сами не понимаете, как работает ваш код?
автор я, я просто "плаваю" в этой теме, вот пытаюсь разобраться.

Добавлено через 2 минуты
просто я создавал такой же манипулятор без параметров, там все работало идеально, код аналогичный был, разница лишь в том что я не передаю x строк, а оно у меня задано в манипуляторе.
Bers
Заблокирован
03.12.2011, 01:13     Почему выводит адреса? #7
Цитата Сообщение от pun4er Посмотреть сообщение
потому что нас так преподаватель научил =)
Понимаете.. нет такого понятия "нас так научили". Вы либо программист, который понимает саму идею.
Либо мартышка, которая тупо вызубрила "как надо", без понимания этого самого "надо"

Ниже представлен код, от которого за версту плохо пахнет.
Я не уверен, что он работает корректно, и что это именно то, что вам нужно.
По сути, это ваш код, который я только слегка подпилил согласно задачи:
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
#include <iostream>
using namespace std;
 
char buf[255]="abcd\n";
 
const char* fendp(unsigned int n,char* s)
{
    char bb[255];
    static int k=0;
    int i,j;
    for(i=0,j=0;buf[j]!='\0';i++,j++)
    {
        bb[i]=buf[j];
        if(bb[i]=='\n')
        {
            k++;
            if(k==n) { bb[i+1]='\n';  cout<<s;  i=-1; }
        }
    }
    if(i<0) { bb[i+1]='\0'; cout<<bb; }
    return "";
}
 
void main()
{
    int i;
    for(i=0;i<7;i++)
        cout<<buf<<fendp(5,"\n====================\n");
 
}
pun4er
6 / 6 / 1
Регистрация: 06.10.2010
Сообщений: 122
03.12.2011, 01:20  [ТС]     Почему выводит адреса? #8
Вот я и не могу понять, почему в манипуляторе без параметров у меня не выводятся адреса, хотя я тоже возвращаю stream, а тут выводятся...

Добавлено через 6 минут
Цитата Сообщение от Bers Посмотреть сообщение
Понимаете.. нет такого понятия "нас так научили". Вы либо программист, который понимает саму идею.
Либо мартышка, которая тупо вызубрила "как надо", без понимания этого самого "надо"
Я пока что не тру программист, а простой смертный студент 3го курса =)
И я делаю код согласно тому, как нас учат, пытаясь при этом разбираться в том, что пишу.
Про манипуляторы с параметрами нам почти ничего не рассказывали, поэтому приходится самообучаться.
По поводу вашего кода - спасибо, заработало. Спасибо вам за то, что не пожалели времени на мою проблему, и помогли.
Bers
Заблокирован
03.12.2011, 01:25     Почему выводит адреса? #9
pun4er, одно из двух:
1.Либо я не правильно понял задачу.
2.Либо код выполняет совсем другую задачу

Добавлено через 33 секунды
Цитата Сообщение от pun4er Посмотреть сообщение
Вот я и не могу понять, почему в манипуляторе без параметров у меня не выводятся адреса, хотя я тоже возвращаю stream, а тут выводятся...
Ну вы его хоть покажите)
pun4er
6 / 6 / 1
Регистрация: 06.10.2010
Сообщений: 122
03.12.2011, 01:28  [ТС]     Почему выводит адреса? #10
Если вам интересна задача, вот само задание)

1.Создать манипулятор с двумя парамтрами fendp(n,s), (где n - количество строк на странице
s - строка-приглашение, выводящееся в конце страницы) который подсчитывает
число выведенных строк и при заполнении страницы выполняет
операцию перехода на новую страницу.
При тестировании (вывод на экран) переход на новую страницу
смоделировать выводом какой-либо строки, например, "---------".

Добавлено через 48 секунд
Цитата Сообщение от Bers Посмотреть сообщение
Ну вы его хоть покажите)
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
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<conio.h>
using namespace std;
 
char s[255]="abcd\n";
 
ostream &endp(ostream &stream)
{
    char ss[255];
    static int k=0;
    int i,j,c=5;
    for(i=0,j=0;s[j]!='\0';i++,j++)
    {
        ss[i]=s[j];
        if(ss[i]=='\n')
        {
            k++;
            if(k==c)
            {
                ss[i+1]='\n';
                stream<<"\n-------------\n";
                i=-1;
            }
        }
    }
    if(i<0)
    {
        ss[i+1]='\0';
        stream<<ss;
    }
    return stream;
}
 
void main()
{
    int i=0;
    for (i=0;i<7;i++) 
        cout<<s<<endp;
    getch();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2011, 02:21     Почему выводит адреса?
Еще ссылки по теме:

C++ почему выводит 0?
Вместо значений массива в cout выводит адреса C++
C++ Почему в scanf нужно указывать именно адреса переменных?

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
03.12.2011, 02:21     Почему выводит адреса? #11
pun4er, мне самому стало интересно. Давайте сначала разберёмся, почему в варианте "без параметров" никакие адреса не высвечиваются.

Тут нужно подумать...

Добавлено через 11 минут
pun4er, моих знаний не достаточно. Нужно звать на помощь экспертов.

Я не в состоянии понять, почему этот код вообще компилируется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//функция принимает один явный аргумент
ostream& endt(ostream &stream) 
{
     stream<<"1234"; 
     return stream;
}
 
void main()
{
    cout<<endt;  //здесь кауту скармливается 
                        //результат работы функции
                        //однако, при вызове функции 
                        //вообще опущены аргументы
                        //не знал, что так можно.
                        //как функция догадается, какой именно объект 
                        //ей скормили?
                        //Как она узнает, что такое steam ?
}
*кастует Сыроежку*

Добавлено через 27 минут
Разобрался:
это в классе basic_ostream)
C++
1
2
3
__ostream_type&
      operator<<(__ostream_type& (*__pf)(__ostream_type&))
      {  return __pf(*this); }
значит запись:

C++
1
cout<< endt;
равносильна:

C++
1
endt(cout);
Анализирую дальше...

Добавлено через 4 минуты
Вот эта запись:
C++
1
2
3
4
5
6
void main()
{
   int i=0;
          for (i=0;i<7;i++)  cout<<s<<endp;
    getch();
}
Эквивалентна вот этой:
C++
1
2
3
4
5
6
void main()
{
   int i=0;
       for (i=0;i<7;i++)   { cout<<s;    endp(cout); }
       getch();
}
На самом деле вы кауту скармливаете не "манипулятор без параметров", а указатель на функцию.
Внутри самого каута происходит запуск этой функции, в качестве аргумента которой будит передан this потока.

Поэтому, в вашем втором случае каут запускает функцию-манипулятор передав ей самого себя в качестве аргумента. Но ему самому(кауту) никакие другие кауты уже не скармливаются. Поэтому, он никаких адресов и не выводит
Yandex
Объявления
03.12.2011, 02:21     Почему выводит адреса?
Ответ Создать тему
Опции темы

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