LINUX.ORG.RU

Вопрос по С++ (конкретно, связанный с gcc 3)


0

0

Проблема такая.
Был код:

char buf[256];
ostrstream(buf, 256) << "is it works?" << '\0';
cout << buf << endl;

скомпиленное gcc 2.95 на экране выводило:

is it works?

теперь выводится значение указателя char*,
который суть эта строка в кавычках.

Как сделать, чтобы все было по-прежнему?
Кто знает?

anonymous

явно указать содержимое буфера: ostrstream((char*)&buf, sizeof(buf))

и всегда так делать, не полагаясь на компайлер, что он сам приведет.

proff
()

Тебе надо было ответить так:

НЕ ЗНАЮ, В ЧЕМ ДЕЛО.
Классы i/ostrstream устарели. Надобно использовать
класс ostringstream без чаровского буфера:

#include <sstream>

using namespace std;

ostringstream out;

out << "is it works";
cout << out.str() << endl;

JekLove
()

Нету у меня gcc 3 чтобы проверить, но IMHO дело в том, что char const * != char * const != char const *const Видать, забыли перегрузить << на (char const *), или в форматах подзапутались. Типичная для C++ заморочка, хрен поймешь, что написАл, пока все исходники не изучишь;). Спробуй cout << (char const *const)buf << endl;

Die-Hard ★★★★★
()

Да я уж и так и эдак... И исходники смотрел - этот оператор в явном виде для const char* есть. Видать, и правда, при переписывании stdc++-v3 все поперепуталось, вот и выводится значение указателя... Мож, фикс какой выйдет...

JekLove
()

Да я уж и так и эдак... И исходники смотрел - этот оператор в явном виде для const char* есть. Видать, и правда, при переписывании stdc++-v3 все поперепуталось, вот и выводится значение указателя... Мож, фикс какой выйдет... Но ostringstream, без сомниния, удобнее.

JekLove
()

Да я уж и так и эдак... И исходники смотрел - этот оператор в явном виде для const char* есть. Видать, и правда, при переписывании stdc++-v3 все поперепуталось, вот и выводится значение указателя... Мож, фикс какой выйдет... Но ostringstream, без сомнения, удобнее.

JekLove
()

Да я уж и так и эдак... И исходники смотрел - этот оператор в явном виде для const char* есть. Видать, и правда, при переписывании stdc++-v3 все поперепуталось, вот и выводится значение указателя... Мож, фикс какой выйдет... Но ostringstream, без сомнения, удобнее.

JekLove
()
Ответ на: комментарий от JekLove

Дак ты попробовал привести buf к const char *const ?

Die-Hard ★★★★★
()

Нету у меня сейчас gcc 3, но может поможет просто копировать сначала строку в buf: strcpy(buf,"Does it work?"); cout<<buf; - не особо, но может помочь...

Fendor
()

Да, я пробовал привести buf к const char*. Не помогает.
Конечно, можно скопировать строку с помощью strcpy,
но ведь в старом коде придется переписывать десятки строк! :-(((((((((((((((((((((((((








JekLove
()
Ответ на: комментарий от Fendor

2Fendor (*) (2002-03-06 18:19:50.0): Очевидно, нет. Оператор cout<<buf << endl; выдает, как описано, адрес buf. Очевидно, независимо от содержания buf.

Die-Hard ★★★★★
()

2JekLove (*) (2002-03-06 18:58:03.0):
Извиняюсь за настырность :),

> Да, я пробовал привести buf к const char*.
Ты пробовал В ТОЧНОСТИ строку:
cout << (char const *const)buf << endl;
???

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> 2Fendor (*) (2002-03-06 18:19:50.0): Очевидно, нет...
Пардон, не очевидно. В оригинале:

> теперь выводится значение указателя char*,
> который суть эта строка в кавычках.

что можно понять по-разному.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Тогда могу только сказать, что ошибка в gcc :=(( или в классах ios или их надстройках - см. сырцы иди даже не знаю что <:=((

Fendor
()

Братцы, вы не так поняли.
cout выводит строку как надо.
Не работает именно ostrstream.
То есть это ostrstream пишет в буфер целое число,
а cout тут не причем.

JekLove
()
Ответ на: комментарий от JekLove

2JekLove (*) (2002-03-06 19:38:43.0):
> cout выводит строку как надо.
Почему ты так думаешь? Т.е., ты пробовал "вручную" запихать в буфер
строку, и cout ее вывел как надо? Тады ой! Баг, надо репорт слать...

И, pls., ответь на мой предыд. вопрос - ты пробовал так, как я предложил?
Мне ж тоже интересно ;), а gcc 3 нету.

Die-Hard ★★★★★
()

2Die-Hard.
К сожалению, все плохо, т.е. как я и говорил.
Привожу коротенькую прогу.


#include <strstrea>
#include <iostream>

using namespace std;

int main()
{
char buf[] = "Hello!";
cout << buf << endl;
cout << (char const *const)buf << endl;

char buf2[32];
ostrstream(buf2, 32) << "Hello! (2)" << ends;
cout << buf2 << endl;
cout << (char const *const)buf2 << endl;

return 0;
}


При запуске имеем:

Hello!
Hello!
0x15e7
0x15e7


Такие дела :-(((


JekLove
()

Странно, куда-то делся мой ответ...
Окей, повторю.

2Die-Hard.

Все плохо, как я и говорил.
Вот тестовая прога:

#include <strstrea>
#include <iostream>

using namespace std;

int main()
{
   char buf[] = "Hello!";
   cout << buf << endl; 
   cout << (char const *const)buf << endl; 
   
   char buf2[32];
   ostrstream(buf2, 32) << "Hello! (2)" << ends;
   cout << buf2 << endl; 
   cout << (char const *const)buf2 << endl; 

   return 0;
}

Она выводит:

Hello!
Hello!
0x15e7
0x15e7


Вот такие дела...
:-((



JekLove
()
Ответ на: комментарий от justme

2justme (*) (2002-03-07 22:57:32.0):
> Попробуй ещё ostrstream(buf2, 32) << (char const * const) "Hello!" << ends;
А разве typeof(char const * const) != typeof("xxx") по определению?

Die-Hard ★★★★★
()

народ, где вы видели в стандарте ostrstream? нетути такого, пережиток прошлого, правильно человек сказал, надо

#include <sstream> #include <iostream>

stringstream ss;

ss << "Hello!";

cout << ss.str() << endl;

там можно и до буфера добраться, если надо... но зачем в данном случае?

HTH

anonymous
()

Ну вот и я о том же... Так что всем спасибо за помощь!

JekLove
()

2Die-Hard: так-то оно так, но раз уж этот gcc-3.0 в буфер пихает не то, что должен, может у него и с этим проблемы?

justme
()

2JekLove (*) (2002-03-08 10:22:03.0):
Ради чистоты эксперимента, спробуй:

ostrstream os(buf2, 32);

os << "Hello! (2)" << ends;
cout << os.str() << endl;

Die-Hard ★★★★★
()

2Die-Hard. Хех! Работает вроде правильно! Точнее, полуправильно :-) Т.е. видим на экране:

Hello! (2)

anonymous
()
Ответ на: комментарий от anonymous

2anonymous (*) (2002-03-08 19:35:23.0):
> Точнее, полуправильно :-)

Не въехал... Что значит - "полуправильно"? Мы, типа, это и должны были увидеть.
И, pls., подробнее - версию g++ и результаты предыдущих попыток.

А, вообще-то, мне интересно поведение компилера именно
JekLove'а : я пробовал его примеры на МАССЕ С++ компилеров, как гнутых,
так и наитивных, под разные платформы - нигде такой фичи не наблюл.

СТРОГО говоря, описанное JekLove'ом поведение ПОКА не баг - никто не обещал,
что буфер, выделенный под ostrstream, будет содержать втюхнутую в него
строку.

Я был совсем покорен таким фактом: bool под gnu C++ на 64 битах занимает именно эти
64 бита, а int (как и положено по многократно озвученной идеологии) - только 32.
После такого я уже ничему не удивлюсь (в смысле реализации стандартов).

Die-Hard ★★★★★
()

2Die-Hard.

Под полуправльностью я имел в виду то, что str() выводит вроде то что надо, а в buf почему-то гонит пургу :-)

Результаты предыдущих попыток висят в этом топике (я же приводил программу с результами). А юзаю я за неимением лучшего (линукса) досовский, т.е. DJGPP вариант компайлера gcc 3.0.3.

JekLove
()

2JekLove: "а в buf почему-то гонит пургу :-)"

гонит пургу то-есть выдает адрес буфера? ну дак так и должно быть чтобы char* можно было посмотреть как надо, то-есть адрес, заметь, char* это НЕ строка, строка это (const char *), (const char const*) это тоже не строка, хуже того, это еще и бессмысленно, примерно так-же как передавать const int в функцию, ибо он и так передается по значению, и никак не получится его поменять, надеюсь теперь уже все грабли собрали в кучу и разобрались?

HTH

anonymous
()

Да все понятно... Не понятно, почему все старые компайлеры gcc выдавали в ostrstream содержимое текстовой строки..

JekLove
()
Ответ на: комментарий от JekLove

2JekLove (*) (2002-03-09 02:46:44.0):
> результаты предыдущих попыток висят в этом топике
Ок, усе ясно. Я не подумал, что анонимус - это ты.

> str() выводит вроде то что надо, а в buf почему-то гонит пургу
Ну, могу только повториться - никто не обещал, что ostrstream будет
использовать выделенный ему буфер по прямому назначению. Т.е., это НЕ баг.

Глупости, конечно...

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.