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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 14:09:22 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.44【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1194016813/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

504 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 19:36:13 ]
例外処理のthrowのメリットは?
普通に関数にとばすのはだめなのかい

505 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 20:21:22 ]
普通に関数に飛ばすとは、どういうやり方?
throwは関数の呼び出し元の呼び出し元の呼び出し元の・・・にずーっと遡っていけるところに意味がある

506 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 20:23:41 ]
昔のCのように、abort()を呼ぶとかそういう話?

507 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 20:53:58 ]
>>504の考える例外的な事態というのは、その場でプログラムを終了するタイプ「のみ」なんじゃないかな。
確かに、すぐ終了するのであれば、例外処理の存在意義である「簡潔かつ強力に特定の段取りまで戻る」
能力は要らないからね。

>>504
でも、例外発生後もまだプログラムを続行させる場合、「関数に飛ばして」例外処理を実現しようとすると、
結構面倒というか、入り組んでしまうことがある。
f1()から呼んだf2()から呼んだf3()から呼んだf4()の中で何か「例外的な状態」になった場合、f4()内に
if (失敗したという証拠) {
  例外処理();
  return 失敗したという合図;
}
を書くだけでなく、場合によってはf2()やf3()も、その「合図」がちゃんとf1()のもとへ帰っていけるよう、
バケツリレーのような構造の実現に協力しなくちゃならなくなったりするわけだ。
その例外は、自分とは直接関係ないことなのにね。

508 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 21:01:10 ]
ただやっぱり、Joelもいってるように、例外はきちんと
ハンドリング出来ているかが、コード面を眺めたくらいでは
すぐには判らないという弱点があるね。

戻り値ベース:
fp = fopen(filename, "w");
fwrite( var, 1,len,fp );     //ププ。エラー処理忘れやがんの。

例外ベース:
fs = new FileStream( filename, WRITE );
fs.Write( var ); //ファイル無かったら例外投げるから、
                   //呼ぶ側で対処しろと言うことかな〜?

509 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 21:07:30 ]
>>420
インターフェースが結構違うのでわからないんです

参考に見た6.0の解説を上げてみると
〜〜〜
左フレームのFileメタブをクリックして、Source FileのGlSampleView.cppファイルを開く
右のフレームに現れるソースファイル上で、右クリック。表示メニューのClassWizardを選択する←この時点で分からない
ここでViewクラスのメッセージ処理をカスタマイズする。
メッセージ欄から「WM_CREATE」を選択して関数追加ボタンをクリックする。
するとOnCreate()関数がGlSampleView.cppファイルに自動的に追加される。
〜〜〜

クラスウィザードのようなものは別の方法で見つけたんですがすると4行目のWM_CREATEが無い
といったように前に進みません

510 名前:339 mailto:sage [2007/12/18(火) 22:32:05 ]
1>index.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::Init(void)" (??0Init@ios_base@std@@QAE@XZ) が
関数 "void __cdecl std::`dynamic initializer for '_Ios_init''(void)" (??__E_Ios_init@std@@YAXXZ) で参照されました。
1>index.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::~Init(void)" (??1Init@ios_base@std@@QAE@XZ) が
関数 "void __cdecl std::`dynamic atexit destructor for '_Ios_init''(void)" (??__F_Ios_init@std@@YAXXZ) で参照されました。
1>D:\ta\c\works\online\Debug\dos.exe : fatal error LNK1120: 外部参照 2 が未解決です。


===index.cpp====
#include <iostream>

int main() {
std::cout << "Kitty on your lap";
return 0;
}
===============

/O2 /D "_MBCS" /FD /EHsc /MT /Fo"Debug\\" /Fd"Debug\vc80.pdb" /nologo /c /TP /errorReport:prompt

/OUT:"D:\ta\c\works\online\Debug\dos.exe" /NOLOGO /MANIFEST /MANIFESTFILE:"Debug\dos.exe.intermediate.manifest"
/SUBSYSTEM:CONSOLE /ERRORREPORT:PROMPT kernel32.lib


リンクがうまくいってないってことかな?
ちゃんとライブラリフォルダをC:\Program Files\Microsoft Platform SDK\Libに設定しているのだが・・。

511 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 23:00:25 ]
たまに見かけるけとKitty on your lapて何なん?
調べてみたらゲームみたいだけどあれが元ネタ?

512 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 23:35:44 ]
>>510

iostreamってSDKじゃないだろ。




513 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 23:36:20 ]
猫でも分かるの人がサンプル文字列に使ってたな。
さらなる元ネタはよくわからないが。

514 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 00:07:13 ]
古いギャルゲーのタイトル

515 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 01:29:06 ]
問題分が
以下の手順を従い、経路選択アルゴリズムを評価せよ。

通信の発生:ランダムに送受信ノードを決定する。
通信の確定:与えられた送受信ノードの経路を決定し、その経路上のリンクの空き容量を1Mbpsだけ減少させる。
         ただし、空き容量のないリンクが存在する場合、この通信は確立しなかったものとして、何も行わない。
通信の終了:n回前に発生した通信の経路上の空き容量を1Mbpsだけ増加させる。ただし、その通信が確立していなかった場合には何も行わない。
評価:10000回の通信を発生させ、そのうちで確立できなかった通信の割合を求める。
試行の繰り返し:nの値を変えながら、上記の試行を繰り返す


プログラム自体(kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5554.txt)は拾ってこれたのですが
どこにグラフを入力していいのか分からなく困っています。
ちなみにグラフは以下に書きます
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5555.txt
左と中央がノードで右がそれをつなぐリンクの容量です。

516 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 01:38:58 ]
宿題スレへ

517 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 02:08:39 ]
>>508
戻り値だってコード面見てエラー処理の抜けは気づきにくい。

Joel とかが言ってるのは、エラー処理に問題のあるコードと
適切なコードとの違いが微妙すぎるって言う問題。まぁこっちの問題も
一緒といえば一緒なんだけどな。処理の順番とか。

518 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 09:00:37 ]
VC++ 2005での関数インライン化について教えてください。
通常、インライン関数は定義をヘッダに書かないとコンパイル
できませんが、/LTCGオプションでリンク時のモジュール間
インラインを指定すると以下のようなコードがビルド可能
だと思ったのですが、実際はリンクエラーとなります。
もちろんinlineキーワードを外すとビルドできます。
/LTCGを指定してもinlineキーワードを付けるとインライン
対象関数の定義は呼び出しソースファイルから可視でなくて
はいけないのでしょうか?/LTCGのリンク時モジュール間
インラインの正しい使用法を教えてください。

//aaa.hヘッダーファイル
double MySquare(double);

//aaa.cppソースファイル
inline double MySquare(double d)
{
 return d * d;
}

//bbb.cppソースファイル
#include "aaa.h"

int main()
{
 double d = MySqiare(3.14);
}

519 名前:デフォルトの名無しさん [2007/12/19(水) 09:15:43 ]
よく空間的局所性の高いコードは速いとかいいますけど、最近のx86で
あるアドレスの値を読み込むと、その先何バイト位がキャッシュに載るんですか?

520 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 09:46:40 ]
VC8(VC2005)で

template<class T>
std::list<T>::iterator MoveListItr(std::list<T> *pLst)
〜略〜

というSTLのイテレータを返すテンプレートが、イテレータの記述部分
(std::list<T>::iterator)で「型ではない」とエラーが出ます。

VC7まではこれで通ったのですが、文法に問題があるのでしょうか?
それともVCの問題なのでしょうか?

521 名前:デフォルトの名無しさん [2007/12/19(水) 09:53:01 ]
template<class T>
      typename std::list<T>::iterator MoveListItr(std::list<T> *pLst)

522 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:00:51 ]
>>520
typename std::list<T>::iterator MoveListItr(std::list<T> *pLst)
って書けばいいんじゃないかな。

いわゆる特殊化ってやつがあるせいで、classname<T>::hogeという記述だけでは、
hogeが値なのか型名なのか断定できない。
そういう場合、「これは型名ですよ」というのをコンパイラに教えるために、typenameを書く。

今回のVC7と8の違いは、「ここは関数の戻り値の型を書く場所だから、型名に決まってるよな」
とコンパイラが判断したか否か、の違いだと思うんだけど、
VC7の気が利いているのか、VC8が「VC7が無視した何らかの可能性」を見て断定を避けたのか、
どっちなのかは俺にはわからないや。



523 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:03:56 ]
単に規格に準拠するようにしただけじゃねえの?

524 名前:デフォルトの名無しさん [2007/12/19(水) 10:12:15 ]
>いわゆる特殊化ってやつがあるせいで
特殊化は無関係

525 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:13:50 ]
>>521-523
なるほど、そうだったんですか。
おかげで解決しました、ありがとうございます。

526 名前:りょう ◆RyOrlro88Q [2007/12/19(水) 10:46:02 ]
ループが止まりません><

#include<stdio.h>

#define N 20

main(){
char ch[N],a,word='^';
int num,i,j;

j=0;
printf("Input your name.(When the input is finished,type ^.)\n");

for(num=0;ch[num]!=word;num++){
printf("ch[%d]=",num);
scanf(" %s",&ch[num]);
}
printf("target:");
scanf(" %c",&a);

for(i=0;i<num;i++){
if(ch[i]==a){
j++;
}
printf("%c=%d\n",a,j);
}
}

527 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:04:06 ]
>>526
最初のループの終了条件がおかしい。

528 名前:りょう ◆RyOrlro88Q mailto:sage [2007/12/19(水) 11:09:43 ]
ループは自己解決><

次は判定に問題が…><

529 名前:りょう ◆RyOrlro88Q [2007/12/19(水) 11:30:49 ]
jが増えない><

#include<stdio.h>

#define N 20

main(){
char ch[N],a,word='^';
int num,i,j;

j=0;
printf("Input your name.(When the input is finished,type ^.)\n");

for(num=0;ch[num]!=word;num++){
printf("ch[%d]=",num);
scanf(" %s",&ch[num]);

if(ch[num]==word){
break;
}
}
printf("target:");
scanf(" %c",&a);

for(i=0;i<num;i++){
if(ch[i]==a){
j++;
}
}
printf("%c=%d\n",a,j);
}

530 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:34:56 ]
ちったあ自分で考えないと成長しないぜ

531 名前:りょう ◆RyOrlro88Q [2007/12/19(水) 11:40:58 ]
考えてるけどわからないんです><

532 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:43:39 ]
>>528
他にも色色問題が。scanf()で一文字ずつ入力なんて阿呆なことしないで、
fgets()で1行分まるっと入力してしまえばいいじゃん。
あと、'^'による終了判定も無意味。



533 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:45:26 ]
つーか、>529ではループの判定条件がバグったままじゃんw

534 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:46:26 ]
何故増えないんだと思う?
具体的な場所はともかく、どの辺が間違ってそうな気がする?

本当はデバッガを使うのが良いんだろうが、printfデバッグっていう手法だってある。
それっぽい箇所にprintfを挿入するだけで見えてくるかもよ。

535 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:47:57 ]
ブロックの前後や中で満たすべき条件を式のかたちで書き出してみてはどうか

536 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:51:01 ]
紙と鉛筆使って机上でプログラムを実行してみるのもいい。
どこで意図しない動作になっているかすぐ分かる。

537 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:53:22 ]
>>518について詳しい人いませんか?

538 名前:りょう ◆RyOrlro88Q [2007/12/19(水) 11:57:29 ]
解決できました><

ありがとうございましたm(__)m

>>532
それが指定なんですよ><

>>534
そんな方法なんて知りませんでした><

539 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:01:09 ]
ほほぉ。それじゃ、スレよごしの罰として完成したソースを貼ってもらおうか。

540 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:06:58 ]
>>118
ttp://ml.tietew.jp/cppll/cppll/thread_articles/11083#ar11086

541 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:07:22 ]
>>537
inline指定無しでも最適化でインライン展開してくれるんじゃないの?
明示的にinline指定したい積極的な理由でもあるなら兎も角、そうでないならコンパイラに任せたら?
つーか、iccだとinline指定をつけると却ってコンパイラが混乱するみたいだ。

542 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:11:03 ]
>>540
番号間違ってる。
しかし、そのリンク先のエピたんの弁によれば、
inline指定してある関数を別の翻訳単位から見つけてくるiccはおかしなことになるね。



543 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:22:09 ]
7.1.2.4を見てextern inlineにしたら通った

544 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:00:43 ]
// aaa.h
extern inline double MySquare(double);

// aaa.cpp
double MySquare(double d){...}

// main.cpp
#include "aaa.h"

int main() {
 double d = MySquare(3.14);
}

一応gcc3.4とvc8でいけた
external linkageなinline指定つきの関数宣言がどうたらこうたら書いてあるけど理屈はよくわかんね

545 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:28:11 ]
>>540
>>541
>>542
>>543
ストラップ本にはinline定義とあるので、おそらく
無理なんでしょうね。
extern inline定義にしたらVC 2005では実行できましたが、
g++ v4では無理でした。移植性考えたらやはり素直にヘッダーに
定義を書いたほうが無難ですね。

546 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:30:36 ]
>>544
extern inlineを宣言につけるんですか。
試して見ます。

547 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:37:55 ]
>>544
g++ v4でもリンクできましたが、
定義にinlineつけないとインライン展開されて
ないかもしれないですね。


548 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:55:07 ]
VC++ 2008でもテンプレートのexport定義はサポート
されてないんだな

549 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:58:09 ]
>>548
別に規格に違反してないからね

550 名前:デフォルトの名無しさん [2007/12/19(水) 14:35:53 ]
kernel: pid xxxx (a.out), uid yyyy: exited on signal 11 (core dumped)
というメッセージがログに残っている場合は何を調べればいいのでしょうか?

551 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 14:38:34 ]
VCEEにMFCついてないかー/(^o^)\

552 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 14:52:40 ]
>>50
coreファイルを調べるのが王道




553 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 14:58:45 ]
>>550
signal 11はSEGVだから、要はセグメンテーションフォルトを起こしたってこった。
まぁ、メモリアクセス周りでバグってるんだろ。

554 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 15:02:26 ]
>>551
TurboC++ExpressだったらMFC付いてたかもしれん。

555 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 15:32:15 ]
>>554
把握した、WinAPI直接とか死にそうだからVB.NETかC#いじってくる

556 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 15:36:26 ]
どっちもとか正規表現あるから戻ってこれなくなりそう

557 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:20:06 ]
bitsetよりvector<bool>のほうが性能が上のことが判明した

#include <iostream>
#include <vector>
#include <bitset>
#include <time.h>
using namespace std;
main(){
#define N 8200000

int n,m,cl;

cl=clock();
bitset<N> a;
for(m=0;m<10;m++)for(n=0;n<N;n++)a[n]=1;
cl=clock()-cl;cout<<cl<<endl;

cl=clock();
vector<bool> b(N);
for(m=0;m<10;m++)for(n=0;n<N;n++)b[n]=1;
cl=clock()-cl;cout<<cl<<endl;
}

558 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:30:20 ]
自前の関数のほうが断トツで早かった

#include <iostream>
#include <vector>
#include "crc.h"
#include <bitset>
#include <time.h>
using namespace std;
main(){
#define N 8200000
int n,m,cl;
char *rnd =new char[N];
for(n=0;n<N;n++)rnd[n]=rand()&1;

cl=clock();
bitset<N> a;
for(m=0;m<10;m++)for(n=0;n<N;n++)a[n]=rnd[n];
cl=clock()-cl;cout<<cl<<endl;

cl=clock();
vector<bool> b(N);
for(m=0;m<10;m++)for(n=0;n<N;n++)b[n]=rnd[n];
cl=clock()-cl;cout<<cl<<endl;

cl=clock();
unsigned int k,l, *c=new unsigned int [1+(N>>5)];
for(n=0;n<(N>>5);n++)c[0]=0;
for(m=0;m<10;m++)for(n=0;n<N;n++){
k=n>>5; l=n&31; c[k] |= (rnd[n]<<l);}
cl=clock()-cl;cout<<cl<<endl;
}

559 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:30:52 ]
>>557
うちの環境ではbitsetの方が5倍速いんだが
bitset -> 143
vector -> 890
VC2005, C2D E6850

560 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:37:09 ]
>>559
MinGWやVCCで計ってみたけど、環境によって変わるらしいね でも自前のビット演算が最速だった
558のcrc.hはいりません

561 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:41:06 ]
>>560
gcc 3.4.4(cygming special)でもbitsetのほうが早かった
bitset -> 171
vector -> 687
自作は知らん

562 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:42:41 ]
>>558のほうでやってくれ 最適化されてループしていない可能性がある 初めのやつでは 



563 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:45:57 ]
VC2005
bitset -> 460
vector -> 1876
自前 -> 137
やはりbitsetaのが早い

564 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:49:50 ]
でも、どの環境でも自前でビット演算するのが一番みたいだね

565 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:58:54 ]
まあ問題領域によるだろう
早さだけを求めるならbitsetに限らず自分で書いた方がことが多いだろうね

566 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:59:00 ]
>>557
./a.gcc.O3
220000
400000
./a.gcc.O3.msse2
150000
390000
./a.gcc.O3.msse2.funroll-loops
150000
420000
./a.icc.xT.O3.ipo
140000
260000
./a.icc.fast
140000
250000


567 名前:566 mailto:sage [2007/12/19(水) 17:03:18 ]
おっと、書き忘れた。Xeon5160@3.00GHzね。
で、>558のほう。
--
./a.gcc.O3
440000
1010000
120000
./a.gcc.O3.msse2
410000
1010000
120000
./a.gcc.O3.msse2.funroll-loops
400000
1010000
130000
./a.icc.fast
420000
570000
130000
./a.icc.xT.O3.ipo
420000
570000
130000

568 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:17:10 ]
ポインタのアドレス計算について質問です。
#include <stdio.h>

int main(int argc, char *argv[]){
int *ptr;
int ary[] = {1, 2, 3, 4, 5, 0};
ptr = ary;

while(*ptr != 0){
printf("%d address = %u\n", *ptr, ptr);
++ptr;
}

return 0;
}

上記のプログラムを実行すると、アドレスは4番地ずつ進みます。
使っている参考書ではint型データは2番地ずつ進んでいますが、これは環境によって確保される記憶領域が違うということで宜しいでしょうか?
またfloat型の場合、使っている参考書ではint型の2倍、4バイト長ですが当方の環境だとint型と同じ4バイト長でした。
これも環境によって違うのでしょうか?

569 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:21:58 ]
ふつうはintは32bit 64bitパソコンは64鴨しれない

570 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:23:26 ]
その昔の参考書を投げ捨てろ。
16ビット環境主流の時代に書かれた本じゃないかい?

intのサイズは基本的に環境依存。16bitコンパイラは16bit、32bitコンパイラは32bit。

571 名前:568 mailto:sage [2007/12/19(水) 20:32:30 ]
>>569-570
有り難うございます。
環境によって違うのですね。
今、使っている本は
www.amazon.co.jp/dp/4756102700/
です。
難関と言われているポインタの説明がとてもわかりやすかったし、中盤まできたのでこのまま使っていきたいです。
さすがに捨てるのは勿体無いと思うので。

572 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:36:13 ]
intはサイズが環境依存だから、longを使え、

・・・って、その昔、仕様をカン違いしてるヤツが偉そうに
コーディングルールを決めることがよくあった。



573 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:37:32 ]
参考までにDOSコンパイラ(Turbo C++ 1.01)でのsizeof(int)とsizeof(long)実行結果
up.mugitya.com/img/Lv.1_up43982.png

32bitコンパイラだと両方とも4になる。

574 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:42:47 ]
>>568
www.oklab.org/language_c/lp64.html

575 名前:デフォルトの名無しさん [2007/12/19(水) 22:09:32 ]
IntelのCPU(x86)で、doubleとlong doubleはどうちがいますか?

576 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 22:47:06 ]
doubleは64ビット(IEEE 754倍精度)、
long doubleは80ビット(IEEE 754拡張倍精度)のことが多い。
Visual C++ 32ビット(どっちも64ビット)のように例外もある。

577 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 22:51:46 ]
失礼します。
どこで質問していいか判らず、何でも知ってそうなここに来ました。

ブーンスタジオをインストールしようとすると
DllRegisterServerへの呼び出しはエラーコード0x80070005により失敗しました。

と出るんですがどういう意味ですか?
当方PC歴1ヶ月で、全く解りません。
エラーコードググっても???です。
どうか、教えてください。




578 名前:デフォルトの名無しさん [2007/12/19(水) 22:58:12 ]
>>576
ありがとうございます。拡張倍精度というのがあるんですね。

579 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:07:38 ]

以下のファイルを構造体の配列に取り込みたいです。
-------------
a_yumi, 9, f
m_mana, 4, f
h_ryohko, 10, f
m_konomi, 12, f
m_kana, 4, f
。。。
-------------

struct data{
  char name[10];
  char age[10];
  char sex[10];
} g_data[NUM];

int main( void ){
 。。。
}

ファイルは開いてみないと大きさが分からないものとします。
"NUM"を可変に(ファイルのデータ数ピッタリに)取り込むことはできないでしょうか?
できればC++は使わずに、Cのみでやりたいです。お願いします。

580 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:10:37 ]
>>577
PC初心者板かソフトウェア板へいけ

581 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:14:12 ]
>>580
すみませんでした。
行ってきます

582 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:14:33 ]
>>577 半年ROMれバカ野郎



583 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:14:41 ]
>>577
この辺で聞いてみるとか?


【ニコニコ】BOON SUTAZIO Part4【ブラウザ】
pc11.2ch.net/test/read.cgi/software/1197298402/


584 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:15:13 ]
>>579
realloc()を使うとか、
リンクリストにするとか
で可能。



585 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:16:45 ]
>584
どもありがとうございます。
ググってきます。

586 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:05:26 ]
言語 C++
質問内容
 1.struct SHoge { char a; short b; int c; };と定義する。
 2.SHoge obj; と実体を作成する。
 上記の場合、objのアライメント(?)はいつも同じでしょうか?
質問の背景
 1.struct SHogeBase { char a; short b; int c; };と定義する。
 2.struct SHoge :public SHogeBase { void Save(FILE *f){fwrite(this, sizeof(SHogeBase),1,f); void Load(FILE* f){略}; }
 見たいに、メンバ変数のセーブ、ロードを行っており、タマタマ動作しているのですが、これがタマタマなのか、
 それともあらゆるC++環境で正常動作が保障されているのか、が知りたい。
足りない情報等あれば指摘お願いします。

587 名前:デフォルトの名無しさん [2007/12/20(木) 00:08:39 ]
>>586
OSが変わったりCPUが変わったらレイアウトも変わる罠。

588 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:10:37 ]
詰め物が幾ら入るかは処理系定義のお話なのです。

589 名前:586 mailto:sage [2007/12/20(木) 00:14:48 ]
>>587
OS・CPU(コンパチ品除く)が変わる場合、再コンパイルリンクコンパイルが入り、実行ファイルが新たに作成されますよね。
その実行ファイルは同じOS・CPUでは確実に正常動作するのでしょうか?
正常動作するならば、>>586 見たいなソースはありなんですかね?

590 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:14:50 ]
>>586
同じコンパイラの同じバージョンを使って同じオプションを指定してる限りは、いつも同じでいいかと思うけど
コンパイラが変わったりコンパイルオプションを変えたりすると変わることがある

591 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:17:20 ]
>>589
OSやCPUまでも変わる可能性があるなら、かなり厳しい
intのサイズも変わるしエンディアンも変わるし

592 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:38:27 ]
んやー・・・同じ実行バイナリで実行出来る環境なら概ね正しく動くだろ。



593 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 01:24:56 ]
>>586
メンバーアクセスしてればアラインメントの影響は
考えなくていいだろ。基本的にメモリレイアウトに
依存するようなコードは回避すべきじゃないのかね。

594 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 01:28:16 ]
unionとかは回避すべきなのか

595 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 01:30:24 ]
それはまた話が別でしょう。

596 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 02:13:15 ]
int型の変数aに50のいう数字が入っています。
これをchar型の配列b[]に5, 0と格納するのはどうすればいいですか?

597 名前:デフォルトの名無しさん [2007/12/20(木) 02:17:19 ]
b[1] = a/10;
b[0] = a%10;


598 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 02:18:41 ]
b[0] = '0'+a/10;
b[1] = '0'+a%10;

599 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 02:27:43 ]
sprintf(b,"%d",a);

600 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 02:37:30 ]
>>599
KY

601 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 02:38:51 ]
すまん、そういう場面だったのか……

602 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 02:39:15 ]
黙れカス



603 名前:596 mailto:sage [2007/12/20(木) 03:18:09 ]
ありがとうございました。

604 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 14:28:02 ]
すみません、printf関数のフォーマットに関する質問があります。


今、

printf("%20s%20s%20s", "hoge", "huga", "piyo");

という風に出力幅を20に指定したいんですが、
一箇所一箇所に20と書くのが不恰好のような気がしています。

もう少しスマートな書き方はありませんか?






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

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

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