スレを勃てるまでもな ..
[2ch|▼Menu]
705:デフォルトの名無しさん
07/08/01 17:28:39
>>702
reserveで押さえただけ領域は使ってはいけないところ。
vectorで使える要素は0番目からsize()の1つ手前の要素まで。
size()の値を変えるにはresize()。

特に要素がクラスオブジェクトだとコンストラクタが呼ばれていなかったり、
デストラクタが呼ばれた後だったりするのでわかりやすいけど、
組込型でも駄目なことに変わりはない。


706:デフォルトの名無しさん
07/08/01 17:29:21
vectorかnewかどっちがいいかは、巨大配列を確保したときに問われるだろう
何となくvectorは100M超の領域確保に向いていない気がするが・・・
速度、安定性において同程度ならvectorに統一した方がいい




707:デフォルトの名無しさん
07/08/01 17:30:12
>>701
それを不便というなら、比較対照にしてる組み込み型では
int *v = new int[0]
と宣言してるも同然じゃね?

708:デフォルトの名無しさん
07/08/01 17:31:28
>>706
それは仰るとおり
ほとんどの場合はvectorでも問題ないから
おれはvector使う


709:デフォルトの名無しさん
07/08/01 17:31:46
>>704
なるほど
複雑な特殊化をする時に必要となりそうな気がするのでメモっておきます

710:デフォルトの名無しさん
07/08/01 17:37:55
>>706
new[]はoperator new[]関数、newはoperator new関数、
vectorは、operator new関数で確保される。
共に<new>に存在し、operator newとoperator new[]で
異なる実装になっていることは考えづらい。殆どの処理系で、同一の実装だと見なして問題ないはず。
そして、operator newやoperator new[]を自分で定義すれば、メモリ確保ルーチンを差し替えられる。

またvector(やその他全てのコンテナ)はアロケータをテンプレート引数に取り、
それを差し替えることでもメモリ確保ルーチンを変更可能。

不用意にinsertやpush_backしなければ、巨大な配列もvectorにして問題ないと思う。
それでも不安ならshared_array/scoped_arrayなんて選択肢もあるけどね。

711:デフォルトの名無しさん
07/08/01 18:01:21
>>710
>不用意にinsertやpush_backしなければ、巨大な配列もvectorにして問題ないと思う。
是。reserve しとけば push_back も怖くない。

712:デフォルトの名無しさん
07/08/01 18:11:39
>>710
オーバーヘッドが掛かったり無駄に確保したりしていないかvector
new単体で使えば2倍の領域確保とかないだろうし

713:デフォルトの名無しさん
07/08/01 18:33:08


      |
      |
      |
      |              /  ̄   ̄ \
     (=)           /、          ヽ
     J >vector厨     |・ |―-、       |
                   q -´ 二 ヽ      |
                 ノ_ ー  |     |
                 \. ̄`  |      /
                   O===== |
                  /          |
                   /    /      |

714:650/668
07/08/01 18:35:00
戻りました。
VC++2005を修復インストールした結果、vector使ってもwarning LNK4217だけで済みました。
fatalなエラーでビルド失敗と言うことはないです。
やっぱ、何かが潰れていたっぽいっすね〜。
これでダメなら再インストールしようと思っていましたが、無事に済んだようです。

LNK4217エラーは4つ出て、どれも内容は似ています。
warning LNK4217: ローカルで定義されたシンボル ??1exception@std@@UAE@XZ (public: virtual __thiscall std::exception::~exception(void)) が
フィクション __unwindfunclet$??0logic_error@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z$0 にインポートされました。

僕の今の知識レベルでは、なんのことやら意味不明です。
実用上問題ないなら、#pragma warningで切っておきます。
ありがとうございました。

あれからのログを見ていると、vectorもやっぱり押さえておきたい基本技術みたいですね。
折を見て勉強再開します。


715:デフォルトの名無しさん
07/08/01 18:51:31
念の為OSの再インストールからやり直したほうがいいよ

716:デフォルトの名無しさん
07/08/02 21:26:13
typedef std::vector<Hoge> VEC_HOGE;

を定義したいときにHoge は前方宣言で対応可能でしょうか?
それとも#include しなければいけませんか?

前方宣言の可付加の決まり方がいまいちわかりません。
よろしくお願い致します。

717:デフォルトの名無しさん
07/08/02 23:49:38
typedef std::vector<ちぺなめ Hoge> VEC_HOGE;

718:デフォルトの名無しさん
07/08/03 00:11:16
すみません、質問させてください。
Cのプログラムで、popenを使ってpingを打ちたいと思っています。
その時に、p=popen("ping www.google.co.jp", "w")のように
直接相手先を書くのではなく、文字配列に相手先を格納し、
それを用いてpingを打つ方法がわかりません・・。
一応ぐーぐる先生にお尋ねはしたのですが、わかりませんでしたorz
(聞き方がまずかったのかも知れませんが・・)
どうぞよろしくお願い致します。

719:デフォルトの名無しさん
07/08/03 00:31:34
sprintf使えばいいんじゃないの?

720:デフォルトの名無しさん
07/08/03 00:39:38
入門書読んだ方がいいんじゃないの。
ping先壊したって知らないよ?

721:デフォルトの名無しさん
07/08/03 00:54:31
system()じゃいかんのかね。

722:デフォルトの名無しさん
07/08/03 01:02:11
>>716 って何か意味あんの?

723:718
07/08/03 21:14:19
遅くなってしまいましたが、アドバイスありがとうございました。
正直自分でも、入門書レベルからやり直した方がいいなぁと
自覚はしているのですが、今回は時間に余裕がなかったもので、
ここでお尋ねした次第です・・すみません。ご忠告ありがとうございます。
system()ではどうかとのことですが、プログラムの中でpingの結果を
受け取って処理をしたかったので、今回はsystem()ではなくpopen()を使いました。
記載し忘れてしましたね。ごめんなさい。
sprintfですか。ちょっと試してみたいと思います。
皆様どうもありがとうございましたm(_ _)m

724:デフォルトの名無しさん
07/08/04 20:36:45
行列で
-1 0 1
-1 0 1
-1 0 1 は以下のプログラムでできるんですけど(wはdouble、l,kはint)
for(k=0;k<3;k++)
{
for(l=0;l<3;l++)
{
w[k][l] = -1 + k;
}
}

-1 1 -1
-1 1 -1
-1 1 -1
はどんな感じでつくればいいですかね?増分2してみたいな・・・
上のプログラムを極力いじらない感じでお願いします

725:デフォルトの名無しさん
07/08/04 20:40:50
行列で
-1 0 1
-1 0 1
-1 0 1 は以下のプログラムでできるんですけど(wはdouble、l,kはint)
for(k=0;k<3;k++)
{
for(l=0;l<3;l++)
{
w[k][l] = -1 + k;
}
}

-1 1 -1
-1 1 -1
-1 1 -1
はどんな感じでつくればいいですかね?増分2してみたいな・・・
上のプログラムを極力いじらない感じでお願いします

726:デフォルトの名無しさん
07/08/04 20:43:15
すいません 2回も書いてしまいましたorz

727:デフォルトの名無しさん
07/08/04 21:12:58
-1×-1=1
これ算数。

728:デフォルトの名無しさん
07/08/04 21:16:16
-1 + k

(k % 2) * 2 - 1

729:デフォルトの名無しさん
07/08/05 05:27:34
int v;
for(k=0;k<3;k++)
{
v=-1;
for(l=0;l<3;l++)
{
w[k][l] = v;
v*=-1;
}
}
でいいじゃん

730:デフォルトの名無しさん
07/08/05 06:31:29
>>727>>729
本気でそんなプログラミングしているのか?
桑原桑原。

731:デフォルトの名無しさん
07/08/05 06:39:44
>>730
桑原桑原。

732:デフォルトの名無しさん
07/08/05 07:07:12
w[k][i] = i&1 ? -1 : 1;
を提案します(ぉ

733:デフォルトの名無しさん
07/08/05 07:07:59
lだった…orz

734:デフォルトの名無しさん
07/08/05 10:40:58
>>729
int v = 1;
for(k=0;k<3;k++)
{
for(l=0;l<3;l++)
{
w[k][l] = v * -1;
}
}

のほうがすっきり。

735:デフォルトの名無しさん
07/08/05 10:55:06
>>734
9つ全部-1にならない?

736:デフォルトの名無しさん
07/08/05 11:18:23
ここのつ、とう!
はい、よくできました♪

737:デフォルトの名無しさん
07/08/05 11:20:12
??

738:デフォルトの名無しさん
07/08/05 11:49:07
!!

739:デフォルトの名無しさん
07/08/05 11:50:44
3×3の行列の初期化くらいなら、
いちいちfor文で回したりせず、
double w[3][3] = { {-1.0, 0.0, 1.0}, {-1.0, 0.0, 1.0}, {-1.0, 0.0, 1.0} }
これでいいじゃないか。


740:デフォルトの名無しさん
07/08/05 11:58:06
例として3×3にしてるだけで、
実際はもっと大きいんじゃないのかな?

741:デフォルトの名無しさん
07/08/05 12:26:55
えー

for(k=0;k<3;k++)
のように、ハードコーディングしてるじゃん。

もし巨大だったり、任意のサイズだったら、そういうコードになるべ?

742:デフォルトの名無しさん
07/08/05 12:33:55
ていうかさ、
行列の問題なのか、
数列の生成の問題なのか、
切り分けてから質問してほしい。

743:デフォルトの名無しさん
07/08/05 12:57:18
全角数字使うなカス

744:デフォルトの名無しさん
07/08/05 18:49:04
揚げ足取り乙

745:デフォルトの名無しさん
07/08/05 18:52:32
揚げ足ってレベルじゃねぇぞカス

746:デフォルトの名無しさん
07/08/05 19:38:47
カスは自分のことを棚に上げる傾向にあります。

747:デフォルトの名無しさん
07/08/06 21:24:19

スレ違いだったらすいません。

アプリ開発の依頼スレが見つからなかったのでこちらに書かせて頂きました。
当方所有のウェブアプリケーションソフト
(以前プログラマに依頼して作ってもらったものですが今は連絡が取れません)
がURL先の変更?で突然使えなくなってしまいました。

そこで、緊急で本日中に改変が出来そうな方是非お願いできないでしょうか?
当方、全くの知識不足で言語が C++ということ以外分かりません。
ソースファイルは持っております。料金は2万円でお願いします!

seishinkeiki@hotmail.co.jp

748:デフォルトの名無しさん
07/08/06 21:27:03
本日中ってあと2時間半しかないぞ

749:デフォルトの名無しさん
07/08/06 21:28:22
バイナリエディタで書き換えたら使える

750:デフォルトの名無しさん
07/08/06 21:31:03
マルチすると来る人が居なくなるかもよ

751:デフォルトの名無しさん
07/08/06 21:32:25
マルチすると釣られる人が居なくなるよ

752:デフォルトの名無しさん
07/08/06 21:46:42
>>747
2万じゃ安いな・・8万でどうだ?

753:デフォルトの名無しさん
07/08/06 21:47:59
ちゃんと引継ぎしとけよ・・・

754:デフォルトの名無しさん
07/08/06 21:48:45
>(以前プログラマに依頼して作ってもらったものですが今は連絡が取れません)
待遇悪くて逃げられたんか?

755:デフォルトの名無しさん
07/08/06 23:08:57
>>747
解析料が必要です。弊社なら50万円で納期2週間で考えてみましょう。
プログラムのソースによって見積もりのさじ加減はかなり違います。

756:デフォルトの名無しさん
07/08/06 23:13:25
2万とか・・・どんだけ買い叩いてんだよ

757:デフォルトの名無しさん
07/08/06 23:14:45
ローカルにプロクシ立てるとかすれば何もいじらずに済むんじゃね?

758:デフォルトの名無しさん
07/08/07 01:09:59
多重ループを一気に抜ける方法って、いちいちbreak文つけるか、gotoしかないんですか?

例えば、swtich文の中のif文で、break文以外の処理も行いたい時、
同じif文を二回書くことになるので、なんか無駄に長くなってしまうのですがorz

759:デフォルトの名無しさん
07/08/07 01:11:53
gotoつかやいいじゃん。

760:デフォルトの名無しさん
07/08/07 02:12:19
もうひとつある
そのループを別の関数に分離してreturn

761:デフォルトの名無しさん
07/08/07 03:22:37
賛否あるが、throwってのもある。

762:デフォルトの名無しさん
07/08/07 03:46:58
つか、何の言語?

763:デフォルトの名無しさん
07/08/07 07:36:16
スレを勃てるまでもないC/C++の質問はここで 2

764:762
07/08/07 09:25:29
うぁ、すれ立てるまでもない質問はここでスレだと思ってた!

765:デフォルトの名無しさん
07/08/07 10:06:26
(*´д`)σ))Д`)

766:デフォルトの名無しさん
07/08/07 15:07:36
棒倒し法で迷路を自動生成するプログラムを作ろうとしているんですが、すべての棒が同じ方向に倒れます。
下が棒を倒す部分の関数なんですが、どこが間違ってるのか教えてください。

void KnockDown(){
 int i,j;
 for(j=2;j<19;j+=2){
  for(i=2;i<19;i+=2){
   srand( (unsigned int)time(NULL) );
   switch (rand()%4){
   case 0:// 北
    if(maze[i][j-1]!=0) maze[i][j-1]=0;
    break;
   case 1:// 東
    if(maze[i+1][j]!=0) maze[i+1][j]=0;
    break;
   case 2:// 南
    if(maze[i][j+1]!=0) maze[i][j+1]=0;
    break;
   case 3:// 西
    if(maze[i-1][j]!=0) maze[i-1][j]=0;
    break;
   }
 }}
}

767:デフォルトの名無しさん
07/08/07 15:11:43
>>766
srand()は最初に呼ぶだけにしよう。

768:デフォルトの名無しさん
07/08/07 15:11:45
質問なのですが
動画にマイクで声をつけるのはどうやってやるんですか?
後、動画の編集の仕方も教えてください
よろしくおねがいします

769:デフォルトの名無しさん
07/08/07 15:14:09
板 違 い

770:デフォルトの名無しさん
07/08/07 15:21:32
>>766
0が壁で0以外が通路?何か違和感あるなw
あと、ランダムで決定したところにすでに壁ができていた場合どうなると思う?

771:デフォルトの名無しさん
07/08/07 17:07:05
質問です。
ウインドウズでメモリーリークを知るには_CrtDumpMemoryLeaks()を使いますが、
メモリースマッシュを知るにはどうすればいいのでしょうか?

##二重開放とかそういうことです。

772:デフォルトの名無しさん
07/08/07 18:54:14
>>766
一つ言わせてくれ。

質問する前に2つのことをすべし。
1. デバッガでステップ実行する。変数の値の中身も見ること。
2. 問題を切り分ける。

あなたの問題は、
すべての棒が同じ方向に倒れる
のではなく、
rand()%4が同じ値になる
でしょうに。


773:デフォルトの名無しさん
07/08/07 19:05:37
>>771
二重解放なら、
デバッグビルドをデバッガ上で走らせていれば、
デバッガのトレース出力にメッセージが出たと思う。

とりあえず、
_CrtSetDbgFlagで_CRTDBG_DELAY-_FREE_MEM_DFと_CRTDBG_CHECK-_ALWAYS_DFをオンにして、
わざと二重解放してみよう。

オーバーヘッドが多き過ぎるなら、
_CRTDBG_CHECK-_ALWAYS_DFはオフにして、
自分で_CrtCheckMemoryを呼ぶ。

_CrtSetAllocHookを使って、自分でチェックするのも手。

774:デフォルトの名無しさん
07/08/07 21:54:33
>>773
レスサンクス!!

デバッガが警告出してくれるっぽいですねぇ。
コレで安心してメモリ確保ができるってもんです。
当方、趣味グラマの初心者なのでメモリ確保が苦手なのです。
レスほんと、サンクス!



余談ですが、こういうの作ってました。
URLリンク(f20.aaa.livedoor.jp)
内容は参照カウンタ(本命)と配列クラス(デモ)です。
デバッグは済んでいないので使用は自己責任で。

それじゃー。:D

775:デフォルトの名無しさん
07/08/07 22:02:39
む!直リンできないか。

URLリンク(f20.aaa.livedoor.jp)
または、
URLリンク(f20.aaa.livedoor.jp)
から、取れるかも。

776:デフォルトの名無しさん
07/08/07 23:21:35
>>774
deleteした直後にNULLを代入するのは、
二重解放によるヒープの破壊を防ぐために良いことだが、
そうすると二重解放していてもチェックに引っかからないぞ!

NULLを代入するのをやめるか、
NULLの代わりに-1などのアリエナイ値を代入するのがいいかと。

777:デフォルトの名無しさん
07/08/07 23:26:58
へー

778:デフォルトの名無しさん
07/08/08 01:41:57
^←これどうやって入力するんでしょうか?いい加減コピペは卒業したい

779:デフォルトの名無しさん
07/08/08 01:43:44
キーボード右上「へ」のキー
ってか、ここはC/C++の質問スレなわけで・・・

780:デフォルトの名無しさん
07/08/08 01:46:35
>>778はポケコンの使い手

781:デフォルトの名無しさん
07/08/08 02:54:30
^おぉ出た〜!!Thank you very much.
演算子で使うんです。

782:デフォルトの名無しさん
07/08/08 03:40:19
>>781
メモ帳とかでキーボードのキー全部押して試してみたら・・・
Shift押しながらのキーも・・・

783:デフォルトの名無しさん
07/08/08 07:38:34
キートップに刻印されているのだから、
キーボードをよく見ろ、でいいと思うが。

784:デフォルトの名無しさん
07/08/08 07:41:12
たまにいくつかの記号の類を出せないキーボードはあるよな
なに考えて作ったのかと思う

785:デフォルトの名無しさん
07/08/08 08:04:29
>>784
もしかして:ASCII配列のキーボードをJIS配列の設定で使用?

786:デフォルトの名無しさん
07/08/08 15:28:10
うちのキーボードは半角の”\”だせなんだぜ?
\になる。

787:デフォルトの名無しさん
07/08/08 15:43:42
前は、チルダの位置が2つずれてなかったっけ。
今のはちゃんとしてるようだが。

788:デフォルトの名無しさん
07/08/08 15:43:50
俺も俺も

789:デフォルトの名無しさん
07/08/08 17:11:13
だいぶ前だけど、I/Oの「今月の添付ディスク」コーナーでは
毎回必ずアンダーバーの入力の仕方が書いてあったことを思いだした

790:デフォルトの名無しさん
07/08/09 17:32:12
変な質問かもしれませんが
OSはC言語で作られているんですよね?

WindowsのアプリケーションはWinMain関数ですが、Windows自体の
main関数はどのような感じに記述されてるんでしょうか?

MSの人で無いと解らないんですかね?

791:デフォルトの名無しさん
07/08/09 17:38:56
>>790
・C言語で書かれた物が、全てmain()を持っているわけではありません。
・main()はアプリケーションの入り口としての規格上の共通部であり、どう実装されるかは環境依存です。

792:デフォルトの名無しさん
07/08/09 17:39:13
>>790
WinMain や main は、それを呼び出すルーチンがあって
リンク時にそれをリンクしてるだけなんだぜ。
そのルーチンがどうなってるかは気にならないのか

793:デフォルトの名無しさん
07/08/09 17:49:47
>>791
>C言語で書かれた物が、全てmain()を持っているわけではありません。
そうなんですか・・。Cの全てのソフトがmainとかWinMainで始まると思っていました。

>main()はアプリケーションの入り口としての規格上の共通部であり、どう実装されるかは環境依存です。
つまり色んなOSのアプリケーションの入り口として〜mainなのですか。

>>792
>WinMain や main は、それを呼び出すルーチンがあって
>リンク時にそれをリンクしてるだけなんだぜ。
>そのルーチンがどうなってるかは気にならないのか

気になりますね。でも、そーゆーの気になりだすと
最終的には電気信号とかのレベルまで行かなくならなきゃならなそうです。。。
とりあえず今はC勉強します。お二方とも解答ありがとうございます。

794:デフォルトの名無しさん
07/08/09 17:56:36
アセンブラの勉強をしてみるといいかもね。

795:デフォルトの名無しさん
07/08/09 18:06:10
あ専ブラですか、分かりました。

796:デフォルトの名無しさん
07/08/09 18:12:19
俺の発言みたいにとられるようなレスしないでください。
どうでもいいけど。

797:デフォルトの名無しさん
07/08/09 18:13:05
crt0.asm とかね

798:デフォルトの名無しさん
07/08/09 18:17:29
>>796
お前の発言みたいにとらないでください。
どうでもいいならレスするな死ね。

799:794=791
07/08/09 18:29:29
>>796
自己主張したいならコテでもつけとけ。

800:デフォルトの名無しさん
07/08/09 18:32:30
>>798
だって>>793のレスに対して>>794はレスされたのに
無関係のお前が>>795みたいなレスされたら誤解するだろ。

>>799
こんな馬鹿げた自演してどうすんだよ。しょーもない。
やっぱどの板でもID表示欲しいわ。とりあえず今日はROMる。

801:デフォルトの名無しさん
07/08/09 18:34:36
どうでもいいんだろ。
誤解されとけや

802:デフォルトの名無しさん
07/08/09 18:45:21
>>793
本題から少し脱線してしまうが・・・
Windowsのアプリケーションの入り口は、厳密には、WinMainではないよ。

Windowsがアプリの実行ファイル(EXE)をロードして実行する際の入り口は、
「エントリポイント」と呼ばれているが、それは特定の名前のC言語の関数ではない。
C言語に限定されていないし、ましてや、C言語の関数名でもない。

マイクロソフトのCコンパイラ・リンカを使っているのであれば、
リンカのマニュアルで/ENTRYオプションの説明を読むべし。


803:デフォルトの名無しさん
07/08/09 18:46:53
アセンブラの勉強しても仕方ないだろう。
マシン後とアセンブリー言語が理解できるようになってから、アセンブラを勉強したほうがイイ。


804:デフォルトの名無しさん
07/08/09 18:54:11
マシン「語」
アセンブリ「言語」
なんて使う必要がなければ、理解しなくていいよ。

基本的なコンピュータのアーキテクチャを知っていれば、それで十分。

805:デフォルトの名無しさん
07/08/09 22:58:02
いや、仕事で使うから覚えますた ってだけじゃぁなぁ
金にはならないかもしれないけどとことんやれば良いと思うよ

806:デフォルトの名無しさん
07/08/09 23:11:36
そういう人好き

807:デフォルトの名無しさん
07/08/10 00:27:24
>>790
初期のUNIXは確かに古いC言語や一部アセンブラで書かれていた。
だが、Windowsや旧MacOSやμiTRONやVxWorksや...(略)はC言語で書かれているのだろうか?

808:デフォルトの名無しさん
07/08/10 00:41:43
今でも一部アセンブラは当然として、
MacOSはObjectiveCかPascal、
他もCやC++、
字句解析などでは適宜別の言語、
などなど適材適所でしょ。

809:デフォルトの名無しさん
07/08/10 08:02:59
>>805
仕事かどうか、金になるかどうか以前に、
人生に許された時間は限られているんだよ。

>>807
WindowsはNT系はC言語で書かれたと聞いてる。
NT4.0の頃に聞いた話なので今は違うかもしれない。


810:デフォルトの名無しさん
07/08/10 16:34:55
低俗な質問でほんとすいません。
クラス型のポインタを持つ配列を作りたくて苦心していますが上手く行きません。

(global.h) extern class hoge *p[10];
(global.cpp) hoge *p[0] = new hoge;

と書いていまして、.cppのほうでエラーが出ます。
文法的に間違っていると思うのですが、どこが間違っているのでしょうか?

宜しくお願いします。


811:デフォルトの名無しさん
07/08/10 17:19:31
いろいろ違う気がするが・・・w
エラーメッセージ出して1つずつ解決しては。

class定義は見える位置にあると仮定して、
extern hoge *p[10];
p[0] = new hoge;
とやるかな。


812:デフォルトの名無しさん
07/08/10 18:24:56
>>810
問題の中身よく見てないけど、とりあえず上の方に出てるやつ数個でも良いからエラーの内容書け

813:810
07/08/10 18:43:28
>>811
ありがとうございます。
なお、クラスを定義してる"Hoge.h" もGlobal.hにてインクルードしてます。
今、エラーコード全部ぐぐって内容見てる途中です。

>>812
error C2040: 'PC' : 'int []' は 'cHoge *[4]' と間接操作のレベルが異なります。
error C2440: '初期化中' : 'cHoge *' から 'int []' に変換できません。
error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました。
error C2501: 'PC' : 識別名を宣言するのに、型が指定されていません。
(※クラス名だけはcHogeに書き換えています)

というエラーが出るんですが、ぐぐってみても今ひとつ要領を得ないのです。
「ああ、こういう間違った書き方してるから暗黙的にint型にされてるんだな」とは分かるんですが、では正しい書き方はどうなのかというのが分かりません。

普通にint型とかchar型のポインタ配列作る気持ちでやってたら、ちょっと勝手が違うようですね。手強いです。


814:デフォルトの名無しさん
07/08/10 19:03:38
>>813
>hoge *p[0] = new hoge;

hoge *p[0];
p[0] = new hoge;

hoge *p[0];
だと
>error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました。
が出る。

だから
hoge *p[10];
p[0] = new hoge;

この辺はintやらcharでも変わらんと思うけど。

>>811のexternは書き間違いとちゃうかな。
勘違いだったらすんません。

815:810
07/08/10 19:15:13
>>814
ありがとうございます。
いままさに、同じような感じで書いていました。
結果は×でした。エラー内容全く同じ……

(Global.h)
#include "HogeHoge.h"(クラス内容の書かれたヘッダ)
extern class cHoge *PC[4];

(Global.cpp)
cHoge *PC[4];
PC[0] = new cHoge;

という状態で、全く同じエラーでます。

どうやら、PC[0]が*PC[4]の一部と見なされてない感じです。
エディタ上でPC[0]の上にマウスカーソル乗せたら、
cHoge *PC[4]ってポップアップが出てるんで、余計にわけわかんない。
なんで暗黙的int扱いされるんでしょう?


816:デフォルトの名無しさん
07/08/10 19:20:28
ごめん。
全然違うわ。

extern cHoge PC[4];

cHoge PC[4];

こうじゃねぇ?

817:デフォルトの名無しさん
07/08/10 19:23:15
なんだよ、よそで配列定義してあってのexternじゃないのかよ。
ファイル1つでうまくいった上で、分けたらおかしくなってるのか
もともとやりかたがわかんないのかどっちだよ。

818:デフォルトの名無しさん
07/08/10 19:28:08
とりあえず、これでどうなる
(Global.h)
#include "HogeHoge.h"(クラス内容の書かれたヘッダ)
extern cHoge *PC[4];

(Global.cpp)
cHoge *PC[4];
PC[0] = new cHoge;

念のため言っておくけど、こっちではコンパイルできてるから
うまくいかないなら環境書いてね

819:デフォルトの名無しさん
07/08/10 22:31:55
なんか知らんが、トップレベルに
PC[0] = new cHoge;
を書いてるんじゃなかろうな。

820:810
07/08/11 09:46:02
おはようございます。
3時過ぎまで頑張っていました。

>>817
そうです。分けたらおかしくなりました。

>>818
Global.h に extern class cHoge *p[4]; と書き、どこでも良いので関数内で
cHoge *p[4]; p[0] = new cHoge; は上手く行きました。

所で、extern class cHoge ではなく、extern cHoge なのですか?
そう書くとずらずらエラーがでるのですが……
ちなみに、他にもextern class hogehoge *tmp; という書き方でグローバルな
インスタンスを3つほど作っていて、そちらは問題なく動いているのですが、
これはexternに対する私の理解が根本的に間違っているのでしょうか?

>>819
えっと、その通りです。global.cppは、関数を含まないソースファイルです。
Global.hでextern宣言したものに実体を与えてグローバルクラスとして使うための
ものです。
上記の通り、トップから外して関数ないで宣言したら普通に使えました。
やはり、根本的に何か間違っていますか?


821:デフォルトの名無しさん
07/08/11 10:27:14
>>820
何というか・・・

まず1つ目
グローバルなオブジェクトには、どこかに実体が必要だが、
その実体というのは、cHoge*なのであってcHogeではない。
グローバルスコープでnewするのは行儀が悪いのでやるべきではない。

2つ目
クラスの定義が既に済んでいるのであれば、class は書く必要がない。
もしclassを書かないと具合が悪いのであれば、クラスの定義が済んでいない。

3つ目
グローバルなオブジェクトは気軽に作るべきではない。

822:810
07/08/11 10:53:07
>>821
実はいま、グローバルを極力廃止して書き直してます。
そちらでは問題なく動いています。

「よく使うのはもう纏めてグローバルにしたら?」って言われてやってみたのですが、
確かに初動は早いけどひとたびエラー起こったらわけ分からなくなりました。

>その実体というのは、cHoge*なのであってcHogeではない。
!!!
class書かないとエラーでるので、仰るとおり、定義されてないようです。
そうか、そういうことだったのか……

グローバルスコープでのnewもやめます。
ありがとうございました。


823:デフォルトの名無しさん
07/08/11 22:17:31
最近C++を始めて、静的配列のdelete[]クラッシュにはまったんですが、疑問があったので質問

以下のコードでクラッシュしないのはなぜ?
#include <string>
int main(){
int is=0; //これが無いとクラッシュ
std::string array[2] = {"hoge", "fuga"};
delete[] array;
return 0;
}

コンパイラはMS製です

824:デフォルトの名無しさん
07/08/11 22:18:44
そもそもdeleteなんているのか?newがみえないんだが・・・

825:デフォルトの名無しさん
07/08/11 22:26:43
new[] してないものを delete[] してはいけません。
new[] と delete[] は1対1

826:823
07/08/11 22:27:30
いらないことは分かってますけど、ただ疑問に思ったので…
上記のエラーを探ってた時に、変数の有り無しでプログラムのクラッシュするしないが変わるものかなと…

827:デフォルトの名無しさん
07/08/11 22:29:22
スタック破壊。

828:デフォルトの名無しさん
07/08/11 22:31:41
>>826
たまたま使ってるコンパイラではクラッシュしなかっただけの話だろ。
他のコンパイラだと鼻から悪魔が出てきても文句は言えない。

829:デフォルトの名無しさん
07/08/11 22:36:29
>>826
その手の行為で、どんなことが起きるかは、基本的に予測できない。
間違ったことをした、ずーーーーーっと後で落ちる、っていうことも多い。
知らないうちに関係ない変数が書き換わってる、とかいう現象になることもある。

830:デフォルトの名無しさん
07/08/11 23:38:38
サンクス、何となく理解した

831:デフォルトの名無しさん
07/08/11 23:40:09
>>810=>>822
1〜2KByte以下のRAMの少ないマイコンならそういうテもあるが、
そうでもなければグローバルにまとめるのはやめとけ。

PCのプログラミングならグローバル変数を使わなくてはならない状況はまず考えつかない。
仮にあったとしても、保守erが苦労するだけなので使わないようにしている。

ちなみに、
hoge_type *p[10];

みたいな用例は時折あると思うが、演算子の評価順と同じで、この p は、
hoge_type *p;
が10個ある配列になる。だから、通常は

ヘッダファイル
extern hoge_type *p[10];
か、
extern hoge_type *p[];
になる。

時々間違えるのは、ちょっとうまい使い方を覚えたC/C++言語erが

hoge_type *p[10];
という定義に対して

extern hoge_type **p;
または
extern hoge_type p[][10];
などとしてしまうことであり、これは正常に働かない。




832:デフォルトの名無しさん
07/08/11 23:54:09
>>823
ちょっと論点をずらすが、

std::string array[2] = {"hoge", "fuga"};

これは、std::stringの定義を理解した上での記法であり、
std::stringは引数が空のコンストラクタを持っているので、

std::string array[2];
array[0] = "hoge";
array[1] = "fuga";

とした方が安全。


833:デフォルトの名無しさん
07/08/12 00:14:06
VC++2005 Express Editionでは、atoi()やstrtok()といった古い関数は使えないのでしょうか?
VC6で作ったソースを読み込んでコンパイルしたら、コンパイルは通るのですがリンカエラーがでます。
必要なヘッダのincludeはしています。
”LNK2019: 未解決の外部シンボル __imp__strtok が関数 _main で参照されました。”
というリンカエラーやLNK2001がでます。

#include <stdio.h>
#include <string.h>

int main(void)
{
char str[] = "ABCD ef.1234.G";
char *tp;
tp = strtok( str, " ." );
puts( tp );
while ( tp != NULL ) {
tp = strtok( NULL," ." );
if ( tp != NULL ) puts( tp );
}
return 0;
}

例えばこれだと、putsにもstrtokにも同じ上記リンカエラーがでます。
お手上げです。よろしくおねがいします。


834:デフォルトの名無しさん
07/08/12 00:30:30
板違いかもしれません。ですが質問します。
同じ質問をVBスレでしたのですが、
私の聞いた事がレベルが低いのか、書き方が悪いのか、
回答が得られなかったので書きます。

C#.NETとVB.NETの違いって何ですか?

調べてみると、(触り程度)
C#.NETにメモリーを切る(確保)概念が無くなったと。
だったら、方言とコンパイルの速度だけの違いになりますか?

835:デフォルトの名無しさん
07/08/12 00:33:36
>>834
言語が違うってだけじゃ不満?

836:デフォルトの名無しさん
07/08/12 00:35:57
C#.NET と VB.NET の違い・・・ 言語が違います。以上。

メモリーを切るって意味不明

837:デフォルトの名無しさん
07/08/12 00:38:45
ふと、疑問に思った。
.NET自体触ったことないんだけど、VB.NETってインタプリタじゃないの?

838:デフォルトの名無しさん
07/08/12 00:45:30
ない
JITでネイティブコードにコンパイルされる

839:デフォルトの名無しさん
07/08/12 00:47:01
ちょっと、この話は興味ある。
言語が違うだけって、書き方が違うだけなの?
C#の方が、いろいろ出来るイメージがあるけど。

840:デフォルトの名無しさん
07/08/12 00:47:50
やっぱそうなのか・・・
C#とVBでネイティブコードレベルで違いって大きくでたりするもの?
って、違いがあったら.NETの意味がなくなるからそんなことない?

841:デフォルトの名無しさん
07/08/12 00:53:04
人から聞いた話。
C#の方が早いって聞いた。(アプリの動き)
あと、マイクロソフトがVBよりC#に重きを置いてるとも。

842:デフォルトの名無しさん
07/08/12 00:53:27
>>840
ない。前にMSがC#でもVB.NETでも同じコードをコンパイルしたら、
同じIL(中間言語)になると宣伝していた覚えもある。
(ただしデフォルトではオプションが異なるので、そのままでは全く同じILにならないという註付きで)

>>834
記憶域を確保するという概念がなくなったというより、
それを解放する操作を明示する必要がなくなったというのがより正確。
そして、それは.NETの特徴なので、これはC#でもVB.NETでも同じ。

843:デフォルトの名無しさん
07/08/12 00:54:30
つまりは慣れてる言語で書くのがいいってことでFA?

844:デフォルトの名無しさん
07/08/12 00:56:43
>>842
ありがとうございます。

う〜ん、あまり、VBとC#の差異が見えませんね。
調べてみたら、C#の方が開発期間が長くなるとありました。


845:デフォルトの名無しさん
07/08/12 01:07:57
VB.NET だと unsafe コードが書けない、っていうのはある

846:デフォルトの名無しさん
07/08/12 01:30:13
どうでも良いが、なんでこのスレで質問したんだろう・・・。
C#もVB.NETも、C/C++とはほとんど関係ないと思うんだが。

847:デフォルトの名無しさん
07/08/12 03:53:27
「スレ立てるまでもない質問はここで」と見間違えたとかかな?

848:デフォルトの名無しさん
07/08/12 07:14:32
>>823
「クラッシュ」と一言で片付けるあたりがダメぽ。
せっかくランタイムライブラリやOSが情報をくれているのにね。

ちなみにdelete[]の実装を見てみ。

849:デフォルトの名無しさん
07/08/12 07:23:19
>>833
「エラーが出ます」と言って思考停止するなよ。

エラーメッセージは読むこと。
意味がわからなければ、リンカのマニュアルのエラーの解説を読むこと。

850:デフォルトの名無しさん
07/08/12 07:30:35
>>844
VB.NETとC#は当初、機能に違いがなく、字面だけの違いで、機械的に相互にコンバート可能だった。
ぶっちゃけ、VB.NETにはVB風の字面という存在価値しかなかった。

ところが、VB専門の連中が、
VB.NETへの移行のために勉強すべきことが多すぎて嫌だと拒否したので、
しかたなく、VB.NETはVBに近くなるように、C#と機能に違いを持たせることになった。

そういう経緯なので、C#に何の抵抗も無い人は、C#とVB.NETで開発期間は違わない。
VB.NETを使ったほうが便利な部分があれば、そこだけピンポイントでVB.NETで書けばいい。


851:デフォルトの名無しさん
07/08/12 08:26:46
鼻から悪魔なんて久しぶりに

852:デフォルトの名無しさん
07/08/12 08:37:28
>>844
ぶっちゃけ、セミコロンがあるかないかの違い。
VBしか書けないダメ派遣はどうやってもセミコロンが書けないらしいよ。

853:デフォルトの名無しさん
07/08/12 10:19:37
自前の構造体で、
その構造体の中で入力の>>演算子をオーバライドしようとしても上手くいきません。。。

struct {
 int x;
 istream& operator>>(istream& s) {
  s >> x;
 }
}

こうじゃないんですか?



854:デフォルトの名無しさん
07/08/12 10:39:05
>>853
それは演算子の左辺が構造体で右辺が istream の >> を定義していることになる

855:デフォルトの名無しさん
07/08/12 11:01:31
>>854
左辺はistreamじゃないんですかね。。。
勉強不足みたいなんで出なおしてきます。
ありがとうございました。


856:デフォルトの名無しさん
07/08/12 11:18:12
int main(void)
{
String s1;
String s2;
String s3("CCC");
String s4("DDD");
s1.set("AAA");
s2.set("BBB");
s2.add(s3);
s4.add("EEE");
printf("s1:[%s](%d)\n", s1.get(), s1.getLength());
printf("s2:[%s](%d)\n", s2.get(), s2.getLength());
printf("s3:[%s](%d)\n", s3.get(), s3.getLength());
printf("s4:[%s](%d)\n", s4.get(), s4.getLength());
cout << "s1:[" << s1.get() << "](" << s1.getLength() << ")" << endl;
cout << "s2:[" << s2.get() << "](" << s2.getLength() << ")" << endl;
cout << "s3:[" << s3.get() << "](" << s3.getLength() << ")" << endl;
cout << "s4:[" << s4.get() << "](" << s4.getLength() << ")" << endl;
return 0;
}
結果:
s1:[AAA](3)
s2:[BBBCCC](6)
s3:[CCC](3)
s4:[DDDEEE](6)
s1:[AAA](3)
s2:[BBBCCC](6)
s3:[](3)
s4:[DDDEEE](6)
s3の値がcoutで出したときおかしいのだが、bcc55ってこんなに馬鹿なのか?
それともおれが馬鹿?

857:デフォルトの名無しさん
07/08/12 11:26:57
>>851
鼻から悪魔が出るは、何の例えになるのでしょうか?

858:デフォルトの名無しさん
07/08/12 11:37:57
i = i++; のような未定義のコードは何が起きるか分からないという話
未定義のコードを実行をした結果、たとえ鼻から悪魔が出てきたとしても、その処理系は規格に反してはいない

まぁ現実問題、そんなことで悪魔を呼び出せるんならすでに世の中は悪魔だらけだ

859:デフォルトの名無しさん
07/08/12 11:47:24
>>856
bccのStringクラスの仕様が判らんからなんとも言えんが、どうも挙動が不自然だね。

860:デフォルトの名無しさん
07/08/12 11:52:56
>>858
ワクワクしますね、何処かに冒険家いませんかね?
ありがとうございました

861:デフォルトの名無しさん
07/08/12 11:55:03
>>859
Stringクラスは自前なんですが。。
どうやら、cout時点でs3の中のchar*pが""になってるみたいです。
coutの後でprintfしても出ませんでした。
C++初心者状態なのでclassの作り方に失敗してるのかもしれませんね。
coutにバグがあるとも考えにくいですから。。。

862:デフォルトの名無しさん
07/08/12 12:44:25
>>861
んじゃ、領域破壊をしているに一票。
add()の辺りが怪しいと見た。

863:デフォルトの名無しさん
07/08/12 14:09:48
バイナリハックに一票です

864:デフォルトの名無しさん
07/08/12 14:30:42
BCCは3.0から4.5まで愛用したクチだが、いまどきBCCはないだろう。

マイクロソフトのVC++なら、メモリ破壊を(ある程度)検出する機能が付いているよ。

865:デフォルトの名無しさん
07/08/12 14:33:38
自分も昔はBCC愛用してましたが、VC++Expressが出たからもう使ってない

866:デフォルトの名無しさん
07/08/13 03:14:05
僕は自分でC++コンパイラ作って使ってますけど

867:デフォルトの名無しさん
07/08/13 03:18:34
iccやmsvc、gccには一生かかっても勝てません

868:デフォルトの名無しさん
07/08/13 03:19:19
これからC++を勉強しようとしている者ですが
なにか良い勉強ツールはないでしょうか?
できれば「Study C」のようなプログラムをコンパイルせずに実行できるようなものがいいんですが...

869:デフォルトの名無しさん
07/08/13 03:22:32
開発環境ってこと?

870:デフォルトの名無しさん
07/08/13 03:23:51
VC++でも使ってろ

871:デフォルトの名無しさん
07/08/13 03:25:15
VC++Expressがいいんじゃないの?無料だし



872:デフォルトの名無しさん
07/08/13 03:25:45
昔Macintosh使って悪魔を呼び出すって映画があったよな。

>>868
コンパイルをせずにというのが何を意味しているのかよく分からないんだけど、
正直、自分でコードを書かずに言語が身につくとはとても思えない。
コマンドラインからのコンパイルが面倒だというなら
Visual C++ 2005 Express Edition を落として使えばいいんじゃないかと。

873:デフォルトの名無しさん
07/08/13 03:26:42
インタプリタってことだろ

874:デフォルトの名無しさん
07/08/13 03:27:33
あるいはアセンブリャか

875:デフォルトの名無しさん
07/08/13 03:30:43
あのう

PIC使って自動あえぎ声再生機能付きダッチワイフを作りたいんですけど
何から始めたらよかですか?

876:デフォルトの名無しさん
07/08/13 03:32:40
この人何いうとっと?

877:デフォルトの名無しさん
07/08/13 03:33:02
完全防水型圧力センサー

878:868
07/08/13 03:36:43
的確な言葉がいえずすいません
プログラム文を書いてワンボタンでそのプログラムの実行結果が確認できるようなツールがほしいのです.
以前C言語の勉強をしていたときに使っていた「Study C」がそういうものだったんでC++でも似たものがないかと思い質問してみました.

879:デフォルトの名無しさん
07/08/13 03:36:46
せがらしか

880:デフォルトの名無しさん
07/08/13 03:39:53
CINT

881:デフォルトの名無しさん
07/08/13 03:57:32
>>876>>879
九州人じゃなかごたんね
無理して九州弁ばしゃべらんでよかよ

882:デフォルトの名無しさん
07/08/13 04:02:09
ばってん

883:デフォルトの名無しさん
07/08/13 04:10:27
ばってん何ね?

884:デフォルトの名無しさん
07/08/13 04:12:11
九州男児を舐めん方がよかね

885:デフォルトの名無しさん
07/08/13 04:14:04
残念
格助詞の「を」は「ば」になるんだ

886:デフォルトの名無しさん
07/08/13 04:15:38
ばりちろ

887:デフォルトの名無しさん
07/08/13 04:16:37
そがどないしたと

888:デフォルトの名無しさん
07/08/13 04:18:34
創作方言やろうぜ

889:デフォルトの名無しさん
07/08/13 04:18:51
どない→どげん/どがん

890:デフォルトの名無しさん
07/08/13 04:20:33
「どぎゃん」とは言わんと?

891:デフォルトの名無しさん
07/08/13 04:20:41
(#^ω^)ピキピキ

892:デフォルトの名無しさん
07/08/13 04:24:02
>>890
言う

893:デフォルトの名無しさん
07/08/13 05:01:36
せからしか!

894:デフォルトの名無しさん
07/08/13 05:26:22
そうかしら!

895:デフォルトの名無しさん
07/08/13 05:40:05
なんでこんな流れに?

896:デフォルトの名無しさん
07/08/13 05:41:10
暇な学生が多い
暇な社会人も(もしかしたら普段より)多い(かもしれない)

897:デフォルトの名無しさん
07/08/13 05:48:12
夏ですな蝉も鳴き始めた時間です

898:デフォルトの名無しさん
07/08/13 05:48:39
お前が上げるからじゃ!

899:デフォルトの名無しさん
07/08/13 05:51:36
さいでした

900:デフォルトの名無しさん
07/08/13 06:17:36
自演厨通報しますた

901:デフォルトの名無しさん
07/08/13 06:28:31
通報しないで|(●)ム(●)| 

902:デフォルトの名無しさん
07/08/13 06:29:08
いやんばか

903:デフォルトの名無しさん
07/08/13 08:52:03
>>878
> プログラム文を書いてワンボタンでそのプログラムの実行結果が確認できるようなツールがほしいのです.

それは目的ではなく手段だよね。

まず、
試行錯誤的にプログラムを書き換えて、「たまたま」目的の動作をするのを見つけ出す
というのは、やめたほうがいい。かえって遠まわりになる。

次に、
勉強段階の人ほど優秀なコンパイラ&デバッガを使ったほうがいい。
とくにデバッガの優劣は、勉強の効率に非常に大きく効いてくる。

というわけで、VC++を勧める。Express Editionで事足りるかはわからないが。

904:903
07/08/13 08:57:55
それからもう一つ。

Webで無料で見られるサイト「だけ」で勉強しようとしているのなら、それは良くない。
良質なサイトはたくさんあるが、それでも、良質な本のほうがずっと優れている。

つまらないところで躓くのは、
・それに必要な知識が抜け落ちている
・間違った知識を取り込んでしまっている
・下手な解説に惑わされている
といったことが原因になりやすい。

本を買うのにはお金がかかるが、
人生の限られた時間を浪費するのに比べたら、
本を買うお金なんて安いものです。

905:デフォルトの名無しさん
07/08/13 09:02:30
ちゃんと勉強できる人にはデバッガは強力なツールになるが、
そういう人はデバッガがなくても自分で工夫して何とかできる。
また、デバッガに頼って結果第一主義になると規格に則った知識が身につかない。

従って、余り勧めない方がいいと私は思う。

906:デフォルトの名無しさん
07/08/13 09:28:13
できる・できない、ではなくて、効率の話なんだけどなぁ。

そりゃぁデバッガなくたってデバッグは可能さ。
でも無駄に労力使うでしょう?

907:デフォルトの名無しさん
07/08/13 09:30:22
少なくとも、この手のスレで、
自分が書いたプログラムがうまく動きません、何が悪いのかサッパリわかりません。教えてください。
なんていうような質問する人は、デバッガでステップ実行すらしてないのよ。


908:デフォルトの名無しさん
07/08/13 09:53:08
STL等のテンプレートを使うと、ステップ実行は非常に効率が下がるのだが。


909:デフォルトの名無しさん
07/08/13 12:12:15
だから、デバッガをきちんと役立てることができる人には、わざわざ勧める必要がないんだけどな。
勧められないと使えない人は、きちんと役立てることができないだろうからやはり、勧める必要がないんだ。

910:デフォルトの名無しさん
07/08/13 12:14:06
デバッガがなくても自分で工夫して何とかできる人ほど、デバッガを使うんだなこれが。


911:デフォルトの名無しさん
07/08/13 12:27:42
>>909
そんなことを言っていたら、
自力で習得できない人はプログラミングに向いてないから辞めたほうがいい
ということになってしまうぞ。

スレを見ていると、
デバッガでステップ実行しろ!
と言われて、素直にステップ実行して問題解決している人も、少しはいる。
どんなに能力や素質、やる気があっても、知るチャンスがなければどうにもならない。

残念ながらステップ実行しろと言われても無視しているような馬鹿のほうが多いけどな。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4308日前に更新/282 KB
担当:undef