[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/24 21:17 / Filesize : 258 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.38【環境依存OK】



1 名前:デフォルトの名無しさん [2007/06/03(日) 22:33:55 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.37【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1178432985/l50
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


792 名前:730 mailto:sage [2007/06/19(火) 22:17:42 ]
>>759
Color::ColorDimension が定数でなかった場合の動作はどうなりますか?
クラスのstaicオブジェクトが初期化される順番は未定義であるように、
初期化順序が未定義なために不定動作となるのか、
派生関係があるので初期化順序をコンパイラが考えてくれるのか、
どちらになるのでしょうか?


793 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:26:19 ]
>>792
テンプレート展開はコンパイル時に行われるから、
コンパイル時に判明する定数値しかを与えることができない

794 名前:730 mailto:sage [2007/06/19(火) 23:51:30 ]
>>793
ああなるほど、確かにそうですね。これはテンプレートを使わない場合も同じですよね。
コンパイル時に行われるということを考えると文法も分かりますね。

・OKな例
class Base
{
public:
static const int A;
};
class Derived : public Base
{
public:
static const int B;
};
const int Base::  A = 1;
const int Derived:: B = A;

・ダメな例
class Base
{
public:
static const int A;
};
class Derived : public Base
{
public:
static const int B = A;
};
const int Base::  A = 1;

たしかにwww。ありがとうございました。

795 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:55:57 ]
いかん
最近始めたCの勉強をここ一週間ほどさぼってたんだが
ここ見てちょっと焦ってきた
いかんいかん

796 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 01:49:32 ]
例としてですが、とある値を格納するクラスを作ってます。型はテンプレートで
template<typename T> value_t
{
public:
  T get() const { return value; }
  void set(T n) { value = n; }
private:
  T value;
};
という感じになると思います。value_t<int> とかなら問題ないと思いますが、
(普通は参照を使って渡す)クラスや構造体が型に指定されると、
無駄にコピーコンストラクタが呼ばれたりすると思うので、微妙な感じになってしまいます。
ということで、最初から参照を使って、
template<typename T> value_t
{
public:
  const T & get() const { return value; }
  void set(const T &n) { value = n; } // ここで operator= が呼ばれるのは問題ないことにする
private:
  T value;
};
こう書いても問題ないですか?(というか、こう書くべきですか?)

797 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 02:00:31 ]
問題はないけど、
プリミティブ型だと結構遅くなる。


798 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 02:37:39 ]
>>796
boost::call_traitsはどう?
もしくは、参照を扱うメソッドと値を扱うメソッドの2パターン作るとか

799 名前:デフォルトの名無しさん [2007/06/20(水) 08:26:49 ]
>>783
>>788
ありがとう。「最適化で消された」みたいです。腑に落ちました。

800 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:49:37 ]
ofstream ofs("a.txt",ios::app);
ofs << ((LPCREATESTRUCT)lParam)->lpszClass << ',' << ((LPCREATESTRUCT)lParam)->lpszName << endl;
や、
if (!lstrcmp(((LPCREATESTRUCT)lParam)->lpszClass,"ClassName") && !lstrcmp(((LPCREATESTRUCT)lParam)->lpszName,"WindowName"))
だとプログラムがクラッシュすることがあります。(lpszClass、lpszNameどちらか一方のみでも)

ofs << ((LPCREATESTRUCT)lParam)->hwndParent << endl;
や、
if (((LPCREATESTRUCT)lParam)->hwndParent == FindWindow("ClassName","WindowName"))
のようにhwndParentならクラッシュしません。これは何が原因でしょうか?



801 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:51:30 ]
>>800
各変数の値がどうなってるかくらい調べろよ

802 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:56:12 ]
>>800
とりあえず無節操に行われているこのキャスト (LPCREATESTRUCT)lParam が怪しすぎる。
キャストが安全である根拠はあるか?
キャストが安全だとして、有効なポインタが渡されてるという保証はあるのか?

803 名前:800 mailto:sage [2007/06/20(水) 13:04:12 ]
>>801
すみません、フックなので変数を予測できず、どの値でクラッシュしてるか分かりません。

>>802
ウィンドウプロシージャのメッセージがWM_CREATEの時に使用してるので大丈夫だと思うのですが。

804 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:13:25 ]
C++で安全なコードを書きたいなら、キャスト前のチェックとか、
->の元がNULLでないことを保証するassertなんかは必須かと

というか、クラッシュするコードの lpszClassや lpszNameの内容チェックコードを
処理の前に挿入してログにでも吐けばいいんじゃね?

805 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:17:03 ]
>>803
予測なんてしなくていいから、デバッグ実行しろ。

806 名前:800 mailto:sage [2007/06/20(水) 13:41:47 ]
>>804
lstrcmp〜でクラッシュするのでofstream〜で値を確認しようとしたんですが駄目だったんです。

>>805
デバッグしたんですが慣れてないので分からなかったんです、ごめんなさい。

807 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:56:34 ]
MSDNのCREATESTRUCTに関するヘルプには
Because the lpszClass member can contain a pointer to a local
(and thus inaccessable) atom, do not obtain the class name
by using this member. Use the GetClassName function instead.
と書かれているようだが。
lpszClassに直接アクセスしてクラス名を取得しようとするな
ってことじゃねえの。

808 名前:800 mailto:sage [2007/06/20(水) 15:24:02 ]
>>807
わざわざありがとうございました。

809 名前:デフォルトの名無しさん [2007/06/20(水) 19:21:18 ]
class Stone{
public:
Stone();
int color, groupNumber;
Stone *nextStone, * groupHead, *nextGroup;
};

Stone::Stone(){
color = groupNumber = 0;
*nextStone, = *groupHead, = *nextGroup = 0; // (1).ここで整数を代入できない
}
というStoneオブジェクトのインスタンスを21*21の二次元配列として生成して、
Boardオブジェクトを作りたいと考えています。

改行が多いといわれたので続きます

810 名前:809の続き [2007/06/20(水) 19:22:32 ]
class Board{
public:
   Board();
   Stone board[21][21];
   Stone *boardHead;
};

Board::Board{
*boardHead = &board; // (2).Stone(*)型はStone型に変換できない
for(int i; i < 20; i++){
int j;
for(j; j < 19; j++){
board[i][j].color = 3;
board[i][j].(*nextGroup) = board[i][j + 1];
   }
board[i][j].color = 3;
board[i][j].(*nextGroup) = boardboard[i + 1][1}; // (2).と同様
}
と表記したところ、(1).(2)のエラーが起きました。
配列の要素一つ一つにポインタを持たせて、グループ化をしたいと思っています。どうすればよいのでしょうか?



811 名前:809、810 [2007/06/20(水) 19:24:44 ]
すいません。書き忘れです。

(1)では、ヌルポインターを取り合えず代入したいと思っています。
(2)では、配列番号から、要素のポインターを代入したいと思っています。

812 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 19:29:47 ]
(1)のところには、余計なカンマが付いている
(2)の最初の箇所は、余計な*が付いている
2つ目の(2)は、board[i][j].nextGroup = &boardboard[i + 1][1];にしろ

813 名前:デフォルトの名無しさん [2007/06/20(水) 19:31:34 ]
(1)で*付ける意味も分からんし

nextStone = groupHead = nextGroup = 0;

とか

814 名前:デフォルトの名無しさん [2007/06/20(水) 19:33:43 ]
すみません、質問させてください。

void foo(const char *const& hoge);

のような宣言の関数があるのですが、引き数定義部分の「const&」の意味が
分からずに悩んでいます。この宣言はどう解釈すればよいのでしょうか?
よろしくお願いします


815 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 19:42:09 ]
constな(C++の)参照

宣言自体の読み解き方がわからなければ、ここでも読んでおけ
kmaebashi.com/programmer/pointer.html
Cだから参照は出てこないが、ポインタの*と同じような要領で解釈しろ

816 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 20:19:12 ]
>>812-813
あ、*の扱い方が間違ってたのか。ありがとうございました。

817 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:05:47 ]
windowsで、C++builder使用してます。

質問です。
Linuxだと、iptablesのテーブルの中身を書き換えて
iptablesを再起動すると、設定変更できますよね。
やりたいことは、
※時間ごとに、アクセスできる人を変更したいんです。

これをwindowsでやりたいんです。
1、ファイアーウォールみたいなのから、自分で作る。
 これは難しいでしょうか?パケット見て、捨てたり、捨てなかったり
 とかのやり方がわからないです。本などご存じないでしょうか。
2、フリーのファイアーウォールソフトを探してきて、
 linuxのiptablesと同じように、テーブル書き換え->ソフト再起動
 で、できそうでしょうか?

2番目だと簡単そうですか?

818 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:56:04 ]
ソフト単体ならパケット監視してどうこうということもできるだろうけど、
windowsのばあい、システムに対してユーザーが介入するのは難しい。

アクセスというのは、何に対してのアクセスなんだ?
webサーバーとか、ftpサーバーとかだったら、そのサーバーソフトのフィルタリング設定を使うべきだろう。
共有ディレクトリへのアクセスを制限するというなら、また別の方法が必要だろうが。


819 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 22:05:58 ]
>>817
ttp://www.wilderssecurity.com/showthread.php?t=112582
でも読んでみたら

820 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 22:29:39 ]
>>818
レスありがとうございます。
ふむふむ。windowsだと難しいですか。
自分作ってないソフトで、しかもそのソフトは
フィルタリング機能とか無いんです。

>>819
ありがとうございます。
iptablesと似てるのないですか。だけ理解できました。
じっくり、読んでみます。
似たようなのがあれば、やりたいことできそうですね。



821 名前:デフォルトの名無しさん [2007/06/20(水) 22:47:33 ]
>>820
そんなあなたにフィルタドライバか、DLLインジェクション。

822 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:07:41 ]
なんで具体的にそのソフト名をいわんのかね。

823 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:36:12 ]
改造する気?

824 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:45:03 ]
C++でLinkポインタというのを作りました
所有権を持つポインタオブジェクトが自分のコピー?に対する参照リストを持っていて
自分が消滅する時にそれらを一気にぬるぽ値に設定することで
コピーは本体の事を意識しなくて済むというメリットがあります

質問はこれと似たような事が出来る既存のライブラリは無いかということです
正直あまり良い実装じゃない上に根本的に泥臭いんですよね…

825 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:53:56 ]
Lockできないboost::weak_ptrを実装したって話?

826 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:31:22 ]
あのー

(unsigned int) ((context->count[0] >> 3) & 0x3F)

これがなぜ64のあまりになるのですか?

827 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:33:42 ]
>>826
0x3fは2^6-1だから。

828 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:47:40 ]
0x3f=16*3+1*15

829 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:50:06 ]
えーとじゃあ
45と120の場合いくらになるんだろ
なんか計算あわない

830 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:52:38 ]
>>826
一瞬、LISPあたりのコードかと思った。



831 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:53:37 ]
ところでなんで
(context->count[0] >> 3)してるんだろう。

これすると値辺になる気がするのですが

832 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 13:05:29 ]
つーかそれ、
8で割った後に64で割った余りを求めてる事になるが


833 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 13:14:49 ]
あっそ、よかったね

834 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 14:30:08 ]
よくないという話だな

835 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 14:54:13 ]
>>826
10進数で下6桁残して上の桁を0にしたら
それは100万 (10^6) で割った余りになる。

それと同じように、0x3F で AND とると
(=2進数の下6ビットを残して上のビットをクリア)
64 (2^6) で割った余りになるわさ。

836 名前:ひろみつ [2007/06/21(木) 16:29:58 ]
Cって何言語で一版最初書かれたの?今のC言語はCで書かれてるとかいうのはなしね。

K&Rだかなんだかが、一版最初に書いたのは、何で書いたの?アセンブラ?B?

837 名前:デフォルトの名無しさん [2007/06/21(木) 16:33:43 ]
ひろみつ死ね

838 名前:デフォルトの名無しさん [2007/06/21(木) 16:50:44 ]
すみません。長いソース打ち込みたいとおもって、本屋で長いソースが載っている本を買ってきました。
www.amazon.co.jp/C%E4%BE%BF%E5%88%A9%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E9%9B%86-%E6%9E%97-%E6%AD%A3%E5%B9%B8/dp/4320027108/ref=sr_1_3/250-4187414-6697033?ie=UTF8&s=books&qid=1182412183&sr=1-3
です。

QuickC対応って書いてあるんですが、VC++6.0でも大丈夫ですか?

839 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 17:10:28 ]
>>838
QuickC……

その本は今すぐ返品しなさいw
ソースが欲しいなら、
sourceforge.jp/
sourceforge.net/
なんかで探しなさい。
もしくはあなたの好きなアプリやライブラリでオープンソースなのを探しなさい。

840 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 17:57:25 ]
94年じゃしょうがないな



841 名前:デフォルトの名無しさん [2007/06/21(木) 18:27:59 ]
unsigned conv_in:1;
という記述を見かけたのですが
このコロンはなんですか?

842 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:31:58 ]
>>841
ビットフィールド。
変数のサイズを1bitにする指定。
とはいっても、実際に1bitになっているわけじゃないけど。
1bitしか使わない宣言というべきなのかな。

843 名前:838 mailto:sage [2007/06/21(木) 18:33:45 ]
>>839
どうもありがとうございました。そんなサイトがあるんですね・・
すごいです。独学者なので、助かります。ありがとうございました。

>>840
やっぱだめですよね。。どうもありがとうございました。

844 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:35:49 ]
おいおい独学社ならそれくらい嫉妬家よ

845 名前:841 mailto:sage [2007/06/21(木) 18:44:33 ]
>>842
ありがとうございます

846 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:55:12 ]
>>844
今日始めたばかりの独学者なんだろ。事情を察しろ。

847 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 19:06:10 ]
そういうところのリンクをまとめて貼ってもいいんだが
見つける喜びってのがあるからなあ

848 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 19:09:04 ]
>>847
急に貼られても今日始めたばかりの独学者だから困るだろ。事情を察しろ。

849 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:20:52 ]
長いソースを打ち込みたいならCプログラミング診断室


いや本気にしないでね

850 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:22:08 ]
>>825
おー、weak_ptrで出来るんですね
しかもロック付ですか…凄い



851 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:45:49 ]
OfficeのWORDの文字だけをいじるプログラムを組みたいのです。
ただ、UNIX系を想定しているので、COMを使った方法ではダメなのです。
DCOMを使うのも、避けたいのです。

そこで、WORDのデータ構造を調べてみたのですが、どこにも見当たらないのですが、
UNIX系で操作できるようなライブラリ・もしくはデータ構造がわかるサイトがあれば教えてもらいたいです。

よろしくお願いします、

852 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:51:51 ]
あ〜残念。データ構造がわかる頭は持っててもサイトは知らないやゴメンね、

853 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 01:10:31 ]
あー残念。RTFやOpenOfficeText形式なら知っているけどMSWord形式は知らないや。

854 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 01:17:29 ]
POIでいいじゃん。
がんばって移植すれ。

855 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 04:31:38 ]
typedef vector<int> V;
typedef V::iterator I;
typedef vector<V> VV;

VV vv;

for_each(
  vv.begin(),
  vv.end(),
  tr1::bind(
    &fill<I,int>,
    tr1::bind(static_cast<I (V::*)()>(&V::begin), tr1::placeholders::_1),
    tr1::bind(static_cast<I (V::*)()>(&V::end), tr1::placeholders::_1),
    0));

g++ 4.1.2です。
2次配列の初期化をalgorithmの練習でやってみようと思っていろいろ試行錯誤してみたのですが、
こんな悲しいコードになってしまいます。
static_castは省略できても良さそうなものですが、これはg++特有の問題でしょうか?
(省略できたとしても普通にループ書いたほうがわかりやすいけど)

856 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 08:20:41 ]
>>852
ふと思ったんだが、公開されてないデータ構造ってどうやってわかるの?
やっぱバイナリエディタで開くと、大体わかっちゃうものなの?

857 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:06:54 ]
>>856
バイナリデータの解析の基本は
「ちょっといじって何が変わったか調べる」。

858 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:10:48 ]
夏カシス昔よくやった

859 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:00:27 ]
>>855
g++ じゃなくても static_cast は外せないだろうね。
bind() の第1引数にはほとんど何でも入るから、コンパイラの知ってる情報だけでは
オーバーロードされた &V::begin のうち適切なものを選べない。

860 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:55:40 ]
>>851
WORDは色々バージョンも多いから
そんなめんどくさい事せずに、POIを使った方がいいと思われ。
ただ無駄にJavaのコード呼び出す必要があるけどな。



861 名前:デフォルトの名無しさん [2007/06/22(金) 13:26:29 ]
0〜9の数字をランダムに発生させて
数字が被らないように
どのような順番で数字が来たか表示させるという処理をしたいのですが
このようなプログラムを作るにはどうすればいいのでしょうか
乱数生成時に数字が被りすぎて無限ループに近いじょうたいになってしまいます



862 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:30:14 ]
0〜9 の数字を入れた配列を作ってシャッフルするのが一般的。
C++ なら random_shuffle って関数テンプレートがあるから、それ使う。
C なら自前で作るべし。
アルゴリズム悪いと確率が偏るから、
ランダムシャッフルで検索してアルゴリズム調べてちょ。

863 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:30:39 ]
>>861
絶対被っちゃいけないなら、それは0-9のランダムではなくて0-9のうち前回の数字を取り除いたランダムじゃないか。

864 名前:861 [2007/06/22(金) 13:35:54 ]
           ,,                                 ,,,
  ゙'lliiiiiiiiiiiiilllllllllllllllll|||li,,                               l||||l
   ゙゙゙゙゙  、,,,,,,,ii!!"゙゙゙゙゙     、,,,,,,   、,,,,                      ||||
      ,l||||"       ゙゙'llli,, ゙l||! ,,l|||゙   ill,,,,,,,,,,,,,,,,,,,,,,,,,,,iiilllll,,,      |||
      ,,l|||!         ゙゙゙゙゙  ,,,l||"     ゙゙'゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙       ||
     ,il|l゙゙            ,,rlll"                      ,,,,
    ,,ill"゙           ,,,ril"゙                         il||||l

865 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:40:26 ]
力抜けよ

866 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:56:17 ]
そう、もっと・・・力を抜いてごらん・・・。

867 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:59:44 ]
for (;;) { >>865 >>867 >>866 }

868 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 14:02:50 ]
5→6→4じゃね?

869 名前:デフォルトの名無しさん [2007/06/22(金) 14:27:56 ]
C++では変数の宣言をどこにでも置けると聞いたのですが、
goto文で変数の宣言を飛ばすことはできないのですか?
以下の文をコンパイルできません。

int main() {
goto end;
int a = 100;
end:
return 0;
}

870 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 14:38:20 ]
>>869
何が目的なのかさっぱり解らんが、
「宣言」は「実行」されないんだから
飛ばすも何もない。



871 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 15:43:43 ]
つまり、gotoで分岐する範囲では宣言できないということだ。

872 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 15:46:05 ]
switch - case で、caseで宣言できないのと同じだな

873 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 16:18:11 ]
最初に格納する数値を入力して、
以下のように文字などを無視してその個数分だけ整数値を格納する
というプログラムを作りたいのですが、これって可能でしょうか?
fgetsとstrtolを使うといけそうな気がするのですが
頑張ったものの自分ではどうにもならない状況ですorz

【実行画面】
個数を入力したください>>5
5a11bbb7
88yew99

数値1:5
数値2:11
数値3:7
数値4:88
数値5:99

874 名前:デフォルトの名無しさん [2007/06/22(金) 16:53:19 ]
いままでCでは数値を文字列にするときは
sprintf(str,"%d",num);のようにやってたのですが、
C++でstd::stringとsize_type size()等、STLを使う場合はどのように変換すればいいのでしょうか?
std::string str1 = "ああああ";
std::string str2 = "長さ" + str1.size() + "です";
みたいに使いたいのですが、これはエラーがでます。


875 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:01:09 ]
boost::lexical_castなどはどうだろう

876 名前:874 [2007/06/22(金) 17:10:29 ]
>>875
おお、すげー便利なもんあるんですね。ありがとうございます。早速使ってみます。

877 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:20:04 ]
>>873
一文字ずつアスキーコードで比較して行けばいいのでは?

878 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:25:46 ]
>>873
宿題なら宿題スレ行きを薦めるが、とりあえずこんな感じで出来る。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
    int i, c, nc, *nv;
    printf("個数を入力してください>>");
    if (scanf("%d", &nc) != 1 || nc <= 0) return 1;
    nv = malloc(nc * sizeof(int));
    for (i = 0; i < nc && (c = getchar()) != EOF; ) {
        if (isdigit(c)) {
            ungetc(c, stdin);
            scanf("%d", &nv[i++]);
        }
    }
    nc = i;
    for (i = 0; i < nc; i++)
        printf("数値%d:%d\n", i+1, nv[i]);
    free(nv);
    return 0;
}

879 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:41:32 ]
>>877
このスレを最初から読んでいたらscanf処理のことが書いてあって、
代わりにfgets+strtolということが書いてあったので
この処理を弄くって上に書いたような処理がOKになったら
使いやすくなりそうだと思ったのですが
やはりこの仕様にするとそれが早いかもですね…。

>>878
宿題では無くちょっとこのスレを読んでいて気になったので考えていました。
しかし書いてくださりありがとうございます。
いくつか知らない関数があるのでググって見てみます。


ちなみにfgetsとstrtolで12a23から12と23を取りたかったら
strtol(str,&error[i],0);
strtol(&error[i]+1,&error[i+1],0);
こんな感じでずらしていく感じにするのでしょうか?


880 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:51:22 ]
>>879
こんなかんじ。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
    char buff[0x1000], *p, *q;
    unsigned char c;
    while (fgets(buff, sizeof buff, stdin)) {
        for (p = buff; c = *p++; ) {
            if (isdigit(c)) {
                printf("%ld\n", strtol(p-1, &q, 10));
                p = q;
            }
        }
    }
    return 0;
}



881 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 18:25:06 ]
>>880
おぉ、激しく感謝です!
しかもコードが短くて使いやすくて良いですね!
今日なんだかんだで5、6時間ほど考えていたので
教えてくださりかなりガチで嬉しいです><
重ね重ねですが本当にありがとうございます!

882 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:30:17 ]
突然すみません。質問させていただきます
自分は最近Cを始めたばかりの初心者で、初心者向けの本を参考にしてプログラムしています。
そして、その本を読み終えてさあがんばってみようと、ためしにオープンソースのものをDLして、ソースコードを見てみました
すると、いくつもファイルがあり、ひとつではありませんでした。
教本を見ても複数ファイルを同時に扱ってプログラムをする、なんてやりかたはどこにも書いていなく、戸惑っています
どうやって複数のソースコードをひとつのプログラムとしてまとめられるのでしょうか?
分がわかりにくかったらすみません。教えていただけたら幸いです。

883 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:35:30 ]
分割コンパイルで検索

884 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:43:54 ]
解凍したディレクトリで、./configure か、counfigure.bat したあと、make か nmake

885 名前:たろう [2007/06/22(金) 21:41:10 ]
曖昧さについて質問があります。
現在、ある処理をできるだけ小さいプログラムで記述する競争をしてまして、
以下のような記述か可能かどうか教えてください。

●質問1
-----
int a = 0;
int b[] = {a++, a++, a++};
-----
と記述した場合、
b = {0, 1, 2} となるのでしょうか?
それともコンパイラ依存でしょうか?

コンマ演算子は左から行う結合ルールですが、
この場合は演算子じゃないので、
明確なルールはなく、コンパイラ依存でしょうか?

●質問2

func1 があるクラスのポインターを返す関数であるとして、
-----
int a = 0;
func1(a++)->func2(a++);
-----
と記述した場合、
func1(0)->func2(1) となるのでしょうか?
それともコンパイラ依存でしょうか?

func1(0) を実行してからでないと、func2 が決定しないので、
なんとなくその中の引数の評価が後のような気がしますが。


886 名前:じろう [2007/06/22(金) 22:12:25 ]
やあ、たろう
この勝負は俺がもらった
約束通りお婆ちゃんの貞操は頂いて逝くぜ

887 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:20:55 ]
int a = 0;
int b[] = {a++, a++, a++};
-----
int b[] = {0, 1, 2};の方がよほど短いわけだが。

-----
int a = 0;
func1(a++)->func2(a++);
-----
同様にfunc1(0)->func2(1);ではいけないのだろうか。

まぁ、一つの式の中にa++が二つある場合の評価順序は不定と言うことで。

888 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:27:23 ]
>885
プログラムを短くするノウハウについては
↓のスレが勉強になるかもよ

七行プログラミング part5
ttp://pc11.2ch.net/test/read.cgi/tech/1142467359/

889 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:38:11 ]
>>880
sizeof(buff)の形ならよく見るのですが、sizeof buffのように括弧のないものって何でしょうか?

890 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:41:30 ]
>>889
別にカッコつけなくても生きていけるんです



891 名前:デフォルトの名無しさん [2007/06/22(金) 23:46:17 ]
sizeofというのは「関数」じゃない。
だから、sizeof(buf)のbufは、関数の「引数」じゃない。
関数じゃないから、括弧は「関数呼び出し演算子」ではない。
sizeofは、演算子の一つ、sizeof演算子です。だから、括弧は不要。

「1+1」を「 (1)+(1) 」とは書かないでしょ?これと一緒。


892 名前:889 mailto:sage [2007/06/23(土) 00:11:33 ]
ありがとうございます。付けなくてもいいんですね。
なのに()付きのサンプルコードが多いのは何故なんでしょうか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<258KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef