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

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

03.12.2011, 00:19. Показов 4835. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru