Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
6 / 6 / 0
Регистрация: 06.10.2010
Сообщений: 122

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

03.12.2011, 00:19. Показов 4859. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Программа работает, но почему то выводит данные вместе с адресом (см. скриншот). Скажите, почему так?
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 минуты
ребят, ну подскажите хоть кто нибудь в чем проблема?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.12.2011, 00:19
Ответы с готовыми решениями:

Почему выводит адреса, а не значения? Это часть программы
Лабораторная работа, должны выводиться значения массива, но выводятся адреса

Почему при присваивании адреса массива не ставится знак '&' получения адреса
int main() { int a = { 2, 3 }; int* b; b = a; //Почему при присваивании адреса массива не ставится знак '&amp;' получения...

Вместо значений массива в cout выводит адреса
Помогите пожалуйста! Вместо значений массива в cout выводит адреса #include&lt;iostream&gt; #include&lt;conio.h&gt; #include...

10
5 / 5 / 2
Регистрация: 13.06.2009
Сообщений: 67
03.12.2011, 00:26
Смотри не поставил ли ты или не забыл ли ты где знак адреса - "&"
0
Заблокирован
03.12.2011, 00:43
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 Не пойму.. с чем связанно появление звездочек? Может быть в оригинальном тексте использовались символы табуляции вместо пробелов?
0
6 / 6 / 0
Регистрация: 06.10.2010
Сообщений: 122
03.12.2011, 00:58  [ТС]
Спасибо, я понял, но не понятно, что нужно передать манипулятору fendp чтобы он не возвращал ссылку? Если пишу просто
C++
1
fendp(5,"\n========\n"
, то ругается: "начальное значение ссылки на неконстантный параметр должно быть левосторонним значением" и "слишком мало аргументов".
А задача была в том, что на странице мы определяем x строчек, и через каждые x строк вставляем ========= (типа разделитель страниц)
0
Заблокирован
03.12.2011, 01:04
pun4er, вы разрабатываете манипулятор. Вы, наверное, должны понимать, что ваш манипулятор принимает на входе, и что должен возвращать на выходе?

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

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


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

Добавлено через 2 минуты
просто я создавал такой же манипулятор без параметров, там все работало идеально, код аналогичный был, разница лишь в том что я не передаю x строк, а оно у меня задано в манипуляторе.
0
Заблокирован
03.12.2011, 01:13
Цитата Сообщение от 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");
 
}
1
6 / 6 / 0
Регистрация: 06.10.2010
Сообщений: 122
03.12.2011, 01:20  [ТС]
Вот я и не могу понять, почему в манипуляторе без параметров у меня не выводятся адреса, хотя я тоже возвращаю stream, а тут выводятся...

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

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

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();
}
0
Заблокирован
03.12.2011, 02:21
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 потока.

Поэтому, в вашем втором случае каут запускает функцию-манипулятор передав ей самого себя в качестве аргумента. Но ему самому(кауту) никакие другие кауты уже не скармливаются. Поэтому, он никаких адресов и не выводит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2011, 02:21
Помогаю со студенческими работами здесь

Программа выводит на экран адреса вместо элементов матрицы
Мне надо написать программу выводящую на экран квадратную матрицу. Ее размер полей ввожу с клавиатуры. Заполнить необходимо рандомными...

Почему адреса одинаковые?
Обьясните пожалуйста код, почему адреса одинаковые? #include &lt;iostream&gt; using namespace std; int main() { char *s =...

Почему указатели имеют одинаковые адреса
Например, если взять указатели на массивы. **m имеет тот же адрес, что и *m, что и m

Разные адреса одной и той же переменной. Почему?
Вот сам наткнулся на такую вещь. int * GETAdress(int tmp) { return &amp;tmp; } int main() { int a = 6; int *pa;

Почему в scanf нужно указывать именно адреса переменных?
Почему в функции scanf нужно указывать именно адреса переменных? Почему не работает, когда указываем переменную? Что хранит в себе...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru