1 :
v(^o^i)d :
03/11/23 11:01
4 :
デフォルトの名無しさん :03/11/23 11:05
あたCに訊けー!
6 :
デフォルトの名無しさん :03/11/23 11:47
#define CONST_DATA 200 で定義されている、CONST_DATAを実行中に変更させることってできます?
7 :
デフォルトの名無しさん :03/11/23 11:52
ふざけたすれたてんな!! 削除依頼だしといたぞ
9 :
デフォルトの名無しさん :03/11/23 12:37
いや、今度の回答者は女みたいだ
とりあえず画像うpしてもらって
それからでも削除以来は遅くない
とりあえず
>>1 の画像うpまで、体育座りで待て
10 :
デフォルトの名無しさん :03/11/23 12:52
ボーランドのHP見れねえ コンパイラどうしよ・・・
>>6 ビルド時にプリプロセッサがソースファイルに出てくるCONST_DATAと言う文字列を200に変換してから
コンパイルを書けているのでもちろん無理です。
不可能はありません。実行時コード書き換えを使用しなさい。
13 :
デフォルトの名無しさん :03/11/23 14:34
新しい言語の作りたいのですが コンパイルはどのように作れますか?
14 :
デフォルトの名無しさん :03/11/23 14:46
コンパイルを作るには、まず魔道物語を買い戻す必要があります。
int main(int argc, char* argv[]){ printf("hello"); } 等のスクリプトをコンパイルして実行形式に 変換させるにはどうすればよかんべ?
>>12 ほう...
#define CONST_DATA 200
char a[CONST_DATA]
なんてのもできるんだな。
まあがんばれよ。(藁
>>18 出来ない理由がない。プリプロセッサの動きを真鍋。
実行中にコードを書き換えるのだからできますね。
馬鹿ばっかり。
とりあえず、
>>19-20 は、二度と来るな。
学校はまじめにいけ。はやくドーテー捨てれるといいな(w
>>21 て言うか、ネタにたいするレスにしては
>>19-20 は全然面白くない。
煽りにも低脳ぶりが表れてるな。
>>23 なんだ?
セミコロンがないからコンパイルエラーです。
とかそう言うコメントが欲しかったのか?
何を守りたくてそんなに必死になっているのかよく分からない。
>>24 いや、レスがつまらんだけだが ?
ひねりも何もないし。
ネタにそんなレスして楽しいの ?
>>25 まぁ、なんにせよ
>>24 の最終行に答えてくれ。
それによってはお前にとって有利な態度を俺が取る可能性もある。
ワイド文字ってどんな時に使用するのでしょうか。
>>26 はぁ ?
ネタって言ってるのが理解できてないのか...。
お前が取れる俺にとって有利な態度は、回線切って早く寝ることだ。
即実行してくれ。
>>28 >ネタって言ってるのが理解できてないのか...。
/*
ほう...
#define CONST_DATA 200
char a[CONST_DATA]
なんてのもできるんだな。
まあがんばれよ。(藁
*/
皮肉ったつもりが自爆したようにしか見えないが。
で、それを隠そうとやっきになっていると理解している。
>>29 そうなんですけど、何のために用意されているのかがイマイチよく分かりませんでした。
大抵、必要になったら分かりますみたいな説明しかされておらず、こんな時に使いました
的な解説が見つからなかったもので。
例えば UNICODE で書かれたファイルを弄ったり、 UNICODE を使う必要のある API を使ったりするときに 必要になる。
使い道を知らないでワイド文字を知ってるとは面白い奴やな
>>34 Win32APIのヘルプでも眺めてりゃいやでも目にはいるかと。
MessageBoxA()とMessageBoxW()は同じページにあるわけで。
>>31 はぁ ?
まあ、自己書き換えを拡大すりゃプログラム全体の書き換えも可と解釈できるから、何でもできるよ。
それを自己書き換えって言うか普通 ? って言う皮肉だがそれがどうかしたのか ?
それに対して、
>>20 の笑いどころがわからんだけだよ。
あと、
>>19 の「プリプロセッサの動きを真鍋」に至っては、意味不明だし。
39 :
デフォルトの名無しさん :03/11/24 00:17
て言うか
>>38 って向こうのスレのスレッドセーフ厨だろ?
>>39 確かに向こうのスレにはいたけどROMってた人だよ
なんか文章多くて面倒くさくて全然読んでなかったけどね
元レス >#define CONST_DATA 200 >で定義されている、CONST_DATAを実行中に変更させることってできます? から書き換えたいのはCONST_DATAだとわかる >実行中に変更させたい とのことからすでに実行ファイルであることがわかる #define CONST_DATA 200はプリプロセッサにより処理される これにより実行ファイルにはCONST_DATAを識別する情報は残らない 結論 不可能
うわー、すっげぇ粘着やね
>>41 と、俺が約12時間前にその結論を出しているわけだが。
レスいただいた皆様どうもありがとうございます。
>>30 ,33
UNICODE ですか。UNICODE は使った事がありませんが、char のままだと
バックスラッシュ等がそのままプログラムに渡されてしまうからという事です
よね。
>>35 Windows でプログラミングはした事はありませんでした。
>>41 CONST_DATAはなくなっても、200という情報は残るだろ。
それを書き換えるってことだろ。
>>45 #define CONST_DATA 200
#define HOGE_DATA 200
200がCONST_DATAだと確認する方法は?
>>46 どこでCONST_DATAを使ったか探す。
逆アセンブルすりゃええやろ。
↓じゃあやってみろよwとレス
VC++ の混合モードで万事解決
しねぇなぁ。最適化しちまうとソースの順序が保存されないから。
粘着厨と、それを執拗に叩く椰子、どっちもウザい。
>>49 逆アセンブルしてもCONST_DATAじゃなく200としかわからないが?
>>49 逆アセしてわかる理由を教えてよ。
マクロは保存されるの?
お前ら落ち着け。
>>6 が望んでいるのは、実行中に #define CONST_DATA 200 が書いてあるヘッダファイルを書き換えることだ。
これだったら、宿題レベルだろ ?
>>56 >
>>6 が望んでいるのは、実行中に #define CONST_DATA 200 が書いてあるヘッダファイルを書き換えることだ。
それになんの意味があるというのか。
>>57 そんなことは、
>>6 に聞けよ。
専用のヘッダファイル書き換えツールかなんかなんだろ。(藁
>>59 またお前か...。
>>38-40 ププッ、そんなに悔しかったのか。
久々に知ったか厨が大量に釣れて楽しかったよ。(ケケッ
かをりたんハァハァ
>>61 久しぶりに知ったか房を釣ってると言ってる知ったか坊を釣れて楽しかったぜ(プゲラ
>>63 無限ループですか?
>>62 「ケケッ」ってのは小学生の時読んだ漫画以来だな。ちょっとこころ暖まった。
へけけっ
>>63 おやおや君は、i++ がアトミックだとか自信満満に言ってた奴か ?
それとも、「マルチプロセッサならコードを二重に実行するとか思ってんのか」と間抜けな突っ込みいれてた奴か ?
まあ、何もわからずに周りで騒いでた厨房なんだろうな。
どうせ結論も理解できなかったんだろ。(ケケッ
>>66 友達のいない理系大学2年生と言ったところか。
お前、社会に出たらこれほど遊べる時間なん無いんだぞ。
もうちょっと外に出てぱーっと遊ばんと一生後悔するぞ。
>>66 やっぱお前各地で荒らしてる奴だな?
>>66 の奴もなんか荒れてきたからROMってたけどそのときも荒らしてたろ?
>>66 おまえ
>>69 各地ってどこよ。
その時っていつよ。
アフォは、おとなしくしとけよ。
freadについて質問させてください。 freadの引数は(ptr, サイズ, 読み込む個数, stream)だと思うんですが、 fread(ptr, sizeof(型), 1, stream)を fread(ptr, 1, sizeof(型), stream) というふうに書いてるソースを見かけました。 結果は同じになるんですけど、この記述のしかたに何か利点はあるんですか? それとも単に間違ってるだけ?
戻り値が違うんだよな。一応。
読み込み失敗の場合に1byteずつ読み込んだ個数を表示させて どこまで読み込みに成功したかを知るためとかですか?
74 :
デフォルトの名無しさん :03/11/24 18:37
75 :
デフォルトの名無しさん :03/11/24 18:41
なるほど。ありがとうございます。
教えて君ですまないです。 あのーPrintScreenキーを押してデスクトップ画面を取得できますよね。 それが共有メモリ内に入るのはわかっているのですが、できれば格納さ れているメモリアドレスを知りたいのです。どうすればいいのでしょうか? WinAPIで解決できるのか、それともポインタで解決できるのか 皆様教えてください。
> あのーPrintScreenキーを押してデスクトップ画面を取得できますよね。 できません! 何度押してもできません!
すみません 開発環境はVC++6.0です。
>>78 クリップボードに何が入ってるか調べてみた?
>>81 さん
Win2kで作成していますが、コマンドラインで"clipbrd"と打ち込んで
クリップボードの内容を確認はしました。これはBitMap形式での画像が
入っているのでは?と思っているのですが・・・。違うのですか?
ご親切のどうもです。スレ違いでしたね。 あちらで同じく聞いてきます。
配列の要素数を求めるにはどうしたらいいでしょうか? たとえば int a[]={1,2,3,4,5}; としたときは、5つの要素がありますが、 5という数字を求めるにはどうしたらいいでしょうか?
sizeof a / sizeof (int)
もしくは sizeof a /sizeof a[0]
#include <stdio.h> #define ELEMOF(array) (sizeof (array) / sizeof *(array)) int main() { int a[]={1,2,3,4,5}; printf("%d\n", ELEMOF(a)); return 0; }
>>86-88 ありがとうございます。
バイト数から求めればよかったんですね。
90 :
デフォルトの名無しさん :03/11/25 06:27
-0.90以上0.90以下のdoubleの乱数を発生させたいのですが どうすればいいでしょうか?
>>91 分解能の意味がわかりませんil||li _| ̄|○ il||li
>>92 整数なら話は早いわけだ。
0〜5なら取りうる値は0 1 2 3 4 5の6個しかない。
でも、実数になると、
0.0〜0.5とすると0.499もそうだし0.499999999も該当するわけで
事実上無限のサンプルが存在してしまう。
だから「少数第何位の精度で」みたいな分解能がいると思ったんだ。
三流大学出の俺は。
rand() は 0〜RAND_MAX までの乱数を与える。 これを加工して -0.90〜0.90 の値になるよう調整すればよい。
出来ました サンクス
96 :
デフォルトの名無しさん :03/11/25 10:27
#define MAX_POINTS 1600 typedef struct{ double u, v; double x, y, z; }POINT; typedef struct{ POINT point[MAX_POINTS]; int count; }DOM; void main(){ DOM domain[16];//DOMAIN型の配列を宣言する POINT newpoint;//POINT型の変数を宣言する ・ ・ ・ ・ VC++6.0でこういう宣言文で実行するとMAX_POINTSが1600なら動くけど 1700以上に書き換えると止まるんです。メモリは足りてます。何故だかわかる人教えてください
>>96 スタックオーバーフローが疑われる。
newで確保してみてOKならソレ。
>>97 mallocだろ・・・
staticつけるってのも手か。あくまでも原因追及のためなら。
即レスありがとう スタックオーバーフローってなんですか?
>>100 コンパイラオプションでスタックサイズを変えられたはず
105 :
デフォルトの名無しさん :03/11/25 11:50
Windows95のDOS窓 + TurboC++5(hugeモデル)で以下のコードが memset実行時にハングアップしてしまう。 その瞬間、画面が乱れて固まるから、どこかVIDEO関係の領域に 書き込んでいるらしいが、ソースを見ても問題ないように思えるのだが。 #include <stdio.h> #define BUFSZ(0x2000) static char *bufp; int main() { if ((bufp = (char *)malloc(BUFSZ)) == NULL) { printf("malloc fail\n"); return -1; } memset(bufp, 'A', BUFSZ); }
106 :
デフォルトの名無しさん :03/11/25 11:54
>>105 それ以前にエラーになるが
BUFSZと(0x2000)の間は開ける。
mallocを使うならstdlib.hをインクルードする。
さらにmemsetを使うわけだからstring.hも必要だな。
みんなの言うとおりコンパイラの問題だった。ありがとう!
>>105 far ポインタとか huge ポインタとかなかったっけ?
関係ないか、もはや記憶が薄れてるな…
110 :
105 凡ミス :03/11/25 12:20
悪い。ヘッダをインクルードし忘れてた。 しかし、この程度でDOS窓はおろかWindows本体がフリーズしてしまうのか。 DOSプログラミングって大変だったんだな。
16ビットポインタでは64KBを超えるメモリをアドレス できないから、セグメント:オフセットの変則的なポインタを 導入する・・だっけ
farとかnearポインタの使い方が解らないです・・・ あれって出来たほうがいいの?
113 :
デフォルトの名無しさん :03/11/25 13:09
2次元配列のポインタを渡すにはどうしたらいいのでしょうか? hoge(int aho[ ][ ]){ int a; a = aho[1][2]; } main(){ int aho[10][10]; hoge(aho); } とかだとダメですか?
>>113 この質問何回目だろう・・・
hoge(int aho[][10])
それと戻り値の方を省略したらintと見なされるから整数を返す。
すみません自己解決しました hoge(int aho[10][10]){ 〜以下略〜 とかにしました。 この場合hogeに渡されるのはahoのアドレスで、hoge()内でもう一つintの10*10の配列の領域を作って確保するってことですよね? 一次元の時のようにわざわざhoge()内で新しくahoの領域を作らないでやるって事は2次元配列では出来ないでしょうか?
>farとかnearポインタの使い方が解らないです・・・ VRAMとかアクセスするときに unsigned char far *vram_ptr = 0xXXXXXXXX; って使ってた気がする。 スモールで作ってるぶんにはあまり必要なかったような
みんな115はネタだと悟ったのかな
>>115 hoge に渡されるのは aho のアドレスで、
hoge 内で配列が作られることは無い。
C言語の字だけで野球ゲームを作ってみようと思うんだが バットが当たって角度の計算とか数学の知識が載ってるホームページ知りませんか?
質問です 動的二次元配列作りたいんですけど、これって問題ないですかね? double **d; int n = 4, i, j; d = (double **)calloc(n, sizeof(double)); for(i = 0;i < n;i ++) d[i] = (double *)calloc(n, sizeof(double)); for(i = 0;i < n;i ++) { for(j = 0;j < n;j ++) printf("%lf ", d[i][j]); putchar('\n'); }
d = (double **)calloc(n, sizeof(double*));
>>120 それは、ポインタの配列であって二次元配列じゃない。
123 :
デフォルトの名無しさん :03/11/25 19:39
y x 144.734630943.5366044 144.734630943.53666032 144.73462743.53672098 144.734626243.53677836 144.734622843.5368377 というような数値の組が40個あって、これらをプロットすると長方形が傾いた形になります。 これを以下の式で回転させてプロットしてみたところ、ものすごくいびつな形になりました。 x1が回転前の数値で、x2が回転後です。 x2 = x1 * cos(-A) - y1 * sin(-A) y2 = x1 * sin(-A) + y1 * cos(-A) 同じ計算をエクセルで行うとちゃんと回転できました。 何が悪いのでしょうか? 数値はdouble型で、c言語でVC6.0++使ってます。 どなたか意見ください。
y x 144.7346309 43.5366044 144.7346309 43.53666032 144.734627 43.53672098 144.7346262 43.53677836 144.7346228 43.5368377 です。見苦しくなってしまった。
>>123 ソースが無いと(漏れには)コメントできないっすね
とりあえずx1,y1,x2,y2を出力して
エクセルの結果と照合して問題のありそうな
部分を絞ってみては。
>>123 いびつになったということは計算の桁オチかなにかが起こっただけだろ。
128 :
デフォルトの名無しさん :03/11/26 00:00
質問です。 BCCでの設定なんですが、bcc32.cfgファイルの中身を -I"c:\Borland\Bcc55\include" -L"c:\Borland\Bcc55\lib" にしたときに -H -Hs を後ろに追加しておくことをおすすめしますといわれましたが、 どう追加すればいいんですか? お願いします。
>>125 照合したんですけど、すべての値が変で、変な形になっちゃうんですよ。
>>126 桁落ちですか…、防ぐ方法はあるんですか?
>>127 プロットはプログラム走らせてx2,y2をcsvファイルに出力した後にエクセルを使いました。
何回も見直したけどプログラムに変なとこはなさそうなんです。
丸め誤差かな?
すいません、わかりました。
>>129 どうしてもバグが見つからない時は、自分では絶対間違って無いと思ってるところでミスってることが多いよ
FLOATをINTで計算してたりね
0から任意の整数nまでの乱数を発生させたいとき、 nをRAND_MAX以上にしたい場合にはどうすればよいのでしょうか。
srandで初期化する。
別の疑似乱数ジェネレータをつかいましょう。
>>131 ほかの人にも見てもらったんですけど、特に
間違ってそうなところはないんですよ。
各点の距離はすごい小さいんで、
丸め誤差がかなり影響するのかな…?
>>123 自分で言ってる内容に間違いが無いなら他人が分かる訳ないでしょ?
だから、コードを晒しなさいよ。
理屈と式を言うだけで、
それでそれを実行するコードに見落としや間違いがあるかなんて他人に分る訳?
例えば、
二つの数字の組があって(1,1)(2,2)…
それぞれを足すと、単体の数字の二倍になります。
でも二倍に為らないんです。下の式を使ってます。
ans1 = 1 + 1;
ans2 = 2 + 2;
どうだ?こんなんで、そのプログラムの問題点をアドバイス出来るか?
>>134 ありがとうございました。
MTってのを使ってみます。
確かにメルセンヌツイスターが妥当やね
>>136 それもそうですね。
問題の回転する関数部分をさらしてみます。
{
int i;
double rad; /*ラジアン*/
FILE *fp;
fp=fopen("a.csv","w");
rad= ; /*回転させたいラジアンを入力*/
for (i=0; csv[i].Longitude!=-1; i++){
csv[i].Longitude = ((csv[i].Longitude-csv[0].Longitude) * cos(rad)) - ((csv[i].Latitude-csv[0].Latitude) * sin(rad)) + csv[0].Longitude;
csv[i].Latitude = ((csv[i].Longitude-csv[0].Longitude) * sin(rad)) + ((csv[i].Latitude-csv[0].Latitude) * cos(rad)) + csv[0].Latitude;
fprintf(fp,"%lf,%lf\n",csv[i].Longitude,csv[i].Latitude);
}
fclose(fp);
}
Longitudeが
>>123 で言うxで、Latitudeがyです。
どちらもdouble型です。40組のデータがこの構造体に入っていて、41番目に-1が入っていて
ループの終了条件としています。
ループの中は、i=0番目のデータを基準としてほかのデータをradだけ左回りに回転させます。
ではすみませんが、意見よろしくお願いします。
csv[i].Longitude = ((csv[i].Longitude-略 ↑で書き換えたものを↓で使うが良いのか? csv[i].Latitude = ((csv[i].Longitude-略
for (i=0; ←いきなり基準点がズレテルラ csv[i].Latitude = の行で使ってる csv[i].Longitude が上の行で書き換えられとる
>>139 math.h はインクルードしているか?
Longitude, Latitude は double 型か?
配列 csv には正しい値が格納されているか?(全く回転させずにプロットしたら歪まないのか?)
fprintf の変換指定は %lf ではなく %f
変換指定で精度を指定してみたか?(デフォルトでは精度が低いことがある)
極点へ近づくほど経度あたりの距離が小さくなる.その手の問題はあるか?
>>139 まさか航空機の管制システムとかに関わってないよな?
もしそうなら手を引いてくれ
怖えよ
>>139 一時変数などを使って、愚直にわかりやすく書いたほうがいいと思う。
(Make it simple and stupid!)
const double rd = -(...);
const double xb = csv[0].Longitude;
const double yb = csv[0].Latitude;
for( i = 0 ; csv[i].Longitude! = -1; i++ ) {
const double x1 = csv[i].Longitude - xb;
const double y1 = csv[i].Latitude - yb;
const double x2 = x1 * cos(rd) - y1 * sin(rd) + xb;
const double y2 = x1 * sin(rd) + y1 * cos(rd) + yb;
csv[i].Longitude = x2;
csv[i].Latitude = y2;
...
}
みなさんどうもありがとうございます。
さらしてみて正解でした。
>>144 一介の学生です。たまたまこういうデータいじってるだけです。
>>139 あとあと使いまわすなら
関数にしたほうがすっきりするかもね
void kaiten(double *dx, double *dy, double x, double y, double ox, double oy, double rad) {
double rcos = cos(rad), rsin = sin(rad);
double x1 = x - ox, y1 = y - oy; /* 原点に移動して回転 */
*dx = x1 * rcos - y2 * rsin + ox;
*dy = x1 * rsin + y2 * rcos + oy;
}
/* 原点(origin_x,origin_y)を中心にして回転します */
kaiten( &(csv[i].Longitude), &(csv[i].Latitude),
csv[i].Longitude, csv[i].Latitude,
origin_x, origin_y, radian);
149 :
デフォルトの名無しさん :03/11/26 19:20
関数正常終了とエラー終了の場合って、普通はなにをリターンすんの? 私はいま、 正常:return 0; エラー:return -1; だけど、これって、ふつーなん?
150 :
デフォルトの名無しさん :03/11/26 19:23
>>149 普通
ポインタならエラーはNULLかな
exit (2) とかとは違う?
152 :
デフォルトの名無しさん :03/11/26 20:03
失敗で0の時もある
>>152 そーなんだ!
今度からはこれが流行します
その関数の呼出し元に必要とされている戻り値を返しとけばいいの
mainの事いってるんじゃないの?
メイン関数の話か・・それは失礼でした。
int mainはUNIX互換OSでプログラム組んでる人で void mainはそれ以外だと聞いたけど 結局のところ return 0 の意味を理解してない俺… ここにいる人でもわかってない人っているのかなぁ? 無知から有知に逝くために return 0 の意味しらべてきまつ
>>157 気になるなら EXIT_SUCCESS でも返しとけ
UNIXはコマンドが成功した時は0、失敗した時は0以外を返すしきたりがある 紛らわしいけどな
結局のところ !0 とすればいいのかな
二重否定はわかりにくい表現の常套手段
>>165 >UNIXはコマンドが成功した時は0、失敗した時は0以外を返すしきたりがある
となってるらしいからしょうがないよ…
偽は0だけど、真は0以外でヨシとされてるから
>>169 もしかして「傾向」と言いたいんですか?
>>170 TTるる〜
そうですそうです
いつも言葉が足りなかったりして…
文才無いから小説読もうかなって思うんですけどなかなか行動できなくて...
>文才無いから小説読もうかなって思うんですけどなかなか行動できなくて... こんなもんに勇気とかなんか色々いるのか? 人生なめんな。
やる気と金が要る。
ここにいる奴らはアセンブラのCPUレジスタの0フラグに対する比較命令という物もしらんのか。 まさか #define true 1 #define false 0 if(flg == true) とかやってんじゃないだろうな。 if(flg != false) としろ。
>>172 ・・・勝手に勇気とか文章変えないでくださいよ
人生をなめてるわけじゃないけど、やる気が起きないですので動けないです
>>173 そうなんですよ、やる気が必要なんです
小説って400円とかそれぐらいじゃないんですか?
>>174 そのまえに
flg = true
flg = false のみにしておけば問題にならないかな?
言ってること違うかな
>>174 bool 値なら if(flg) でええやん。
>>177 一見正しいこと言ってるけど
boolはC++からだよね…残念
_Boolはどうした。
>>178 bool 型の値じゃなくて一般的な bool 値のことを言ったんだが。
フリースタンディング環境なら void main もありうる、とか今さら乗り遅れたネタで混ぜっ返してみる。 main の返値に付いては正常終了、異常終了だけじゃなくて、多くの環境で異常時のエラー種別も 返したいという要求があるから、正常終了が 0 になるのは致し方ないところと思われ。
>>182 それだと、一般的な値の0かそうでないかを比較したいと思ってるように見える。
たとえば、if(count) みたいに、個数が 0 かそうでないかで分岐するとか。
こういう書き方は分かりにくいので俺は嫌いだ。
あくまで「真偽にみせかけた整数値」の場合のみ
このような if(flg) といった表記を使うのだということで、
「bool 値」と言ったわけだ。
>>184 は
=====================
int *i = NULL;
(色々処理)
if (i) printf ("%d", *i);
=====================
とかって方法は嫌い?
>>183 漏れは1つのmain関数で無数の実行環境に対応する方が無理があると思っている
ここだけ条件コンパイルしない風習は馬鹿げている
>>186 どっちにでも取れる玉虫色だな
void main(void)にしておけば無数の環境で動いてくれて (゚д゚)ウマー
dane
>>188 そうやってできたプログラムは
シェルスクリプトやバッチファイルから使いにくくなるので
(゚д゚)マズー
今までc言語でBMPとRAWしか扱ってこなかったんですけど、 JPGを扱えるようにするにはどうしたらよいですか? JPGのしくみを学んで1からプログラム作るしかないんですか?
>>191 JPGを扱うフリーのライブラリくらいあるだろ
194 :
デフォルトの名無しさん :03/11/27 02:22
次のスレタイは 「C言語ならあしたに聞け」 にしませんか?なんか文学を感じます
訊けだろ。
やっほ〜、僕だよ〜。
ほっちゃんとセクース出来たら死んでも良いよ。
C言語というか H8マイコンスレってある? 探しても見つからん(´・ω・`) よかったら教えてください
202 :
デフォルトの名無しさん :03/11/27 21:18
hosh
hash
204 :
デフォルトの名無しさん :03/11/27 23:10
205 :
デフォルトの名無しさん :03/11/27 23:15
>>174 の違いなんですけど、if(flg == true)と書いても
if(flg != false)と書いても、コンパイルしたら一緒
ってなことはないでしょうか。
>>205 最適化コンパイラならきっと良きに計らってくれるでしょうね。
アレ賢くてびっくりするよ。ほんと。
>>205 一般的に、trueと比較する場合は定数との比較なので律儀にそれに見合ったコードが作られる。
falseの場合は0との比較なので、比較以外の手頃なニモニックを使うコードが作られる場合もある。
なので、falseと比較する方をお勧め。
#つーか、flg == true とか flg != false なんて書かずに単純に flg でいいと思うのだが。
そもそも if(flg == true) と if(flg != false) はなにが違うの?
flg は int なんだから、0, 1 以外の何かが入ってても構わんわけだ。 たとえば isalpha とかの is 系は 0 or 1 の2値を返すんじゃなくて、 0 か「それ以外」を返すことが多い。 この「それ以外」は 1 以外のものも含んでいる。 だから、flg = isalpha((unsigned char)c); みたいなことしていた場合、 if(flg == true) としてしまうと判定漏れしてしまう。
関係ないけど、isxxx系のマクロって何で!=0でdefineしないのかな? #define isalpha(c) (_ctype+1[(c)]) ではなく、 #define isalpha(c) ((_ctype+1[(c)]) != 0) にしておけば if (isalpha('A')) のようなbooleanな文脈なら普通の条件判断に、 int chartype = isalpha('A'); のような文脈なら1or0が得られるのに。
205です。皆さん、ありがとうございます。
自分の環境(旧M社マイコン)では違いがなかったものですから、質問してみました。
自分は、この辺のこと意識してなかったので、
>>210 さんの書いたようなことで
はまったかもしれませんね。
>>210 そもそもBOOLとして定義された機能ではない。
そんな物にfalseだのtrueだのを適用してはいけない。
言語の処理上可能だとしても。
>>213 制御構造と論理系演算子を使うな。と言うことですね。
215 :
デフォルトの名無しさん :03/11/28 01:48
forkで作成した子プロセスpidを強制終了させるには どうしたらよいのでしょうか?
windows板で質問したのですが、答えてくれないかもしれないのでこちらで質問します。 C言語でプログラム作成しようと思ってコマンドプロンプトからEDITエディタを 立ち上げようとしたのですができませんでした。 XPからはEDITエディタが付属されなくなったのでしょうか? また、それに変わるエディタが付属されているのでしょうか?
のてぱdつかえ
>>216 >また、それに変わるエディタが付属されているのでしょうか?
そりゃあるけどさ・・・
お前、そもそもどこから "EDITエディタ" なる単語を見つけてきたんだ?
edlinエディタwがありませんか
>>215 UNIX の場合なら答えられるんだがな
>>217 何ですかそれは?
>>218 知っているのでしたら教えてくださいよ〜
「EDITエディタ」は某本から見つけますた。
>>219 ありました。ありがとうございます!
と言いたいところですが・・・
EDITエディタと違って行頭に'*'が付くし、改行するとヘンな番号が出てきます。
それに終了する時(途中も含めて)はどのコマンドを使えばよろしいのでしょうか?
>>220 残念、Windowsでつ。将来的にはRed Hatでも使いたいと思うのですが。
>>221 できるかもしれませんが、ややこしくなりませんか?
C言語と関係ないし。消えろよウザい。
>>215 unixならunixスレへ。その他の場合も環境に準じたスレへ。
>>216 いい加減にしておけ。
>>224 環境問わないCスレもあっただろう。
特定の環境に依存しないCなんて何十年二もわたって語り尽くされた分野だろう。
となるとここはいらないクソスレと言うことになる。
解らないなら素直に解りませんと書くか出てくるなや。
ププ
>>225 このスレはC言語の基本的な部分を質問するスレだろ。
何か嫌なことでもあったのか?
++と--は汚いから使用禁止。
>>229 阿呆ハケーン。
for (int i = 0; i < n; i += 1)
とでも書くつもりかね。
そう書いていますが。
むしろ for (int i = 0; i < n; i = i+1) だろう。
何気にC99とは
Cなのにfor文の初期化式で変数宣言ですかそうですか
>>234 いい加減 C99 ぐらい押さえとけよ、オールドタイプ。
C99完全準拠のコンパイラほすぃ。
そういえばVC6.0で for( int i=0; i<8; ++i ){} for( int i=0; i<8; ++i ){} こう書くとエラーになるんだけど・・・
環境依存は専用スレへ 「Microsoft 言語拡張機能を無効にする」にチェックすればOK
int i=strcmp("moji","retsu"); なぜかiが0になる。
#define for if(0) ; else for
for を置き換える事ができないんじゃね?
むしろ唐突にそんなことを書く
>>241 に(゚Д゚) ハァ?
237に反応しているのでは?
C言語についての質問です。 プログラムの実行開始位置のmain関数の書き方は、int main(),main(),int main(void),int main(int argc, char* argv[]) など本によっていろいろですが、その違いを教えていただきたい。
int main(),main()...OSに戻り値を求めるか求めないか int main(int argc, char* argv[]),int main(void)...コマンドライン引数を受け取るか受け取らないか
>247 main()はint main()の省略版で意味は同じだが。
>>246 1.int main() → 引数は任意,戻り値は int
2.main() → 引数は任意,戻り値は int (C では型を省略すると int 扱いになる)
3.int main(void) → 引数はなし,戻り値は int
4.int main(int argc, char* argv[]) → 引数はコマンドラインから取得,戻り値は int
C の仕様では3か4.
2は説明の手間を惜しんでいるのか
1は C++ と勘違いしているのかも(引数省略時,C では任意の引数,C++では引数なし)
>>249 他から呼び出すことがないために、int main()でもint main(void)でも実質変わらないからでは?
C++では、mainの呼び出しは禁止。Cでは容認されていたはず。
252 :
デフォルトの名無しさん :03/11/28 19:00
#include <stdio.h> FILE *main(void){return stdout;}
>>251 いや、容認されていても呼び出すことはまずないでしょ?
>>246 ネタでしょ?
基本知識的な物は自分で調べてみなよ
int main(){ static int i = 0; if ( i < 5 ) main(i++); return i; } 無理矢理だが一応呼べる
256 :
デフォルトの名無しさん :03/11/28 19:05
0x100ゲット
よくわかりました。どうもありがとうございました。 >254 すみませんが、ネタではありません。以後、自分で調べるようにいたします。 そこで、C言語について、お勧めのサイトがありましたら、教えていただきたいのですが。
260 :
デフォルトの名無しさん :03/11/28 19:10
>>259 知らないサイトがひとつ・・・
ちょっと見てみよう
>>259 嫌がらせだなw
あまり多くても困るっしょ
あと
>>257 の文才も尊敬するな。
気兼ねなく教えたくなるような感じだ。
んで俺が言えることは、それも自分で調べたらどうよ?って事
あと本買いな。本についてはそのスレがあるから、そのスレを参考にするといいよ
コンパイルしたら Fatal: Error detected (LME279) Fatal: Error detected (LME347) Warning: Failed to create state file ファイル名.tds (error code 0) と出るのですが・・・
私の拙い質問に親切に答えてくださった皆様方、どうもありがとうございました。
>>249 >2は説明の手間を惜しんでいるのか
坊やにはわかんなくていいの
>>250 >実質変わらないからでは?
仕様と実装を混同する痛厨にえさをやらないで下さい
>>266 > 仕様と実装を混同する痛厨
( ´,_ゝ`)
|| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
|| 荒らし煽りは 。 Λ_Λ いいですね。
|| 無視! \ (゚ー゚*)
http://www.2ch.net/accuse2.html ||________⊂⊂ |
∧ ∧ ∧ ∧ ∧ ∧ | ̄ ̄ ̄ ̄|
( ∧ ∧ ( ∧ ∧ ( ∧ ∧ | |
〜(_( ∧ ∧ __( ∧ ∧__( ∧ ∧ ̄ ̄ ̄
〜(_( ∧ ∧_( ∧ ∧_( ∧ ∧ は〜い、先生。
〜(_( ,,)〜(_( ,,)〜(_( ,,)
〜(___ノ 〜(___ノ 〜(___
270 :
デフォルトの名無しさん :03/11/28 21:45
コンパイラ作りたいんだけど、もしかしてマシン語も理解しないといけないの?
[directshow]って何だすか???関数け???
272 :
デフォルトの名無しさん :03/11/28 21:55
、kkjhg
>>272 読んだけどわからないっす・・・すいやせん。
DirectXのビデオ関係のコンポーネント
DirectXのビデオ関係のコンポーネント????またよくわからない言葉が・・・ printfのような関数とは違うみたいですね。じゃあ何だべ?ごめんなさい。
>>276 C言語とは無関係
悪い夢を見たと思って忘れろ
アセンブラが別にあればアセンブリ言語まででもOK
コンパイラは面倒いので まずインタプリタを作るといいと思うよ。
CインタプリタならC言語で作れそうだね
質問いいですか?とあるサイトで見た先頭に要素を追加していくリスト構造なんですが、 以下のプログラムで、while文を終えたときに先頭の要素(top)は一番高い値のアドレスなんですが、 for文でp=p->nextとすると、pが指すアドレスの値が低くなっていくのが分かりません。 なぜなんでしょうか? typedef struct list{ char *str; struct list *next; }LIST; main() { char strbuf[BUFSIZE]; LIST *top = NULL; /* リストの先頭要素 */ LIST *p; while( gets( strbuf ) ){ p = malloc( sizeof( LIST ) ); p->str = malloc( strlen(strbuf)+1 ); strcpy( p->str, strbuf ); if( top == NULL ){ /* 先頭が空なら、次の要素も空 */ p->next = NULL; }else{ p->next = top; } top = p; } for( p=top; p; p=p->next ){ printf( "%s\n", p->str ); } }
順番に追っていくと、 1. top=NULL 2. top=list1->NULL 3. top=list2->list1->NULL 4. top=list3->list2->list1->NULL となるから、別におかしくない。
286 :
デフォルトの名無しさん :03/11/29 05:37
ね〜フォームの値を変数に入れるのってどうやるの? Web言語しか知らないから良く分からないの。 submitされたらどう処理すれば変数に入れられる? (質問の仕方が違うかも:))
291 :
デフォルトの名無しさん :03/11/29 17:14
あたしに聞け!
292 :
デフォルトの名無しさん :03/11/29 17:17
オラが聞く!
c?C++のスレのが流れがいいなw
むこうは必死な香具師が多いからな
なんでグローバル変数は必ず0で初期化されるのに ローカル変数は不定なの?
グローバル変数は変数領域を使うけど、変数領域はmain()実行前に初期化される。 ローカル変数はスタック領域を使から、そこにはゴミが残ってる。
ローカルのほうは呼び出されるたびに何度も初期化されるというのも 関係あるのでせうか?
>>298 そうでないと不便だろ?
毎回初期化したくないならstaticにすればいいわけだし。
>>295 int a=5;とすれば5に初期化されるから「必ず」ではないですね。
>>297 >main()実行前に初期化
^^^^
ダウト!
しかしまだいいが
>>300 これは痛杉
氏ね
はいはい、それで?
Q地球に大気があるのはなぜでしょう? A便利だから
>>306 大気(おおき)君がいると授業中に黒板が見えません。
大気君はもう少し身長をさげてください
FILEよりSTREAMの方がかっこうよかったのにぃ
309 :
デフォルトの名無しさん :03/11/30 10:46
C言語ってソースが上から順に実行されますよね。 それを同時に動かす事はできませんか? 例えばCで絵を書く場合とかです。 時間を使って考えることは分かるんですけど。
>>309 マルチプロセスにするか、マルチスレッドにするか…
どちらにしても、このスレでの範疇は超えてますね。
書き忘れましたが、GUIアプリじゃなくて関数を使って 絵を書きたいんです。そんな関数あったと思うんですけど。
コンソールでどっと単位で絵を描くってこと?
環境に依存するのかもしれませんが、線を引く関数や円を書く関数があって、 それを使って無理やり絵のように見せるといったほうが正しいでしょうか。 情報の小出しになってすいません。ソースをコピペしたほうがいいですか?
>>317 BASIC時代のLINE絵って感じか。
319 :
デフォルトの名無しさん :03/11/30 11:18
すみません 質問させてください。 ・mallocなどを使用し確保した領域に対して、入出力ストリームを任意に割り当てることは可能でしょうか? つまり、メモリ上に展開したファイル(の中身)に対して、seekを行いたいのです。 (テンポラリに一度書き出せば簡単にできるわけですが、メモリ上で全て行いたいのです) よろしくお願いします。
>>319 無理
つーかそんなもの添え字やポインタを操作するだけでしょ?
>>319 環境によるだろうな。
UNIX系であればioctl使えば出来るだろうけど。
ありがとうございました。もうちょっと自分で考えてみます。
>>319 mallocで確保しなくても「一時ファイル」を作成する関数があるよ
>>324 むしろ俺
>>323 をアホと呼んでくれ、(テンポラリ使いたくない)といってるのに書いてしまった…鬱
>>319 ファイル全体のサイズでmallocしておいて
そこへfreadかなんかで全部読んでおく
あとは煮るなり焼くなり犯すなり
終わったらwriteで書き戻す
ってだけのことか?
でなくてファイルマッピングのようなことがしたいなら
特定OSスレへ逝ったほうがいい
mmapのことならmallocなんか呼ばないわな
329 :
デフォルトの名無しさん :03/11/30 12:12
strdup()という標準関数がありますが、 char *p; p=strdup("Hello,world"); printf("%s\n,p); とした場合、 free(p)をする必要はあるのでしょうか? 必要がある場合、 printf("%s\n",strdup("hello,world\n"); などとした場合、どうしたらいいのでしょうか?
330 :
デフォルトの名無しさん :03/11/30 12:14
>>329 標準関数にはstrdupなんてありません(多分C99にも)
必要かどうかはマニュアルに書いてあるでしょう。
> printf("%s\n",strdup("hello,world\n"); > などとした場合、どうしたらいいのでしょうか? どうしようもない。 もしstrdupがNULLを返すこともあるならこれは危険だよ。
>>329 >printf("%s\n",strdup("hello,world\n");
>などとした場合、どうしたらいいのでしょうか?
しないで下さい。マジレスです。
333 :
デフォルトの名無しさん :03/11/30 12:18
printf("%s\n", "hello,world\n");
334 :
デフォルトの名無しさん :03/11/30 12:24
(; ・`д・´) !? (`・д´・ (`・д´・ ;)
ファイル->メモリへのマップ(つまり、mmapだな)じゃなくて、 メモリ->ファイルへのマップが欲しいんじゃないの?
みなさんありがとうございます。 自分の書き方が理解しづらくすみません。 自分がやりたいのは ・ファイル全体のサイズでmalloc ・そこへファイルポインタAからfreadで持ってきたデータを流し込む ・流し込まれたデータを煮たり焼いたり ・ファイルポインタAは閉じてしまう ・煮たり焼いたりしたデータをライブラリに渡す (seekableなファイルポインタを渡さなければいけない。だからファイルポインタが欲しい) 非常に回りくどいやり方ですが・・・。
こんなライブラリは嫌だ! スレでも立てて晒しとけ。
>>338 それは普通は一時ファイルを作るしかないと思われ。
一時ファイルをメモリ上に作成できるかどうかはOS次第。
嫌がらないでtmpfileを使うのが得策だと思うけどなぁ。
一時ファイルを使いたくない理由が知りたいですね。
>>343 メモリより遅くていやーーーー!とか?
気になるほど巨大なファイルとも思えないけど。
もしかしたら 16ビット OSつかってるかもしれないぞ!
やはりテンポラリを作らねばならないのですね。 ありがとうございました。 >一時ファイルを使いたくない理由 理由は以下の通りです。 ・煮たり焼いたりした後のデータをユーザに見られたくない ・遅くなる(サイズは5MB前後です) ライブラリのソースがあるので、そちらを書き換えることもできないことも ないのですが。しかし、ライブラリが多少複雑であるのと、バージョンアップに 対応できなくなると大変なので・・・。
5Mのメモリを確保するのは結構気分悪いな・・・
>>347 > 煮たり焼いたりした後のデータをユーザに見られたくない
環境によってはそれは大丈夫かも
(うちの環境ではファイルcreate直後にunlinkでもしているのか、tmpfile()から戻ってくる時には名前が消えている)
名前が無くてもアクセスする方法があるかもしれないけど(^_^;)
>>347 ・一時ファイルをユーザに見せない方法なんて、いくらでもあるぞ。
・一時ファイルをメモリ上に置く方法もOSによっては用意されている。
だから、後はOS次第なんだからUnixスレなりWin32APIスレなりでどうぞってば。
352 :
あすたりすく :03/11/30 12:58
ここのループなんだけど教えて{ srand((unsigned)time(NULL)); a=rand()%4+1; do{ printf("\n\n\n\n\n%d\n",a); printf("↑の数字を覚えましたか\n1.はい\n"); gets(str); o=atoi(str); printf("\n\n\n\n\n\n\n\n\n\n\n\n"); }while(o!=1); printf("\n\n全て出力された数を入力してください\n"); gets(str); ran[i].data=atoi(str); if(ran[i].data!=a) { printf("残念入力ミス\n"); return; userが何けた覚える自信がありますかで 入力された数になったら終了という問題なんですけど どうしたらいいのでしょうか教えてくださいお願いします。
>>352 宿題なら宿題スレへ
宿題じゃないならもっと詳しく書け
ここのループ・・・どこのループ?コメントでも入れて教えてくらはい
355 :
デフォルトの名無しさん :03/11/30 14:00
ここのループなんだけど教えてってところのループじゃないの?
ループがないYO!
「ここのループなんだけど」のところにはないという意味で。
do-while
気になる点をいくつか。 ・乱数の系列の初期化は毎回行なってはいけない。 ・gets()は危険なのでfgets()を使用するべき。 ・ソースを張るときは中途半端な張り方をせず、関数単位など判りやすい張り方をすること。
分割コンパイルをして構造体をextern で共有したいのですがどうすればいいでしょうか? main.c def.h func.c というようにソースが分かれています 構造体はdef.hで定義して main.c と func.c の両方でインクルードしています。 しかし、 --------------- main.cで extern GenreList_t *gList_cur; --------------- func.cで extern GenreList_t *gList_cur; --------------- とすると main.obj : error LNK2001: 外部シンボル ""struct _genre * gList_cur" (?gList_cur@@3PAU_genre@@A)" は未解決です といわれてしまいます。 どのようにすれば解決するか教えてください。
本体を書け。
>>360 main.c か func.c のどちらかで
GenreList_t *gList_cur = NULL;
としろ
>>362 ありがとうございます!
直りました。感謝ですm_ _m
>>363 理由は分かったか?
extern *** とやったらそのソースファイルをコンパイルするとき
*** がそのソースファイル外にあると期待する
*** を使用するすべてのソースファイルで extern *** とやったら
どこにも *** が定義されない
どこか一カ所で *** を定義する必要がある
>>364 >extern *** とやったらそのソースファイルをコンパイルするとき
>*** がそのソースファイル外にあると期待する
なるほどです、だからどこでも初期化をしなかった場合はおかしくなるんですね。
わかりやすい説明ありがとうございます。
例外として、明示的に初期化してるときは、 extern 付いてても定義されるけどね。
空の定義ができない処理系だな
int func(int a[]) と int func(int *a) は、同じものと考えていいんでしょうか?
369 :
デフォルトの名無しさん :03/11/30 18:31
371 :
デフォルトの名無しさん :03/11/30 22:08
皆さんに質問です。 別のファイルで int hoge[] = {1,2,3];と定義した配列をexternした場合、 sizeofでバイト数を取得する事が出来ません。 どのようにしたら取得できますでしょうか。
372 :
デフォルトの名無しさん :03/11/30 22:11
sizeof hoge でいいんじゃないの?
373 :
デフォルトの名無しさん :03/11/30 22:14
>>371 どうしようもない。
マクロかなんかを定義しておけば??
>>373 同じファイルないで変数を定義してそいつに代入すればいいですかね。
375 :
デフォルトの名無しさん :03/11/30 22:23
>>374 それでもいい。もちろんそれもextern
>>371 hogeを定義した翻訳単位内にサイズ取得関数を定義すれ
377 :
デフォルトの名無しさん :03/11/30 22:25
char から const charへ型変換できないのですか?
378 :
デフォルトの名無しさん :03/11/30 22:26
>>377 一体なんの意味が?
char *からconst char *ならまだしも。
皆さんどうもありがとうございました。 この辺の事って本見てもなかなか書いてないですよね。 少し、工夫してみます。
本に書いてあることができても、ちょっとした応用が難しいと感じる17の冬。 ・・・もうすぐC言語のテストだ。
Cのテストってぇ?(・ω・`)
382 :
デフォルトの名無しさん :03/11/30 22:43
printfつかうと一気にファイルサイズが10倍に?!
383 :
デフォルトの名無しさん :03/11/30 22:46
char *からconst char * でいいので教えてください char *a[]={"1","2","3"}; fputs(a,fp); とするとconst char*でないと駄目だと怒られます
384 :
デフォルトの名無しさん :03/11/30 22:48
>>383 a(を評価した結果)はchar *じゃなくてchar **でしょ・・・
型が**なので *aとか *(a+1) などとしましょう もしくはa[0] a[1] などなど
a[i] = "sine"; のようなことをする予定がないなら const char * const a[] = { "1", "2", "3" }; な
>>380 うらやましい
その若さで正規の訓練が受けられるなんて・・・
>>388 さん
オラにもトレーニングをお願いしたい!
>>381 >>388 そんなたいしたものじゃありませんです。
ただ高校で数学演習っていう授業があって、C言語のさわりをやっているに過ぎませんから。
数学A,B,Cだね
393 :
デフォルトの名無しさん :03/12/01 09:48
C言語の歴史について詳しく載ってるHPありますか?
394 :
デフォルトの名無しさん :03/12/01 09:51
395 :
デフォルトの名無しさん :03/12/01 09:56
396 :
デフォルトの名無しさん :03/12/01 10:09
>>395 英文キタ━━━━━(゚∀゚)━━━━━!!!!
翻訳ソフト準備するか・・・ありがとうございます。
日本語のページでC言語の歴史について詳しく載ってるHPがなかなかみつかりません・・・ 歴史の紹介が簡単なものばかりで詳しく載ったところがない・・・ どこかにありませぬか・・・?
>>397 学校に通ってるなら図書館に行くことをお勧めする。
おっとうちの学校は図書館って言ってて普通は図書室って呼ぶね
市立図書館とか県立図書館に技術書は期待できない(クソ本しか置いてない
C言語の歴史とかだったらおいてあるかも知れないね
コンピュータ、とか情報 とかそこら辺の本棚にあるとおもわれ
>>400 おや、それは失礼。
ではGoogleで検索してHTMLバージョンをどうぞ。
質問です。ファイル入出力でアルファベットを 大文字のアルファベットに変えて出力するプログラムをつくったのですが、 #include<stdio.h> #include<ctype.h> main( int argc, char *argv[] ) { FILE *fp; char *p; char strbuf[1000]; fp = fopen( argv[1], "rb" ); if( fp == NULL ){ fprintf( stderr, "ファイルオープン失敗\n" ); } while( fgets( strbuf, 1000, fp ) ){ for( p=strbuf; *p; p++ ){ if( isalpha(*p) ){ toupper(*p); } } printf( "%s", strbuf ); } fclose( fp ); } 上記のプログラムを実行しても 大文字に変換されません。これはどうしてでしょうか?
403 :
デフォルトの名無しさん :03/12/01 16:37
>>402 まず、isalphaによる検査は必要ない。
そして、toupperの戻り値を*pが受けなければ*pの内容が変わることはない。
*p=toupper(*p);
>>402 とりあえず設計段階ではコマンドラインからファイル名の取得はやめてみよう。
あと2chブラウザ用にスペース入れてソース参照用に自分を参照していただければありがたいです
*p = toupper (*p);
としましょう
メニューを作っているのですが質問です。 まず、abc・・・から選択させます。 その後その下に11 12 13・・・と言うメニューを作ってあります。 そこをピックアップするとのような感じです。 しかし、これだと11しか読み込んでくれません!それ以外は、デフォルトに飛びます。 誰かお返事お願いします。
switch(mno) { case 11 : textattr(14); cprintf("あなたが知りたい人の、任意の科目を表示します。\r\n") ; no = gno() ; kno = subjectno() ; printf("学籍番号%dの%4sの成績は", no, subj[kno]) ; printf("%d点です。\n", G[no][kno]) ; break ; case12 : textattr(14); cprintf ("あなたが知りたい人の、合計点を表示します。\r\n"); no = gno(); printf("学籍番号%dの合計点は %d点です。", no, total[no]) ; break ; default : (・・・省略)※入力が間違っていますので再入力してください※\r\n\n") ; break ; }
メニューってメニューバー?ポップアップメニューのことだよね?
switch(mno) { case 11 : textattr(14); cprintf("あなたが知りたい人の、任意の科目を表示します。\r\n") ; no = gno() ;/*90行目*/ kno = subjectno() ; printf("学籍番号%dの%4sの成績は", no, subj[kno]) ; printf("%d点です。\n", G[no][kno]) ; break ; case12 : textattr(14); cprintf ("あなたが知りたい人の、合計点を表示します。\r\n"); no = gno(); printf("学籍番号%dの合計点は %d点です。", no, total[no]) ; break ; case13 : /*略*/ break ; default : i = 1; textattr(13) ; cprintf("※入力が間違っていますので再入力してください※\r\n\n") ; break ; }
409 :
デフォルトの名無しさん :03/12/01 16:52
ポップアップでは無いです。 携帯電話のメニューとかみたいな感じです!! 二重書き込みすいません。タブは反応しないのですね、、、
>>409 スイッチが分岐してくれないって意味じゃない?
case の後に空白を入れとけ。
>>411 そういうことです!
scanで11を入力するとcase11に行ってくれるのですが、
12を入力すると、デフォルトに飛ばされてしまいます。
414 :
デフォルトの名無しさん :03/12/01 16:55
見る限り、mnoの値が11から13だったらそれぞれの文を実行するはずだけどなぁ。 とりあえずdefaultがあるから何かは表示されるはずだ。
>>412 そういえば空白がないな・・・・
空白がないとgoto用のラベルだとコンパイラに判断されてしまう。
defaultのスペリングを間違えてもエラーにならないという有名な話に似ているね。 キーワードの色を変えて表示してくれるエディタを使うことをすすめるよ。
(´・ω・`)ゴメンナサイ。 出来ました。
419 :
ゴメス ◆oJjvkz7VeA :03/12/01 17:02
あ、ありがとうございました!
421 :
ゴメス ◆oJjvkz7VeA :03/12/01 17:51
本物っすー!!w お礼を言うの忘れてましたから帰ってきました。(´・ω・`)
423 :
デフォルトの名無しさん :03/12/01 21:43
わかっていること。 元のプログラムはinetd をつかったサーバで、 ファイルやネットワークの読み書きは標準入出力を使っています。 これをwinxp + borland c++ 5 で動くようにしたい。 自分の開発環境にはflock や lockf や fcntlはありまえん。 とりあえずファイルの排他処理をやろうと思っています。 io.h の中にそれらしき関数を見つけました。 lock, locking, unlock。 lockとunlockを使えばうまく処理できそうなのですが。 代案はありますか? よろしくお願いします。
次の質問どうぞ
解決しました。お騒がせしました。
426 :
デフォルトの名無しさん :03/12/01 23:30
一回のfor文で三つのループを処理する事って可能ですか?
100個でも1000個でも可能。
100000個でも1000000でも可能。
>>426 質問が的を射てないな
for を一回というのは微妙だ、何か意味でもあるのかぃ?
なぞなぞチックだなぁ。本当の質問者とはとても思えん。
forを何重にもネストしても良いかって事なのかなぁ
while
433 :
デフォルトの名無しさん :03/12/01 23:38
for(a;b;c){ for(d;e;f); whil(g); do{;}while(h); } こういうことです。
まだ2重でそ
そりゃ
>>431 だろ
というか出来ますかっていう前にやってみろそんくらい
>>436 1000個もネストする奴はいないだろ・・・w
438 :
デフォルトの名無しさん :03/12/02 00:14
あ、しつれいしました。 例えば1〜100までの和と200〜300までの和をまとめる と言ったものを1つのforで処理できますか? と訊きたかったのです。
>>437 ああ?
どこに1000個って?
質問者は3個のループを実装したいようだが。
>>438 実際どうなのかしらんけど、その例なら1つのforで可能。
とんでもなく複雑でない限り、適当に変数やっとけばなんぼでもできるが、
できれば分けて書いたほうがいい。
>>438 意味的には分けるべきじゃないかと思うが、できる。
但し、片方は100回ループでもう片方は101回ループなのでループ内で分岐する必要がある。
#やっぱり分けるべきだ。
#include <stdio.h> int main(void) { inti, j, k; intl = 2, m = 3, n = 4; for(i=j=k=0; k < n; ++i < l || (i=0, ++j < m) || (j=0, ++k)) printf("i=%d, j=%d, k=%d\n", i, j, k); return 0; }
分ける以外に方法があったんですね。 よろしければ簡単に教えていただきたいのですが・・・。
1〜n までの和は定数時間で求められるのになぜ for ループを使うのか
446 :
デフォルトの名無しさん :03/12/02 00:27
>>438 int i,total=0;
for(i=1;i<=300;i++){
if(i>100&&i<200)
continue;
total+=i;
}
ガッコの課題です。
a=0;b=200;
for(i=1;i<=100;i++){
a+=i;
b+=i+200;
}
>>445 もっとも。
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
>>449 1-100はいいとして、201-300になってるじゃん。
200-300だってよ。
#妙な課題だ。
>403,404 即レスしてくれたのに、 遅レスで申し訳ございません。 toupperはパラメータがポインタでなく、 整数型だから、返値を受けなければならないんですね。 ありがとうございました。
int i, j; int sum1 = 0, sum2 = 0; for(i=1, j=200; i<=100 && j<=300; i++, j++) { sum1 += i; sum2 += j; }
うへー、気色悪ー #いや、見落としてた・・・_/ ̄|○
巧くいきそうに見えて巧くいかない>458
>>461 激しく笑い死にました
463 :
デフォルトの名無しさん :03/12/02 02:31
mainから呼び出された関数中でエラーが発生した場合に、 プログラム全体を終了させることを考えました。 exit()、abort()のどちらを使えばいいんでしょうか? そもそも、プロの方はこの2つの関数をどのように 使い分けているんでしょうか?
a=0;b=0; for(i=0;i<=100;i++){ a+=i; b+=i+200; }
>>463 exit - 正常なプログラムの終了
abort - プログラムの異常終了を生じさせる
というわけで、exit()でしょう。
466 :
デフォルトの名無しさん :03/12/02 03:39
465さんが書いてるように、よくCの参考書なんかで abort - プログラムの異常終了を生じさせる、ってのをみかけるんだけど、 ”異常終了を生じさせる”ってなんか、イメージ的に危険な香りがしませんか? もう少しわかりやすいabort()の説明を求む!!(・∀・)
abortするとFILEに書き込もうとした内容が反映されてなかったり 終了時に変なメッセージが表示されたりcoreを吐いたり もちろんatexitで登録した関数も実行されないし あと、C++なら呼ばれるべきデストラクタが実行されてなかったり。 malloc失敗等、回復不能の致命的なエラー時に全てをあきらめて強制終了。
struct A{ char *a[]; }; int main(){ struct A A; A.a[0]="C言語"; A.a[1]="Java"; A.a[2]="C++"; return 0; } この記述って間違っている?
[ ][ ][ ][ ][ ][ ][ ][ ][ ]と仮に領域を確保したとしよう でも無理 char に char* を代入できないってエラーが帰ってくると思うよ
473 :
デフォルトの名無しさん :03/12/02 11:08
abortは使わないなぁ。
まあ、assertを使ったときに間接的に使うけど。
>>470 struct A{
char *a[3];
};
こうでしょ。
>>472 どーでもいいが、 char *a[] と書いてるぞ?
>>474 ・・・(゚д゚;
・・・・まことに申し訳ございませんでした。心より深くお詫び申し上げます
*a[3]; ポインタに配列って無理なの? なんか俺馬鹿な質問をしていますか?
>>476 >ポインタに配列って無理なの?
無理じゃないが
>struct A{
> char *a[];
>};
では、「a」のサイズが不定だろ?
配列の宣言は、コンパイラに配列のサイズを教えなければいけない。
[]が*と同じこともあるが ***違うのが普通*** であることを 多くの初心者が忘れ、そしてドツボへ直行する 教える立場の者が ***違うのが普通*** と思っていない まことに痛ましいケースもたいへん多い
仮引数でそう書けるようにした人が愚か
ウザい書き込むなカス
シンタックス砂糖だよ
やめんな
>>478 よく話つかめないけど
char *a[10];
こう書くのはいいんだよね?
487 :
デフォルトの名無しさん :03/12/02 22:34
>>486 もちろん。
char *a[]なんて書けるのは仮引数と外部参照宣言の時だけ(だよね?)。
>>487 これに回答してはならない
連係編集時のセマンティクスについて
自分なりの解釈を持つ機会を奪うことになる
>>487 char *a[] は **a と同等の威力を持ちます
ついでに混乱させとくか… char *a[]; と char (*a)[]; は違う
>>492 右から読んでくからだっけ?
配列を指すポインタと
ポインタを持つ配列の違いだよね
>>494 まあ領域が確保されないから実質同じなんだけどな
>>491 ブロックの中で書けないとは一言も言っていないよ??
>>499 #include <stdio.h>
int main(void)
{
char *a[];
return 0;
}
試してみろ,コンパイラ通らんから
#include <stdio.h> int main(void) { extern char *a[]; return 0; } これは通るがな
507 :
デフォルトの名無しさん :03/12/02 23:26
つ 三 ハ ○○る ム
>>502 マジだ
char a[];
でも通らないね
初期化子つきはこの範疇に入らないのかと言ってみるテスト。 いや、漏れは割とよく使うんで。 char *a[] = { "foo", "bar", "zot" };
>>511 []は*と同じだとずっと思ってました
もう一度出直さなきゃ・・・
結局[]が何で通らないかわからないや。
宣言時の[]はメモリを割り当てるという意味があるのか。
配列はホンマもんで配列だったんだなぁ
>>514 そうそう。そうでないとコンパイラは困り果てます。
>>512 そのこころは領域が割り当てられてるか否かってことで OK?
「指し示すもの」をつくるのと 「そこに配列を用意する」のと 「配列があるように見立てる」の違い
>>514 仮引数だと(一番目は)そうなるだけ(例え添え字を書いたとしても無視される)。
一種の構文糖ってやつだね。
ここでの一番目というのはint func(char a[これのこと][20])
>>515 さん
char a[] = "今日は良い天気ッダ!";
とやっても
char *a = "今日は悪い天気ッダ!";
と両方コンパイルしてみましたが両方通りました(当たり前ですが)
[] の方は関数内で宣言された配列として処理をして
* の方は自由領域から得た場所を指すポインタという意味になるのでしょうか?
>>519 上は"今日は良い天気ッダ!"が丁度入るだけの大きさの配列を作って中身をその文字列で初期化する。
下はポインタをどこかにつくった"今日は悪い天気ッダ!"の先頭アドレスで初期化する。
ゆえに上は書き換え可、下は不可。
>>519 ごめん、説明うまくないから実装絡めて話すね
その a が自動変数だとしたら
a[] はスタック上に一時的に配列の実体が確保されるし、
*a はどこかの文字列リテラルを指し示している、ってことです。
なので、*a の場合に中身をイジってもROMで内容が変わらなかったり、
変更できたとしても近辺データを壊しちゃったりする可能性が高い。
基本的に *a は const な領域を指してると考えたほうがいいかも。
>>523 これを読んだことがないかも
"C言語なら俺様に聞け! Part 67"
>>520-521 ありがとうございます
難しいです^^;
文字列リテラルという言葉すら知りませんでした...(今調べましたけど
>a[] はスタック上に一時的に配列の実体が確保されるし、
>*a はどこかの文字列リテラルを指し示している、ってことです。
a[]は関数が始まった時にスタックメモリを使用して領域を確保するんですね
*a の場合はプログラムが起動したときでしょうか?
ずっと疑問に思っていたままにしておいたのがまずかったですね^^;
プログラム内で決めた文字列についてはどのように領域を確保するのか全然知りませんでした。
ポインタや配列の項目はすごい不思議な世界ですね
見つけたページ
ttp://www9.plala.or.jp/sgwr-t/c/sec10-2.html
>>526 >a[]は関数が始まった時にスタックメモリを使用して領域を確保するんですね
はい。関数内で宣言したときの話ですけどね。
char *a = "...." ;
と関数の内部でやれば、「指し示す」ための領域がスタック上に一時的に
確保される。
"...." の部分のデータはプログラムのどこかにあらかじめ用意されていて
そこを指し示しているってことです。
(・3・)エェー? ここまできて釣。。。。?
>>527-529 ありがとうございます。
int a[40]で宣言して
sizeof a とやると120が変えるのに
int *b = malloc (40 * sizeof (int));で
sizeof b とやると4が帰ってくるか謎がわかりました。
配列は
a:[][][][][]...となっていて
b:*=> [][][][]...となっているんですね。
引数の[] と * が同じだと言われていた気がして同じものだとばかり思ってました
>>532 ハイ、多分無知全快でのカキコなのでレスのしようがないのかなと思ってました。すみませんでした
今も読んでいます
ところでやはりCのバイブルと言われるぐらいだからK&Rは買ったほうがいいでしょうか?
534 :
デフォルトの名無しさん :03/12/03 00:15
NULLpo論争やるなら向こうでやってね > ALL
536 :
デフォルトの名無しさん :03/12/03 00:18
ポインタの配列がよくわかりません・・・ #include<stdio.h> void main() { int i; char *parray[]={"童貞","不細工","貧乏","低学歴"}; for(i=0;i<=3;i++) printf("%s\n",parray[i]); } 配列parray[0〜3]には、文字列のアドレスが格納されてると思うのですが printf("%s\n",parray[i])でなぜ文字列がプリントされるのでしょうか もしや、parray[]はポインタの添字表記法なのですか?
0 == NULL にならないなんて初めて聞いた…
>>533 正直K&Rは言語の思想を知る意味合いならいいかな、と思うけど…どうなんだろう?
と言うことを分かるためにも読んでみたら?
>>536 printfの%sは文字列へのポインタを受けてそれを表示するから。
parray-parray[0]→"童貞" -parray[1]→"不細工" -parray[2]→"貧乏" -parray[3]→"低学歴" という事で良いでしょうか?
NULLといえば、可変個の引数を取る関数の可変の部分には渡してはいけないんだな。 (void *)0と書かないと、NULLが0と定義されている環境では整数の0が渡ってしまう。
NULL粘着
みなさま、どうもありがとうゴザイマス(ペコリ
>>545 たのむ、そのエサには食いつかないでくれ!
>>543 キャストしていない 0 はヌルポインタに変換される
覚えておけルーキー
>>548 ...だから関数が求める型がなんなのか判断できない。
>>548 可変個の引数って言ってるから、型は不明なはず。
ただし
>>543 よ、杞憂って言葉を知っているか?
>>550 実際問題が起きることは滅多にないだろうけどね(^_^;)
C FAQ読んでいて気づいたの。
( ゚Д゚)ハァ? 可変引数の使い方を理解してるのか? 可変引数を使うには事前に可変な部分の型や個数を知っておく必要があるだろうが
>>553 ではprintfの引数の個数はいくつなんですか?
個数を知っておく必要があるんですよね?
553==556は、一体何を勘違いしているんだ?
>>557 呼び出し側はいくつの引数を渡したか、そしてそれらはどんな型なのか知っているということじゃない?
確かにそうだけど、ここではそんなことは問題じゃないんだよね。
引数型のプロトタイプが無いんだから、コンパイラはintの“0”を積んじまうだろ。 NULLポインタのビットパターンとしてオール0以外を使っている場合に拙い。 そもそもsizeof(char *)!=sizeof(int *)!=sizeof(int)かもしれない。
>>555 おまいはprintfでフォーマット指定をしないのですか?
>>561 脊髄反応しないで、どういったことが語られているのかを読め。
わからんなら、すっこんでろ。
可変引数の関数を自身が使う場合をいってるのね。 つまり、コードを書く時に個数や型をってことね。 …関数を実装する場合の時としか取れない流れのタイミングで…
>>563 自分で可変引数の関数を実装するときでも何らかの形で型を指定するだろ
型の指定をしないのは型が全て同じ(例えば全て文字列)ときだ
つまり、可変長引数の関数には NULLがつかえないって言ってるんですか?
>>565 定数としてのNULLを可変の部分に書くと、様々な条件がそろったごく稀な環境で不具合が生じる可能性がある((void *)0と書くことで回避可能)。
char *p=NULL;のpを渡すのは問題ない。
その条件ってのが、 ・NULLが#define NULL 0と定義されている ・整数の0とヌルポインタの大きさかビットパターンが異なる の両方を満たしている。
実装上定数としてのNULLを可変長引数部分に書いたとしても、 可変長引数をもつ関数の内部ではそれをポインタにキャストして見ればいいと 思うんですが。
>>569 キャストは「関数の内部」がするものではなく、コンパイラがするもの。OK?
定数の0をポインタにキャストすればヌルポインタになるけど、 int a=0;のaをポインタにキャストしてもヌルポインタになると決まっていたっけ?
const int a=0; ならなりそう… だけど、なんか不安ですね。
>>572 規格を知らなくとも実装を思い浮かべれば気づく。
コンパイラにはaの値を知らない(関知しない)ので無理。
>>573 それは定数のふりをした、値の変更できない変数だからな。姑息な手段を使えば変更できちゃうし。
C++だったら最適化により、文字通りの定数になり得るかも。
無理だって。 誰かも書いてるけど、intとポインタのサイズが等しいことは保証されてないでしょ? 例えば64bitだとLP64でもLLP64でもsizeof(int)!=sizeof(void*)だし DOS時代のcompact/mediumモデルとかも。 int型の0とヌルポインタのサイズが違う以上、相互変換は絶対に不可能。 保証されているのは、「ソース上に現れる整定数0」が ポインタが必要な場面ではヌルポインタに変換されること、これだけ。
どうでもいいけどlargeモデルだった
はー、おまえらまたNULLぽのはなしですか?
そうだ。大きさが違う場合も問題だ。
>>578 可変個の引数とぬるぽの関係の話は初めてじゃない?
C FAQにあるほどだから無駄話と言われれば言い返せないけど。
>>580 そうか。かんばってくれ。
眠いので寝るぽ
おやすみ
582 :
デフォルトの名無しさん :03/12/03 15:38
この行から型名が必要と言うエラーが出るのですがどういう意味でしょう? float average(int no,G[no][kno]);
584 :
デフォルトの名無しさん :03/12/03 15:45
あの、型名ってなんですか? 検索してもうまくひっかからないっすT_T
585 :
デフォルトの名無しさん :03/12/03 15:45
>>583 #define G int aとしているので型名はあるはずなんですが。
氏ね
>>585 そんな事までこっちが知ると思うか?
どっか行け
588 :
デフォルトの名無しさん :03/12/03 16:12
sockfd = socket(AF_INET, SOCK_DGRAM, 0); res = write(sockfd, buf, n); 凄く省略しましたが、上記の手順で res(writeの返り値)が-1になり送信に失敗します。 TCP/IPで通信すると成功するのですが(SOCK_DGRAMでなく、SOCK_STREAMを使用) UDPではwrite()は使えないものなのですか? それとも何か間違ってます?
589 :
デフォルトの名無しさん :03/12/03 16:18
接続されていないんだから使えるわけないし。
>>588 スレ違いだが、UDPの場合には送信先を指定する必要がある。
よって、sendto()辺りを使用汁。
SOCK_DGRAMでもconnectしたらwrit使えるんでないかい?
>名称 > connect - ソケット上で接続を開始する >解説 >引数はソケットです。このタイプが SOCK_DGRAM の場合、 >この呼び出しはソケットが結び付けられる通信相手を指定します。 で、コネクションレス型がどうしたって?
>>588 どうでもいいうえにスレ違いだけど、TCP/IPといったらUDPも含まれるよね。
広義の意味としてはそうだね。
>589-598 みなさんありがとうございました。 sendto()にします。 ちなみにここはC言語質問スレじゃないんですか?
>600 了解しました。 arigatougozaimasita。
602 :
デフォルトの名無しさん :03/12/03 17:58
ヘッダファイルについての質問です。 全体で hoge1.c、hoge2.c、func1.c、func2.c、func3.c という5つのファイルがあったとします。 hoge1.c では func1.c、func2.c 中で定義されている関数を、 hoge2.c では func2.c、func3.c 中で定義されている関数を、 それぞれ呼び出しているとします。 この場合、 func1.h、func2.h、func3.h という3つのヘッダファイルを作成し、その中で func1.c、func2.c、func3.cで定義されていて、かつ外部に公開する 関数のプロトタイプ宣言をし、 hoge1.c 中でfunc1.h、func2.hをインクルード、 hoge2.c 中でfunc2.h、func3.hをインクルード、 とした方がよいのでしょうか? それとも、全体で1つのヘッダファイル: common.h のようなヘッダを作り、 その中で func1.c、func2.c、func3.cで定義されていて、かつ外部に公開する 関数のプロトタイプ宣言をすべてし、 hoge1.c の中でcommon.hをインクルード、 hoge2.c の中でcommon.hをインクルード、 とした方がよいのでしょうか? 長くなってすんませんが、どなたか的確なアドヴァイスをおねがいしまつ。
603 :
デフォルトの名無しさん :03/12/03 18:01
>>602 ソースファイルごとにヘッダーファイルを作るのが理想なんだろうが・・・それほどソースファイルが多くない時はcommon.hをつくっちゃうかな。
>>602 どっちでもいいじゃん。何を悩んでいるのだ?
>>602 とりあえず
func1.h, func2.h, func.3を作り
common.hの中でfunc?.hをインクルード汁
hoge1.cのようにfunc3を必要としないソースや
hoge2.cのようにfunc1を必要としないソースが
ばんばん出てくると「肛門逝ってよし!!」と思える日がすぐ来るよ
>>602 取りあえず
hoge1.h で func1.h,func2.h をインクルードし
hoge2.h で func2.h,func3.h をインクルードし
hoge1.c で hoge1.h をインクルードし
hoge2.c で hoge2.h をインクルード汁
hoge3.c で hoge1.h,hoge2.h をインクルードしても大丈夫な#defineのおまじないを忘れるなよ
5×5くらいの大きな連立方程式をcで解くとき、もっとも精度の出る方法は何なのでしょうか?時間はかかっても良いので。
LAPACK で逆行列求める
LAPACKですか、よく分からないですが、これはunixで使用できるライブラリですか?できればvisualC++で直接ソース書いてやりたいんですが…。
611 :
デフォルトの名無しさん :03/12/05 16:05
char型の変数に50000とかの数値を入れたらどうなるのでしょう? 次のメモリにあふれた数値が書かれる? それとも切り捨て?
>>611 50000 & ((1 << CHAR_BIT) - 1) になるよ。
>>613 自分で試せもしないやつに、そんなこと理解できるわけも無し。
>>612 こういうのって処理系に依存しないの?
次のメモリの数値がどうなるのか知りたかった。
#define HOGE (volatile unsigned char *)(0x400000 + 0x800)
HOGE = x + 0x20 * 256;
ってソースがあるんだけどこういう場合って0x20*256はどこにいくのかな?って思って。
このHOGEの次のメモリにコマンド用のメモリがあって
ここに0x20を入れる処理なんだけど
これって正しいのか?って思って。
試したいんだがH8なんでちょっと時間がかかるんだな。
間違った。 #define HAGE (*(HOGE + 0x06)) HAGE = x + 0x20 * 256; だ。
charが2byteあってもC的には合法でつヨ。
>>615 char a='A';の'A'がint型だということを知っている?
'A'A'はchar型に収まるだろうけど、上位桁の0が他の領域を壊すことはないよね。
>>617 Cの規格には反するが。charは1バイト
'A'A'になっとる・・・'A'の間違い。
>>618 わお!サンクス。
ってことはこのソースだとHOGE+1には何も書き込まれないって事ね。
>>621 自分で確かめろよって何度も言ってるだろ?
おっと。合法なのは、charが16bitの場合か。
>>624 charは8bitでそ?
charが16bit環境ってあるの?おせーて
char c=50000;でcにどんな値が入るかは処理系依存だろうが、cが示す領域を超えて書き込むってことは絶対にない。
00000000 + 1 = 00000001 11111111 + 1 = 00000000
>>625 もし8bitと決まっているならCHAR_BITマクロは存在しないよ。
charもintもみな32bitという環境で開発したと言っていた人がこのスレにいたね。
>628 32bit環境というのはCPUの事じゃねーの?
>>629 話の流れと書き込み内容から見て、勘違いとは思えない。
>>630 確かにそうかもしれないし
なにより
>>628 さんが言ってたわけじゃないらしいから、真偽がつかめないぽいなぁ・・・
マルチバイトcharがあるからとは考えられない?
>>628 9 bits の環境がある、という話はよく聞くね。
7.5ビットって無い?
13+3/4ビットならある。
1ビットで 0 1 2 をあらわせる環境なら知ってるよー
3進コンピュータか...。
638 :
デフォルトの名無しさん :03/12/05 17:09
某所で二進じゃないとbit(binary digit)とは言わないとつっこまれた。。。。
trit
シリアル転送じゃないんだからあるわけないじゃん。<7.5ビット
8 bits なんだけど、偶数しか扱えないとか。
>>637 量子コンピュータってうまくやれば3通り使えるよね
643 :
デフォルトの名無しさん :03/12/05 17:24
>>643 そこんところはD言語がカバーしてるから大丈夫
別言語じゃん!
二次元配列を渡す関数の引数の ↓のように書いたらだめなの? void morehatensaidetune(int unco[][]){ unco[0][0] = 3; } int main(void){ int syonben[10][10]; morehatensaidetune(syonben); return 0; }
ドイツ語を読み込んで出力するには、どうすればいいんですか? getchar()だと全部でてこないです…
コンソールがドイツ語に対応してないだけの気が。
Unicodeを習いましょう。 ところでさ、自分がやりたい事が凄いレベルが高いけどやりたいって時みんなどうする?
気長にやる
カップ麺食べる
えぇ〜・・・ でもさ。文字コード 23 を呼んだときに EOF 返されたときは困った 結局バイナリで開いたらうまく行ったけどアレのせいで一週間ぐらいあれこれやってたなぁw 結構時間かかっちゃうじゃんね どうなのよ?
> 文字コード 23 を呼んだ (´Д`)?
質問があります。 ポインタを使った、二次方程式の解法を示すプログラムがよくありますよね。 あれはなぜポインタを使わなければならないのか教えてください。
ないです。
>>656 www
>>654 えと '\n' = 10
のように改行を文字コードで表すなら10ですよね。呼んでは読んでです。
ファイルから文字コードで言う23を読み取るとそれをEOFに置き換えるぽいんですよね。
で、バイナリ用にファイルを開くときちんとデケターヽ(´ー`)ノです
>>650 Unicodeですか…
いろいろ調べてみます!ありがとうございました。
>>655 べつに二次方程式で
ポインタを使う必然性はない。
ポインタのない、、、たとえばCOBOLでも二次方程式の解法は示せる。
Cではポインタは「あって当然」「使えて当たり前」のものなので
例題の作者も無意識に使ってるだけだろう。
二次方程式を解くのにポインタなんか使うか?
解が二つあったり、なかったりするからポインタ引数で返すとか? ていうか、そのよくあるというプログラムをさらせ
すみません。今、手元にないのでさらせません。 そうですか、使う必然性はないのですか。本の中でポインタの項にあった ものですから、そうしなければならないのかなぁ、と思っただけです。 どうもありがとうございました。
>>661 あぁ、そうか。そういやそうだな。
こんな感じかな。
int quadratic_eq(double a, double b, double c, double* x, double* y) {
const double d = b * b - 4 * a * c;
if(d < 0) {
return 0;
} else {
const double denom = 2 * a;
*x = - b / denom;
*y = sqrt(d) / denom;
return 1;
}
}
>>662 ポインタ抜きのCなんて投げ技のない柔道みたいなもんだ。
ポインタ抜き(に見える)のCのソースなんて
入門書のポインタの章より前のページでしか
お目にかかれないと思った方がいい。
つーか例を一つしか知らないのに「よくありますよね。」
とか一般化するのはいかがなものか。
666 :
デフォルトの名無しさん :03/12/06 00:01
>>664 たとえがいまいち
柔道だと、最初から投げられて受身の練習するわけで
息継ぎしない水泳みたいなもんだ
でどう?
紐の無いバンジー
靴なしで砂利道を歩くって感じじゃね? 無理すれば歩けるけど効率悪い
669 :
デフォルトの名無しさん :03/12/06 00:13
スレッド数が合っていないので同期を取ります。
670 :
デフォルトの名無しさん :03/12/06 00:19
ポインタなし:3りんしゃ 乗りやすいけど遅すぎ(´・ω・`) ポインタあり:普通のチャリンコ 練習いるけど速い(・∀・)
671 :
デフォルトの名無しさん :03/12/06 00:20
俺様の三輪車はモーターつきだから速い
三輪バイク〜
673 :
デフォルトの名無しさん :03/12/06 00:32
ポインタだから速いというのは迷信
ポインタなかったらC言語成り立たんよ
675 :
デフォルトの名無しさん :03/12/06 00:35
>>673 速いとか遅いとかってのは効率の問題だろ。
プログラムで言えば分かりやすいけどめんどくさい、もしくは実装不可能なのか
分かりづらいけど分かったら簡単で効率いいってことで。
今更三輪車乗ったらオレらが遅いと思い、さらに乗りづらいと思うはずだ。
>>673 は
>>670 の自転車は速いに突っ込んでるの?
あくまでたとえの話だからポインタが速いとは一言も言って無いように見えるけど
>>674 正解。
ポインタなけりゃ、配列定義しても渡せないし
mallocも無理。文字列もなくなるわけだ。
効率悪いとかいうレベルじゃないんだけどな。
678 :
デフォルトの名無しさん :03/12/06 00:38
起動じゃねー呼び出しだー
681 :
デフォルトの名無しさん :03/12/06 00:40
結局Cは今や低水準言語だよな。 プログラミング言語は確実にメモリへの直接アクセスを許可しない方向に進んでる。 この辺の話は何年も前から問題にされてきてそうなったんだろうけど、
>>665 そう、たしかに一般的だ。
プログラマーに目が二つあるのと同じくらい一般的だ。
function call -> function boot
>>681 Cに対して誤解があるようだ。
まず、「今や」ではない。
元々アセンブラに移植性を持たせたものが出発点なので当然。
決して高級言語ではなっかのだ。
だから、Cに対してはその点を誰も問題にしていない。
他の言語を作るときには問題にするかもしれないがな。
686 :
デフォルトの名無しさん :03/12/06 00:48
質問です。以前ほかのスレで質問したのですが、答が得られませんでした。 下にあるソースをgccでコンパイルする際、 gcc -Wall test.c とすると以下の警告が14行目に対して出ます。 警告: 互換性のないポインタ型からの引数 1 個の `func1' を渡しますです 1.これはどうしてですか? 2.14行目に出て15行目に出ないのはなぜですか? 3.どうしたら警告をなくせますか? OSはredhat8.0でgccのバージョンは3.2です。 面倒な質問ですがぜひ教えてください。お願いします。 ---以下ソース--- 1: #include <stdio.h> 2: 3: void func1(const int a[4][4]){ 4: 処理 5: } 6: 7: void func2(const int b[4]){ 8: 処理 9: } 10: 11: int main(){ 12: int a[4][4]={{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},}; 13: int b[4]={1,2,3,4}; 14: func1(a); 15: func2(b); 16: return 0; 17: }
687 :
デフォルトの名無しさん :03/12/06 00:51
>>686 constが原因。確かそうだったと思う。はずしてみ。
689 :
デフォルトの名無しさん :03/12/06 00:53
「int **」と「int [4][4]」じゃ、そりゃ互換性ない罠
691 :
デフォルトの名無しさん :03/12/06 00:54
int []*
>>689 意味不明。何言ってるんだ?
問題は、constがどこにかかっているか、だ。
int *[4]だろ・・・
鬱死・・・言い残す事はなっすぃん。 ばいばいみんな・・・。
695 :
デフォルトの名無しさん :03/12/06 01:00
>>686 過去ログに二次元配列の渡し方について書いてあったと思うから過去ログ読んだ方がいいよ。
697 :
デフォルトの名無しさん :03/12/06 01:02
>>695 それはきっと分かっているんだろ。
関数内で配列の要素へ書き込みできなくする方法を知りたいんだと思う。
VC++6.0では警告レベルを最高にしてもでないなぁ。
ありがとうございます。
こんなにすぐ返事がもらえるとは・・・
>>687 ,688,695,696
すいません。質問が不十分でした。697さんのおっしゃるとおり、
「関数内で配列の要素へ書き込めなくする方法」が知りたいです。
行列の演算などを行おうと思っているのですが、ここでつまづきました。
>>689-693 すいません。ちょっと高度すぎて自分には理解できません。ただ、おそらく
692さんの言うとおりconstのかかる範囲の問題だと思います。
それを調べる方法と解決法までは思いつきませんでした。
>>699 6.0はC++に非ず・・・は言いすぎだが、問題ありすぎ。
もちろん6.0を使用すること事態は問題じゃないが、こういう話のとき
「6.0では・・・」といっても「6.0じゃあね・・・」と返すしかない。
最低でも7.0、出来れば7.1(.NET2003)を使用しないと、この手の話に加わるのは無理。
>>700 constはお守りのようなもので、書き込めなくする方法ではない。
正しく言うなら、関数内で書き込めないようにconstを使うのではない。
関数を呼び出す側に、安全を宣言するために使うのだ。
無理せず、const外すだけにしておけ。それで何の問題もない。
ちなみに拡張子をcppにしてgcc -Wall test.cppするとエラーは何も 出ませんでした。 これはcとc++の仕様の違いかもしれないですが・・・ (当方c++未経験)
void func1(int const a[4][4]){ 処理 }
>>705 それじゃ同じ。
int (*const a)[4]を期待しているのかも知れないけど、それはaに代入できなくなるだけ。
ありがとうございます。
>>703 研究で A×B=C のような行列の演算をよく用いるのですが、もうすでに
何度か間違えてAやBに値を代入しました。
コンパイルの時点で間違いを減らせるようにしたいのです。
>>705 ,706
コンパイルが通りませんでした・・・。エラーは686のものと同じでした。
↑エラーと警告は意味が違うので混同しないように。
func1( (const int (*)[4])a );
>>686 >何度か間違えてAやBに値を代入しました。
プログラムはコード通りにしか動かない。
つまり、4x4の行列計算すら記述出来ないのが問題であって
値を書き込む恐れとかのレベルじゃないかと?
712 :
デフォルトの名無しさん :03/12/06 03:21
おしえてください。おながいします 演習 年齢氏名を要素とする構造体を利用し各自のデータを保存する @main関数外で、年齢(文字列:age)と氏名(文字列:name)を 要素として持つ構造体Gakuを宣言します。 A次に、main関数内で、自分の年齢と氏名を初期値として持つ 構造体Gaku型変数mygakuを定義します。 B最後に年齢と氏名を表示します。
#include <stdio.h> struct Gaku { int age; char name[80]; }; int main(void) { struct Gaku mygaku = {3, "hoge"}; printf("%d, %s", mygaku.age, mygaku.name); return 0; }
>>710 だめでした。関数の定義の部分に構文解析エラーが出ます。
>>711 はい。その通り。だからと言って止めるわけには行かないのですよ。
他の演算子の優先順位みたいに、constにも優先順位ってないんでしょうか?
intよりも上だとか。
void func1(const int *a[4]){ 処理 } func1( (const int **)a );
713先生。どうもありがとうございましたぁ
>>686 constあろうが、なかろうが問題は其処じゃないって言われてるのに気が付かない?
次の質問は、constのデータに書き込もうとしてエラーが出ます。
行列の計算を教えてクレクレってなるのか?
計算が普通に出来てれば、constなんてあろうがなかろうが関係無い。
>>715 ありがとうございます。
コンパイルは通りました。ただその関数内で配列にアクセスする際に
エラーが出ます。
たぶんint a[m][n]が渡されたとき、nの部分が分からないためどこに
アクセスしていいかわからないため起きる問題だと思います。
試しにいろいろなアドレスを表示してみました。
(&(a[0][0])) => 1
(&(a[0][1])) => 5
(&(a[0][2])) => 9
(&(a[1][0])) => 2
(&(a[2][0])) => 3
だいぶ変な出力が得られました。
通常a[m][n]と定義されたものにa[i][j]とアクセスする場合
(a + n*j + i)のアドレスにアクセスするはずです(間違ってるかも)。
しかし今回は(n*i + j)にアクセスしようとしているようです。
これはこれで興味深いのですが、とりあえずこれではだめそうです。
#include <stdio.h> typedef const int const4array[4]; void disp(const4array *const array) { int i, j; for (i = 0; i < 4; i++) { for(j = 0; j < 4; j++) printf("%d ", array[i][j]); printf("\n"); } } int main(void) { int array[4][4]; int i, j; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) array[i][j] = i * 4 + j; disp((const4array *const)array); return 0; }
718で686が全く解って無いレベルだって証明された。
>>718 ポインタと配列を混同しないように。
int *a[N] の場合、
a[i][j] = (a[i])[j] = (*(a + i))[j] = *((*(a + i)) + j)
int a[M][N]の場合、
a[i][j] = *(a + N * i + j)
うぁぁ、すまん、俺が悪かった。 ところで、>710は14行目の関数呼び出し部分への キャストなんだが、だめだった?
>>719 コンパイル通りました!代入しようとするとエラーもきちんと出ます!
これなら始めに少し手を加えるだけなので、理想的です。ありがとうございます。
それにしてもこんなやり方があるとは・・・。
>>720 どこが分かっていないのかも分からないレベルです。今後のためにも
どの辺がおかしかったか教えてもらえますか?
>>721 なるほど。勘違いしていました。これで、iとjが逆になっている理由が
分かりました。
ただ、あと1つ疑問があります。なぜこんな小さな値しか出てこないのでしょう?
アドレスを表示するのなら、aのアドレスを足したもっと大きな値が
表示されると思うのですが・・・。
>>722 ごめんなさい!
710は関数定義の方を変えるのだと勘違いしました。
できました!これを求めていました!ありがとうございます!
こんな書き方があるなんて全く思いつきませんでした。
みなさん親切に答えて頂きありがとうございました。
>>721 すいません。724の疑問は無視してください。
ちゃんと考えていませんでした。
726 :
デフォルトの名無しさん :03/12/06 11:44
メモリーの解放ってどうしますか?以下を含む関数をループで回すと メモリーサイズがどんどん増加していってるのですがどうして? const char* str = "ABC"; char *buf1; char *p; buf1 = malloc(strlen(str)*sizeof(char*)); p = buf1; *p = 0; free(buf1); buf1=0;
きのせいです
ライブラリのmalloc/freeがバグってるから で、なんでsizeof(char*)で、個数はヌル文字の分抜き?
>>728 バグなんですか???
>で、なんでsizeof(char*)で、個数はヌル文字の分抜き?
すみません、質問の意味が分かりません。
(strlen(str) + 1) * sizeof(char) とか言いたいんじゃない?
while(1) { const char* str = "ABC"; char *buf1; char *p; buf1 = malloc(strlen(str)*sizeof(char*)); p = buf1; *p = 0; free(buf1); buf1=0; } だとしたら珍妙だよなぁ・・・何してるかわからない
ただのテストじゃないの?
delete [] ならうまく開放できてるんだけどなぁ。 バグなのか・・な?
>delete [] なにこれ?
そのコンパイラおかしいんじゃない? #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { const char* str = "ABC"; char *buf1; char *p; while(1) { buf1 = (char*) malloc(strlen(str)*sizeof(char*)); p = buf1; *p = 0; free(buf1); buf1=0; } } で俺創ったらメモリ使用量は792KBでずっと一定だった
>>735 わざわざありがとう。
一から見直してみます。
取り合えず環境書けボケ。
>>737 うるせーよ
書く必要ねーな
(・∀・)カエレ!!
_| ̄|○
enum foo {hoge,fuga,fuge,hare}; enum foo bar; で、getoptの、optargを代入するにはどうすればいいですか? sprintf ("bar,optarg); bar=*optarg; bar=optarg; strcpy(bar,optarg); どれも駄目でした。
何をしたいのか理解できる人は手を上げてください。
enum foo bar ↓ foo barではない?
char *optargが、例えばfugaだったとします。 そのとき、barに2を入れたいのです。
ヒソ(´Д)ヒソ(´Д`)ヒソ(Д`)ヒソ
optargがfugaってなにさ。 もしかして、コマンドラインからfugaって文字列を渡したいとでもいうのかな?
はい。-t fuga とすれば、 switch(bar){ ... case 2: do_something();break; ................ としたいのです。
if(strcmp(optarg, "fuga") == 0) { bar = fuga; } else if( ...
>>747 ありがとうございます。しかし、これをcaseなどで置き換えられませんか?
文字列っていうのは配列なんだ。 文字列変数と文字列定数の比較は配列同士の比較であって、 Cには配列の比較を一気にやる手段は用意されていない。 したがって、switch/caseでは文字列による分岐はできない。
追記 Dではできる
>>751 そんなことでDマンセーとでも言うと思ったか
このウスノロがっ!
>>750 あらかじめ文字列に対応した整数のテーブルを作れば出来無い事は無い。
>>753 8bit チェックサムでも 256 通りの case 分岐
>>754 は?何でcase分岐する必要があんの?
あるバイト数のデータを加算して
sum &= 0xff した物とおしりのデータと
比較するだけだろ。
その比較に対しては真か偽しか意味がないはずだが。
757 :
デフォルトの名無しさん :03/12/06 16:20
if-elseの羅列も、caseの羅列も書く労力はさほど変わらないと思うんだけど。 決まったところはコピペできるし。
C言語って何で C99 になっても namespace 使えないんだ。 enum とかもうだめぽ。
Dマンセー!
うるせー馬鹿 PHPでもできるわアホ
マルチバイト識別子なんていらねー。 typedef long long int うんこちんこまんこ;
>>750 switch 〜 caseによる分岐
保守性を考えればこの処理の方が望ましいな。
ただ、文字列が多くなるにつれて遅くなるけどな。
#define STR_HOGE 0
#define STR_HAGE 1
#define STR_MAGE 2
char *str[3]={"hoge","hage","mage"};
int key;
char *instr;
・
・
・
for(i = 0; i < 3; i++){
if(strcmp(instr, str[i]) == 0){
key = i;
}
}
switch(key){
case STR_HOGE:
case STR_HAGE:
case STR_MAGE:
}
enumを使ってください。
コロンとdefaultは必須でつ
ハッ!! コロンツイテタ・・・
文字列が多けりゃハッシュ使うだろふつう
for(i = 0; i < 3; i++){ if(strcmp(instr, str[i]) == 0){ key = i; } } key = i; switch(key){ case STR_HOGE: case STR_HAGE: case STR_MAGE: default: } だな。breakが無いとか言うなよ。
breakが無い
↑サイヤ人
↑ナメック星人
ナメック星人てナメクジからきてるの?
いいえ、枝豆から出来ています
なめこ
セミコロンは必須です。
777 :
デフォルトの名無しさん :03/12/06 17:07
get(777);
>>777 error LNK2001: 外部シンボル "_get" は未解決です
fatal error LNK1120: 外部参照 1 が未解決です。
#include <2ch.h>
#include <2c.h>
782 :
デフォルトの名無しさん :03/12/06 18:26
無限ループ、永久ループ、永遠ループ さああなたならどれ。
誤爆ったスマソ
ありきたりだが、デッドループ
ど〜みても〜VC++だし〜♪(泣)
ループで名高い清水トンネル
C言語コンパイルするとexeとかできるけど そのexeは実行ファイルとして使えるの? 何いってんのこのデムパはとか思う人 がいるかもしれないけど、つまり言いたいのは 簡単なじゃんけんプログラムとかつくったとして コンパイルしてできたexeで、どっか他の パソコンとかで普通にじゃんけんできるのか ということです。
どっちなんでつか〜
>>787 開発系のソフトじゃなきゃ無理なんじゃないの。
?
OS が同じならいいのでは? 各 CPU アーキテクチャ向けの OS を別物と考えるなら
800 :
デフォルトの名無しさん :03/12/06 22:16
(*^o^*)
'`,、('∀`) '`,、
つまり、98でコンパイルしてつくったexeを xpの人に送ってテストプレイしてもらうということは 普通にはできないってことでつね。
一体どっちなんだ・・・・・ _| ̄|◎
C言語のポインタに関して、アセンブラをやっとくと解かり易いって聞いたんですが、 もしかしてアセンブラ命令の LAD GR1,A とかそんな感じの事でしょうか? 確かにポインタと酷似してるんですが・・・
ごめんなさい スレ間違えました・・・・
WindowsのCって型が異常に多いですよね。 charみたいなネイティブな型じゃなくって、LPSTRとかDWORD使ったり、 特にLPSTRとかwchar_tを使う切り分けってどうしてます? charでも十分日本語処理もできますしね。 VC系って型がありすぎて判断に迷うんですよ。 今は特にMFCで開発してるんですけど、人によってchar使ったり、LPCSTR使ったり、CString使ったりと バラバラなんで。
#include <tchar.h>
813 :
デフォルトの名無しさん :03/12/07 00:44
int (*func)(); これは「関数」を宣言しているのではなく、(関数への)「ポインタ」を定義しているんですよね? int (*hoge)[3]; これは「intへのポインタの配列」ではなく、「intの配列へのポインタ」ですよね?
はい?
こりゃ何しとるのかね? f = (*(int (*)(int))f)(f);
>>816 int f を int(*)(int) にキャストして、
f を引数として呼んで、
その戻り値を f に代入している。
>>816 だれかを混乱させようとしている。
自爆かも。
>>816 ベースはこれでいいのか?
int f(int *)
>>805 C言語と関係ないことだけど
98とXPは理屈の上では同じWindowsのバージョン違いってことで
一応上位互換があることになってるから
98で動くように作ればXPでも動くはず
細かいこと言うといろいろ問題有るけど
Cの入門書程度の簡単なプログラムならまず問題無いよ。
WindowsならIntelとその互換CPUしか今は考えなくていいし。
同じOSに対する違うOSってのは
MacとLinuxとWindowsみたいな場合を想定しているのだわさ。
LinuxとかUNIX系OSは実際同じOSでもIntel以外にも色んなCPUのバージョンがあって
実行ファイルもそれぞれCPU用に再コンパイルしないと互換性がないんだわさ。
822 :
◆ENiyTz8WZ6 :03/12/07 03:58
プログラム開始後に、配列の要素の数を任意に決めることってできる? 例えば scanf("%d",&num); for(i=0;i<=num;i++) { box[i]=i+1; } みたいな感じ。 この"num"をユーザーの入力で任意に決められないかなと、、、
823 :
◆ENiyTz8WZ6 :03/12/07 04:00
配列を定義するときって、要素の数を入れないとコンパイルできないっしょ? 何かいい方法はないかね?
・・・・・・・・・・・・・ それじゃできないけど、入門書を最後まで読めば やり方が載ってるよ、きっと。 もし、載ってなかったら、3冊買って全部読めばきっと載ってるはずだから。
826 :
デフォルトの名無しさん :03/12/07 04:48
alloc() new っくらい教えてやれよ。。。
>>826 1行目、それはなんだ?
2行目、スレタイを穴が開くほど読んでこい。
>>826 alloc はスタックの問題があるからお勧めしない
>>828 ネタニマジレスカコワ ・・・ちょっと待て、おまいのはネタちゃうやろw
alloca()と勘違いしている?
malloc
wとかワラとか恥ずかしいぞ
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww ワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラワラ 期待に答えてみました。
int main() { for(; ;) { printf("w ワラ "); } return 0; }
835 :
デフォルトの名無しさん :03/12/07 11:01
*a, a[]がどうなのかとか、議論するのもいいけど、 オブジェクトファイルを勉強すれば、一発で内部構造がわかるわけだが。 「linker & loader」という本をお勧めする.
複数形だそうですよ
メモリ上に一体どんなデータが置いてあるのかを 紙に書いてみると良く分かる。
最適化しないと、機械的におきかえた無駄分岐だらけのコードで、 結局よくわからないしな
>>838 あれれ?メンバとメンバの間に変な隙間が空いてるよ。お姉さん。
このスレPart68ってそんなに歴史あるんか・・・
駄レスでメモリ大量消費
844 :
デフォルトの名無しさん :03/12/07 14:03
v(^o^i)d
845 :
デフォルトの名無しさん :03/12/07 14:03
v(^・^)v
g(^o^t)o
何か中指おっ立ててるみたいに見えるな...。 >goto
co(^nti^n)ue;
駄レスでメモリリーク発生
851 :
デフォルトの名無しさん :03/12/07 15:27
free((void *)849);
852 :
デフォルトの名無しさん :03/12/07 15:36
とある空間内に点を100個発生させたいのですが、条件がありまして、 その空間がいくつかの四角形に分割されており 四角形ごとに何かしらの値が決められており、 その値が大きい四角形ほど点が多く発生するプログラムを 作りたいのですが、どうすればいいでせう?
*(char*)rand() = 0;
Linuxのkterm上のカーソルをC言語で制御するような関数はありませんか。
コンパイラが言うことを聞いてくれない。もうだめぽ。
>>855 とりあえず curses とかはどうでしょう?
man curses
>>856 基本的にコンパイラはいうことを聞いてくれる。
ダメなのは基本的に喪前のソースだ。
てへ♪
#include <stdio.h> #include <stdlib.h> #include <time.h> void main() { char str[20]; int i,a; srand((unsigned)time(NULL)); //ランダム a=rand()%100+1; printf("よそうゲーム\n\n"); printf("\n1〜100の数字よそうして入れてください"); while(1){ gets(str); i=atoi(str); if(i==a) { printf("\n正解\n"); return; } else if(i<a) printf("\n低いですもっと高い数字を入力してください"); else if(i>a) printf("\n高いですもっと低い数字を入力してください"); } } これでいいんですか?
だめです
gets はバッファサイズの指定がなく危険なので、 gets を使おうとするだけで警告を出すコンパイラもある。 fgets を使いたまへ。 あと、void main じゃなくて int main で return; は return 0; にすべし。 あとは、printf を2つ書いてる理由が分からん。 printf("よそうゲーム\n\n\n" "1〜100の数字よそうして入れてください"); fflush(stdout); /* これやらないと出力されないこともある */ で良い。
>>864 getsの問題を喚起するのは結構なことだが
ただfgetsを使えばいいってものじゃない
余ったデータを次の処理まで保持するなら
fgetcとungetcもしくはfscanfの方がきれいに書ける
mainの戻りなんてくだらねえことだ
必要としないアプリにまで難癖付けるのは厨
>printf("よそうゲーム\n\n\n"
> "1〜100の数字よそうして入れてください");
>fflush(stdout); /* これやらないと出力されないこともある */
どこの処理系でだ?
JIS X3010 7.9.6.1と7.9.6.3にはffulshが必要とは書いていない
7.9.2 には\nでコミットと書いてある
\nがなくてもコミットか否かを処理系定義としている
以上3点に共通すること:
教える立場で発言するときに受け売りはやめれ
864ではないが…
>>866 >fgets
同意。
>mainの戻りなんてくだらねえことだ
>必要としないアプリにまで難癖付けるのは厨
void mainは規格違反。必要・不要の問題じゃない。
不要ならint mainと宣言して不定値を返せば(returnを省略する)いいだけだ。
>教える立場で発言するときに受け売りはやめれ
何か問題があるのか?
自己レス。 >不要ならint mainと宣言して不定値を返せば(returnを省略する)いいだけだ。 新しい規格だとreturnを省略した時0を返すんだったスマソ。
>>867 >不要ならint mainと宣言して不定値を返せば(returnを省略する)いいだけだ。
別にランタイム上で動いている環境でもないし、
自分でmainの呼び出しまでも記述している場合、
そんなものは全く持って無意味。
そりゃランタイムがmainの戻り値を処理している場合は
一応返すけどね。
つーか「くだらねえこと」とかいう理由で規格を無視してるのに その後で規格をもちだすのはどーゆーことよ。
だからランタイムがそういうプロトタイプで mainを呼んでいるからだろ。 俺が言っているのはmainの呼び出しも自分で記述する場合。 文章読解力を疑われるぞ。
867はCRTの存在を知らないに100カノッサ。
>>871 ホスト環境において処理系はmainの関数原形を与えない
>>870 だから受け売りはやめれっつーの
ちゃんとてめえで考えろ
規格との付き合い方まで含めてな
久しぶりにC言語スレ覗いたらmainのプロトタイプ論争か。 プロセス終了前にfreeするべき/しないでよい論争もついでにやっとくか?
4〜5月くらいに出てくるなら仕方が無いかと思うが・・・ なんで今の時期だろう
GCC だと警告出すから鬱陶しいんだよ! > void main
>>866 昔 Turbo C++ 1.0 ではまったことがあった気が...。 >どこの処理系でだ?
void main() と書くような奴は exit() に引数なんて指定しません。
exitって引数いれなくちゃいけないんじゃないの?
そもそも exit なんか殆ど使わん。
ああ、いつも abort() するもんな。
883 :
デフォルトの名無しさん :03/12/07 20:53
tmp = realloc (ptr, 100); if (!tmp) error; ptr = tmp; ここでtmpがNULLでなかった場合ptrはtmpを代入する前にfreeしなくていいんでしたっけ?
freeをすると逆に使えなくなります tmp => [][][][][][](メモリ確保したといいたい free => ( tmp => [][][][][][] ) tmp => ?????? です
>>884 free (tmp);ではなくて
free (ptr);もいけないんですか?
reallocが成功してptrが指していたアドレスとは違うアドレスが返ってきたとき
ptrが指していた元のアドレスの方は既に解放されているということですか?
ちょっとお茶飲んでくるねw
つ担~ おちゃどぞー
ほのぼの感を出そうたってそうはいかないぞ。
どうせこのスレももう少しだ。きにしなさんな
892 :
デフォルトの名無しさん :03/12/07 21:54
( `_ゝ´)
freeしたら必ずmallocすること。
変数使ったら必ず宣言すること。
定義と宣言の区別をすること。
うんこしたら必ずしょんべんもすること。
しょんべんしたら必ずうんこもすること。
しゃせえしたら必ずゴムをつけること。
なぜかわかんないけど「う○こ」を打つとロックされるんだけど しょうがないから「うんち」って言います
うんちの方が環境に良い。
うんことうんちの違いを4文字熟語で表せ。
はくちょう座はデブネ ベンベンベガベガこと座が鳴るよ さそり座はアンタデス こんな覚え方してた。
相思相愛
子供の頃の話だが、うんこしたら卵焼きが二つ出てきたことある。
906 :
◆5mZOPhPlP6 :03/12/08 04:38
文字入力に関して質問なんですが、C言語って scanf で 文字列入力した場合は標準入力から来る終端って、 null ではなくて null + キャリッジリターン(0xA0) ですよね?
うんこうんこうるせーぞうんこども
908 :
デフォルトの名無しさん :03/12/08 07:40
その前にscanfは使わないことだ
>>908 んまぁ、そうだろうけどよ
質問ぐらい答えないのかよ
だったらこんなうんちについて語ってるクソスレには誰もこねーぞ
>>908 ( ゚Д゚)ハァ?
素人は scanf を使うな,だろ?
>>910 いや、素人は使っていい別に
ただ上達してからscanfを使うとレベルが低く見られる恐れがあるわけだ
>>906 nullじゃないの
int i=0;
char buf[20];
scanf("%s",buf);
while(i<20) printf("%02x ",buf[i++]&0xff);
>>911 ばか?
もまえのレベルが低いだけだ。scanfを使っただけでレベル低いと思ってんの?
gets() の様にオーバーランするとか思ってたりして。
>>913 俺は使うなとは言ってないんだがなぁ
使うべきところは使うし、無理して使うべきところでなければ使わない
scanfを使うとレベルが低く”見られる恐れがある”とはそういう意味だ
上手に使えばうまく見えるし、無駄に使えば下手に見えると言う事
お前がわからないって言うなら俺はお前の中でバカのまんまでいいから無理に理解しなくていいぞ
>>915 じゃあ上達すると scanf の代わりに何を使うの?
>>915 ==911
>>913 は「使うなと言っている」とは言ってない
>>910 は「素人は使うな」とは言っているが
>>915 で突然「使うべきところは使うし...」と言っている
やっぱりもまえのレベルが低い
関係ないけど、レベル = ドラクエだな、FFじゃなくて。 レベルアップの効果音とか好き。
LV = Wizardry
↑ハッカー
↑ファッカー
>>916 fgets + sscanf。
使っていいかどうかは素人とか玄人とかは関係なくて、
要は入力が信用できるものかどうか、じゃないの?
>>923 > fgets + sscanf。
それなら同意
素人にお勧めできないのは
素人は戻り値チェックや最大フィールド幅指定などの最低限をやらないから
>>923 その fgets が単なる EOF 判定のためだけだったら同意しかねるがな
このスレpart68にもなっているのに scanfの問題で盛り上がるのは恒例行事なのか
なぜならば、それがお約束であるから。 ようするにネタ切れ。
>>924 あぁ sscanf はOKか
てっきり俺は sscanf も使うなといってると勘違いしていた
>>906 の
>キャリッジリターン(0xA0)
には誰も突っ込まないのか?
>>929 osによって違うからじゃない。たぶん。
正確にはコンパイラーかな
>>930-931 無理するな。知らないことに答えようとするな。
アホかバカかとおまえに小一時間突っ込みたいよ。
大きいの突っ込んで。。もうじゅるじゅる
× A0 ○ 0D 0A はラインフィード。 A0 は全然違う。
#include <stdio.h> main() { char str[] = "abc"; printf("%c\n", *(str+1)); /* bと表示 */ printf("%c\n", *(str++)); /*コンパイルエラー、何で? */ }
許してね&heart;
atanの使い方がいまいち分かりません。 引数がラジアンだとどっかに書いて有りましたが、 本来はtanの値をいれてそのtanのラジアンを計算するものじゃないんですか? 俺がおかしいのかな…?
/⌒〜Y⌒"""ヘ ヘ∨ ∨ /⌒/ へ \|\ / / / /( ∧ ) ヘ ヘ く // ( /| | V )ノ( ( ( ヘ\ 教 て ┘/^| \ ( | |ヘ| レ _ ヘ|ヘ ) _ヘ し め /| .| | )) )/⌒""〜⌒"" iii\ え | .| α _ ヘ レレ "⌒""ヘ〜⌒" ||||> て | _∠_ イ | | /⌒ソi |/⌒ヘ < や | _ (_ ) ヘ | ‖ () || || () || _\ ん に / ( ) ヘ |i,ヘゝ=彳 入ゝ=彳,i|\ ね は /ー ( / """/ ー"""" > | _) | ヘ(||ii ii|||iiii_/iii)ノヘ|||iiiii< !!!!! | ( ヘ|||||iiii∠;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; フ ///// ヘ_/ ) ヘ|||""ヘ===二二二===7フ / ム/∧ ∧ ∧ ///// ( | ii | |LL|_|_LLL// | )( ∨| ∨) ・・・・・ ) )| || | |||||||||||||||||||||||| | | ( ヘ | ヘ ) ( ___ | | /| .| |||/⌒/⌒ヘ | | | iiiiヘ ( | ( | / / / (|.| | | | | | iii ) | ヘ )( ) ( ( /..| | |_____/ | | iii ( )( // / \ ) )..| |ヘL|_|_L/ / / ,,,,--(/Vヘ)(/
>>938 貴方はあっています。
atan(tan(x)) は(数値誤差を無視すれば)
x + nπ([-π/2,π/2] の範囲内にずらされる)になります。
atan2 というのもあって、
atan2(y, x) は atan(y/x) とほぼ同じですが、
x と y の符号によって結果が変わり、
結果は [-π,π] の範囲内におさまります。
分かりやすく言えば、atan2(y, x) は
直交座標 (x, y) を極座標で表した時の角度を返します。
>>940 ありがとうございます!やっぱりそうですよね。
>>940 よ
atan()がうかつなパラメータだと0割りであぼーんするからatan2()なんだろ?
0割なら可能性が全くないと言うことじゃん。なら大丈夫じゃん。 ・・・・とぼけてみる(^-^)/
(´・д・`)バーカ
(´・д・`)アーホ
'`,、('∀`) '`,、
948 :
デフォルトの名無しさん :03/12/08 20:25
先輩から貰ったプログラムに void 関数名(int *func1,int func2) { int i; for(i = 0; i < 5; i++) test[i] = func0(&(func1->func2[i * 10]), 10); } という部分があったのですが,{}はなくてもいいのか教えて下さい. 激しく気になります.
949 :
デフォルトの名無しさん :03/12/08 20:28
どこの{}だ?
>>943 でも、atan2(-y, x) != atan2(y, -x) で、
atan(-y/x) == atan(y/(-x)) なんですよね。
確かに分母が 0 になる可能性がある場合は atan2 を使いますが、
それだけで区別するものでもないような気がします。
たとえ絶対に分母が 0 にならないと仮定できるときでも、
極座標にしたときの角度を求めたいような場合には atan2 しか使えないわけですし。
951 :
デフォルトの名無しさん :03/12/08 20:45
>>949 for(){}
てなるはずの括弧です
よろしくお願いします
>>951 for(i = 0; i < 5; i++) {
test[i] = func0(&(func1->func2[i * 10]), 10);
}
ということか?
1文なら { } で囲まなくても大丈夫だけど、
まぁ、一応 { } で囲む癖をつけておいた方がいいという人もいるけどね。
文を追加しやすい & 追加するときに { } を付け忘れる危険性がない 、ってことで。
953 :
デフォルトの名無しさん :03/12/08 20:53
なくていい。
>>951 それより&の次の無駄な括弧が必要ない。
955 :
デフォルトの名無しさん :03/12/08 20:56
>>952 さん
>>953 さん
1文なら大丈夫なんですか・・・微妙になんで大丈夫なのかが気になります,とりあえず後のことも考えて括弧で囲む方向でやってきます.
ありがとうございます.
>>924 >> fgets + sscanf。
>それなら同意
scanf系の最悪な使い方だ
ループの途中に飛び込むgotoに匹敵
ココの住人ってクソばっかだよな 時々いいやついるけどさ、話になんね 相手に同意するときは同意する理由 相手を批判するときは批判する理由ぐらい述べないと永遠に続くからやめれ
958 :
デフォルトの名無しさん :03/12/08 21:26
標準入力から文字列をfgetsで読み込む場合、バッファはどれくらいとっておけばいいのでしょうか? このプログラムはcatなどのように、途中で切れたらまずい場合を想定しています。 このようなばあい、fgetsを使うべきではないのでしょうか? お願いします。
#include<unko.h> #define N 5 unko main(void) { unko geri; int n, m; while (!geri) { for (n = 0; n < N; n++) { printf("ブリッブリ\a\a\n"); for (m = 0; m < N; m++) { printf("ブリュ\a\n"); } } } return unko; }
>>960 解りました、そういうすごい考えをもってココの人たちは話していたんですね!
はっきり逝って感動しました
初心者だがポインタで頭が混乱してしまった。
char*buf,tmp[256]; int i; for(;fgets(tmp,sizeof tmp,stdin);){ buf=malloc(i=strlen(tmp)+1); strcpy(buf,tmp); while(!strchr(tmp,'\n'))fgets(tmp,sizeof tmp,stdin),buf=realloc(buf,i+=strlen(tmp)),strcat(buf,tmp); /* 適当な処理 */ free(buf); }
>>958 好きなサイズにしていいよ。
・読み込んだ後、バッファの最後が改行文字なら1行読み込み成功。
・改行文字でないならそれはファイル終端か行が継続している可能性あり。
いずれにしても、バッファのサイズに関係なく巧く処理すればよい。
#まぁ、勿論バッファが2バイトなんて阿呆なことを言われても困るが。
>>965 なるほど、わかりました。
ありがとうございます。
次スレも「あたし」でいいの?
朕
麿
あした
妾
このスレにバカがいるって言うだけで 見たくもないな。まともな人だけ書いて欲しい。
嫌ならまともな掲示板に池
975 :
デフォルトの名無しさん :03/12/09 00:14
んだんだ
976 :
ぼるじょあ ◆yBEncckFOU :03/12/09 00:15
(・3・)エェー C言語ならぼるじょあに聞け!というタイトルで立ててくるYO!
>>956 > scanf系の最悪な使い方だ
> ループの途中に飛び込むgotoに匹敵
根拠を示せ
それともおまえの頭がループしてるのか?
>>978 >>956 はfgets+sscanfと同程度の頻度で
ループの途中に飛び込むgotoを使うって意味だろ
>>956 はループの途中に飛び込むgotoを頻繁に使うアフォってこと?
>>935 ++演算子って難しいね。私もよくわかりません。
main(){
char str[4] = "abc";
char *p;
p = str;
printf("%c,%c\n", *p, *(p+1)); // a,b
printf("%c,%c\n", *p, *p++); // b,a(?)
}
引数の評価順序がコンパイラ依存ということを知ってのネタか?
朝からトゲトゲしすぎですよ
では、さわやかに
>>981 はスルーということで。
ループ途中に飛び込むgotoは、使い方によっては便利かもしれないわね。
>>978 fgets+sscanfで取りこぼしこいてるアフォの救済用にfscanfがある
ここまで来るとfは本当はいらんがそれはおいといてやる
fgetsにバッファサイズを渡して安心してるボンクラどもは
そのサイズをどうやって決めたかを小一時間問い詰めてろ自分に
>>988 fscanf なら取りこぼさないのかと小一時間…
>>989 あー、fscanfてめえで書いてみたことねえな( ゚д゚)ペッ
fscanf の戻り値を...
scanf って最大フィールド幅で切りつめられても分からないんだよね
993 :
デフォルトの名無しさん :03/12/09 22:15
記念カキコ v(^-^*)
自分で指定しておいて「分からない」とかほざいているどスカタンにCは向かん
おっと失礼 どスカタン が Cには向かん
(; ・`д・´) !? (`・д´・ (`・д´・ ;)
998
999
/` ー 、 ___ ,. - ' ヽ . / ,. ‐ ' ´ ` ヽ 、 ! l/ ィ ,、,i ,、 ,、 ,、ヽ,! / iv':::'::::':`':::`:::V レi. ヽ / ,! :::::::::::::::::::::::::ノ( 'ヘ,.i . i .i|. ヽ:::::::::::::::::;:-:⌒ l:| l. l|-ー`=;::::::::シ-─-.、 l::! | l:| ヽ::/ ヾス l l:| ,H l(. l . l l:| ノ::::ヽ、 __,.イ'ノ゙ l l|' ー '´ f ̄!  ̄,/ ! ヽ;ハ |T'::ー-r'=f─ ;´ , | ∩ ヾi i,;;ィ^ヽ/ヽ;:::: ハ/ | | ,ィ:!´ l /oヽ !`t、 (|^ ^^) FUCK YOU
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。