1 :
デフォルトの名無しさん :
03/01/15 23:21 俺に答えられることなら何でも聞いとくれ
2 :
デフォルトの名無しさん :03/01/15 23:22
3 :
デフォルトの名無しさん :03/01/15 23:22
4 :
デフォルトの名無しさん :03/01/15 23:23
5 :
デフォルトの名無しさん :03/01/15 23:24
スレッドの立て方が気持ち悪い…
>>2 で「
>>2 を見よ。」なんて書いてるし…
7 :
名無し募集中。。。 :03/01/16 03:00
9 :
デフォルトの名無しさん :03/01/16 03:09
>>9 もう冬休みは終わっただろ
冬厨は学校に備えて寝ろ
12 :
前スレの930 :03/01/16 03:22
imlibっていまどこにあります? いろんなサイト探したんですが、リンク切ればかりだったので。。
14 :
Cというより国語です :03/01/16 03:28
K&R本のまえがきCで ポインタのような大事な機能の説明は改善した。元の例題をさらに洗練させ、 いくつかの章で新しい例を追加してある。 (ここまでは分かる) 例えば、複雑な宣言の扱いは、宣言をことばに、 あるいはその逆に変化するプログラムで補った。 よく分からない・・・。
17 :
デフォルトの名無しさん :03/01/16 04:25
>>14 訳者がへぼいんだよ。
つーか英文科卒の訳者じゃしゃーねーよ。
恐らくコンピュータ畑の人でもないと思うんだけど 一体どんな経歴で と思ったら略歴に東大の計算機センターって書いてあるな…
自分の文章読解力の無さを棚に上げて訳者批判とは......笑える(w
量子コンピュータで C は使えますか?
200刷超えてもミスプリが直らないのは仕様ですか? 最近のは直ってるのかなぁ。
アリエール
27 :
デフォルトの名無しさん :03/01/16 09:38
>>26 コンパイルするときのコマンドラインと出力教えれ
おそらくインクルードパスが足りないかと。
量子コンピュータでアセンブラ(ry
0 と 1 が表現できるなら大体何でもエミュレートできるだろ
レスありがとうございます。 とりあえずもう少しだけ読む勧めていこうと思います。
31 :
デフォルトの名無しさん :03/01/16 21:42
あいまいな質問でも、答えてくれるかしら?うふっ?
>>29 量子コンピュータは0と1を使わない。
1キュービットは、[0|1]こんなんだ。
34 :
デフォルトの名無しさん :03/01/17 06:52
え〜と。 age。
36 :
デフォルトの名無しさん :03/01/17 11:07
最近よく聞く粒子コンピュータってナノテクですか?
りゅうこ。
>>35 いえ、キュービットはnビットの転送ができる確率分布です。
量子コンピュータは、2^nビットの演算を一度に出来ると期待されています。
少なくとも、整数を素数へ因数分解することがP時間でできることが証明されています。
ただし、それ以外のいわゆる「普通の計算」が可能かどうかは、実は不明です。
もちろん汎用化してC言語の環境が整えられることは間違いないでしょうが、
それは早くても2050年以降になることでしょう。
39 :
デフォルトの名無しさん :03/01/17 12:37
タートルグラフィックスのプログラムなのですが、 #include <stdio.h> #include <ctype.h> #include <stdlib.h> int x,y,dx,dy; void put_mark(int x, int y) { move(x-2,y-2); cont(x+2,y+2); move(x+2,y-2); cont(x-2,y+2); move(x,y); } void forward(){ x=x+dx; y=y+dy; cont(x,y); put_mark(x,y); } void left_turn(){ int tmp; tmp=dx; dx=-dy; dy=tmp; } void right_turn(){ int tmp; tmp=dx; dx=dy; dy=-tmp; }
void analysis(ch) { switch(ch){ case 'F': forward(); break; case 'R': right_turn(); break; case 'L': left_turn(); break; } } void turtle() { int ch; while((ch=getchar())!=EOF){ if(isalpha(ch)) analysis(ch); } } int main() { openpl(); space(-300,-300,300,300); x=0; y=0; dx=0; dy=10; put_mark(x,y); turtle(); closepl(); return 0; }
これをいじって数字を入力したらそれたを数値として読み取り、次のコマンドを繰り返し実行するようにしたいのですが、 どこをどうすればいいですか?例えば、5Fと入力するとFFFFFとおなじ動きをする。さらに@と#でくくった部分を!で呼び出せるようにしたいんですが。 できるだけ初心者でもわかるような簡単なぷらぐらむでおねがいしたいんですが。for文とかwhileぶんとかif文みたいなので。 わがままでスマソ。
>>41 何が一番わがままかって、このスレは基本的にソース丸投げ禁止だぞ。
43 :
名無し@沢村 :03/01/17 13:53
>量子コンピュータ 佐野量子が使うPCのこと
以下の2つのマクロに意味的に何か違いはありますか? ただ好みの問題でしょうか? do { ... } while(0) か { ... } だけかってことなんですが。 #define MACRO1() {\ var1 = foo; \ var2 = bar; \ } #define MACRO2() \ do { \ var1 = foo; \ var2 = bar; \ } while (0)
>>44 散々出てくるFAQなんだがそれ。
if (condition)
MACRO1();
else
foo();
とやったときのことを考えてみれ。
47 :
デフォルトの名無しさん :03/01/17 21:59
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
>>47 C言語をもっと勉強してからもう一度来てください。
>>49 ビット演算はなんの役に立つのでしょうか?
2で割るとき。 //まあ、最適化があるから、ふつーは意識しないのだが。
フラグ、ラスタオペレーション、RGBマクロ、ウィンドウメッセージの分解、擬似乱数生成 などなどなどなど…
教えてください Cでsnprintfを自作することになりました。 参考になる資料とかありましたら教えてください。 フリーで使えるソースが何処かに落ちていると良いのですが。
>>55 vsnprintf 呼んじゃえ。
というのは冗談で。
というか、他人のソースに頼っちゃダメー。
そんなに難しくないはずだぜ。
面倒なだけで。
マルチっちゅーか、 No.49のスレが2つあるのが問題なのでは?
age
62 :
デフォルトの名無しさん :03/01/18 22:12
double a[8]; a[0] = 0.0; として、a[0]に0が入らないってどういうこと?
64 :
デフォルトの名無しさん :03/01/18 22:14
65 :
デフォルトの名無しさん :03/01/18 22:23
>>63 書き換えてる箇所なんてないのに勝手に
変わるんです。
a[0]=0.0;とした直後は0.0が入っていて
ある行でいきなり変な値が入って・・・。
わけわからん
double b[8]; double a[8]; a[0] = 0.0; printf("%f\n", a[0]); b[8] = 1.0; printf("%f\n", a[0]);
67 :
デフォルトの名無しさん :03/01/18 22:32
short x; double[8]; double[0] = 0.0; *((int*)&x) = 3.8;
68 :
デフォルトの名無しさん :03/01/18 22:33
int x[8]; double[8]; double[0] = 0.0; x[8] = 3.8;
69 :
デフォルトの名無しさん :03/01/18 22:33
どっちだ?
double b[1], a[8]; b[1] = 1.1;
for(i =0; i<8; i++){ a[i] = 0.0; } u_int XX, YY, U_bar, V_bar; u_int *X, *Y, *u_bar, *v_bar; X = &XX; Y = &YY; u_bar = &U_bar; v_bar = &V_bar; X[0] = 355; Y[0] = 435; X[1] = 747; Y[1] = 429; X[2] = 747; Y[2] = 453; X[3] = 355; Y[3] = 458; X[4] = 97; Y[4] = 281; X[5] = 889; Y[5] = 256; X[6] = 882; Y[6] = 326; X[7] = 10; Y[7] = 347; というコードにしてて、 X = &XX; Y = &YY; u_bar = &U_bar; v_bar = &V_bar; をなくすとa[]が書き換えられなくなりました。 どういうことなんでしょうか?
こりゃ重症だあ
>>65 ネタだと思いたい・・・
C言語の配列は0から始まるって知ってた?
つまりどういうことかというと
int ary[16];
と宣言すると
ary[0] から ary[15] までの範囲が使えるの
>>74 0から始めてると思うんですけど?
どういうこと?
>>62 printf("%lf",a[0]);
'l'を付けて出力して見て。
double で、宣言しているわけだから。
0から14で、15個 double a[8];なら 8個のdouble型を0から7番地まで確保。
>>75 XXとYYが配列で定義されてないから、X[0]〜X[7]とY[0]〜Y[7]も存在しません。
存在しない物に代入しようとすれば、結果は神のみぞ知る。
>>65 じゃぁ
>>66 は何かね?
double b[8];
(中略)
b[8] = 1.0;
b[7] までしか使えないんだってば
0〜7まで指折りながら数えてみろ
80 :
デフォルトの名無しさん :03/01/18 23:22
∧ ∧___ ダッコ♪ /(*゚ー゚) /\ /| ̄∪∪ ̄|\/ | |/  ̄ ̄ ̄ ̄
正確にはX[0]とY[0]は存在するか。 X[1]〜X[7]とY[1]〜Y[7]はどうなってるか知らないよ。
??:「大人しくしていろ
>>83 」
83:「はい」
84 :
デフォルトの名無しさん :03/01/18 23:32
>>73 要するに、ポインタってのが何なのかが分かってないってこと。
まぁ、初心者が大抵陥る状況なわけだが。
>>65 ポインタと配列は違います
そこを中心に、もう一度、出直しましょう
>>76 printf("%lf", f);
printf("%f", f);
どちらも同じです。
printfのプロトタイプは
int printf(const char *, ...);
なので、...の部分は型情報がありません。
したがって、Cの規約により、...の部分に置かれた
float型の値は格上げされ、doubleで渡されます。
ポインタが分からん奴はアホ。
ポインタを勉強する前にまず パソコンを分解してマザーボードの仕組みを勉強しよう。
ディスプレイとキーボードとマウスとスピーカーとマイクと ADSLモデムとプリンタと本体に分解しました。
>>89 ディスプレイとキーボードとマウスとスピーカーとマイクと
ADSLモデムとプリンタ
はパソコンではありません。
液晶とボディとスマートポインターと赤外線ポートとカメラと モデムとUSBとその他中身に分解しました。
93 :
デフォルトの名無しさん :03/01/19 03:16
QAスレなのにツレねーな ここは単発質問スレ防止・厨房吸収スレじゃねーのか? 答えたくないなら無視するだけで煽るなや
>>1 またテンプレ貼らなかったのか・・・
いつになったら冬厨は消えてくれるんだ。
>>86 long double はどうなりますか?
>>99 そういう意味じゃなくてlong doubleを...に渡すとどう型変換されるかということについて聞いているんだと思うけど。
>>100 VC++ のヘルプだと...
・実引数が float 型であると、関数呼び出しの前に double 型に拡張されます。
・符号付きまたは符号なしの char型、short 型、列挙型、ビットフィールドは、整数の上位変換によって符号付きまたは符号なしの int 型に変換されます。
しかないから、多分そのまま渡されるんだろ。
>>100 long doubleがdoubleに格下げになる事はないだろう。
あつしキラ〜〜イ。
long double ld = 12345; printf("size: %u\n", sizeof(ld)); printf("bit image: %08x %08x %08x %08x\n", ld, -1, -1, -1, -1, -1, -1); printf("value: %Lf\n", ld); ↓ size: 12 bit image: 00000000 c0e40000 0040400c ffffffff value: -40960.000000 (MinGW gcc 2.95.2) という事で、101-102 は正しいっぽい。 99 は嘘っぽい。
>>104 いや、MinGWでlong doubleが正しく表示されないのは、msvcrt.dllを
使っているからだそうだよ。
>>106 余計なDLLを使わないようにするため。
108 :
デフォルトの名無しさん :03/01/20 12:49
5つのデータを入力し、 昇順に並び替えて出力するプログラムを作成しなさい。
>>108 alert(prompt("", "3 2 4 1 5").split(/\s+/g).sort(function(a, b) { return a - b; }).join(" "));
Ruby 万歳!
111 :
デフォルトの名無しさん :03/01/20 21:44
突然で申し訳ないですが、 回文判定部分を,文字列を受け取るとその文字列が回文なら 1 を、 そうでないなら 0 を返す関数を設計し,置き換える。 という風にしたいんですが、以下のやつからどうしたらいいんでしょうか? 詳しい方どうか教えてくださいませ。 #include <stdio.h> #define MAX 100 main() { char string[MAX]; int n, i; /* input */ printf("string = "); scanf("%s", string); /* strlen */ for (n = 0; string[n] != 0; n++) { /* 何もしない */ } /* reverse */ for (i = n - 1; i >= 0; i--) putchar(string[i]); putchar('\n'); }
教えてください。 C言語でBMI計算式を書きたいのです。計算式は体重÷(身長×身長)です。 ほとんど初心者なので、一番簡単な計算式でお願いします。
>>111 「回文判定部分を (略) 置き換える。」って書いてあるけど、
そのプログラム中に回文判定部分ないぞ。
114 :
デフォルトの名無しさん :03/01/20 22:49
>>112 課題を丸投げするな。
自分の考えやどこまで出来ているのかを書いた方がいいよ。
BMI=taijuu/(shincho*shincho);
struct hoge { int foo : 1; int bar : 2; } こんな構造体を発見したのですが、 : ←これって何してるんですか?
119 :
デフォルトの名無しさん :03/01/21 08:31
for文がよく使われる状況のように、 変数をインクリメントしながらループさせたいのですが for文だと必ず1回は実行されますよね? 1回も実行されない状況があるような場合には、 while文中でi++とかやるしかないのでしょうか?
> for文だと必ず1回は実行されますよね? いいえ。 int i; for(i = 0; i >= 0; i++) printf("実行されませんよ %d\n", i);
>>119 必ず一回は実行されるのはdo〜while
>>120 それは実行されますがなにか?
for(i=0;i<0;i++)でしょ。
うぁ〜 恥ずかスィ 今までずっと勘違いしてきてました。 for(a;b;c) でaは前、bとcは後に実行されるのかと…
for(int i = 0; i >= 0; ) 〜;
for( ; 1 == 0 ; );
> aは前、bとcは後に実行されるのかと… 違う・・・。 for(i = 1; i <= 10; i++) printf(%d\n", i); これを goto に直すと、 i = 1; /**** a ****/ loop: if(i <= 10) /**** b ****/ goto next; printf(%d\n", i); i++; /**** c ****/ goto loop: next: ... こんな感じ。 a と b が前、c が後。
128 :
デフォルトの名無しさん :03/01/21 13:44
2のべき乗数を昇順に表示するプログラムをつくれ。 どこがまちがってるかわかる? #include <stdio.h> int main(void) { int i, no; printf("整数を入力してください。:"); scanf("%d", &no); i = 0; while (i < no) { i++; printf("%d ", 2^i ); } putchar('\n'); return(0); }
>>128 それは、べき乗を求める、演算子では、ない
130 :
デフォルトの名無しさん :03/01/21 14:10
もうすこしわかりやすくおねがいします
^は、べき乗を求める、演算子では、ない
というか、C にべき乗を求める演算子はない。 べき乗を求める関数はあるけど。
133 :
デフォルトの名無しさん :03/01/21 14:23
わかりました もう少し考えてみます
#include <stdio.h> int main(void) { int i, no, sum; printf("整数を入力してください。:"); scanf("%d", &no); i = 1; while (i < no) { i = i * 2; printf("%d ", sum ); } putchar('\n'); return(0); } これだとなにがだめなの? だめなりゆうがわかんないです
>>134 > これだとなにがだめなの?
コンパイラの警告レベルを最大にしていないから
sumはいつ初期化されている?
つうか、これも問題あると思うが。 i = i * 2;
理由も何もなにがだめなのかも書いてないじゃん。 まあおそらくsumになにも代入してないのが問題だと思うけど:-)
>>114 申し訳ありませんでした。
一応、いろいろなものから、見よう見真似で作ったのですが
ほんとに、切ってくっつけたりしただけなので自身がなかったもので。
#include<stdio.h>
int main() {
double weight = ;
double height = ;
double bmi;
bmi = weight / ( height * height );
return(0); }
間違っている場所を教えていただけますでしょうか。
ほんとに全くの初心者で、ごめんなさい(><
釣りでしょ.
142 :
デフォルトの名無しさん :03/01/21 16:17
#include<stdio.h> int main() { bmi = weight / ( height * height ); return(0); } >112 >ほとんど初心者なので、一番簡単な計算式でお願いします。 簡単でいいならこれだけでいいんじゃん?
>>139 1.weightってなに?
2.stdio.hは使いたいの?
3.最後の} の前に改行しようや
4.int main(){return 0;} じゃだめなんか?
5.0で除算はできんだろ
結論。間違っていない場所=五行目。 かな
144 :
デフォルトの名無しさん :03/01/21 20:36
1.体重で良いんじゃない?
昨日の問題なんですが 整数を入力してください:19 2 4 8 16 こんな感じで実行結果がでるようにしたいんですが 実行結果が 2 4 8 16 32 となってしまいます。 なぜですか? #include <stdio.h> int main(void) { int i, no, sum; printf("整数を入力してください。:"); scanf("%d", &no); i = 1; while (i < no) { i = i * 2; printf("%d ", i ); } putchar('\n'); return(0); }
146 :
デフォルトの名無しさん :03/01/22 06:54
そうすると、どうすればいいのでしょうか?
>>147 そういうことは自分で考えるようにしないと力がつかないぞ
昨日から考えてるんだけどね・・・ わかんなくて ヒントをください
>>149 「判定後にiを二倍している」のが問題なんだから「判定前にiを二倍する」
>>149 一行ずつコード読んでみ
プログラムは書いてある通りにしか実行されないんだから
読めばどう実行されるのか手に取るようにわかる
できたよ ありがとうございました
for使った方がいいと思うんだけどな for(i=1;i<=no;i*=2) /* 2からにしたかったらi=2に */ printf("%d ",i);
>>153 恐らく本当はループの後にもiを利用するのだろう
i*=2 これの意味はなんですか?
i=i*2
サンクス またくるね
126(^_^;)
お前らいい奴だな
161 :
デフォルトの名無しさん :03/01/22 08:34
\ はなんと読むのですか?? * はなんと読むのですか?? <>はそれぞれ何と読むのですか?? $ は「ドル」でいいのですか?? % は「パーセント」でいいのですか??
163 :
デフォルトの名無しさん :03/01/22 09:46
\ イェン
\ BackSlash
その文字書いといて、バックスラッシュですか? *アスタリスク <>小なり大なり $ダラー %百分率
166 :
デフォルトの名無しさん :03/01/22 11:21
> その文字書いといて、バックスラッシュですか? ( ´Д`)オイオイ・・・
まじっすかー
( ´Д`)まじっすョー
その文字じゃないバックスラッシュキボン 全角禁止で
170 :
デフォルトの名無しさん :03/01/22 11:36
構造体の仕様変更が出て、幾つかの変数を追加、追加した変数の処理を組み込んでコンパイル。 すると突然異常終了が発生。 変更箇所を見比べても、異常終了する原因がつかめず、仕方が無く 変更箇所を1つずつ前のソースに組み込んでは実行して、組み込んでは…でチェック。 すると、構造体に新たにある名称の変数を追加してコンパイルすると落ちることが判明。 その構造体の中で重複しているわけでもないのに・・・ int length; これを組み込むと落ちる。 int len; に変えると落ちなくなった。 こういう現象ってどういう理由が考えられますか?? マジでこれ以外は影響なく、lengthでもLengthでもLenGthでも落ちます。 わけわかんねえよ〜
//////////\\\\\\\\\
>>170 length にしたときと len にしたときの出力ファイルの差を取って何がどうなってるのか調べてみてはどうだろうか?
#define len とかしとらんよな?
しとらんよな?
175 :
デフォルトの名無しさん :03/01/22 12:56
>>172 あーそっか。やってみますわ。
>>173 やってません。つか、ローカル変数や他の構造体でもlengthは使いまくってる模様
#define if while
>>177 むかつくやつのソースにこっそりと書き加える
#define int charの方がいいかな
>>170 「落ちる」ってどういうタイミング?
1. 起動直後
2. 特定のstep
3. 不定
「こーすれば逃げられる」って方法で安易に逃げると、
他に潜在バグがありそうな気もするし。
原因わかったら、公開して欲しいっす。
>>180 2: ですね。何度目かのmallocで落ちます。
確かに、原因不明のまま「回避できた!」というのは
仕事である以上できる限りやりたくないのですが、
とりあえず結果を急いでいるお客さんのために
結果が出せるかどうかを優先してます。
報告した後に調査しよ・・・・くそー
_length で落ちる?
mallocでつか・・・。 メモリ管理が甘い(と言われている)Windows系だとしても 変数名を変えると落ちなくなるっていうのが解せませんね。 int length ; の位置に int dummy ; を書いて、その下に lengthを置いても同じ? なんの解決にもならないレスでスマソ。 頑張って下さい。
確保してないメモリにアクセスしてる。どこかで。
んだな、メンバ名云々とは無関係なバグが顕在化した悪寒
ポインターのポインターを確保してないので セグメントエラーがでてるとにらんでみた。
∧_∧ ( ´∀`)< ぬるぽ
>>170 実は構造体の順番をコンパイラがスペル順で入れ替えてて
どっかのコンパイル済みライブラリが再コンパイルされずに
そのままアクセスするためにメモリを破壊してるとか…
>>188 > 実は構造体の順番をコンパイラがスペル順で入れ替えてて
そんなコンパイラは、今すぐ捨てろ。ANSI 非互換だよ。
>>189 ANSI互換だったら考えるまでもなく
変数名変えただけで結果が変わるはずが無い罠
>>191 プログラムにバグが潜んでたら、その限りではないよ。
以前に、プログラム名(の長さ)によって実行速度が大幅に変わる
とかいうのがあったけど、それと似たような原因じゃないかな。
そういやコメント行を消したら落ちる、 コメント行を残せば動く、 というようなこともありました。 上述されてるように不正なメモリアクセスが原因でしたけども。
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>187
195 :
デフォルトの名無しさん :03/01/23 03:49
おまいら空域読めてるか? どうやら俺には無理らしいぞ
>>192 プログラム名の長さによって実行速度が変わるというのは、
ごくごく簡単にいうと、以下のようなことであるらしい。
・プログラムが起動されたときにプログラム名をスタックに積む
・これをCではargv[0]で参照できる
・プログラム名の長さによって初期の(main突入直後の)スタックの伸張度合いが変わる
・ところで、x86系CPUでは、doubleにアクセスする場合、
それが8バイト境界以外の領域(8の倍数番地以外から始まる領域)に
置かれているとペナルティが発生する(実行速度が低下する)
・プログラム名の長さによってdoubleがスタックに積まれる位置が変動する
それは8バイト境界におさまらない場合ももちろんある
・したがってプログラム名の長さによって実行速度が低下する場合がある
えーと短く説明するためにかなりはしょってます。興味のある人は
http://quanta.synchem.kyoto-u.ac.jp/~maho/FreeBSD/FreeBSD_compiler.html を参照のこと。
>>192 変数名を実行ファイルにまで持ち越すようなコンパイラ/リンカが存在するのか?
でなければ、そんな事が原因でプログラムが誤動作する事はあり得ないが・・・。
んで、これが今回の話にどう影響してくるかというと… あんまり関係ないような気がする。 普通構造体のメンバ名なんてのはコンパイルが通ると 単なるオフセットの表現にしかならないはずで、 名前を変えた程度ではオフセットは変わらない。 (メンバの型が変われば当然オフセットは変わる、こともある) デバッグオプションをつけたとしても、 構造体のメンバ名は実行ファイルなどに影響を及ぼさないと思うし。 本当に構造体のメンバ名だけを変えて実行に影響があるのなら とても興味深い話なんだが、正直原因が思いつかないな。
>>198 デバッグオプションつけた場合はありうる。
もっともここでの話は変数名ではなく構造体のメンバ名だったはずなので、
関係ないとは思うんだが…
結論 コンパイラのバグで桶?
No.
>>201 まてまて。それは最後の最後に疑うべきところだ(w
170の報告をまとうではないか。おれは楽しみにしてるぞ。
>>202 &203
では保留と言う事で170の凱旋を待つとしよう
せめてコンパイラ名を言い残してから出撃して欲しかったな
>>197 FreeBSDではないけど、Linuxでの開発なんで関係あるかも・・・?
int len;
unsigned char type;
新たにいっこ追加したら、また落ちるようになった。
今度は、
unsigned len;
unsigned char type;
にしたら動く・・・なんだ?バイト境界関係の問題でもあるのか?
未だ原因不明・・・・(;´д⊂
失礼、 unsigned char len; unsigned char type; で動いた。
>>206 もっと他のとこも見てみろって。
絶対どこかで変なメモリアクセスしてるから。
言っても無駄だな、俺のコードに問題ないのにエラーが出る、と思い込んでるパターン
いや、俺のコードじゃないから面倒な話なんだが。 担当者が年始早々失踪して、火の車なプロジェクトの手伝いですわ。
>>206 そのメンバは末尾に追加したのか? それとも途中か?
あと、全プログラムをリコンパイルしてるか?
つーか、デバッガ使って追いかけたりしないのか?
>>211 デバッガの使用は禁止されています(;´д⊂
>>209 purify系のメモリリーク検出ツールとデバッガがないと
絶対そのバグ潰すのは無理だと断言しよう
>>212 んなアホな...
>>212 は偽者
だが間違ってはいない。禁止はされてないけど環境がない。
>>211 末尾に追加しました。
つーか、メモリ関係チェックしてみると、あちこちで破壊っつーかなんつーか・・
誰だよこれ組んだヤシは!
216 :
デフォルトの名無しさん :03/01/23 15:53
#define PI 3.14 const float PI = 3.14 このふたつって、どこが違うんでしょうか
>>216 恐らくは const float PI の方は記憶容量を使うが、プログラム中
に繰り返し出てきた場合はかえってメモリ領域を節約できる可能性あり。
まだよく理解できませんが、ありがとうございます
>>216 前者は単なるテキストマクロだが、後者は変数として扱われるので型チェックが入る。
定数を定義する時、配列の要素数などに使うのでなければ後者にすべし。
>>217 (゚Д゚)ハァ?
一体どういうメモリ領域の計算をしてるんだ?
>>219 言い方が悪かったかもしれん。
const float PI は変数としての記憶領域を必ず使うが、#defineの場合
はマクロなので、変数としての記憶領域は使わない。しかし出てくる
度にコードが少しずつ長くなっていく可能性があると言いたかった。
floatの例だとわかりにくいが、char *s = "hogehogehoge"; などの例を
考えてみればわかりやすい。これと #define s "hogehogehoge"を比較
してみれば、*sの方は "hogehogehoge" がメモリのどこかに確保される
が、一度しか確保しない。それに比べて#define sの方は、一度も使わな
ければ確保されないが、もし使うと使う度にメモリを消費していく。
コンパイラによっては同一の文字列リテラルはマージする場合もあるから
一概には言えないが。
書き忘れ。 const は書き換え不能だが変数なので、普通の変数と同じようにスコープを限定 できる。
>>219 constの方は即値にならないと言いたいんじゃない?
>>222 最適化によって即値になることもあるよ。
225 :
デフォルトの名無しさん :03/01/23 16:19
コマンドライソで渡す引数の3番目の文字が (つまり$hoge omaemona で言うところの"a") 何々だったらあーせよってしたいんですけど argv[1][2]みたいな指定方法は可能でしか??
>>224 それは分かっている。
アドレスを得るようなことをすればメモリーにおかれるだろうけど。
>>225 他にどうしろと?
*(argv+1)か?
三番目の引数じゃなくて三番目の文字か(^_^;) とにかくargv[1][2]でOK
>>224 こういう場合ってやっぱり最適化はかからないのかな?
const float PI = 3.14;
*(float*)&PI = 3.;
エラー無しで通るね。
230 :
デフォルトの名無しさん :03/01/23 16:38
試せるじょうきょうにないのです・・・ すみません
>>230 不幸だな。コンピュータやコンパイラの動作を人間が脳内シミュレート
しなければならないのか。俺だったら発狂するかも。
(^^)
236 :
デフォルトの名無しさん :03/01/23 20:00
X on Windows+ オフィシャルガイドブックについているCDから X on Windows LEをインストールして、C言語を使っていましたが、 values.hというヘッダーファイルが無いようです。 これって、LE版だからですか? あと、どうすればよいですか。
up
質問です 参考書から激しく抜粋なのですが typedef struct node_tag{ struct node_tag *next; /*次ノードへのリンク*/ struct node_tag *prev; /*前ノードへのリンク*/ void *data; }node_t; っていうリスト構造体があったとして int list_is_empty(node_t *head) { return head==head->next; } って関数があるとします 参考書によるとリストが空かどうか判断する関数らしいのですが なんでhead->nextなheadを返すことによって 真か偽かを判断できるのでしょうか? 厨房でごめんなさい
>>238 両方ともNULLを指しているか、nextが自分自身を指していれば==に
なるね。どちらかで空を表現してるんだろう。
>>240 そう言われてみればそうだな。
NULL->nextなんてのはあり得ないから。
間にデータが一つも無いって表現の方があっているでしょ? head->next==tailとか
リストの末尾(リング構造だから先頭の一つ手前でもある)にでも、空のノードを 一つ入れるようにしてるんじゃないの。リストが空の時はノードはその一つだけ しかないから、当然 next も prev も自分自身を指すようになる。 だから head == head->next で判断できるのではないかと。
headを初期化(初期設定)しているところを探してみそ>238
あっ なんとなくわかったぽです
headが空の場合はnextもprevもあるはずないんだから
head自身がnextでありprevにもなるってことですか?
それで
>>240 さんはheadが空なんだから
nextも何も表現できないはずってことを言ってわけですよね?
ぬるぽ->next
247 :
デフォルトの名無しさん :03/01/23 22:40
K&LのC言語って、どんな言語で作られたんですか?
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>246
>>247 K&Lとはなんぞや。
K&Rのことであれば、開発者に聞け。
バージョンによっても違うだろうし。
初期の開発者はデニス・リッチーさんだ。
L&R
K&L = 韓国語 + ラテン語 という事か。
K&L とは 関西&言語 の略で日本では関西弁と呼ばれています
キリ番ゲッツ
俺はこれから川口浩探検隊に行って来る。
アールとエルの区別もできないくせに!
このスレにおける電波の送受信を許可します。
if ((denpa = socket(AF_DENPA, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(1); }
>>261 AF_DEMPAじゃストリーム通信できないYO!
SOCK_DGRAMで常にSO_BROADCASTが立ってるYO!
263 :
デフォルトの名無しさん :03/01/25 20:38
>>216 そういえばgccってconstで定義してる変数の値を変えてもウォーニング出るだけなんですけど、
これはCの仕様なんですかね?
g++だとエラーになるんですが。
>>263 gccのバージョンとコンパイルオプションでけっこう挙動が変わるぞ。
Cについては昔の資産を活用するために、寛容にしていることが多い。
265 :
デフォルトの名無しさん :03/01/25 21:19
return 0 ってなんでゼロなの?いったいどういう意味?return 1 とかreturn 2とかじゃあかへんのですか?
main関数のことなら既出過ぎる品(藁 スレにひとつはある質問だな。
269 :
デフォルトの名無しさん :03/01/25 22:18
もちろんメインのリターン零だ どういうこと?
271 :
デフォルトの名無しさん :03/01/25 22:57
randで65536こ乱数作りたいんだけどどうすんですか
(int)(rand()*65536) ・・・かな
rand() % 65536; ???????????????
274 :
デフォルトの名無しさん :03/01/25 23:03
int i , arr[65536]; for(i = 0;i < arr;i++) arr[i] = rand();
275 :
デフォルトの名無しさん :03/01/25 23:03
それだと32767?までしかでないんすけどどうでしょうか 無知なおいらを助けてくだせい
それって・・・・・・どれ??
Cのrandは整数を返すのか・・・
>>269 シェルで && とか || とかで使う
バッチなら if errorlevel とか
コンパイラが16ビットなのかな。 受け取り元をunsignedにしてみたら?
280 :
デフォルトの名無しさん :03/01/25 23:06
>>265 return EXIT_SUCCESS か return EXIT_FAILURE にしたら?
(#include <stdlib.h>で)
unsignedにしてもどうも・・・ まあ頑張ります みなさんありがとうございました
rand は,周期 2 の 32 乗の乗法合同法を用いて乱数を発生し, 呼び出されるたびに 0〜RAND_MAX の間の疑似乱数を返します。 Borland Turbo C
RAND_MAXが0x7fffなんでしょ。
R = 256*r1 + r2;
>285 ありがとうございます
>>271 の質問だと
>>274 の回答が適切な気がする。
for(i=0;i<sizeof(arr);i++)
だけどな。
int i , arr[65536]; //unsigned?,long? for(i=0;i<sizeof(arr);i++) arr[i] = rand()%65536;
290 :
デフォルトの名無しさん :03/01/26 13:41
ワイルドカードってなんですか? PC初心者板逝けとか言われるかもしれませんが 厨房でごめんなさい
*
?
297 :
デフォルトの名無しさん :03/01/26 17:24
配列に値をいれようとすると access violation とかいうエラーメッセージが出てしまうのですが、 どうしてなんでしょう?
298 :
デフォルトの名無しさん :03/01/26 17:26
>>297 int a[100];
a[150] = 38;
299 :
デフォルトの名無しさん :03/01/26 17:41
>>298 指定領域以内のところでダメになるので、
他が原因だと思うのですがわかりません。
それに値を参照するときにエラーが出ることもありますし。
一体どういうこと?
300 :
デフォルトの名無しさん :03/01/26 17:42
>>299 ソースを出すように。情報が少なすぎてよくわからん。
301 :
デフォルトの名無しさん :03/01/26 18:32
>>300 unsigned char *m = new unsigned char[4500*4000];
for(j=0; j<ySize; j++){
for(i=0; i<xSize; i++){
k = j*(xSize_c)+i;
m[k] = t[j][i];
}
}
という感じですが。
何が原因でしょうか?
>>301 1. new は成功しているのか?
つーか C++ かよ!! ここは C のスレだぞ。
2. xSize, ySize, t の正体は?
xSize_c もナー
305 :
デフォルト名無しさん :03/01/26 20:35
306 :
デフォルトの名無しさん :03/01/26 21:11
stdio.h などのヘッダーファイルってどうやってみれるか教えれ
307 :
デフォルトの名無しさん :03/01/26 21:13
308 :
デフォルトの名無しさん :03/01/26 21:16
>>307 エディタってなんすか?
初心者でスマソ
メモ帳でみれ
type stdio.h | more[Enter]
1ページずつ表示するため
>>312 そういう意味じゃなくてさ、more stdio.hでいいでしょ?ということ。
UNIXではたしかにそうだ
315 :
デフォルトの名無しさん :03/01/26 21:36
DOSでも同じでは?
MS-DOS では確かに type stdio.h | more[Enter] か more < stdio.h しかダメだ。 ただし、Windows のコマンドプロンプト (含む 95) では more stdio.h も OK。
どうでもいいけどmoreコマンドだと見にくくない? 個人的にはnotepad激しく推奨
質問者の環境がわからなかったので まあ今頃はエディタが何かを調べてもう見終わってるとは思うけど
ウチは普通に窓だけど UNIXでもcdコマンドとかdirコマンドとか普通にあるの?
UNIXでもcdはおなじ dirはのかわりにlsというのがある
> cdはおなじ 厳密に言うと違うわけだが
BSD厨発見
何で BSD?
図星のようだな
意味わからん。
327 :
デフォルトの名無しさん :03/01/27 07:19
struct point{ double x; double y; }; struct point R[100],*Q; Q = &R[1]; int main() { .... } こんな感じでグローバル変数でポインタを定義したんですけど、gccでコンパイルすると エラーになります。それで次に struct point R[100],*Q; Q = &R[1]; これをmainの中に入れてやると無事コンパイルできます。 なんでですかね?
struct point R[100],*Q; ←変数の宣言 Q = &R[1]; ←実行コード 実行コードは関数(この場合はmain)の中に記述する必要がある。
>>329 Q=&R[1];はどうみても代入処理だろ。
書くならstruct point R[100],*Q=R+1;
>>328 >Q = &R[1];
これがまずかったのか。そういえばそんなルールあったな。
サンクス
>>330 struct point R[100],*Q; ←変数の宣言 // ←これが定義
>>331 >>330 のようにしても、初期化自動変数じゃないと出来ないからね
何か書き間違えた上に変な回答になってるな… 初期化自動変数× 変数を参照する初期化は自動変数○
あれ…出来るね… ポインタは出来るのかな…? まぁ良いや、時間がないから調べられないけど 正しい答えは他の誰かが答えてくれるでしょう
335 :
デフォルトの名無しさん :03/01/27 08:11
外部への変数はどれぐらい確保できるの? int A[1000000000]; とかアリ? あと、関数内の変数で void a(void) { int B[10000000]; //このあとB[n]すべてに値代入。 } とかやったら外部変数の値を潰してたんだけど、そういうものなの?
336 :
デフォルトの名無しさん :03/01/27 08:30
ファイルへのパスを生成するような処理で文字列を使う時、 char *parh = "OMAEMONA"; はポインタ以下の値になにがあるからわからないから危険ですか? char path[32]; strcpy( path,"OMAEMONA"); と、配列をたくさん確保してからにすべきでしょうか。
>>335 配列を確保できるサイズは環境依存。
int A[1000000000]; は・・・64 bit 環境ならいけるかもな。
今主流の 32 bit 環境では多分無理だ。
int B[10000000]; と宣言した場合、ANSI 準拠である限り B[0] 〜 B[9999999]
の領域は他の変数とは絶対にかぶらない。
よって外部変数が潰れる事は無いので、何か別のミスをしているだろう。
339 :
デフォルトの名無しさん :03/01/27 11:03
入力されたデータを整数型かどうか判断するにはどうしたらいいでようか? 以下のプログラムを作ってみたところエラーもでず妙な動作をして終わってしまいます。 int a, b; scanf("%d",&a); scanf("%d",&b); printf("%d\n",a); printf("%d\n",b);
340 :
デフォルトの名無しさん :03/01/27 11:14
すばらしい、ハラショー
もう少し状況を報告しる! ひょっとしたら新しい発見があるかもしれない。
scanf() で数字以外を入力したら無限ループにはまると思うが・・・
>342 そーですか? %sでふつーに文字列とか入れちゃってますが、、、
344 :
デフォルトの名無しさん :03/01/27 12:57
C言語で24bitのビットマップのファイルを読み込み、そのまま保存するってどうしたらいいの? バイナリモードで開いて、ヘッダとデータ部分を切り離してそれぞれ配列に保存して、それをfwriteで書き込み専用のファイルに書くってだけだと思うんだけど… 具体的なソースを示してくれたら嬉しいです。
そのまま、だったら 何の加工もせずに読み込んで書き出したら良いだけでは?
>>344 データ部分だけ欲しいのかな
でも、ヘッダがないと、タテヨコのサイズもわからなくなるし、、、
>>339 scanfの戻り値(a,bに代入される値じゃないよ)は
「変換された項目の数」だから0なら数値が入らなかったということ。
123Aとか入れたら123が変換される。
348 :
デフォルトの名無しさん :03/01/27 13:20
CUIのアプリケーションを書いているのですが、 プロセスに入力を与える際、 入力した文字がすぐにプロセスに渡るようにするにはどうしたらいいでしょうか? つまり、 普通のreadなどを使う際には、 入力時に「hogehoge<LF>」と、最後に改行の入力を必要としますが、 改行を押さずに、hogehogeが h o g e h o g e と、一文字ずつ即時にプロセスに渡るようにしたいのです。 ご存知の方がいらっしゃったら教えてください。 (「{Cで and/or CUIで}やるかぎり出来ない」ならスレ違いごめんなさい)
と、書き込んで思ったのですが、これはプログラム側の問題ではなく、 むしろ入力サイド(シェル?)の問題なのでしょうか。
>>348 //Cは最近さわってないんで、わすれてきてるが
getch getche getcharなどの関数で、一文字づつ処理してもNG?
351 :
デフォルトの名無しさん :03/01/27 13:33
>>345 うーん、そうなんですが…
例えば300×300の大きさのビットマップを、その大きさのままCで読み込もうとする時、なぜか途中で強制終了してしまいます。
ヘッダ部分のデータの大きさも考慮して大きめに600×600で読み込むと、確かにビットマップは読み込まれるのですが、格納した配列のデータを違うビットマップの画像に保存した際、画像に縦線や横線などの雑音が入っているのです。
該当部のソースを晒せ、読み込んだデータを加工せずに出力してそないな事になるかいな
353 :
デフォルトの名無しさん :03/01/27 13:42
>>350 さん
ありがとうございます。curse関連ですね。調べてみます。
取り急ぎお礼のレスだけしておきます。
>>353 つーか、画像処理板でするか、こっちでするか、どっちかにしろよ、、、
マルチで書かれてもな。
>>350 さん
うーん。
DOSだと手軽にその関数が使えるようですが、UNIXだと面倒なようです。
curse端末がどうのこうの、、、(調査中)
359 :
デフォルトの名無しさん :03/01/27 14:31
0x34 #hoge 0x38 #piyo 0x39 #gabi 0x32 #poyo 0x35 #boyo 上記テキストファイルを読みこみ 下記の処理を行いマスタ while(!feof(ifp)){ s=getc(ifp); if(s=='#'){ putc('\n',ofp); while(!feof(ifp)){ s=getc(ifp); if(s=='\n') break; } } else { putc(s,ofp); } } putc('\n',ofp); そうすると書きこまれたファイルは最終行が \377となってしまいます・・・ 原因がよくわからないっす。 どなたかご教授お願い致します。
調べたところでは、
curse・ioctl・stty
という3つの方法があるようです。
とりあえず、目的の処理はcurse+getchで可能でした。ありがとうございます。
が、思わぬ副作用が出ているので、時間があればioctlの方を調べて試してみます(敷居が高いが。。。)
sttyは最終手段のように紹介されていたのですが、
>>358 さんの書かれたようにやってみたら、プログラムから何の反応もなくなり、
Ctrl-Cすら受け付けなくなってしまってビクーリしたので、ちょっと保留です。
まあ、ちゃんと(?)使うときはプログラムの中で、 入力前に system("stty raw"); 入力が終ったら system("stty -raw");
termsioとか使えない?
>>360 副作用というのが、どんなものかなという好奇心が・・・
#MSのOSしか今、手持ちになくて試せない
>>359 sがchar型で宣言されている。かな?
\377は0xFFという意味
365 :
デフォルトの名無しさん :03/01/27 15:38
>364サソ ご回答ありがdございます。 sはちゃんとint型で宣言しているのですが・・・ なんででしょぅ・・・
01:while(!feof(ifp)){ 02: s=getc(ifp); 03: if(s=='#'){ 04: putc('\n',ofp); 05: while(!feof(ifp)){ 06: s=getc(ifp); 07: if(s=='\n') break; 08: } 09: } 10: else { 11: putc(s,ofp); 12: } 13:} 14:putc('\n',ofp); 02行目でEOF(-1)が発生した場合に12行目の処理を行っているから -1(\377)が出力される こういう場合、01行目は while((s = getc(ifp)) != EOF) { と書くのが定石
>>361 さん
ちゃんと(?
system("stty raw");
(入力を受け取る処理)
system("stty -raw");
としたんですが、
そうしても、一文字ずつの読み込みをしてくれませんでした。
というか反応なしで、ただただ入力がエコーされるのみ。。。
前述のように、Ctrl-Cも受け付けてくれなかったので、仕方なくターミナルをDestroyしました。
>>363 さん
いや、好奇心を持つほど大したことじゃありません。
対話的な動作を期待するプログラムを書いていたので、
それまでprintfで書いていた部分を書き直すのが大変だなぁと思った。
というだけです(^^;
また、initscr()の時点で、端末がclearされてしまいますよね。
368 :
デフォルトの名無しさん :03/01/27 16:03
>366サソ ほんとありがdございます! すげぇっす。イパーツで解析なさるなんて。 うらやますぃ。。。 精進イタシマス
369 :
◆Ou1AsATmFg :03/01/27 17:26
つぎのようなプログラムで,変数を配列にして一気に処理するようにするにはどうすればいいのでしょう?ご教授願います. #include <stdio.h> void hogera(int *x, int *y, int *z) { *x=1000; *y=2000; *z=3000; } main() { int a, b, c; hogera(&a, &b, &c); printf("%d %d %d\n",a, b, c); return(0); }
一気に何をしたいのかが分からんのですよ
>>369 int ia[]={*x,*y,*z};をhogeraに。
アドレスをそのまま入れたかったらint *ia[]={x,y,x};
{x,y,x}じゃなくて{x,y,z}
多くのアルゴリズムの本がある中 「よくわかるアルゴリズム入門」 の逆順の線形リストと入力順の線形リスト を習得しました。 今度は、まったく違った構造体に 組み込めなくちゃいけない。 typedef struct{ int no; char name[20]; }Data; typedef struct __node{ Data data; struct __node *next; }Node; typedef struct{ Node *head; Node *crnt; }List;
void Buff_Node(List *list) { Node *ptr=list->head; Data temp; while(scanf("%d %s",temp.no,temp.name)!=EOF){ InsertFront(list,temp); list->head->next=ptr; ptr=list->head; } } 逆順のリストは、できたが入力順のリストはわからない。 適当な、Buff_Node()入力順をを教えてほしい。
376 :
デフォルトの名無しさん :03/01/27 18:57
初心者君ですみませんが、 int型をファイルにバイナリで書きこむ 方法ってありますか??
fopen(〜,"wb");で、出来たかな?
あります
379 :
デフォルトの名無しさん :03/01/27 18:59
習得したんなら後はそれを応用すりゃあ良いだろうに・・
381 :
デフォルトの名無しさん :03/01/27 19:01
382 :
デフォルトの名無しさん :03/01/27 19:04
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩ アアア・・・
_/し' //. V`Д´)/
(_フ彡 / ←
>>381
384 :
デフォルトの名無しさん :03/01/27 20:31
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩ アアア・・・
_/し' //. V`Д´)/
(_フ彡 / ←
>>383
>>383 man putw
NAME
`putw'--write a word (int)
SYNOPSIS
#include <stdio.h>
int putw(int W, FILE *FP);
...
どうやって使うんでしょうか?
386 :
デフォルトの名無しさん :03/01/27 20:39
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩ アアア・・・
_/し' //. V`Д´)/
(_フ彡 / ←
>>385 >>385 書いてあるだろ
みなさんご回答ありがdございます。 バイナリで書きこんで、そのファイル開くと 読めなくなってるものですよね?? fopen( ,"wb")で開いても ファイル開くと見た目普通っす。。。 どうなってんだこりゃー。 どなたか詳しくお教えください。。。 おながいしま・・・す
>>387 "wb"で開いても、fprintf("%d", ...) なんかで書き込んだら一緒だろ。
fwrite()でも使え。putw()は標準にはないらしいし。
putw()なんて関数初めて知りますた。勉強になりますね…
>>391 ふしあなさんですか?
「説明」の末尾にきっかり書いてある。
393 :
デフォルトの名無しさん :03/01/27 22:09
C言語でもWINDOWS上で起動するプログラム作れますか?
394 :
デフォルトの名無しさん :03/01/27 22:18
>393 もちろん
396 :
デフォルトの名無しさん :03/01/27 22:40
>>390 つまり、linux.or.jpのJMに従え。JMは神!ってことか。
>>396 理由がわかった上で使いたいのであれば、別に止めはしないわけだが。
あつし君はC言語得意なのかな?
1人でCなら得意です。
C sus4 なら
>>396 もちろん翻訳前のman putwにも書いてあるわけだが。
405 :
デフォルトの名無しさん :03/01/28 11:25
文字をsscanfでファイルに書きこむと それはパックされているということで よろしいのでしょうか?
406 :
デフォルトの名無しさん :03/01/28 13:10
どうしても出来ないんで御教授お願いします。 n及びn+2がともに素数になる数の内15000以上の最小の数値の組み合わせ nとn+2を求めるプログラムを作成せよ。って問題なんですが お願いします。
双子素数だな。 まぁ、ガンガレ
宿題スレへ逝け
>>407 双子素数ってなんですか?
どんな感じで関数を定義すればいいのですか?
>>409 まあ普通のスタイルで定義すればいいと思うよ。
ただ、センセーが古いスタイルの関数定義しか知らない化石のような人なら
古いスタイルで定義しないと減点されるかも知れないけど。
・・・叩かれないもんだな。。
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>391
413 :
デフォルトの名無しさん :03/01/28 18:28
>>406 とりあえず自分で考えろ。
で、C言語のレベルで問題がおきたらまた来い。
415 :
デフォルトの名無しさん :03/01/28 21:12
age
416 :
デフォルトの名無しさん :03/01/30 13:50
わからないので是非おしえてくだせぇ。 今ファイル入出力で***,txtファイルから行単位で文字列(char)や数値(int)を読み込みたいんですが どうすればいいのですか?
fgets
fgetでint型で数値よみこめますか?
int型が欲しいのならint型に変換すればよろしいのではなくて?
ファイルにかかれているものに型もなにもない。
421 :
デフォルトの名無しさん :03/01/30 14:07
freadならsite_t
422 :
デフォルトの名無しさん :03/01/30 14:07
まちがえた、size_t
int buf; fgets((char *)buf,255,*fp); みたいでいいですか?
(o ̄∇ ̄)=◯)`ν゜)・;' ←416
>>423 読み込むファイルがテキストファイルなら
char buf[256];
fgets(buf,255,*fp);
で、bufからsscanf()やatoiでintに変換する
>>423 >>425 *fpじゃなくてfpでしょ。
FILE **fp;と宣言しているならいいけど・・・
char buf[256]; int buf2 fgets(buf,256,fp) sscanf(buf,%d,buf2); でいい?
どうして sizeof(buf) と書かない・・・?
>>426 コピペ(イイワケ)
>読み込んだ文字数が n -1 になるかのいずれかに最初に遭遇するまで
>続きます。結果は string に格納され、NULL 文字 ('\0') が付加されます。
どちらも同じ数値でよかったのか、NULL文字追加しか覚えてなかったから、、、
まぁ、文字列関係の関数はくせで+1してしまうけど
>sscanf(buf,%d,buf2); sscanf(buf, "%d", buf2); だな、
ちがった sscanf(buf, "%d", &buf2);
みなさんありがとございます!こんなぶっきらぼうな僕におしえてくれて・・・ じゃーやってみます!
やってみたんですがメモリのエラーがでてしまって、パソコンが悪いのかプログラムが悪いのかわからないので 下のプログラムまちがってるばしょあるでしょうか? #include <stdio.h> #include <stdlib.h> void main(void) { intbuf; char*buf2; char*a; FILE*fp; fp=fopen("input.txt","r"); a=fgets(buf2,256,fp); sscanf(buf2,"%d",&buf); printf("%d",buf); fclose(fp); } あとこのCファイルと同じ場所にinput.txtファイルおいてます
わざとやってるんじゃないかという悪寒
char buf2[256] でいいのかな?うごきまちた
437 :
デフォルトの名無しさん :03/01/30 15:33
#define TITLE_LEN 12 void PRT(char *ttl, int len, unchar *adr) { int i; char msgA[TITLE_LEN + 1]; char msgB[] = " = "; if (strlen(ttl) > TITLE_LEN){ printf("ttl(%s) length over\n"); return; } memset(msgA, ' ', sizeof(msgA)-1); msgA[sizeof(msgA)-1] = NULL; memcpy(msgA, ttl, strlen(ttl)); for (i=0; i<len; i++){ if(i%16 == 0){ if(i == 0){ printf("%s%s", msgA, msgB); }else{ printf("\n "); } } if (i%16 == 8) printf(" "); printf("%02X ", *(adr+i)); } printf("\n"); fflush(stdout); return; }
>>437 ってどんな処理してるか
ご説明きぼーんぬ
>>437 > printf("ttl(%s) length over\n");
これはいかんだろ。引数が足りない。
> msgA[sizeof(msgA)-1] = NULL;
型が合わない。
> memcpy(msgA, ttl, strlen(ttl));
わざわざこんなことするなんて、null文字をつけたくないからなのかしら・・・
charbuf[256]; FILE*fp; intsuuzi; char*mozi; char *a a=fgets(buf,256,fp); sscanf(buf,"%s %d",mozi,&suuzi); 上でまちがってるとこありますか?最後の行を書くとメモリエラーとでちゃうのですが
またか わざとやってるんじゃないかという確信
いやまったくわざとじゃなく、本気なんですが・・・
ってかageんなよ
444 :
デフォルトの名無しさん :03/01/30 18:57
intsuuzi; って、わざと?
int suuzi; のことです、コピペしたもので。
#include <stdio.h> main() { printf("入力してください。\n"); int a; scanf("%d",&a); } int a;のところでコンパイルエラーが出るんですが、なぜですか? でもprintfのある行より前にint a;と書くとうまくいくのですが。
mozi にバッファのアドレス入れれ。
434と同じ間違いをしていてはなぁ
やっぱいれないとだめなんですね。どもです
450 :
デフォルトの名無しさん :03/01/30 19:23
>446 変数宣言は先頭でやるのが基本だから
そうなんですか。 なるべく先頭で宣言するようにします。
>>446 Cの仕様だろ。C++ なら通るんじゃない?
>>452 実装があるかどうかしらんが、C99では可能。
>>451 なるべくってあんた・・・
変数が通用する領域に習って、"{"のすぐあとに宣言すれば間違いない
455 :
デフォルトの名無しさん :03/01/31 00:35
初心者ですがお邪魔いたします。 構造体の中身を表示したのですが printf("NO.1 = %s\n", kouzoutai.no1); printf("NO.2 = %s\n", kouzoutai.no2); というように、力技で押し切るしかないのでしょうか? 構造体の中身が100くらいあって困ってます。 ご教授いただけると幸いです。
456 :
デフォルトの名無しさん :03/01/31 00:42
C言語勉強したいんだけどおすすめのフリーのソフトとかありますか?
>>455 それしか方法はない。
もし構造体の要素が同じ型なのであれば、配列にすると多少マシになる。
for(i = 0; i < 2; i++)
printf(("NO.%d = %s\n", i + 1, kouzoutai.no[i]);
>>456 それだけでは何を欲しがっているのかわからん。
>>456 gcc環境が入ったFreeBSDとかLinuxとかがフリーで入手できます。
gcc環境を入れることのできるSolarisもメディア代+手数料で入手できます。
>>459 ソラリスのフリー版の配布は終わったんじゃなかったっけ?
461 :
デフォルトの名無しさん :03/01/31 01:14
>>459 これから勉強を始めようという人に、独自拡張の最右翼を奨めるその心は?
>>455 そう言う作業が定期的に何度も発生するなら
ソースを自動生成するスクリプトを書いてしまうのが吉かと。
若しくは自分でパースするのでもいいと思うけど。
>>464 知らずに使うこともあるだろう。
コンパイルが通るからというだけの根拠で、規格外のコードは書いたことは
無いか?
>>466 規格外の関数ならいくらでも使ったことあるけど、それ以外はない。
gccなら-Wall -ansiつけておけば平気じゃない?
-pedanticもよろしく(ワラ
>>466 gccがいやなら、SolarisならSunの、
Linux(FreeBSDでも!)Intelのコンパイラが使えるよ。
ま、gcc -ansi -pedantic で大体チェックできるわけだが。
一方、bcc32やVC++なんかの方が、よっぽど変な動作があることあること。
これから勉強を始めようという人に、自分でオプションをいじれと? BCC や VC++ なら、C++ はともかく C では案外しっかりしているぞ。
>>466 C使い始めのときint a[i]とやったことがあった
後//とinline使ってたけど次からは使えるみたいだし
まあいいかなと
474 :
デフォルトの名無しさん :03/01/31 01:52
C99ってgccに合わせてやったということらしいけど、本当なの?
拡張機能と言えば、 VC++で拡張機能をオフにするとWindowsヘッダーがコンパイルできなくなるのはかなり痛い。
>437 うう、すげぇ無駄な処理の塊・・・ 仕事なら塵箱行きだ。
>>457 ,
>>465 サソ
ありがとうございます
ところで
ソースを自動生成するスクリプト
↑こんなことができるのでせうか?
またそれはどのように実現するもの
なのでしょうか?
そしてパースとは??
ほんと厨質ばかりでご迷惑お掛け致しますが
ご教授お願い致します。
>>479 google さんに聞いて見れ
ここだけが情報源というわけじゃなかろ
>>478 やってみよう。ちょっと待ってケロ。
>>479 エディタのキーボードマクロでも(半)自動生成できるよ。
「パース」とはこの場合、ソースコード解析のことだね。
一部意図的に誤解してみた。 #define TITLE_LEN 12 #define TITLE_FORM "%-12s" #define MsgB " = " void PRT(char *ttl, int len, unchar *adr) { int i; if (strlen(ttl) > TITLE_LEN){ printf("ttl(%s) length over\n", ttl); return; } printf(TITLE_FORM MsgB, ttl); for (i=0; i<len; i++){ if(i % 16 == 0){ putchar('\n'); } if (i % 8 == 0) { putchar(' '); } printf("%02X ", *(adr+i)); } putchar('\n'); fflush(stdout); return; }
行数オーバーしたようなので連続スマソ。 ・最初の一回だけの処理はループの外へ。 ・文字列の加工はsprintf()を使うべし。 ・(環境にも拠るけど)putchar()で済むことはprintf()しない。 課題 ・タイトル文字列の制限は余り意味がなさそうだ。 ・先頭からのオフセットを左端に表示したら判りやすいだろう。 ・適当なファイル入力ルーチンを組み合わせればダンプツールになるね。
>>484 >・(環境にも拠るけど)putchar()で済むことはprintf()しない。
積極的にspriintfの使用を推奨しているのに、
printfを使わせない理由がよくわからん…
スタティックリンクする処理系だとprintf族を使わないのは
意味があったりするもんだが、sprintfを使わせるんだから
それも意味をなさないような。
つか、putcharで済ますってことは、
printf("%s", s);
を
for (*p = s; *p; p++)
putchar(*p);
ってやれってことか…。よーわからん課題だな。
>for (*p = s; ((((;゚Д゚)))ガクガクブルブル
488 :
デフォルトの名無しさん :03/02/01 23:34
C初心者ですがよろしくおねがいします。 画面にhogeを表示するとき、ソースはこう書くじゃないですか。 #include <stdio.h> int main(void) { printf("hoge"); return 0; } でも、このソースでもまったく同じ効果なのですが、どう違うのでしょうか? #include <stdio.h> int main(void) { printf("hoge"); } これは、戻り値がないってことですよね? main()には戻り値は返さなくていいということですか? それとも、1番目のソースと2番目のソースじゃ表示は同じだけど 内部の動きは違うということですか? よろしくお願いします。
>>488 Warning
出ない?
大して大袈裟な事ではないと思うが。
>>488 最近の規格では、mainに限ってはreturnが無い場合、0を返すと見なす。
>>490 ありがとうございました。
なるほど、そういうことだったんですね。
それはmain関数だけでそれ以外の関数はちゃんと戻り値を
返すようなのですね。これでなぞが解けました。
また勉強を続けたいと思います。
>>489 BCCでコンパイルしてますが、エラーは出ませんでした。
492 :
デフォルトの名無しさん :03/02/01 23:50
>>490 >最近の規格
ISO/IEC14882
こんくらい空で言えろ
>>492 そんな事言えんの規格マニアだけでしょう
>>492 ハァ?
これスレでは
ISO/IEC 9899:1999
だろ。
>>488 それもそうだけど、改行しておかないでいいの?
>>495 いや、いつもは改行してますよ。
ただ、2chにソース貼るには、少しでもシンプルにしたほうが
いいかな、と思って\nをつけなかっただけです。
windowを表示させるだけのcソースを教えてけれ。
#include <stdio.h> int main(void){printf("window");return 0;}
うむむ。何かが違うがありがとう。
500 :
デフォルトの名無しさん :03/02/02 11:29
C++の方がもっと色々できるのに、どうして「C」に拘るの?
fjだと改行しないと表示されない処理系があるとか言ってくる馬鹿がいたもんだが 2chは平和だな…
502 :
デフォルトの名無しさん :03/02/02 11:29
C++コンパイラがないから。
503 :
デフォルトの名無しさん :03/02/02 11:31
>>501 それってラインバッファのせい?
ストリームを閉じたりバッファがいっぱいになれば表示されるけど。
>>503 有料のものも含めて、俺の環境用のものはない。
506 :
デフォルトの名無しさん :03/02/02 12:00
Cで時間はかる関数教えてください! できたらミリ秒まで計れるほうがいいのですが。
507 :
デフォルトの名無しさん :03/02/02 12:01
timeGetTime() これはC言語でつかえます?
使えるかどうかはやってみればわかる。 ただし、移植性がないことは確か。
511 :
デフォルトの名無しさん :03/02/02 12:29
>>508 ミリ秒まで知りたければ1000で割って工夫をすれば十分。
一度CLOCKS_PER_SECで割ったものをさらに1000で割るのかよ・・・
513 :
デフォルトの名無しさん :03/02/02 12:34
馬鹿だな。 CLOCKS_PER_SECで割らないんだよ。 例えば、 int a,b; clock_t start,end; start=clock(); ・・・何かの処理・・・ end=clock(); a=(end-start)/1000; b=(end-start)-a*1000 とすれば、aはカンマ以上の秒を表して、bはカンマ以下の秒を表す。
ああ。カンマだよ。ピリオドじゃねーぞ。 将軍様がカンマと言ったらカンマだ。
CLOCKS_PER_SECって俺の環境じゃ1000000になってる。
ピリオドのことか・・・ なんで(end-start)/1000が整数部になるわけ? clockが返す値の単位(?)は決まっていないよ。
>>517 とりあえずやってみれ。
俺の環境はVC++6.0だけれども。
やってみた。 Linux+gccとWindows+VC++6.0で全然結果が違うんだが・・・・
そうでしたか・・・。 Linux+gccではどうでした? 俺はLinux持ってないもので。
なら、CLOCKS_PER_SEC で割ってみるとか
>>520 Linuxの方が正しい結果だったよ(^_^;)
↓プログラムはこれでいいんでしょ?
#include <stdio.h>
#include <time.h>
int main()
{
int a,b,i=70000000;
clock_t start,end;
start=clock();
while(i--) ;
end=clock();
a=(end-start)/1000;
b=(end-start)-a*1000;
printf("%d.%dミリ秒\n",a,b);
return 0;
}
ちなみにCLOCKS_PER_SECの値はVC++が1000で、Linuxが1000000
524 :
デフォルトの名無しさん :03/02/02 13:02
>>521 そうすると少数以下の秒が表されないのよ、、、少なくともVC++6.0だと。
>>522 いや・・・何が正しかったのか???
>>524 0.5秒なら500ミリ秒でしょ?
Linuxでの結果はだいたいそれくらいだった。
でもWinだと1ミリ秒にもならなかった。
ああ、すまん。 printf("%d.%dミリ秒\n",a,b);じゃなくてprintf("%d.%d秒\n",a,b);か。 それならWinの方がただしい。 じゃあ1000で割らずにCLOCKS_PER_SECで割ればいいか。
527 :
デフォルトの名無しさん :03/02/02 13:10
すまんかった。。。 cout << CLOCKS_PER_SEC << end; で試した。 VC++6.0なら、定数CLOCKS_PER_SECは1000。 すまんかった。。。
528 :
デフォルトの名無しさん :03/02/02 13:43
ポインタ『adr』のなかに文字列 1.春夏秋冬 2.東西南北 3.温故知新 という文字列が含まれているとき、 『西』という言葉を入れたら 2.東西南北 と出てくるような文字列検索プログラムはどのようになるのでしょうか…? 熟練のかたがた、よろしければご教授ください
529 :
デフォルトの名無しさん :03/02/02 13:45
>>528 adrの中にどう含まれているんだ?
char *adr="1.春夏秋冬\n2.東西南北\n3.温故知新";か?
530 :
デフォルトの名無しさん :03/02/02 13:47
char str[3]; fgets(str,sizeof str,stdin); if(!strcmp(str,"西")) puts("2.東西南北");
531 :
デフォルトの名無しさん :03/02/02 13:48
>>529 そうです
1行目2行目とかの検索だったらできるのですが、
特定の文字列の検索の方法がわからなくて…
532 :
デフォルトの名無しさん :03/02/02 13:49
>>531 先ずは英語版をつくって、納得がいってから日本語版を作ることをお勧めします。
534 :
デフォルトの名無しさん :03/02/02 20:12
++のスレッドから誘導されてきました。 charの列へのポインタの指す文字列をcharの配列へ 列全体をコピーする関数にはどんなのがあるでしょうか? char dist[32]; char *src; strcpy(dist,src);//文字列のコピー。 ってのはありでしょうか 御教授お願いします
>>534 それでいいんじゃない?
但し、dist のサイズに気をつけてな。
>>535-536 様
早速、strdupについて調べてきました。勉強になります。
本当に有り難う御座いました!
>>537 =534
free()するのを忘れないようにね。
539 :
デフォルトの名無しさん :03/02/02 21:10
質問します。 char 型二次元配列( char abc[10][32];)を memset で初期化する場合、 memset( abc , '\0' , sizeof(abc)); でいいのでしょうか?
>>539 全部0で埋めなければいけない積極的理由があるならいいんじゃない?
C言語を極めるってことはどういうことだと思いますか?
すいません。ageます。
>>540 ありがとうございます。
もう一つ質問なのですが、このような二次元配列を宣言した場合、
メモリ上の連続した領域が確保されるという保証はあるのでしょうか?
>539 の例の場合だと、abc の320バイトはつながった領域をとってくれるのですか?
abc[0] の最終バイト目の次が abc[1]の先頭バイト目に必ずなりますか?
543 :
デフォルトの名無しさん :03/02/02 22:49
544 :
デフォルトの名無しさん :03/02/02 23:07
(CLOCKS_PER_SEC/1000.0) で割れば。
>>541 Cで現実的に実現可能かどうか瞬時に分かる。とか。
547 :
デフォルトの名無しさん :03/02/02 23:10
コンパイル中... yakyu.c D:\tomoki\C言語\project1\yakyu.c(93) : error C2018: 文字 '0x81' は認識できません。 D:\tomoki\C言語\project1\yakyu.c(93) : error C2018: 文字 '0x40' は認識できません。 D:\tomoki\C言語\project1\yakyu.c(93) : error C2018: 文字 '0x81' は認識できません。 D:\tomoki\C言語\project1\yakyu.c(93) : error C2018: 文字 '0x40' は認識できません。 D:\tomoki\C言語\project1\yakyu.c(93) : error C2018: 文字 '0x81' は認識できません。 D:\tomoki\C言語\project1\yakyu.c(93) : error C2018: 文字 '0x40' は認識できません。 D:\tomoki\C言語\project1\yakyu.c(93) : error C2018: 文字 '0x81' は認識できません。 D:\tomoki\C言語\project1\yakyu.c(93) : error C2018: 文字 '0x40' は認識できません。 D:\tomoki\C言語\project1\yakyu.c(107) : fatal error C1004: 予期せぬ EOF が検出されました。 cl.exe の実行エラー yakyu.exe - エラー 9、警告 0 何度も確認しましたが間違いはないはずなのこうなってしまいます。どうすればいいですか?
>>547 日本語か何かの文字コード変じゃないか?
>>547 0x8140は、ShiftJISで空白文字ですね。
インデントに2バイト空白使ってませんか?
#もしエディタにそういう設定があるなら、2バイト空白と1バイト空白の見た目を変えておこう。
>>541 世界中のCコンパイラーを全てインストールしているパソコンを持ち歩いている。
釣れた(w
554 :
デフォルトの名無しさん :03/02/02 23:17
>>547 exe名が駄目なんだと思うよ。yakyu.exeじゃあね。
コンパイルする前に、 全角スペースを半角スペースに置換。
>>553 釣られ上等。
1%でもマジの可能性があれば、喜んで釣られるよ。
558 :
デフォルトの名無しさん :03/02/02 23:23
ありがとうございました、なんとかなりそうです なんか名前がばれちゃいましたw
error C1004: 予期せぬ EOF が検出されました。 cl.exe の実行エラー ってなんですか?
560 :
デフォルトの名無しさん :03/02/02 23:33
レスつかないようなのでもっかいききます。 error C1004: 予期せぬ EOF が検出されました。 cl.exe の実行エラー ってなんですか?
561 :
デフォルトの名無しさん :03/02/02 23:40
とりあえずもいっかいききます error C1004: 予期せぬ EOF が検出されました。 cl.exe の実行エラー ってなんですか?
なんでそんな何回も書きこむんだ? error C1004: 予期せぬ EOF が検出されました。 cl.exe の実行エラー ってなんですか?
563 :
デフォルトの名無しさん :03/02/03 00:04
timeGetTime関数ってCでつかえます? 以下のプログラムでまわしたんですがエラーがでてしまいました。 以下のプログラムは某ホームページから引用させてもらいました。 time関数とtimegettime関数の比較をおこなってます include <stdio.h> #include <time.h> // for clock() #include <windows.h> // これと下のヘッダーはマルチメディアタイマーに必要です #include <mmsystem.h> // winmm.lib をリンクするのを忘れずに int main(int argc, char* argv[]) { int i; clock_t oldTime, newTime; oldTime = clock(); for (i = 0; i < 10; i++) { while (oldTime == (newTime = clock())) ; printf("clock [sec] = %.3f \n", (float)oldTime / (float)CLOCKS_PER_SEC); oldTime = newTime; } DWORD oTime, nTime; oTime = timeGetTime(); for (i = 0; i < 10; i++) { while (oTime == (nTime = timeGetTime())) ; printf("timeGetTime [ms] = %d \n", oTime); oTime = nTime; } return 0; }
>>563 エラーの内容を書かないような奴には教えない。
すいません。エラーは error C2275: 'DWORD' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。 c:\program files\microsoft visual studio\vc98\include\windef.h(141) : 'DWORD' の宣言を確認してください。 error C2146: 構文エラー : ';' が、識別子 'oTime' の前に必要です。 error C2065: 'oTime' : 定義されていない識別子です。 error C2065: 'nTime' : 定義されていない識別子です。 です。
>>565 コンパイラとOSを書かないような奴には教えない。
>>566 メッセージみりゃ、コンパイラとOSくらい察しはつくが。
win2000でvc です
コンパイラとOSを書けないような奴には教えない。
570 :
デフォルトの名無しさん :03/02/03 00:26
CPUのリソースを無駄に食わないよう する手法にsleep関数使うことやスレッド優先度を下げるという のがあるそうですが、スレッド優先度を下げるとはどうやるんですか? 具体的にサンプルソース提示して教えてたも〜
>>570 O S は ?
あなたが使ってる環境なんて、知りませんから。
572 :
デフォルトの名無しさん :03/02/03 00:39
>>571 SUPER-UNIXです
教えてたも〜
>>572 nice だの renice だのというコマンドで優先度は上下可能かなあ
スレッドごとのは、使ってるスレッドライブラリによると思う でも、下手な小細工するよりも、CPUバウンドな処理と IOバウンドな処理に分けてしまったほうがいいかもしれんよ。
>>574 どもです。
c++ではとおったんですが、Cではとおらなくて・・・
timegettime関数がCでは無理なのか、それとも違うところで引っかかってるのかわからなくて、
よければ助言ねがいます
577 :
デフォルトの名無しさん :03/02/03 00:54
もうすぐC言語検定があるんですが、3級受けたことある人いらっしゃいますか? 申し込みはしたんですが、どういう問題が出るのかさっぱりわからないので不安です。
>>577 C言語の歴史が高頻度で出題されるとあった
くだらね・・・
役にたたないのか・・・鬱 4300円出したのに・・・ しかも合格できなそうなのが怖い
資格って、履歴書の空欄を埋めるためとか、 会社の技能手当てという役にはたつんじゃない? 実戦の知識とかは、また別の話だし。
582 :
デフォルトの名無しさん :03/02/03 01:20
とりあえず明日本屋いって対策テキスト探します。 通販できるサイトはあるけど試験が5日後だから間に合わなし とりあえずC言語の歴史でもサイトで勉強しようw
584 :
デフォルトの名無しさん :03/02/03 01:24
>>583 何で受けようと思ったの?
落ちそうなら尚更…
585 :
デフォルトの名無しさん :03/02/03 01:31
int *a, *b; と int *a; int *b; って同じですか?
>>584 今大学2年で、情報学科でCを少し勉強してきたからそろそろとっとこうかな、と。
つーか、試験受けることにしたら勉強するようにならないかな?っていうダメダメな理由だったりする。
丁度春休み入って堕落する時期だし
>>586 必要になれば、嫌でも習得しようと努力する
さして、必要と思ってない時期にやってもまるで身につかない
とういか、理工系で暇な今な時期に遊ばないでどうする・・・
遊べ!!
それが現時点での最重要項目だ・・・
>>576 timeGetTime() は C で使える。
むしろ、Win32 API は C から使うために設計されたようなものだ。
エラーの原因は、宣言 DWORD oTime, nTime; がブロックの途中に現れる
という事だ。
C では変数宣言をブロックの先頭で行わなければならないという原則を
忘れたのか?
それと、エラーの報告では行番号を省くな。
もしくは、どこがエラーになったのかちゃんと示せ。
あと、#include <mmsystem.h> はいらないんじゃないかという気がする。
VC++ なら、#pragma comment(lib , "winmm.lib") を入れておくと、自分で
リンク時のライブラリを指定する必要がなくなる。
>>588 ありがとうございます!!
そしてご指摘ありがとうございます。
今後きおつけます。
>今後きおつけます。 気を付けてくれ
592 :
デフォルトの名無しさん :03/02/03 10:02
はぁー、c言語の宿題がわかりません。 だれか助けてくれませんか? 今日の4時までなんですが・・・もうだめぽ
もう過ぎているから大丈夫 気にするな
>>585 同じです。
以下は別物です。
(1)
int* a,b;
(2)
int *a,b;
(3)
int *a;
int b;
(1)(2)(3)も、これはこれで同じです。
この点注意が必要です。
#define PINT int* typedef int *pint; PINT a, b; pint c, d;
ヒントでPINT
ワラタ いーなーこの感じ
600 :
デフォルトの名無しさん :03/02/03 14:04
------------------------------------------------------------------------- 実数値の小数点以下2桁目が6、7のときだけ+1する8Bの実数型の関数を作れ。 プロトタイプ宣言は不要。引数は1個とし、引数によって関数の結果を返してはいけない。 ------------------------------------------------------------------------- これ解ける人いますか?;;
宿題スレ逝け プロトタイプ宣言は不要というのは何か意味あるんだろうか
>>601 言うまでもなくちんとマルチポストしてますよ。
double func(double val) { char buf[22]; int ch; sprintf("%20.15f", val); ch = strchr(buf, '.')[2]; if (ch == '6' || ch == '7') { return val + 1.0; } return val; }
>>603 問題文の 2 行目の最後は見えてます?
あと、602 は読んでくれてない?
> 引数によって関数の結果を返してはいけない。 嫁ていないのは誰だろうか
return val;
んじゃ、一時変数に入れればいいじゃん。
600=602=604=607なのかな?(・∀・)ニヤニヤ
>>609 同意。
そしてマルチポスト野郎にまともに答えてくれる香具師はいない罠。
漏れは 600 ではないけど、602=604=607 だよ。 ついでに 「向こう」 の 771。
「引数によって」をどう捉えるかだろうね(問題文作ったヤシが阿呆)
>>601 宿題検収の際に、いちいち確認するのが面倒だからプロトタイプは不要。
という事では?
つ〜か、お前らマルチポストにされたこと分かってて 何レス付けてんだよ。マルチポストした奴と同程度のマナー違反だよ。
int *wall_type,*wall_p_type; をポインタを使わないで記述する方法を教えてください。
ポインタを使わないでポインタを記述することはできません。
他の記述法はないのですか?
何を目的としたコードかも書いてもいないのに、代替案なんか出せると思いますか?( -д-) 、ペッ
>int *wall_type,*wall_p_type; はポインタ変数の定義に見えるんだけど、 ポインタ変数はポインタなんだから他の定義方法はありません。 #これが引き数だって言うんなら*演算子を使わないこともできるけど。
代替案 int a = 123; unsigned long b; b = reinterpret_cast<unsigned long>(&a); std::cout << *reinterpret_cast<int*>(b);
Cじゃないし。鬱。
それの何処がc言語なんだと小一時間……
宿題なら宿題スレにどうぞ。 #って、移動するならきちんと断ってからね。
ポインタの定義をしてその後、 fscanf(fp1,"%*s %d",wall_type)と書かれているんだけど これをポインタじゃない方法で処理ってできますよね? 結局、漏れが何をしたいのかというと ポインタで書かれているトコを他の書き方に変えてそれを FORTRANに書き換えたいんだが・・・C初心者でスマソ(´・ω・`)
コピペミスッってんのか何なのか、断片的過ぎて何とも。 int wall_type; fscanf(fp1,"%d", &wall_type); こうか? ファイルからの入力関数なんで、FORTRANの入力関数に置き換えるんだろー
fscanf(fp1,"%*s %d",fluid); /* number of fluids */ fscanf(fp1,"%*s %d",wall_type); /* type of fluid treated as wall */ fscanf(fp1,"%*s %d",wall_p_type); /* type of fluid treated as wall+pressure */ for(i=0;i<*fluid;i++) いやコピペはミスってないでつ。
凄く濃そう>8B
%*sって使ったことないから知らんかったスマソ、scanf… scanfに渡すのは変数のアドレスなんで、 int *wall_type; fscanf(fp1,"%d", wall_type); これを int wall_type_value; fscanf(fp1,"%d", &wall_type_value); こうで良いのでは、って意味。
っていうか、見る限りそもそもポインタ変数を使う理由のない状況じゃん。 なんでそこでポインタ変数を使っているのか判らないと正解は出ないと思われ。
>>624 C のソースの処理内容を把握して、新規にコードを起こせ。
つーか FORTRAN スレ逝け。
C のコードが何を意味するのかわからないという質問なら、このスレでも
回答はつくかも知れない。
ぉぉぉ!
>>627 タンさんくす!
その書式で書き直せまする?
けどこれ書いた人なんでポインタ使ってんだろ・・・
後からなんか弊害出てきますかねー?
> 627タンさんくす! 間違いにしてもワラタ
では8Bで書き直そうか
wall_type には、fprintf() に入る前に何か代入されてないの? もしそうでなかったらそれはまともなプログラムじゃないよ。
それってぬる(ry
ぽ
ぽ
NULLならいいが、初期化されていない場合、なにが はいっているかわかったもんじゃないので……
>>639 腐ってるスレの URL なんか貼るなよ
やっぱ指摘されちった
642 :
デフォルトの名無しさん :03/02/05 22:02
sub (char *adr1, char *adr2){ int wkint; char wkchar[3]; memset(wkchar,NULL,sizeof(wkchar)); memcpy(wkchar,adr1,2); sscanf(adr1,"%x",&wkint); *adr2 = wkint; } こんな感じのサブルーチンがあります。 このルーチンがどのような処理をしているのか、 また、動作するのか? 以上2点をお教えいただきたいです。 厨房ですいみませんがよろしくお願い致し枡。
たとえ省略可能でも関数の戻り値の型はかけ。int の四文字くらいなんてことないだろ。
> memset(wkchar,NULL,sizeof(wkchar)); memsetの第二引数の型はint。 intにポインタを渡すな
645 :
デフォルトの名無しさん :03/02/05 23:21
てst
646 :
デフォルトの名無しさん :03/02/05 23:28
int *p; int w; p[w]++; ← と 同じ処理をするものはどれかっていう問題で、 選択肢が、 A. ++*( p + w ) B. *( p + w) ++ 何ですが、違いがわかりません。教えてください。
また釣りか
ハァ? この問題出した奴晒せ。 (*(p+w))++;
649 :
デフォルトの名無しさん :03/02/05 23:36
>647 どれが餌ですか?
>646 C言語検定の問題集です。
んじゃ回答集を良く余目。
解答集の解説 配列の内容を参照して加算する。 「++*( p + w)」 は、 @*( p + w )の番地を参照し、 A参照した値に+1をする 演算式である。
653 :
デフォルトの名無しさん :03/02/05 23:56
んじゃAが正解?。
Aが正解でした。
>>646 の問題は自動車免許の学科試験と同じく
注意力を試してるいるんだな(w
正解は (*( p + w ))++ じゃねーの?
>>658 >>659 (゚Д゚)ハァ? 選択肢に無い解答書いといて何が
「正解は…じゃねーの?」だ。おめでてー頭してんなこいつら。
>>660 千と千尋の10頭の豚から両親を捜すと言う問題では「この中にはいない」と言う例外が正解になっていたが。
>>660 例え不適当な選択でも点数さえ稼げればいいのだと強硬に主張する
あさましい
>>660 が居るスレはここですか?
名前欄の番号は無視してくだせぇ アヒャーー ∧∧ (゚∀゚ )⌒ヽ ≡≡ = = - ,.、,,U‐U^(,,⊃_ /i ≡≡≡ = = - ;'゚∀゚ 、、:、.:、:, :,.: ::`゙:.:゙:`''':,'.´ -‐i = ≡≡≡ = = - '、;: ...: ,:. :.、.:',.: .:: _;.;;..; :..‐'゙  ̄  ̄ `" ◎ ''`゙ ◎ ´´ - = ≡ = = -
p[w]++; がp[w]を評価しておらず、効果が副作用だけなんでAでも正解といえば正解なんだが。 正直、引っ掛け問題だよなこれ。悪問だと思う。 x = p[w]++; とかなってたらまた別なんだがな。
p[w] = p[w]++;
>>666 キタ━━━━━(゚∀゚)━━━━━!!!!
#define ぬるぽ NULL
>B. *( p + w) ++ * と ++ ってのは、演算子の優先順位は同じだが、結合規則が「右から左」なので、 *( (p+w)++ ) って意味になるのだよワトソ(ry
671 :
デフォルトの名無しさん :03/02/06 16:38
中身が"OMAEMONA"という文字の char s[512]があり、その中身を 16進数でchar hoge[512]に移したいんですけど どのようにすればよろしいでしょうか? 初心者で申し訳ないですが おながいいたします。
>>671 > 16進数でchar hoge[512]に移したいんですけど
> おながいいたします。
もうすこしネタとばれにくいネタを書け
>>672 いやこれまじなんすよ・・・・
void Wakaranchi (char *adr1, char *adr2){
int wkint;
char wkchar[3];
bzero(wkchar, sizeof(wkchar));
memcpy(wkchar, adr1, 2);
sscanf(adr1, "%x", &wkint);
*adr2 = wkint;
}
こんな感じのサブルーチンじゃできないっすかね??
初心者でマタークわからんのです。。。
ほんと助けてくんろー!!
おながいします。。。
>>671 #include <stdio.h>
void str2hex(char *dest, const char *src)
{
if(*src)
{
do {
dest += sprintf(dest, "%02x ", (unsigned char)src++);
} while(*src);
dest--;
}
*dest = '\0';
}
int main()
{
char s[512] = "OMAEMONA", hoge[512];
str2hex(hoge, s);
puts(s);
puts(hoge);
getchar();
return 0;
}
pc2.2ch.net/test/read.cgi/tech/1042640474/674内の 関数str2hexにバッファーオーバーランによるセキュリティ・・・
>>575 え? 関数str2hexは無罪だろ。
まさかstrcpyもバッファーオーバーランによるセキュリティがあると思ってる?
>>676 まさかstrcpyにバッファオーバーランの危険がないと思ってる??
そりゃ 「セキュリティ」 は無いわな
>>677 皆無とは言わないが、取り立てて言う程のことでもない。
gets() と違い、strcpy() は使い方さえ間違えなければ問題は絶対発生しない。
セキュリティの問題とクラッシュの問題を混同している
>>675 >>677 が居る
スレはここですか?
>>674 サソ
ご丁寧にありがdございます。
作成いただいたプログラムを走らせたところ
OMAEMONO
4c 4d 4e 4f 50 51 52 53
↑このような結果になりました。
これって、アドレスかなんかなんでしょうか?
厨房でよくわからずご迷惑お掛け致しますが
御教授お願い致します。
dest += sprintf(dest, "%02x ", (unsigned char)src++); ここ dest += sprintf(dest, "%02x ", (unsigned char)*src++); だべ。
>>681 訊く前に、674 がどういうプログラムなのか読み取ってみようとは
思わないのか?
>>681 ちょとワラタ
あんさん…じぶんでゆうといてそりゃ…
>>684 いや、あれは確かにアドレスの成れの果てだぞ
>>682 サソ
ありがとんごぜぇます。
>>683 サソ
ヨミトレネェンダヨォォ...
おせぇてくれよ。処理内容を。
ニホンゴで。
>>684 ワライゴトジャネーヨ
ヽ(`Д´)ノ ウワァァン!!
>>686 処理内容なら、あんたが自分で言ったぞ。
>>686 何がわからないのかも述べず、単に教えてくれと繰り返すだけの香具師には、
説明してやる気にはなかなかなれないもんだ。
確かにアドレスかなんかなだな。断言できる。
素朴な疑問なんだが、「初心者」で処理を提示されても 理解できないような香具師が、なんでまた こんな問題を解決しなければならないんだ? >中身が"OMAEMONA"という文字の >char s[512]があり、その中身を >16進数でchar hoge[512]に移したいんですけど >どのようにすればよろしいでしょうか? それがもし、課題かなにかなら擦れ違いだし、 仕事かなにかならこんなところで他人に頼ってちゃダメだろ。 それともなにか? 今後何か出るたんびにここで聞こうってのか?
>>1 に書くべきことを
>>2 に書いてしまった 1 が全部悪い
ascU code.
694 :
デフォルトの名無しさん :03/02/06 21:41
memcpy(hoge,s,sizeof(hoge)); 関数はmemcpy,strncpyどっちかだな。 strcpyはサイズ指定出来ないから領域破壊の元だ。やめとけ。 つうか、技術評論社のC言語辞典読んどけ。
>>679 そんなこと言い出したら gets() だって使い方間違えなきゃ問題は絶対発生しないぞ。
>>695 gets() を呼び出したらそれだけで問題の回避は不能だとあれほど
だからCなんか捨ててC++に鞍替えしれとあれほど
>>694 getsとstrcpyは外界と接点があるかどうかという点で大きく異なる。
strcpyは使い方さえ誤らなければ安全に使うことが可能。
外界と接点がないところで使えば、コードで安全であることを保障できる。
getsは外界と接点があるゆえに、コードだけでは安全であることを保証できない。
gets用のバッファを4ギガ分用意すれば、 環境によってはもんだいは起きない。
>strcpyはサイズ指定出来ないから領域破壊の元だ。やめとけ。 正気か?
まともに C やってる人で、領域破壊の可能性がある状況で strcpy() を使う 香具師が居るとは思えないが・・・。
>>699 そういう阿呆な事をする前に、fgets() の使用を検討しろ。
>>702 うん、だから普通はstrmove()を作る
strcpyなんてC特有の関数だよなあと思った
>>702 getsと違い、対策すれば完全に防げるが。
>>707 ああスマン
つっこまれるまで気づかなかった。
結論 gets()は使うな。 strcpy()で領域破壊の可能性を拭い切れないならstrdup()でも使え。 だからと言ってstrncpy()は別な問題を発生させるから心して使え。 いっそ、sprintf()で%.*sでも使うほうがよっぽどましだ。 strcpy()が一切使えないなんていってると、strlen()さえ使えないことになるぞ。 こんなところかな。
>>709 > strdup()でも使え。
そういう人が使うとメモリリークのバグをうみそう・・・
>>710 バッファオーバーランよりはマシ。
もっともそれだとバグに気が付かなくて、コードの修正も本人の技量向上も望めそうにないが。
イオン導入を考えております。 最適なビタミンC誘導体は何ですか? また、何所で手に入りますか?
>>713 あなたの脳髄が最適です。
あなたの尊い犠牲によって入手できます。
716 :
デフォルトの名無しさん :03/02/07 21:02
ちょっと質問させてください。 char型の配列 10.111 を double型のデータ 10.111 に変換する方法ってあります?
strtod
strtod() なんて面倒っちい atof() でええやん
なんで面倒なのかわからん
ぬるぽ与えるのが面倒
なるほど。ありがとうございます。
殴られずに済んだぜ( ̄ー ̄)
723 :
デフォルトの名無しさん :03/02/07 22:37
for文を使って、1から1000までの7の倍数を表示して、 変数sevenが49の倍数の時に改行、というプログラムをつくりたいのですが、 いまいちうまく行きません。ソースの一部を貼ります。 これをコンパイル&実行するとDOS窓にずらーっと数字が出てきてとまりません。 どこがおかしいのでしょうか? まだfor文の使い方がよくわからないところもあるので、 どうやればできるのか、教えていただけないでしょうか? for(seven=1; 1000>=seven; seven*7) { if((seven%49)==0) { printf("%d、\n",seven); } else { printf("%d、",seven); } }
#include <stdio.h> int main() { int seven; for(seven=1;seven<=1000;seven++){ if(!(seven%7)){ printf("%5d",seven); if(!(seven%49)) printf("\n"); } } return 0; }
1ずつ足す必要ないじゃん・・・
>>724 seven*=7でなんで=が必要なのでしょうか?
for文内では必要なのですか?
>>725 その方法もありましたね。
気づきませんでした。
そっちのほうが早く処理できるかな?
それは7ずつ足せばいいということですか?
seven=seven+7
これで下のif文を省いて・・・
今からいろいろ試してきます。
>>727 seven*7
だけでは、いつまでたってもsevenの中身は変わらないよ。
やるなら
seven=seven*7
これは
seven*=7
と書ける・・・・
でもこれだと、1,7,49・・・になっちゃうね・・・・
seven=seven+7
が正解だね・・・・欝
>>728 今試したらそうなっちゃいました(笑)
なので
>>725 さんの方法でやりました。
seven=seven+7で。
今まで変数はnとかiだったんですけど変数をsevenとかに
するとソースが書きやすいですね。
>>698 > getsとstrcpyは外界と接点があるかどうかという点で大きく異なる。
で、どこまでが外界なんだ ?
自分が作ったファイルを読むんなら gets() だって安全じゃねーのか ?
他のプロセスが作ったメモリーマップドファイルの内容を strcpy() するのは危険じゃねーのか ?
少なくとも、strcpy() が外界と接点がないと思い込む方が危険だよ。
質問ではないのですが、 for(seven=1; seven<=1000; seven=seven+7) だと1、8、・・・となってしまうので最初の初期化はseven=0;にしないと ひとつずれてしまいました。 それだけです。
>>730 第三者が存在する場合に、サイズ計算せずにstrcpy()使うのが悪い。
計算した上でstrcpy()が危険なら、安全な関数は標準ライブラリにはない。
つまり、文字列の終端までアドレスが有効かを調べなきゃいけないということ。
strcpy()はサイズを事前に計算するなり、strncpy()を使えばいい。
gets()は、実際にバッファが溢れない限り検知する手段がないのが問題。
>>730 >他のプロセスが作ったメモリーマップドファイルの内容を strcpy() するのは危険じゃねーのか ?
もちろん危険だ。そのままやっちゃうとアウトだろうね。
普通そんなことする前にstrlen使ってサイズを調べたりしないか?
想定外の異常なサイズだとエラー出して止まるなり何なり実装するんじゃないか?
それは外界と接点があるところだろう。
だったら何のチェックもせずにstrcpyを使うのは危険極まりないぞ。
「使い方さえ間違わなければ」とはそういう意味で使ってる。
>自分が作ったファイルを読むんなら gets() だって安全じゃねーのか ?
そのファイルが何らかの要因で書き換わらない保証はあるのか?
そうなったときにgetsだとバッファオーバーランを防ぐ方法はないぞ。
libsafe 使っとけ。
>>733 >普通そんなことする前にstrlen使ってサイズを調べたりしないか?
'\0'で終わってるか分からない文字列にstrlen()は使わない
つーか、何が入ってるか分からない可能性のあるデータは
効率が悪くても、strncpy()かmemcpy()の、その場に適してる方を使う
で、なんでまたstrncpy()なんて使うんだ?
#include <stdio.h> int main(void){ int item[5]={3,1,6,7,2},a,b,t,count; for(a=1;a<count;a++) for(b=count-1;b>=a;b--){ if(item[b-1]>item[b]){ t=item[b-1]; item[b-1]=item[b]; item[b]=t; }} for(t=0;t<count;t++)printf("%d",item[t]); return 0;}
バブル
739 :
デフォルトの名無しさん :03/02/08 01:50
char *a = "100"; int b = 100; この2つの100を一箇所の#defineで管理する方法ってあるの?
>>735 > '\0'で終わってるか分からない文字列に
そもそも\0で終わってない可能性のあるものを文字列として扱おうとするのが間違い。
>>739 C-FAQ嫁。
#define Str(x) #x
#define Xstr(x) Str(x)
#define NUM 100
char *a = Xstr(NUM);
int b=NUM;
>>730 ファイルを読むのになんでgetsを使うの??
文字列として扱おうとしているものを、\0で終わっていない可能性のあるままにしておくのが間違い。 と言うべきか。
お望みとあらば。
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>720
746 :
デフォルトの名無しさん :03/02/08 02:33
このスレ、ばかばっか。
747 :
デフォルトの名無しさん :03/02/08 02:58
で、strcpyは悪なの?
>>747 まあ、strncpy 使えってこった。
strncpy()使う奴は馬鹿。
ホコリ臭い議論だ。Cはまだこんなことで悩めるのか。
>>733 >
>>730 > >他のプロセスが作ったメモリーマップドファイルの内容を strcpy() するのは危険じゃねーのか ?
> もちろん危険だ。そのままやっちゃうとアウトだろうね。
> 普通そんなことする前にstrlen使ってサイズを調べたりしないか?
> 想定外の異常なサイズだとエラー出して止まるなり何なり実装するんじゃないか?
> それは外界と接点があるところだろう。
> だったら何のチェックもせずにstrcpyを使うのは危険極まりないぞ。
> 「使い方さえ間違わなければ」とはそういう意味で使ってる。
> >自分が作ったファイルを読むんなら gets() だって安全じゃねーのか ?
> そのファイルが何らかの要因で書き換わらない保証はあるのか?
> そうなったときにgetsだとバッファオーバーランを防ぐ方法はないぞ。
>>733 > そのファイルが何らかの要因で書き換わらない保証はあるのか?
そんな極論言い出したら、あんたが strcpy() でコピーしようとしているメモリーだってデバッガで書き換えられるかも知れんぞ。
発生確率に違いがあるかも知れんが、本質は一緒だよ。
>>730 に書いた通り、「どこまでを外界と見なす」かの問題だよ。
>>752 バカですか?
デバッガ勝手に動かされたら、脆弱性以前の問題なのだが。
それを確率とか逝ってるし。
>>730 >自分が作ったファイルを読むんなら gets() だって安全じゃねーのか ?
おまえは 「gets() は必ず "自分が作ったファイル" を読む」
という仕様の関数を書くのか?
お前と一緒に仕事する奴に同情するよ・・・
>>753 本質が見えてない奴だな。
システムとして、「そのファイルが何らかの要因で書き換わらない保証」ぐらいできるだろ。
>「どこまでを外界と見なす」かの問題だよ。
と言うのをちゃんと理解しろ。
>>754 > おまえは 「gets() は必ず "自分が作ったファイル" を読む」
> という仕様の関数を書くのか?
日本語喋れ。
お前と一緒に仕事できる奴なんていないんだろうな...。(藁
756 :
デフォルトの名無しさん :03/02/08 13:27
seven+=7にしろや。
結局さ、ライブラリで考えた場合、 ・仕様をきちんと定義する。 ・仕様外、想定外の利用をされた場合の救済策を充分練る。 のは当たり前でしょう。 その上で、完全に安全なものは作れないのだから、 ・仕様を徹底して異常な利用はさせない。 ・定期的に利用方法、仕様を再検討する。 と言った運用で逃げるしかないっしょや。
まあ道具は使う人しだいって言うことだろ。 あふぉが使えばアフォなりだよ。 gets()が悪いわけではない。
いや、gets()は悪い。
ゲッツ
>>756 seven=seven+7
は
seven+=7なんですか?
つか、なんでですか?
762 :
デフォルトの名無しさん :03/02/08 13:55
>>733 > そのファイルが何らかの要因で書き換わらない保証はあるのか?
アプリの一部として提供しているファイルを書き換えたとすれば、アプリを破壊されたのも同然です。
実行ファイルを書き換えられたのと本質的な相違はありません。
gets()の方がfgets()などに比べて扱いやすく、効率もよいのは確かなので、使いこなせるだけの能力
を持ち合わせた人ならば、適切に使うべきなのでは?
763 :
デフォルトの名無しさん :03/02/08 14:00
>733 strcpyすると危険なメモリ領域は、strlenしても危険だとおもう。
もう春だね。
gets()擁護の人に聞きたいんだけど、 なんでファイルからの入力に標準入力を使いたがるの? しかもアプリの一部として提供しているファイルを? それってつまり、利用者がパイプラインを使ったりすることを妨げるよね。 逆に、標準入力からでもfgets()使う方は理解できるんだけどねぇ。
アセンブラの方が危険だろ まあ馬鹿に刃物持たすなってことだ
何故いきなりアセンブラが?!
>>755 >日本語喋れ。
そんなに言っている事が分からんか? じゃあ、実例。
void myfunc()
/* 注意!: この関数を呼ぶ時は必ず stdin が "myfile.txt" を指していなくてはならない。*/
{ char b[8]; gets(b); }
こんな関数、誰も使ってくれないし、自分も使いたくない。
間違いなくバクの温床。
機械語はあふぉには使えんから 逆に安心だぞ。
771 :
デフォルトの名無しさん :03/02/08 14:27
>>766 > それってつまり、利用者がパイプラインを使ったりすることを妨げるよね。
ユーザの誤使用を回避するには有効かも。
普通は専用の子プロセスを使ってファイルを読むことになるだろうけど。
単にfgets()を使えば安心と考えている人が多いのがむしろ問題としては大きいと
思う。
改行で終わったのか、ファイル終端で終わったのか、バッファが足りなかったのか、
エラーが発生したのか、一切調べずに得られた文字列を妄信する馬鹿がいかに多い
ことか...。
機械語?バイナリコーディングするんか?
>>766 細かい事だが教えてくれ。
世間一般では「パイプ」の事を「パイプライン」とも呼んでいるのか?
俺は「パイプ」と「パイプライン」はまったく別のものだと思っていたが?
>>771 激しくナンセンス。持論を擁護するためにそこまで阿呆に成り下がらなくてもいいだろうに。
それに、そんな馬鹿がgets()使ったらどう思う?
パイプ(|)で繋げられた連(ライン)だからパイプラインでいいんじゃないのか?
たとえば C3xxxx が無条件ジャンプとか....
>>771 >単にfgets()を使えば安心と考えている人が多いのがむしろ問題としては大きいと
お前、「自動車事故」と「自動車自体の欠陥」の違いが分からんのか?
全く次元の違う話だろうが。
>>776 あ、Z80までならバイナリコーディングしてたよ。
尤も、精々100-200バイト程度だと思ったけど。
ジャンプ命令なんかは予め00入れておいて、
後から書き換えるから2パスだけどね。
Rubyを使えばこんなくだらないことで悩む必要がなくなるのに。
>>769 あの日本語から、これを想像しろと ?
こんな奴が「一緒に仕事する奴に同情するよ」とかほざいていたのか ?
gets() 使うなら、これぐらいしろと言うのなら別に「そりゃそうだ」と思うだけだ。
でも、俺は gets() が常に安全だと言ってるわけじゃなくて、strcpy() と本質的に変わらないと言ってるだけだ。
(つまり、
>>679 がアフォだと言うことだ。)
そこは理解できているのか ?
>>764 誰でも判っていることとは思うが、strcpy() が危険な場合に常に strlen() が危険とは限らない。
>>781 gets()の安全な使い方のサンプルを提示してください。
784 :
デフォルトの名無しさん :03/02/08 17:04
2つの複素数a+bi,c+diの除算(a+bi)/(c+di)を行いその結果を複素数e+fiに代入する。 複素数は2つの実数を使って表現せよ。”i”は虚数単位である。 という問題なのですが全くできません。お願いします。
#define gets(x) gets(s);
787 :
デフォルトの名無しさん :03/02/08 18:04
↓これって未定義?
int m;
javaによって皆さんの抱えている問題のほとんどを解決できます。
Rubyならね
>>781 >あの日本語から、これを想像しろと ?
つーか、俺は
>自分が作ったファイルを読むんなら gets() だって安全じゃねーのか ?
の一文から想像できた使用方法は
>>769 のようなコードしか無かったのだが。
それなら
>>781 はどういう使用方法を想定していたのか、
ぜひとも教えてもらいたいものだ。
793 :
デフォルトの名無しさん :03/02/08 18:32
符号付整数jをn〈整数)ビット右に算術シフトし結果を符号付整数kに代入するcの構文を書け,なのですがどうすればいいんですか?
>>795 signed をシフトすると必ず算術シフトになった気がするんだが。
標準仕様にはなってなかったっけ?
>>796 signedは正の数である時のみ結果が保証される。負の数をシフトした
場合は処理系依存。
>>783 一行のサイズが、バッファを越えないなら安全だよ。
(頼むから、
>>733 へループしないでくれよな。)
>>791 別に、上に書いてあることが保証できればいいんじゃないの ?
と言うか、「gets() が常に安全ではない」という主張に反対してるわけじゃないぞ。
「gets() が読むファイルの内容が保証できるなら、gets() だって安全に使うことができる。」と言うだけのことだ。
(何回書けばわかるんだ ?)
だから、具体的なサンプルを提示してよ。 っていうか、なんでファイルの読みこみにわざわざ標準入力を使うのかさ。
いやいや、C言語検定3級うけてきますた。 超楽勝ですた。間違った問題は ・配列の宣言の際に、初期化子の数が配列の要素数より大きい場合は、多い分が無視される。○か×か? ・2次元配列a[サイズ1][サイズ2]のサイズ指定は、サイズ1は省略できるがサイズ2は省略できない。○か×か? の二問くらいの予感。
>>802 もう一問間違えたっぽい。
C言語はALGOLを元につくられた。○か×か?みたいな問題
804 :
デフォルトの名無しさん :03/02/08 22:43
B言語でしょ? 答えは×
>>804 正解
UNIX開発者のひとりのKenがつくったんだっけ?>B言語
>>804 ゴメン、問題が確かじゃないから、もしかしたらALGOLの流れを汲むか?てな表現だったかもしれない。
今検索してみたら○っぽい、と思った。
まあ終わったからスッキリ!!どうせなので次回は2級受けるつもりです
やった。 高1だけど受けてみようかな。 C言語検定。 閑話休題、質問なんですけど #define hoge 5 マクロを定義するときってhoge=5になるじゃないですか。 で、マクロの定義はもっと複雑な作業をやらせることができるんですか? 例えばよくテキストエディタで「この条件に一致するものには○○をする」 ってやつとかのことです。
↓のような2値化処理を高速化したいのですが、どうするのがいいですか? ---------------------------------------------- #define SIZE 65536 unsigned char src[SIZE], dst[SIZE]; int i, value; value = 128; for (i=0; i<SIZE; i++) dst[i] = ((src[i] >= value)?255:0); ---------------------------------------------- とりあえず、 A ?:の代わりにif-elseを使用 → ちょっと速くなった?ただの誤差かも B forループ内の処理を256ずつにしてループのオーバーヘッドを減らした → そこそこ速くなった C unsigned long *に変換して、マスク処理で各バイト毎に判定 → ちょっと速くなったけど、longで読んだ意味無し? なんてのを試してみました。
809 :
デフォルトの名無しさん :03/02/08 23:10
何回書けば分かるんだ?
だれも
>>799 が「gets()が常に安全だ」等と主張しているとは言っていない。
皆が問題にしている部分は
>>752 >発生確率に違いがあるかも知れんが、(安全性について)本質は一緒だよ
と言ってる部分だ。
gets() の場合、
>>769 のような非現実的なコードを書かない限り、
プログラマは安全性を保証できない。
strcpy() の場合、終端等、プログラムを設計する時点で普通に
気をつけていれば安全性を保証できる。
皆、これは「発生確率(何だそりゃ?)の差」等というものではなく、
絶対的な違いだと考えているって事。
単純に「安全性の濃淡」で話を一くくりにできるのなら、
極端な話「そのコードを一回も実行しない事」が仕様となれば
どんなコードも「発生確率に違いがあるかも知れんが、本質は一緒だよ」
と言える事になる。
>>808 初期化しとけば代入の回数が減る
ポインタ使った方が速いかも
811 :
デフォルトの名無しさん :03/02/08 23:18
>>807 折れ中3だけど
お前折れよりヒドイな
折れ以下の香具師がいて安心した
>>808 811とかぶるかもしれないけど、判定元がcharなら判断後の値のテーブルを作る。
条件分岐にしないで、テーブル参照だけにすれば速いかと。
dst[i] = ((src[i] >= value)?255:0);
の代わりに
dst[i] = table[src[i]];
って事ね。
>>809 非現実的かも知れんが、そう言うコード (gets() が安全である) は書けるんだろ ?
これには、Yes or No どっちなんだ ?
No と言うなら、書けない事を証明してくれ。
Yes と言うなら、gets() が安全である時があることには同意するんだよな。
つまり、strcpy() も gets() も「安全である時もそうでない時もある」と言うだけのことだろ。
> 皆、これは「発生確率(何だそりゃ?)の差」等というものではなく、
> 絶対的な違いだと考えているって事。
お前だけじゃねーのか ? (藁
> 単純に「安全性の濃淡」で話を一くくりにできるのなら、
> 極端な話「そのコードを一回も実行しない事」が仕様となれば
> どんなコードも「発生確率に違いがあるかも知れんが、本質は一緒だよ」
> と言える事になる。
何言いたいのかよくわからんよ。
だからjava使えって言ってるのに。
>>813 テーブル参照 = メモリアクセスだからキャッシュに載ると言ってもちょっと遅いような気が...。
>>808 こんな短いループを高速化したいなら、インラインアセンブラの出番かと。
255movより符号付にしてdec
>>808 とりあえず根本的な対策。
(これは別に一休さんみたいな
とんちの利いた解答という訳ではなく、
あくまでマジレス)
1.その2値化処理自体を必要としない方法を考える。
2.ハードの力を使う。
>>808 Cはだめじゃない?あらかじめlongの配列として宣言しておかないと。
とりあえずMMXでも。
Rubyを使えば速くなるのに
符号付にしてシフトするだけ
>>814 ・・・付き合うのやめた。あとは勝手にやってくれ。
(どうせ
>>814 も実際は現場で gets() を
使っていないのは分かりきっているし)
>>809 初期化とは、最初にdstを0(or255)に初期化して代入処理を減らすということですか?
memset使ったら逆に遅くなりました(;´Д`)
ポインタは試してないので、明日にでも試してみます。
>>811 >>813 ウチの環境だと、条件分岐にしたときと殆ど同じ速度でした(;´Д`)
>>817 インラインアセンブラは使ったことがないので、勉強してみます。
>>818-823 ヽ(`Д´)ノ ウワァァァァン
あ、valueは0〜255までの任意の値です。128以外もあり得ます。
828 :
デフォルトの名無しさん :03/02/09 01:05
だからさ、限定条件に置かないと安全に使うことができないgets()を 使わないといけない理由なんてないでしょ。 つまり、始めからgets()擁護は机上の空論。
getsってモテモテですね
malloc()/free()にゃ負けるよ
>>824 >(どうせ
>>814 も実際は現場で gets() を使っていないのは分かりきっているし)
もちろん、普通は gets() なんか使わんよ。
(これぐらいは、
>>695 の「そんなこと言い出したら」のくだりでわかりそうなもんだが...。)
>>829 ここまでくるとネタか ?
> だからさ、限定条件に置かないと安全に使うことができないgets()を
> 使わないといけない理由なんてないでしょ。
> つまり、始めからgets()擁護は机上の空論。
じゃ聞くが、strcpy() は限定条件を置かなくても安全に使えるのか。
そう言う意味で、なんで gets() は安全じゃなくて、strcpy() は絶対安全なんだ ?
(
>>679 参照)
ところで誰が gets() を擁護してるの ?
俺は、「gets() が安全な (* 場合も *) ありえる。」と書いてるだけだぞ。
(
>>781 ,
>>799 ,
>>814 見れ。何回書けばわかるんだ ?)
過去一番モテたのは scanf。
NULLだろ、ぬる。
strcpyはプログラマが気をつければ問題を回避できるけど、 getsはどうすることもできないからじゃないの??
擁護といって悪ければ、「安全な場合も有り得る」などといいつつその例を提示できないで足掻いている。 と言い替えておきましょうか。
>>833 対象をライブラリ関数に絞らなきゃ
i = i++; (= いわゆる未定義) だと思う。
もっと実用的な話をしようよ・・・ だからってわけじゃないけど質問。 strncpyの代わりにsprintf使えって言われたけどどうやるの?
>>838 snprintfの間違いじゃないのか。
printfは重いから使うなっていわれた。 ふざけるなと思った。
>>835-836 >>830 は見てんのか ?
> 自分が作ったファイルを読むんなら gets() だって安全じゃねーのか ?
(ついでに、それに対するレスも見といてくれよ。)
dst[i] = (char)-(src[i] >= value);
>>840 状況がわからないから、あんたが正しいのか、使うなって言う奴が正しいのか判断できん。
%5sでできない?
C言語とC++言語の根本的な設計思想の違いを教えてください。
char * mock_strncpy(char *dst, char const *src, size_t len) { sprintf(dst, "%.*s", len, src); return dst; }
型のあとに改行する派か。
なんで
>>841 はそんなに必死なんだ?
おまえの書いたプログラムなんて誰も使わんのだから
gets()使いたければ勝手に使っとけ。
まともなプログラマがまともなプログラムを書くときは
100% gets() は使わない。
strcpy() は状況によっては使うこともある。
>>850 絶対にやってはならない事の例として使う
(↑はまともなプログラムでしょう?)
>>849-850 具体的な例出されたら、必死とか言うだけですか ?
> gets()使いたければ勝手に使っとけ。
またでたよ。何回書けばわかるの ? 真性のアフォですか ?
>>832 に...
| もちろん、普通は gets() なんか使わんよ。
| 俺は、「gets() が安全な (* 場合も *) ありえる。」と書いてるだけだぞ。
と書いてるように、安全な場合があると言ってるだけで gets() を使ってるとか使うのが望ましいと言ってるわけじゃないんだよ。
(つーか、普通は使わんとはっきり書いてあるんだが...。)
で、ぐちゃぐちゃ書いてるけど、結局
>>830 に対して反論できるの ? できないの ?
>>852 *
>>830 *には反論できません(てかする気もありません)が何か?
おまえ
あ せ り す ぎ (ワラ
>>gets()もろもろ 飽きたから他のスレでやってくれ
>>854 > (てかする気もありません)が何か?
する気があったらできるの ?
こんなこと書いてて恥ずかしくないの ?
まして...
>おまえ
>あ せ り す ぎ (ワラ
に至っては、わけわからんし。
まあ、悔しいから何か書きたかったんだろうね。(ププッ
>>855 ごめんよ、ループする奴多くてさ。
>>857 >Mail : ここから釣りです。
さっさと寝ろ。
860 :
デフォルトの名無しさん :03/02/09 11:34
いい加減やめれ。 面白くない
861 :
デフォルトの名無しさん :03/02/09 12:09
ポインタのことで質問です。 今、5人の点数をユーザーが入力してint test[5]に入れるものなのですが、 これでfor文を使って入力とそれぞれの点数表示はできたのですが 平均を求めるやり方がわかりません。 int test[5]に格納した点数をすべて合計して5で割りたいのですが どうすればint test[5]に格納した点数を合計できるのでしょうか? よろしくお願いします。
862 :
デフォルトの名無しさん :03/02/09 13:02
>>861 int total=0;
for(test){
total+=test[i]
}
>>861 これでも呼べば。
double
calcAve(size_t len, int *pVal)
{
int ic;
int sum = 0;
for (ic = 0; ic < len; ic++) {
sum += pVal[ic];
}
return (double) sum / len;
}
double calcAve(size_t len, int *pVal) この書き方されると俺のエディタは関数の検出できなくて激しく不便なんだよな。
みなさん本当にありがとうございます。
まずは
>>862 氏の方法からやってみます。
なるほど、不便なエディタだね。 私はいろんなエディタ使うから、grepで探しやすいようにしてるんだけどさ。
867 :
デフォルトの名無しさん :03/02/09 13:21
なるほど、不憫な環境だね。 私はいろんなエディタ使うけど、定義の検索くらいエディタのマクロ探すようにしてるんだけどさ。
868 :
デフォルトの名無しさん :03/02/09 14:06
みなさんに質問。 俺はC/C++学び始めですが、みなさんは 「C/C++を普段使っているけど、この機能についてはあまり知らない」 ってことあります? 例えばC++ならclassを使った方が綺麗に仕上がるけど、 構造体の方が使い慣れてるから構造体で済ましてしまうとか。 個人的にはあまりにもC/C++は多機能過ぎて(特にC++)いっぺんに 覚え切れなくて不安です。
>>868 テストに出るわけでなし、取りあえず組めればそれで良いでしょう。
存在する制限の中でどれだけのことが出来るか追求してみるのもおもしろい。
勉強を怠らなければ新機能への理解も必ず出来る。
がんばっとけ。
構造体を定義して、その構造体へのアクセスする関数を定義したらそれはもう、クラスにした方がいい。 特徴的な型を定義して、そのデータ型間の演算を多用するならそれはもう、クラスにしてオーバーロードした方がいい。 いずれにしても一遍に覚える必要はない。 私はCからC++に入ったけど、C++を最初から勉強するのもいいね。 がんがれ〜
type func(arg...) この形は激しください。
873 :
デフォルトの名無しさん :03/02/09 17:38
このエラーってなんですか handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
gcc使ってるんですけど、 > hoge.c:256: dereferencing pointer to incomplete type というエラーが止まりません。 構造体へのポインタを通してメンバにアクセスしようとするとこうなるのですが、 何が悪いのでしょうか? ほとんど見たことないエラーなので、対処の方法が分かりません。 どこらへんをチェックすればいいでしょうか?
具体的には、構造体の中のファイルデスクリプタ hoge->sock に触ると 上記エラーが出るんですが、該当するコードを削除して、 gdbでステップ実行すると hoge->sock には触れるんです。
>>876 hogeの指す構造体がhoge.cのコンパイル中に定義されているか確認汁。
宣言だけで使ってるとそんなエラーがでるはず。
>877 ありがとうございました。まさにそんな感じでした。 サーバ側とクライアント側のライブラリやヘッダファイルが ごちゃごちゃになって、どこに定義があるのか判然としませんでした。
879 :
デフォルトの名無しさん :03/02/09 21:14
const char *p; char const *p; char * const p; の違いってなんですか? 実際に試すと、1番目と2番目が同じ動きで、3番目が違う動きをします。 解説お願いします?
指すものがconstかポインタ自体がconstかの違い
前の2つは、*p = 5とかが禁止される 最後のは、p++とかが禁止される
>>881 そんなのは試せばわかる。理屈でわかりやすく説明してくれ。
885 :
デフォルトの名無しさん :03/02/09 21:38
Cでwindowsプログラムを組むのに、 1番いい勉強法は何ですか?
887 :
デフォルトの名無しさん :03/02/09 21:41
>>884 =879
char が const か、
const な char か、の違い。
つまり一緒。
ついでに言えば、
char *p;
char const *p;
char *const p;
char const *const p;
で全部意味が違う。
マルチに反応しちまった…
>>810 レス番号間違えてました。失礼しました。m(_ _)m
ポインタ使った処理は、使い方が分かってないのかもしれませんが、gccで最適化した場合では元の処理と同じくらいでした。
>>827 ・・・最適化オプションの存在を忘れてました・゚・(ノД`)・゚・
オプション(cygwin gcc: -O2 -funroll-loops、vc++ cl: /O2)を付けたら劇的に速くなりました(;´Д`)
gccでは、テーブルを使った処理→
>>842 さんの式の順で、またvc++では、テーブルを使った処理と
>>842 さんの式がほぼ同等の速さになりました。
>>817-818 >>821 MMXのアセンブラが面白そうなので、ちょっと勉強してみます。
>>827 してなかったので、ちょっと調べてみました。
>>842 勉強になります。
あと、午後のこーだの作者さんのWebぺーじがいろいろと参考になりそうです。
BBSの過去ログにこんなの↓があったので、いろいろと調べてみようと思います。
以下勝手に転載。
--------------------------------------------------
最近書いたコードから;RGB各8bitのピクセ
ルで、RGBそれぞれで独立に
二値化(0か0xff)するというもの。
p: ピクセルの値(RGB32)
a = p | 0x1010100;
a = (a - 0x808080) & 0x1010100;
a = a - (a
>>8 );
0x808080が閾値で、RGB独立に変更でき
ます。細かく見ていくと誤差が
あるのですが、その辺が問われない場合
であれば充分かと思います。
(このフィルターそのものが使い途に困る
という話もありますが…)
--------------------------------------------------
ttp://homepage1.nifty.com/herumi/adv/bbslog/bbs10.html の459より転載
レス、どうもありがとうございました。m(_ _)m
C言語でrand,srandを使って確率的に1/2で0と1を 得たいのですが ちょうど、交互に出てきてしまいます。 別の方法なにか、ありますか?
void swap(int *array,int a,int b) { int tmp; tmp=array[a]; array[a]=array[b]; array[b]=tmp; } void sort(int *array,int num) { int i,n; num-=1; for(i=0;i<num;i++) { for(n=0;n<num;n++) { if(array[i]<array[n]) { swap(array,i,n); } } } } こういうソートアルゴリズムってなんて言うんですか?
age
バブルソート
どうもありがとうです(^^)
901 :
デフォルトの名無しさん :03/02/09 23:58
902 :
デフォルトの名無しさん :03/02/10 00:08
厨な質問で申し訳ありませんが、 標準ライブラリのみでマウスからの入力を行なうには どんな関数を使えばいいのでしょうか? googleで検索してもわからないのですが
>>895 srand((unsigned int)time(NULL));
s=rand()%2;でやってるんですぅ。
奇数と偶数が交互にでない乱数は、どうやるんですかー?
>>895 rand()の系列は偶数と奇数が交互に出ているので、
a=0;
if ( rand()%11<6 ) a=1;
とかしてみるのはどうでしょう?
>>904 rand で使われてる乱数生成ルーチンでは、
下位 n bit の周期は 2 の n 乗になる。
なるべく上位のビットを使うようにしないと駄目。
>>905 そんな面倒なことしなくても、最上位ビット取ればいいと思う。
>>906 生成ルーチンって仕様で決まっているの?
性能のいい乱数発生関数・・・
今までCを独習してきて、「配列」というものは 難しいものだと思いこんでたらまったくそんなことありませんね。 意外と簡単でした。 それだけです。 今思いついた質問ですが、実際にアプリを作るとき、配列を使うなら なるべく量は少ないほうがメモリリークしにくくなるんですか? メモリを確保しないで済む分。 どうなんですか?
性格のいい淫乱発生関数・・・
下位ビットの周期が短いのを誤魔化す為に 下位ビットと上位ビットを入れ替えてから返すような実装ってある?
下位ビットを捨てる実装ならみたことある
917 :
デフォルトの名無しさん :03/02/10 03:56
>>913 やっぱり君にとっては配列は難しいのだと思う
>>916 なるほど。
流石に下位ビットを再利用したりはしないか…。
>>913 メモリリークを小一時間調べて見ろ。
結論から言うと配列だけしか使用しない場合、メモリリークは発生しない。
更に言うとまともなOSならばプログラム終了時にアプリが確保したメモリは
全て解放される。
920 :
デフォルトの名無しさん :03/02/10 13:31
ネタですか?激しく処理系依存ですが。 ↓
intは4バイトだよ
ユーザーの入力した文字をエコーバック無しで取得したいんですけど。
ナニで?
924 :
デフォルトの名無しさん :03/02/10 13:41
プリプロセッサに通した時点でint(など)の型の大きさを得ることはできませんよね?? そんなマクロは標準では定義されていませんよね?
limits.h
>>924 何故型の大きさがプリプロセッサの段階で必要?
私は大抵の場合、sizeof演算子で済ませちゃってるけど。
#稀に(
>>926 の指摘の通りlimits.hをincludeして)INT_MAXを参照するくらい。
configure使うとか。
>>927 int型が4バイトでない場合はコンパイルさせたくないので・・・・
>>926-927 そういえばint型が4バイトならINT_MAXの値は常に一定になりますね。
言われるまで気づきませんでした。ありがとうございます^^
> int型が4バイトでない場合はコンパイルさせたくないので・・・・ どういうプログラムをしているのか、参考までに教えてくれないか?
for(i=sizeof(int)-4;i<n;i++)
932 :
デフォルトの名無しさん :03/02/10 21:55
現在、あるアプリケーションから別のコンソールアプリケーションをspawnlで親の方が待ち状態になるようにして呼び出して使ってるんですが、その子がstdoutやstderrに出力する内容を親側で取得するにはどうすればいいですか? 親の方は子が動いてる間、待機状態になるのであれば呼び出し方はこだわりません。 どなたか教えていただけますでしょうか。
>>932 環境依存しない方法では無理です。
unixなら、pipe(2) or popen(3)。
934 :
デフォルトの名無しさん :03/02/10 23:18
プログラミングのプの字もわからんのですが、 ここで話されてることが理解できるようになるには 何時間くらい勉強すればよろしいでしょうか? 1日1時間として1年じゃ話になりませんか?
何だ?プログラミングに興味が在るのか? 悪いことは言わない。ここから立ち去りなさい。 そしてC言語なんてものには興味を持たないこと。いいね?
936 :
デフォルトの名無しさん :03/02/10 23:40
>>934 本人のやる気と才能しだい。
中学卒業程度の数学の知識の持ち主が、高校2年生レベルの数学がわかるようになるって程度。
>>934 おれは会社に入って1年間くらい休みなし、
毎日残業10時間とかいう状況で無理やりCを覚えた(w
デスマーチっつうか人手がたりなかったんよ…。
おかげで1ヶ月前に書いた自分のコードが幼稚に見えて仕方がないという
状態が1年も続いた。つい直しちゃったりしてな(w
一年後にはオブジェクト指向の真似事をやってみたり、
MS-DOSでタイマ割り込み使ったプリエンプティブっぽいスレッドライブラリ
作ってアプリの性能上げたりとかやってたぞ。
じじいの昔話さ(w
938 :
デフォルトの名無しさん :03/02/10 23:56
>>937 質問の答えにまったくなっていないどころか、ただの自慢ときたもんだ。
能力もたかがしれてるな。
> 状態が1年も続いた。つい直しちゃったりしてな(w 命が惜しかったらぐっとこらえとけ。
940 :
デフォルトの名無しさん :03/02/11 00:08
すみません 次のソースで、func()を使って、a=bになるようにしたいのですが func()をどのように書けばいいのか分かりません 教えて下さい! void func(int *t,int w){ //ここが分からない } void main(){ int a=0,b=1; func(&a,b); }
void func(int *t,int w){ *t=w; } ポインタと、ポインタによる関数間での値の受け渡しを復習しておけ。
void func(int* t, int* w) { *w = *t; } int main() { int a = 0, b = 1; func(&a, &b); }
あ‘ーまじがったー
*t = w;;
グローバル変数な
皆さん、有難うございます!
> w;; (・∀・)イイ!!
949 :
デフォルトの名無しさん :03/02/11 01:15
ログ出力関連で質問。 ログ吐ける関数用意したんで適当に埋め込んでくれ、って頼まれたんだが、関数名が判るようにしてね!って言われたんです。 メッセージに関数名コピペするっての芸が無いなぁ、と思いつつ。 なんかうまい方法ありませんか?
>>949 標準ではうまい方法は無い。
せいぜい __FILE__ マクロと __LINE__ マクロを使うぐらいだ。
コンパイラによっては __FUNCTION_ マクロを用意しているものもある。
>950 ども。そうですか。VC++6ですが __FUNCTION_ は無さそうでしたので、これは手作業でいきます。 ところでマクロってのも苦手なんですが、展開を2度行わせるような方法が判りません。 例えば PutLog(LPCSTR lpmsg) が用意されてて #define PUTLOG() PutLog(__FILE__) ってのはダメで、どうしても埋め込み箇所でPUTLOG(__FILE__) って書かなきゃいけませんかね? まぁ仕事なんで時間費やしても構わないんですけど、余興って事でお願いします。
>>951 マクロは基本的にそれが書かれた時点で展開されるから、あなたの思っている
ような使い方はできない。
どうしても自動化と言うなら、__FUNCTION__ を展開するプログラムを自分で
書いて、プリプロセッサとして起動する。
・・・そんなツールどっかに落ちてないかな?
g++ だと普通にできるけどねえ。。
954 :
デフォルトの名無しさん :03/02/11 03:07
>>933 ありがとうございます。
何時間か探してみたんですが、system()コマンドで"appli.exe 2> stderr.txt"のように叩いてstderrをファイルへリダイレクトしてそれを読み込む、という方法で無理矢理解決しました。
なまえつきぱいぷは?
int i = 'A'; char c = 'A'; /* あのぅ、'A'ってint型ですか? char型ですか? */
問題は、'ab'もintなのはいいけどエンディアンに拠って 0x6162だったり0x6261だったりすることだね。
959 :
デフォルトの名無しさん :03/02/11 08:21
殆どのアプリはVBで作られていると思うのですが Cでつくられたアプリってどんなものがあるの? 趣味で作るアプリならVBで充分だと思うのですが?
int func( size ) int size; { static char buf[size]; return 0; } ↑C99では、こんなことが出来るって本当なの!? なんかキモイよ…
>>959 >殆どのアプリはVBで作られていると思うのですが
藁
VC++はVC++で作られています。
>>960 C99では配列のサイズに変数が使えるようになったらしいが、
これはどうなんだろな。
別にこんなのmallocすりゃ済むのにな。
何の為の仕様変更なんだろな。
965 :
デフォルトの名無しさん :03/02/11 09:19
>>963 アプリはVBで作られていないの?
ゲーはC++だと思いますが。
966 :
デフォルトの名無しさん :03/02/11 09:20
>>964 mallocしないで済むための仕様変更に決まってるだろ。
ていうか、誰か960にツっこんでくれよ。
配列のサイズに変数使ったとしても それはスタック変数になるの? もしそうだとしたら 「定数 + sp」 で参照出来なくならない? どうやってるの? ヒープ?
>>968 定数+spというのがよくわからないのですが
今試してみたらespからサイズ分引いて
スタックに確保しているように思いますよ。
ただサイズ分ちょうどではなくて変な計算してるようですけど。
>>965 アプリもVC++やDelphi多くない?まあ、殆どVBって事は無い。
>>960 C99 のこと言ってんのに引数宣言が K&R かよ...。(これで満足 ?
>>967 )
それはさておき、自動変数の動的配列は10年ぐらい前から GCC は拡張機能としてサポートしていたよ。
>>964 free() を忘れて、メモリーリークしまくる奴の救済と、プログラムの終了時に free() するかしないかで戦争になるのを避けるため。
>>968 > それはスタック変数になるの?
スタック変数 ? スタックに割り当てられるのかと言うことか ?
当然実装依存だよ。(スタックのないマシンもあるからね。)
> 「定数 + sp」
[変数 + SP] で参照すりゃいい。
もちろん実装依存だが、固定領域を先に確保して、可変部を後に確保すれば、固定領域は従来通り [定数 + SP] で参照できる。
なお、普通の C でも処理系によっては、同様の効果のある alloca() をサポートしているものもある。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/alloca.3.html
>>971 ごめん、960は、
「static」の部分…
実はmallocに置き換えてスコープ抜けたらfreeとか。
>>975 gccはalloca()で確保していたと思った。
>>974 私はプログラマだけどVisualBasicじゃないよ。
たまには使うけど。
>>974 > プログラマーのうち約半数はVisualBasicということらしい。
約半数は、VB を使う ≠ 約半数は VB しか使わない
一つの言語しか使わないプログラマってあんまりいないから、これをもって「プログラマーのうち約半数はVisualBasicということ」と主張するのは「私プログラマに向いてません」と言ってるようなもんだぞ。
>>959 Windowsでしか動かないVB製アプリがほとんどを占めているなんて考えられない。
まあ、俺も最初はVBから始めたからなあ・・ なんせボタンをポチポチ貼りつける感覚でプログラムが出来るんだもん。 でも、次第に不満な点が出てきてあまり使わなくなった。
>>979 JavaとANSI C完全準拠+Qtでどこまで戦えますか?
Javaって段階で終わってる。
>>976 確かVC++でもローカル変数がデカい時は似たようなもんだったよ。
スタックフレーム作るときにページ境界飛び越すとGPFな可能性あるから。
9*系だとスタック溢れることあったから怖かったね。 2000*2000以上の再帰の為にスタックを50MB位にしたりしてたよ。 今はもう意味ないけどね…
>>976 内蔵のalloca()に置き換わって(古いgccだと確か__builtin_alloca()だったかなんだったか)
最終的にただのスタック操作としてアセンブリコードが出力されると思う。