1 :
デフォルトの名無しさん :
2009/10/29(木) 21:10:18 BE:227211146-DIA(352353)
ぬるぽ
NULL pointer exeption
C++がスレ違いというのは言い過ぎ
いいえスレ違いです
気に入らないならC/C++室スレにでも行ってください
7 :
>1乙 :2009/10/29(木) 23:26:00
テンプレ追加キボンヌ ↓ ここではC++言語は別言語と考えますので、スレ違いになります。 ただしC++言語のコード(拡張子=.cpp)をリネームしてC言語の コードとしてコンパイルできる場合はC言語のコードとみなします。
.cpp .C .cc
Linuxで作成した拡張子.cのファイルをウィンドウズで開くと 文字化けして見れないんですがウィンドウズ上で見る方法ないですか?
>>11 できました!こんな簡単な方法があったとは・・・
偽の条件式ってのは整数の0と同等に扱っていいんでしょうか? それと、真の場合は1とは限らないんでしょうか int x = ( 1+2 == 2 ); これはint x = 0と同じでいいのか、 int x = ( 1+2 == 3 ); これだと常にx = 1になるのか、教えてください
>int x = ( 1+2 == 2 ); これはint x = 0と同じでいいのか、 いい >int x = ( 1+2 == 3 ); これだと常にx = 1になるのか、教えてください なる
15 :
13 :2009/10/30(金) 01:25:30
どうもありがとうございました だとすると、今まで簡単に書ける式をわざわざif文とか必要ない変数とか宣言して書いてました
自信がない場合は条件演算子を使うのも一つの手です。 曰く、 int x = (1 + 2 == 2) ? 1 : 0; int y = (1 + 2 == 3) ? 1 : 0; 尤も、boolean型を作ってしまう手もありますが。 そもそもc99では標準で使えることですし。 stdbool.hが見つからないならこんな感じで作れます。 typedef enum {false, true} bool; bool x = 1 + 2 == 2; bool y = 1 + 2 == 3;
そもそもそんなの使う場面が無い。
double **dSData = NULL; dSData = new double*[100]; for(int i=0; i<100; i++){ dSData[i] = new double[100]; } という感じで動的な二次元配列を作ったのですが、 sizeof(dSmokeData[0]); とやるのと double dTest[100]; sizeof(dTest); とやるのとでは、sizeofの結果が違うのですが、なぜでしょうか?
括弧つけんなボケ
21 :
19 :2009/10/30(金) 21:27:03
訂正 sizeof(dSmokeData[0]); ↓ sizeof(dSData[0]);
23 :
19 :2009/10/30(金) 21:36:18
>>22 確かに型は違っています。
dSDataを使って
double dTest[100];
sizeof(dTest);
とした状態と同じ結果を表すにはどうしたらよいでしょうか?
>>23 double (*dSData)[100] = NULL;
25 :
19 :2009/10/30(金) 21:43:34
>>24 double **dSData = NULL;
ではできないんでしょうか?
dSDataはグローバル変数で、要素の数はソースの途中で決まるため、宣言時には指定できないのです。。
>>25 new とか使うってことは C++ でしょ?
STL の vector 使えばいいよ
27 :
19 :2009/10/30(金) 21:57:04
>>26 vector<int> v(100);
sizeof(v);
double dTest[100];
sizeof(dTest);
sizeof(v);とsizeof(dTest);の結果がやはり違います。
28 :
19 :2009/10/30(金) 21:58:28
訂正 vector<int> v(100); ↓ vector<double> v(100);
括弧つけるなアホ
int i; i = sizeof (int); i = sizeof i; だっけか?
32 :
19 :2009/10/30(金) 22:06:10
>>32 .size() で大きさは分かる
が、古いコンパイラだと vector の中身が連続領域じゃない可能性もある
え?ベクターって実装上連続であること保障されてないの?
プゲラ
>>34 古い仕様書には明記されていなかったから
実装がどうなっているかはコンパイラ次第とかなんとか
C++厨は巣に帰れ
自己参照構造体使って自作するのがC使い
39 :
19 :2009/10/30(金) 23:05:41
double dTest1[100][100]; sizeof(dTest1[0]); と double dTest2[100]; sizeof(dTest2); とやっても sizeofの結果が異なります。。
40 :
19 :2009/10/30(金) 23:30:45
↓ 誤爆です。間違ってました。合ってます。
それは誤爆といわない
要素数はわかってるんだから変数に保存しておけばいいだけだろ sizeofにこだわる必要はない
sizeofの値はコンパイル時に決まってないとだめだから実行時にしか決まらない値を得られるはずがない 関数じゃないんだからね
strcpy(a, (char)crypt("hogehoge", "EV")); これって何かおかしい?
なんでcharにキャストしてるの?
>>45 キャストされてないってコンパイラに怒られたから
test.c:11: warning: passing arg 2 of `strcpy' makes pointer from integer without a cast
>>46 crypt.hをインクルードしてないだろ。
>>47 #define _XOPEN_SOURCE
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
char a[100];
strcpy(a, (char)crypt("hogehoge", "EV"));
printf("%s", a);
return 0;
}
これで問題ないはずなんだけど一応全文を
キャストは(const char *)でしょ
tripkeyの文字コードが違うんじゃないの?
abcdではあってなくてkamiではあってるってのもどうなのかなぁ・・・
test
>>46 見てなんでcharにキャストしたんだろうな
馬○だから
泣いて馬○を斬る。
57 :
デフォルトの名無しさん :2009/11/01(日) 01:33:45
eclipseみたいにコードの誤りが表示されて、'{'に対応する'}'が 自動で生成されるシンプルなテキストエディタって何かないですか? IDEじゃなくて、コマンドプロンプトから実行できる、あと軽いやつで なにかおすすめはないですか?自分よくコードを打ち間違えるんすよ。
間違えるな
emacs
IDE だってコマンドプロンプトから実行できるだろ。
vim
vim以外使ってる奴は糞。特に日本人しか使ってない秀丸とかいう糞エディタ使ってる奴はking of 糞。
vim(笑)
さすがにVi(中身はViMだろう)で開発はきつい makeしたときのコンパイルエラーをちょろっと直す程度ならいいんだけどね ctagsですね、わかります
gedit最強
66 :
デフォルトの名無しさん :2009/11/01(日) 09:12:45
個人的な好き嫌いだけで糞とか決めつけてる奴って協調性低そう 客先から縛りをつけられたことがなくコードは常に1人で書いてるんだろうな
EDLIN 使えボケ
Cならvimが最強。
vimを使ってない奴は人生の貴重な時間を無駄に浪費している
1バイト言語圏の人ならな。
Emacs じゃダメなの?
うわあ、かなり頭の悪いレスが続いてるなあ いくら道具にこだわっても、そんな脳ミソじゃその人生自体無駄だろうね
あらゆるエディタを使い倒してきたエディタ神の俺だが、攻守最強形態vimだと悟りを得た。異論は認めないからそのつもりで。
これだから信者は。頭のネジが数えきれないくい抜けてるんだもん こんなキチガイが回答者の質問スレとか始まる前から終わってるわ
自分の頭の悪さを棚にあげて、人をキチガイとか煽ってるやつも消えてほしい。
そして、誰もいなくなった……
棚上げって、俺の頭の良し悪しは今問題じゃないし。信者がうざいってだけ。 俺はどのエディタ以外は屑とか思ってないから。
日本語でおk。
読解力0なら2ちゃん見るなよ
emacsはctrl-N, ctrl-P, ctrl-F, ctrl-Bの時点で糞。カスタマイズ前提の思想は受け入れられない。矢印キー移動のエディタも糞。ホームポジションから矢印キーに移動した時点で負け組みの証明をしている。
>>81 お前がそう思うんならそうなんだろう、お前ん中ではな
統合環境でそれなりに満足してるおいらにはわかんねぇべぇ
統合環境ってemacsのことだよね
85 :
デフォルトの名無しさん :2009/11/01(日) 16:21:18
テキストエディタ使ってコマンドプロンプトからプログラム実行しようと 思ったけど、やっぱり果てしなく面倒くさい。 テキストエディタってどれも安っぽくて、萎えるし。 シンプルで高級感があるソフトないんですかー><1日で挫折しましたよー。 誰かIDEのおすすめを教えてください。ちなみにC言語を勉強してます。 無駄な機能を省いた使いやすいやつないですか?
IDEとテキストエディタは別物なんだけどな。そして大抵IDE付属のエディタは糞。
>>85 VisualStudio2008ExpressEdition
すいません他のスレにも質問したのですがブックマークしわすれてて、探したんですけど見つからないのでこのスレで質問させていただきます。 「14歳からはじめるC++」という本で勉強しているんですが、エラーでコンパイルできなくてこまっています。 BCC DeveloperでDXライブラリをインクルードする設定をしました。 #include"DXLib.h" int WINAPI WhnMain(HINSTANCE hi, HHNSTANCE hp, LPSTR lpC, int nC) { ChangeWindowMode(TRUE); if (DXLib_lnit() == -1)return(-1); WaitKey(); DXLib_End(); return(0); } 以上のソースをコンパイルすると エラー E2268 〜 6:未定議の関数'DXLIb_lnit' 〜 エラー E2268 〜 8:未定議の関数'DXLIb_End' 〜 とエラーになります。かなりググッたんですがまったくわからず... どなたかアドバイスいただけませんか。 よろしくお願いします。
>>85 シンプルで高級感があるソフトを作れるようになるまでがんばれ!
いい目標ができたじゃないか
本当にエラーがその二つだけなら、 大文字と小文字間違えてるんだろ。 そも、誤字がひどいから明言は出来ない。
>>89 ソースとコンパイラの出力を全部そのままコピペして
って l と I もか、、、
i と I もだな
>>89 みなさんのおかげで解決できました。誤字でエラーだったんですね。xも小文字で。
丁重にみなさん教えていただき本当に本当にありがとうございました。
助かりました。
じゃんけんプログラムの次て、何作ったらいいんでしょうか? 初めてなので、なんていうか度合いがわかりません。簡単な計算プログラムしか作れない。。
>>98 ヒットアンドブロー(マスターマインド)とか呼ばれる数当てゲーム
頭こんがらがってきたのですが 例えば int i = 8;で char型のポインタにint型のiを代入したいんですが 上手くいきません どうすればいいでしょうか?
やりたいことは int i = 8; char* p = (char*)i; でいいの?
なぜそのようなことをしたいと思ったのか不思議だ
103 :
デフォルトの名無しさん :2009/11/01(日) 21:42:54
struct{ unsigned char AAA[10]: unsigend shor int aa; }BB unsgined char buf[500]; こういった変数があったとして、 struct BBの全12バイト、配列buf[300]-[500]の値を2バイトずつ加算して足して行き 最終的に足したものの2の補数を計算したいとおもうのですが 引数を一つとしてうまく渡す方法はないでしょうか? struct BBを足したあと、配列[300]からまた順次足していくみたいな structBBの終わりのアドレスの次が、配列buf[300]の先頭になるとかどうすればよいのでしょうか?
まず日本語の勉強をすると良いよ。
> structBBの終わりのアドレスの次が、配列buf[300]の先頭になるとかどうすればよいのでしょうか? 多分、期待してるようなのは無理。
106 :
100 :2009/11/01(日) 22:00:44
107 :
デフォルトの名無しさん :2009/11/01(日) 22:04:11
>>105 ではstructBBあるいは配列[300]以降のデータを書き換えると、それらのコピーが書き換えられるというのは
どうすればよいのでしょうか?
コピーstructBBの次が、コピーの配列[300]以降で、コピー元をかえると、自動的にコピー先も書き換えられるという
>106 制御文字
111 :
110 :2009/11/01(日) 22:20:10
コピー先と元を間違えてるんじゃね。 とりあえず、日本語の勉強をすると良いよ。
これは冗談でも煽りでも何でもない。 コードの目的を明確に言葉で表せないなら それをロジックで組むのも不可能だよ。
なんで引数ふたつにしたらまずいの?
115 :
デフォルトの名無しさん :2009/11/01(日) 23:07:58
>>98 じゃんけんが作れたなら次は格ゲーでもどうかな?
ほとんど同じ論理でグーチョキパーの数を増やしていくだけだぞ
>103 もしかしてこうゆうことがしたい? struct { struct{ unsigned char AAA[10]: unsigend shor int aa; }BB; unsgined char buf[500]; } wholeParam; こうやって関数の仮引数としてwholeParamを渡す。
struct{ unsigned char AAA[10]: unsigend shor int aa; }BB; unsgined char buf[500]; short int f(int x) { return x>=0 && x<6 ? ((short *)&BB)[x]:((short *)(buf+300))[x]; } buf[300]〜[500] だと突き抜けるから、 多分 [299]〜[499]のつもりなんだろうけど、 一応、書いてある通りに。
加算の仕方が判らんよ。 数字としてなのか値としてなのか。 関数通せば整数一つから擬似的に不連続を繋げられるけど、 その後どうしたいのか不明確すぎる。
>>118 sizeof(struct BB)が12byteである保証は無いんで、運が悪ければハマるかもね。
それ以前に shor 型とやらが何バイトかなんて知らないんで。
122 :
100 :2009/11/01(日) 23:41:06
>>108 >>116 ありがとうございます!
そういうことです!
自分のレス見返したら問題文書いてなくて
すいませんでした。
もう一度勉強してきます
#define shor short #define unsigend unsigned #define unsgined ;unsigned struct{ unsigned char AAA[10]: unsigend shor int aa; }BB unsgined char buf[500]; unsigned short int f(int x) { return x>=0 && x<5 ? ((short *)BB.AAA)[x]:x==6?(BB.aa:(short *)(buf+300))[x]; }
124 :
デフォルトの名無しさん :2009/11/02(月) 07:44:03
_beginthreadexってBCCだと使えないの?
125 :
デフォルトの名無しさん :2009/11/02(月) 08:34:00
126 :
デフォルトの名無しさん :2009/11/02(月) 10:04:53
どうやって
_ではじまるのはMS独自。
>>127 Wintelの場合、ライブラリファイルフォーマットは事実上共通
だろ?だからリンカで繋げられれば動く筈だが...ダメなのか?
つーか、そもそも_beginthreadex()がWinAPIのそれかどうか疑いもしない辺りが間抜け。
_ で始まってたり、すべて小文字だったりする関数名からして 明らかに API ではなく CRT なわけだが、それが何の関係が?
131 :
質問! :2009/11/02(月) 13:30:23
CRTって何ですか?
CathodRayTube:陰極管
133 :
デフォルトの名無しさん :2009/11/02(月) 13:54:31
Cランタイム(ライブラリ) C実行時ライブラリ
>>128 条件付でYES。 VCのランタイムのソース見ればわかる。
_beginthread(ex) は、
VCで提供している標準関数をスレッドセーフにするために、 TLSを作ったり
浮動小数点関連や 構造化例外(API)→C++例外配送機構 の初期化を行った後
CreateThread を呼び出してる。 (callback 関数も内部のものを利用)
thread が死んだ時、上記の後始末もやってる。
つまり、標準関数周辺のランタイムも VC のを使うなら動くわけだが…
なお、BCC は同じ名前で似たような機能の _beginthread(ex) を自前で用意しているんじゃなかったかな
135 :
デフォルトの名無しさん :2009/11/02(月) 15:29:56
プログラム実習の授業に ついていけないんですが、素人にお勧めの入門書はないですか? 大学一年です
136 :
デフォルトの名無しさん :2009/11/02(月) 15:34:41
新版 明解C言語 入門編
137 :
デフォルトの名無しさん :2009/11/02(月) 15:55:20
関数内で定義した変数は削除しないとスタックオーバーフローとかいうのになるって聞いたんだけど 本当なの?
>>137 うそだよ
・・・って一気に切り捨てるのもなんだから問おう。
> 関数内で定義した変数
ってなんだ?
ローカル自動変数のことだろ。 スタック上に確保される実装が多いから、 ネスト深くしすぎるとスタック溢れするからってことだろ。 まあ、普通に使う分には気にしなくていいよ。 ただし、ローカル自動変数にあまり巨大な領域を使うなってことは言える。 void func(){ int a[1000][1000][1000]; // こういうのは止めろってこと。 return; }
141 :
138 :2009/11/02(月) 16:17:39
あー、そういいたいわけか。
まあ入門編スレだしな。
>>137 しかしローカル自動変数を削除っていったい何をどうしたいんだ?
そういう間違ったことを教えてきたクソに
聞くべきじゃないか?
便乗質問で申し訳ございませんが、 int a[1000][1000][1000] が欲しい場合どうすればいいんでしょうか? newでヒープに確保しようにも無茶ですよね。
>>143 UNIX系OS独自のものですか?
クロスプラットフォームに使える
mmapみたいなものはありませんでしょうか?
C++ライブラリでもいいんで。
145 :
デフォルトの名無しさん :2009/11/02(月) 16:36:32
>>135 K&R とコンパイラのマニュアル、& スペシャルボーナスで Google
これでダメなら、せっかく頑張っても先はないから、他の科目で優をとるために力を回すべき
ちなみに C++ の禿本は K&R の3倍くらい難しい
>>144 ヒープに取れない→2次記憶としてファイルを使う→ファイル操作に縛りがでるかも?
で、汎用性の高いものは作りにくいんでないかな?
>>142 CでなくなってしまうがC++でプロキシクラスでoperator[]を
オーバーロードすればディスク上に巨大な配列が取れる
ただし激遅なのはもちろん
148 :
デフォルトの名無しさん :2009/11/02(月) 16:56:28
>>142 32bit 空間に 1GB なら基本的に無理はない
そういうオーダーでいくつも取る気なら 64bit を選択しれ
たった4GiB弱くらい、ヒープに確保しちゃえばいいじゃん。
>>148 型が int なんで… 微妙にアウト? (べき指数のベースが 1000 vs 1024 で違うけど)
>>149 Windows と Linux で関数名が違うから
自分でラッパー書けばいいよ
>>142 あとその巨大な配列の全部に要素を入れるのではなく
ガラガラな使い方をするのなら、疎行列(sparse matrix)という技法がある
154 :
142 :2009/11/02(月) 17:09:20
みなさんありがとうございます。 なんか私の知識をずっと超えたレベルになって来たようで、 勉強不足を痛感する限りです。
>>141 ローカルスコープでも使わせたいのかしらん
void func () {
int foo; /* 関数全域で使う変数 */
{ int a; /* a を使うコード */ }
}
C++ なら コンストラクタ/デストラクタの都合があるので意味ありそうだけど(それでも PODはあやしいが…)
C でローカルスコープ脱出後に戻されるという保証はないよね?
>>155 というか
int a[1000][1000][1000][1000][1000][1000][1000][1000][1000][1000][1000][1000];
でもC/C++の仕様上は問題はないんだよね。
単に現実を見ろよって話なだけで。
int *************************i; とかでもいいよ コンパイルされたコードを見ると笑えてくるけど
>>155 賢いコンパイラなら、以下のiとjは同じ領域を使いまわすかもしレナ。
void func(int para)
{
{
int i = para;
}
{
int j = para;
}
}
>>158 言えてる。
とくにそれが配列だったりしたらそうするかもしれないね。
>>158-159 領域の使いまわしが発生しているとすると、削除には該当しないんだよねー
(スコープ脱出後もメモリ上は存在している という意で)
なおさら
「関数内で定義した変数は削除しないとスタックオーバーフローとかいうのになる」
の意図が見えないな
そんな意味不明なフレーズには、本人に聞けとしか言えんだろう
前にもそんなこと言って人の言うこと聞かなかった奴がいたな。
陰極管だと Cathod Tube だよなぁ CRT なら陰極線管と翻訳すべきだった
エロい話かと思った
関数内でmallocした領域はfreeしないとメモリリークする ってことでは
>>165 スタックオーバーフローにはならんのでは
167 :
デフォルトの名無しさん :2009/11/03(火) 12:29:47
ランレングス符号化のプログラムです このプログラムだと最初の文字が評価されなくて困っています。 アドバイスをお願いします。 #include <stdio.h> int runlength(int length, char *str_org, char* str_enc){ int i,j = 0; char *RLE = str_enc; while(length--){ if(str_org[i] == str_org[i + 1]){ i++; j++; } else{ *str_enc++ = str_org[i]; *str_enc++ = '1' + j; i++; j = 0; } if(str_org[i] == 0) break; } str_enc = 0; return(*RLE); }
168 :
続きです。 :2009/11/03(火) 12:30:32
int main(void){ char buf_r[1024] = {0}; char buf_w[1024] = {0}; int length; printf("文字列の入力\n"); scanf("%s",buf_r); runlength(1024,buf_r,buf_w); printf("[ランレングス符号化]\n%s\n",buf_w); return(0); }
ワロタ
int i = 0,j = 0; とか?
C言語でポインタというのがありますが、 ゲームではどういうところで使われてるんですか? 具体例を教えてください。
メッセージの出力とか。
ファイルの読み書き
スタートアップ直後 DirectXの初期化で とか
最近は義務教育でC言語まで教えてるのか
最近のコンパイラってブロックの先頭じゃなくても変数の宣言できるの?
C99なら可
180 :
デフォルトの名無しさん :2009/11/03(火) 17:16:24
(int *) ↑*って何
asterisk だよ。
ポインタ型
(insert -> *)
ポインタ型ってなんだよ
(int *) = * を付けたら int 型
* = ア○ル
× アナル ○ アヌス 「アナル」は形容詞形。 「アナル○○○」と後ろに続く場合の活用形。 単体で名詞として使うなら「アヌス」とするべき。
188 :
デフォルトの名無しさん :2009/11/03(火) 20:24:04
あーネイティブの発音知らないわけねw 英語弱者って電子土方やってても辛そう
日本語表記においてはネイティヴの発音にいちいちあわせる必要はないだろw
>電子土方やってても辛そう
最近の2chって
>>188 みたいに無意味に突っ掛かってくるヤシが多いよな。
氏ねばいいのに。
どうでもいいことで盛り上がるなよ みんなタヒねばいいのに くそが
劣等感ゆえの攻撃性だから、哀れみをもってスルーするのがいいよ。
仕様書ある尾です
196 :
デフォルトの名無しさん :2009/11/04(水) 14:32:31
int Func(void* buf) { SOCKET SOCK = (SOCKET)buf; voidポインタで渡された値をソケット型にキャストしたいんだけど これだとうまくいかない
ヘッダファイル読め SOCKETって構造体か何かじゃねーの?
SOCKET sock = ...... ; Func( (void*) sock ); 呼ぶ側はもちろんこうだよな?
SOCKETが何なのかわからんが、voidポインタの引数はキャスト不要じゃない?
ポインタ以外の何かなら必要じゃないか?w
初期化に定数以外って使えるの?
今の普通のCなら使える。
203 :
デフォルトの名無しさん :2009/11/04(水) 15:52:19
int f(int a){return a+1;} int main(){ int i = f(1); /* できるの? */ return 0; }
206 :
デフォルトの名無しさん :2009/11/04(水) 16:16:25
>>201 少なくともGNU CとC++では使える。
207 :
デフォルトの名無しさん :2009/11/04(水) 16:17:41
BCC55でも使える
初期値だったら定数じゃないと無理だろうけど、 自動変数の初期化なんてのは所詮は普通に代入してるだけだからな。
初期化と代入は本来違うものであってしかるべきなんですが、まあ時代もかわりましたね。
210 :
デフォルトの名無しさん :2009/11/04(水) 18:56:02
>>205 できない、と思っているなら
なぜそう思うのかを開陳すべき
ヽ('A`)ノ カイチン! ( ) ノω| __[警] ( ) ('A`) ( )Vノ ) | | | |
while((*p++ = *q++) != 0 ) ; このコードの意味を説明してもらえませんか? 自己解釈 1 qの値をpに代入する 2 その値が0でなければwhileループ内を実行する 3 p及びqのアドレスを1インクリメントする こういう意味ですか?
1. *qの値を*pに代入する 2. p及びqのアドレスを1インクリメントする 3. 1の値が0でなければwhileループ内を実行する インクリメントは*qの値が0であってもそうでなくても行われる whileループ内の文が実行されるのはインクリメントが行われた後
>>212 そういうトリッキーなコードを書いてウケたのは1980年代
なんでw
30年前は兎も角現在そういうコードを書いてもプロセッサ
までその努力が全く届かないので
do{ *p=*q; p++,q++ }while(*q!='¥0');
とかの演算子の優先順位を記憶していない人でも読めるコード
で書くのが吉
上のコードは等価じゃなかったw for(;;){ *q=*p;p++,q++; if(*p=='¥0')break; }
なにそのトリッキーなコード。
220 :
デフォルトの名無しさん :2009/11/04(水) 21:02:42
>>215 あの程度をトリッキーという技量で論じた結果がそれ
演算子の優先順位くらい理解していないから間違えた
a = 1 + 2 * 3; の優先順位くらい頼むから理解してくれ
というのと五十歩百歩の域を出ない
strcpy(p,q);
>>212 while(*p++ = *q++);
これで必要かつ充分
あれがトリッキーに見えるって他言語からCに入った人?
うちの職場じゃ見かけないねえ
227 :
デフォルトの名無しさん :2009/11/04(水) 21:35:02
間違ってるとかワロタとかいいからちゃんと指摘してくれ いえ、お願いします
>>227 自分で書いたんだろう
動作テストしてみな
ちゃんと動くかどうか
do{*p=*q;++p;++q;}while(*(p-1));
分解するとこんな感じか
普通に
>>212 のままの方がいいな
要するにただの stos だろ
Q . . . . . . . . . . . Q . . . . . . . . . . Q . . . . . Q . . . . Q . . . . . . . . . . . Q . . Q . . . . . . . . . Q . . . . 記念
8Queensか
pとqがchar *型なのであればstrcpyが一番。
そうでなく、int *などなら
>>223 で充分。イディオムとして成立している書き方が読めないのは単に経験不足。
それでもトリッキーだというのなら、
while(*p++ = *q++) {
; /* 空 */
}
とでもしておけばいい。
ポインタを使えばアドレスを操作できるみたいだけどC言語ってアセンブリみたいに直接アドレスを指定して変えれる? アドレス12345678の値をFBにせよ みたいな。 こういうこと難しい?
*(char *)12345678 = 0xFB; でいいのだろうか
>>236 * (char *) 0x12345678 = 0xfb;
あぁ
16進とは書いてないだろ。
アドレスって書いてあれば16進だと思うの普通じゃね?
プレフィックスもサフィックスもなく、[0-9] だけで構成された数字を見たら 16進ではない、と思うのが自然な飢餓する。
for(;;) { *q=*p; if(*p=='¥0') break; p++,q++; }
アドレスを10進数で表記するような文献は見たことない
>>245 それだと最終的なp, qの値が違う
for(;;) {
*q=*p;
if(*p=='\0') {
p++;
q++;
break;
}
p++,q++;
}
249 :
デフォルトの名無しさん :2009/11/05(木) 16:18:28
整数乱数ってなんですか? とか、そういう感じの具体的な質問をお願いします 協力お願いしますでは何を答えていいのかわかりませんので
251 :
249 :2009/11/05(木) 16:33:13
自己解決しました。
自己発電しました
253 :
249 :2009/11/05(木) 16:56:59
>>249 です
整数乱数とはなんですか?
Aについてですが、今までは
int kansuu(int x)
{
return x*x;
}
のように数式を作るような使い方しかして来ませんでした
問題文にあるように関数の中で、min,maxを定義できるんですか?
#include <stdlib.h> int randomNumber (int min, int max) { return rand() % (max - min + 1) + min; }
int randomNumber(int min, int max) { return (int)(rand() / (RAND_MAX + 1.0) * (max - min + 1)) + min; }
2の累乗以外の乱数を出す場合は、 振り直し法を使わないと均等にはならないよ。 例えば RAND_MAX が 7 として、 それで 1〜6 の乱数を求めたら 1/8 の確率のものと 2/8 の確率のものが混ざってしまうだろ。 これは RAND_MAX を大きくしても解決しない問題だろ。
>>257 それはない。rand() の線形合同法では mod を使うのはご法度。
別にいいよ
>>256 実数を使っても無駄だよ。
int randomNumber(int min, int max)
{
return rand() / (RAND_MAX / (max-min+1)) + min;
}
整数でも変わらん。
どうしても均等にしたければ振り直し法を使うしかない。
整数オーバーフローは起きないの?
9桁以下の正の整数か否かを判別したいのですが if(m>0 && n>0 && m<=999999999 && n<=999999999) これでいいんでしょうか? もっとスマートになりそうな気が…
265 :
デフォルトの名無しさん :2009/11/05(木) 19:15:07
m の判定と n の判定がごちゃ混ぜになっているのが「スマートではない」な
266 :
264 :2009/11/05(木) 19:20:53
>>265 えっとつまり
if(m>0 && m<=999999999 && n>0 && n<=999999999)
ってことですか?
個人的に「999999999なんて入力しないんじゃなかろうか」と思ったのですが…
m と n のどっちが外れているかの判別ができないけどいいの?
268 :
デフォルトの名無しさん :2009/11/05(木) 19:34:10
>>266 とりあえずはね
ただし
>>267 が言っているような問題がまだ残っているし
入力は屈指のこわーい所で、範囲チェックだけで済むかどうかも怪しいぞ
269 :
264 :2009/11/05(木) 19:45:26
>>267-268 急いでソース全部打ってきました
/* 9桁以下の2つの正の整数m,nを入力して、m/nの小数部分 */
/* を四捨五入して得られる整数値を出力するプログラム */
#include <stdio.h>
int main(void)
{
int m,n,quotient;
printf("\n9桁以下の正の整数を2つ入力して下さい\n");
scanf("%d%d",&m,&n);
if(m>0 && n>0 && m<=999999999 && n<=999999999){
quotient = (m+n/2)/n;
printf("\n%d/%dの小数部分を四捨五入して得られる整数値は、%dです。\n\n",m,n,quotient);
}else{
printf("\n入力する値は9桁以下の正の整数にして下さい。\n"
"プログラムを終了します。\n\n");
}
return 0;
}
コメント内のプログラムを作成するのが課題なのですが、ループ処理はまだ習っていないので終了という形にしてみました。
mとn分けたほうがいいでしょうか?
270 :
デフォルトの名無しさん :2009/11/05(木) 19:51:44
ループがまだってことは、関数もまだか 今んとこそこまでかな
271 :
264 :2009/11/05(木) 19:59:39
>>270 そうですか
ありがとうございました
とりあえずif文の中を整理して提出してみます
272 :
デフォルトの名無しさん :2009/11/05(木) 20:49:54
>>269 11桁とかの数入力されときどうなるんだっけ?
273 :
デフォルトの名無しさん :2009/11/05(木) 21:18:59
scanf関数を用いて入力された3桁の整数に対して、 10の位および1の位を四捨五入することによって得られる2つの整数を表示するプログラムを作成せよ。 例)『425』を入力した場合、『400, 430』が画面に表示される。 宿題でこんなのが出たのですがどうしても出来ません!! どなたか教えてください!!
274 :
デフォルトの名無しさん :2009/11/05(木) 21:19:58
ちなみにこんな感じでやってみたけどダメでした #include<stdio.h> #include<math.h> int main(void){ int x,a,b; scanf("%d",&x); a=(x/100)+0.5; a=((int)a)*100; b=(x/10)+0.5; b=((int)b)*10; printf("10の位を四捨五入して整数で表します.\n"); printf("結果=%d\n",a); printf("1の位を四捨五入して整数で表します.\n"); printf("結果=%d\n",b); return 0; }
276 :
デフォルトの名無しさん :2009/11/05(木) 21:34:03
自販機のLEDあるじゃないですか あれみたいに、 右から順にボタンLEDが点灯していき左端で停止 停止したら右からまたLEDが順に点灯していきスタック スタックしたら右からまたLEDが・・・ ってのをやりたいのですが、「一行で」やるにはどうすればいいのですか。 ifを使うとビットシフトでできるのですが 「一行でやれよバカ」だそうです。
>>276 質問の内容が意味不明だが
改行しなきゃいいんじゃないかな?
1行って言われてもね……
280 :
デフォルトの名無しさん :2009/11/05(木) 21:45:36
#define (コントローラのLEDアドレス) Fuckintosh char LED = 0x01; Fuckintosh = LED << 1; で、左端のLEDまで点灯させます。 2進数で10000000です じゃあ左端を点けたまま再度右から点灯させていくなら 10000001 -> 10000010とシフトしていけばいいのか、と 別に変数を用意し、+ したのですが なぜかこれだと 二個同時に点いたります。 ifで分けてやると思い通りの点灯パターンを行うのですが 「(ifとか使わず)一行でやれよバカ」だそうです。
281 :
デフォルトの名無しさん :2009/11/05(木) 21:47:09
二個同時と言うのは左端を含めずに二個です シフトしていくLEDと隣り合ったLEDが点いて消えたり点いたり、 一緒にシフトして行ったり shます
1行とか言ってるソイツがアホなだけだろ。
ほんと日本語へたくそだな if使ったコード晒せよ
>>280 でけたwww
int i,j,hoge;for(i=0,LED=0;i<8;i++){hoge=LED;for(j=0;j<8-i;j++)(LED=hoge|(1<<j)),*p=LED;}
その説明では状況が分からん
00000000 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 10000001 10000010 10000100 10001000 10010000 10100000 11000000 11000001 11000010 11000100 11001000 11010000 11100000 こんな感じ?
286 :
デフォルトの名無しさん :2009/11/05(木) 22:06:50
そうです LEDが16コあって、そのうちの8つがLEDコントローラA 残りの8つがBに繋がっちょります が、8つ点ける時点でつまずきました
287 :
デフォルトの名無しさん :2009/11/05(木) 22:08:38
10000000 よしここから右端から点けよう 10000001 点いた 10000011 あれ? 10000110 あれ? 10000111 おや? 10001101 なんじゃ なんてことになってます。
>>287 コードを晒すんだ!
そのほうが日本語より直接的で分かりやすいと思う
289 :
デフォルトの名無しさん :2009/11/05(木) 22:15:53
なので、
Fuckintosh = 10000000 + (FuckOSX << 1) とかしたらどうかな、と思ったのですが
上のようにワケのわからんパターンで点灯し
ならORで、とやってもだめでした
>>288 仕事場に置いてきてまってるもんで
自販機を思い浮かべてもらえれば。
あの多段ボタンLEDそのままなので。
そのLEDは2進数00000000に対応しており、点けたい部位のビットを1にすれば光ります
10000000なら左端、00001000なら右から4番目、というふうに
292 :
デフォルトの名無しさん :2009/11/05(木) 22:18:26
あー違った Fuckintosh = 10000000 + (FuckOSX << 1)の 10000000 の部分は決め打ちではありません。 変数です。 if(FuckMac >= 10000000) Fuckintosh = (FuckMac + (FuckOSX << 1)); という感じですかね
2進数10000000は、16進数で0x80, 左端と右端を点けるには10000001、つまり0x81 やはり左端の値を保持して、新たにシフトさせていく変数を用意し 左端の値と足していけば順次シフトできるんじゃなかろうか、 と思ったのです。
つーか、ビット操作なら unsigned でやれよ。
排他的論理の計算ってどんなときに使うんですか? 101100110 110011101 011111011 になるのはいいんですが、この計算はたとえばどんな時に使用されるの?
296 :
デフォルトの名無しさん :2009/11/05(木) 22:59:47
stdioはstandard input outputの略 ではprintfやsacanfとかって..... 語源とか気になる関数とか多いです
298 :
264 :2009/11/05(木) 23:07:50
>>272 11桁ですか?
おそらく弾かれて、プログラム終了となるんじゃないかと思うのですが…
>>295 特定のビットだけ反転させたいときだな。
あまり使う機会はない。
>>296 print や scan に format の f 付けただけ。
300 :
デフォルトの名無しさん :2009/11/05(木) 23:14:03
>>299 おお、こんなに早くお返事が!!!
サンクスです
検索かけても語源とかなかなか出てこなくって
「UNIXの古い資料調べれば全部分かる」
みたいな話はどこかに書いてありましたが
それもちょっとよく分からん話だったんで
1ビットずつフラグに使ってたら、反転させたいときもあるんだろうな
303 :
デフォルトの名無しさん :2009/11/06(金) 00:09:44
ボタンとかのオブジェクト配置するには? 画面の出し方は死ぬほどサンプルあるけれど
いきなりなんだよwww windowclass にボタン指定しろよw
スレ違い
>>295 RAID5の計算とか
CRCとか
画像処理とか
A = 101100110
B = 110011101
A xor B = C
C = 011111011
C xor A = ...
C xor B = ...
307 :
デフォルトの名無しさん :2009/11/06(金) 02:55:03
>>302 リンク先までありがとうございます
正直、英語は読めないので何をどう見たらよいやら分かりませんが調べてみます
やはりプログラマーは英語必須なんでしょうなあ
英語読めなくてもプログラマやってる奴は結構いるよ カスばっかだけど
プログラミングコンテストの問題が英語だから理解出来ないとかね プログラミング以前の段階で淘汰されてて面白い
職業としてやるんじゃなかったら英語なんてたいして必要ない。 英検三級ありゃやっていける。
int main() { unsigned char LED = 0x01; int i,j,n; for (i = n = 0; i <= 36; n=++i) { LED = 0; for (j = 8; j > 0; n-=j*(n>=j),j--) { LED |= (n>=j)<<(j-1); } for (j = 7; j >= 0; j--) { printf("%d", LED >> j & 1); } printf("\n"); } return 0; } どうしてこうなった
unsigned char func(int n) { unsigned char LED = 0; int i, stack = 0; for (i = 8; n > i; n-=i--, stack++); LED = ~0 << (8-stack) | !!n << (n-1); return LED; } int main() { int i,j; unsigned char LED; for (i = 0; i <= 36; ++i) { LED = func(i); for (j = 7; j >= 0; j--) { printf("%d", LED >> j & 1); } printf("\n"); } return 0; } がんばってこれか
stackをループじゃなくて2次式を解くことでできそうな気がするけど、またあとで。
314 :
デフォルトの名無しさん :2009/11/06(金) 15:15:26
Cは無限ループifしなくても何かが起こったときに 関数に飛ぶことはできないの
日本語でおk
教えてやるから日本語で質問しろ。
馬鹿は回答するな
>>314 標準Cには、そういう仕掛けはない。
Win32 API なり、Pthreads なりを使うわけだが
OS が特定できんことには。
signalは標準だろボケ 無知は黙ってろよカス
>>322 では一つ、signal()の標準的な使い方を教えてくだされ。
324 :
デフォルトの名無しさん :2009/11/06(金) 17:37:51
問題文を出力するなどのため、 引数の内容が長文化した場合、(継続文字?)について教えてください。 例えば、プリントエフ関数で、長文を表示させる場合、 printf("1行目から2行目\n3行目から4行目\n"); といったように書いていったのですが、 当然ながらだんだん見えなくなってくるので、 printf("・・・・3行目から4行目\n" "5行目から6行目\n6行目から7行目\n・・・・"); と、表示していくことになりますが、 他によい方法はないのでしょうか。 こういう場合、どういう方法が一般的なのでしょうか。 プリントエフで一個ずつ表示するものなのでしょうか。
SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM は標準のようだ 質問の「何か」っていうのが具体的に何かわからないと何ともいえないが
>>324 俺なら1行ごとに分ける
printf(
"1行目\n"
"2行目\n"
"3行目\n"
・・・・
"最終行\n");
それか、問題文を別ファイルから読み込む
327 :
デフォルトの名無しさん :2009/11/06(金) 17:52:34
>>326 なるほど1行ずつですか。
>>それか、問題文を別ファイルから読み込む
買ってきた本でもファイルの入出力を最後のほうで取り上げています。
なんとかそこまで早くたどり着きたいものです。
最終的にはプロンプトでサウンドノベルみたく動く文字出力を実現したいです。
あの、1文字、1文字、動いていく感じがたまらなくいいので。
たぶん繰り返し処理とか使うんだろうなあとは思っているのですが。
優れたプログラマ=論理演算多用 if少ない if((A >> B) |= C) != ( ((D >> E) << F) &= (G | H)){ VAR = I >> (J |= (K + L)); }
劣ったプログラマ=if多い if() if() if() if() if() else if() if() if() else if() ifを判定するだけで最低1クロック無駄にする
Cでどう短く書くかより、実際の効率で考えるべき
ものすごいアホがいる。
>>328 まだ減らせるぞw
((A >> B) |= C) != ( ((D >> E) << F) &= (G | H))&&(VAR = I >> (J |= (K + L)));
334 :
デフォルトの名無しさん :2009/11/06(金) 19:22:57
>>324 ふつーは
printf("一行目\n");
printf("二行目\n");
printf("三行目\n");
printf("四行目\n");
printf("四行目\n",printf("三行目\n",printf("二行目\n",printf("一行目\n"))));
>334,>335は関数呼び出しコストを度外視しているところが間抜け。 一回で済むことを4回もやるな。
337 :
デフォルトの名無しさん :2009/11/06(金) 20:15:43
それ以前に、ただの文字列出力にprintf使う奴はプログラマーに向いていない。
まあ普通は DrawText() 使うよな。
339 :
デフォルトの名無しさん :2009/11/06(金) 20:20:03
関数くらい人に教わる前に自分で習得しろって? そりゃ俺も C 始める前にアセンブラで PRINT マクロ作ってたさ、そのアセンブラも自作でね けど今どうなんだろう? C の printf には BASIC の PRINT コマンドほどの教育力あるんかね 俺個人としては、かえって饒舌すぎるところがあるように思えるんだが
まぁ、まともなコンパイラならprintf()の代わりにputs()を使うくらいのことはするからな。
それだと結果が変わってしまうな。
いまどきのコンパイラなら334も324も最適化で同じになるだろ。
結局どう表示したいのか一目でわかるのが
>>326 の良いところ
結局トレードオフなんあぢょ。
あるアドレスに名前を付ける時ってどうするの?
>>345 マクロとか変数名とか名前-アドレスマップとか
ポインタ
× DIV = (300 / 2); ○ DIV = (300 >> 1)
一番やりがち、真っ当なのはdefine #define 90000000 adressV125
352 :
デフォルトの名無しさん :2009/11/06(金) 22:42:13
コンパイラが対応していれば、#plasmaでもいい。 でもプラズマは本当に「そのプラットフォーム専用」でないと用意されていない。
本命は l だと思う。
355 :
デフォルトの名無しさん :2009/11/06(金) 22:59:59
#import
DXライブラリを使用して今までは正常にコンパイルできていたのですが、PCのフォルダなどを整理してから、 Fatal: ファイル VORBISFILE_STATIC.LIB が開けません とメイク結果に表示されコンパイルできなくなってしまいました。 エディンタの再設定もしてあり、必要なファイルはあると思うんですが... だれかアドバイスいただけないでしょうか。
ここはそんな質問する場じゃない
358 :
デフォルトの名無しさん :2009/11/07(土) 01:04:48
DBに接続するためのパスワード文字列をソースに埋め込もうと 考えたんですが、stringsコマンドでバレてしまいますよね。 通常は暗号化したパスワードを文字列として持たせるのがベターなんでしょうか?
>>357 すみません初心者用の本でライブラリを使いなさいと書いてあったんです...
本の通りにやり直してもできないんです
ここはそんな質問する場じゃない!
気合い入れてもう一回ググッてきます。がんばってきます
フォルダの整理って何したんだよ?
363 :
デフォルトの名無しさん :2009/11/07(土) 11:09:18
makeしたら負けだと思う。
おつにゃん
printf("\ 1行目\n\ 2行目\n\ 3行目\n\ ・・・・ 最終行\n\ ");
それインデンツできないから×
printf( "1行目\n" "2行目\n" "3行目\n" ・・・・ "最終行\n" );
char *s=" #include "hoge.txt" "; printf(s);
if(fgets(str, sizeof(str), stdin) == NULL) が成り立つことってあるのでしょうか。
ファイル終端。
372 :
370 :2009/11/07(土) 17:50:17
キーボードからの入力でファイル終端ってどういう場合なんでしょうか
>>372 Ctrl-Z とか Ctrl-D とか ファイルリダイレクト とか
>>372 Windows なら ctrl + z
*nix なら ctrl + d だっけか?
375 :
370 :2009/11/07(土) 18:02:17
ありがとうございます
define BUF 1024 char buffA[BUF], buffB[BUF]; char** str; int needss, i, j, x, y; 質問です。上記の変数を利用しプログラムを記述しました。 まったく問題なく実行でき、さらに処理を追加しようと新たに char buffC[BUF]という配列を宣言すると、エラーを吐くようになりました。 どうも、char型の変数を増やすとbuffBに文字列が格納された瞬間にエラーがでます。 変数名を変えても改善しませんでした。 プログラム自体には問題なく、当然コンパイラーは警告すらでません。 何が問題なのかまったく分からず困惑しています。 変数名が悪いのか、配列の要素数が全体で見れば多すぎるのかと思いましたが、そんなことはないはずですよね・・。 環境はUbuntu9.04 コンパイラGCC エディタEmacsです。 エラーの考えられる原因はなんでしょうか。
object-CってC使いに易しいかな? iMacポチって待機中なんだけど…
>>376 スタックオーバーフローか未初期化のポインタで何か操作しようとしてる可能性が高い
>>378 ポインタはmallocでメモリを確保しています。
というか、変数を追加しなくても、実行できなくなりました・・。
mallocで確保したメモリがfreeで解放できずスタックオーバーフローになっているという落ちとかでしょうか。。
malloc はスタック関係ねー
>>379 bufBに文字列が格納された時にエラーが発生という
場合、格納しようとしている文字列に問題があると
考えられる。多分読み出してはならない領域を
指すポインタだとか....
正確なことはソース見なければわからないんで
うpローダ使ってアげてみたら?
まあどうせ単なるショボバグだろうな。
コンパイラのせいにしたいのがみえみえ
>ポインタはmallocでメモリを確保しています。 というが、 >define BUF 1024 >char buffA[BUF], buffB[BUF]; >char** str; >int needss, i, j, x, y; の中にあるポインタはstrしかなく、 そこにmallocの戻り値を格納するとしたら、多分 (charの配列ではなく)char*の配列を確保しているわけで 何かもうそもそもソースがおもしろいことに?^^
385 :
376 :2009/11/07(土) 19:22:31
ネタコメント削除してソースうpしますです。。
(* (char *) ABC_easy_as_a_123)(int); これどういう意味ですか。 ポインタ型charにキャストするなら最初からそうやったらいかんのですか。
>>386 関数のポインタだろうけど、なんぞこれw
388 :
376 :2009/11/07(土) 19:33:16
struct SomeStruct { // ・・・ }; と書けばいいのになんで typedef struct { // ・・・ } SomeStruct; と書くのが巷で流行ってるの?
structをtypedefしないんだったらそいつへのポインタを 使うのはダサイかも
ヒント:構造体を使う時
構造体は、struct タグ名 で宣言するが これで宣言したのはタグ付きの構造体の中身であって、 型として認められていない。 ここでtypedef を用いると、「SomeStruct型の構造体である」ことを認めさせることになる。 typedefを使わないと、 struct SomeStruct MyStruct; と別に一行必要になり。これでようやくSomeStruct型の構造体と認められるわけだ つまり、構造体の「型宣言」と同時に「構造体として使えるように名前もつけてしまおう」という横着した手法なだけだ。 構造体は、述べたように最初の段階では使用できる構造体として認められない。 必ず、「SomeStruct型の構造を持つ○○」という名前をつけてやらなければ使用できない。 だからtypedefで型と名前を同時に決めることもよくある話。
C++だと、これを勝手にやってくれちゃってんで面倒なことにもなりかねない。 Cの頃からtypedef structでやっていればC++って何て便利なんだ!と思うかもしれないが あれは余計なお世話といってよい。
理屈っぽ
>>388 /*ここで必要な箱の数が分かったのでmallocで領域を確保*/
/*forで必要な行数回、1行の文字数のchar型の領域を作成*/
str = ( char ** )malloc( sizeof( char * ) * ( needBr + 1 ) );
for (i = 0; i <= needBr; i++){
str[i] = ( char * )malloc(oneLineLen * sizeof (char) + 1);
}
strに実体がないような?
str = ( char ** )malloc( sizeof( char * ) * ( needBr + 1 ) ); ↑ 思いっきり書き忘れていました・・。 しかも括弧付けわすれで評価が意図しない形になる(はず)になっていました。 charが1バイトなので+1で大丈夫だっただけですよね・・。
?
!
401 :
376 :2009/11/07(土) 20:11:20
9文字入力して4文字で改行で実行したりすると *** glibc detected *** ./a.out: double free or corruption (out): 0x082b9018 *** ======= Backtrace: ========= /lib/tls/i686/cmov/libc.so.6[0xb7dfc604] /lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7dfe5b6] ./a.out[0x8048823] /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7da3775] ./a.out[0x8048521] ======= Memory map: ======== 08048000-08049000 r-xp 00000000 08:08 69284 /home/mint/Desktop/Cprogram/pr4/a.out 08049000-0804a000 r--p 00000000 08:08 69284 /home/mint/Desktop/Cprogram/pr4/a.out 0804a000-0804b000 rw-p 00001000 08:08 69284 /home/mint/Desktop/Cprogram/pr4/a.out 082b9000-082da000 rw-p 082b9000 00:00 0 [heap] b7c00000-b7c21000 rw-p b7c00000 00:00 0 b7c21000-b7d00000 ---p b7c21000 00:00 0 b7d8c000-b7d8d000 rw-p b7d8c000 00:00 0 b7d8d000-b7ee9000 r-xp 00000000 08:08 1864 /lib/tls/i686/cmov/libc-2.9.so b7ee9000-b7eea000 ---p 0015c000 08:08 1864 /lib/tls/i686/cmov/libc-2.9.so b7eea000-b7eec000 r--p 0015c000 08:08 1864 /lib/tls/i686/cmov/libc-2.9.so b7eec000-b7eed000 rw-p 0015e000 08:08 1864 /lib/tls/i686/cmov/libc-2.9.so b7eed000-b7ef0000 rw-p b7eed000 00:00 0 b7ef0000-b7efd000 r-xp 00000000 08:08 2779 /lib/libgcc_s.so.1 b7efd000-b7efe000 r--p 0000c000 08:08 2779 /lib/libgcc_s.so.1 b7efe000-b7eff000 rw-p 0000d000 08:08 2779 /lib/libgcc_s.so.1 b7eff000-b7f03000 rw-p b7eff000 00:00 0 b7f03000-b7f04000 r-xp b7f03000 00:00 0 [vdso] b7f04000-b7f20000 r-xp 00000000 08:08 6255 /lib/ld-2.9.so b7f20000-b7f21000 r--p 0001b000 08:08 6255 /lib/ld-2.9.so b7f21000-b7f22000 rw-p 0001c000 08:08 6255 /lib/ld-2.9.so bf80c000-bf821000 rw-p bffeb000 00:00 0 [stack] Aborted とかもうね・・・。
402 :
376 :2009/11/07(土) 20:15:23
謎のエラーはmallocが1行抜けてたからのようです。。 395さんはじめありがとうございました・・。
この先、メモリが10GBとかになったらC言語じゃ対応できなくね? CってポインターがINTで4294967295までしか設定できないよね それ以上のアドレスは指定できないけどどうすんの?アドレスが5000000000とかの指定できなくね?おわた
はいはいワロス
ポインタがint値だなどと誰が決めたのだ。 ポインタはポインタであってポインタでしかない。 多くの実装でlong intに変換可能だというだけ。 なんだったら見たこともない宇宙文字列で実装してもいいのだ。
406 :
デフォルトの名無しさん :2009/11/07(土) 20:54:08
>>403 どれでもいいから 64bit 版のコンパイラで sizeof(void*) を表示してみそ
long long long long long long long long long long long long long long long long long long long long int
>403 メモリが10GB(仮想記憶含まず)ならCPUもそれを指定できないとダメ子さんになるから (intは何ビットか計算するの面倒だからやらないまぁ、64bitで十分だろうけど) CPUのbit数xが10G < pow(2, x)を満たす必要がある intはpow(2, x)なるbit数であるのが一般的である また、規格ではポインタがintに変換できるとは書かれていない C99からintptr_tとか入った気もするけど、マジックリストにでも使うんですか とか思って特に調べていない
某ランドのコンパイラとかがC99に対応していない long longが使えない
410 :
デフォルトの名無しさん :2009/11/07(土) 21:04:17
C99 はロールバックしたうえで、C201x を練り直して欲しい
>>409 long long 使えるよ
C99には対応してないけど
ECC6.1.0(Embarcadero C++ Compiler)な
time_t を使っているからコンパイラが対応してれば 2038年は超えられる
そりゃ何とかするでしょ もっと新しいいい言語が出ていればそっちに変わっているだろうが、 2038年にまだC言語が使われていれば何とかするしかない
あと30年も生きていられるわけないじゃないか^^
おまえ何歳だ?
30年もすれば日本は消滅して日本人は貧困にあえぎプログラミングどころかパソコンに触る機会もないよ
C言語で楽しくプログラミングする人の集まるスレだから、アンチは別のスレに行ってよ time_tを変えて再コンパイル、リンクするか64bitCPUに移行すれば、2038年問題なんて大したことではない 30年後もx86さまさまの人は時代後れを認識した方がいいと予言しておく
64bitCPUとtime_tは関係があるわけ?
64bitCPUにすれば今までのtime_tは2038年以降も正常に動くんだよ
先延ばししただけじゃねーの?
先延ばしじゃない方法があるのか?
永遠はあるよ
time_tは有限?
その都度仕様を変えれば無限とも言える
426 :
デフォルトの名無しさん :2009/11/07(土) 22:01:29
64bit でも 292277026596年問題が残るが、その頃のマシンがバグったらグレートウォールごと吹っ飛ぶとかあるのかな
そこまでくると、さすがに超人ロックくらいしか生きてないだろうな
嫌味で言ったつもりだったが、なに釣られてんのwww
いやいや。 今仮に18歳のぴちぴち大学1年生でも 30年後は48歳だよ? 48歳の人はあんまりもうプログラムはしてないんじゃないかな。 経営側か、現場であっても少なくとも設計よりの仕事をしていて もうやりたくてもプログラムなんてさせてもらえなくて 夜遅く家に帰ると妻はうるさく、娘には嫌われ、 トイレ横の物置を改造して作った名ばかりのパソコンルームに 30年前に自作したコンピュータがおいてあって、 それの電源をいれてほそぼそと趣味のコードを打ち込むのが日課だったり^^
>>428 そう思うと勿体ないよな。
これだけの科学技術を創り出すのに、どれだけの時間がかかったことか。
再び文明が生まれたとしても、車輪の再発明をするだけだ。
地球が始まった時間に比べれば一瞬の出来事
>>432 人間が生まれて600万年
だが技術革命はここほんの100年余りの事だ
もしかしたら今が本来の人間の姿からかけ離れて どうかしてるかもしれないって話
は?詳しく話してくれないか?それを
他の惑星に移住してて、そこで新たにタイムテーブル作ってるから問題なしとか
リフボードでトラパーの波に乗るんだろうな
UFOに乗ってる宇宙人なんか肉体無いらしいよ これ以上はオカルト板でしようぜ
440 :
249 :2009/11/07(土) 23:38:09
10進数を10桁の2進数に変換したいんだけどどうやったらいいかわからない 8とか16進数なら表示できるのわかるんだけど、2進数って簡単に表示できないんだっけ?
C言語は2進数はサポートしてないからね
AND取ってループすれば出せるでしょ
8進数とか16進数の表示を自前でやってみたら
2で割っていけばいいんでは?
>>442 limits.hをインクルードしてsizeof(int) * CHAR_BITで
intのビット数を求め、10進数をunsignedにキャストして←ここ重要
1UL << (sizeof(int) * CHAR_BIT - 1)のマスクとandを取った結果が
0か1かを書きだして行く
マスクは>>で右シフトしてループ
448 :
デフォルトの名無しさん :2009/11/08(日) 00:27:48
>>441 >>440 のプログラムでは
100
100
300
など一列目に同じ数字が出ることがあるので
500
600
200
のように一列目の各行におなじ数字が出ないように改造したいです
#include <stdio.h> int main() { int beam = 10; // チゲ int i, n ; // counter for ( n = 0; n != 1024; ++n ) { printf( "%d : ", n ); for ( i = 0; i != beam; ++i ) { printf( "%d", n >> ( beam - i - 1 ) & 1 ); } printf( "\n" ); } }
>>448 1〜9 までの重複しない3つの数字が欲しいだけ?
もしそうならこれでおk
{
int i, x, n[9];
for(i=0;i<9;i++) n[i]=i+1;
for(i=0;i<9;i++)
{
x=rand()%(i+1);
t=n[i];
n[i]=n[x];
n[x]=t;
}
for(i=0;i<3;i++) cardForNumbers[i+1][1]=n[i];
}
先生質問です。 char *ptrを引数として他の関数に渡す時は other_Kansu (&ptr); ですよね? char **ptrを引数として渡すときはどうなるんでしょうか? other_Kansu (&*ptr)ですか?
ちょっくら驚く豆知識 なんと! なんとなんとなんと! なんとなんとなんとなんとなんとなんと! 4bit CPUでも128bitデータなどを扱えるのである!!!!!!!!!!!! 何をバカな、と思ってるのは素人である。ド素人である。 4bit CPUでは、128bitデータを「1サイクルで」レジスタなどに格納できないだけであって 128 / 4サイクル使って上位4bitもしくは下位4bitから順番にメモリに128bitぶん格納していけばよいのだ。 バカか手前等。
面白い質問ですね^^ void other_Kansu( char ** ) に char *ptr を渡したいときは other_Kansu( &ptr ) です。 void other_Kansu( char ** ) に char **ptr を渡したいときは other_Kansu( ptr ) です。 &*ptr でもいいですが、それは結局 ptr です。 多分。
>>451 両方違うともいえるし、両方合っているともいえる
>>453 非常にややこしいですね・・。
>void other_Kansu( char ** ) に char **ptr を渡したいときは other_Kansu( ptr ) です。
passing argument 1 of ‘ptr' makes integer from pointer without a cast
って言われるんですが無視でいいんでしょうか・・?
>>454 正解は存在しますか・・?
&* はC言語の仕様上はダメなんじゃないの? int a=10, *p=&a; のとき &*p って &10 でしょ
ptr が char** だから *ptr は char* であるので 依然としてアドレス演算は可能でしょう^^ >passing argument 1 of ‘ptr' makes integer from pointer without a cast その警告は今回の件とは直接には無関係です^^
>>447 右シフト使わない前者のでunsignedにする理由って何?
こいつは何をいっているんだ
451は、なにか、勘違いしてるような?
int a=10, *p=&a; *p は a のアドレス(仮に1000番地)を保持 &*p は 1000番地のアドレスを指すので &10ではなくて &(1000番地)で結局1000番地 1000番地は10 ってなる気がする
462 :
457 :2009/11/08(日) 01:40:41
あ、上の2行と下の2行は別の書き込みへのレスです^^ ごっちゃになってしまいました^^
>>452 いきなり何の話してんの?
上のメモリに関する話にしては話がズレすぎてるし、その豆知識をどうしたいんだ。
>>455 深く考えすぎ。
>>457 キャストなしで整数になるの意味が分からないんですが、引数の受け渡し方があってるならどっか根本的に勘違いが発生してそうです・・。
違う視点から警告と向き合ってみますです。
どうもありがとうございました><
>>464 変数の宣言部、関数のプロトタイプ、関数の実装部を見直してみてはどうか。
>>464 今ちょうど見直してましたが、間違っては無さそうです。
他の関数へは上手く**ptrが渡せてるみたいなのですが・・。
該当部分をもう一度書き直して見ます・・。
>466 ソースきぼん
>>467 hoge.c:68: 警告: passing argument 1 of ‘addStr’ makes integer from pointer without a cast
書き忘れました。。
void addStr (char *causeBuf, int causeNeedBr, int causeOneLineLen, char** causeStr)
完全に見るところを間違えてました・・。 ゴールが見えそうです。 ありがとうございました><
argument 1 of ‘addStr’ ちゃんと警告よみましょうねっていう。
英語の知識か日本語のコンパイラがあれば読めてました><
英語が読めなくてもいいから、今回のような失敗の時はこういう警告がでるのだということを覚えておくといいよ。 そうすれば、次に同じ警告が表示されたとき、やっぱり読めないけど、 一個目のパラメータに変なの渡してるんだなということが分かるようになる。 これはこれで慣れ。ガンガレ
そうですね。 今回のでまた1つ覚えました>< C言語歴というか、言語歴2ヶ月なんで始めて出会すエラーが多く、エラー文が読めても意味がわからないことばっかりです。 頑張って完成させます。。
>>458 遅レスだけど
intだと環境依存だが符号ビットが立っていると右シフトすると
おかしなマスクになる事があるから
シフトに関してもアセンブラが優れている。 Cのシフトは問答無用、見境なく全部シフトさせてしまうが アセンブラなら大抵、符号ビットを残したままシフトさせることができる。算術式シフトってやつだな!
それCPUの機能であってアセンブラがどうのとは違うのでは
strstr関数をライブラリ無しでやるには?
ポインタをインクリメントしながら文字比較をしていくしか
482 :
デフォルトの名無しさん :2009/11/08(日) 11:21:45
遅くてもいいんなら、 一文字ずつ比較する文字列比較を、開始位置を一文字ずつずらしながらループする。
string s="abcde"; s="abcdef"; ってやったら、最初の行で作ったabcdeがメモリ上にのこっちゃって効率悪いんでしょ? ガベージコレタクに頼らず自分でメモリに残ってるゴミを消す方法ないの?
なつかしいな。 BM法とか勉強した記憶が。
string *s = new string("abcde"); *s = "abcdef"; delete s;
unsigned charは1byteでmalloc(size)はunsigned char [size]と同じ大きさの連続メモリを返すってのは規格を満たすすべての処理系で正しい?
ループ毎に、配列でいう1番目をサーチし、ヒットがあったなら次に2番目をサーチし、またあれば3番目をサーチしたいのですが、ちなみにヒットする項目がなければ配列に登録します ただやりたいのが、配列1番目が1byte、2つめが4byte、最後が4byteとなっているのですが、これらを管理する上でいい方法はないでしょうか?
変数初期化のとき*が2つついてる奴あれ何?
491 :
デフォルトの名無しさん :2009/11/08(日) 13:05:55
>>488 配列で異なるサイズのデータを扱う方法を訊ねてるとして
普通は、1)最大に合わせる、2)unionで全部をひとつの型にまとめる
あたり
>>490 *は何個でも付けれるぞ
int ************p;
みたいなのもok
(*************printf)("HELLO.");
先生質問です。 char** pptr; char strA; int num1,num2; //領域確保 pptr = calloc ( (num) , sizeof (char)); for (i = 0; i <= num1; i++){ pptr[i] = calloc ( (num2 + 1) , sizeof (char)); } //文字代入 for (i = 0, j = 0; i < num; i++, j += num2){ strncpy (pptr[i], strA + j, num2); } この処理でnum1に5以上の値が入るとSegmentationFaultになります。 デバッガではstrncpyのラインがSegmentationFaultの原因ラインとでます。 printfで表示して確認してみると、num1でnum2が割りきれ、かつnum1が5以上のときに pptr[0][0]に領域以上の文字化け表示が出るときが有ります。 この部分の記述で不味い点があるのでしょうか?
ポインタのポインタってポインタで代用できないの??? ポインタのポインタと言えどもポインタであることは間違いがないので ポインタのポインタとするのではなく、ポインタへのポインタでしても ポインタのポインタであることは変わりがないじゃないの。
497 :
デフォルトの名無しさん :2009/11/08(日) 14:22:35
ポインポインポインポインポインポインポインポインポインポイン ポインポインポインポインポインポインポインポインポインポイン ポインポインポインポインポインポインポインポインポインポイン ポインポインポインポインポインポインポインポインポインポイン ポインポインポインポインポインポインポインポインポインポイン インポ
498 :
デフォルトの名無しさん :2009/11/08(日) 14:25:28
pptr = calloc ( (num) , sizeof (char)); はまずい。 pptr = calloc ( (num) , sizeof (char *)); にしろ
499 :
デフォルトの名無しさん :2009/11/08(日) 14:32:27
>>496 typedef int *pint;
pint *p = N;
ポインタって int *p; *p = Hogeragecho; とするときと p = hogeragecho; とするときがありますが 何が違うのですか。 どういうときにアスタリスクを意識しないといけないのですか。 明らかにアドレスを要求している文脈のときはアスタリスクつけなくていいのは分かりますが 明らかにアドレスではないものを要求しているときでさえアスタリスクつけないソースもあります。
そのソースがバグってんだろ。 見せてみ
>>498 見事に改善しました・・。
ありがとうございます!
sizeof (char) と sizeof (char*)では確保される領域の大きさが変わるのですか?
ggr先生に聞いてみますが、よろしければ後学の為ご教授ください。。
printf("sizeof(char) = %d, sizeof(char*) = %d \n", sizeof(char), sizeof(char*));とかやってみ
>>503 sizeof(char) = 1, sizeof(char*) = 4
になりました。
char*は1バイトじゃないのですね。
ポインタだからな アドレスが32bit環境なら32bit(=4バイト)
>>505 とてもわかりやすい説明ありがとうございます。
ポインタのサイズにも気をつけます
6502でさえ16ビットあるだろ。
いい加減、バイトサイズは定めるべきだと思う shortだとかlongだとかじゃなく 8bitにしたいなら、int8 16bitにしたいならint16 とか、明確にサイズを決められると見易く、いろいろ便利なのに
バストサイズに見えた。
typedefすりゃいいじゃん
fortranのようにreal(8)とかでいいのにね
stdint.h があるだろ
>>477 しってる。だから「右シフト使わない前者」に限ったんだ。
>>487 > unsigned charは1byteで
うん
> malloc(size)はunsigned char [size]と同じ大きさの連続メモリを返す
管理領域を含むから少し大きいかも。少ないことはないし、連続していることも確実
ツェー程度の言語仕様で悩んでるようだと 「ツェーたすたす」とか「風呂釜掃除用薬剤」で発狂すんぞ
その言い回しカッコイイすね先輩
ツァーだろ常孝
518 :
デフォルトの名無しさん :2009/11/08(日) 21:48:41
0から1023までの10進数を2進数に変換するプログラムを作っているのですがうまくいきません 数値をしっかり指定すれば表示されるようになるのですが、forで0から1023まで繰り返してやろうとするとうまくいかないみたいです アドバイスお願いします #include <stdio.h> int main(void){ int nisin[10]; int i, j, k; /*入力*/ for(k=0; k<=1023; k++){ k=j; /*変換*/ for(i=0; i<10; i++){ nisin[i] = j % 2; j = j / 2; } /*出力*/ for(i=10-1; i>=0; i--){ printf("%d",nisin[i]); } } return 0; }
関数にまとめれば見通しがよくなるんじゃないかな
j=k;
どこに10進数が出てくるのやら。
10進数から2進数にしたいなら まず10進数にするところから始めないとダメじゃん。
堰澤映
変数のスコープを図示する問題なんですがexternの使い方が本来のものと違うので なんだかわけがわからなくなりました aとbはわかったのでcの部分を教えて下さい #include <stdio.h> extern int a; int b = 2; int func(){ int b; extern int c; b = 3; printf("func: a = %d, b = %d, c = %d\n, a, b, c); c = 6; return 0; } int c = 4; int main(){ extern int c; func(); a = 5; printf("main: a = %d, b = %d, c = %d\n", a, b, c); return 0; } int a = 1;
グローバル変数の extern と同じ ただし見える範囲が main とか func の中に限られる
>>527 ということはfuncの中では6
mainの中では4ということですか?
でも実行すると
func: 〜〜c = 4
main: 〜〜c = 6
となるのですが
何をどう考えたらそうなるんだ > int c = 4; とあるので、cの初期値は4だ funcのprintfが実行される時点ではまだ初期値のままだから4が表示される その後 > c = 6; が実行され、それからmainのprintfが実行されるので6が表示される
>>529 あ〜何となくわかった気がします
ありがとうございます
531 :
デフォルトの名無しさん :2009/11/09(月) 03:26:01
C言語のポインタ、配列、ファイルの問題です n件のデータを配列に入力しその平均値を出力するプログラムをつくり、 実行部において添字演算子は用いず、*(p+i)と*p++それぞれを用いるパターンを作る ただし、入出力処理をファイル処理に、入出力ファイル名はコマンドラインで指定する 作れません、教えてください
宿題は宿題スレへ 作った所までどこかにあげれば答えないこともない
ぱっと見、*(p+i)を用いるのが難しそうに思うんだけどなぁ。 iどこで使おうか。
534 :
デフォルトの名無しさん :2009/11/09(月) 03:38:55
#include<stdio.h> int main(void) { int A[100]; int a,b,i,n,*p; *p=A[0]; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",*(p+i)); } for(i=0;i<n;i++){ b+=*(p+i); } a=b/n; printf("%d",a); return(0); } です
ああやっぱり。p+i使えばp++使わなくなるよなぁ 無理矢理使えって話だろうか
536 :
デフォルトの名無しさん :2009/11/09(月) 03:41:27
*p++ 使ってないぞ
537 :
デフォルトの名無しさん :2009/11/09(月) 03:43:03
入出力もファイル処理になってないし コマンドラインも無視してるな
538 :
デフォルトの名無しさん :2009/11/09(月) 03:45:45
C言語ってintは4バイト、byteは1バイトだけど 自分で新しい型をつくることってできるんの? 6バイト扱える型とか
>>539 無理
C++みたいにclassが使えないと
構造体とか共用体で無理矢理関数で似たような事は出来るが
541 :
デフォルトの名無しさん :2009/11/09(月) 03:49:23
542 :
デフォルトの名無しさん :2009/11/09(月) 03:51:06
>>539 typedef char newtype[6];
543 :
デフォルトの名無しさん :2009/11/09(月) 03:53:20
545 :
デフォルトの名無しさん :2009/11/09(月) 04:06:41
レスを向こうにコピペしてから誘導するってのはちょっと新鮮だ
if()
てす
配列とは何かって聞かれたら 大量の変数を一括管理するための機能 でいいの?100点?
2点
配列は配列だろ。それ以上でもそれ以下でもない。
配列とは(多くて)名前を付けるのが極度に難しかったり不合理(数字との対応性が高い)だったりする対象に遭遇したプログラマにはからわ れたコンパイラの便宜でつ
553 :
デフォルトの名無しさん :2009/11/09(月) 13:14:59
単に数が多くて名前をつけるのが大変だからって理由で配列を使うと、
配列の添え字と使用目的を関連づけるのにマクロを使う羽目になるので
たくさんの変数名をつけるのがマクロ名になるだけで利点がないばかりか
マクロであるがゆえの欠点も抱え込むことになる
正解は
>>552 が2番目に挙げた「数字との対応性」
ダイクストラ/ホーア/ダール共著「構造化プログラミング」の データ構造化序論を読むべし
変数の種類が配列じゃなく10万種類とか100万種類ある プログラムを作ってみて、如何にコンパイラが名前のルックアップ 処理に時間をかけているかがわかる筈。
添字付き変数
557 :
デフォルトの名無しさん :2009/11/09(月) 14:13:32
>>555 ふつーにありそうだが?
float real;
float imag;
//...
が10万とか100万とかある状況下で、
これでどうやって名前のルックアップが軽くできるんだ?
float array[100000];
#define real 0
#define imag 1
//...
グローバル変数の数が配列を一つのものと数えて10万個ある プログラムってそうはないだろw
struct{ double B,W,H; int born; int age int virgine; }JK00001,JK00002,JK000003,.............JK100000; とするのか struct{ double B,W,H; int born; int age; int virgine; }JK[100000]; とするのか、同じことをするのでもずいぶんと違うんだろな
>>557 プリプロセッサのシンボルルックアップは重くなるが
コンパイラのシンボルルックアップは軽くなるんじゃないか?
それは
562 :
デフォルトの名無しさん :2009/11/09(月) 15:25:01
>>558 そーだよな
「名前のルックアップ」でいちいち10万エントリをサーチせずに済むようにローカル化するよな
プログラム全体で何万エントリあろうが1時点でのルックアップ範囲は狭く済むようにね
# ルックアップは何もコンパイラだけじゃなく PG 自身もやるわけで
>>559 いや、ここで論じている問題は
struct{
double a[3];
int b[3];
};
#define B 0
#define W 1
#define H 2
#define born 0
#define age 1
#define virgine 2
という配列の用法の是非だる?
>>562 オレは #define より enum を使うぜ
564 :
デフォルトの名無しさん :2009/11/09(月) 16:23:57
>>563 列挙子の数が配列のサイズを超えたかどうか、どうやって調べる?
列挙子の最後にMAXなんちゃらってのを追加して sizeof(配列)と比較する
配列の利点はメモリ上に連続して取られることだろ つまり、配列は連続領域を(静的に)確保及び参照するときに使う複合データ型 規格書に書いてあることでも書いたら100点もらえるんじゃないの ISO/IEC 9899:1999 (E) 6.2.5 Types 20 ― An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type.36) Array types are characterized by their element type and by the number of elements in the array. An array type is said to be derived from its element type, and if its element type is T , the array type is sometimes called ‘‘array of T ’’. The construction of an array type from an element type is called ‘‘array type derivation’’. C99でごめんねごめんね
567 :
デフォルトの名無しさん :2009/11/09(月) 18:36:16
>>565 >>566 列挙子を増やすとサイズが自動的に増加する配列があったらなあ・・・
って要求にほぼ答えられる機能があるわけだが、それでも配列でと頑張ると
別に B へのポインタに +1 で W にアクセスなんかできなくていいけど、
レジスタ割付くらい可能なところでは当然やって欲しいなあ・・・
って要求は諦めることになるよな
int *p; DisplayInside_of_TheVariables = p; DisplayInside_of_TheVariables = *p; これは何がどう違うのですか。
36)オブジェクト型は不完全型を含まないので,不完全型の配列は作ることが出来ない。
>>568 上はint*型の代入で下はint型の代入
>>567 こんなんでどや?
gcc でならコンパイルできるぞ
#include <stdio.h>
enum{HOGE0, HOGE1, HOGE2, HOGE_MAX};
int main(void){
int i, a[HOGE_MAX];
for(i=0;i<HOGE_MAX;i++) a[i]=i;
printf("%d\n", a[HOGE_MAX-1]);
return 0;
}
572 :
デフォルトの名無しさん :2009/11/09(月) 23:10:56
>>571 その HOGE_MAX ってのを自動というかどうかだが、
その例で HOGE_MAX としている列挙子がいかなる識別子とも干渉しないことを担保する
普遍的な方法論はあるのか?
>>572 そんなのある訳無いじゃん
強いて言うなら命名規則で頑張る
ゲーツェーツェー
X Windows Systemに代表されるようにプレフィックスをつけて長い関数名になるんですね、わかります そんな僕は、JPEGやCore Foundationの書き方をリスペクトしている
576 :
デフォルトの名無しさん :2009/11/10(火) 00:27:40
自分の揚げ足を取ることになるが「いかなる識別子」というからにはマクロ名まで含んでしまうな #define a b int a, b; //oops! ・・・て、そういう意図じゃなくwww enum hage {HOGE0, HOGE1, HOGE2}; int a[sizeof(enum hage)]; で自動的に int a[3]; になるような方法ね 仮に HOGE3 を追加する場合、HOGE3 自身と HOGE0, HOGE1, HOGE2 との間に どんな関係を保証させればよいのか、さらに保証させなくてよい(保証させてはいけない)のか、 によって色んな構文・機能を使い分けるわけだよな そこで配列という選択に至る、なるべく仮定の少ない例を聞いているわけだ
577 :
デフォルトの名無しさん :2009/11/10(火) 00:41:32
あきらめたらどう
578 :
デフォルトの名無しさん :2009/11/10(火) 00:43:01
何を?
>576 sizeof(enum hage)ってなんだよ
580 :
デフォルトの名無しさん :2009/11/10(火) 01:01:44
いやまあ 4 にしかならんけど 配列なら int a[3]; sizeof a / sizeof a[0] で要素の数 3 がとれるだろ? それと同様に、 列挙型から列挙子の数をとる一般的な方法はあるかって話 ちなみに今んとこなさそうって思いながら聞いている
そういうことね 列挙型の列挙子の数をとる方法ない(気がする) しばしば、一番最後にダミーを入れたりするが、 enum { foo = 128, bar, baz, dummy }; とかしているときには終わっている そもそも何の目的で列挙子の数を知りたいのかによって、 別の解決方法があるかもしれない
582 :
デフォルトの名無しさん :2009/11/10(火) 01:42:16
>>581 ことの発端は
>>549 でさ
俺が
>>557 と返したら
>>571 ときたわけよ
ダミー列挙子みたいな不純物を必要としない
きれいな方法はバラ変数か構造体で、
配列の用途じゃねえだろって立場をとってたんだ
それで仮に列挙子と配列の要素をきれいに対応させる
バラ変数や構造体よりも合理的な方法を誰か示したら
俺の負けかなって思って詰ろを作って待っていたんだが
みんな寝ちまったみたいだし、俺も眠いし・・・
>>558 グローバル変数が構造体で1億個とかあるらしい>某住基ネット上アプリ
>>583 ネタだと思いたいが、ひょっとして子[1]、子[2]...は駄目で、
長男、次男、三男...とかになってるのだろうか。
>582 >それで仮に列挙子と配列の要素をきれいに対応させる つまり、それは写像だな 列挙子集合E = {x | x e _N}, 配列A = {y | y e _R}が存在し、 f: x e E -> y e Aなるfを定義すれば良い 最初は全単射と思ったが、単に単射(|E| ≧|A|)であればよかった f def= ∀y e A [∃x e E]ごめん、数学そんなにやってないんだ C言語では、 type_t f(enum E x) { int x_dash; /* do_something */ /* 例えば、x_dash = x / 2; */ x_dash = x / 2; return A[x_dash]; } もっとも、 type_t A[N]; /* N = 128とか */ type_t *map(type_t *array, enum E x) { return (array+hash(x)); } int hash(int x) { return x % sizeof A; } となるが、これが合理的かと問われたら、 まったく合理的ではありませんでした、ありがとうございました と言うよりこれは、整数のハッシュ法じゃないかよ
C言語に限らないプログラミング言語一般論の領域 になってしまっている件と、生半可な集合論数学表現とか 振り回す人が出てきてる件について、この話題はいったん休止が 良いかと
>>582 普通についてる
>>560 を何でスルーしたんだろうなぁ
それはそれとして、cのenumはやっぱ不便だよね。
他言語で改良されてる点はまさに改良だなと思う。
>>586 しかもあさっての方向の話はじめちゃってるしね
データ構造上やアルゴリズム上のエレガントな問題解決手段という 理由から配列を使うというのは古き良きアカデミズムな世界の話。 現実のプログラミング現場では名前空間管理の負荷が大幅に 軽減されるというコード作成上のメリットが絶望的に大きいので、 エレガントになろうがなるまいが構造体配列を使わざるを得ない ことが多い。(てかほぼ全て) しかしそこには問題の無理な構造化、規格化による現実との乖離の 危険性が伴うので、問題視する人も多い。
構造体も配列も堅固な理論的バックボーンの成果じゃなくて 苦し紛れに作られたシンタックスシュガーに近い
591 :
249 :2009/11/10(火) 10:13:04
592 :
デフォルトの名無しさん :2009/11/10(火) 10:16:53
>>586 ここで出てきている配列と列挙子は、
C に特有の性質を十分に使っているし、
性能面の評価も C 流だが?
>>587 コンパイラのシンボルルックアップが
実行時のアドレス計算として持ち越されるわけだが
全レスの義務はないし個人的につまらなかったんで・・・
>>591 消したコードを元に何を言ってるんだ?
>>592 プロセッサレベルで元コードが配列として表現
されていたのかそうでないのかを区別することが出来る
とでも思っているのか?
594 :
デフォルトの名無しさん :2009/11/10(火) 11:14:35
>>593 色々仮定をおけば区別がつかなくなる場合はありそうだが
この流れの中でそんなのに構うつもりはない
>>592 実行時のアドレス計算は関係ないよね。
コンパイル時のシンボルルックアップ負荷の話でしょう?
コンパイルにやたらと時間がかかった昔ならともかく、 今でもそういうことって気にすべきものなの?
昔だって気にしないよ
そういうことを気にすべきじゃないよ。 けれど、今でもビルドにやたら(数時間でいい?)と時間がかかる場合は少なくともC++でまれによくある あえてこういう表現にしてみた。
誤解があるといけないので。 シンボルルックアップのせいでやたらと時間がかかる場合があるということではないです。 もしそうなった場合にそれをコードの面で解決しようとすることはないでしょうね
600 :
249 :2009/11/10(火) 13:43:31
「まれによくある」って2ch語?
>>601 ググればすぐ答えが出るようなものを、一々質問してんなよw
まれによくある の解釈 数的には実はよくある がそういうのは集積されており 目にすることは意外に少ない
配列を使うことによるメリットとデメリットを列挙出来る?
出来る
居座ってる人が何をしたいのか分らん
出来るがしない
610 :
デフォルトの名無しさん :2009/11/10(火) 15:58:42
>>595 だから何つっちゃうよ?
プログラム中に何万だかあるシンボルを同一空間に置けつったんだろ
>>560 はよ、でそれを俺はつまんねつったわけ
つーか、#define から enum へもう流れが変わってるんだが、まだ翻訳フェーズ(4)にこだわりたがるのは何でだ?
255歩譲って、翻訳フェーズ(4)の話に戻っても、翻訳環境の負荷を軽くって定量的にどのくらいやるべきだと思っている?
それは配列が向かない用途(断言)に、理を曲げてまで配列を使わせるほどの事情たりえたことが、おまえさん自身あったのか?
そのうえでだが、それは配列の存在意義を聞かれたときの答えとして妥当だと思うか?
オタクがきれた^^
612 :
デフォルトの名無しさん :2009/11/10(火) 16:48:25
C言語の勉強をしたいのですが、関係した資格はなんですか? 情報処理2種ですか?
今は情報処理2種っていう資格は名前が変更になって C言語以外もいろいろ選択できるようになってるけど それでいいんじゃないでしょうか。
614 :
デフォルトの名無しさん :2009/11/10(火) 16:58:30
ニコニコ動画で2009年10月15日に投稿された「【プログラミング】テトリスを1時間強で作って
みた【実況解説】」という動画が人気を集めている(写真1)。公開されてから2週間ちょっとで
15万回以上も再生され,コメントも数多く寄せられている。
内容は,開発ツールのインストールからスタートしてWindows環境でC言語を使い,わずか1時間強
でテトリスを完成させるというもの。そのあざやかな手腕には,感嘆の声がコメントで寄せら
れている。プログラミングそのものがエンタテインメントになっており,1時間強見ていても全く
飽きることがない。
ニコニコ動画で「うp主」と呼ばれる動画投稿者はどんなプログラマなのだろうか?と思い,インタ
ビューを申し込んでみた。うp主の名前は,紀平拓男さん。東京・南青山で携帯電話向けのソフト
ウエア開発会社ブロードテイルを経営する若きプログラマCEO(最高経営責任者)だ。きっとプログラ
ミング初心者の参考になる話を聞けるに違いない,と期待しながらインタビューを始めたが,予想以上に
“すごい”紀平さんのプログラミング歴に圧倒される結果となった。
──1時間強でテトリスを作れるのはすごいですね。プログラミング歴を教えてください。
幼稚園のころからですね。当時,セガが「SC-3000」というパソコンを出していて,これが家にあり
ました。あるとき,親が「ベーマガDX」(注:電波新聞社が発行していたプログラミング雑誌「マイコン
BASICマガジン」の別冊。様々なパソコン用のゲーム・プログラムなどを掲載していた)を買ってきた
ので,そこに載っているプログラムを打ち込んでいました。
当時は「これを打ち込むとゲームができる」という認識しかなかったですが。SC-3000には顔のキャラ
クタがあってそれをBASICのPRINT文で表示して親に自慢げに見せていたそうです。
テトリスを1時間強で作ってみた(ニコニコ動画)
http://www.nicovideo.jp/watch/sm8517855 http://itpro.nikkeibp.co.jp/article/Interview/20091104/340019/
ニコ厨ってだけでちょっとね
あえてまれによくあると表現したのはTMPだとよくあるけどTMPを駆使するのはまれだから。
>>610 おお、どうしたんだい?
そもそもの、プログラム中に何万だかあるシンボルが同一空間にないという仮定を持ち出してはならんぞ。
618 :
デフォルトの名無しさん :2009/11/10(火) 17:29:06
>>617 なんだそりゃ
どっから出てきた? 配列を使うからか?
違うね、配列を使うにしても分割のしようはあるが
おまえさん翻訳フェーズ(4)にご執心なんだっけ
#undef という手はあるが、前述のとおり俺は興味ない
面白そうな話でも出てくれば別だが今んとこ否定する
>>618 ちがうちがう。
配列にする前の、数万だか数十万だかの変数が、同一空間にある可能性を元の話題で否定していないのよ。
ちなみに
>>599 も俺で、
> 配列が向かない用途(断言)に、理を曲げてまで配列を使わせるほどの事情たりえたことが、おまえさん自身あったのか?
もちろんない。
621 :
デフォルトの名無しさん :2009/11/10(火) 18:25:11
>>619 元々が同一空間にぶちまけられた瓦礫の山でも何とかするのが俺らの仕事
そこで配列の出番かどうかが、この流れでの論点だったはずだが、違うかい?
テトリスくらいできるよ馬鹿野郎
1時間でコールオブデューティー4を作る…とかだったら。
624 :
デフォルトの名無しさん :2009/11/10(火) 18:53:39
むかーし、PC ショップであたかも即興でマシン語たたいて得意がってたのがいたが 何のことはない暗記してきたコードを再生していたに過ぎない(本人談
砂漠が良いか賽のが原が良いかってことだったらどちらも かなり困ったもの。程度問題。メリット、デメリットのバランス で決めるべき問題だろ
むかーし、pcショップで文字列を繰り返し表示させて画面を埋めるプログラムを書いたら、 ちょっと目をはなした隙に画面中央にその文字列を色を変えながら表示するプログラムに 書き換えられていたでござる。
それからも書き換え合戦は行われ、生まれたのがWindowsです。 相手は嫁です。
628 :
デフォルトの名無しさん :2009/11/10(火) 19:08:54
0 new cls
629 :
デフォルトの名無しさん :2009/11/10(火) 19:12:31
>>626 POKE 文でアトリビュート変えたんだろな
>>626 実は私が犯人かもしれないw
詰まらないデモが動いてたら今で言う「伝言板スクリーンセーバー」的な
プログラムを動かすくらいはよくやってたから。
それも、リストを覗かれないように一行野郎で。
enum number{ one, two, three, four, five, six, seven, nine, zero };
4の倍数のアドレスにあるintと4の倍数からずれてるアドレスにあるintって計算コストって同じ?
>>632 アドレッシング単位のプロセッサやメモリバスとのミスマッチの
問題は本来はかなり深刻。アドレスによって処理速度がかなり
極端に変わってしまう。
ただPCに限って言えばプロセッサのキャッシュが多層化され、
アドレッシング単位の違いによる相違を吸収されてしまっている
現在あんまし寝た子を起こすような質問をしないこと
634 :
デフォルトの名無しさん :2009/11/11(水) 21:13:55
>>632 境界要求に違反するアクセスの結果を C は言語規則として定めない
大抵はコンパイラが良い位置に配置するだろ。 char a, b, c; int d; とやったら c のあとに1バイトの未使用領域作ったり、 d a b c の順にするとか。
636 :
デフォルトの名無しさん :2009/11/11(水) 21:44:53
自動変数ならレジスタ割付するだろ
ちんこ
ほら湧いてきた
今思うとハァ?な叱られ 「構造体は必ずビットフィールド使え! メモリは少しでも節約するのが常識だ!」 「mallocを無駄がないように確保しろ!」
640 :
デフォルトの名無しさん :2009/11/11(水) 22:40:55
unsigned int *uint; と宣言したものを、 *(long int *)uint; とキャストするとuintは何になるのですか。 long int **uintですか。 int int32; (int *)int32; とか、何になるのかよくわからないのですが。
long int だろ。
642 :
デフォルトの名無しさん :2009/11/11(水) 22:50:21
叱っている側としては 「ビットフィールド、ビット演算とは実体が何かよく理解して使え」 「詳細に着手する前にシステム全体のキャパシティとストラテジを把握しておけ」 「malloc の計算間違いは以ての外、超最低なので絶対にやるなよ」 といっているつもりなんだが、この原発信が 昼下がりに心がすでにアフター5な「ニュータイプ」たちの脳内で どんな減衰劣化を受けているかは、近頃なかなか驚きゃせん だからスパイラルを何回回れるかで道はまだあったりする 甘くも苦くもね
そもそも言われた言葉の意味を理解していないからな
644 :
632 :2009/11/11(水) 23:01:33
レスd ホンとはだめだけどPCなら気にスンナってことか
645 :
デフォルトの名無しさん :2009/11/11(水) 23:17:45
いや、恐いよ 平然とビットズレを一切何の警告もなくやってのけたり 例外をつかまえるのにシステムコールが必要だったり
646 :
デフォルトの名無しさん :2009/11/11(水) 23:18:23
ユーザモードでバッチグーだったコードが特権モードではNGだったりね
プログラマが完璧に制御できてると思ってるmallocは、OSがテキトーに確保してプロセスに渡してるだけ 本当にそれだけ確保したか分からないし中の挙動も分かってない でなきゃフラグメントなんか起こり得ない
648 :
デフォルトの名無しさん :2009/11/12(木) 07:13:04
そのへんは「情報隠蔽」の理念に乗れる人と乗れない人の差だね 別に C++ でなくとも C でもやっぱり解ってなきゃいかん
649 :
デフォルトの名無しさん :2009/11/12(木) 08:27:32
環境 V++2008 express winXP
#include <stdio.h>
int main(){
int a,b;
a = 10;
b = 10;
printf("a のアドレスは:%p\n",&a);
printf("b のアドレスは:%p\n",&b);
return 0;
}
実行結果
0012FF60
0012FF54
参考サイト
http://itpro.nikkeibp.co.jp/article/COLUMN/20061023/251565/?ST=develop&P=2 参考サイトの説明を読んでいるとintは4byteのメモリを確保するので
実行結果の下二桁の差が4になると思うのですが6になります
この値は環境や処理系によって変わるのでしょうか?
ちなみにグローバル変数として宣言すると差は4になります
おまwww 16進数ってしってる?
>実行結果の下二桁の差が4になると思うのですが6になります なんで下二桁だけ十進で引き算するんだ? w
652 :
649 :2009/11/12(木) 08:38:31
でも、そうするとズレは 12 だな。 8 バイトは何に使ってるんだ。
>>636 レジスタに割り付けられた自動変数って、アドレスはどうなんの?
>>649 うちでも試したが 4 byte しか差がない
なんかソースに変なもの書いてないか
656 :
649 :2009/11/12(木) 10:13:21
16進数で考えればいいのかと思って計算してみてるんですがよくわかりません
0012FF60と0012FF54の間は55,56,57,58,59,5A,5B,5C,5D,5E,5Fになると思うのですが…
>>655 とくに余計なものは書いてません。インデント等も削除してみましたが変わりません。
debug環境だろ。Releaseと比べるといい
658 :
649 :2009/11/12(木) 10:30:58
>>657 ありがとうございます。
releaseモードで実行すると0012FF78,0012FF7Cとなって予想通りの挙動になりました。
4バイト境界に乗っていないデータに4バイトアクセスすると、落ちる環境もあるから要注意。 # って、言うまでもないのかな?
660 :
デフォルトの名無しさん :2009/11/12(木) 12:25:11
offsetof()とポインタを無理に使わない限り落ちないけどな しかしバスエラーとは懐かしい響きだ
ポインタのcast絡みが多いね
long int で境界を作っているのに、 そのアクセス用変数をcharなどでキャストすると 4バイトアクセスのはずが1バイトアクセスになるので CPUとコンパイラによってはエラーで落ちる
663 :
デフォルトの名無しさん :2009/11/12(木) 17:30:38
664 :
デフォルトの名無しさん :2009/11/12(木) 17:44:40
制御文字について教えてください。 「\f」は改ページとありますが、実行してみたところ何らの効果もないように見えます。 てっきり実行後はカーソルがコンソールの一番上に戻るのかなと思ったのですが。
プリンタにでも流しとけ
アセンブラやってるとすぐピーンと来るのに、 今じゃ大学でも教えてないからな そもそもツェーのポインタ機能ってのは、アセンブラになりたかったから付けた機能だ。 アセンブラを置き換える言語にしたかったので、メモリをいじれる機能としてポインタを付けた。 決してどっかの変数や関数のアドレスを覚えておくためじゃない。 メモリをいじれるようにしたら覚えておけるようになっただけだ。
(long *)pがACVにならないのに (char*)(long*)pがACVになるってことは規格上で可能?
>>664 一部の端末エミュレータ以外は多分無視されます。プリンタなら改ページ(或いはページ長に相当する縦タブ動作)するけどねぇ。
制御文字も、おかしい。 改行は必須としても、アラームとか必要あるのか。「ペ」とかつって。 そんなものよりも、好きな位置にカーソルが合わせられる機能のほうが重要ではないか。 直前の文字だけ更新したくてもできねえ
数十年も前の話に難癖つけてもな
671 :
デフォルトの名無しさん :2009/11/12(木) 19:02:05
> 好きな位置にカーソルが合わせられる機能 あるよ ただ、標準 C ライブラリにないというだけ C は元々そういうのを【作る立場】の言語であって、その気がない人は別の言語を選択すべき # GC がないのは云々という大たわけを昔よく見かけたが、最近減った?
作ればあるが、そういうのは標準で用意すべきだ。 便利だから標準ライブラリと言うものは存在するわけで これも便利だから標準であるべきだった。
C言語の変数について 宣言をした場合、乱数もしくは未定義の値に設定される。 でおk?
NO
正確に言えば、不明な値ではない。 「そのアドレスに確保した際、そこにあるデータを使う」 前のやつがウンコ流してない公衆トイレ左端の部屋に hoge 変数さんが確保されたら、 hogeさんは「前のやつが流してないウンコ」を得る。 なので、初期化しないでhogeさんを参照すると「前のやつが流してないウンコ」を見ることになる。 だから、正確に言えば未定義とか不定値ではない。
変数が、そのアドレスに確保されるとき、「前のやつが流していないウンコ」があろうが 「ややもすると将来は立派なウンコになったやも知れぬゲロ」があろうが それら全部適当な値で壊して適当な値になる ってんなら未定義とか不定値と言うが、 「前のやつが残していったものをそのまま持ってしまう」ので 正確厳密に言えば不定値ではない。ということである。
正確に言うなら、「俺が今実行としていることにとって無意味な値」 と言ったほうがいいだろう。 ウンコを要求するプログラムを実行しようとしていて、 hogeを確保したら その番地に丁度よくウンコがありました ラッキー と、無意味でないこともあるかもしれないが、それはたまたまだ。
678 :
デフォルトの名無しさん :2009/11/12(木) 19:27:01
>>672 どんな範囲のものを標準で用意すべきだと思う?
C は色んな分野で色んな使われ方をしているのは言うまでもないが、
おまえさんはそれらの和集合を求めているのか、それとも積集合か?
択一選択のような言い方が鼻につくかも知れんが、そこにはっきりとポリシーを持っている点が、
C がバカウケした理由だぞ
見誤ってなければ、改定なんか行われない。 C99でいろいろ追加されたが、あれだって「最初から標準であるべきだった」からだ
680 :
デフォルトの名無しさん :2009/11/12(木) 19:55:06
>>679 あれがねえ・・・
どっちかつーと、古い C にあったメタボ成分を強制から任意へ緩和して欲しかったが
ふたを開けたら逆方向に走っていた、というのが正直な感想だが
例1: 構造体型の返却値
例2: 浮動小数点すべて
681 :
デフォルトの名無しさん :2009/11/12(木) 19:57:18
コマンドプロンプトを操作することは可能ですか? といってclsを実行するぐらいでいいんですけど
system("c:¥¥windows¥¥system32¥¥cmd.exe /c cls");じゃ だめ?
683 :
デフォルトの名無しさん :2009/11/12(木) 20:06:43
>>682 ありがとう。大成功だったよ〜!!
これってOS共通のパスなんですか?
684 :
デフォルトの名無しさん :2009/11/12(木) 20:09:19
system() の効果は system(NULL) を除き処理系定義
環境、プラットフォーム依存です
686 :
デフォルトの名無しさん :2009/11/12(木) 20:13:28
>>684 そうなんですか
OSバージョンも伝えてなかったのに凄いなと思って
ちなみにVISTA HOME BASICでした
すごいもなにもコマンドプロンプトでcmd /?と入れたら いろいろとメッセージが出てくるだろw
>>669 直前の文字だけなら\bで、行の先頭に戻りたいなら\rでできないか?
>>681 Borland のコンパイラセットなら conio に色々用意してあるよ。
画面消去からカーソル移動、他にも便利なのが色々と。
MS の VC++ でやるなら API を直に使うしかない。
と言っても、特に難しくはないから wincon.h 読め。
ほんとにclsだけでいいならstdlibのsystem("cls");
みんな知ってるはずなのに言われないと分からない豆知識 conio conioは熱血硬派である。
コニオってどこかにいそうな名前だね
Cを一通り学習したので何か簡単なアプリケーションを作ってみたいのですが何かおすすめはありますか? リバーシといったような簡単なゲームの類で構いません またみなさんは初めてアプリケーションを作った時はどんなものを作りましたか? よかったらアドバイス等よろしくお願いします
ブラウザ ↓ ブラウザー
ちょっと前までのJIS式に書くならブラウザ
テクスッブアゥズァ
俺は、ウィルスコード作成だった 当時、あまりにもアンチウィルスソフトが反応しなかったので 「ホンマにウィルスを止めるのか」 ということでやってみた ちゃんと止めた 感動した
699 :
デフォルトの名無しさん :2009/11/12(木) 23:20:58
C じゃなかったから、ここに書くのはちょっと・・・
>>693 エロ画をdlするプログラム
スレ指定するだけでそこに貼られているものを取ってきてほしい
同じのを何度も取ってこないようにしてほしい
取ってきたものを整理できる簡易viewerとfiler内蔵だとうれしい
>>693 俺の口座にひたすら金を振り込むプログラムお願いします
C言語はクズばかりというのがわかるスレですね
C言語はもう古い。 使いかってが悪い。 簡単なWindowsアプリケーション作るのもやたら知識が必要だしメンドクサ
706 :
デフォルトの名無しさん :2009/11/13(金) 11:11:42
だから適材適所だと言ってるだろうに GUIはC#でもDelphiでも何でも作れる 速度の必要とする部分だけDLL化してC/C++で作ればよい
ポインタなど、メモリにプログラマが直接アクセスする機能が使えない言語は終わってる。
708 :
デフォルトの名無しさん :2009/11/13(金) 12:08:31
C言語プログラムからUNIXのシェルを起動してshファイルを呼び出し・実行することは可能でしょうか? 裏で実行するのではなく、 バナーが見れるようにシェルを起動してそのシェルでshを実行したいです。
>>708 UNIX機の名前をunix、rshデーモンが動いているとして、
system("rsh unix /bin/sh -c shファイル")で実行できる。
標準入出力はリダイレクトしていないので、実行する端末をそのまま使う。
もし、入力或いは出力を呼び出すプログラムで利用したいのなら、popen()を使えばいい。
>>708 のやりたいことは
system("xterm -c hoge.sh");
じゃないかな
system("banner `hoge.sh`");だったりしてw
みなさんありがとうございますm(_ _)m system()を忘れてました しかしあまりsystem関数に馴染みがないもので… 私がやりたい具体例をあげると コンパイルしたEXEファイルをLinuxで実行すると まず、シェルが立ち上がり そのシェルでwgetを実行します。 同シェルでダウンロードしている状況を見れるようにしたいのです。 (=======>59% などの返事、、)
ようするに、 シェルを立ち上げる作業とwgetと入力する作業 の二つを自動化したいってことです
EXE ファイルを実行できるのか。
つwine
全く具体的になっていない件。
単にシェルスクリプト書けばいいのでは?
dosのコマンドをprintfで出力して実行とかできますか? 例えば #include<stdio.h> int main() { printf("ipcofig /all\n"); return 0; } みたいなかんじで
721 :
719 :2009/11/13(金) 15:10:24
ちなみに僕の中ではこれは出来るってことになってるんですけど なぜ出来ないかわかりやすく説明してください。
>>721 printf()ではできないけど、他の手段できるよ。
>>718 いやシェルスクリプトを実行するシェルスクリプトはいらないです
wgetはシェルスクリプトとして書かれているものとします。
>>719 Unix系なら、そのプログラムの実行モジュールをfooとすると`foo`でできるよ。
>>723 ぐだぐだ能書きはいいから、今までについたレスを全部検討して鯉。
変数に型をつけない言語ってあるけど 計算処理速度遅くなったりコンパイラが混乱を起こして誤作動したりしないのかなぁ?
こういうのって良いの? #include <stdio.h> int main() { int i; int f(int a,int b){return a+b;} for(i=0;i<100;i++)printf("%d ",f(i,i+1)); return 0; }
>>728 Cにおいては特定の関数mainのみから呼び出せる関数fを定義するこ
とは出来ません。
gcc拡張ならできるけどね。
C++ならできるから君も後楽園遊園地でC++と握手してこいよ
>>727 コンパイラが混乱を起こして誤作動したりはしないけど、
プログラマが誤動作することがしばしばある。
親しくなれば型を殆ど明示せずに書く事が出来る良さもある。
734 :
デフォルトの名無しさん :2009/11/13(金) 20:09:07
>>727 B は遅かったが混乱したからではなかったな
型変換を明示する言語が必ずしもすべての変換を明示するわけでは なく、むしろ徹底して暗黙化するものとそうでないものの二極に 分化している件について
const char *s = " #include "textfile.txt" "; みたいなことやりたいときはどうしたら良い?
bin2c
>>736 #define hoge "\
#include "textfile.txt"\
"
const char *s = hoge;
struct a{ __struct { ________int b; ________int c; } a; }; こういう書き方をしてるプログラムを見つけたんですが、古い書き方なんでしょうか?
入れ子にしてるんじゃねえの?
ポインタって%pとかやればアドレスの番号を直接見られるけど、プログラムする場合具体的なアドレスの数値は気にする必要はないの?
%pなんて今の時代じゃ無意味だよ?
番号w
無意味ってこともない。 まあライトユーザには無意味というのは正しいが。
そうね。物理メモリのアドレスなんてふつーは触れないから。
746 :
デフォルトの名無しさん :2009/11/14(土) 00:29:32
それ言い出したら C 自体ふつー触れないし
voidポインタから何かの型ポインタへのキャストって実行時にコストかかってるんですか?それともコンパイル時のコストだけですみますか?
コンパイルして出てきたコードを見るしかないです
経験的にはYesだが保証されたものではない
751 :
デフォルトの名無しさん :2009/11/14(土) 04:33:53
>>749 規格票には何も書かれてない以上断言するのはどうかと
規格票もC言語で書かれている限りC言語と同様の信頼性しかない
753 :
デフォルトの名無しさん :2009/11/14(土) 05:53:00
ポインタのポインタって 記述方法とかはわかるんですけど どういう時に使うものなの?
char **argv
馬鹿発見
void alloc(void **p, size_t s) { *p = malloc(s); }
ポインタの参照をかえたいとき たとえば main(){ x=20; func(x); } void func(x){ x=10; } これを実行してもxの値は変わらなかったからポインタ使ったよな? このfuncの引数xがそのままポインタにした場合を考えればいい
>>754 ポインタを使うとき、を考えれば、ポインタのポインタを使うときも分かるはず
関数の参照渡しで、ポインタを渡したい場合とかね
>>758 ?
普通の変数のポインタを使うときと同じ。 少し混乱しやすいけどな。
なんでC言語って数値がいっぱい型あんの? char型とint型とdouble型だけでよくね? ほかって何に使うの?
>>754 線形リストや二分木でいやというほど使うので、まあそのときにでも。
別にいやになったことはないが
>>756 ディスプレイの電源が落ちてるんじゃね?
>>761 I/Oのレジスタをアクセスするときって、たいていアクセス幅は決まってる
ハーフワードのレジスタは、バイトx2ではアクセス出来ない(エラーが出る)
そうでなくても、データ構造体の中に16ビット長のデータがあることは
普通にあるから、欲しくなるでしょ。IPヘッダとか見てみれば?
数値型がたくさんあるのはいいけど、規格で大きさ統一しない理由がわからん
統一されてたら、今頃サイズの拡張がどうとかでめんどうなことになってたと思うが。
最初からint(4)とかint(8)とかreal(8)とかにしてればよかったんだ
浮動小数は標準には含めないほうが良かったな。 あくまで任意の拡張扱いにしておくべきだった。
質問です。 よく「C言語はコンパイル時の型チェックが厳密」と聞きますが、以下の例などでは人間が気をつけるしかないのでしょうか? #include <stdio.h> int func1(int); int main(void) { printf("%d\n", func1(3)); printf("%d\n", func1(3.0)); //<--勘違い部分 return 0; } int func1(int n) { return n + 1; }
型チェックが厳密なのはC++では?
グーグルで C 型って検索してもC型肝炎のことしかみつからねぇ 死ね
-C型肝炎
自分の検索スキルの無さを棚に上げるなよ情弱君
どっちが良いの? int f1(int min, int max){ return rand()/(RAND_MAX+1.0)*(max-min+1)+min; } int f2(int min, int max){ return rand()/((RAND_MAX+1.0)/(max-min+1))+min; }
それはべつべつの値だろ
剰余で充分。
下位バイトの精度が云々と言うなら下は捨ててしまえば良い。
int f3(int min, int max){
return (rand()
>>1 )%(max-min+1)+min;
}
>>778 min=0 max=100000 RAND_MAX=65535 であるときに出ない値の分布が…
実数を使ったところで、どうせ跳び跳びになるんだから 最大値で撥ねれば良いだろ。 剰余で充分。
精度よりもまず均等にすることを考えろ。 2の累乗以外の結果を求めるなら振り直し法を使うしかない。
これだと、高速で2^32-1までの数字が出せる。
unsigned int xorshift() {
static unsigned int t, x=123456789UL,y=362436069UL,z=521288629UL,w=88675123UL;
t=x^(x<<11); x=y; y=z; z=w; return w^=(w
>>19 )^t^(t
>>8 ); }
メルヘンコースターを使えばいいんじゃね?
右シフト・剰余・振り直し法 この三つを組み合わせれば最強乱数になる。 精度がいい乱数を使えば右シフトは不要だが。
最強はHDDの読み取り間隔で乱数を作るのと思った。 さまざまな要因で速度は変化する。
未定義の動作を起こせば真性乱数が発生してもおかしくはない
>return rand()/(RAND_MAX+1.0)*(max-min+1)+min; これって RAND_MAX に 1 足しちゃうと精度悪くなんね? >return rand()/(RAND_MAX+0.00001)*(max-min+1)+min; くらいで良いんじゃね?
789 :
788 :2009/11/14(土) 17:06:00
一つ重複したらサイクルかよ
一様性は保証されないということ
792 :
デフォルトの名無しさん :2009/11/14(土) 17:56:56
CPUの除算ステップを見ればよい。 俺の大好きなSH4は、除算も1ステップ実行なので 除算に対してビットシフトとかせんでよい。 除算に対して3〜10サイクルもかかっていた頃はビットシフトしか選択肢がなかった
おいおい……
Cゲングでも何でもそうだが、2で割るのに /2するやつはバカじゃ!
ビットシフトで思い出したけど、1/10にするにはどうしたらいいの。 10倍にするなら X = ((A << 2) + A) << 1 でいいじゃないか。
>>795 つ
#include <stdio.h>
double nijyo(unsigned int n){
double sum=1; unsigned int i;for(i=0;i<n;i++)sum*=2; return sum; }
void f(unsigned int N){
unsigned int n,Y,d ;
double X, NJ;
if( N<=0 || N>=(1<<16) ) return ;
for( n=0; ( (unsigned int)1<<n ) < N ; n++ ); n += 15;
NJ=nijyo(n);
X = NJ / N ;
Y = (unsigned int) X;
d = 0;
if( X-Y > 0.5 ) Y++; else d = (unsigned int) ( NJ - (N-1) * Y ) - 1;
printf("x/%5d = (%5d*x + %5d) >> %2d\n", N, Y, d, n ); }
main(){ for(unsigned int N=1; N<65000 ; N++)f(N); }
>>795 32bit数対応版も出来た。64bit演算仕うがな。
#include <iostream>
using namespace std;
void f(unsigned int N){
unsigned int n; unsigned long long NJ,d,Y;
for( n=0; (1<<n) < N ; n++ );
n += 31;
NJ = (unsigned long long)1<<n;
double X = (double)NJ/N;
Y = (unsigned long long) X;
d = 0;
if( X-Y > 0.5 ) Y++; else d = (unsigned long long) ( NJ - (N-1) * Y ) - 1;
cout<<"x/"<< N <<" = (" << Y <<"*x + "<<d<<") >> "<<n<<endl;
//for( int k=(1<<20) ; k < (1<<25) ; k++ ) if ( k/N!=(Y*k+d)>>n ) cout<<"err "<<N<<endl;
}
main(){ for(unsigned int N=(1<<16); N<(1<<18) ; N++) f(N); }
I/Oがたまに他プロセスに取られて動作しなくなるのですが、 どうすればI/Oを取り戻せますか。
(どうして要求されたわけでもないのに車輪の再発明をここに 貼付けるのか問うてみたい...)
800 :
デフォルトの名無しさん :2009/11/14(土) 19:04:52
801 :
デフォルトの名無しさん :2009/11/14(土) 19:08:28
微笑み忘れた顔等 見たくはないさ I/O取り戻せ!
802 :
デフォルトの名無しさん :2009/11/14(土) 19:27:30
んI/O取り戻〜せぃぇ〜〜ぃぇぃぇ。
ユーアーショック! Iで空が落ちてくる!
個人的に許せへんのは、小文字かつ1文字の変数 i とか t とか
なにか問題でも?
807 :
デフォルトの名無しさん :2009/11/14(土) 22:13:31
まあ許せよ、インタープリタ方式の言語が長かった奴の性ってやつよ K&R C が長かったり、長くもなかったりする奴の return(0); は許してるんだろ?
わかりにくい。 もうちょっと何とかならんのかい。 long double ConvertGeometryMatrix(void) というところでインクリメント用変数を使うのだとしたら、 ConvertGeometryMatrix_InclementValue などとすれば一発で分かるのに。
なげーよw
こんな感じか? IntegerVariable MainFunction(IntegerVariable ArgumentCount, CharacterVariable *ArgumentVector[]) { return 0; }
一文字変数に文句言うやつを何とかしてほしい。
まあ、ハンガリアンとかも含めて 中二病みたいなもんだから その内に治まるだろ。 無意味だと気付くまでやりたいようにやらせとけ。
コーディングスタイルにはいろいろある 人それぞれ好みが違う ンなことは分かりきってるし、散々いろんなところで議論されてきたのに やっぱ目の前でモメるとイライラする。それも int First, Second; なのか、 int first, Second; なのか程度で
>>808 なんだよInclementって。わかんねーよ
>>813 int first;
int second;
なんか根本的なところが間違ってる、とまではいわないまでも、考え違いをしているような気がする。 もういちどスタートラインに戻って考え直してみてはいかが?
俺
いやいや俺だろ。
820 :
デフォルトの名無しさん :2009/11/15(日) 02:37:55
1文字ずつ文章を表示するにはどうすればよいでしょうか? かまいたちの夜とか風なサウンドノベルはゲーム用ライブラリなしで作れるものでしょうか?
1文字ずつ文章を表示すればいいです
標準Cだけではサウンドなどむりなので、開発環境にあわせたスレで聞くといい いや聞く前にプログラム系の本を買って来い
823 :
デフォルトの名無しさん :2009/11/15(日) 04:22:21
C言語でMIDIファイルを開くってできる? コンソールで詩を流しながらみたいな感じで
>>823 Windowsをはじめ、多くのMIDIライブラリはC言語で記述されて
ているが、そのようなライブラリとその使用法の情報が入手でき
ることとCコンパイラを持っていることとは同じことではない
グラフィックスやサウンド、ディスプレイなど何に対してもいえるが、 ここにデータを入れると表示するぞ!っていうレジスタがある。 そこに対してアクセスし、データを入れてやれば望みどおりに動くのである。 そのレジスタがどこにあるのか、制御方法は、などは公開されているなら 自分で組むことは可能だが、本来それをやるのはドライバだ。 こういうのは本来何の言語でもできる、特にレジスタいじりやメモリいじりを得意とするアセンブラが最適だが OS上で、という条件があるのなら、あらかじめ用意されている関数群を使うのが早い。 そういうのをAPIという。
異論があるならどうぞ。
動作するまでは、全部変わらない。 結局、特定のレジスタに値を入れて演算させ、アキュームレータから取り出す これを延々繰り返しているだけ。 であることからCでも書けるが、じゃあどこのレジスタに入れるんですか アクセスするときのお約束事はなんですか っていうのは統一されていないので、分からなければドライバやAPIに頼るしかない。
829 :
デフォルトの名無しさん :2009/11/15(日) 06:26:29
レジスタというのが CPU レジスタのこを言うのなら そこでレジスタが出てくること自体が変だ
本日のマメ知識 レジスタってのは、CPUだけにあるもんじゃない。 産業用のコントロールICにも必ずあるし、GPUにも必ずあるし、サウンドチップにも必ずあるし、USBチップにも(ry そのレジスタとの橋渡しをしているのがドライバである。 ドライバはプログラマに専用の制御関数、つまりAPIを提供する。 プログラマが「普段」直接触れるのはAPIだけなので、ハードをまったく知らない素人は気づきにくいが 結局は何であってもレジスタにアクセスし、値を入れているのだ。
何段階もの層になっているので、ハードを知らない いまどきのプログラマには想像できないかもしれないが プログラマが書いたコードが直接ハードを制御しに行ってるわけではない。 API越しにプログラマが値を入れようとする OSを介すならAPIがOSに値が入ったことを通知する OSがAPIから受け取り、適切ならばドライバに値を渡す ドライバはトランスコードを行う ハードウェアに値が渡る 結果を返す ドライバが結果を読み取る (ry 「そのようなことは分かっている」とたいてい言うが、ハードウェアがどのように動いているかまで分かってなければ素人だ。
834 :
デフォルトの名無しさん :2009/11/15(日) 06:56:15
具体的な反論も何も出来ないから素人って言われるんだよw
>>825 >>830 >>831 なんか根本的なところが間違ってる、とまではいわないまでも、考え違いをしているような気がする。
もういちどスタートラインに戻って考え直してみてはいかが?
836 :
デフォルトの名無しさん :2009/11/15(日) 07:14:12
具体的に言えない素人は勉強したほうがいいよ
レジスタがない!レジスタってのはCPUだけ! さすがにここまでの無知は初めて見た。
>>825 以降の変な人は
知識はありそうだが自分でも何をしたいのかわからないプログラマーの末路
そもそも最初の質問がなんだったか関係なく泥沼の戦いを始めてしまうあたり頭悪い
質問者の満足よりも 自分のプライドを優先してるからなw
>>837 組み込み系以外だと、「レジスタ、なにそれ?」とか、「CPUの事でしょ?」というプログラマも多いよ。
ワンボードマイコンの時代に比べ、Cが広い分野で使われるようになった、という事でもあるんだが。
>>841 このコメントが技術レベルを如実に語ってるな
844 :
820 :2009/11/15(日) 11:30:16
やりたければまぁご自由にどうぞ がむばれ
windowsAPIでやれ
「インデント付けろよタコ!」と耳が痛い位講義で言われるんですが if(hoge){ uwaa(); } と if(hoge) { uwaa(); } と記述する場合は他人から見るとどっちが読み易いんでしょうか?
>>847 どっちでもいいけど、スペース無しでペタっとしてるほうが気になる。
宗派抗争スレでどーぞ
有難う御座います 下を使うようにするます
852 :
デフォルトの名無しさん :2009/11/15(日) 14:31:37
>>847 インデントを定義しろタコ!と言い返してやれ
お爺ちゃん お口くさーい
854 :
デフォルトの名無しさん :2009/11/15(日) 15:03:07
リカルデントですねわかります
>>847 cソースの整形ツールに、krオプションとかあるから、好きな方で統一すればいいんでは?
>>838 プログラマーと、業務アプリコーダーとの区別が付かない人が多いな。
struct fuhihi { char flags[2]; }; これぐらいだったら参照渡しより値渡しのほうがはやいよね?
>>856 今、コーダーって人いるの?
メインフレームの世界ではかつてコーダーがいたそうだが。
HTML/CSSコーダ
>>859 struct fuhihi func(struct fuhihi arg);
HTML/CSSはコーディングとは言わないが 現在のWebページでスクリプト使わないことは 殆ど無いので、JavaScriptが事実上必須となる。 JavaScriptはJavaとは別物と言えども、Javaの 素養があるのと無いのでは相当違うんで相当の 実力が必要。Cプログラマは決して見下すべき ではないんじゃないかと
プログラミング関係ないが、HTMLをまともに知らないヤツが多すぎる。 タグで挟めばいいんだろ? 程度にしか考えていないのは、もうね...
>>862 極めて動作の遅いWebブラウザ環境でのJavaScriptプログラミングは
意外にも、DOS全盛期の遅いPC向けのプログラミングに似たきわどい工夫が決め手なこともよくあるんで腕が立つ人じゃないと任せられ
ないと聞くね。
865 :
デフォルトの名無しさん :2009/11/16(月) 04:17:16
ちょっち質問なのですが、スレ違ならすんまそです。 C言語はボケ防止に繋がるでしょうか? 最近、警備員に就職し頭を使わないせいかボケかけています。 どうでしょうか?
Cに限った話じゃないけど 新しいことを始めるのはボケ防止になるよ
867 :
デフォルトの名無しさん :2009/11/16(月) 04:56:29
サンクスです。
ポインタが難しいって言われるのはなんでじゃ。 ただのアドレスっしょ? ポインタを利用したテクニックやアルゴリズムとかは難しいかもしれんが ただポインタっていう概念はぜんぜん難しくないじゃん 何が難しいの?バカ?
869 :
デフォルトの名無しさん :2009/11/16(月) 05:42:07
概念自体はまったく難しくないが Cの文法上ポインタの扱いが糞なのは確か 理解している人もいれば混乱している人もいる 一部の混乱しているひとが「難しい」と言っているのが一人歩きしているだけ
×難しい ○めんどくせーよ
出来る人にとっては、何が難しいのかわからないってだけ。
typedefで解決
873 :
デフォルトの名無しさん :2009/11/16(月) 07:46:55
ポインタはアドレスではないのだが、
>>868 のように混乱している人も
いるってことだな。
それが難しいと呼ばれる理由はそれがそれをこれをそうする からであって決してそれがそんなにそれほどそうこうするわけ でもないので、それほど難しいものでは無い筈なのどがあのように このように難しいというそのいわゆるそれが出てくるわけで....
事実は逆で ポインタも理解できないようなバカも C言語を入門するようになったってこと
いや、ここ君の日記帳じゃないんで 情報が埋もれるだけだからマジ勘弁して
ポインタが使われている文は、その関数やブロックの処理内容の 全体あるいは周辺に対する関係がかなりわかっている 人にしか読めないと思ったほうが正解なのでは? ディテールから入り最終的には全体を完璧に理解する というボトムアップ方式で読んでいく対象としては全く 向かないと思う。「わかっている人にだけ読める文、あるいは 書いた本人しか読めない文」
879 :
デフォルトの名無しさん :2009/11/16(月) 18:01:30
ということは Hello world も書いた本人にしか読めないわけか
わかりかけのある時期は誤解していないか酷く悩むことも あるだろうな。とりわけアブソリュートアセンブラを使う 機会が失われた世代以降は。
882 :
デフォルトの名無しさん :2009/11/16(月) 23:29:11
いやー俺は推奨した憶えはないね どこの馬の骨とも知らん奴にあーしろこーしろと干渉する気はないんで 電子土方が自分の仕事をどう思っているかなんて人それぞれだし いかにも学生風な発言を見ててもご覧のとおり
誤爆?
if( i == KEY_INPUT_LEFT || i == KEY_INPUT_RIGHT || i == KEY_INPUT_UP || i == KEY_INPUT_DOWN || i == KEY_INPUT_NUMPAD1 || i == KEY_INPUT_NUMPAD2 || i == KEY_INPUT_NUMPAD3 || i == KEY_INPUT_NUMPAD4 || i == KEY_INPUT_NUMPAD5 || i == KEY_INPUT_NUMPAD6 || i == KEY_INPUT_NUMPAD7 || i == KEY_INPUT_NUMPAD8 || i == KEY_INPUT_NUMPAD9 ) break; こういうのもっときれいに書く方法はないもんでしょうか? ちなみにこのマクロはビットマスクではないです
配列に入れてループ
switch-caseでもいいだろうけど、出力されるコードは似た感じじゃない?
スタティックであるスレッドを作ったのですがその中のセンサー値(1or2)を スタッティック外部でも扱わなくてはならなくなりました. 方法として,スタティック内でセンサー値が1の時Senser1.txt センサー値が2のときSenser2.txt もしくは Senser.txtがあるとき1ないとき2のように 決めて外部でそのファイルがあるか無いかで判別しようと考えました. とても,不細工なことをやっていると自覚しています. 何かよい方法をご存じありませんでしょうか?
>>887 ファイルの有無で調べる程度なら
グローバル変数 と volatile 修飾でおk
>>1 ・開発環境や動作環境も晒すと答えが早いかもしれません。
環境にあったスレに行って貰うほうがいいけどな
>>884 判定をinline関数(orマクロ化)しちゃうかな。
方向キー・テンキー・ファンクションキーみたいな区切りで。
// Arrowキー or 0以外のNumキー
if(isArrowKey(i) || (i!=KEY_INPUT_NUMPAD0 && isNumKey(i))){
}
KEY_INPUT_NUMPAD1〜KEY_INPUT_NUMPAD9が連番であることが保障されているなら、
(i>=KEY_INPUT_NUMPAD1 && i<=KEY_INPUT_NUMPAD9)
としても不可じゃないかな?
俺はやらんが。
891 :
デフォルトの名無しさん :2009/11/17(火) 09:43:03
メモリの使われ方を学ぶ為にc言語の学習を始めたのですが 再帰処理をした場合はスタックに大量の変数をつくるので メモリを食う+速度が遅くなる+スタックオーバーフローの可能性とデメリットが多いように思うのですが メリットは数式を単純化することで長々とコードを書かなくても良いくらいですか? また上記の問題を解決するのに末尾再帰というのがあるようですが普通にforやwhileでループさせる以上に メリットがあるものなのでしょうか?
>速度が遅くなる ループと再帰を比べたらって言う話?
893 :
891 :2009/11/17(火) 09:50:00
事故再起はループと同じなんじゃなかったっけ
> また上記の問題を解決するのに末尾再帰というのがあるようですが普通にforやwhileでループさせる以上に > メリットがあるものなのでしょうか? 末尾再帰は処理系によっては最適化でループにしてくれる そうするとコードが見やすいというのはメリットだと思う
>>891 簡単にループに直せるような再帰ならループで書けばいいし
クイックソートだってgoto文を使って再帰なしに書くのもそう難しくはないが
ループ終了条件が面倒だったりするとどうか
あまり再帰の例を知らないのだと思うが、もっと調べてみればメリット・デメリットについては納得がいくと思う
897 :
891 :2009/11/17(火) 10:20:35
>>894 >>895 ありがとうございます
オブジェクトコードを吐くときに処理系によっては最適化してくれるのですね
見やすいコードで書けるということが自体がメリットということで納得できました
再帰は教育で使うのは良いが、実践で使うな。 保存しなくていい情報まで記録する可能性、動作遅い可能性 いいことなし。
899 :
891 :2009/11/17(火) 10:37:47
>>896 ありがとうございます
おっしゃるようにもっと調べてみてメリット・デメリットのバランスを把握しようと思います
900 :
デフォルトの名無しさん :2009/11/17(火) 10:46:20
よしよし、よく
>>898 をスルーした
それでいい
再帰なんて普通に使ってるが・・・
コードが短くなる可能性があるから実行時コストも配慮しつつ一応は視野に入れるべき
クリティカルにパフォーマンスに影響しない限りは、 可読性を優先した方が良いからな。 資源をケチるのは、本当にケチる必要のある時だけでいい。
>>891 >また上記の問題を解決するのに末尾再帰というのがあるようですが
いや…
「処理が末尾再帰の形になっていたら、途中経過を保存するローカル変数は
それ以降使わないということなので、その処理はループに書き換え可能」
ではあるが。
コードをいかに短くできるかということは大事だ 保守、バグ減らしに効果的 可読性の減る改行へら氏などはのぞく。
ループで間単にできるんなら再帰は使う必要はない。
そりゃそうだ。その逆もあるしな
使う必要は無いが、最適化で一緒になるなら使っても別に問題はない。
最適化に期待するのはどうもねえ
最近の話題でvector<string>とvector<string*>のsortがあった。 前者は最適化されて後者と速度は変わらないといってたやつがいたが 実測すると大きな違い。
911 :
デフォルトの名無しさん :2009/11/17(火) 12:55:41
スレ違い
STLのswapが特殊化されているため、ポインタと付け替えと同じ事が実体に対しても可能だという説。
「特殊化されてないんだ」って感想書きこんだだけなのに 勝手に発言を最適化しないで欲しい
最適化を信頼するのは良くないって事だ。 せいぜい、無駄な計算や同一計算の除去くらいに思っておくといい。
915 :
デフォルトの名無しさん :2009/11/17(火) 13:43:43
最適化を期待するのは悪いことじゃないが 頭の悪いコード書いといて言い訳に最適化を言う奴が許せんのよ それと最適化と言える範囲を微妙に勘違いしてる奴とは話がかみ合わなかったりね
templateで、メタで再帰させるなら話は別
C言語でtemplateとかSTLとかってどうやんの?
はっきり「スレ違い」つっても理解できない奴に そんな迂遠な揶揄が通じるとも思えませんが。
だからスレチだと何度いえば まぁ、俺様プリプロセッサを通せばできそうだけどな
STLは昔すべてマクロで書かれており、それをインテリジェント 化して構文に取り入れたのがC++ ってか、太古のC++は実質的にマクロ記述に過ぎず、C++記述を Cのコードに変換してCとしてコンパイルしたものだとか。 その面影はMac-OS-Xの中心的開発言語 Objective-Cにも残ってる。 OCはオブジェクト指向の拡張部分を使わなければ完全にC互換だし なぜC/C++とスレを分けるのか少々疑問
Mac(笑
でっていう
ディレクトリ(フォルダ) のツリーを手繰ってファイルを列挙しなきゃいけない時 とか それに類似した構造のデータの総なめとか そんなケースは再帰しちゃうな。 構文解析とかも再帰のほうが記述しやすいんだろうけど、 俺の中では出番がほとんど無いので実感なし
再帰はコードの文字数が減るので、単純ミスの混入が少なくなるので その意味では保存性は良いが、僅かな勘違いミスとかで破損すると すぐに動かなくなるデリケートさも持つ。(だからと言って非再帰 は常にデリケートじゃないというのも嘘だが) しかし問題は実は別のところにあるんじゃないかと
コード書くときにコメントの有効範囲をしめすためだけにスコープ置いたりするんだけど変かな? //〜〜する処理 { ・・・ ・・・ ・・・ } 見たいな感じで
俺は見たこと無い。 もし見かけたら何の意図でそうしたのか悩むかもなぁ。 ただ改行入れるんじゃダメなん?
ORが連続しオアーオアーオアオアオアーってなるときゲームの場合、関数呼び出しで対応することもある。 関数のポインタを用いてしまうのだ。 まあ普通はビットシフトだな ゲームパッドの入力は割り込みコントローラのレジスタを参照すれば何が来たか分かるのだが その数値を見てしまうとマイク・バイソンのスーパーコンボである。 だから特定数ビットシフトする。 パッドキー上を入力すると0xFF80が、パッドキー右を入力すると0xFF7Fが、とか規則性があるから これを多桁ビットシフトしても数値は規則どおりに並ぶ。 で、この数値にそってテーブルを書いて参照すればよい。
CUIのままで自身のHWNDを得るには?
>>929 NULLを受け付けてくれるかどうか調べる。
だめだったら、非表示のダミーのウィンドウを作ったりGetConsoleWindow関数を使ったりする。
>自身のHWND そんなもの無いだろ。 CUIアプリはウィンドウを持たない。 ウィンドウのオーナーはそのCUIアプリじゃなくて conagent か何か、あくまで他のプログラムだろ。
スレチ
signalで呼び出した関数に引数を渡すにはどうすればいいの?
グローバル変数でいいのでは どうせsignalはグローバルなものだし
せめてstaticにしておこう。
このスレのレベルでは、問題ない。 厳密な解釈で言うなら、sizeof(long) == sizeof(int)でsizeof(long) == sizeof(float)なら問題ない。 尚、sizeof(int) != sizeof(long)の場合はメモリ確保ではなく出力が問題。
>>936 たまたま。
CPUのアーキテクチャによっては、alignmentがあわなくてバスエラーを起こす可能性がある。
struct foo { int i[2]; long l[3]; float f[2] } x;
について &x.f[0] と &x.i[0] の差が sizeof(int)*2+sizeof(long)*3バイトであるとは限らないのと同じ。
d。ふーむ じゃあメモリをいっぺんに確保して細かく振り分けていく方法は場合によっては危険なわけか
そんな方法を思いつくのが
>>939 それ、初心者にはお勧めできない。
>937の2行目のようなミスを犯すような奴にもお勧めできない。
ある型のポインタにキャストできることと、それが指す変数に アクセスできることは同じではない その変数に
しかし出来てしまう処理系が殆ど
>>941 変数を構造体に押し込んで外枠をallocする方法が定石?
allocせんといかんのか?
やけに気の利くmallocな話だな
石の中にいる!
>>944 寧ろ初心者は自前で管理するべきでない。
>>946 構造体が 環境依存によるバスエラーの回避としてメンバ配置に気を利かしてくれている ので
malloc は言われた大きさの連続した領域をかえしてあげるだけ
(だが、その戻すポインタが、いきなり上記のバスエラーを起こす値だったりすると都合が悪いので
ポインタ値が sizeof(int) や sizeof(long) 境界になるように実装していることもある)
951 :
デフォルトの名無しさん :2009/11/18(水) 19:45:31
> 環境依存によるバスエラー 環境依存によらないバスエラーってあるのか
バスエラーにならないマイコンがある
>>926 やるやる。
同じような用途の変数を複数使うときに、名前をそれぞれつけなくていいから便利。
>>950 阿呆は黙って露。
って返すだけではなんなんで、まともな人に質問。
>937の2行目の条件を満たさない、初心者レベルで扱うような環境は何かある?
>>954 少し前は無料でコンパクトなコンパイラとして lsi-c86 試食版が使われることが結構あった
>>955 LSIC-86は、ディフォルトでは何らパディングをしなかったのでは?
そもそもx86は(ペナルティがあるかは兎も角)バスエラーは起こさないわけで。
Win32環境で16bitDOSアプリを動かす場合、アクセス違反メッセージ を出して落とすのはWin32のほうで、これは古いDOSアプリが不正な (想定外な8086流儀に反する)アクセスをしている場合大抵怪しいアプリだったので、動作させて欲しく無いという願いが込められている のではないかと
↑あほ
>>957 Win16 on Win32はDOSアプリのすべてをエミュしてるわけじゃ
なく例えば旧AT互換機のBIOS領域直接アクセスとかは不正アクセス
として落としていたような記憶が...
ポインタって実態は 「ちょっと機能が変わってるINT型」 なんだな。 そのINT型の数値を利用してメモリの論理アドレスを操作できるというかそんな感じだな。
まだ早くね? 980ぐらいでいいだろ
963 :
デフォルトの名無しさん :2009/11/19(木) 12:59:35
なんか、このスレ自体、存在意義が終わってね? > C言語の*入門者*向け解説スレッドです。 > 初心者、初級者の方は他の質問スレのほうが良いかもしれません。 だぜ
>・C++言語はスレ違いです。 C++言語はなぜか余り使われていないので答えるスキルを 用意してません。 だろw
C言語で、引数 char *bufを書き換えるにはどうするんですか。 f( char* &buf) だと出来ますけど
DLLなどで、char *buf; int size; f(buf, &size);で値を受け取る場合があると思うのですが。 これは参照使うんですか。 C言語のDLLで参照は使えるんですか。
参照を使ったDLLの関数は、純粋なCコンパイラで動作するのかが知りたいです。
調べたところDLLにすると、 ポインタ値渡しが、ポインタ参照渡しに自動で変換されるようですね。 確実かはわからないのですが。
>>965 戻り値を使え。
char *buf;
buf = f(buf);
何でもかんでも参照渡しばっかりで 戻り値を単なる成否チェックにしか使ってないの見るとイラっとくるよな。
DLLでやってた方法は、
char *in , *out;
int insz, outsz;
f(in , insz, out, outsz);という値渡しでした。 だから
>>968 は間違えました。
>>969 その方法でサイズを取得したい場合は構造体にすればいいと思いますが
C言語から参照を使ったDLLは使えないんですか。
これがしりたいです。
安全の為には、構造体の戻り値にすればいいのですが、 異なる戻り値の関数毎に構造体を定義しないといけないのが不便なのですが。
もうちょっとまとめて書けよ。 どれとどれが同じ人の書き込みなんだ?
>>970 C に参照なんざないのに、その辺の用語も怪しいのが
質問乱発してるのはもっとイラっとする。
mov ax,1000 mov bx,[ax] これがポインタや参照の正体だろ
>>974 参照を使ったC++で作ったDLLはC言語で動作するのかしりたいんです。
以下の○に0個以上2個以下の文字を入れてちょ ○○渡し:その変数の複製を参考資料の形で渡すこと。変数を 呼び出し先が変更しても、呼び出し元の変数には影響が出ない。 ○渡し:その変数の価値、すなわちその変数そのものを呼び出し先に 変更することを許可する形式で渡すこと
>>976 めんどくさいから、動作しないことにしておけ。
>>976 大抵は動くだろうが、何の保証もない以上
やってみろ、としか言えない。
出来ないなら、コンパイル時にエラーになるんじゃ
981 :
デフォルトの名無しさん :2009/11/19(木) 17:04:17
他言語との互換性でいちいちエラーにされてたら通るコードも通らんわ
通常のC/C++環境には無いWindows特有の引数評価順序指示 C++の特徴の重複名称の改竄 この難所?をクリアすればC++でもDLLファイルは作れる。 がこれは完全にWinAPIスレの話題じゃないかと
>>975 型のサイズに対してよきにはからってくれる機構の部分が…
ある場合では
mov bl,[ax]
別の場合では
mov bx,[ax]
mov cx,[ax+2]
>>980 DLL のエントリが実際にどういう引数をとるかなど
コンパイラの知ったこっちゃない。
プロトタイプに「ポインタである」と書かれていれば、その通りに呼び出す。
>>984 造語ってみた 複製渡し 即渡し
即値じゃ リテラルしか取らない意味になっちゃうからなぁ…
void func(int& param)
混乱するんで次の言い方を推奨(但し自己責任で使用) 参照値複製渡し==>参照値をつまり複製を渡す 変数内部名称渡し==>変数そのものを渡す Cは基本的に参照値複製渡し C++で変数内部名称渡しが解禁された。
lccというcコンパイラで実験してみたところ
参照渡しは出来なかった。
>>985 参照渡しなのにヘッダは値渡しで書いたら無理でした。
でもLCCが参照に対応してて&をいれたら動作したけど。
参照非対応、参照対応のどちらのコンパイラでも動作させるのは無理かも。
>>989 Cでも記号&は変数に対するアドレス値変換演算子として定義されているお
C++での参照変数型であることを宣言する型接尾修飾子&とは
違うんで混同しないやうに
プロトタイプ宣言せんでDLLの関数呼び出したりするのか
992 :
デフォルトの名無しさん :2009/11/19(木) 18:04:05
>>991 スレ違いになるので詳細は説明せんが
もろにそういうのがある
993 :
989 :2009/11/19(木) 18:05:41
これだとLCC C++非対応コンパイラで動作するけど、参照削ると動かん
だから
>>985 の説は間違えてる。
//main.cpp
#include <windows.h>
extern "C" int WINAPI add(int &x,int &y){
int z;
z=x;x=y;y=z;
z=x+y;
return z; }
//main.def
LIBRARY DLL
EXPORTS
add
//test.c
#include<stdio.h>
#include<windows.h>
typedef int (WINAPI *fnc)(int&, int&);
main(){
HINSTANCE hd = LoadLibrary("dll.DLL");
fnc add = (fnc)GetProcAddress(hd,"add");
int a,b;
a=5; b=4;
printf("a+b=%d a=%d b=%d\n", add(a,b), a, b);
getchar(); }
どのCコンパイラでも、fnc(int&);というのは通るんですか?
>>993 >typedef int (WINAPI *fnc)(int&, int&);
だからこれ参照渡しだっつの阿呆。
利用側 typedef int (WINAPI *fnc)(int*, int*); で宣言 add(&a, &b); で実際に呼び出す これ以外の文法は Cの範疇外じゃないの?
C++において記号&は2通りの意味で使われる。一つはCと互換。 もう一つはC++独自の拡張(ただし、ある程度は混同できる) Cでは一通りの意味しかない。
999 :
999 :2009/11/19(木) 18:32:15
999
1000です
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。