>>2 それをその速さで貼れるってことは
お前それをコピってずっと待機してたんだろ?
リロードしまくって。誰かスレ立てるの待って。
まじきめーな。氏ねよハゲ。z
i=i++; は未定義だけど
i=++i; も未定義なの?
はい
>>3 二つの副作用完了点の間で同じ値(この場合i)を二度変更しようとする試みは全て未定義とされている
>>6 あんたは、一つの法律で禁止されていないことは全て合法だとでも言い出すのか?
授業で幾つかプログラムを作成しているときにa++;とa=a+1;があったのですが、両方同じ意味ですよね?
使うときはどちらが便利なのでしょうか?
++a;
>>8 ループなんかでカウンタとして使ってるなら++を使え。
あとで足す数が変わる可能性があるなら+を使え。
+=ですね。a=a+1はぜんぜんダメ。
わかればどれどもいいよw
いや、さすがにa=a+1はないだろ。
15 :
13:2008/09/15(月) 20:01:32
a=a+1
書き方をするやつにあれこれCの記述を伝授するのが面倒。
動くんだしいいよ。
+=とかおしてて「なんでなんで?」で時間食うのがもったいない。
16 :
デフォルトの名無しさん:2008/09/15(月) 20:01:50
どれでもいい。
まったく同感。どれでもいい。
文法に違反していない以上、どれを使うかは習慣の問題だね
仮に識別子の数が問題だとしても、算出元と変更先を両方同じものに書き換えるときに便利なのか、
片方だけないしそれぞれ別のものに書き換えるとき便利なのかの違いでしかない
まあ俺は++使うけど
まあ、でも、a=a+1はダメだな。
++か+=かってのは、状況にもよるけど。
C++で演算子のオーバーロードも考えてコードを組むとなるとまた厄介な話になる。
21 :
デフォルトの名無しさん:2008/09/15(月) 22:33:25
C++ くさい C も、Verilog-HDL くさい C も、きんもー
文脈による。
確定的にaに1加える場所なら++を使う。
aに何か加えることが確定的で現在その値が1なら+=を使う。
単に現在aの新しい値が元のaから算出されるだけなら= +を使う。
C++ とか言うけど、オーバーロード的に考えて ++C の方が効率いい場合が多いんだよな。
イテレータとか。
a=a+1 はなぜ駄目なのでしょうか?
気分的にです
オーバーロードされていた際にコスト高だな。→ a=a+1
スレ違いだし。
>>24 より良い書き方とされるa += 1、さらに良い書き方とされるa++と++aが存在するから。
一目見てaに1を足してるって分からないから
まぁ同じ意味だし、好みの問題とは言うけど、読みやすさとか考えるとやっぱり a+=1, a++, ++a の方がいいと思う
タイプ数的に++aが楽でいい
それくらいの違いしか無い
a=a+a, a+= 1, a++の好みなんかよりもっと重要なものがある。
セミコロンか。
34 :
24:2008/09/16(火) 01:29:45
たくさんレスいただきありがとうございます。
ソースレベルでのわかりやすさ・なじみやすさ・効率が
主な理由だと理解しました。
>>26 さんの回答は、実行ファイルになった段階でも
場合によっては違いが出てくるとおっしゃっているようにも思えますが、
正直いまの私には十分には理解しきれませんでした。
おまえらほんとどうでもいい事だとスレ伸びるよな
26さんの回答はC言語の範囲じゃないから気にするな
> a=a+1
ソースコードに何回も同じことが重複して登場するのは悪
だから a+=1 か a++ にしる!
memcpyはどうしてあんなに速いの?
>>38 そう作られているから。memcpy()と言う関数の振りをしているが、
その実体がCの関数かどうかは実装依存。
逆に言えば、コンパイラベンダが鎬を削るポイントでもある。
>>38 CPUは一発でデータをブロック転送できるから。
古いCPUだとブロック転送するよりスタックにいれられるだけいれて並べてくほうが速かったりすることもあるけど、
いまどきブロック転送の方が速い。
>>24 1) lpMetSect->lpSharedInfo->lAvailableCount--;
2) lpMetSect->lpSharedInfo->lAvailableCount -= 1;
3) lpMetSect->lpSharedInfo->lAvailableCount = lpMetSect->lpSharedInfo->lAvailableCount - 1;
(3)は左辺と右辺を見比べて、同じ変数かどうか確認しなきゃならないだろ。
>>39 実装依存って言えばそうかもしれんけど、それ言ったら、標準関数全部そうだろ。
>>41 そんなもん間違うようなやつはそもそも1個でも間違うよ
私が今作っている関数popは通常intを返すが、返すべき値が見つからない場合NULLを返します
しかし私の使っているコンパイラではNULL == 0は真になるので
popの返り値がNULLであるか、0であるかを判別することができません
エラーチェックのために新たに変数を設ける以外の解決法があったらぜひご教示願います
それにしてもなぜこのコンパイラにはNULL == 0が真になるなどという奇怪な仕様が採用されたのでしょうか?
まったくもって不愉快で、理解に苦しむ仕様です
引数の一つを書き換える関数にして
戻り値のほうはリターンコードだけにすれば?
>>45 NULLはポインタが無効である(いかなるオブジェクトも指示していない)ことを表すために使うものだから、
そもそもintなどポインタ型と併用することを考慮されていない。コンパイルエラーになる処理系も存在する。
一般的には、
>>46のいうように引数で返すか、
あるいは本来の戻り値と可否の2つを構造体でまとめるなどという方法を取るしかない。
よその言語では、こういう用途にもNULL(あるいはそれに相当するもの)が使えるものあるんだけどね。
>>45 NULL == 0が偽になったら、それこそ大変
49 :
デフォルトの名無しさん:2008/09/17(水) 00:24:43
可変個引数の引数リストってメモリ上にならんではいってるの?
ポインタで移動できるみたいだから、そう思うんだけど。
void push(int val);
int pop(void);
のほうが体裁がいいんだろうな。
それだったら
int isempty(void); /* 0以外: スタックが空 0:スタックが空でない */
を作ってそれでチェックするというのもあり。
if (!isempty()) {
val = pop();
}
>>49 そうでないといけないという決まりはないが、そうなっていることが多い。
というかそういうやつでは、可変個でないやつも同じように置かれていて、
その配置を応用しているという作りになっている。
あるいはintより大きな整数を返す関数にして、エラー値としてintに収まらない数を返す
>>53 「charより大きな整数を返す関数にして、エラー値としてcharに収まらない数を返す」
と同じ。
charはint幅でやりとりするけど、それと一緒にしてはいかんよ
>>41 4) --lpMetSect->lpSharedInfo->lAvailableCount;
これも追加しておいてくれお
58 :
デフォルトの名無しさん:2008/09/17(水) 02:19:06
lpMetSect->lpSharedInfo->lAvailableCount += -1;
>>50 スタックを構造体で定義して、push, pop, isemptyの引数として渡したいな。
同時に複数のスタックが使えるようになるし。
そこまでいくと、C++でやれって感じになるが。
すみません、どうしても解らなくて><
#include <stdio.h>
int main(void)
{
int c;
while(c = (getchar() != EOF)) {
printf("%d", c);
}
printf("%d", c);
}
このプログラムで、EOF以外を打つと「11」と、「1」二回繰り返されているようなんですが、
なんで繰り替えすのですかね?
c = (getchar() != EOF)←のような条件自体初めての形ですので動きが解らなくて><
改行文字だな
while(c = (getchar() != EOF)) {
printf("ループ内 %d", c);
}
printf("ループ外 %d", c);
}
ごめん違うわ
cに名に入れたか考えてみろ
>>63 いや、ループは抜け出してないから、ループ内のprinftが繰り返されてるみたいなんですよ。
>>64 getcharでaを入力したとしたら、cには1が入りますよね?
ってことは1を一回表示したら、またgetcharで入力待ちになると思うんですが……二回繰り返した後に入力待ちになってるんです><
自分で書いた汚いCコードを読み込んで綺麗に整形して出力してくれるアプリってないの?
インデント+α程度の整形ツールならあるけど
>>62 >>65 なるほど、やっと理解できました!
でもgetcharは一文字入力なんですよね?
なんというか根本が解ってない感じだw
んー、まずaでループに入り1を出力、次に改行文字でループに入り1を出力……ってことですかね?
まぁ、そんなとこだね。
「次に改行文字でループに入り」というよりは、
「次に得るのが改行文字なのでループから脱出せずに」だけれど。
入力が行単位でバッファリングされてるとわかりにくいかも
打った文字はEnterを打つまで入力されない
Enterを打つと打った文字+改行が入力されて、getcharでそれを1文字ずつ取り出せる
'a'と'\n'の値が両方1ってどんな処理系だよ
畜生見間違えた
そこに括弧ついてんのかよ!
……カッコ悪い
>>8 微妙に意味がちがう。
a = 1;
b = ++a;
b = a++;
では結果がちがう。
func ( a++, a+1, ++a)
のとき、funcの引数がどんなになるか挙動不明。
>>79 単体で使った場合を聞いてたのにいまさらなにをw
しかも後半は引数がどうなるか不明つーより未定義動作じゃねーか
バイナリファイルを直接数字に変換する方法はどうすればいいのでしょうか?
rubyではunpack("s*")を使うのはしってるんですけど。
>>81 rubyのunpackは変換が目的だから、Cの場合はその必要が無い。
例えば、(今ぐぐって見つけた)リファレンスマニュアルの例だとこうなる。
unsigned char foo[] = {1, 2, 0376, 0375};
unsigned short * bar = (unsigned short *) foo;
printf("%u, %u\n", bar[0], bar[1]);
>>83 != EOF が偽になって getline が 0 を返すから > 0 が偽になって main を抜けるのでは?
Cでは0xffのように16進数を使用できますが、2進数は使えますか?
あたかも2進数記述しているようにみえるマクロならある
89 :
デフォルトの名無しさん:2008/09/18(木) 19:09:38
インクルードについて教えてください。
あるサンプルソースコードを入手して、
~~.slnを実行して、デバッグしたら動きました。
ファイル入出力をしようと思って、
メイン関数が書いてある.cファイルで#include <iostream>とすると、
1>c:\program files\microsoft visual studio 8\vc\include\cstdio(35) : error C2059: 構文エラー : ':'
1>c:\program files\microsoft visual studio 8\vc\include\cstdio(36) : error C2143: 構文エラー : '{' が ':' の前にありません。
が大量に出てきてしまいました。
インクルードしただけです。
何がいけなかったのでしょうか?
90 :
デフォルトの名無しさん:2008/09/18(木) 19:11:44
すみません、上のものです。
C++なので、スレ違いでした。
去ります。すみません。
.cファイルで#include <iostream>
そりゃダメだろ
C++でコンパイルするオプション付けりゃいいんじゃん。
93 :
デフォルトの名無しさん:2008/09/19(金) 16:34:15
C言語のコンパイラで質問があります。
WindowsXPで、BCC DevelopperとBorland C++ Compiler 5.5.1を使用しています。
プロジェクトを一つ作り、そのプロジェクト内で複数のC言語ファイルを作成しているのですが、
一番最初に作成したC言語のファイルしか、コンパイル、メイク、実行ができません。
どうすれば他のC言語のファイルをコンパイル、メイク、実行する事が出来るのでしょうか?
bcc32 main.c foo.c bar.c
それを言うならメイクじゃなくてリンクでは
それはC言語の問題でもコンパイラの問題でもなくて、
BCC Developerのプロジェクト管理機能の使い方に関する問題だよな?
質問です。
…
int a
if(a)
…
この場合のifの条件aとはどういう意味ですか?
if(a!=0)
とまったく同じ意味
えー
えーといわれても
何が不満なんだ?
101 :
97:2008/09/19(金) 17:16:27
>>98 ありがとうございました。
>>99は僕じゃないですが、ダジャレですかね?w
スレが凍りついた
ローグってCで書かれてるの?
そうか、じゃあ俺もCで書いてみようかな
106 :
デフォルトの名無しさん:2008/09/20(土) 02:58:12
int i;
char buf="cjd";
for(i=0;i<buf[i];i++);
上記for文の境界条件はマイナーですか?
>>106 文字列の長さだけまわしてるつもりなら、それはおかしいだろ。
(・∀・)ニヤニヤ
仮に
char *buf = "cjd";
だったしても、そんな書き方するヤツはプログラムやめたほうがいい。
Windowsの場合
#ifdef WIN32
#endif
で処理を分岐するんですが
MACは、何を指定すればいいでしょうか?
MACの場合に#defineされるシンボル
決まってなければ、自由に
知らないなら黙っててください
邪魔です
禿同
>>112みたいな無知ほど書き込みたがる
知らないならすっこんでろっつーの
知らないならすっこんでろつうか知っている人いないと思う
そんなもの決め事だから
cc -D MACOS 。。。。。
#ifdef MACOS
#endif
>>110 K&R、つまりC言語を設計した人にC言語を辞めろと申すか?
120 :
デフォルトの名無しさん:2008/09/20(土) 10:09:36
俺には i<buf[i] の意味がわからん。
比較することにどんな意味があるんだ?
122 :
デフォルトの名無しさん:2008/09/20(土) 10:19:19
bufに入っている文字の
(使用中の処理系での)コードとそれが何文字目かということに、
何らかの関係があるんだよ。
printf("foo")
は関数で末尾にセミコロンが付くと正確には文になるのですか?
そういった場合printf文というのが適切なのですか?
>>124 その通り
正確には単文
Pascalはセミコロンが文と文の区切りに使われるが
C言語はセミコロンは文の終了を表す
126 :
デフォルトの名無しさん:2008/09/20(土) 15:46:13
×単文
○式文
pascal 厨が下手に口を出すからボロが出る
文と複合文はあっても単文はない
>>126 馬鹿ですか?
{}で囲まれたのが複文
そうでないのが単文
128 :
デフォルトの名無しさん:2008/09/20(土) 16:00:49
つっこみをよく読めアフォ
126==128
お前がアフォ
(・∀・)クスクス
131 :
デフォルトの名無しさん:2008/09/20(土) 16:20:47
もう一度言う、「単」文という用語はCにはない
C言語 単文 複文 の検索結果 約 619 件中 1 - 30 件目 (0.26 秒)
C言語 式文 複合文 の検索結果 約 162 件中 1 - 30 件目 (0.32 秒)
お前らくだらん事でもめないでISO/IEC9899:1999もしくは
JIS X3010:2003の何ページのどこここにあります、ってやってくれ
無駄にスレを伸ばすな
134 :
デフォルトの名無しさん:2008/09/20(土) 16:39:25
>>132 おまえの情報源はそんなものか
お里が知れるな
(・∀・)クスクス
>>134 お前も煽ってばかりいないで
>>133のアドバイスのように
ちゃんと答えてやれ
答えられないと証拠も無いのに、と言われるだけだぞ
137 :
デフォルトの名無しさん:2008/09/20(土) 16:52:58
>>136==125
俺だって、ちゃんと「式文」と教えただろうが無礼者め
>>137 それは証拠にならない
規格書のどこに書いてあるか言ってみろ
その答えがわかったら、バグが減るの?
話を逸らすな馬鹿者
(・∀・)クスクス
a = 10, b = 10 , c++;
ってあったら文はa = 10, b = 10 , c++でおk?
式≠文
式文って式+セミコロンのこと?
規格書にも書いてない造語を勝手に作って人を欺いている
バカがいると聞いて来ますた
↑ずっと見てたくせに(プ
メモリリークって自プログラムの範囲外まで影響が及ぶことはありますか?
メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?
例えば、以下のようにしても勝手に開放されているように思えるのですが、
これはOSが面倒みてくれている、という解釈で正しいですか?
char *c;
c = (char *)malloc(1000000);
return 0; //開放せずに終了
char *c;
c = (char *)malloc(1000000);
c[1000000] = 'a'; //ここで異常終了
149 :
デフォルトの名無しさん:2008/09/20(土) 17:15:32
>>147 大丈夫OSが何とかしてくれる
と思ってて問題ないよ
>メモリリークって自プログラムの範囲外まで影響が及ぶことはありますか?
はい
>メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
>確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?
いいえ
>これはOSが面倒みてくれている、という解釈で正しいですか?
OSによる
おいおいmutex持ったまま強制終了したらOSは面倒見てくれないぞ
>メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
>確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?
はい
このスレは池沼の集まりか
そう、お前がその筆頭。
winとかunix系とかDOSとか、そのあたりのOSはfree()し忘れても、プロセスが終了するとメモリは開放される。
156 :
デフォルトの名無しさん:2008/09/20(土) 17:45:07
INT 21H, AH=31H
まとめると
>>147 にある状況はwindows、unix系ではOSが何とかしてくれる
でもプログラムのやりようによっては解放されないこともある(mutexとかなんとかで)
ってことで大丈夫でしょうか
>>148-152,155
ありがとうございます。
常駐するようなもの以外は、それほど過敏になることはないんですかね。
>>151 そいつはメモリリークというより、リソースリークじゃね?
閑話休題
mallocだと大体のPC環境だと後始末してくれる処理系になってるけど、
共有メモリとかでリークすると、プロセスが終了しても残ったりすることもある。
160 :
デフォルトの名無しさん:2008/09/20(土) 18:32:09
>>138 Cに規格書はない
もしかして規格票って言いたかったのか?
↑馬鹿
JISでは規格票が正式名称だが、ISOやANSIのものは規格書と呼んでなんら問題ない。
163 :
デフォルトの名無しさん:2008/09/20(土) 19:04:02
ISO や ANSI のどこに「規格書」って書いてあるんだよ? 確か英語だったはずだが・・・
>>121 某エディタのソースコードにあって、
文字列か文字の幅を返す関数にそのfor文が使われていました。
>>163 英語のものを日本語で呼んではいけないのか。
168 :
デフォルトの名無しさん:2008/09/20(土) 19:26:05
>>167 非標準の邦訳が通じなければ説明責任はそれを言った者にある
ただし別にわかってやれたからって、こちらに利益はないので説明がしたければどうぞご勝手に
169 :
デフォルトの名無しさん:2008/09/20(土) 19:27:28
>>166 ちなみに
DWORD CMyEdit::GetTextWidth(LPCWSTR pstr)
{
DWORD i,n;
for(i=n=0;i<pstr[i];i++){
if(IsMB(pstr + i))n+=2;
else n++;
}
return n;
}
以上、馬鹿の負け惜しみでした。
171 :
デフォルトの名無しさん:2008/09/20(土) 19:31:09
「単」純バカのな
>>169 「文字列か文字の幅を返す関数」ではないな
>>169 i<pstr[i] じゃなくて pstr[i] になってない?
>>173 なってないです。
MyEditというソフトウェアのソースコードMyEditUtil.cppの493行目を見ればわかります。
ライセンスがとてつもない矛盾を呈してる件
エディタをダウソしてreadmeを見たら、MyEdit.chm の『使用許諾契約書』を読めって書いてあったけど、MyEdit.chmが入ってないな。
フルパッケージのほうもダウソしてみたら、やっぱりMyEdit.chm の『使用許諾契約書』を読めって書いてあるけど、使用許諾のページが開けないじゃん。
?
>>179 アーカイブ壊れてるんじゃね?
myedit_v116_full.zip md5 c514e4e1d2680235ab7c61bfd8aed4c0
MyEdit.chm md5 1b63a35be248d1921acd47eb06d50ef1
>>181 MyEdit.chmを入れ忘れてるだけじゃね?
>>169 grepしたら、そのメソッド、どこからも呼ばれてないみたいだから、やっぱバグだろな。
そろそろスレ違いな気もしてきたが。
>>183 エディタのexeの方のソースってどっかにあった?
dllの方だけだと、多分クラスライブラリのインターフェースな関数だと思うから、
grepしても引っかからないのは当たり前っぽいんだけど。
あのエディタでGetTextWidth()が使われてないかはどうにも。
が、まぁ、バグっぽいってのは同意だがねー。
MyMemo.exeが本体みたい。
>>184 本体のソースは入ってなかったのか。
そんなまじめに見てなかったよ。
Cでtemplate的なものをなんとか実装できませんかね?
>>187 マクロ
CSTL あたりを参考にどうぞ
189 :
デフォルトの名無しさん:2008/09/21(日) 00:30:45
すいません、初歩的な質問なのですが・・・
割り算で
7÷32 の余りは 0 なんですか?
てっきり、余りは7だと思ってたんですが・・・
7 / 32
7 % 32
商が0で余りが7
>>189 数学の質問(算数か?)は専門スレへ
C言語の話なら割り算とあまりの計算のそれぞれで使う記号は何を使ってます?
193 :
デフォルトの名無しさん:2008/09/21(日) 00:50:01
C言語です。
商なら7/32、余りなら7%32 でプログラム組んでみたのですが…
プログラム
printf("i=%dのとき i/32=%d…%d 余り/8=%d \n",i,i/32,i%32,(i%32)/8);
これを出力すると
i=0のとき i/32=0…0 余り/8=0
i=1のとき i/32=0…1 余り/8=0
i=2のとき i/32=0…2 余り/8=0
i=3のとき i/32=0…3 余り/8=0
i=4のとき i/32=0…4 余り/8=0
i=5のとき i/32=0…5 余り/8=0
i=6のとき i/32=0…6 余り/8=0
i=7のとき i/32=0…7 余り/8=0
i=8のとき i/32=0…8 余り/8=1
i=9のとき i/32=0…9 余り/8=1
i=10のとき i/32=0…10 余り/8=1
i=11のとき i/32=0…11 余り/8=1
i=12のとき i/32=0…12 余り/8=1
i=13のとき i/32=0…13 余り/8=1
i=14のとき i/32=0…14 余り/8=1
i=15のとき i/32=0…15 余り/8=1
i=16のとき i/32=0…16 余り/8=2
となってしまいまして…(@@;
>>193 それでいいと思うけど、どうなるはずだと思ってるの?
算数についての認識が間違ってるなw
その処理はなんらおかしくないw
余りを8で割って何がしたいんだ?
198 :
193:2008/09/21(日) 01:08:43
ごめんなさい!あほでした
普通に合っていますね…。
商/ と 余% をごっちゃにしていました…。
しょうもない質問してすいませんでした!(*_*)
199 :
デフォルトの名無しさん:2008/09/21(日) 01:15:51
夜は冷えるね。
>>198 配列までしか知らない俺も心配になる。大丈夫か?
あんまり馬鹿にするなよ
勘違いなんて誰にでもあるだろう
>>201 まーな
|| と && と != を使った条件判断ってあまりくまないから
時々テストの段階で思ったように動かなくて後で気がつくってことはある。
条件分岐で&&はかなり使うな
&と混ぜて使うと少し紛らわしい
C++!C++!C++!C++ぅぅうううわぁああああああああああああああああああああああん!!!
あぁああああ…ああ…あっあっー!あぁああああああ!!!C++C++C++ぅううぁわぁああああ!!!
あぁクンカクンカ!クンカクンカ!スーハースーハー!スーハースーハー!いい匂いだなぁ…くんくん
んはぁっ!C++様の桃色ブロンドの髪をクンカクンカしたいお!クンカクンカ!あぁあ!!
間違えた!モフモフしたいお!モフモフ!モフモフ!髪髪モフモフ!カリカリモフモフ…きゅんきゅんきゅい!!
小説12巻のC++様かわいかったよぅ!!あぁぁああ…あああ…あっあぁああああ!!ふぁぁあああんんっ!!
アニメ2期放送されて良かったねC++様!あぁあああああ!かわいい!C++様!かわいい!あっああぁああ!
コミック2巻も発売されて嬉し…いやぁああああああ!!!にゃああああああああん!!ぎゃああああああああ!!
ぐあああああああああああ!!!コミックなんて現実じゃない!!!!あ…小説もアニメもよく考えたら…
C + + 様 は 現実 じ ゃ な い?にゃあああああああああああああん!!うぁああああああああああ!!
そんなぁああああああ!!いやぁぁぁあああああああああ!!はぁああああああん!!ベル研究所ぉおおおお!!
この!ちきしょー!やめてやる!!現実なんかやめ…て…え!?見…てる?表紙絵のC++様が僕を見てる?
表紙絵のC++様が僕を見てるぞ!C++様が僕を見てるぞ!挿絵のC++様が僕を見てるぞ!!
アニメのC++様が僕に話しかけてるぞ!!!よかった…世の中まだまだ捨てたモンじゃないんだねっ!
いやっほぉおおおおおおお!!!僕にはC++様がいる!!やったよケティ!!ひとりでできるもん!!!
あ、コミックのC++様ああああああああああああああん!!いやぁあああああああああああああああ!!!!
あっあんああっああんあAda様ぁあ!!シ、Cー!!C#ぅうううううう!!!C++0xぅううう!!
ううっうぅうう!!俺の想いよC++へ届け!!ベル研究所のC++へ届け!
C++のアニメ2期って興味あるなwww
206 :
デフォルトの名無しさん:2008/09/21(日) 12:28:44
↓これは、何をする関数ですか?
#include <string.h>
void manko( unsigned long la ,char* str )
{
unsigned long msk = 0x80000000;
for( int i = 31; i >= 0; --i )
{
*(str + 31 - i) = ( msk & la ) ? '1' : '0';
msk >>= 1;
}
*(str + 32) = '\0';
}
207 :
デフォルトの名無しさん:2008/09/21(日) 12:40:30
>>206 関数の名前を見た瞬間に読む気をなくした
la に 1, 2, 3, …って入れていって実行してみればいいんじゃないかな
209 :
デフォルトの名無しさん:2008/09/21(日) 13:19:14
#include <stdio.h>
#include <string.h>
void main( void )
{
unsigned long msk = 0x80000000;
unsigned long la = 0x84218421;
unsigned char strings[33];
unsigned char* str;
int i,j;
str = &strings;
j = 0;
for( i = 31; i >= 0; --i )
{
*(str + 31 - i) = ( msk & la ) ? '1' : '0';
printf("%c", *(str + 31 - i) );
msk >>= 1;
if( j >= 3 )
{
printf(" ");
j = 0;
} else {
j++;
}
}
*(str + 32) = '\0';
}
210 :
209:2008/09/21(日) 13:19:57
受け取るデータを関数内でダミー定義するとかして実行すべし。
メモリ見れる環境なら直接見る、見れないならprintfで出してみる。
ま、結論いっちゃうと、"la"で貰った値をビット毎に評価して、真なら"1"を、偽なら"0"を
"str" に書き込んでる。
実行してみるとわかるが、"la" のどのビットが立ってるかがわかる、ということ。
211 :
デフォルトの名無しさん:2008/09/21(日) 15:28:03
実行してみなきゃわからんのか
int x;
のようなローカル変数があったとして
そのような変数の宣言は定義を兼ねますので、
口頭で説明する場合はどちらの用語を使用するのが適切でしょうか?
あと上記のような宣言(定義)は初期値が不明ですので、このような宣言(定義)の
特別な呼び方などありましたら教えてください。
ローカル変数の宣言と定義が分離することはありえないのでどう呼んでも誤解はないはずだが
強いて言えば宣言だと思う
あとは単に「初期化されていない」で十分
>>212 C言語なら、定義の場合は定義と言っとけば大体問題ない。
あと、宣言が定義を兼ねてるのではなく、
ある種の宣言を特別に定義と呼ぶだけなので、
宣言と言ったところで別に問題ないと思う。
ていうか、どっちが適切かなんか文脈次第だろがよ。
漠然と聞かれても「どっちでも良い」としか言いようない。
215 :
デフォルトの名無しさん:2008/09/21(日) 17:42:40
つまり、宣言と定義は混同してよいのだな?
217 :
デフォルトの名無しさん:2008/09/21(日) 18:05:17
答えられない低脳はすっこんでろ
sageずに煽るのはいつもの俺言語な変な子
みんな知ってるね
>>217 C言語どころか日本語の通じないかたはお帰りください
220 :
デフォルトの名無しさん:2008/09/21(日) 18:14:23
>220
日本語を理解できることは、このスレで議論する論客として最低限の資格だ
質問する気にしても、人にものを尋ねるときの態度がまるでなっておらず、質問者として最低限の資格もおまえは備えていない
繰り返すがチンパンジーには無理な問題だ
あきらめて帰れ
223 :
デフォルトの名無しさん:2008/09/21(日) 18:24:21
結構熱いな、ここw
>>215>>220 >どの日本語が通じなかったんだ?
どの、というより全体的に意味の取り方がおかしいと思われる。
どこをどう取ったら「宣言と定義は混同してよい」という結論になるんだ?
日本語が理解出来て無いとしか思えない。
226 :
デフォルトの名無しさん:2008/09/21(日) 19:21:16
すみません。C言語の文法書2冊とWinAPIの本を2冊読みました。そこで
以前から私が作りたかった、ショートカット作成プログラムをぜひとも作りたいのです。
でも、やり方とかMSDNを調べてもわかりません。具体的に手順を書かせていただきますと。
1.コンソールアプリから2つフォルダのフルパスを入力する。
2.WindowsAPIで書いたショートカット作成関数を呼び出してお互いのフォルダにお互いのフォルダの
ショートカットを作成する。
そこで、ショートカット作成のWindows32APIのMSDNの調べ方もしくは
関数そのものを教えて欲しいのです。すみませんが、教えてください。よろしくお願いします。
228 :
226:2008/09/21(日) 19:27:27
>>227 どうもありがとうございます。そちらに移動させていただきます。
229 :
デフォルトの名無しさん:2008/09/21(日) 21:28:19
>>225 で、定義と宣言は混同しても文脈次第でどっちでも良いのか、悪いのか?
230 :
デフォルトの名無しさん:2008/09/21(日) 21:29:07
>>226 せっかくだからジャンクションを作ってみてはどうだ?
>>229 混同はしてはいけないけど、定義も宣言であるから、
文脈によってはどちらを使っても正しい表現になる場合もある。
どちらを使っても良い場合があるという事から、すなわち混同してよいと解釈したわけ?
やっぱり日本語が理解出来て無いようだね。
/*
* A function is only defined if its body is given
* so this is a declaration but not a definition
*/
int func_dec(void);
/*
* Because this function has a body, it is also
* a definition.
* Any variables declared inside will be definitions,
* unless the keyword 'extern' is used.
* Don't use 'extern' until you understand it!
*/
int def_func(void){
float f_var; /* a definition */
int counter; /* another definition */
int rand_num(void); /* declare (but not define) another function */
return(0);
}
233 :
232:2008/09/21(日) 23:42:20
宣言(declaration)は使用を宣言(declare)すること
定義(definition)は変数やマクロや関数のボディを定義(define)すること
ではあるまいか?
だから場合によってはひとつで両方兼ねてたりするだろ?
Cの用語としては、もうちょっとちゃんと記述されていて、
JISより抜粋。
>識別子の定義(definition)とは、宣言のうち次のものをいう。
>・オブジェクトに対しては、そのオブジェクトの領域を確保する宣言
>・関数に対しては、関数本体を含む宣言
>・列挙定数または型定義名に対しては、その識別子の(唯一の)宣言
余談だけど、C++だとまたもうちょっと違う。
236 :
デフォルトの名無しさん:2008/09/22(月) 08:50:57
(func1) register キーワードのついた別々の変数を用いる
(func2) a, b を array[0], array[1] に置き換えた以外は func1 と同じ
このような時,func1 と func2 の振る舞いは変わりますか?
int func1(void)
{
register int a, b;
何か a, b をたくさん使う処理
}
int func2(void)
{
register int array[2];
何か array[0], array[1] をたくさん使う処理
}
>>236 振舞いは変わらない。それで変わったら困るでしょ。
func2の方は最適化が阻害されて遅くなるコンパイラとかあるかもね。
238 :
デフォルトの名無しさん:2008/09/22(月) 16:16:39
>>231 やっと少しお勉強してきたようだな
たったそれだけのために何時間かかってるんだよ ぼけ
文脈によってはなんて逃げてないで、どういう場合かはっきりしろ
現状、その逃げによって意味をなしていない
>ある種の宣言を特別に定義と呼ぶだけなので、
>宣言と言ったところで別に問題ないと思う。
× はっきりしろ
○ 教えてくださいお願いします
>238
お帰りください
>たったそれだけのために何時間かかってるんだよ
これはひどい
>>238 お前さんこそそんな支離滅裂なレスを考えるのに17時間もかけたのかい
てなことになるな
>>236 registerストレージクラスをどう解釈するかは処理系依存なのでなんともいえません。
疑問に思ったら、自分の使ってるコンパイラでアセンブラ出力してみるのがいいよ。
foo bar[row][col];
bar[r][c] = hoge;
↑これって
foo bar[row * col];
bar[r * col + c] = hoge;
に等しいのか、それとも
foo (bar[col])[row];
(bar[row])[col] = hoge;
なのか、どっちなんでしょう?
あと下のbarにsizeofするとsizeof(foo) * row * colに等しくなります
下のやつはbar[col]へのポインタの配列だから sizeof(foo*) * rowになると思うのですがなぜこうならないんでしょうか?
>>244 詳しくも何も、規格票には「アクセスを可能な限り高速にすることを示唆する」とかなんかしか書いてなくて、
レジスタに割り当てろとも、アクセスを高速にしろとも要求されていない。
248 :
デフォルトの名無しさん:2008/09/22(月) 18:26:58
>>242 即レスがトレードマークな常駐野郎にしては遅かったから変だと思ったんだよ
>>246 配列はポインタではない。キミは何かを勘違いしてる。
次の3つは等しい:
foo bar[row][col];
int (bar[row])[col];
typedef foo foos[col];
foos bar[row];
これは縦と横が反対になっている:
foo (bar[col])[row];
これは明らかに違う:
foo bar[row * col];
250 :
249:2008/09/22(月) 18:30:23
>>249 書き間違えた
× int (bar[row])[col];
○ foo (bar[row])[col];
>>246 >下のやつはbar[col]へのポインタの配列だから
違うよ
foo (bar[col])[row] は foo[row] が col 個の配列
つまり foo bar[col][row] と同じ
foo[col] へのポインタ row 個の配列が欲しければ
foo (*bar[row])[col]
と書くけど、普通使わないと思うよ
foo へのポインタを row 個持つ配列
foo *bar[row]
の方がよく使う
>>247 今はregister付けても大体無視されるよな
>>247 いやそうじゃなくて、それで函数の振る舞いまで変わるの?
>>252 「無視されます」とかドキュメントに明記してあったりな。
それでも C ではまだ & 付けれないという差があるが、
C++ では & 付けれるようになったんだよな。
そもそも「振る舞い」って何なの?
関数の結果ことなのか、CPUが演算する内容なのか。
>>253 未定義動作だから何が起こっても不思議じゃないだろ。
>>257 処理系定義と未定義動作は別です。
register変数がどう解釈されるかは処理系定義です。
>>257 register付けたら未定義動作ってどんな罠だよww
>>258 register付きの配列にsizeof以外の演算子が使えることは保証されていない。
C99なら(ry
>>260 なるほどね
でもそれだったら「処理系依存なのでなんともいえない」じゃなくて
「未定義だから結果は予想できない」が正しい答えだね
何がなんでもケチつけたいんだね
要するにコンパイラの解釈うんぬんは関係なくて「配列にregisterつけんなボケェ」でFA?
こまかいことにこだわるのがプログラマー
入門じゃ無い方のCスレ、どっか行っちゃったからなぁ
>>260 そうなんですか!知りませんでした
どうもありがとうぐございます
コンパイラで最適化してくれるから、registerは使わなくてもいい
registerは最適化が進んでいなかった大昔のコンパイラの名残だよ
人間の体でいったら盲腸のようなもの
組み込み系用のマイナーなコンパイラを使っているんなら別だが
( ・∀・) (´・ω・ ≡ ・ω・`) (・∀・ )
274 :
デフォルトの名無しさん:2008/09/22(月) 23:33:46
いざ、それを使う期に及んではマイナーかメジャーかって問題じゃあんめえ
入門者が使う必要は無い
でいいでしょ
知識が昭和世代の古い人がいるみたいだね。
277 :
デフォルトの名無しさん:2008/09/23(火) 06:49:20
入門者が使う必要のない機能はない
そいつが入門者を卒業するためにはできることからやってみるのみ
C99における可変引数マクロの、##の文字列連結についてお伺いします。
環境はGCCです。
#define a(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, __VA_ARGS__)
#define b(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, ## __VA_ARGS__)
a("x=%d", x);と書いたときは、「fmt」が「"x=%d"」、「...」と「__VA_ARGS__」が「x」に対応するので、
fprintf(stderr, "%s()::" "x=%d", __func__, x); と置換されますが、
a("x")と、引数を1つだけしか書かなかった場合には、
fprintf(stderr, "%s()::" "x", __func__, );
とfprintfの引数リストがカンマで終わってしまいコンパイルエラーになります。
そこで、b(fmt, ...)のように##演算子を使うと、問題のカンマが取り除かれるらしいのです。
##は「パラメータ置換後に、両側の空白文字とともに各##も削除されて、
隣接するトークンが連結され、新しいトークンが形成される」、と
K&R第2版で書いてあるのですが、カンマも取り除かれるようになったのでしょうか?
それとも、これはGCCで通じる特別なものなのでしょうか?
長くなりましたが、よろしくおねがいします。
__VA_ARGS__でぐぐれ
280 :
デフォルトの名無しさん:2008/09/23(火) 15:41:46
intなどの値をcharのような1byte区切りの配列として扱うには
キャストを使うことができるでしょうか?
実際にやりたいのは
色々なデータのサイズをネットワークバイトオーダーに変えてから
0のバイトを省略して送りたいのです
例えば
00 ab 00 cd
ならば
ab 00 cd
としたいのです
宜しくお願いします
int a
に対して
((char *)&a)[1]
とかやればいい
char a = (char)(x >> 24)
char b = (char)(x >> 16)
char c = (char)(x >> 8)
char d = (char)x
シフトするならシフト幅はCHAR_BITから計算したほうがいい。
つhtonl
287 :
デフォルトの名無しさん:2008/09/23(火) 17:08:55
宿題臭がする
00を取ったら可変長になるわけだけど、プロトコルとかどうなってるんだろう。
1バイトに縮めば、長さを別に持っていても節約にはなるか。
>>280 それだとデータの内容が変わってるけど問題は無いの?
送信時に 03 ab 00 cd みたいに長さ情報を付加するの?
かなり高い確率で、受信側で次に送る送信データと連結されてしまうよ
>>281>>282>>283>>286 みなさんありがとうございます
共用体も初めて聞くので調べてみます
>>284 htonlの後出力する段階でどうしたらいいのかわからなくて
>>287 宿題ではありません
個人的にサーバープログラムを書いています
Cで本格的なプログラムを書くのが初めてなので
>>288>>289 00 00 ff ab 00 cd
みたいな感じで特定のバイト列でサイズのサイズを表し
可変長にしようと考えてます
他の既存のプロトコルがどうやってるのか勉強したほうがいい
>>291 具体的な例を教えて頂けるとありがたいです
RFCの有名どころくらいしか知らないので
>>290 頼むから、そのサーバソフトはLAN内でのみ使ってくれよ。
UTF-8形式っていう手もあるよ可変長
負の値が送れないけど
バイナリのプロトコルでしょ?
可変長で任意のビット数送るのにも使えるということを言ってるのでは
>>290 元データ
00 ab 00 cd
ゼロサプレスしたデータ
00 00 ff ab 00 cd
長くなってるよ
まぁ別にその辺はプロトコルの話で、
C言語とは関係無いじゃん
見た目の圧縮が目的ではないので長くなって構いません
理論的に大きさに制限の無いデータを全部受け取らなくても
サイズを知ることができるデータ構造が欲しいのです
そのような実例があったら是非教えて頂けると嬉しいです
例えばSMTPなんかは改行などが現れるまでデータの大きさが判りません
拡張でSIZEがありますけどサイズ自体が文字列だから
結局その大きさが判りません
無駄になるかもしれないデータを健気に受け取るより
最小のデータ受信で受け取るか判断できるようにして
トータルで無駄を無くす仕組みにしたいのです
>>294>>296 ありがとうございます
UTF-8調べてみます
>>293 初めてのプログラムですしいきなり誰かに使ってもらうつもりは
毛頭ありませんが他の人に見てもらいたいと思って
真面目に取り組んでいるので
宜しければどの辺が駄目か御教授頂ければ幸いです
>>299 すみません
話し逸れてました
他で相談します
ヘッダにある構造体を定義して、何個かint型の変数を定義しました
でも一番上に定義した変数だけ思ったとおりになってくれません
最初にその変数を使うときはおもいどおりの数なんですが
二度目以降からなぜか中身が変わってしまいます
変数名を変えてみたりしてもダメでした
なぜか一番上に定義した変数だけなんです
どういう可能性がありますか?
>>302 その構造体を晒してみて
あと、環境とかも
BCC DeveloperでDXライブラリ使ってます
構造体は
struct STATUS_D{
int w_x;
int w_y;
int pc_x;
int pc_y;
int pc_sx;
int pc_sy;
int menu_x;
int menu_y;
int data_x;
int data_y;
int time_x;
int time_y;
int m_x;
int m_y;
int c_size_x;
int c_size_y;
char menustr[5][STR_MAX];
int menu_num;
int w_handle;
int wb_handle;
int c_handle[5];
int c_handle_num;
};
です
この一番上のint w_x;の値が変わってしまいます
>>304 構造体自体には問題ないね。きっとどこかでメモリ破壊をしているんだろう。
メモリ破壊してる所見つけるコツみたいなのあります?
全然わかんないです・・・
>>307 それよりこの構造体をどういう風にメモリに確保するか
でも変わるしなあ。
たとえば構造体を配列にしてるとなると構造体内部の配列の
最大値をちゃんと管理してなくてメモリ破壊してるとか。
ただ構造体に情報をセットするのは構造体の先頭の領域から
なら見かけ上正常に動いてるようにも見える。
目視デバッグ
デバッガーでトレース
構造体のint w_x;の値を表示しておき、ステップ実行で値が変わったところを調べる
その構造体すでにfreeしてしまっているとか
char型の配列周りが基本的に怪しいよね。
ちゃんとヌルターミネートされてるか、
配列のサイズよりも大きいものを入れる可能性がある場所はないか。
デバッガあるなら
>>310の方法で探すのが早いかな
#ifdef _DEBUG
#include <stdio.h> //for sprintf
#endif
_DEBUGってなんですか?
>>313 VCではデバッグモードでコンパイルすると
_DEBUGが暗黙のうちにdefineされる。
fgets(str, BUFSIZE, stdin);
len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
}
whileでstrの未処理の値を読み捨てているらしいけど、そこがしっくりこないんだが。
fgetsで読み捨てるって、具体的にどういう処理だ?><
>>316 モードが何かは知らんけど、読み捨てるって一定条件に達したら
その後データが存在してても読まないだけじゃないの?
サイズをオーバーしたとき
でもその処理そもそもエンターで入力終了と決め込んでるという点がダメな気もする
316のはよくない例だな
すまん、学校の宿題というかプリントに乗ってるプログラムなんだ><w
実際は
char str[BUFSIZE];
char dummy[4];
int a = 0, b, len;
while(a >= 0) {
printf("a, b = ? ");
fgets(str, BUFSIZE, stdin);
len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
continue;
}
if(sscanf(str, "%d %d %3s", &a, &b, dummy) != 2) {
printf("input format may be imcomplete\n");
continue;
}
printf("a = %d, b = %d\n", a, b);
}
こんななってる。安全な入力方法の一つだそうで。
オーバー時のwhileの処理は、未処理のまだ残っている値のクリアが目的らしいんだけど、
fgetsでどうクリアするのかがよくわからん><
BUFSIZE以上の文字数が入力された場合にBUFSIZE-1で割った最後のあまりのみを有効にする、
かなり頭の悪いやり方。
continueがあるから違うだろ。
while(getchar()!='\n')で十分な気はするが。
>>322 そうそう、それでもいいって書いてあった。
あれか、未処理だった部分がstrに入ってくるんかね?
んで、未処理だった値も処理されてクリアってこと?><
もし想定してるよりも長い文字列が入力されてれば
読み込みきれなかった分までstrに上書きしながら
順次読み込んでいって、以降するはずだった処理は
全部ぶっ飛ばしてまた最初からと言う方法を取ってる
ifの直後に同じ判定をwhileでするのは無駄だと思うけどな。
こういうときこそdo{}while使ってやれよw
>>324 ありがとうございます、なんとなく解りました。
>>327 if内に進んだ最初のwhileの判定はifでしたのとまったく同じだけど?
>if(str[len - 1] != '\n') {
これと
>while(str[len - 1] != '\n') {
これの条件判定が同じで、whileの一回目の判定が無駄だって言ってるんだが理解できてる?
まあ、こう言うときはこう直せば良いんじゃね?
とソースを書けば一番手っ取り早いよねと横レス
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
do {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
} while(str[len - 1] != '\n');
continue;
}
自分の関数を周りに使わせたがる同僚にはどう対処したらいいですか?
上司になっていいように使う。
335 :
デフォルトの名無しさん:2008/09/25(木) 04:16:05
すまそ。。度忘れしてしまって、googleってもでてこないので、おしえて。
超簡単なことなんだけど、C言語の配列って宣言時にしか初期化できないんだっけか?
しばらくC言語やってないもんで。。
よろしく。
別に好きなとこで代入とかして初期化すればいいだろう
それとも初期化子の使用のことか?それなら、宣言時にしか使えないな
strcpyとかstrcatとかsprintfとか使いまくってるんですけど
やっぱバグおきますかね?
参考にしてるソースではstrcpy_sとかstrcat_s、sprintf_s使ってるんですが
私BCC使ってるので使えないんです(たぶん)
>>337 sprintf()でも%sや%fを生で使わなければ随分違うと思うよ。
例えば、%.20sとするとか%10fにするとかいっそ%gを使うとか。
>>337 _sの方を使ってても同じぐらいバグを出しやすいと思うよ。バグっても
セキュリティホールになりにくいだけで。
C++のstringやらCStringを使うほうがいいです。
CのスレでC++の話をする奴って何なの?
341 :
335:2008/09/25(木) 13:37:47
>>336 そうです。初期化子のことです><; やっぱ宣言時にしかつかえないんですね><;
宣言時以降で、array[] = {1, 2, 3, 4, 5}; とかいう文をCでそういえばみないなあとおもって。
Javaとかの高級言語ばっかつかってたから、脳みそパープリンになってました。本当にありがとうございました><;
Cも一応高級言語なんですけぉ
>>337 バグ起きるかどうかは自分のコーディング次第じゃない?
strcpy_sはBCCじゃ使えないけど、自分で作ればおk
344 :
デフォルトの名無しさん:2008/09/26(金) 07:51:18
CPU 使用率を下げたいのなら、Sleep(0) ではなく Sleep(10) などと待ち時間が必要
345 :
デフォルトの名無しさん:2008/09/26(金) 08:08:07
おれ=くさかべ先生
BUGなのに、偶然としてそれが表にでてこない。
そんなのがバグ。
人は間違えるもの、間違えた時の危機管理が問題であって、
完璧に間違えないように作るという方向では、危機を避けることができない
君がやっているのは問題の先送り。トラブルがでてから対処すればいいじゃん。
それが致命傷になる。
347 :
デフォルトの名無しさん:2008/09/26(金) 12:39:51
保険に入ってれば事故ってから対処すればいいじゃん、てのと同じだな
事故んねえように日頃から心がけることこそ管理しきれない危機への危機管理
どんなにセキュアなシステムでも使う奴がアフォでは結局危ない、という意味で
> 自分のコーディング次第
に賛成
サイバーノーガード戦法?
大学の授業をサボりぎみで、いつの間にかついていけなくなっていた俺に良い参考書はないですか?
基本まではちゃんとやっていたが、本格的に関数使い出したり二分木のあたりから\(^o^)/
if ( 条件1 ) {
処理1;
if ( 条件2 ) {
処理2;
} else {
処理3;
}
} else {
処理3;
}
処理4;
処理3を1箇所にする書き方を教えてください。
if ( 条件1 ) {
処理1;
if ( 条件2 ) {
処理2;
} else {
goto label;
}
} else {
label:
処理3;
}
処理4;
if (条件1 && (処理1, 条件2)) {
処理2;
} else {
処理3;
}
処理4;
353 :
デフォルトの名無しさん:2008/09/27(土) 14:04:29
switch (条件1) {
default:
処理1;
if (条件2) {
処理2;
break;
}
case 0:
処理3;
}
処理4;
>>351 goto使うならこうだな。
if ( 条件1 ) {
処理1;
if ( 条件2 ) {
処理2;
goto label;
}
}
処理3;
label:
処理4;
正しいと思う場所に入れてみたら?
358 :
350:2008/09/27(土) 14:38:05
勉強になりました。ありがとうございます。
皮肉もわからないのかお前は
か・・皮肉?
kuma-
364 :
デフォルトの名無しさん:2008/09/27(土) 21:44:46
goto を教条主義的に忌避している者は、いざ使おうとすると付け焼き刃で桁下がりが出まくり
switch( !条件1 ){
case 0:
処理1;
if( 条件2 ){
処理2;
break;
}
case 1:
処理3;
}
しつこい
367 :
デフォルトの名無しさん:2008/09/27(土) 22:57:13
Cに限らないかもしれないけど
0 < hoge
みたいに比較演算子使うときに定数を左辺に持ってくる書き方は
どのようなメリットがあるのですか?
見た目が分かりやすくなるという人も居る
0 < hoge && hoge < 10
なんかだと数学の書き方にちょっと似る
もう何年も>演算子を使っていない
>>370 0 ≦ hoge ≦ 10 みたいな書き方からの連想だよね。
>>368 自分は代入演算子と間違えないためかと思ってました
>>369 なるほど〜
数直線なんて単語すっかり忘れてました
>>370 そういう使い方もあるのですね
とても参考になりました
ありがとうございます
int配列で hoge[] = {1,2,3,4} みたいな物を
1234と連結させたint型に直したい時に
なにか賢い方法ありますか?
>>375 1234と連結させたint型とはなんですか?
10進数の1234ですか。
ごめんなさい、そうです
for(i=0,n=0;i<hogelen;i++) n=10*n+hoge[i];
標準ライブラリの関数ってどのぐらい早いの?
380 :
デフォルトの名無しさん:2008/09/28(日) 08:47:23
Windowsで、system("test.exe")と実行ファイルを呼び出したとき、
test.exeはどのパスにあるか調べる方法はありますか?
381 :
デフォルトの名無しさん:2008/09/28(日) 08:50:53
もしくは、test.exeが利用可能か調べる方法でも良いです。
>>379 例えばmemcpyはバイト数指定なのに32bit単位でコピーして端数処理もやってるのもあるから、そこそこ速い
384 :
デフォルトの名無しさん:2008/09/28(日) 09:02:59
>>382 もうちょい教えてください。やり方判りません
>>382じゃないけどargc、argvを貰えと言ってるんだと思う
二次元配列を別の関数へ渡す時
なぜこの方法で渡せるのかわかりません。
[2][2]で受け渡したいです。
void func(int array[][2]); //関数宣言
void mainf(){
int array[2][2]={1,2,
3,4};
func(array)
}
void func(int array[][2]){
}
[2][2]でも渡せる。
なぜ[][2]で渡せるかは配列の構造を調べてみるべし
>>387 配列は
最初のアドレスとデータ型さえわかれば
次の番地がわかるってことですか?
そんでNULLまでが範囲ってことですか?
2次元だと添字情報がないと
次の番地がわからないので
書かなきゃいけないってことですね?
日本語でちゃんと説明できませんが
なんとなくわかりました。
>>380 環境変数のPATHのディレクトリを順に参照していってtest.exeを探していくんじゃダメ?
なかったら最後にカレントディレクトリ調べて、それでもなければ利用不可能って事になる。
>>390 カレントディレクトリは一番最初でしょう。
内部コマンド → カレントディレクトリ → PATHに記述されたディレクトリ
の順番か。ごめんなさい><
違うだろ
環境による
windowsの話してるんだろ
というかC関係ないね
だよな
398 :
くさかべ様:2008/09/28(日) 16:44:19
まあ俺に聞けばなんでもわかる、mixiでもIRCでも俺が相手になってやる。
豆でも食ってろ
400 :
デフォルトの名無しさん:2008/09/28(日) 18:18:09
すみません。友達にEclipseっていうののコンパイラだと何も設定しなくても
使えるときいたのですが、本当ですか?
以前、ボーランドという会社のコンパイラを使おうと思ったのですが
うまくいかなかったので。。
もし、なにも設定しなくてもいいなら、つかってみたいんですが。
よろしくお願いします。
Eclipseはコンパイラじゃないよ
>>400 なにも設定したくないならvisualstudioおすすめ
PCの基礎知識が無いのにプログラミングは早すぎる
パスも通せないでプログラムですか
405 :
400:2008/09/28(日) 18:40:10
みなさん、ありがとうございます。やはり、私には無理みたいですね。
一度プログラムというのをやってみたいと思っていたのです。
visualstudioでググってみましたら、ただらしいですね。そいつでやってみます。
このいたの上にも情報があるみたいですね。ありがとうございました。
406 :
デフォルトの名無しさん:2008/09/28(日) 19:24:39
>>405 まあ、これで覚えろ
きっかけが無いと覚えれないしな。
408 :
デフォルトの名無しさん:2008/09/28(日) 22:19:16
main関数の2番目の引数の char *argv[]
って、argv[]っていう配列へのぽちんたという意味なのか、
ぽちんた変数配列argvっていう意味なのかどっちなの?
教えてエロイ人。
409 :
408:2008/09/28(日) 22:20:06
まちがえた。
ぽちんた変数配列argvっていう意味
↓
ぽちんた変数の配列argvっていう意味
char *argv[]っていう書式的にはぽちんた変数の配列argv
っていう意味で合ってる
でも実際はchar **argvだけど
ぽちんた変数と呼ぶのが今の流行りなのか?
幼稚な奴にあわせる必要は無い
413 :
408:2008/09/28(日) 22:56:14
みんなどうもありがとう。ぽちんた変数の配列argvっていう意味なんだね。
細かいところがむずかしいね。ありがとう。よくわかったよ。
414 :
デフォルトの名無しさん:2008/09/28(日) 23:05:44
ぽちんた言いたいだけやろ
415 :
デフォルトの名無しさん:2008/09/28(日) 23:26:54
fgetsでstdinから文字を取得します。改行文字まで取得してしまうそうですが、
改行文字をなくしたいです。どうすればいいですか?
417 :
416:2008/09/28(日) 23:39:06
なるほど、感涙。ありがとうございました。
>>416
418 :
デフォルトの名無しさん:2008/09/29(月) 01:29:14
ある本を本でいたら(1990年くらいの本)、文字列はこう表現しますなんて記述で
*str = "abcde";
ってかいてあったんだ。でも今の本はたいてい char str[80] = "abcde"ってかいてある。
最初の本のことが頭にあったから、char *str1=""; *str2="";と宣言してそれにgetsで読み込ませたら
str1のあとに必ずstr2の文字まで連結されて格納されてしまうんだけど、それはやっぱそういうことで
stdinから読み込ませる文字列を格納するのは、ポインタでなく配列で宣言しなくちゃいけないわけなの?
なんか、こないだ立ち読みしてた本でも文字列はポインタで表現みたいな事が強調してあったから
読み込ませる文字列もポインタに読み込ませればいいのかなとおもったんだけど。
すまそ。寝るのでお礼は明日になります。教えてくれる方、よろしくお願いします。
結論から言うと全然違う
おまえが無茶苦茶してるだけ
眠い上に長くなるから今説明しないけど
結論だけ言うと、配列で宣言しなくちゃいけない
ファイルから13バイトのデータを読むために
struct database {
char boolen;
long data[3];
};
このような構造体を作ってfreadで読み込んだのですが
charのところで4バイト読み込み、最初の1バイトだけ変数に入れて3バイト破棄するという変な動作をします。
printf("%d\n",sizeof(struct database));
で表示させたところ16と表示されどうにもこうにもできません。
どうすればちゃんと1バイトだけ読み込むのか教えてください。お願いします。
>>421 構造体メンバのアライメント(バウンダリ)の問題だと思う。
そのコンパイラでは以下のようなアラインメントになっている
*--- char boolean
**** float data[1]
**** float data[1]
**** float data[2]
1バイト読む->boolenに格納
4バイト読む->data[0]に格納
4バイト読む->data[1]に格納
4バイト読む->data[2]に格納
とすればおk
1バイト読んでから再度freadで12バイト読まないとダメ
#pragma pack()とかパディングを無くす抜け道はある
しかし
>>424,425さんのように手間を惜しまない方が賢明
>>418 とりあえず、本は買って隅から隅まで読め
428 :
421:2008/09/29(月) 09:50:01
>>422-426 ありがとうございます。
コンパイラの仕様でそうなっているんですか。
やっぱり一気に読むより個別に読んだほうが確実ですね。
まあ個別に読むのもいいけど、アライメントについて調べておいたほうがいいよ。
書くときにも同じことやりそうだし。
>>421 union chinpo
{
char str1[13];
struct database {
char boolen;
long data[3];
};
ユニオン使って、srt1で一括読み込みすればいいですよ。
>>418 > でも今の本はたいてい char str[80] = "abcde"ってかいてある。
そんなことねーだろ。
434 :
430:2008/09/29(月) 22:28:12
カンで書いてみたけどやっぱダメかw
ごめんねごめんね^^
435 :
デフォルトの名無しさん:2008/09/29(月) 22:31:16
>>434 せめてやりとりぐらいは呼んでからレスしてね
436 :
デフォルトの名無しさん:2008/09/29(月) 22:53:58
カタカナ表記のユニオンがいいな
ユニックス的でいかすぜ
437 :
418:2008/09/30(火) 00:56:23
>>419-420 どうもありがとうございます。これからは、標準入力から入力する文字列は
必ず、配列で宣言するようにします><;ありがとうございました。
438 :
デフォルトの名無しさん:2008/09/30(火) 00:57:38
すみません。グローバル変数とローカル変数を同じ名前にしてしまい、
printfで出力しようとおもったら、困りました。出力できませんかね?
片方の名前を変えればおk
440 :
438:2008/09/30(火) 01:29:39
>>439 やはり無理みたいですね。ローカル変数の名前を変えます。ありがとうございました。
>>438 影響範囲が大きすぎて触るのが怖い場合は、グローバル変数にアクセスするための関数を作ればおk
#include<stdio.h>
int value=1234;
char string[256]="this is global.";
int *global_value(void){
return &value;
}
char *global_string(void){
return string;
}
int main(void)
{
int value=2345;
char string[256]="this is local.";
printf("value=%d\n", value);
printf("string=%s\n", string);
printf("value=%d\n", *global_value());
printf("string=%s\n", global_string());
return 0;
}
グローバル変数ってあんま使わないほうがいいの?
ゲーム作ろうとするとグローバルのほうが簡単に書けるような気がするんだけど
>>442 そのグローバル領域の使い方次第じゃないの?
アクセス速度ばっかり追求しすぎて別ソースに書かれてる
領域へexternでアクセスしてればわかりにくいソースになるし。
速度は犠牲になるけど、別ソースで持ってる領域へアクセスする場合は
アクセス用関数を用意して領域をいじるとかね。
あとは命名規則をしっかり作って、どこ管理の関数・領域かが
一目でわかるようにしてあればexternで触っても問題ないだろうし。
Insufficient memory(out of memory)
in function cvalloc
というエラーが出てプログラムがとまってしまいます。
これを防ぐにはどうしたらいいでしょうか。
>>444 メモリが足らない、と言ってる
・メモリを増やす
・メモリの使い方を見直して無駄遣いを減らすなり節約するなり
446 :
デフォルトの名無しさん:2008/09/30(火) 17:25:04
>>442 そう思うなら、とことんやってみれ
なんでダメなのかもわからん奴が教条主義的に嫌って書いたコードは
おぬしのコードよりダメだぜ、きっと
void ChangeWtoM(char *malt, char *wide, int len_wide)
{
int i, j;
for(i = 0, j = 0; i < len_wide*2; i++){
if(wide[i] != '\0')
malt[j++] = wide[i];
}
malt[j] = '\0';
}
int main()
{
TCHAR wide[64] = L"testテストですtest";
char malt[64];
ChangeWtoM(malt, (char*)wide, lstrlen(wide));
printf("%s", malt);
return 0;
}
ワイド文字文字列をマルチバイト文字列に変換する関数を作りたいのです。
いろいろ試してみたのですが上手く行きません。
これは何がいけないのでしょうか。
そもそもTCHAR型がなんなのか理解しているか
突っ込みどころが多すぎる。
環境は?汎用的に作ると長くなるから特定したほうがいいかも。
450 :
447:2008/09/30(火) 18:10:13
1文字に2バイト使うcharで1バイトしか要らない場合は'\0'が入ってる
だと思っているんですけど
451 :
447:2008/09/30(火) 18:11:59
>>449 OSはWindowsXP、コンパイラはVisualC++2008です。
>>450 実際のワイド文字列とマルチバイト文字列を見比べてみ
void p(char *p, int len) {
int i;
for (i = 0; i < len; i++)
printf("%02x ", p[i] & 255);
printf("\n");
}
int main() {
wchar_t *wide = L"testテストですtest";
char *mb = "testテストですtest";
p((char*) wide, wcslen(wide) * 2);
p(mb, strlen(mb));
}
>>450 文字コードの種類を一度勉強したほうがいいよ。
どうせS-JIS、JIS,
454 :
453:2008/09/30(火) 18:14:21
途中になった
EUC,UTF系との相互変換とかくらいだろうし
Windowsなら、WideCharToMultiByte()APIがあるから、それ使うか、
VC++なら、CStringを使って、、、っとこれはC++だからスレ違いか。
457 :
デフォルトの名無しさん:2008/09/30(火) 20:00:21
関数ポインタの配列を使って、色々と作成してるんだけど、
たとえば int (*p[5])(int x, int y)っていう関数へのポインタ変数の配列pをつくったとする
この配列に格納できる関数は戻り値がint型で、引数はint型を2つとる関数じゃないと
だめみたいなんだけど、Cでは色んな型の戻り値や引数を持つ関数をたくさん収納できる
配列っていうのは、作成できないんですか?よくわからないけど、void型で宣言しておいてあとでキャストするとかしても
無理なんでしょうか?よろしくお願いしますm(_ _)m
ヒント:可変長引数
可変長引数って配列にしてポインタ渡せばいいじゃんって思うんだけどなんでそんな機能があるの?
460 :
デフォルトの名無しさん:2008/09/30(火) 20:21:44
>>457 0 <= n && n < 5 として
int r = (*p[n])(ここを); どう書きたいんでい?
入出力以外になんか使い道あるの?
関数ポインタで分岐させる関数それぞれが引数の形や戻りが違うようにしたいのであれば
構造体を連絡用にしてその構造体のポインタ1個だけを引数にする関数にしてしまえばいい。
あとは構造体全体を共用体にでもして引数が変わる関数分用意すればいい。
printfは第二引数が可変長になってるから
printf("a=%d b=%d",a,b);
って使い方ができるだろ
>457
ちなみに戻り値も引数もバラバラな関数群へのポインタを
配列に格納したいというのは、どういったシチュエーション?
>460 が指摘しているように call するときの手間を考えたら
メリットなさげ
すいません。どこで聞いたらよいか分かりませんので、ここで質問させて頂きます。
*エンディアン、MSB/LSBファースト、インテル、モトローラ, 送信値の関係
Big Endian = Motorola = メモリ番地0にMSB = MSBファースト
Little Endian = Intel = メモリ番地0にLSB=LSBファースト
とまでは分かっています。
仮に、10進数60000を0- 1byte(2byte)使い、送信するとします。
60000(10進)=>EA60(16進)
MSB = 0 byte LSB=7byteで定義し、ビッグエンディアンで送信するとき、
バイトの並びはどちらが正しいでしょうか?
@ EA 60 00 00 00 00 00 00
A 60 EA 00 00 00 00 00 00
byte 0 1 2 3 4 5 6 7
MSB LSB
あほですいません。ご教授お願い致します。
32bit レジスタ上で
00 00 60 EA
ビッグエンディアンだと
00 00 60 EA
リトルエンディアンだと
EA 60 00 00
468 :
きもい:2008/09/30(火) 21:45:36
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
>>466 意味が分からんよ
long x=0x12345678;
short y[2]={0x1234,0x5678};
ビッグエンディアン
x : 12 34 56 78
y : 12 34 56 78
リトルエンディアン
x : 78 56 34 12
y : 34 12 78 56
こうなる
MSB = 0 byte LSB=7byteで定義したら
>>466 の数値をビッグエンディアンで表現すると
00 00 00 00 00 00 EA 60
じゃないかな?
> 0- 1byte(2byte)使い、
これでは定義と両立できない気がする
>>467 >>469 ご回答ありがとうございます。
Endianの問題はハードウェアに依存し、
MSB/LSBのバイト定義はソフトの問題だと認識してよろしいでしょうか?
MSB=0byteのLittle Endian方式とMSB=7byteのBig Endianは結果的に
同じと理解してもよろしいでしょうか?
>>466 ソケット通信ならhtol関数、htolh関数を使えばいい。
>>471 すいません。プログラミングの素養は0なんです。
>>470 >MSB/LSBのバイト定義はソフトの問題だと認識してよろしいでしょうか?
バイトオーダと型の大きさによる
>>470 言ってることが理解できん。
MSB=0byteってどういう意味なんだ。
bit?
>>474 0バイト目って意味じゃないかな
勿論マのいう 0 番目は一般人の 1 番目相当だがw
>>474 通常なら、32bit系の場合、
LSB=0 byte目、MSB=4byte目
なんでしょうけど、
これの定義が逆になっている製品があるんです。
スレ違いかもしれませんが、車載LAN (CAN)の話です。
基本的には、シリアル通信なので、この問題は同じかなと思ったのですが・・・
↑
訂正です。0ベースで書いてるので、MSB=3byte目ですね。
速度的に問題が無ければテキストで送るという手もある。
>>477 ビッグエンディアンなら常に
MSB=0byte目
LSB=(型のサイズ)-1byte目
リトルエンディアンなら常に
LSB=0byte目
MSB=(型のサイズ)-1byte目
>>480 ご回答ありがとうございます。
実際に送信する順番という意味では、
ビッグエンディアン、リトルエンディアンにかかわりなく、
LSBが一番先という事になるのでしょうか?
60000(10進)、EA60は、ビッグエンディアン送信で
00 00 EA 60
--------> t
つまりLSBファーストとなり
受信側ビッグエンディアンで読み出し(計算)はそのまま
0000EA60
として扱うという認識でよろしいでしょうか?
ネットワークスレのテンプレでも見てからそっち行けよ
484 :
457:2008/09/30(火) 23:49:06
どうも皆さん、色々書いていただきまして、ありがとうございます。
私は、関数ポインタ配列を覚えたててでして、おもしろいから色々と趣味で組んでいます。
ですから、仕事上どうしても必要とか出なくて。。
本当に色々な方に意見を書いていただきましてとても感謝しています。自分としては
>>458さんや
>>463さんが教えてくれた可変長引数と構造体&共用体を組み合わせて色々自作してみたいとおもいます。
このたびはありがとうございました。自分で色々と作成すると楽しいです。自分は趣味でやっているので。
色々とわかりだして今が一番楽しい時期です。ありがとうございました。
>>481 シリアル通信時のバイトオーダーをどちらかにきっちり決めておけばいい
例としてネットワークバイトオーダーはビッグエンディアンと決まっている
いや、0x0000EA60をビッグエンディアン送信で送信するなら、
0x00, 0x00, 0xEA, 0x60の順だろう。だからMSBが最初。
>>482 まだいます。すいません。
>>486 ありがとうございます。
ということは、
ビッグエンディアンはMSB(データの3 byte目)を最初に送信
リトルエンディアンはLSB(データの0 byte目)を最初に送信
ということですね?
>>480の内容と異なる気が・・・
混乱してきました。もっと勉強します。
Intelだけなんだよな。リトルエディアンは。
なんでMS+Intelは、こういつもいつも
>>490 MIPSはどっちにでもできるぞ
現にPSPはリトルエンディアンだ。
アライメントはインテルのように甘くはないけど
493 :
490:2008/10/01(水) 00:58:27
SHシリーズにも動的に変えられるCPUあった気がするな
設計時はともかくプログラム的にはあまり気にしないけどさ
PPCがバイエンディアンだったよね。
エンディアン動作モードのビットがMSRに用意されてるとか
>487
486の例で言えば、3バイト目の「60」はどうみてもLSBなんだが……
すみません質問です。
C言語でスタック領域からメモリを動的に取得する方法は何があるでしょうか?
ネットで検索して探したところallocca()という標準?関数があるらしいのですが、
どんな仕様なのか分かっておりません。。
わかれ
なに?ヒープじゃ足りないの?組み込み?
>>496 alloccaは標準でなくて特殊な関数のようですが、あなたの環境にalloccaはありますか?
そもそも、なぜmallocではいけないのでしょうか?スタック領域を使う理由は?
500 :
デフォルトの名無しさん:2008/10/01(水) 02:33:24
スタック領域は無理だろ。 コンパイル時に決まった量を静的に確保するのが
スタック領域だろ。 ヒープもスタックも同一のメモリを使う。
Cのスタック領域は基本的にリターンスタックだから、
関数を抜けると消えるし、注意して使わないと領域破壊して関数から戻れなくなる。
普通にmallocすべき
alloca()はfree()しなくていいから、楽だし安全。
503 :
デフォルトの名無しさん:2008/10/01(水) 04:20:11
こちらで質問してよいものか…違ったら言ってください
xdawinというソフトで逆コンパイルをしようと思いましたが
エラー ufree: は malloc されていません
とでました。そこで
\アドレス\ void *malloc(size_t ○)
と実行しましたが
too many positional parameter
とでてしまい、再度。結果、サイズが1でも0でもこれが出てしまいます
・エラーを処理しようと思った式が全然ダメ なのか
・サイズがおかしい のか誰か教えてください
>>503 too many positional parameters
ポジショナルパラメータの数が多すぎるというエラーです。
スクリプトを実行したときの、そのスクリプトに渡すのパラメータの数が
あっていない可能性があります。
としか、お答えできません。
>503
スレ違いだと思う
507 :
503:2008/10/01(水) 13:35:16
>>505 ありがとうございます
>>506 うーん、やはり…
逆コンパイルで探しても出てこなかったのですみませんでした
508 :
デフォルトの名無しさん:2008/10/01(水) 19:20:41
while( 1 )
{
// 真ん中
center = (left + right) / 2;
printf("%d %d %d\n",center,left,right);
// みつかったら
if(a[center] == key){
printf("\nみつかった %d\n",center);
printf("\n%d\n",a[center]);
break;
}
// みつからなかったら
if(left >= right) {
printf("みつからなかった");
break;
}
if( a[center] < key ) left = center + 1;
if( a[center] > key ) right = center - 1;
// 時を止める
getch();
}
バイナリーサーチのプログラムこれでおk?
509 :
デフォルトの名無しさん:2008/10/01(水) 19:23:00
以前作ろうとして大失敗したから不安。
今回は成功したっぽいけど、間違えているかもしれないから修正あったら頼みます
おkにみえる
511 :
デフォルトの名無しさん:2008/10/01(水) 19:35:55
なぜ bsearch を使わん?
512 :
デフォルトの名無しさん:2008/10/01(水) 19:38:50
513 :
デフォルトの名無しさん:2008/10/01(水) 20:02:46
>>509 プログラムが正しいかどうか、他人に聞くしかテスト技法を知らんのか
テスト項目の導き方はいろいろある
それが知りたければ便所の落書きより有料情報をあたったほうがいい
514 :
デフォルトの名無しさん:2008/10/01(水) 20:15:04
515 :
デフォルトの名無しさん:2008/10/01(水) 20:34:11
floatのエンディアン変換が分からないのですが、教えてください。
typedef union
{
float f;
unsigned char b[4];
} Endian32;
float ConvertF32( void *inData )
{
EndianF32 val;
val.b[0] = ((Endian32 *)inData)->b[3];
val.b[1] = ((Endian32 *)inData)->b[2];
val.b[2] = ((Endian32 *)inData)->b[1];
val.b[3] = ((Endian32 *)inData)->b[0];
return val.f;
}
void test( float inVal )
{
float ret = ConvertF32( &inVal );
fwrite( &ret, sizeof(float), 1, fp );
}
こんな感じでやっています。
1.0を送ると、int型の1が何故か入ってしまいます。
516 :
515続き:2008/10/01(水) 20:34:40
リトルエンディアンだとこうなっているので、
0011 1111 1000 0000 0000 0000 0000 0000
ビッグエンディアンにすればこうなるはずなんですが、
0000 0000 0000 0000 1000 0000 0011 1111
なぜか
0000 0000 0000 0000 0000 0000 0000 0001
こうなりますw
同じようなやり方で、intなど整数型は問題なく出来ています。
どこが間違っているんでしょうか?><
ループ変数に対して
int main(void){
...
{
int i, j;
for(i...)
for(j...)
}
...
{
int i;
for(i...)
}
...
return 0;
}
見たいな感じでよく書くんだけど、これは機械のほうからすると無駄が多い処理なんでしょうか?
>515
そのシステムのエンディアンではない値をfloatとして返すのが間違い。
代入した直後に正規化されたりしてややこしいことになる。
>>515 代入というのは単にビット列をコピーすることではない
正しい内部表現を持たない値を実数として受け渡そうとしたら
場合によっては例外が送出されてプログラムが停まることもある
>>517 コンパイラの最適化次第
型のサイズを気にするのはコンパイルするまででおk?
意味不明
>>515 void test( float inVal )
{
EndianF32 ret = ConvertF32( &inVal );
fwrite( &ret, sizeof(float), 1, fp );
}
とやれば、希望する結果が出るのではなかろうか。
>>520 コンパイルしてから何かを気にしたとして、それでどうするつもりだ
524 :
デフォルトの名無しさん:2008/10/02(木) 00:57:10
いざ、リンクしてみたら、コンパイル済みのオブジェクトファイルが
おかしな変数宣言しすぎてメモリ不足になるとか気にしてるのかな?
525 :
デフォルトの名無しさん:2008/10/02(木) 01:02:05
そういう目に遭ったことがないのか? うらやましい
526 :
デフォルトの名無しさん:2008/10/02(木) 01:05:07
メモリ不足解消するのなら、標準関数は変数へいったん代入するとだいぶ変わるらすい。
527 :
デフォルトの名無しさん:2008/10/02(木) 01:17:56
int a = printf;
a("imi wakaran");
int(*a)(const char*, ...) = printf;
a("naniga kawarun daro");
530 :
デフォルトの名無しさん:2008/10/02(木) 02:27:15
void_No4様がきましたよ。
俺は天才、そしてIQは400↑、すげーだろ
すごいね
俺の半分もあるじゃん
またメンサか
>>515 エンディアン云々以前に、ポインタを学んだほうが。
>val.b[0] = ((Endian32 *)inData)->b[3];
inData が指してるのは float (多分4バイトしかない) なわけだが。
535 :
デフォルトの名無しさん:2008/10/02(木) 13:43:09
つmemrev
536 :
515:2008/10/02(木) 13:54:06
うにおんっていまいちクールなつかいかたがわからないよね
regs
539 :
デフォルトの名無しさん:2008/10/02(木) 17:17:48
企業秘密です
>>537 一つの領域を複数の型として使えることが共用体の意味だからそのように使えばいい
具体的にはサイズが同じ複数の型からなる配列などがある
intとfloatが不定間隔で現れるようなフォーマットのデータを扱うときに便利
でもそれって値を取り出すときにintなのかfloatなのかわからなくない?
floatにキャストしちゃえ
>>541 そういうフォーマットは、たいてい先行するintの値によって
その後いくつfloatが来るのか決まってる
たいていじゃなくて、規則性がなかったらどうするの?
何も手がかりが無いのにそんなことしないわw
>>544 規則性がなかったら無理
そうじゃなくて、floatが先行してintが混ざる場合もあるという意味
構造体のメモリ確保をしたいのですが、
コンパイルできません。
visual C++ 2008 express editionです。
ソース
struct list
{
int data;
struct list* next;
};
newcell = malloc( sizeof(struct list) );
>>547 問題の起こるソースコードとエラーメッセージを書けよ
newcell = (struct list*)malloc( sizeof(struct list) );
キャストすれば
newcell = (LIST *)malloc( sizeof(struct list) );
ありがとうございました。
キャストしたらできましたm(’_’)m
554 :
kazu:2008/10/02(木) 22:38:31
独学ではじめた者です。
練習問題
・数値を複数回入力し、最後に"END"と入力された後、それぞれに対し
80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"
と表示されるプログラムを作成しなさい。
例) 25(enter押下)
90(enter押下)
73(enter押下)
END (enter押下)
25 normal
90 verygood
73 good
という問題なんですが、
正解が分かりません。
本にはヒントとして
1 文字の入力にはgets()という標準関数を使用する。
2 "END"との比較にはstrcmp()という標準関数を使用する。
3 文字を数値に変換するには、atoi()という標準関数を使用する。
4 繰り返し文(for、while文)とbreak文
と載っていました。
どなたか教えていただけないでしょうか?
よろしくお願いします。
その本は模範解答載せてないのか
不親切だな
>>554 char s[10000];
int x[10000];
int i, j;
for (i = 0; i < 10000; ++i) {
gets(s);
if (strcmp(s, "END") == 0) break;
x[i] = atoi(s);
}
for (j = 0; j < i; ++j) {
if (80 <= x[j] ) {
printf("%2d verygood\n", x[j]);
} else if (60 <= x[j]) {
printf("%2d good\n", x[j]);
} else {
printf("%2d normal\n", x[j]);
}
}
558 :
kazu:2008/10/02(木) 23:35:55
560 :
デフォルトの名無しさん:2008/10/03(金) 00:42:03
stopppp4ststartcommandoperation2ppppppppppppppppppppppppppppppppppppppppppppppppppppppppPPPPpppp
stopp stack stack stack stack chr dir 2
sometime printf troff terminal fuu サーバーに接続します ターボコマンドをおねがいします
cdプレイヤーの接続名をきにゅうしてください
PL2 メーカーはマランツ 88 pl2の意味をおかきください
初期モデル
プレイヤーの搭載位置をおかきください マウント22 日本製と認識しました
ではくわしい おんしつを おかきください ひらがなでおかきください
じどうにんしきソフトをきどうしてください きどうご じどうちょうせいに はいります。
おわります どうもありがとうございました。
eth:0 それでけっこうです
エンファシスをクリヤモードにいたします。
., -、,. -─- 、⌒〉
{ } ヽ_ r'⌒)
ヽ、 ,,-‐‐ ‐‐-、 iヽ、 J
{ 、_(o)_,: _(o)_ヽ/ ヽ/∪
! >:: } / 丶
l /( [三] )ヽノ‐''> < つわぁぁぁああああ!
i⊂}__ `二´‐'´__/__
ヽ ‐- 、二`ヽ/〉⊂ニニ⊃)
| // ̄ ̄)j~U^∪ヽ
ノ ` ‐-L!--‐''(´ )
`i''ー----‐ ''"´ ヽ、__/
! } ` }
!. , -‐- 、. ノ--─ ' はちみつだと思ったら味噌だった〜
ヽ、_{. `ヽi'⌒i
`''‐- 、.. __,!
562 :
デフォルトの名無しさん:2008/10/03(金) 03:51:38
すいません、LSI‐C86試食版を落として使ってるんですが
なぜかプログラムをコンパイルして実行すると日本語部分だけ
文字化けしてしまいます
chcpでいろいろとコードいじったりしてみても効果なしです
ググったりしたんですがそう言った情報はまったく載っていません
どなたか教えてください
ちなみにOSはVistaのホームベーシックです
よろしくお願いします
そんなもの使うな
VC++かMinGWを使え
文字化けする最小のコード貼ってみてよ
makeが成功したら実行と言う場合
make && ./a
と言うのが定石だと思うんですが./aを明示せずにmake自身に
(開発中にテスト的に)実行させるような一般的な表記ってありますか?
とりあえず
make && make run
ってやってます。
566 :
デフォルトの名無しさん:2008/10/03(金) 10:49:32
make build test
567 :
デフォルトの名無しさん:2008/10/03(金) 13:49:45
いまどきLSI-Cとかまだ使ってるんだ。。VC++のExpressEditionがあったり
意外としられてないけど、.NET FrameworkSDKはコマンドライン開発専用のコマンドラインがあるのにね。
入門書をそのままなぞってるんじゃない?
int main(){
570 :
デフォルトの名無しさん:2008/10/03(金) 14:40:38
int main(){
double hoge[256];
func(hoge);
}
int hoge(double data[])
}
これはアドレス渡しですか?それとも配列のデータをコピーして渡していますか?
int hoge(double data[]) {
}
int main() {
double fuga[256];
hoge(fuga);
}
だと思うんだが基本はアドレス渡し
hogeはプロトタイプ宣言されていると考えてください。
アドレス渡しということはメモリの無駄は発生しないということですか?
>>572 まあ、配列は内部的に見るとポインタで持ってるしなあ。
配列全体のコピーが作られるかと言う意味なら作られない。
逆に言えば関数内で不用意にいじると配列が破壊される。
配列の中身を見たいだけなので、書き換えたりはしないです
どうも!
571だけどプロトタイプ宣言に噛みついたんじゃなくて
配列名と関数名が一緒ってのが気になったのよ
納得できたようでなにより
そもそも関数名が違うしなw
>>576 すいません。適当に書いたんで一緒のなめえになっちゃいました
なめえww
らめえww
中国人ですね。わかります
>>575 書き換えないことが確定的ならconstをつけておけ
int hoge(const double data[]) {
}
int main() {
double fuga[256];
hoge(fuga);
}
こうですか?
>>582 そう
>hoge(fuga);
このときhogeに渡っているのは &fuga[0]
つまり配列の先頭の要素のアドレス
constを付けずにhoge内でdataの中身を変更するとfugaの中身も変更される
アルゴリズム概論って言う授業で
システムを想定せよ、っていう宿題が
でたんですが,何を書けばいいでしょうか?
それだけじゃ何を言ってるのかわからないから三倍に書き足して宿題スレで聞け
WinLibD.lib(Misc.obj) : warning LNK4099: PDB 'vc80.pdb' が '..\WinLib\lib\WinLibD.lib' で、または 'c:\Documents and Settings\\デスクトップ\VS2005対応版\chapter5\Debug\vc80.pdb' に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。
このエラーはどうすれば回避できますか・・・?
回避すべきエラーが存在しません
エラーじゃなくて警告な
ライブラリにvc80.pdbが含まれてなかったなら諦めるしかない
本当に初歩的なことで申し訳ないのですが
整数を入力してその整数の桁数を使う必要があるのですが
どのようにして桁数を取り出せば良いのでしょうか?
intの限界の桁までforで調べるという方法しか思い浮かばないのですが
もっと効率の良いやり方はありますか?
常用対数
10で割るループ
>>592 あーそういえばありましたねそんなの
文系なもので忘れてましたwありがとうございます
>>593 どうもです
文字列にしてstrlenとか
(int)log10((double)num)+1;
log10()は書くのは楽だけど効率いいかは疑問
598 :
デフォルトの名無しさん:2008/10/04(土) 12:54:31
char test[]="FF" //16進数のFF(255)
これをint型の255に変換したいんですが
どうしたらいいでしょうか?
atoiだと "123" という文字列は
変換できますが、aとかbとか入ってくると
そこでatoiが終わってしまうし・・・
これってどういう意味名でしょうか・・・?構造体っていうのはわかるのですが
typedef struct {
float x,y;
} FPOINT, * LPFPOINT;
>>600 その構造体で使えるポインターも同時に宣言
こう書くのと同じ。
typedef struct {
float x,y;
} FPOINT;
typedef FPOINT *LPFPOINT;
603 :
600:2008/10/04(土) 13:03:07
なるほど!
ありがとうございます!
604 :
デフォルトの名無しさん:2008/10/04(土) 13:03:11
- Mozilla Public License 1.1
- GNU General Public License 2.0
- GNU Lesser General Public License 2.1
のトリプルライセンスの場合、
ソースコードを付ければ、自由に改造や配布して良いんですか
605 :
デフォルトの名無しさん:2008/10/04(土) 13:09:55
>>597 unsigned int log10(unsigned int a)
{
unsigned int n = 0;
a /= 10;
while(a)
{
a /= 10;
n++;
}
return n;
}
606 :
600:2008/10/04(土) 13:10:54
typedef struct {
float x, y;
} FPOINT*, LPFPOINT;
これでも同じですか?
>>604 変更した場合は、名前を変える必要がある。
>>606 int FPOINT, *LPFPOINT;
というのと同じ
これを
int FPOINT*, LPFPOINT;
にはできない
この場合の*はポインターを宣言する際に使うのでかならずポインターの前に置かないと駄目。
611 :
デフォルトの名無しさん:2008/10/04(土) 13:46:26
>>607 改造した場合、以前の名前と別にしてソースコードを付けたら良いんですか?
あとライセンスは、一つも減らさず、少なくともトリプルライセンスになりますか
ライセンス関係は、Linuxとかunix板に詳しい人が多そう。
613 :
デフォルトの名無しさん:2008/10/04(土) 13:51:45
好きなの選べ、じゃなかったか?複数選択も含めて
614 :
デフォルトの名無しさん:2008/10/04(土) 13:52:44
dクス unix板にいってみます
strcpyで教えて欲しい
↓これだとうまくいくんだが
char aaa[]="abcde12345";
char bbb[100];
strcpy(bbb,aaa);
最後のstrcpyを
strcpy(bbb,aaa[2]);
ってな感じにすると強制終了してしまう
aaaの2だから 'c' がbbbにコピーされると
考えてるんだけど・・・
こういう場合、ポインタ使わずには出来ない?
616 :
デフォルトの名無しさん:2008/10/04(土) 15:25:58
&aaa[2]
>>615 &aaa[2] にすると "cde12345" がコピーされる
'c' だけをコピーしたいなら b[0]=aaa[2]; (必要ならこれも追加 b[1]='\0';)
strcpy(bbb,&aaa[2]);
ちw
はえーな
620 :
618:2008/10/04(土) 15:28:14
strcpy(bbb,aaa[2]);
というかこれワーニングとかでるだろ?
ワーニングだってさ
>>615 strcoyの実装例
よく分からなかったらポインタを勉強すべき
char *strcpy(char *s1, const char *s2)
{
char *p = s1;
while (*s1++ = *s2++)
;
return (p);
}
bug hakken
strcpy(bbb,aaa+2)
でもおk?
c から後ろの "cde12345" を全てコピーするつもりならそれでいいな
strncpy(bbb, aaa+2, 1);
質問です。すいません。
int A[10]={5,0,0,0,3,0,0,0,2,9};
int sum=0;
for(i=0;i<10;i++){
if(A[i]!=0){
sum+= A[i]*A[i];
}
}
このプログラムはIF文によって速くなりますか?
>>627 何がしたいかさっぱり・・・
エスパーな読みだと配列の0は処理をしたくないってことなら
for(i=1;i<10;i++){
sum+= A[i]*A[i];
}
>>627 配列の長さ増やして試した方が良いけど
普通は比較より代入のが遅いうえに、掛け算もすることになるので
ifつけたほうが早いんじゃないかとはおもう
0がその割合なら
632 :
デフォルトの名無しさん:2008/10/04(土) 20:20:26
ゼロ除外が条件なら if 要らねーじゃんwww
>>627 ・プロファイラやタイマを使って計測
・使ってるCPUとコンパイラごとにアセンブラを吐かせて確認
これに尽きる。
妄想であれこれ言ってもどうにもならない。
速度で困っていない部分をちまちまいじっても得るものはない。
関数の定義の部分で
void sum(int a, int b){
int t;
t = a+b;
printf("%d",t);
}
このようなものがある場合、void sum(int a, int b)の中のa,bは仮引数というのはわかるのですが
t = a*b; のときの a,bも引き続き 仮引数と読んでいいものなのでしょうか??
よろしくお願いします。
637 :
デフォルトの名無しさん:2008/10/04(土) 23:10:33
w
638 :
430:2008/10/05(日) 00:11:09
for(i = 0; (a[i] = getchar()) != EOF && a[i] != '\n' && i < MAX - 1; i++)
;
こういう文字入力の仕方ってありなのか?それとも
for(i = 0; (b = getchar()) != EOF && b != '\n' && i < MAX -1; i++)
a[i] = b;
こんなしなきゃ駄目なのだろうか?
>>640 はしょると
前者はunsigned な変数に -1を突っ込む危険がある
>>641 すみませんはしょらないで教えてくれませんか><
前者はaにEOFが入るかもしれない
後者はその心配が要らない
>>643 なるほど、確かに
ありがとうございました。
for文 (式){
if文 (式){
・
・
break;
・
・
]
}
上のようにあった場合、breakはfor文を抜けるのしょうか?
それともif文を抜けるのでしょうか?
forを抜ける
ifには関係ない
>>646 どうもありがとうございます。
助かりました
そんなのいちいち試してたらこのスレの必要性がなくなるじゃん
この辺りで悩んでるレベルだと自分で書いた確認コードにも自信がもてないと思うけどね
確認コードを確認するコードを書けばいい
>>648 試してわかることかどうか本人がわからないから聞くんだろ
試してないだけだろ
成長する見込みの無い奴はどんどん甘やかして駄目にするのさ
ほかの言語ではともかくCには処理系定義とか未定義とかあるから
まず試してみるというのは必ずしも正しいやりかたじゃない
ためすか、2chで訊くかの二択だったら、ためせばいいんじゃね?
ほうほう、それでそれで?
#include <stdio.h>
int main()
{
int i = 5;
goto pppp;
for (i = 0; i < 100; ++i) {
pppp:
printf("f\n");
}
return 0;
}
f
がいっこしかひょうじされませんなんででですか
たまたま
>>658 VC8で動かしたら、いっぱいfが出たよ。
最適化のバグかなんかかね?
ブロックの中に飛べるとは知らなかった。へー ふーん
でも一生使わないな
未定義動作だから
みていぎどうさだとなんでfがいっこひょうじされるんですか
664 :
デフォルトの名無しさん:2008/10/05(日) 03:58:02
うるさい未定義動作をしても鼻から悪魔が出てこないだけマシだと思え
gccだと期待通り動くな。しかも警告も出さないし。
gccは正常なコードとして処理してくれるのもしかして?
マジで未定義?
良かったらどういう理由で未定義なのか教えてくれない?
§6.8.6.1の3かな
kwsk
669 :
デフォルトの名無しさん:2008/10/05(日) 09:37:25
関数の戻り値で質問です。
char *buf; と定義されていて、これをリターンする際に、
アドレスではなく文字列として渡したいとします。
bufは消滅しても渡せるようにです。どうすればいいですか
>>669 文字列も配列なんで渡すのは先頭アドレス
char const *retstr()
{
return "リテラルならOK";
}
char *retstr()
{
return strdup("mallocして返す。呼び出し側でfreeする必要あり。");
}
char *retstr(char *buf, size_t bufsize)
{
return strcpy(buf, "呼び出し側でバッファを確保する。Cではこれが無難。");
}
672 :
デフォルトの名無しさん:2008/10/05(日) 09:58:42
値を渡しきる(コピーする)まで、生存してるって言うのは無理なんでしょうか
typedef struct { char value[256]; } str255;
str255 retstr()
{
str255 ret; strcpy(ret.value, "こんな無理やりなことやってないで郷に入っては郷に従え。");
return ret;
}
main(){
str255 s = retstr();
printf("%s\n", s.value);
}
675 :
デフォルトの名無しさん:2008/10/05(日) 10:04:06
値を入れるアドレスを引数として渡す方法ですね。わかりました。これにします。
676 :
デフォルトの名無しさん:2008/10/05(日) 10:05:48
677 :
デフォルトの名無しさん:2008/10/05(日) 10:30:44
char *a;でアドレスが決定されている後で、strcpyをした場合の質問です。
もし、aのアドレスの10バイト先には別のデータが入っていたら、10バイト以上のデータは入れられないですか?
>>677 >aのアドレスの10バイト先には別のデータが入っていたら、
これの意味がよくわからん
679 :
デフォルトの名無しさん:2008/10/05(日) 10:36:15
aの示すアドレスが1000番地だとします。 1010番地からは、char *bのデータ "こんにちは"
が入っていてそれが解放されていない場合です。
>>679 そういう連続性がある場合は*aで*bのエリアもいじれちゃいます。
同じ処理内容だったらループと再帰よびだしってどっちがいいの?
ループ
>>681 組み方にもよるが、関数呼び出しはコストが増える(コンパイルされたマシン語レベルでの話)
パフォーマンス面では断然ループの方がいい。
関数呼び出しのオーバーヘッドも大きいし何よりスタックを浪費する。
ただ再帰の方がコンパクトで読みやすく書け、それほど上記の欠点が大きくないなら再帰の方がいい。
末尾再帰で書けたら、ループと同等に最適化されるしな。
百年後ぐらいにはCはどうなってるのかな
>>667 thx
しかしJISのC99には3.8.6.1の3が無い・・・。
ISOの方はExample1だった。(段落番号3)
C89持ってないんだけど、もしかして規格変わったんかな。
C89、どこかで見れないものか。
半角文字とマルチバイト文字が混ざった文字列を裏返すのって、
どうやってやるんでしょう・・・?
長さは変わらないんだから
同一長のバッファを取って前から走査して後ろから詰めていく。
>>690 Unicodeでも組み合わせ文字とかがあるから、必ずしもそのまま逆順に出来るわけじゃない。
>>692 文字種を変えるために制御コードが必要な文字コードなどは、長さが変わる可能性がある。
そろそろ文字コード統一してほしいよ
>>695 統一はしようとしてるよ。
でも古い言語がいまだに使われてるように、なかなかシフトできないんだよ。
統一のは4バイトの文字コードだっけ?
世界のコンピューターユーザの九割以上が文字コード問題に不便を感じていない現状
日本ぐらいなもんだよテキストとバイト列の関係を最終ユーザがこんなにも意識し理解しているのは
>>697 まーなー
日本人は日本語を使おうとするが中国韓国でも英語でOKって人多いから
半角コードあればできるんだよなw
三国人は黎明期に関わってないからレガシー引きずる事例が少ないもんね
そんなこともないんだけど普及率の面から言えばやっぱりあれだね
日本は80年代にOA化が進んだから
すいません質問です。
errno_t err;
という宣言(?)があったのですが、これは何を表しているのでしょうか?
>>700 PC98には今のS-JISの元の漢字コードはすでにあったしね.
>>701 errno_t型のerrという変数を宣言している
int x; のようなもの
どこかに
typedef ○○ □□ errno_t;
こんなのか
struct errno_t {
...
}errno_t;
こんなの
enum errno_t { ... };
こうかも
ヘッダgrepしてみれつー事だわ
708 :
デフォルトの名無しさん:2008/10/05(日) 22:17:46
6.8.6.1はvariably modified typeの宣言を飛び越すのを禁止しているだけだ
>>658のは問題ない
Cでローグライク書いたら何行ぐらいになるの?
>>703 ググってみたらそれらしきものが見つかりました。
ありがとうございます。
すいません質問です。
char str[] = "test";と宣言しまして、それから
printf("%s",str);
と入力しましたところ、そのまま"test"と出てしまいました。
配列のなかにそれぞれアルファベットが入っていることは理解できたのですが、
%sと打っただけでそのまま文字列が出力されるのかが理解できません。
str == &str[0] とのことですが、%sとは配列の中に入っている文字を順番に吐き出してくれる
モノということで合っているのでしょうか?自信がないもので・・・
君はCASLから勉強したほうがよさそうだね
>%sとは配列の中に入っている文字を順番に吐き出してくれる
>モノということで合っているのでしょうか?
読み手として随分と端折った感じを受けるが、回答としてはyes.
渡したアドレスから'\0'まで表示してくれる
718 :
デフォルトの名無しさん:2008/10/06(月) 12:15:54
>>713 int i;
char str[] = "test";
for(i = 0; i < 4; i++) printf("<%c>", str[i]);
これを試してみろ
>>713 Cで言う「文字列」とは、連続したメモリ空間(いわゆる配列)の先頭から
文字を表すデータが順に詰め込まれて、最後にヌル文字('\0')で終わるものを言う。
そしてほとんどの文字列操作は、その先頭から始めて'\0'を見つけたらやめるという動作をする。
だからCで「文字列を指している」と言ったら「文字列の入っているメモリの先頭を指している」ことを意味する。
そして配列には、その名前が配列の先頭を指すポインタに変換されるという特別な規約があるので、
文字列の入った配列そのものを文字列、あるいは文字列を指していると呼ぶことがある。
printf書式の%s指定子は、対応する引数を文字列を指すポインタとみなして
そこにある文字列を(当然、'\0'まで)出力するという働きをもつ。
だからprintf("%s",str)と書いたら"test"と表示される。
HRESULT SetDefaultParamBOOL(int n, BOOL param) {return m_effect->SetInt(m_hParam[n], param);};
クラスの中でSetIntというのが定義されてないのですが
なぜアロー演算子で使えてるのでしょうか?
コンパイルもできます。(書籍のサンプルプログラムより)
>>720 C++だけど
m_effectのクラスのメンバ関数だからでしょ
722 :
720:2008/10/06(月) 20:04:54
スレ違いすいません。
>>721 ありがとうございます。
そういうことでしたか!
だれか組み込み用のスクリプトCを作ってください
struct D3DXFRAME_DERIVED: public D3DXFRAME
{
D3DXMATRIXA16 CombinedTransformationMatrix;
};
構造体にpublicを使っているのですがこれはどういう意味ですか?
725 :
デフォルトの名無しさん:2008/10/06(月) 21:18:20
SetInt が関数ポインタという場合もある
726 :
デフォルトの名無しさん:2008/10/06(月) 21:19:09
文字列中じゃないところの\の効果ってってその次の文字を無かったことにするってことでいいんですか?
#define の後に\マークついてたら、複数行のマクロ
>>728 それは行末に\じゃないと効果がないから改行を消してるのかと思ってましたが
違う
改行の前に書いたら改行をなかったことにするだけ
>>729-730 複数行マクロじゃなくて、その後についた改行コードを消した結果マクロが複数行になるのか
これはいいことを聞いた
勘違いしてたよ、ありがとう
マクロ以外でもなっがいリテラルを書くのに使ったりするね
プリプロセッサで働くのでリテラル中のエスケープシーケンスとは混同しない
>>733 確かに使えるけど普通に文字列リテラルの自動連結使ったほうがいいよ
字下げできるし
ソースを一字でも短くしたいときに使う
736 :
713:2008/10/07(火) 01:09:23
ほんとに入門で申し訳ないんだけど
#include <stdio.h>
int main()
{
char c;
int i;
double d,e;
printf("変数cのアドレスは%pです\n", &c);
printf("変数iのアドレスは%pです\n", &i);
printf("変数dのアドレスは%pです\n", &d);
printf("変数eのアドレスは%pです\n", &e);
return 0;
}
ってやると書籍だと
c ******D3
i D4
e D8
d E0
と1バイト4バイト8バイトって増えた値になるはずなんだけどうちのPCだと
c ******63
i 54
e 44
d 34
と9,10,10と減った値になってるのは何故でしょう・・・。
アドレスの割り当てはコンパイラの機嫌次第
>>738 ちょっとその本は当てにしない方がいいのでは…
740 :
737:2008/10/07(火) 11:53:51
ちなみにこの本の各章の終わりの練習問題があるんだけど
答え見ても納得できないと思ったら答えのプログラムが間違ってたり練習問題なのに習ってもいない文字がでてきたりで困る・・・
c++のお勧めの入門書とかある人は教えてくれたら嬉しかったり・・・
>>740 本よりネットのサンプルでもいいじゃないかな?
本は基本的なことは学べるけど内容が古かったりと・・・
742 :
737:2008/10/07(火) 12:17:38
>>741 ありがとう。
書籍だと書籍代もかかるし「プログラム 入門」でネットサーフィンしてくる。
ニコ動の誘惑になんて負けないぜ。
配列のアドレスを調べるってならまだ分かるけど、入門書に
>>737みたいなこと書くか?
著者名さらしてほしいw
というかその書籍さらしてよ。
書籍よりむしろそのコンパイラの割り当てのほうが気になる
そんな積み方もするんだ?
なんかその上の桁は増えてる気がするけどな。
同じブロックで宣言されてる局所変数は全く対等だから、
逆順に積むコンパイラがあってもおかしくはない
構造体のメンバへのポインタの説明を誤読してる可能性もあるかなぁ。
>>748 いや、気になってんのは配置間隔のほう・・・って64ビットマシンだからか?
上の例だと間隔は128ビットだから64ビット機かどうかはたぶん関係ない
コンパイラの設定だと思うけど
%pが8進出力という可能性もある。
あー、うちで試したら
Debugビルドだと
>>737の後者、Releaseビルドだと前者になったわ
VisualC++ 2008を32bitでやってみた
64bitだと、Releaseで50 58 20 28、DebugでE4 04 28 48 (E4の次で桁上がり)
756 :
デフォルトの名無しさん:2008/10/07(火) 18:35:51
fopenとfcloseしたファイルが、アクセス制限から解放されるまで待つにはどうすればいいですか?
757 :
756:2008/10/07(火) 18:46:14
C/C++言語のファイル入出力を使うと、ファイルを閉じたのに
所有権が解放されていない現象がよく起こるんですけど・・・
758 :
デフォルトの名無しさん :2008/10/07(火) 18:47:11
>>756 Cにはアクセス制限なんて概念はありません。
環境依存スレか、環境ごとのプログラミングスレへどうぞ。
760 :
756:2008/10/07(火) 18:54:42
>>758 ファイル操作をして、ちゃんとクローズしたのに
そのファイルを次に開くとき共有エラーになるって事です。(ファイルを読み込めない、書き込めない)
761 :
756:2008/10/07(火) 18:56:11
>>759 実際に、読み込めないんです。 windows XPです。
なったこと無いな
ソース上げてみて
>>760 こんな簡単な奴でも同じ症状になる?
#include<stdio.h>
int main(void){
FILE *fp;
if((fp=fopen("hoge.txt", "w"))==NULL) return 1;
fprintf(fp, "hello\n");
fclose(fp);
return 0;
}
764 :
デフォルトの名無しさん:2008/10/07(火) 19:01:10
起こるのは閉じた瞬間に、次のオープンをするときです。
今のソースは長くてちょっとうpはむりです。
C++では、その様にして回避してました。 fp.close(); while(fp.fail())Sleep(100);
C言語では、fp.fail() の代わりが見つかりません。
fclose(fp); while(ferror( fp ))Sleep(100); では、エラー無しで通り抜けてしまいました。
765 :
デフォルトの名無しさん:2008/10/07(火) 19:02:28
起こるサンプルを作ってみます。
>>764 windowsのようなOSの場合IOはプログラムの動作より遅いので
次のopenの際にはまだ前のcloseが終わってないというのがあるのかなあ?
そういう場合は次のopenに関してはリトライを数回やるロジックにするとか?
767 :
766:2008/10/07(火) 19:04:49
>windowsのようなOSの場合IOはプログラムの動作より遅いので
ごめんちょっと変だな。
マルチタスクOSの場合プログラムの実行より低速なI/Oを処理した場合は
プログラム的には関数から正常リターンをもらっても
I/Oのほうでは完全に終わってないケースもありえる。
そんな事があったらあらゆるアプリで障害が起きてる気がするんだが・・・
>>764 XPでうまくいってしまうんだが
#include<stdio.h>
int main(void){
FILE *fp;
char buf[256];
if((fp=fopen("hoge.txt", "w"))==NULL) return 1;
fprintf(fp, "hello\n");
fclose(fp);
if((fp=fopen("hoge.txt", "r"))==NULL) return 2; // ここで失敗するってこと?
fgets(buf, sizeof(buf), fp);
printf("%s\n", buf);
fclose(fp);
return 0;
}
>>764 fp.close()でfp.fail()するなら、fclose()の戻り値を見ろよ。
771 :
768:2008/10/07(火) 19:07:39
>>768 windowsってセマフォじゃないのかもしれないが、そういう開放が
若干遅れると実ファイル側は保存終わってても、握ってるようにみえないか?
そのファイルが、ネットワーク越しに開かれているとか。
アセンブラレベルの割り込み処理とかならあり得るかもしれないけどWin32上でそんな事あるのかなぁ
IRQとかでも割り込み禁止にして処理すると思うんだが
ウィルス対策ソフトの行儀が悪いとか?
775 :
756:2008/10/07(火) 19:18:34
再現できるコードは作れませんでした。
>>770 fclose()kの戻り値は正常だったのですが、次のアクセスが失敗してしまいました。
意味不明な挙動だから
バッファオーバーフローとか未初期化ポインタの操作で
コード領域をいじってしまっておかしくなってるんじゃね?
777 :
デフォルトの名無しさん:2008/10/07(火) 19:32:26
問題の起こるところを切り出して単独で動かしてみると正常でした。
ほかのファイルと一緒にコンパイルして、別ファイルでファイル入出力すると駄目になります。
マルチスレッドが関係あるかも知れないです。
>>777 オープンエラーになる関数をリピートしてみたら?
779 :
デフォルトの名無しさん:2008/10/07(火) 19:43:33
駄目でした。 50ms間隔で50回までオープン出来るかやってみたのですが
一度も開けませんでした。 fcloseの行は実行されているんですが
780 :
デフォルトの名無しさん:2008/10/07(火) 19:47:29
いままでの経験からwindows APIを直接使うとこの様な事は起こりません。
C言語のソースがあるんですがファイル入出力の関わる部分をすべて書き換えるのは大変なので
fgetsなどを自作してそれで置き換えようと思っています。
781 :
デフォルトの名無しさん:2008/10/07(火) 19:50:07
ファイル操作はstdio.hに入っていたんですね。そしたら全関数を書き換えなくてはならなくなりました。
断念します。
原因はファイル操作と全く別にあると思うのだが…
間違いなくプログラム内部でなにかやらかしてるはず
今のマシンとOSでそんなロックかかることなんてない
784 :
デフォルトの名無しさん:2008/10/07(火) 20:02:26
原因の解明は出来そうにないので、部分的に一から作り直そうと思います。
ところで教えてもらいたいことがあるんですが、入出力ライブラリで良いやつ無いですか?
C/C++は、駄目と思います。同時に開けるファイル数は200-300位ですし
バッファの管理も上手くないと思います。 少量の書き出しが頻発する場合、
自前バッファ+WinAPIにした方が速いので。安定しているいいやつありますか
マルチスレッドが関係あるかもしれない、が凄い気になるんだが
自分で使ってる環境も書かずにライブラリが糞もないもんだ
数百以上のファイルを同時に開くって一体何をやらかそうとしてるんだ
788 :
デフォルトの名無しさん:2008/10/07(火) 20:12:52
今回、数百開く必要があるわけではないのですが、C言語では200幾らかが限度だったはずです。
WinAPIだと3万ファイルくらい同時に開けたのですが。
789 :
デフォルトの名無しさん:2008/10/07(火) 20:14:52
あと長いファイル名、unicodeに対応していないのが大きな欠点ですね。いいファイル入出力ライブラリありますか
> 長いファイル名、unicodeに対応していない
今時いったいどんな処理系使っているんだ?
さすがにUnicodeは_wfopenとか独自拡張でやるしかないけど。
というか釣りだなこれは
釣りじゃないんなら明らかにスレ違いだからとっとと消えろ
792 :
デフォルトの名無しさん:2008/10/07(火) 20:25:55
C言語は250文字程度しか扱えなく無いですか?
CreateFileAを利用していたらその位ですよ。 内部ではCreateFileW使っていますか
お帰りください
それが嫌ならCを使うな
以上
libc自分でかけばいいよ
何しにきたんだw
要は、>759が全てだな。
798 :
デフォルトの名無しさん:2008/10/07(火) 20:47:19
C++でメモリアロケータ作るみたいに入出力を書き換えられますか?
帰れよ
800 :
デフォルトの名無しさん:2008/10/07(火) 21:22:33
カエルは帰る
>>792 VCとかBCCとか独自にワイド文字列引数にとる_wfopenってのがあって、
そっちだと内部CreateFileWになっている。
>>798 C++スレいけ
typedef int (*hoge001)(int *,int);
typedef int (*hoge002)(int);
typedef int (*hoge003)(int *,int);
typedef int (*hoge004)(int,int,int);
・
・
・
超初心者ぽい質問の予感ですが、
上記のようなコードってどういう目的があるんでしょうか?
>802
「intを返す函数へのポインタ型」としてhoge???というtypedef名を宣言している
それぞれの違いは引数の型と数
>>802 文法的な意味じゃなく何の為にって事なら
一連の関数のセットの実装をそっくりすげ替えられるようにする為。
例えばmalloc/freeの性能が悪いからそっくり自分の書いた高性能メモリマネージャに変えるとか
printf/getsなんかの入出力をコンソールではなくダイアログボックスで行える用にするとか。
まあこの例は出鱈目だけど目的としてはそんな感じ。
後は .so/.dll で動的に関数のつまったファイルを後からロードして
関数ポインタにそのアドレスをセットするとか。
typedefなんだから、「関数ポインタをかえす関数」の記述を
判りやすくするため、とかかもしれないけど。
#define で定義したものは #undef で定義を消せますが、
typedef で定義したものを消す、もしくは定義を上書きすることは出来ますか?
できない。
#define type my_type
で無理やりしのげないこともない
>>764 Winの遅延書き込みは共有の問題とは関係ないと思う。
ファイルをクローズしたときに、ワクチンソフトやバックアップソフトが何かやってるんじゃないかな?
共有エラーが発生した場合は、少し待ってからリトライするという方法が一般的と思う。
callocで二次元配列的にメモリを確保して、メモリが確保できなかったときは
メッセージを出すにはどうしたらよいでしょうか?
>>814 どういうメッセージが出せるかはどういう開発環境なのかで代わる。
領域確保できたかできないかは関数のリターンで確認汁
816 :
814:2008/10/10(金) 16:43:31
一次元なら
int *a;
a=(int *)calloc(sizeof(int)*10000);
if(a==NULL){
printf("~\n");
exit(2);
}
こんな感じだとおもうのですが、こんな感じの書式で二次元にできるのかと
>>816 int (*a)[100];
a = (int(*)[100]) calloc(100*100, sizeof(int));
if (a == NULL) { printf("~\n"); exit(2); }
こんな感じ? それとも
int i, **a;
a = (int**) calloc(100, sizeof(int*));
if (a == NULL) { printf("~\n"); exit(2); }
for (i = 0; i < 100; i++) {
a[i] = (int*) calloc(100, sizeof(int));
if (a[i] == NULL) { printf("~\n"); exit(2); }
}
こういうやつか?
多次元配列 動的確保 でぐぐれ
char err[80] = "alloc err";
foo **bar;
int i;
if(NULL == (bar = malloc(sizeof(foo*) * d1 + sizeof(foo) * d1 * d2))){
puts(err);
exit(1);
}
for(i = 0; i < d1; i++)
*(bar + i) = (foo *)(bar + d1) + i;
free(bar);
*(bar + i) = (foo *)(bar + d1) + i * d2; だったわ
>>815-
>>820 みなさんアドバイスありがとうございます。試してみます。