スレを勃てるまでもな ..
75:デフォルトの名無しさん
09/03/04 21:13:52
>>72
char 配列 可変長要素 エンディアン とくれば UTF-8 系の処理だろうな
76:64
09/03/05 00:32:45
>>72
いまCodeWarriorっていうIDEのOSSなプラグインを改造して、WIN(VC++)+UNIX(gcc)で
使えるツールに仕立てようとしています。機能は組み込み開発用デバッグアダプタの
USB越しのコマンド制御で、レジスタ読んだりMCUステップ実行させたりします。
扱う型自体はu?int(8|16|32)_t(かそれをtypedefした/enumで結果的にいずれかに
落ちた)型だけです。パック・アンパックはホスト側でだけですが、ターゲットのエンディアンは
MCUで異なるのと、ホストもx86以外もあるのでhtonlなどの他、htoll(host-to-littelong)
なども用意して使っています。
memcpyだとエンディアン変換で面倒云々は
myfunc(uint32_t hoge) {
hoge = htoll(hoge);
memcpy(buff, &hoge, 4)
などアドレス取るために行数が倍になるという話です。ここは一行にまとめて書けるstructや
パッキング関数に渡す方法のほうがすっきりします。
既に一度ざっと移植したのですが、元ソースが
*(unsigned int *)(data + 2) = hogehoge;
data[6] = hoge;
*(unsigned char *)(data + 7) = fugafuga & 0xFF;
とかややぐちゃっとしてるので、もっとすっきりとUSBで流し込むバイト列の生成が
できないかなぁと質問してみました。まあせいぜいコマンド1つあたり5変数程度
パックするだけなんで、大問題というより途中から面白くなってきたのでやってるのですが。
77:64
09/03/05 00:42:26
>>69 で型チェックしてくれないというのは間違いで、gccではオプションが漏れてました。
gcc -pedantic --std=(gnu|c)99 -Wall -Wextra -Werror -Wconversion
でいけた(-Wconversionがチェック用)ので、今のところstruct方式がエレガントかなぁと。
いまはVC++で使える方法を探してます。こっちはC++なんで、元のキャスト代入方式より
簡潔にはしたいですが、もっと色々とできそう。typeof/decltypeを見つけて小躍りしましたが、
これはVC++では使えないのですね・・・
78:デフォルトの名無しさん
09/03/05 00:58:00
>>76
ターゲットのMCUによってエンディアンが異なるなら、
memcpyだけではなく、structでも、自作sprintfでも、要素ごとにエンディアンの変換は必要ではないですか?
なぜmemcpyでだけエンディアン変換が問題になるのでしょうか。
79:デフォルトの名無しさん
09/03/05 01:01:42
memcpy(buff, &hoge, 4);は*(uint32_t*)buff = hogeに機械的に書き換えられると思う。
80:64
09/03/05 01:22:25
>>78
もちろんそうですが、memcpyベースだと2つの文になります。
引数やstructの中なら横に{ htons(v1), htonl(v2), v3, ...} と}羅列できるので、
やや行数的にお得かなと気持ちが傾いてます。
>>79
はい、元コードがキャスト方式です。ただ、キャストとmemcpyは書き込み先バッファの
オフセット位置を明示的に調節する必要があるので、「とりあえず変数を並べると
よろしくパッキングされる」みたいにできないかなぁと。
まあベタに書いてく元コードでいいじゃん?てな気もする程度の問題ですが、
色々方法がありそうで面白いので深追いしてみようかなと。
81:デフォルトの名無しさん
09/03/05 07:36:42
>>80
重要なのはソースの行数だけですか?
(1)ソースの行数、(2)ソースの文字数、(3)ソースの可読性、(4)オブジェクトのサイズに優先順位を付けるとどうなりますか?
82:デフォルトの名無しさん
09/03/05 08:35:55
ドメストがおすすめ
83:64
09/03/05 09:18:13
>>81
各項目での自分的評価だと、こんな感じです(1が最も短い・速い・わかりやすい・etc):
cast: 3321
標準的な記法で、外部知識を要しない。オブジェクトサイズも最小。ただ、キャストの嵐が目に
やさしくない(マクロで対処は可能)のとオフセット計算が間違えやすい。パックされた構造の把握は
縦に読む必要がある。縦の行数はパック対象変数分程度。バッファコピーが必要になるとmemcpyが必要。
例: *(uint32_t *)(dst + 4) = (uint32_t)htonl(src); <- これがN行続く
memcpy: 4211
標準関数なので、外部知識を要さず、サイズも呼び出しのみで小さい。キャストも不要。
オフセット計算は必要で、転送データ構造のイメージは縦に読んで把握する必要がある。
縦の行数は最大で対象変数の数+エンディアン変換数程度で最大。
例: src = htonl(src); memcpy(dst + 4, &src, sizeof(src)); <- これがN行続く
struct: 2222
外部知識は要しないが、一般性で劣る。サイズはキャスト方式と同等か、スタック消費分劣る。
オフセット計算が不要で、構造イメージは横に並んだ順そのままで把握はしやすい。しかし、
構造定義が長くなりがちで、変数の使用位置から離れるとズレやすいかも。バッファコピーが必要に
なるとmemcpyが必要。
例: struct { uint32_t _a; uint8_t _b, ... } buf = { htonl(src1), htonl(src2), ... }; <- スタック利用
or typedef struct { uint32_t _a; uint8_t _b, ... } in_t;
*(int_t *)(buf + 4) = { htonl(src1), htonl(src2), ... }; <- 既存バッファへの書き込み
mprintf: 1113
フォーマット表記の知識を得る必要があるが、処理部分のコードはかなり簡潔にデータ構造を
表現・理解できる。ただし、mprintfの実装分、メモリと処理速度で劣る。処理の中身はmemcpy。
例: mprintf(buf + 4, "NN...", src1, src2, ...);
84:デフォルトの名無しさん
09/03/05 10:58:37
Cを勉強しているのですが
虚数を含んだ計算式を作る必要があるのですが
色々調べたところ、<complex.h>をインクルードすると
虚数iを大文字Iとしてプログラムを書くことで虚数を扱える、とあったのですが
下のようなビルドエラーが出てしまいます(complex.hが無い、という意味か?)。
fatal error C1083: include ファイルを開けません。'complex.h': No such file or directory
ちなみに、VC++2008を使って勉強していますが
ソース自体はCの文法で書いています。
webでも色々調べたんですが、解決方法は見つからず・・・どなたか助言下さい。
85:デフォルトの名無しさん
09/03/05 11:24:30
>>84
C++用の
<complex>
ならあるみたい
86:デフォルトの名無しさん
09/03/05 11:51:19
複素数は C99 からなので、手元のコンパイラが対応していなくても泣いちゃだめ。
87:デフォルトの名無しさん
09/03/05 14:58:34
printf("ロベール先生の第27章から忌み不明になってきた");
88:デフォルトの名無しさん
09/03/05 15:58:16
#include <iostream>
using namespace std;
#include <math.h>
#define FNC void fnc();
FNC;
int main()
{
fnc();
return 0;
}
FNC
{
cout<<"FOFOOFOF"<<endl;
}
どこが間違っているんでしょうか?
89:デフォルトの名無しさん
09/03/05 16:01:21
#define FNC void fnc()
セミコロン入れたらダメじゃね? 知らんけど。
90:デフォルトの名無しさん
09/03/05 16:04:49
>>89
ハイパーサンクス
91:デフォルトの名無しさん
09/03/05 18:27:57
>>84
そんな事に手間取るくらいなら自前で作った方が早いだろ。
加減算、乗算は一瞬でしょ。
割り算は意味わからなくても公式で一発だし。
92:デフォルトの名無しさん
09/03/05 18:31:38
>>83
fputcの要領で、16ビットや32ビットなど必要なものを
(中身はエンディアン変換とfwriteを使い)自分で関数を作っていくのはどう?
と思ったが、VC++だとfmemopenがないから駄目だよな。
93:デフォルトの名無しさん
09/03/05 18:45:46
>>84
適当に探せば外部のライブラリがありそうじゃない?
それでしのいでいるうちに猛勉強してC++も使えるようになれればおk。…無茶か?
94:デフォルトの名無しさん
09/03/05 19:15:15
try catchをnew以外に使えてない素人なんだけど、try catchってほかにどんなときに使うの?
95:デフォルトの名無しさん
09/03/05 19:31:37
例外をキャッチするときに使う。キャッチしたい例外がないなら別に使わなくても良い。
「自分で書くコードが、どんなときに例外をスローすべきなのか」
となると別の話になるけど。そういうことが聞きたいの?
96:デフォルトの名無しさん
09/03/05 19:40:34
h = FindFirstFile( path, &data );
で FindFirstFile( )関数の失敗した値
INVALID_HANDLE_VALUE
が返ってきた時
if( INVALID_HANDLE_VALUE == h )
{
FindClose(h);
}
ってやるんだけど 失敗したときのハンドル値で FindClose() していいの?
失敗してるこの場合 FindClose() はいらないの?
97:デフォルトの名無しさん
09/03/05 19:47:00
>>96
していい。
URLリンク(msdn.microsoft.com)
98:デフォルトの名無しさん
09/03/05 19:48:43
ごめん。間違えた。
いらなかった。
99:デフォルトの名無しさん
09/03/05 19:49:18
ごめん。間違えた。
いらなかった。
100:デフォルトの名無しさん
09/03/05 20:00:59
ごめん。間違えた。
助かった。
101:デフォルトの名無しさん
09/03/05 22:29:35
構造体の中に、別の構造体のポインタがあるとして、そのポインタが
指し示すアドレスから、そのデータ型の構造体が連続して配置されている場合、
n番目のデータにアクセスしたい場合、どうしたら良いでしょうか。(下記サンプル参照)
typedef struct {
unsigned char test1;
unsigned char test2;
} Test_set1;
typedef struct {
unsigned short test3;
unsigned short test4;
} Test_set2;
typedef struct {
Test_set1* test5;
Test_set2* test6;
} Test_all;
volatile const Test_all Test_struct = {
(Test_set1*)0x3FFFFFA0,
(Test_set2*)0x3FFFFFB0 ←メモリ上では、Test_set2型がn個連なっている。
};
void Test_func(unsigned char index){
unsigned short tmp1, tmp2;
tmp1 = Test_struct.test6->test3;
tmp2 = Test_struct.test6[index]->test3; ←コレはダメぽい・・・
}
やっぱポインタを任意回数インクリメントか、indexを足すしかないでしょうか?
102:デフォルトの名無しさん
09/03/05 22:34:24
tmp2 = Test_struct.test6[index].test3;
103:101
09/03/05 22:54:33
>>102
おぉ・・・・・素早いレスありがとうございます。
確かにコンパイル出来るようですっ! 明日アセンブラで狙ったところに
アクセスしているか確認してみます。
この場合、test6 はポインタですが、Test_struct.test6[index] と書くと、Test_set2型の
RAM扱いになるんでしょうか?(ショボイ質問ですいません)
104:デフォルトの名無しさん
09/03/05 22:59:24
p[n]は*(p + (n))と同じ
105:デフォルトの名無しさん
09/03/05 22:59:54
RAMってw
106:デフォルトの名無しさん
09/03/05 23:23:12
Random Access Machomen
107:デフォルトの名無しさん
09/03/05 23:44:50
こんなのがわかってないうちからアセンブリやってるの?
順番ちがくね?
108:デフォルトの名無しさん
09/03/06 00:04:27
ハード屋なんじゃない?
109:デフォルトの名無しさん
09/03/06 00:08:36
int nFibo[16] = { 1, 1 };
これの = { 1, 1 };
って・・・・なんでしょうか・・?
こんなの見たことありません・・!
これはどういう意味なんですか・・?
110:デフォルトの名無しさん
09/03/06 00:23:18
nFibo[0] と nFibo[1] を1で初期化して残りは0で初期化。
111:デフォルトの名無しさん
09/03/06 00:28:44
わかりやすい説明サンクス!
112:デフォルトの名無しさん
09/03/06 00:54:22
ロベールのC++教室はC++と銘打っているが、ほとんどCの勉強という感じだ。
Effective C++などには配列はやめてvectorとstringを使おうと書かれているが、
ロベールでは徹底的に配列を使う(というより全編にわたってほぼ余すところなく登場する)。
配列はポインタと表裏一体なので、初心者は最初からCの一番の鬼門と真正面から向き合うことになる。
メモリ操作に関する知識は絶対に必要なのでこのスタンスもわからなくはないが初心者にはやや厳しくはないか?
他にも、ビット列の再解釈がしばしば登場したり、ハンガリアン記法が採用されていたり。
まぁ、いずれも必要な知識だけどさ。
113:デフォルトの名無しさん
09/03/06 01:11:00
C++の解説には、色々な入口から入る方法がある。
どの解説も同じでは面白くない、違う方が良い。
Cから順番に説明があったり、
いきなりクラスから説明したり、
それを読者が選ぶ事が出来る。良い時代です。
それぞれが、それぞれに良い
114:デフォルトの名無しさん
09/03/06 01:23:41
む。なるほどそういう考え方もあるか。確かに。
自分はCを学ぶにあたってポインタの習得にだいぶ苦労したので
Accelerated C++でCを勉強したときは目からうろこだった。
115:デフォルトの名無しさん
09/03/06 01:41:15
>>113
その考え方ステキだな。
俺は途中でロベールを読んだが、たま〜に知らない事が出てきて面白かった程度の記憶しか残っていない。
(逆に言えば特につっかからなかったとも言える。慣れてたからだろうけど。)
最初に読んでいたらきっと感慨も違っただろうなぁ。
116:デフォルトの名無しさん
09/03/06 01:58:46
私の考え方は他人と違う。。同じかもしれない。
機械語を逆アセンブルするときは、逆順、後ろから読む。
そして、終わったら前から順次読む。
本を読む時も同じ。逆から読む。
変かもしれない
人それぞれです、その人に合ったものを選ぶ事が出来れば幸せになります。
自分自身を知って、マッチする方法を選ぶ能力を養う
これが幸せへの法則かもしれません。
117:デフォルトの名無しさん
09/03/06 15:52:32
数値入力で1〜9999の範囲内で入力してくださいという
プログラムで範囲外だとエラー文を表示するのですが、
long型のオーバーフローする値(4294967296)を打ち込むと
入力エラーにならず読み込んでしまいます。
どういった対策をすればよいのでしょうか?
ちなみにint型で定義してあります。
118:デフォルトの名無しさん
09/03/06 15:53:13
コードは?
119:デフォルトの名無しさん
09/03/06 15:53:40
>>117
doubleで読み込めば
120:デフォルトの名無しさん
09/03/06 16:41:16
>117
入力部分と、保持する数値とを分離するとか。
>119
現実的にはともかく、理論的には変わんなくね? そうでもない?
121:デフォルトの名無しさん
09/03/06 16:45:22
string に読み込んで桁数判定した後数値変換するとか。
122:デフォルトの名無しさん
09/03/06 16:53:07
>>117
そういう時のscanf
123:デフォルトの名無しさん
09/03/06 18:15:57
scanfを恥ずかしげもなく使う男の人って。。。
124:デフォルトの名無しさん
09/03/06 18:17:48
男女以前にプログラマとしてどうか
125:デフォルトの名無しさん
09/03/06 18:18:29
別に普通
126:デフォルトの名無しさん
09/03/06 18:45:28
int64整数の補数をint32|int16へ最大値切り詰めにしても余剰bit切り捨てにしても
1〜9999条件なら 4294967296 (0x1 0000 0000)は弾いてくれると思うが
如何か
127:デフォルトの名無しさん
09/03/06 19:27:15
strtol を使えば大きすぎるのを入れたときはLONG_MAXになるから弾けるよ
128:デフォルトの名無しさん
09/03/06 19:35:05
>>126
弾けるのは4294967296とか、一部じゃないかw
129:デフォルトの名無しさん
09/03/06 21:33:28
キャストの弊害や精度不足の問題なら対処のしようがあるが
もしも 117 の不具合症状を含むライブラリや CPU が有るようなら大問題
概念的指摘ならば問題はないが数字を出して上手くいかないと主張するなら
実行環境を示して頂きたい。
130:デフォルトの名無しさん
09/03/06 21:53:18
バカは黙ってろw
131:デフォルトの名無しさん
09/03/06 21:54:39
>>117
>ちなみにint型で定義してあります。
といっているが、そもそもオーバフローする値が入力できるんだから元は
文字列とかint以外の値でしかありえない
それをintに変換した後ではじくのは不可能
面倒くさくても地道にやるしかない
1) 文字列のまま取得
2) 前後の空白とかとる
3) 数値以外のものがあったらエラー
4) 先頭の0を削除
5) 5桁以上ならエラー
6) 空文字列なら0
7) 整数変換
とか、まあがんばれ
132:デフォルトの名無しさん
09/03/06 22:31:45
まぁ、strtol()を使えば変換終了点が得られるからそこをチェックすれば事が足りるな。
133:デフォルトの名無しさん
09/03/07 01:18:09
ポインタは俺の理解を超えてやがる・・・・!!!
134:デフォルトの名無しさん
09/03/07 07:38:06
>>133
どうしたw突然何があった。
…まあ状況次第ではある意味大半の人の理解を超えているよ。
135:デフォルトの名無しさん
09/03/07 07:48:07
自分で組むだけなら、Cは良い言語だと心から言えるが、
他人のソースを読むと微妙な気分になる。
C++はまあまあ良い言語だが、他人のソースは
くそったれと思う。
って事かな?
136:デフォルトの名無しさん
09/03/07 08:22:39
俺は自分のソース見てくそったれと思う
もっときれいに書けないのかよ昔の俺
137:デフォルトの名無しさん
09/03/07 08:26:16
それはあなたの進化の証。
138:デフォルトの名無しさん
09/03/07 12:04:25
ソースなんて動けばいいよ。動くことが見た目に判ればそれでいい。
139:デフォルトの名無しさん
09/03/07 13:45:17
ポインタを解りやすく解説してくれるC++のサイト教えてください・・・
ロベール先生すいません
あなたの説明は僕の理解を超えている
140:デフォルトの名無しさん
09/03/07 13:47:43
>>139
適当な本を買った方がいいよ。
サイトは限界があると思う。
…そしてアドレスとポインタが分からないならロベール先生のせいじゃなくてまだC++に入るほどの腕じゃないと言うことだからC言語の本が良いと思うよ。
141:デフォルトの名無しさん
09/03/07 14:02:08
アセンブラやればポインタはわかる。
なのでPCプログラミングより8bitマイコンでも触るのお勧め。
ポインタが判らないという事はメモリマップとかスタックイメージも
脳内に浮かんでいないのは確実な訳で、それは計算機の知識が決定的に
欠けてる訳で、ってことはC/HWに限らずJVMやCLRも理解できない訳だから
一番見通しのいい低レベルハードウェアを触って身に付けるといいと思う。
142:デフォルトの名無しさん
09/03/07 14:39:23
>>141
あっそ。
143:デフォルトの名無しさん
09/03/07 14:53:10
#include <iostream.h>/*ロベール教室より*/
void ChangeToShohwa(int x)
{
if(1926 < x && x < 1989)
x -= 1925;
else
x = 0;
}
void Shohwa()
{
int nYear;
cout << "西暦を入力して下さい > ";
cin >> nYear;
ChangeToShohwa(nYear);
if(nYear)
cout << "その年は昭和 " << nYear
<< " 年です。" << endl;
else
cout << "その年は昭和ではありません。" << endl;
}
int main()
{
Shohwa();
Shohwa();
return 0;
}
なぜこれで失敗するのかが理解できない・・あほでごめんなさい
144:デフォルトの名無しさん
09/03/07 15:07:32
>>143
URLリンク(www7b.biglobe.ne.jp)
>
普通に理由が書かれてるじゃん。
145:デフォルトの名無しさん
09/03/07 15:08:00
>>144
手滑った
URLリンク(www7b.biglobe.ne.jp)
>引数は、新たに変数が作られ、それに値が代入されるという仕組みになっているからです。
146:デフォルトの名無しさん
09/03/07 15:17:51
>>142 何か気に障るようなこと言ったか?
147:デフォルトの名無しさん
09/03/07 15:20:35
ポインターは簡単、ポインターの解説が難しい。 上手に説明できたら天才。
148:デフォルトの名無しさん
09/03/07 15:33:45
つまり、なんだかんだでnYearの値が変更できないってこと・?
149:デフォルトの名無しさん
09/03/07 15:46:37
なんだかんだというかそのやり方だとnYearがこぴってわたされて
そのこぴったのを変更しているだけ
150:142
09/03/07 16:14:00
>>146
…俺の深読み誤解か。
スマン。
151:デフォルトの名無しさん
09/03/07 17:55:04
>>147
ポインターのような人間には解りづらく、そして機械に都合のいいように作られたものの使用を強制する言語はダメポ言語
普通は人間に合わせて言語が作られるべきだろ
152:デフォルトの名無しさん
09/03/07 18:16:59
ポインターは日本語に似合う。皆は知らぬうちに日本語会話の中でポインターを使っている。
153:デフォルトの名無しさん
09/03/07 18:33:00
>>151の考える素晴らしい言語のソースも、
ポインターを駆使して記述されています。
154:デフォルトの名無しさん
09/03/07 18:47:53
ボイン太さいこー!
155:デフォルトの名無しさん
09/03/07 19:01:39
>>152
This is it.
156:デフォルトの名無しさん
09/03/07 19:11:01
int **(*i[10])[4]
int (*i())[6]
int *(*(*i)())[4]
数秒以内にポインタiが何を指しているのか理解できないと
Cの初歩にすら達してないと言われた
お前らなら、一目瞭然で数秒どころか一瞬だろ
157:デフォルトの名無しさん
09/03/07 19:19:29
>>156
実際そんな使い方はまったくしない。
一目でわかりやすい宣言をするのが上級者。
158:デフォルトの名無しさん
09/03/07 19:25:03
実際は使わないが、錬度を試す訓練だよ
159:デフォルトの名無しさん
09/03/07 19:30:04
数秒でわかったらすごいわ
俺の場合、特に最後は()の解析で時間かかるぞ
160:デフォルトの名無しさん
09/03/07 19:33:59
そこに至るまでのコード次第
いきなり 156 が現れたら 書いた奴の精神状態を疑う。
161:デフォルトの名無しさん
09/03/07 19:59:17
>>159
俺、今でも数秒では無理だが、宣言をすらすらと解析できないとなると程度しれるよな
まだまだ初級のおれがちょっと前に新人にこのp何さしてるのって聞かれたのがこれ
int (CC::*(p[3]))(void);
これぐらいなら頻繁に使うだろうし、ム板連中なら一瞬だろ
ちなみに>>156は会社の新人PGのC言語コースの理解度試験
162:デフォルトの名無しさん
09/03/07 20:12:25
頻繁に使うか?
俺だったらまずtypedefするが…
163:デフォルトの名無しさん
09/03/07 20:24:13
爆釣
164:デフォルトの名無しさん
09/03/07 20:24:22
>>162
どういう風にtypedefするんだ?
165:デフォルトの名無しさん
09/03/07 20:28:02
URLリンク(mist000.h18.ru)
メンバーイニシャライザを使用したコンストラクタをクラス定義の外に分離したいんだが、
g++でコンパイルするとこのようなエラーが出る。
--------------------------------------------------------
uha@seven:~/dev/uhaww$ g++ -Wall -o debug debug.cpp
debug.cpp: In constructor ‘TestException::TestException(std::string&)’:
debug.cpp:8: error: ‘sCause’ was not declared in this scope
debug.cpp:8: error: expected `{' at end of input
debug.cpp: At global scope:
debug.cpp:10: error: redefinition of ‘TestException::TestException(std::string&)’
debug.cpp:8: error: ‘TestException::TestException(std::string&)’ previously defined here
--------------------------------------------------------
分離すること自体考えてはいけないのだろうか...
メンバーイニシャライザ使わなければ分離できるのに。。
間違いがあればよろしくお願いします。
166:デフォルトの名無しさん
09/03/07 20:28:56
>>162
まさか typedef int (CC::*(p[3]))(void)
なんて言わないよな
int (CC::*(p[3]))(void)が何をあらわすのか、解りやすくするtypedef頼むよ
167:デフォルトの名無しさん
09/03/07 20:29:28
実はほとんど俺の自作自演
>>164
typedef int (CC::*ccpoint)(void);
ccpoint p[3];
こんな感じにするんじゃね?
168:デフォルトの名無しさん
09/03/07 20:34:07
2ちゃんねる株式会社ではよく使います。
実際はベテランほど保守性を考慮して単純に書く。
Cの設計者でさえシンプルに書けと言ってるのに、
何を勘違いしてるんだろね。
169:デフォルトの名無しさん
09/03/07 20:38:15
むずかしっすぎる!
170:デフォルトの名無しさん
09/03/07 20:46:27
int (CC::*(p[3]))(void);
が頻繁に出てくるようでは駄目だと思うわ
171:デフォルトの名無しさん
09/03/07 20:57:19
Visual C++ 2008 Express Editionの使い方がよくわかりません。
講座サイトの解説で使ってるVisual C++はちょっと違って
現在編集中のプログラムを実行する方法がわかりません。
ご教授よろしくお願いします。
172:165
09/03/07 21:01:49
お騒がせしました、自己解決しました。
173:デフォルトの名無しさん
09/03/07 21:13:57
>>171
F1を押してヘルプを読め
174:デフォルトの名無しさん
09/03/07 21:18:57
>>171
スレ違いだろ
175:デフォルトの名無しさん
09/03/07 21:19:31
int (CC::*(p[3]))(void)のpって何を指す
日本語で書いてくれ
176:デフォルトの名無しさん
09/03/07 21:21:16
pは、配列です。何の配列かと言うと・・・次の人、どうぞ
177:デフォルトの名無しさん
09/03/07 21:22:20
パス!
178:175
09/03/07 21:26:55
あと、>>156の
int **(*i[10])[4]
int (*i())[6]
int *(*(*i)())[4]
のiも頼む
179:デフォルトの名無しさん
09/03/07 21:34:36
もしかして、voidさん入店されてはります?
180:デフォルトの名無しさん
09/03/07 21:40:12
全然わからんw
1番目は多次元配列っぽくて、
2番目と3番目は関数ポインタの配列っぽいれすか?
あと>>161はメンバ関数へのポインタっぽい?
答えをたのむぅ。
181:デフォルトの名無しさん
09/03/07 21:48:22
実際のコードで、こんなの使っちゃダメだが、
Cの文法の知識として、本当におまえら、読めないのか?
javaばっかやってるから、バカになる
182:175
09/03/07 21:52:00
>>180
俺と似たような,orzレベルだな
色々レスしてる人たちって解ってるんでしょ、なら教えてくださいなーーーー
183:デフォルトの名無しさん
09/03/07 22:02:29
>>181
本当に読めないので、ぜひ、答えを
184:デフォルトの名無しさん
09/03/07 22:51:56
int **(*i[10])[4];
( ((int[10])へのポインタ)[4] )へのポインタ ×2
int (*i())[6];
(int f()のような関数へのポインタ)[4]
int *(*(*i)())[4]
( (int *f()のような関数へのポインタ)[4] )へのポインタ
ということでいいのか?
185:デフォルトの名無しさん
09/03/08 00:00:32
C言語パズルです、みたいなノリで出されるなら喜んでやるかも。
186:180
09/03/08 00:09:44
1番目は「二次元配列へのポインタ」のポインタのポインタとなる要素数10の変数i。
2番目は二次元配列を戻り値とする関数i。
3番目は「関数ポインタを格納する二次元配列へのポインタ」へのポインタ。
わからーんw
187:180
09/03/08 00:50:52
んー。一番目はいきなり間違いだな。
1番目は「二次元配列へのポインタ」のポインタのポインタとなる要素数10の変数iだとすると
int *(**i[10])[4]; と書く必要があるようだ。わからん・・・。答えはまだか。
188:デフォルトの名無しさん
09/03/08 01:11:50
int **(*i[10])[4]
intへのポインタのポインタの配列へのポインタの配列
int (*i())[6]
intへの配列へのポインタを返す関数
int *(*(*i)())[4]
intへのポインタの配列へのポインタを返す関数へのポインタ
189:180
09/03/08 01:21:47
なるほど、int **(*i[10])[4]の最初のint **は納されている型になるのか。
んでもって、(*変数名)[4]が多次元配列へのポインタで、
変数名の後の[10]がその変数の要素数になる、と。
だんだんわかってきた。おもしろい。w
190:デフォルトの名無しさん
09/03/08 01:39:49
外側から一つずつ剥がしていく。最初と最後の両側から剥がせるときは、最初を先に剥がす。
剥がしたものが、それぞれ
int(などの普通の型名)であれば…… 「int」
* であれば…… 「へのポインタ」
[N] であれば…… 「の配列」
(int,int) (など、カッコ内に型名)であれば…… 「が戻り値の型、(int,int)が引数の型である関数」
MyClass:: であれば…… 「で、MyClassのメンバであるもの」
をつけていく。これで読めるはずだ。英語圏の人は逆向きにやるらしいけど。
191:デフォルトの名無しさん
09/03/08 01:45:13
あと、これとは直接関係ない話だが、intへのポインタへのポインタは、intの2次元配列とは別物だからね。
「ポインタ⇔配列」の互換ができるのは、末尾の「〜へのポインタ」「〜の配列」の部分のみ。
だから、ポインタの配列はポインタへのポインタで受けることができるし、2次元配列は配列へのポインタで受けることができるが、
2次元配列をポインタへのポインタで受けるのは不正。
192:デフォルトの名無しさん
09/03/08 01:51:13
>>190
読めないよ。
int &a
int func<int>()
193:180
09/03/08 01:52:14
大変よくわかりました。
194:デフォルトの名無しさん
09/03/08 01:56:42
167は正しいの?
195:デフォルトの名無しさん
09/03/08 02:07:28
正しいよ。
196:デフォルトの名無しさん
09/03/08 02:07:55
>>194 うん
197:デフォルトの名無しさん
09/03/08 02:26:30
C言語の宣言の文法は、もうちょっとマシな文法にならんかったの?
標準化するとき、誰からも反対が出なかったのが不思議なくらいだ。
頭がいい人がいっぱい集まってやってるハズなのに。
198:デフォルトの名無しさん
09/03/08 03:13:06
これでいいんじゃない?
っていうか、Quizみたいなみょうちくりんな宣言が必要になるプログラムは
そもそもの設計が間違っている気も。
199:デフォルトの名無しさん
09/03/08 03:21:05
Cだと、ポインタ型を別に作って欲しかった
後は関数ポインタの宣言を何とかして欲しかったくらいか
>>156をすらすら読み、161みたいなのを頻繁に使うプログラマにはなりたくない
161はtypedefしないらしいし…
200:デフォルトの名無しさん
09/03/08 04:01:48
>>199
もし>>156をtypedefを使って分りやすくしてくれと言われたらどのように
typedefする?有る意味typedefの練習になるんじゃないか
201:デフォルトの名無しさん
09/03/08 04:15:48
それらが何を意味するものとして使われているのか、それに基づいてtypedefすべきと思う。
例えばchar*をstringとしてtypedefしたり(C++ならstd::stringがあるけど)、単純に置き換えるんじゃなくて
意味が分かるようにしなければ、結局分かりやすくはならないんじゃないか。
202:デフォルトの名無しさん
09/03/08 04:37:26
>>201
普通はそうだが、練習なら良いんじゃないか
>>156を見てこれならどうtypedefしたらいいんだろと疑問に思っただけ
>>156は宣言構文解釈による頭の体操って感じかな
頭の体操なら現実では使わないものでも良いんじゃないか
203:デフォルトの名無しさん
09/03/08 04:42:15
>>201
つまり、windows.hを批判してるってことですね。
204:デフォルトの名無しさん
09/03/08 04:48:18
windows.h のそれは、int32_tとかwchar_tとかが無かった時代の産物としては存在意義があると思う。
205:202
09/03/08 04:55:42
>>203
本人のポリシーだから良いんじゃないの
ま、windowする時は、気に入らんでもwindowsの流儀に従ったほうが無難だろな
206:デフォルトの名無しさん
09/03/08 05:54:53
windows.hの場合は囲い込んで、移植させにくくしただけだろ。
gcc+Qtでなんも困らん。
207:デフォルトの名無しさん
09/03/08 09:50:09
俺もstdio.hで十分だわ
208:デフォルトの名無しさん
09/03/08 10:16:15
っつか、この世は俺1人で十分だ
209:デフォルトの名無しさん
09/03/08 10:29:48
>>208
さっさとジュース買って来い
210:デフォルトの名無しさん
09/03/08 11:34:40
つかMSはさっさとstdint.h対応しろと。C99決まってから10年なのに
何をしているのかと。
211:デフォルトの名無しさん
09/03/08 20:47:58
#include <iostream>
using namespace std;
#include <math.h>
#include <stdio.h>
void ChangeToShohwa(int x)
{
if(1926 < x && x <1989)
x -=1925;
else
x = 0;
}
int main()
{
int x;
ChangeToShohwa(x);
if
printf("昭和%d年ですよ",x);
else
cout<<"昭和じゃないです"<<endl;
}
: error C2061: 構文エラー : 識別子 'printf'
: error C2181: else 文が if と一致しません。
212:デフォルトの名無しさん
09/03/08 20:51:56
教えてください。
お師匠
213:デフォルトの名無しさん
09/03/08 21:03:52
>>212
それコンパイラか頭のバグ
コンパイラ何? 頭は何?
214:デフォルトの名無しさん
09/03/08 21:06:59
>>211
ifだけじゃだめだろ
この場合if(x)かな?
他もひどすぎて、思ったとおりには実行されないと思うが
215:デフォルトの名無しさん
09/03/08 21:08:52
>>213
VIsual C++ 2008
頭・・?
216:デフォルトの名無しさん
09/03/08 21:10:55
>>214
これのどこがひどいと言うんだ・・・!!
シンプルで無駄のないプログラムじゃないか!!
217:デフォルトの名無しさん
09/03/08 21:11:45
>>216
バカは失せろ
218:デフォルトの名無しさん
09/03/08 21:14:25
>>217
すいませんでした
出直してきます
219:デフォルトの名無しさん
09/03/08 21:18:15
>>215 じゃ、頭のバグだな。
int x = 1945;
void ChangeToShohwa(int& x)
if(x)
これで良いだろ
220:デフォルトの名無しさん
09/03/08 21:19:12
>>211から星の煌めきを感じる
221:デフォルトの名無しさん
09/03/08 21:20:14
ていうか、xを改変する意味が分からない
int返せよ
222:デフォルトの名無しさん
09/03/08 21:23:40
>>221
そう言うならおまえがそれやれよ
223:デフォルトの名無しさん
09/03/08 21:36:00
ワンパクでもいいタクマシク育ってほしい。
224:デフォルトの名無しさん
09/03/08 21:50:09
これ、ロベールからの引用じゃろ?
まともに動かなくていいのよ。この後、参照の話が出てきて
まともに動かない理由とちゃんと修正されたバージョンのコードが記載されてるから。
しかし、ロベールは2000年の記事じゃから古いぞ。
使っているコンパイラもVC++6で著者自身が
環境依存はいやだと書いているくらいだし。
225:デフォルトの名無しさん
09/03/08 21:58:42
>>221
Googleのプンソで採用されているコーディング標準では
参照パラメータはすべてconstにせよってあった。
まぁ、それはさすがに行き過ぎだと思うけど
関数の可読性という点ではなるほどとも思う。
226:デフォルトの名無しさん
09/03/08 22:31:38
プンソって何?と一瞬思ったがオプソか。
227:デフォルトの名無しさん
09/03/08 22:58:21
>>221
>>145
228:デフォルトの名無しさん
09/03/08 23:02:07
西暦と昭和を同じ変数で扱うのが気持ち悪いってことじゃねーの?
229:デフォルトの名無しさん
09/03/08 23:22:01
西暦形式で格納されてる変数がいつのまにか(ではないけど)
和暦形式に代わってるとか死ねとおもうね
230:デフォルトの名無しさん
09/03/09 00:05:10
年クラスを作って、get西暦とget和暦メソッドを用意するべきでしょうか。
231:デフォルトの名無しさん
09/03/09 00:07:37
時刻クラスを基本クラスとして、西暦クラスと和暦クラスを派生させるんだろ。
232:デフォルトの名無しさん
09/03/09 00:12:49
出来事 vector に年月変換機能を備えたイテレータが美しいと思うよ。
233:デフォルトの名無しさん
09/03/09 01:07:34
日単位で持っておいて、月以上に変換するときは暦クラス通すようにすれば。
234:デフォルトの名無しさん
09/03/09 03:14:07
「和暦表示じゃないと、絶対困る!」
って言われること、けっこう良くあるけど、
天皇が暗殺されたら、どうするのかね?
235:デフォルトの名無しさん
09/03/09 03:48:14
簡単に追加修正できるようにSQLite、CSV、XMLででも持っとけよ。
そんなの昭和64年からの常識だろ。
236:デフォルトの名無しさん
09/03/09 08:07:31
天皇が暗殺されても今までの和暦がなくなる訳じゃないしなぁ。
237:デフォルトの名無しさん
09/03/09 08:37:29
西暦だって、新宗教に宗旨替えして新西暦0年にリセットするかもしれないし、
イスラムが再び勃興してイスラム暦に切り替わるかもしれない。
UTCみたいな無色透明な基準年が必要だな。
238:デフォルトの名無しさん
09/03/09 09:31:35
UTCのどこが無色透明だって?
基準だったら皇紀でもいいわけだろ。
239:デフォルトの名無しさん
09/03/09 09:50:40
いやぁおまいらの講義はみてて勉強になります。
小生も美しいコード書けるようになりたいですハイ。
弟子入りさせて貰えませんか?
240:デフォルトの名無しさん
09/03/09 09:55:34
地球の誕生年を元年にすればいいじゃん。
俺が小学生の頃、46億年前に地球ができたって聞いたから今は46億18年だな。
241:デフォルトの名無しさん
09/03/09 09:59:49
地球の紀元は今後変動する可能性があるので基準にできません。
242:デフォルトの名無しさん
09/03/09 10:04:54
じゃあ宇宙で。
ビッグバン歴
243:デフォルトの名無しさん
09/03/09 10:07:09
同じ理由で却下
244:デフォルトの名無しさん
09/03/09 10:44:56
それにしても、1926年は殆ど昭和じゃないんだがなぁ。
同じように、1989年も殆ど昭和じゃないし。
245:デフォルトの名無しさん
09/03/09 10:51:46
VCでコンソールアプリを作成し起動します。その後外部のPGから、
SendKeysやPostmessage,標準入力などでキー送信を送ろうとしているのですが、
SendKeysの場合:通常のキーは受け付けるがファンクションキーは駄目
Postmessage、標準入力の場合:何も受け取らない
となります。
ファンクションキーを送信したいのですがどうすればいいのでしょうか?
アドバイスお願いいたします。
・DOSプロンプトだと標準入力はちゃんと受け付けるが、コンソールアプリは受け付けない
->DOSプロンプトとコンソールアプリの仕組みは別物?
246:デフォルトの名無しさん
09/03/09 11:31:49
送れないこともないだろ?
今どうやってんの、C++/CLIなのか?
247:デフォルトの名無しさん
09/03/09 11:35:00
>>245
PostMessageやSendMessageがダメなのは知ってる。
他は知らない。
248:デフォルトの名無しさん
09/03/09 11:54:27
>>246
> 送れないこともないだろ?
> 今どうやってんの、C++/CLIなのか?
VC++6.0MFCコンソールアプリ で作りました。送る方はVB.NET2005です。
PostMessageはWM_CLOSEは送れたようです。その他は
SendKes.Send(chr(0))
SendKes.Send(chr(62))
とするとchr(62)は送れるんですが、chr(0)は無視されますっていうか
SendKes.Send(chr(0)) っていうのはVBでは無謀なのかな、でもvbNullStringでも
駄目でした。
それに標準入力で送れないのはなぜなんでしょう?(DOSプロンプトへはおくれるのに)
249:デフォルトの名無しさん
09/03/09 11:54:41
[1] 授業単元:趣味
[2] 問題文(含コード&リンク):
URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] OS: XP
[3.2] コンパイラ名とバージョン: MSC ver.5.1
[3.3] 言語:C
パスワードの入出力プログラムをつくりたい。
PASSは4文字とし、1文字入力される毎に'*'を1個表示し、
4文字入力後パスワードをチェック。
PASSが正しければ「システムの使用を許可します」と表示し、
間違っていれば3回再入力させて、3回を超えたらエラーを表示。
(パスワードは予めプログラム内部で定義されているという前提で)
こういうプログラムを書いてみたのですが、main以下「*password=1994」を
正解として宣言し、else文の部分でc[i]と*passwordを認識させてprintfで
c[i]を表示させたいんですけれどもうまくいきません。
何故でしょう?
何となく原因はわかるのですが、漠然としていて手が出せないんです。
上のコードをみて、名人方のアドバイスをお聞かせ願いたい。
250:デフォルトの名無しさん
09/03/09 12:00:25
>>245
SendInputはどう?
251:デフォルトの名無しさん
09/03/09 12:16:23
>>249
何をやりたいのかの説明がおかしいし、プログラムに至っては支離滅裂だ。
c[i]に文字を入れているのなら、1994なんて数値を入れちゃダメだろ。
初歩からやり直すことをお勧め。
252:デフォルトの名無しさん
09/03/09 12:21:31
>>240
位置エネルギーと一緒で無限遠を元年にすればいい
253:デフォルトの名無しさん
09/03/09 12:31:54
>>249 メモ帳べた書きでコンパイルしてない。好きにしろ。
#include <stdio.h>
#include <conio.h>
int main(){
const char* password = "1994"; int count = 0;
do{
int i; char input_password[4];
printf("パスワードを入力して下さい。(4文字): \n>");
for(i = 0; i < 4; ++i){input_password[i] = getch(); putchar('*');}
}while(!strcmp(password, input_password) && count++ < 3);
if(count >= 3){
puts("仏の顔も三度まで!\n正式なpasswordがないとシステムは使用できません!");
}else{
printf("password = %s\nシステムの使用を許可します。\n", password);
}
}
254: ◆XD9CNUCqag
09/03/09 12:33:47
>>249です。
>>251氏
なるほど、確かにおっしゃるとおりだと思います。
説明不足で申し訳なく。
このプログラムは'1994'というPASSを定義して、c[i]に入力させてそのPASSを
入力させたら正解、それ以外なら間違いで再入力させるといった感じでつくりたかったんです。
そして、私はCを学び初めてほんの1ヶ月くらいの素人でありまして
現在進行形で勉強中の身であります。
初歩から学んでいるつもりなのですが、何分覚えることが沢山すぎて手探りな状況な次第。
もし、よければ勉強するポイントなど上げて貰えると助かるのですがお願いできますでしょうか?
255:デフォルトの名無しさん
09/03/09 12:35:41
伝統的なポイントな。
1) 初心者です、を免罪符にした発言を慎む。
2) 一歩目から他人に頼るな。努力の跡すら見えないのは相手にされない。
256:デフォルトの名無しさん
09/03/09 12:39:56
小心者です。
インポ目で他人を頼って(ry
257:デフォルトの名無しさん
09/03/09 12:40:16
>>254
一ヶ月もあれば、パスワード入力くらい書けるようになる。
それができていないのは、初歩からきちんと自分のものにしていないのではないだろうか。
まさかとは思うが、本を読んで理解した気になっただけで書けるようになるとは思っていないだろうな。
まぁ、先ずはもっと単純な文字入力からおさらいしてみようかw
258:デフォルトの名無しさん
09/03/09 12:45:28
宿題スレに張り付いて課題こなしてたら力量うp。
259:デフォルトの名無しさん
09/03/09 12:56:16
>>253
メモ帳だとその程度か
input_passwordが0終端してないぞ
260:デフォルトの名無しさん
09/03/09 13:00:26
宿題スレは単にバカな質問を受け流すためのハコだからな・・・
261: ◆XD9CNUCqag
09/03/09 13:15:40
>>255氏
肝に銘じます。
>>257氏
言われてみれば、本を読んでたら出来るようになるとは少なからず思っていました。
でも、実際やってみて全然出来ないどころか、覚えることすら出来ていないことに
自己嫌悪に陥っています。
単純な文字入力から勉強し直してみます。
>>258氏
宿題スレの名人方は、添削するより、ひたすら課題を自分でこなしていく
のが好ましいようなので、張り付いてだけじゃ私の力量うpには繋がりませんよね・・・。
参考にはなっていますけども。
262:デフォルトの名無しさん
09/03/09 13:25:08
>>261
本を読むだけでも相当な勉強になる。
…ただしただ読み流すだけではダメで、理解しながら読まないと、ただ字面を追っているだけになる。。
そして少しでも疑問に思ったら先へ進まないでコーディングしてみる。
この辺は中高生の数学と共通する物がある。
ってな感じが俺の認識。
263:デフォルトの名無しさん
09/03/09 13:25:40
実はここまで全て俺の自演
264:デフォルトの名無しさん
09/03/09 13:27:35
>>261
自分で回答するんだよw
265:デフォルトの名無しさん
09/03/09 13:29:31
>>261
自分でも答えを考えるんだよ。
266: ◆XD9CNUCqag
09/03/09 14:34:43
>>262氏
>…ただしただ読み流すだけではダメで、理解しながら読まないと、
ただ字面を追っているだけになる。
はい、どうやら私は読んで理解したつもりだっただけで
字面を追っていることをこれまで繰り返していただけのようです。
「早くCの知識を身につけたい」という気持ちだけが先走っていたといいますか。
勉強しても早々簡単にはみにつかないものなのにおかしいですね。
>>264氏
もし自分で回答なんかしちゃったりしたらら駄目だしされまくりで
精神的に辛すぎるような気もしますが・・・
267:デフォルトの名無しさん
09/03/09 15:24:29
>>266
ダメだしされて何が悪い。直せばいいじゃないか。
ダメだしも指摘もなければずっと悪いままだぞ。
268:デフォルトの名無しさん
09/03/09 15:43:56
昼間に2ちゃんねるに書き込んでる人間なんてスキルも無いロクでもない人間なんだから
講釈なんて聞いても無駄だよ。
自分ができない夢を語っているだけなんだから。
269: ◆XD9CNUCqag
09/03/09 16:46:35
困りました・・・
文字入力の基礎からやり直そうと思って勉強し直してるんですけども
いつまでたっても目的のパスワードプログラムが出来そうもない・・・
何となく問題の原因はわかりかけてるんだけど、漠然としてて・・・
そっから全然前に進まない
ほんと使えないなぁ・・・私って・・・OTL
>>267氏
確かにその通りかもしれません
すぐには無理でしょうが、いずれ力量うpしたら実践してみたいと思います。
270:デフォルトの名無しさん
09/03/09 17:16:13
文字コード、文字列、数値
271:デフォルトの名無しさん
09/03/09 17:50:37
ゆっくりいこう
272:デフォルトの名無しさん
09/03/10 01:04:54
あるバージョンのgccでは、複数のスタティックライブラリをリンクするとき
liba.aがlibb.aの関数を使用し、libb.aがlibc.aの関数を使用しているとき
gcc -o prog main.o liba.a libb.a libc.a の順番に書かないとundefinedなんとかというエラーが出る。
もしも、liba.aとlibb.aの双方が互いの関数を使用している場合、
これらのスタティックライブラリを上記のgccでリンクするにはどうすればよいのか。
273:デフォルトの名無しさん
09/03/10 02:46:29
gcc -o prog main.o liba.a libb.a libc.a liba.a
274:デフォルトの名無しさん
09/03/10 02:49:11
>>272
そうならないようにモジュールの配置を見直す。
275:デフォルトの名無しさん
09/03/10 07:01:54
>>272
そういうのを循環参照と言って、良くない設計の兆し。
276:デフォルトの名無しさん
09/03/10 08:38:45
gccって、あるバージョンとか噂とか、不確かではっきりしない事を
よく書かれてるな。
277:デフォルトの名無しさん
09/03/10 12:32:55
>>272
昔のHP/UXにもそういうの(順序を人間が決めないといけない)があって
lorder | tsort で依存関係をトポロジカルソートして makefile に食わせた覚えが。
278: ◆XD9CNUCqag
09/03/10 13:59:34
/* getchar.c */
# include <stdio.h>
int c, cc;
main(){
printf ("getcharの実験 Ctrl + Z で終了\n");
while ((c=getchar())!=-1) {putchar('*'); putchar(c);}
printf ("getchの実験 スペースキーで終了\n");
while ((cc=getch())!=32) {putchar('*'); putchar(cc);}
}
このプログラムの「while ((c=getchar())!=-1)」の「!=-1」って
「Ctrl + Z」をあらわしてるんですかね?
それと、「while ((cc=getch())!=32)」の「!=32」ってのは
「スペースキー入力」を意味してるんでしょうか?
いま、入出力を勉強中なのですが、これがよくわからなくて。
教えて下さい、お願いします。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5385日前に更新/124 KB
担当:undef