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

このエントリーをはてなブックマークに追加
アセンブリコードみてもちゃんとシフト命令
走ってるのにね。
やはり処理系依存(Intelの場合はCPUで未定義)なのね。。。
>>886 Intelの場合はCPUで未定義
はぁ?
888888:04/05/29 14:57
 
>>883さん>>884さん
ありがとうございます。
二回に分けることでうまくいきました。
vのnビット右シフトは v >> (n % 32) になる処理系が多いみたいだね。
>>884
細かいことだが、文章が矛盾している。
「左オペランドの型のビット数を『超える』シフトは未定義」ならば、「unsigned
intが32bitであれば32『を超える』シフト」が未定義なのであって、32のシフトは
振る舞いが定義されているはずである。では、どちらが正しいか。
規格には、"greater than or equal to"と表現されている。よって日本語では
「左オペランドの型のビット数『以上の』シフトは未定義」とすべきである。
よって32以上のシフトは未定義である。従って、32のシフトは未定義である。
>>891
細かい事だが、矛盾の使い方が間違ってる
この場合はただの誤りである。
>>892
>>884 は、「左オペランドの型のビット数を超えるシフトは未定義」の発言に
よって32のシフトによる振る舞いの定義の存在を肯定している。しかしながら、
「32以上のシフトはできない」の発言によって32のシフトによる振る舞いの
定義の存在は否定されている。これは一貫性を欠く発言であると考えた。
「矛盾」とは、「物事の道理が一貫していないこと」である。よってこの場合、
私は矛盾という言葉が適当と考えた。
にも拘らず私の「矛盾」の用法が誤っているのであれば、恥ずかしながら、
なぜ間違っているのか、後学のためにご教示を賜りたい。
ああすまん、890へのレスだと思ってた。
ttp://kerochan.no-ip.com/vcsdk/letsprog/chap11.htm

のメニューバー自体にIDを付けたいのですが、どうやったらできるのでしょうか?
MAINMENU MENU DISCARDABLE

MAINMENUを好きに書き換える。
VC6のIDEを使っているのなら、ツリービューから変更したいメニューを選択してF2
>>895
すでにMENUというmenuIDがついているように見えるが。
>>891
すまん、指摘のとおり、超えるは誤りで以上が正しい。
つか、そんな鬼の首をとったようにつっこまんでもいいじゃない。
>>898
まぁ、32がどうなるかってのが問題だったからねぇ。
プログラマはそのくらいは意識してなきゃダメでしょ。
いや意識も必要だし、指摘も大いに結構だと思うが。
わざわざ7行も費やする話か ?

> 左オペランドの型のビット数<del>を超える</del><ins>以上の</ins>シフトは未定義です。
> の間違いだろ ?

で、済む話だと思うが。
901899≠891:04/05/30 11:46
>>900
それにも同意。
リソースエディタで、

「!ほかのエディタで開く」になってしまって開くことができなくなったのですが、どうやったら解除できるのでしょうか?
すれ違い
>>902
ここはあくまで”C/C++室”なんで、ツールの使い方が判らないってのは守備範囲外。
そのツールのスレを探して聞いてくれ。この辺を見る>>2
猫でも〜のSDKイントロダクションで
指示通りコピペしたのですが、
myProg.hbrBackground =GetStockObject(WHITE_BRUSH);
ってとこで、 error C2440: '=' : 'HGDIOBJ' から 'HBRUSH' に変換できません。

ってでます。
>>905
(HBRUSH)GetStockObject(WHITE_BRUSH);
とキャストしてやればいい。
GetStockObject()はブラシ、ペンといったいろんな種類の
オブジェクトのハンドルを返す汎用関数だから、返り値も
HGDIOBJと汎用型になっている。
907デフォルトの名無しさん:04/05/30 22:54
>>905
猫でもわかるのに・・・
君C/C++辞めたほうがいいよ
908デフォルトの名無しさん:04/05/31 02:59
C言語で次のようにコマンドライン引数をmain関数で受ける場合について質問があります
#include <stdio.h>

int main(int argc, char *argv[ ])
{
char *p[2];

printf("%p: &p\n",&p);
printf("%p: p\n",p);
printf("%p: &argv\n", &argv);
printf("%p: argv\n", argv);
return 0;
}
/*実行結果
0012FF78: &p
0012FF78: p
0012FF8C: &argv
00430E50: argv
*/
pがアドレス演算子をはずしても同じアドレスを表示したのは
pは配列の名前なのでその配列の先頭アドレスをさしているからですよね?
しかし、main関数で受け取った文字列へのポインタの配列argvはアドレス演算子をはずすと同じアドレスを表示しなくなりました。
格納されている領域をアドレスから推測するとどうやらargvはポインタの配列ではなく、文字列自体をさしているようです。
この違いはどこから来るのでしょうか?
関数の仮引数宣言における('T p[])は(T *p)と等価
910908:04/05/31 03:59
>>909
レスありがとうございます
そういえばそうでした。思い出しました。

そこで追加質問です。
#include<stdio.h>
#include<stdlib.h>
int n;
int main(int argc, char *argv[ ])
{
   int a;
   char *p = (char *)malloc(8);

   printf("%p: コード領域\n",main);
   printf("%p: スタック領域\n", &a);
   printf("%p: ヒープ領域\n", p);
   printf("%p: データ領域\n",&n);
   printf("%p: argv\n",argv);
   return 0;

/*実行結果
00401005: コード領域
0012FF7C: スタック領域
00431DE0: ヒープ領域
004237A4: データ領域
00420F9C: 静的領域
00430E50: argv
*/
これからするとコマンドライン引数はどの領域でもないような気がしますが
どこの領域に確保されているのでしょうか?
911908:04/05/31 04:00
上の実行結果で静的領域は間違えです
気にしないでください
>>910
どこかに。
割と見る実装ではヒープに確保してるけど。
913908:04/05/31 13:04
質問文に、また訂正箇所発見しました
malloc関数でとったメモリは16バイトです
#include<stdio.h>
#include<stdlib.h>
int n;
int main(int argc, char *argv[ ])
{
   int a;
   char *p = (char *)malloc(16);

   printf("%p: コード領域\n",main);
   printf("%p: スタック領域\n", &a);
   printf("%p: ヒープ領域\n", p);
   printf("%p: データ領域\n",&n);
   printf("%p: argv\n",argv);
   return 0;

/*実行結果
00401005: コード領域
0012FF7C: スタック領域
00431DE0: ヒープ領域
004237A4: データ領域
00430E50: argv
*/

>>912
レスありがとうございます
ヒープ領域ですか。
だとしたらmalloc関数で確保した場所と4000Byteも離れてるのはなぜでしょうか?
本当の初心者です…。
本を読みながら独学を始めました。

先に結論を。

winMEで使えるフリーのコンパイラをご存じありませんでしょうか?


GCCというのは本で知り、
会社で使っているXPでは、使っているのですが、
その会社を辞めようと思って、Cの勉強を始めたので、
なかなか会社ではやりにくくて…。

家のPCはMEで、そのPCを買い替えられないくらい薄給なもので…。
その本では、GCCを使う際、
「XPで動くことを想定しています」
となっていて、MEでのことを書いていないもので。

「MEで使えるかやってみればいいじゃん」
は、今(会社にいる)思いつきました…。

すみません。よろしくお願いいたします。
>>914
タダで最強!フリーC/C++コンパイラ
http://pc5.2ch.net/test/read.cgi/tech/1035882599/l50


つか、聞く前にやってみろよ、ホントに。
916デフォルトの名無しさん:04/05/31 14:11
>>913
なんかけんか腰だな
917相談:04/05/31 14:32
サーバ側のファイル更新日付を取得したいのですが
サンプルコードがハングルでよくわかりません

助けてください
ttp://www.serious-code.net/moin.cgi/FileTime
>>900
アプリケーション側の管理する領域ではない、とは思いつかないのか?
919918:04/05/31 14:35
アンカーは910の間違いorz
920デフォルトの名無しさん:04/05/31 14:52
switch (pid = fork()) {
case 0:
・・・
_exit(1);
case -1:
perror(NULL);
exit(1);
default:
waitpid(pid, &status, 0);
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
fprintf(stderr, "pwd failed\n");
exit(1);
}
break;
}

このプログラムを改造して子プロセスから親プロセスに0以外のstatusを
送りたいのですがどうすればいいですか?
exitのあたりをいくらいじくっても無理なのですが・・・
>>910
環境変数かなんかと一緒のアドレス空間だった気がするが
なにぶん MS-DOS3.3B 使ってた当時のことだし記憶違いだとアレだなぁ
いやつまり OS や CPU によって違っても当然じゃないの? という。
OS もコンパイラもコンパイルオプションも書かないでどういうつもり? という。
>>912 の「割と見る実装」の意味は分かってる? という。
仮に DOS でも Tiny, Small, Large で違うだろうし、という。
素人に毛が生えた程度の俺はそんな風に思う。
922914:04/05/31 15:34
>>915
ありがとうございます。


>つか、聞く前にやってみろよ、ホントに。

この言葉も含めて、本当にありがとうございます。
頑張って勉強・実践します。
923デフォルトの名無しさん:04/05/31 15:44
>>921
キモい
924デフォルトの名無しさん:04/05/31 18:00
すいませんすごい初心者なんですが
5個整数入力して最小値と最大値求める
のって変数最低いくつでできますか?(配列までいってません)
3つ。
int i, max, min;
4つか。ユーザ入力を受け取る変数が必要だ。
>>925-926
サンクスです
たすかりました
928デフォルトの名無しさん:04/05/31 18:12
>>926
ループにしなければよい。
>>913

ヒープから確保する時って、頭の方から順番に取っていくもんでは*ない*んじゃなかったっけ?
空いてそうなところをえいって見当つけてとってくるんでしょ。
だとしたら、たかだか4kBくらい離れてても別におかしく無い気もする。

俺の言っていることがおかしいってことはあるかもしれんけどさ。
930913:04/05/31 19:41
>>929
そういうことなんですね
納得しました

その辺はOSが管理しているのでC言語だけじゃわからないってことですよね

プログラムを作っている環境は
WindowsXP Home
MS-VC++6.0
です。
MS-VC++6.0を使っててコンパイラを聞かれたらなんて答えればいいのでしょうか?
VC++6.0と答えればいいのでは?
>>930
「割れ物です」と答えとけ。
933913:04/05/31 20:20
>>931
そう答えればよかったんですね

>>932
お金を出してお店で買いました
あなたと一緒にしないでください
ネタにマジレス(略
ってか、まぁ、おまえ人間関係で失敗することが多いだろう、と
むしろ失敗してることすら意識しないか。