1 :
デフォルトの名無しさん :
2005/11/06(日) 22:11:19 BE:284013656-
2 :
デフォルトの名無しさん :2005/11/06(日) 22:12:07
2gets
char gets3; gets(gets3); puts(gets3); 3gets 3gets
printf("乙");
puts("乙");
echo 乙
System.out.println("乙");
fputs("乙",stdout);
stdotu
int (*p1)[3]=a; int *p2=a[0]; としたとき、型は別としてアドレスとしては*p1=a=a[0]=p2ということですよね?
変数を全部表示させてみれ。
>>11 すいませんaの宣言を忘れてました・・・。
int a[2][3];
です。
っ【printf("%d %d %d %d",*p1,a,a[0],p2)】
わかってんのか? *p1の中身は配列だぞ? つーかさ、 int a; int *p = &a; printf("%d\n", *p); で、何が表示されるか、わかってるの?(俺はわからないけど) それと同じ事をやろうとしてるんだけど、わかってる?
ゴミ値が表示されるな
>>16 それじゃ
int a[2][3]={{1,2,3},{4,5,6}};
とでも初期化してください。
つーか、アドレス値表示したところで根本的なことは分からないぞ。
>>11 は
int a[2][3];の意味を理解してますか?
>>19 そう書かれると不安になるんですが、aは配列の配列(配列を要素にもつ配列)ですよね?
二重配列の返り値ってできますか? float[10][10] hoge(float in[10][10]) とかやっても出来ないんですけど…
char[10] strcpy(char *, const char *) みたいな書き方って出来たっけ? 返せるのは配列じゃなくてポインタだけだった気がするが。 つまり、返り値の型をfloat (*)[10]にするしかない。 面倒くさいのはtypedefして使え。 typedef float (*fl10_t)[10]; fl10_t hoge(fl10_t in) みたいな。 ↑が通るかは確認してないが。
>11 printf("%d %d %d\n",&a,a,a[0]); printf("%d %d %d\n",&a + 1,a + 1,a[0] + 1);
つ%p
>>21 配列を戻り値を通して直接返すのは無理。
対処法は2通りある。
1. 引数を通して返す。
つまり、
hoge(const float in[10][10], float result[10][10]);
として、result に結果を書き込む。
2. 戻り値を構造体にする。
つまり、
typedef struct hoge_result {
float data[10][10];
} hoge_result;
hoge_result hoge(const float in[10][10]);
とする。
普通は 1. の方法を使う。
テンテー! 関数へのポインタを返す関数の定義方法があれば、教えてください。
>>29 typedefを使えばいい。そうしなくともできるけど大変面倒なことになる。
typedef void (*pfunc_t)();
pfunc_t f();
void hello()
{
puts("hello, world");
}
pfunc_t f()
{
return hello;
}
int main(void)
{
f()();
return 0;
}
void (*f())();
別にこの程度ならtypedefなんぞイラネ
関数ポインタで typedef が必要なわけ。 ・見やすい ・タイプしやすい ・あとで引数変えたくなった場合に一括して変えられる
>>33 その論拠じゃ「必要」じゃなくて「便利」のレベルでしかないな。
これを「必要」じゃなくて「便利」と捉えてるうちは まともなプログラムは書けない。
>>33 の説明だと必要性があるようには見えないってだけだろ
これで必要性があるように見えないうちは まともなプログラムは書けない。
俺はまともなプログラムが書きたい。(´・ω・`)
まともなプログラムって何よ?wwwww と言ってるうちは まともなプログラムは書けない。
>>33 は、「可読性&保守性は必要」って言いたいの?
これからはプログラマを選ぶコードの時代です
part40辺りから居る俺に楯突くつもりか?
44 :
デフォルトの名無しさん :2005/11/07(月) 20:38:53
>>32 同意だね
配列ポインタと違って関数ポインタは typedef する意味うすいし
お前ら初心者だったときにtypedefなしのsignalの宣言を見て一発で理解できたのか?
47 :
デフォルトの名無しさん :2005/11/07(月) 20:53:11
48 :
デフォルトの名無しさん :2005/11/07(月) 21:21:19
signalて何?
>>45 Cの宣言まわりのsyntaxは醜いけど、別にルールが複雑怪奇な訳じゃないから
読み方さえ分かってりゃ誰でも読める。
それにCのsyntaxも理解できないようじゃ、C++にはとても手がだせんだろ。
そんなことが言えるのはもはや初心者脱出の証。 複雑な宣言 初心者:わからない。作れない(作らない)。 中級者:わかる。自分でも使う。 上級者:わかる。自分が作るときにはtypedefを使う。
51 :
デフォルトの名無しさん :2005/11/07(月) 21:33:18
>>50 >上級者:わかる。自分が作るときにはtypedefを使う。
↑
も
上級者:わかる。自分が作るときにはtypedefをもう。
なるほど、signal()やqsort()の宣言にtypedefを用いないCの標準委員会の連中は 上級者ではないというワケだw
54 :
デフォルトの名無しさん :2005/11/07(月) 21:46:36
複雑な宣言が使えたら上級者だと(プ 複雑な宣言という概念がまだ残ってるのにね
>>53 処理系の実装時にtypedefを使ってはいけないとはどこにも書いていない。
>>55 で、typedef使ってる実装系の具体例は?w
57 :
デフォルトの名無しさん :2005/11/07(月) 22:00:36
WNDPROC ↑ 別にどーでもいーけど ふつーに邪魔
58 :
zako :2005/11/07(月) 22:10:19
こんにちは。JAVAプログラミングのプロジェクトなのですが 最初に「Please insert the # of IQ scores」と表示させ、 その後一つのintの値をコマンドラインから入力し、 次に「Please insert -入力した数値- scores」と受け取った数を表示させて、 その数だけのIQスコアをさらにコマンドラインから入力して、 そのIQスコアの値で100以上が幾つ、100以下が幾つと表示させるプログラムです。 メインとともに二つのメソッド、 readdataとaboveandbelowというメソッドが必要です。 readdataメソッドはIQスコアをゲットして、配列を使って受け取り、 aboveandbelowを使って100以下か以上かを調べるようです。 皆さんの助けを必要としています。 よろしくお願いいたします! ここまではできています。 どなたか、アドバイスお願いします。 import java.io.*; import java.util.*; public class Getscores{ public static int readdata(String[] args){ int noIq, s; System.out.println("please insert the # of IQ scores:");
>>58 釣りか誤爆か、どちらにしても
ス レ 違 い で す よ。
このコードは、C++でつか? struct sockaddr_in sadd; sadd.sin_family = AF_INET;
いきなりmainに現れたこの構造体みたいなの 構造体風なのに、中身が何処にも書かれていません!
socket
ライブラリの構造体やクラスがでてくるたびに一々そんな風に驚くのか?
socket.h つーか、スレ違い。
>>61 Cでも通りそうですね。ソケットライブラリ関連でしょうか。
68 :
デフォルトの名無しさん :2005/11/08(火) 00:15:13
えらいねー (ぱちぱち
ブリブリブリブリィィィ
今日も大漁です
bisonでの構文解析器にプログラム内から文字列を渡すには どうすればいいんでしょうか
ちなみに字句解析器をflexで作ってます どちらかというとこっちのyylexに文字列で渡せればいいんですが FILE*型yyinに文字列を与える方法がよくわかりません fprintf(yyin,"hello"); としたら実行時エラーになりました
>>73 どうもありがとうございます
そんなスレがあるとは知りませんでした、と思ったら最近たったようですね
すいませんプログラム内からパーサに渡すというのは間違いですね
レクサに渡したいのです
つまり標準入力からではなく、たとえば
char* w = "hello"としてこれを対象に
字句・構文解析させたいわけです
yylvalというのはパーサ側のレセプタですよね
75 :
デフォルトの名無しさん :2005/11/08(火) 02:27:59
すいません、質問です。 区間[-0.01,0.01]の一様乱数を発生させるにはどうすればいいでしょうか。 既出だったらごめんなさい。
どの程度一様か精度を要求してるの? じゃないんだったら (double)rand()/(double)RAND_MAX*2.0-1.0 とか?
いや[-1.0:1.0]だな
>>74 いや、上の方のスレは前々からあるんだが。
ちなみに文字列をflexのyyinに渡すってのはちと難しいんで内科医?
文字列をファイルに書き出すか、自分でyylex書く(もしくはflexの出力を細工する)か、自分でFILE構造体を用意してバッファの末尾にEOFくっつけてyyinに渡すという変態的な方法を使うか。
>>78 すまん、寝ぼけてるのか演算子の優先度を取り違えてた
>>79 そうでつか・・・
flexも万能ではないですね・・・
吐き出すコードはおおよそ人外のものですし
でもいったん文字列をファイルに書き出して、というのは
作成するプログラムの性格に沿うものでもあるので
その線で言ってみます
助言、ありがとうございました
以前yylexをC++モードで生成すると ストリームを使えるから自在にディレクティブできるが bison側がC++に対応してないのであぼーん というのを見た気がする
83 :
79 :2005/11/08(火) 03:14:31
>>82 たしかに、C++のストリーム使えたならstringstreamとかで文字列→ストリームの変換が楽にできたのにね。
つーかCで文字列からストリームに変換みたいなのって何かうまいやり方あったりするのかな。
74みたいに文字列を入出力バッファとみなしてFILE*で渡したい、みたいな場合。
もしそういうの誰か知ってたら参考までに聞いておきたい。
flex は C++ 用のコードも吐けるが、それじゃダメなのか? C++ を知らんでも、それ以外の部分をほとんど C 風に書けば問題ないと思うが。
メモリ上のバイト列や文字列をファイルストリームに見立てるって関数あった気がするが。 fmemopen()とか。
>>86 BSDだとfunopen()のような関数がある。が、移植性は全く無い。
とりあえず、lexの変種によって文字列から読ませるためのやり方は全く違うようだ。
flexの場合は、YY_INPUTマクロの再定義でいけるらしい(今でもそれでいいかどうか
は知らない)。
いずれにせよPOSIXでは入力元を変更するための方法が定義されていないので、
完全に処理系依存の話になるな。
CSVファイルを読み込んで処理するプログラムを組むことに なったのですが、1バイトづつカンマを探しながら項目を取得するのと strtokのような関数を使って項目を取得するのではどっちが一般的 なんですか?また、動作環境はUNIXサーバ(Solaris)でかつCSVデータも 住所録などの2バイト文字を扱うことになるので、文字コードで 注意すべきことはあるでしょうか?
89 :
デフォルトの名無しさん :2005/11/09(水) 22:12:41
>>88 やるべきことを机上でまとめてみる
見つかった論理のうち標準関数で置き換えられるものを置き換える
ただし、信頼性にはレベルがあるので、もちろん基準を満たさないものは使わない
カンマを含むデータをどうするかによるな。
クォートとカラム内改行の両方を扱うとなると結構面倒だな まあがんがれ
処理は単純に住所録テーブルに項目ごとに格納するだけの予定です。 データ項目数は固定で、項目には必ずなんらかの値が入っていることが 前提です。最低限のチェックとしては項目長のチェックはやるつもりです。
既出だと思うが、CSVのライブラリはある。 プログラミング書法だったかプログラミング作法だったかに載っている。 ソース内の著作権表示をきちんとのこしておけば商用、非商用問わず無料でつかえる。
ようするに、一般に言うCSV形式をちゃんと扱おうには、それなりに 手間が必要で、カンマを探したりstrtok程度の関数では力不足、 発想(質問)自体が一般的でない… (制限を明確にした準(?)CSVなら ともかく。だからライブラリ探せと) 文字コードに関しては、まずは特にはCSVに限らない話そのままで…
住所録のデータは実はCSVにしづらかったりする データ中に","が出てくる可能性があるからね
パソコンの部品データもCSVにすると泣けるんだよね。 なんでこう、'"'のエスケープの仕方が複数あるんだろ。
CSVの書式を標準化しる……と思ったけどそれはXMLなのか?
CSVのクォーティングのハンドリングが面倒なだけなら、通常はTSVで十分 まータブだの改行だのには対応しとらんがな
100 :
デフォルトの名無しさん :2005/11/10(木) 10:30:16
October 2005 の RFC かよ
CVSファイルの文字列を2次元の構造に格納するのって、 新人さんのいい課題だけど それを知った上でC++のSTLを知ると、目から鱗になるんだよな vector<vector<string>> を読み書きする共通を作っておいて 後は、それぞれの実装で煮るなり焼くなりできる STLを知る前にMFCのコンテナを知ってしまった人は 廃人になるし、プロジェクトは破綻するけど
CSVだった・・・
104 :
デフォルトの名無しさん :2005/11/10(木) 20:19:35
すみません Cでtelnetでログインしてコマンド実行するのにシステムコール以外で出来るやり方って ありますか?
自前でtelnet喋る話かい?
107 :
デフォルトの名無しさん :2005/11/10(木) 21:38:31
108 :
デフォルトの名無しさん :2005/11/10(木) 21:44:41
UBS の読み取り方でも教えてやれw
それは激しく興味あり
char *array="11111111"; FILE *fout; fopen("nullpo.txt","w"); while(1){ fputs(array,fout); }; これを学校のサーバーで実行して昼食を食べてたら、怒られました。 友達に頼まれたんだけどな〜・・・
>>110 それ実行したまま席離れて放置してたのか?
俺が管理者ならそんな奴のアカウントは1週間ほど凍結する
凍結以前にうちなら使えなくなるがな。
>>105-106 どうもです
telnetで別鯖にログインしてコマンド実行した結果をプログラム内で使いたいんですよ
素直にpopenでも使います
>>110 そのコードならセグフォで落ちるから問題ないだろうがな
ネタ確定
116 :
デフォルトの名無しさん :2005/11/11(金) 02:51:31
935 名前: デフォルトの名無しさん [sage] 投稿日: 2005/11/06(日) 15:25:10 このsageない基地外なんか過去から全部同じ椰子じゃないかとまで思ってしまう。 (ネタがつまらんのが致命的にキモイ)
C言語1級のもんだい聞いていいですか?
2級のオレ様がきましたよ
119 :
simano :2005/11/12(土) 01:14:38
SN比の求め方がわかりません。 pgmファイルの求め方がわかりませんのでプログラムお願いします。 /* SN比*/ g = 0.0; f = 0.0; for (y = 0; y <= ysize ; y++){ for (x = 0; x <= xsize ; x++){ g = g + a[x][y] * a[x][y]; f = f + (a[x][y] - b[x][y]) * (a[x][y] - b[x][y]); } } h = 20 * log(sqrt(g/f)); printf(" %lf\n",h); exit(0); } まではわかります 急いでます
人に質問する方法を先ず学びたまえ。
121 :
初心者 :2005/11/12(土) 08:14:36
OSはRedHat Linux 8 なんですが、 open関数がうまく動かないんです。 int fd; //ファイル記述子 fd=open("data",O_WRONLY); printf("fd=%d\n",fd); 実行結果 fd=0 となって、戻り値が0なんです、原因が分かりません。 さらに、その後にwrite(3,"hello\n",6);とすると実際にファイル"data"に書き込めるんです つまりオープンはできているのに戻り値がおかしいんです(3となるはずが0が返る) どうしてなんでしょうか?
122 :
初心者 :2005/11/12(土) 08:41:33
121です すいません、自己解決しました。 って言うか、俺のミスでした。openは正しく動いてました。 首つってきます。さようなら
上のやつで char array[9]={'1','1','1','1','1','1','1','1','\0'}; char *array2="11111111"; って全く同じですか?
全然ちがいます。
char array[9]={'1','1','1','1','1','1','1','1','\0'}; はarrayという配列に11111111が格納されている。 char *array2="11111111"; はarray2が何処かに11111111が格納された配列が作られて それを指してる、って感じで良いんでしょうか?
char array[9]={'1','1','1','1','1','1','1','1','\0'}; char array2[]="11111111"; なら同じ。 ポインタと配列の違いはきちんと理解すべし。
配列の最後に\0はイラネ
128 :
akky :2005/11/12(土) 16:54:42
ファイル入出力わかりません だれか教えてちょうだい
とりあえず入門書嫁。
130 :
akky :2005/11/12(土) 17:13:22
おすすめの入門書って何ですか?
「推薦図書/必読書のためのスレッド」とその過去ログを漁ってこい
132 :
akky :2005/11/12(土) 17:22:41
おすすめの入門書って何ですか?
133 :
デフォルトの名無しさん :2005/11/12(土) 17:26:34
134 :
デフォルトの名無しさん :2005/11/12(土) 17:32:07
**pはどういう意味ですか?
136 :
133 :2005/11/12(土) 17:43:59
自己レス。 O_APPENDはseek位置を最後に持ってくるだけで、 O_WONLYかつO_APPEND無しで開いても上書きモードになるみたいです。 このためSEEK_ENDに移動すると元々のファイルの最後に行ってしまい、 追加書き込みのようになってしまっているようです。 stdioのように、書き込みのみで開いた場合は元々のファイルを消すにはどうしたら良いでしょうか。
138 :
デフォルトの名無しさん :2005/11/12(土) 17:49:45
すみません、教えてもらいたいのですが、 typedef struct test * test_ptr; という形で定義しているソースを見たのですが、 これはtest構造体型の領域を指しているtest_ptrポインタ という解釈でよいのでしょうか? それと、 typedef struct test *test_ptr; でも同じだと思いますが、* 半角スペース test_ptrとする 意味はあるんでしょうか?単に見た目の問題ですか?
>>138 test_ptr ::= (構造体testへのポインタ)でおk
スペース入れるのも見た目だけ
140 :
sage :2005/11/12(土) 17:59:26
>>139 どうもありがとうございます。
たぶん見た目だけなんだろうと思いつつもモヤモヤしたものが
あって気持ち悪かったので聞いてみました。
助かりました。
>>139 って
test構造体を指すポインタの名前をtest_ptrとtypedefしたから
test_ptr ptr
と書いたらptrはtest構造体を指すポインタ
という感じですよね?
>>130 この板の類似スレだと、
『Cの絵本』
『猫でもわかるC言語プログラミング』
『やさしいC』
辺りを推す奴が多いな。
ちなみに、俺は上の2冊しか読んだことないが、その2冊の内ならば絵本の方をお勧めしておく。(あくまでも初学者向け&俺の主観)
ただ、できることなら、プログラミング学習の最初の段階は、分かる人に(オフラインで)教わりながらの方が良いと思うけど。
なんとあるクラス(Aとします)のpublicな静的int型変数(Bとします)を プログラムの実行前に初期化(例A::B=1)してもプログラム中にA::Bの値を参照すると0になっています。 これだけでもよくわからない(実際同様に使っているA::CやA::Dに代入した値は問題ない)のですが さらに変数名をDに変えるだけで問題なくなりました。 環境はVC.netです。 原因誰か教えていただけるでしょうか?
それC言語じゃないだろ
うーん、問題がCの問題なのかVCの問題なのかすらよくわからないのでこちらで聞きました。
C++?
変数や関数の文字長って実行時の処理に影響するんですか?
もうちょっと理解しやすい質問にしてください
>>149 コンパイラなら全く影響しない。
Cインタプリタとかあったら知らんが。
153 :
149 :2005/11/13(日) 00:16:03
>>151 失礼しました。
例えば、関数の文字長が長かったら、呼び出しに時間が掛かる等の影響を受けるかと訊きたかったんです。
>>150 ,152
影響しないのですか。
回答ありがとうございました。
>>153 プログラムがどういうふうに実行されているのか調べてみれ
>>154 機械語レベルで見ろということですよね?
調べてみます。
156 :
デフォルトの名無しさん :2005/11/13(日) 00:40:08
しーらC
157 :
デフォルトの名無しさん :2005/11/13(日) 03:54:47
fork(); printf("Hi!\n"); ↑このプログラムはどういう出力をするんですか? いまC言語が使える環境にないのでどなたかおしえてください
コンパイルエラーになります。
159 :
デフォルトの名無しさん :2005/11/13(日) 04:03:35
C++のストリームからファイルポインタに変換するような機能ってありますか?
161 :
デフォルトの名無しさん :2005/11/13(日) 04:41:46
execl という関数はUnix のどのようなコマンドを実行しているか. という問題が出たんですがこの問題だけ どうしてもわかりません。 どなたか教えてください
何もかもがスレ違い
164 :
デフォルトの名無しさん :2005/11/13(日) 04:49:59
結局どのコマンドつかってるん?
166 :
デフォルトの名無しさん :2005/11/13(日) 16:56:27
WindowsでVC++6.0です。 unistd.h がないといわれるんですが、どうすればいいですか ?
諦める
fgetsからsscanfで読み込んだ文字列の長さを計るのは どうしたらいいですか? strlenは最後の\0を見つけて長さを計ると思いますが sscanfで読んだ文字列は\0がついてないのでどうすればいいのやら
>>168 > sscanfで読んだ文字列は\0がついてない
ついてるだろ
そもそも「文字列」と自分で言っているじゃないか
fgetsからsscanfで読み込んだ文字列って意味わからん
fgets で一行切り出して、 それを使って sscanf するだけじゃないのよ。
>>168 末尾が改行+\0になってる事に対処できないのか?
すいません、表現がまずかったみたいで; "abc def\n"をfgetsで読み込んで sscanf(*,"%s",b)すると char*bにはabc\0が入るってことですか? strlen(b)って書くとlintでwarningが出るんで これがまずいのかとおもったんでつ
ポインタの実体が無いという警告なんじゃないか……?
>>174 ポインタと配列を理解しろ。
メモリを意識しろ。
>>175 ,176
3x.何となく分かりますた
char b[256]ってすればおkってことですね
もしかして非常にまずい事をしていたのかも(汗)
もしかしなくても非常にまずい事をしてた。
179 :
デフォルトの名無しさん :2005/11/13(日) 23:40:24
C99を勉強中です restrict修飾子したポインタは 対象ポインタのエイリアスがない事をコンパイラが保障してくれるわけではなく、 コンパイラに最適化のヒントを与えるだけ という認識でいいんでしょうか
>>179 コンパイラが保障するんじゃなくてコードを書く奴が保障する。
それによって最適化してくれるかもしれないよってこと。
>>180 ありがとうございます
よく考えたら
>対象ポインタのエイリアスがない事をコンパイラが保障
なんてコンパイル時点でわからない事が多いすよね
182 :
デフォルトの名無しさん :2005/11/13(日) 23:57:21
exeの中にフォルダを作る方法ってありますか?
eフォルダxe
184 :
デフォルトの名無しさん :2005/11/14(月) 00:06:58
>>183 レスありがと。
具体例をあげると、プログラミング練習用のタイピングゲームを
つくろうとしてるんだけど、スペックとしてプレイヤーが題材を
作れる仕様。
でも、dll & path は好みでない。
>>184 おまえは多分色々わかってない
これからこのスレの善良なエスパーが色々質問すると思うので
答える準備をしておこう
186 :
デフォルトの名無しさん :2005/11/14(月) 00:09:44
NTFS副ストリーム、と言ってみる。
188 :
デフォルトの名無しさん :2005/11/14(月) 00:18:10
アウトプロセスサーバ? わかりません。 独立したアプリに後付けのファイルをリンクさせたい というのは、矛盾してるのかな?
フォルダのアイコンを用いる、エクスプローラを 完全にエミュレートするようなプログラムを書く。
190 :
デフォルトの名無しさん :2005/11/14(月) 00:21:56
フォルダのアイコンを用いる、エクスプローラを 完全にエミュレートするようなプログラムを書く。 (注)dll & path は好みでない。
フォルダのアイコンを用いる、エクスプローラを 完全にエミュレートするようなプログラムを書く。 (注)dll & path は好みでない。 独立したアプリに後付けのファイルをリンクさせる。 (注)矛盾してはいけない。
192 :
デフォルトの名無しさん :2005/11/14(月) 00:30:10
そーだね、とりあえずデルパスでつくって プレイヤーがスーパーハッカーとなり 書き換えてくれるのを期待しよう。 おさわがせしました。
(注)あんま弄るな
DLLのかわりにCOMやらSOAPを使う、データはすべてレジストリに保存する。
195 :
デフォルトの名無しさん :2005/11/14(月) 00:40:18
>>194 おおっ!COM!
SOAPは、ぱっと見ちがうかな。
今から勉強しなおして良い物をつくっちゃ。
本当にありがと!
おいおいCOMはDL(ry
>>196 いやいや、exeでもCOM作れますよ
とその前に質問者
>>184 の妄想ではexe内にデータを持たせてと考えているようだけど
ユーザーからの入力でデータを書き換える物を実行プログラム内に持たせるというのは余り良い設計とはいえ無い
通常は別ファイルとして提供する
そのファイルの形式を複数ファイルのアーカイブした形にするのか、1ファイルで内部のデータ構造で実現するのかといった所を検討すべき
俺は内部的にほとんどStringとintで持てるデータばっかし扱うんでテキストファイルで吐いたりしてるが あんまり中身見られても面白くないんで、CAB or LZHファイルからの読み書き考えようかな。 ZIPって再圧縮はできてもアーカイブから1ファイルだけ削除とかできなかったよな。
バカは黙ってていただきたい
Macの実行バイナリってのは実はディレクトリ構造で、内部にプログラム本体や GUIリソース、設定ファイルを内包できる。だから1ファイル(に見えるディレクトリツリー)を移動するだけで インスコ&アンインスコができる。 EXEの前や後ろのほうにデータを付け足していくプログラムって、ウィルスが現にそれやってるから 可能ではあるんだけど、気持ち悪い罠。
自分の環境だとfloat型のNaNは 0x7f800000みたいなんですけど これってC言語の仕様ですか?
>>200 Macの場合はって事でしょ
Winの世界ではユーザーが更新できるデータは余り実行形式の中には置かない
もちろん更新しないデータはリソースの形で内部に持つ事もある
自己書き換えするプログラムもあるが実行中はロックがかかっていたりするので色々とめんどくさい
構造体内のメンバへのポインタって可能でうっか?
206 :
デフォルトの名無しさん :2005/11/14(月) 02:19:41
聞く前に自分でサンプルコードを書いてみようぜ。
2つの文字列を入力して、ASCII文字順の早い方を表示させるプログラムなんですが、 #include<stdio.h> #define N 80 int main(){ int a; char word1[N],word2[N]; char *p1,*p2; p1 = word1 ; p2 = word2; fgets(p1, N, stdin), fgets(p2, N, stdin); for(; *p1 && *p1 == *p2 ; p1++ , p2++); a = *p1 - *p2; if(a <= 0) printf("%s\n",word1); else printf("%s\n",word2); } char と char * で文字を置いてるんですが、*を使わないでできる方法はありませんか? あと、 for(; *p1 && *p1 == *p2 ; p1++ , p2++); a = *p1 - *p2; なぜ *p1 && *p1 == *p2 としてるのか分からないのですが、教えてくださいませ
*p1 != 0 の超カッコイイ書き方が *p1 ちなみに 配列→ポインタ の超かっこいい書き方は char* p1 = (char *)&word1[0]; 役に立つから覚えておけい。
>>209 もしp1とp2に全く同じ文字列を与えたら、
文字の終端('\0')まで一致しちゃって最悪止まらなくなるから、
終端であれば無条件で終了させるようにしている(*p1)んじゃないかな
使用ツールはVC++6.0とDXライブラリです。 Win 32 Apprication → 空のプロジェクトで開始。 select.hの中に構造体を二つ書きました struct senshi{ char name[ 20 ] ; int hp ; int sm ;int sp ;int str ;int vit ;int mid ;int tokushu1; } ; struct senshi heisi = { "兵士" , 1000 , 80 , 5 , 4 , 4 , 6 , 1 } ; struct senshi kyoukaheisi = { "強化兵士" , 1800 , 140 , 8 , 5 , 6 , 6 , 0 } ; などなど struct skill{ char name[ 40 ] ;int damageValue ;int rt ;int smConsumption ;int hit ;int tokushu1 ; } ; struct waza heisi_1 = { "切る" , 2 , 5 , 0 , 3 , 0 } ; struct waza heisi_2 = { "回復" , 1 , 5 , 0 , 6 , 4 } struct waza kyoukaheisi_1 = { "切る" , 2 , 5 , 0 , 3 , 0 } ; struct waza kyoukaheisi_2 = { "回復" , 1 , 5 , 0 , 6 , 4 } などなど このヘッダファイルを二つの4つのcppで #include "Select.h"こうして インクルードしています。実際に構造体を変数に代入したりしているのは二つのcppだけです。 最初は、エラーが出てそのまま何も弄らずに続けて CTRL + F5 でコンパイルするとなぜかエラーが無くなって実行されて、 名前とかもちゃんと表示されていたんですが、構造体の変数(?)をたくさん他の変数に代入しているうちに エラーがたくさん出るようになり。何度実行してもエラーが取れなくなりました。 エラーはこういうのです。 char_select.obj : error LNK2005: "struct skill heisi_2" (?heisi_2@@3Uskill@@A) はすでに Battle.obj で定義されています どうやったらエラーを回避できるんでしょうか? なんとかこのヘッダファイルから構造体を読み込みたいんですが・・・
>>214 ヘッダのグローバル変数の定義を全てselect.cあたりに移し、
ヘッダでは
extern struct senshi heisi;
extern struct senshi kyoukaheisi;
のように宣言すればいい
変数の初期化はヘッダでやっちゃ駄目。実体の初期化はCソース本体で。 同じ名前のグローバル変数がファイルごとに宣言されてるわけよ、今の状況。 まぁ藤藁某のCプログラミング診断室でも嫁や。 C++でやってるんならクラスで表現したほうがエレガントだけどな。 引数テンプレートかなんかで。 あと、構造体を書き換えしない&プログラム実体に重複するデータが存在してもいいなら、 static constにやっちゃうのも有り。
>>215 : error C2027: 認識できない型 'skill' が使われています。
: 'skill' の宣言を確認してください。
というエラーが出てダメでした。
>>216 static struct にしたらエラーがなくなりました 半日ぶりにプログラムが動きました
皆さんありがとうございました。
クラスとか良くわかって無いので勉強します
インクルードってのが何をしてる作業なのか ちゃんと理解しないことにはダメやね。
えーと 宣言の集まりみたいなもんですか? よそで定義したものを参照できるための あと#defineのマクロ、定数とか?
>>217 このスレ的にはおまえは大きな間違いをしている。
Cにはクラスはない。
すみません、今ソートの部分で索引(index)をプログラムに追加する宿題が出ているのですが、 索引について詳しく解説しているページは無いでしょうか? 授業で扱われていないのに宿題に出たので困惑しているところです…
>>219 違う。
分割コンパイルと合わせてプリプロセッサを勉強し直せ。
224 :
初心者 :2005/11/14(月) 13:38:22
突然の書き込み失礼します。rand関数を使ってリスト構造を作っている最中なんですが、重複しないで乱数を格納していきたいのですが・・・ 考えても考えてもうまくできないのです。↓は途中のソースコードです。 #include<stdio.h> #include<stdlib.h> #include<time.h> typedef struct list{ int data;/*値*/ int key;/*位置*/ struct list *next; }LIST; int main(void){ int i,j,target; LIST *p,*n,*tail,*prev,*hd=NULL; hd=(LIST*)malloc(sizeof(LIST)); tail=(LIST*)malloc(sizeof(LIST)); hd->next=tail; tail->next=NULL; target=0; srand((unsigned)time(NULL)); for(i=0;i<10;i++){ LIST *n; n=(LIST*)malloc(sizeof(LIST)); n->data=rand()%100; n->key=10-i; n->next=hd; hd=n; /*重複判定*/ ( 1) } } (1)をどう書けばいいんでしょうか? わからないので指導 よろしくお願いします。
>>224 スレ違い。
つーか、いろんなことを一遍に実装しようとせず、一つずつこなした方がいい。
あんたは未だそんなレベルジャマイカ。
リスト構造なんて背伸びしないで普通に作ってみたらどうだ?
#で、以降の質問はC学習スレなり初心者スレなり肌に合いそうなところを探すといい。
先頭から順に比較していけばいいじゃねーか リスト構造自体をあんまり理解してないみたいだな
>>225 〜226
もう一度、ガンバってみます。
ありがとうございました。
228 :
デフォルトの名無しさん :2005/11/14(月) 21:31:25
リストか・・・ 「初心者」には秀逸な練習ネタだな そんくらいのは凝りすぎてなんかいないよ 問題を分離して少しずつ考えるのは、初心者ではなくなってからでいい 本当に「初心者」のうちはいっぺんに考えられる頭の基礎体力をつけたほうがいい システム全体を見通す発想力は失ったあとではなかなか治らないから
229 :
デフォルトの名無しさん :2005/11/14(月) 21:42:52
ジャンケンゲームをつくってみたんですが 1 を入力しても時々「0〜2で入力してください」とでます。 その理由がわからないのですが、誰か教えてくれませんでしょうか。 ソースです↓ #include <stdio.h> #include <time.h> int main() { int jibun; int times; int cp; printf("ジャンケンゲームです "); while(1){ times = time(NULL); cp = times % 3; printf("どれか入力してください(0.グー 1.チョキ 2.パー)..."); scanf("%d",&jibun); if ((jibun == cp)) {printf("アイコです "); continue;} if ((jibun == 0) && (jibun != cp) && (cp == 1)) {printf("あなたの勝ちです"); break;} if ((jibun == 0) && (jibun != cp) && (cp == 2)) {printf("あなたの負けです"); break;} if ((jibun == 1) && (jibun != cp) && (cp == 2)) {printf("あなたの勝ちです"); break;} if ((jibun == 1) && (jibun != cp) && (cp == 1)) {printf("あなたの負けです"); break;} if ((jibun == 2) && (jibun != cp) && (cp == 0)) {printf("あなたの勝ちです"); break;} if ((jibun == 2) && (jibun != cp) && (cp == 1)) {printf("あなたの負けです"); break;} else {printf("0〜2で選んでください\n"); continue;} } return 0; }
トンカツは?
231 :
sage :2005/11/14(月) 21:45:56
すいません・・・書き込んだ後気づきました・・・ × if ((jibun == 1) && (jibun != cp) && (cp == 1)) {printf("あなたの負けです"); break;} ○ if ((jibun == 1) && (jibun != cp) && (cp == 0)) {printf("あなたの負けです"); break;} こんだけだったみたいです・・・ すいませんでした・・
論理性の欠片もないコードだな。
御前等exit()を使うときは#include<stdlib.h>を忘れないようにね でないと returm9(^ω^)プギャってされちゃうよ
暗黙の宣言使えば別に#include要らないじゃん。
235 :
デフォルトの名無しさん :2005/11/14(月) 23:32:00
典型的なプギャ返しだなw
237 :
デフォルトの名無しさん :2005/11/14(月) 23:38:29
さあ話をそらしにかかりました
239 :
デフォルトの名無しさん :2005/11/14(月) 23:40:55
(・∀・)ニヤニヤ
240 :
デフォルトの名無しさん :2005/11/14(月) 23:41:37
>オブジェクト指向ではみんなそうなってる
>>239 ちょwwwwwマジだってwwwwww
243 :
デフォルトの名無しさん :2005/11/14(月) 23:45:46
main() { extern i, puts, exit; for( ; i < 10; i++) puts("afo"); exit(0); } i 0;
>>237 935 名前: デフォルトの名無しさん [sage] 投稿日: 2005/11/06(日) 15:25:10
このsageない基地外なんか過去から全部同じ椰子じゃないかとまで思ってしまう。
(ネタがつまらんのが致命的にキモイ)
245 :
デフォルトの名無しさん :2005/11/14(月) 23:47:46
必死だなw
246 :
237 :2005/11/14(月) 23:50:22
かかってこいや!!!(・∀・)イライラwwwww.majam.org/p/pr/pview.cgi?p=uZmwc3EgqKoZZtM8s9HdeY
247 :
デフォルトの名無しさん :2005/11/14(月) 23:53:39
御前等exit()を使うときは#include<stdlib.h>を忘れないようにね 御前等exit()を使うときは#include<stdlib.h>を忘れないようにね 御前等exit()を使うときは#include<stdlib.h>を忘れないようにね 御前等exit()を使うときは#include<stdlib.h>を忘れないようにね 御前等exit()を使うときは#include<stdlib.h>を忘れないようにね
248 :
デフォルトの名無しさん :2005/11/14(月) 23:56:55
Lv0: 報告のみ Lv1: 自動訂正あり(出力あり) Lv2: 翻訳中止(出力なし) Lv3: 処理系が異常な状態に陥った(出力不定) さて #include しなかった場合の「ぷぎゃ」はレベルいくつだろうw
249 :
みずき ◆WnmizUKIg6 :2005/11/14(月) 23:57:21 BE:74691825-##
#include <stdio.h> #include <stdlib.h> int main() { int i , flg = 0; exit(); return 0; } これでおk?
>>249 ヒント:
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
exitなんて使ってる時点で低能
253 :
デフォルトの名無しさん :2005/11/15(火) 00:23:24
祭り会場と聞いて駆けつけますた
_exit(main(argc, argv));
257 :
デフォルトの名無しさん :2005/11/15(火) 00:34:04
atexit(main);
分かった俺の負けだ。正直そこまで考慮にいれていなかった
262 :
デフォルトの名無しさん :2005/11/15(火) 01:12:46
いや、勝ち負けの問題じゃないよ。 こういう遣り取りは周りも知識の獲得になるし、我々も再確認になるからね。
263 :
デフォルトの名無しさん :2005/11/15(火) 01:21:22
fgetsで末尾が改行にならない手順をおしえろ 環境はwindowsです よろしくお願いします
>>263 fgets(buf, BUFFER, fp);
sscanf(buf, "%s\n", line);
あんまりいい方法じゃないと思うけど。
( ゚д゚)カポーン
fgets(buf, BUFFER, fp); buf[strcspn(buf, "\n")] = '\0';
ハァ?
っ [cin.getline]
size_t size; fgets(buf, BUFSIZE, fp); size = strlen(buf); if(buf[size - 1] == '\n') { buf[size - 1] = '\0'; }
改行があっても読み込みが止まらないfgetsは無いですか? \0があったときだけ止まって欲しいです
そのくらい自作しなさい getcharでも使って
fgetsって頭悪いよね、なんで戻り値が引数で渡した文字列そのまんまなんだよw 普通は読み出したサイズを返すべきだろw むかついたからfgetsのソースを書き換えて戻り値を読み出した文字数に換えてやったさwww
標準化委員会ってなぜ使わない(使い物にならない)関数をずっと大事にしてるの? 互換性のためならそれはそれで残しておいて新しい関数を追加すればいいのに
新しい関数を追加したら、それはそれで互換性の問題が出るでしょ。
なるほど効率を捨てて互換性を取るというわけですか
fgets.cを見ながら書き換えるだけ
つか、標準関数なんて書き換えるなよ。 新しい関数作ればいいだろ?
そっか
282 :
デフォルトの名無しさん :2005/11/15(火) 09:06:10
CからFortranのライブラリを呼び出したいのですが、 具体的な方法が分かりません。 自分はVisualC++6.0を使っています。できれば無料、Unixなどを 使わずWindowsでできる方法があればと思っているのですが・・・ おおまかに教えてもらえれば残りは自分で調べますのでヒントを おねがいします。
283 :
デフォルトの名無しさん :2005/11/15(火) 09:09:22
質問です。 malloc()したポインタをfree()すると それはポインタの宣言された変数から領域を切り離すのか、領域そのものを開放するのか どちらなのでしょうか? 例えば int *ptr; int *ptr2; ptr=(int *)malloc(sizeof(int)); ptr2=ptr; free(ptr); ptr2++; とかは可能なのでしょうか? これを実行してみましたが、すんなり動いてしまいました。 規格どおりなのか、たまたまなのかわからないんです・・・。
284 :
283 :2005/11/15(火) 09:10:53
間違えました・・・ ptr2++;ではなく*ptr++; です。すみません、、、
285 :
283 :2005/11/15(火) 09:11:26
*ptr++;ではなく、*ptr2++;でした。。。。 何度もすみません。。。
たまたま
>>283 明らかにやばいです。
malloc()でヒープから確保されたメモリはfree()の時点で未使用になっています。
解放直後は正しく動いているように見えても、他の場所でmalloc()を使うと、
ptr2と同じ場所にメモリを確保する可能性があるということです。
>>282 f2c を使うのが一番簡単かと。
Windows でタダの FORTRAN コンパイラは、
おそらく MinGW の g77 しかないと思うけど、
オブジェクトファイルの形式が
g77 (ELF) と VC++ (COFF) とで違うから面倒臭い。
289 :
デフォルトの名無しさん :2005/11/15(火) 10:05:58
f2c が一番手間要らずかと。
MinGWはELFじゃないですぞ?
お? COFF だっけ?
>>285 多分、*ptr2++で、ptr2の指す数値を++するつもりだと思いますが、
これだとポインタが++されてしまいます。
正しくは(*ptr2)++;としないとダメ。
ちがうよ COFFEEだよ
295 :
↑ :2005/11/15(火) 12:18:02
タイミングがずれてしまったorz スルーよろしく ・・・・・・・・・・・・・くだらなくてすみません
>>282 纏めるとこんな感じかな。
・Fortranのライブラリのソースがある。
→f2cを使ってみてはどうか。以下、環境依存OKスレへ。
・MinGWのg77でコンパイルされたライブラリモジュールしかない。
→MinGWライブラリをVC6から呼び出す。以下、MinGW関連スレへ。
・静的ライブラリではなくDLLしかない。
→DLL呼び出し用の定義ファイルを作ればいい。以下、VC関連スレへ。
>>295 ご愁傷様。
>>293 それ以前の問題があるんだから的外れなこと書くまでもないでしょ。
しがない大学生です。 単刀直入なのですが、C言語を用いて 外部プログラムを呼び出したりすることって できますか? 私はSPICEというプログラムを呼び出して ネットリストを読み込ませたいのですが、 SPICEを何度も呼び出す(引数を何度も渡すってことでも可) ので繰り返しが得意なプログラムを利用しようと思いまして。 さいわい、SPICEはコマンドラインみたいになっているので ネットリストの読み込みはできそうですが、 一連の操作をするプログラムをどうしたものか・・・。 いろいろ調べたところPERLという言語なんかはできるみたいに 書いてあるのですが、UNIXをしようしているので 環境の設定などもあり、またプログラムをCから はじめてやっと好きになってきたころなので まだまだCで何ができるかしりたくて。 スキルなどありませんが、参考書は独習Cです。 どなたかよろしくおねがいします。
>>297 Cでなくてもバッチで済みそうな気がするし、PerlをWindowsで動かしてもいいだろう。
そうしたければExcelからVBAを使ってもいいし、手段は色々ある。
もし、Cでやってみたいのなら書籍に当たってみよう。
system()関数ならC言語の標準関数だし、popen()もポピュラーな環境なら使えるはずだ。
調べてみて判らなくなったら初心者スレで聞いてみるといい。
299 :
297 :2005/11/15(火) 16:59:18
ありがとうございます! SYSTEM関数などについてチャックして見ます! あとUNIXを使用しているのでバッチというご意見から シェルスクリプトというのも調べてみます。 ありがとうござました。
なんだ、Unix使いだったのか。 Windows用のPerlを知らないWin使いかと思ってしまった。 だったら素直にmanで調べればいいね。
[問題4/中級]文字列 MOJI に代入されている文字の中から、数字(0から9)だけ を取り出して、それを小さい順に表示するプログラムを作りなさい。 例えば、MOJI[]="9B2C3ADC31" ならば 12339 と表示する。 と 「問題6/上級]次の問題の中から、どれか1つを選び、プログラムを作成して答えを 求めなさい。 (問題6−1)太郎君が9歳になるまで,花子さんの年齢が太郎君の年齢の整数倍にな る年がちょうど7回ある。このとき、太郎君と花子さんの年齢差はいくつか? 解答ヨロシクお願いします。自分お手上げです(泣
>1 すら読まない
>>301 にもお手上げです(呆
304 :
デフォルトの名無しさん :2005/11/15(火) 20:34:21
C言語勉強中の中学生です。 いきなり質問なのですが、xミリ秒経過するのを待つやつなんですが int sleep(unsigned long x) { clock_t c , s = clock(); do { if ((c = clock()) == (clock_t)-1) return 0; }while (1000UL * (c - s) / CLOCKS_PER_SEC < x); return 1; } これの 1000UL ってなんなのでしょうか? 良かったら教えてください orz
unsigned long
わざわざUL付ける意味あるか?
オーバーフロー対策。 普通オーバーフローしないじゃんと言っても、 予想外の出来事が起こればありうる。 あとは、clock_t ってのがプリミティブ型で何型なのか分からないが、 とりあえず UL 付けとけば < の型チェック警告を抑制できる。
後段はまぁいいとして、前段は間違い。
long が8バイトの環境もあろうぜ。 gcc の古い奴とかそうじゃなかったっけ?
10000は暗黙の格上げされるだけだから、ULつける意味はないね。
流れ読まずに質問ですみません。IEEE1394の通信をOver Ethenetさせたく思い、それの開発に適した言語を学ぼうと思っています。
IEEE1394の通信をLANに参加させたりすることができればIEEE1394通信に対応したゲームなどをイーサネットからVPNを組み、
ブロードバンドを利用して遠距離にいる人との通信対戦などが可能になるのではと考えました。
VPNを組むソフトとしてはSoftEtherを考えています。(
ttp://www.softether.com/jp/vpn2/ )
このソフトはC言語で記述されているそうなので親和性があがるかと思いこのスレに質問させていただきました。
他に適した言語やスレッドがありましたらそちらに誘導していただけると幸いです。
このようなソフトの開発に参考になるような書籍やWebサイトがありましたらレスをお願いいたします。
流れは読まなくてもいいから
タイトルと
>>1 を読め
>>312 おもしろそうではあるけど今から言語を学ぼうとしているであろう
>>312 が一人でそのソフトを開発するには
途方もない時間と根気がないとむりかと。
>>312 標準で出来るだろ
Windows舐めんな
1394 over Ethernet?なんじゃそりゃ。 IEEE1394通信に対応したゲーム、ってなんだそりゃ。
317 :
314 :2005/11/16(水) 07:14:39
>>315 マジかよ。恥ずかしいこといっちゃったじゃマイカ。
>>315 それは、IP over 1394じゃなくて?
Windows しか使ってない人って自分の環境をちゃんと書かないよな。
IEEE1394まで読んだ。
312です。
>>313 さんの指摘通り開発に際してのアドバイスなどとしてはスレ違いだったようです。読解力が足りず申し訳ございません。
>>315 XPのブリッジ接続などを使うのでしょうか。無知ながらそのあたりは試してみたのですが、よければ詳しく方法を教えていただけないでしょうか。
>>316 言葉足らずですみません。家庭用ゲーム機PlayStationのソフトを指していました>ゲーム
IEEE1394通信を使って二台以上のハードを用いた対戦が可能となっているソフトが存在し、このIEEE1394の通信をインターネット越しに行わせる(IEEE1394のネットワーク形式をEthernetにする)ソフトを作ろうと思っていました。
>>319 お察しの通りWindowsXPpro SP2をメインに使用しています。他にはサーバー用途に使っているLinuxがありますが、子供が牛乳をぶっかけたりしているため不調です。
以下の二つの機能を実装すればいいんじゃ? ・IEEE1394のデータを拾って、IPネットワークに乗せる。 ・IPネットワークのデータを拾って、IEEE1394に乗せる。
まぁ、遅延が発生するだろうからゲームが正常稼働するかは怪しいけどな。
誘導してくれるまで居座っちゃうぞ、という事か?
>>323 具体的なアドバイスありがとうございます。
仕事の片手間では何年かかるかといった感じですが少しずつがんばっていきたいと思います。
>>324 そうですね、やはり例えソフトができたとしてもラグや通信エラーによる切断が多そうです。
>>325 すみません、ちょっと長く居すぎでした。
シェルソートのhの系列で最も良いものは解明されていませんが、 h=h*3+1が一般的に良いとされています。これには何か理由があるのでしょうか?
>>326 一応マジレスすると、Interface誌のバックナンバーで
Ethernetドライバの作成を解説したものや、
IEEE1394を特集したものを読むと概略は分かるかと。
Ethernetはドライバまで見なくても、普通にソケットレベルのI/Oでいいんじゃないか?
ただのブリッジならそうだね
331 :
デフォルトの名無しさん :2005/11/17(木) 01:26:35
無理です
333 :
331 :2005/11/17(木) 01:48:49
そうですか・・・残念です。
UNKO_SIZE(30) #include "hoge.h" hoge.h にはグローバル変数 char g_unko[XXX] があります。 インクルードする前に、UNKO_SIZE(30)と記述があれば、XXX が30に置き換わり、 そうでない場合は、デフォルトの 32と置き換えるようマクロを組みたいのですが、 不可能なのでしょうか?
可能
#ifdefとか
>>334 素直に
#define XXX 30
ではいかんのけ?
>>334 そもそもそんなギミックが必要となる設計自体に疑問を感じる。
>>338 あなたの感想はどうでもいいです。
不可能かどうかが知りたいのです。
>>340 自分が答えられないと、人を池沼呼ばわりですか?
>>338 コンパイル時にパラメタを決定する場合などでは、よく使う手法ですね。
>>338 こんなの一般的な設計だろ。
#define UNKO_SIZE 30
#ifdef UNKO_SIZE
const int XXX = UNKO_SIZE;
#else
const int XXX = 32;
#endif
UNKOっていう名前はどうにかならんもんかな
Windows.hなんかでよく使ってるね
windows.hってほとんどインクルードの筈だが(w
うんうん windows.hの中身を見てビックリしたよ UNKOとか一杯書いてあるし・・・
grep UNKO *.h
0U とか 1U ってどういう意味ですか?
351 :
350 :2005/11/18(金) 14:41:37
すんません、自己解決しました。 unsigned int型の1とか0
ファイル操作に関する質問です。 あるプログラムで入力した文字列を あるファイルの名前にする方法とかってありますか? もちろんOSでリネームするときも同じようなこと してるんだと思いますが FOPEN とか SYSTEM関数で引数に変数指定できないように思って よろしくおねがいします・
>>352 char * p = "foo";
fopen(p, "r");
したいのか、
char buf[200];
sprintf(buf, "mv %s %s", p, "bar");
system(buf);
したいのか、どっちみち初心者スレにでも行ってくれ。
#つーか、関数名を大文字にするなや。
mouasgfirejgtreag re gregreger gregggggggqegreg eryg45r3gr5g5rregtr qetaq4w3gtifa4q3igt4i3g qatgr4jigjoi45joijrti4r で出来るはず。
355 :
352 :2005/11/18(金) 16:22:45
おお。上の方法でできました。 ついでにsprintfについても知れてよかったです。 こんなのさがしてたんだ。 サンクス
fopen(argv[1], "r")とか見たこと無いのか?
上の方法って、まさか
>>354 ?
これってどの形式でエンコードされてるの?
たぶん猫デコーダでソースになるはず
>>354 ワロタ
凄いなコレ
最初全然意味わからん買った
猫デコーダって何? グーグル先生も知らないようだが
362 :
デフォルトの名無しさん :2005/11/20(日) 02:27:09
realloc()関数についての質問です。 char *p; p = (char*)malloc(10); strcpy(p, "aaa"); p = realloc(p, 20); とやった時に、realloc の引数に渡された p のメモリー領域と realloc 後の p は異なる場合があり得ると思いますが、その際 realloc に渡された引数の方の p の領域はfree()される事は 保証されてるのでしょうか?つまり、上の場合その都度 p2 = realloc(p1, 20); free(p1); とかやらなくてよくて、最後に、free(p) しとけば良いという事に なりますか?
>>362 それでいい。
ISO/IEC 9899:1999 7.20.3.4 The realloc function 2
The realloc function deallocates the old object pointed to by ptr
and returns a pointer to a new object that has the size specified by size.
>>363 9899:1999ってC99の規格じゃないの?ANSI-Cの質問だと思うのだが。
ANSIってアメリカローカルの規格だと思った。 日本ならJISだが、C99はJISでも規格化されてる。C#すらあるくらいだからな。
realloc の話題多いですね ややこしいから使わなきゃいいのに
というかreallocはやることが多杉るんだよな 典型的なダメ関数
リアルロックは誠にお塩学先生のような関数ですね
>>362 別件だけど・・・・
p = realloc(p, 20);
もしreallocが新しく20を確保できなかった場合NULLを返す
pにはNULLが代入されるがもともとのpはどこからも参照されなくなる
で、p = realloc(p, 0); という、実質freeに相当する使い方も許している(FAQ参照)。 この場合は必ずNULLが返るはず。
ホント、見れば見るほどダメな設計だなw>realloc
いやでもこれ以外にあまりやりようが無いだろ realloc(&p, 20); として戻り値は成否だけ返すほうがいいかな うーん・・・難しいぞ
>>369 マジかよ、
じゃあ、予めpは別のポインタ変数にポインタをコピーしてバックアップとっとけって話?
まあそうだけど reallocに失敗した(==メモリが足りない)プログラムで そのまま実行を継続するのか、という話もある。 終了するつもりなら、多少リークしてても問題ないわけだし。
375 :
まゆ :2005/11/20(日) 07:19:28
おはようござぃますw プログラミング学校でゃってるんですヶド、わからなぃので質問させて下さぃ 問題です↓ 実数型変数a, b を宣言し,和と差を計算して,結果を画面に表示するプログラムを考える. このとき,ポインタ変数 *pwa, *psa をmain関数内で準備し, 関数 wasa に a, b, &pwa, &psa を引数として渡して, 関数 wasa 内で「アドレス内のデータ」として和と差を計算せよ. アドバイス等ぁったら是非お願いしますw
>>375 アドバイスか・・・。そうだな・・・、自分でやれ。
378 :
デフォルトの名無しさん :2005/11/20(日) 08:41:43
アドバイスぐらいちゃんとやってやれよ。 で、そんなことも解らないのなら、 プログラミング学校に行くこと自体見直してみては? 向いてない。
>>375 とりあえず、今自分で出来る範囲を間違ってても良いから書いて見れ。
どの範囲まで出来て、どこが分からないのか把握できないと、アドバイスのしようがない。
380 :
デフォルトの名無しさん :2005/11/20(日) 08:46:16
>>375 まず教官をジャーマンスープレックスか茹ですぎ卍固めにすることからだな
アドレスにデータはない、これがわかっている人を探せ
381 :
378 :2005/11/20(日) 08:51:49
しょうがない。あんまりにも自分のつっこみが厳しかったので助けるか。 >このとき,ポインタ変数 *pwa, *psa をmain関数内で準備し, ここがおかしい。ポインタ=代名詞みたいなもの。 「あの実数」「この実数」みたいにいえるけど、実体は存在しない。 double *pwa,*psaと宣言してしまうと、 >関数 wasa に a, b, &pwa, &psa を引数として渡して, &pwaは(pwaが指定している実数値へのポインタ)のポインタになる。 これでは正常動作しない。 main関数でpwa、psaを宣言し、 wasaにそのポインタを指定してやるのが正しい。 とりあえず問題・解説か学校見直してくれ。
int main(void){ >実数型変数a, b を宣言し, int a,b; >このとき,ポインタ変数 *pwa, *psa をmain関数内で準備し, int *pwa, *psa; >関数 wasa に a, b, &pwa, &psa を引数として渡して, wasa(a, b, &pwa , &psa); return 0; } >関数 wasa 内で「アドレス内のデータ」として和と差を計算せよ. void wasa(int a, int b, int **pwa, int **psa){ **pwa=a+b; **psa=a-b; >和と差を計算して,結果を画面に表示するプログラムを考える. printf("和%d, 差%d\n",**pwa, **psa); } なんか値渡し(**)が謎なプログラムだな? 何の意図があるんだ?w
383 :
382 :2005/11/20(日) 08:58:24
ああ、あと、領域確保は自分でやってくれ。 malloc使わんと、これどこも刺して無いからな>*pwa,*psa
おはようござぃますw プログラミング学校でゃってるんですヶド、わからなぃので質問させて下さぃ 問題です↓ 「まず教官をジャーマンスープレックスか茹ですぎ卍固めにすることからだな 」 茹ですぎ卍固めってなんですか?是非お願いしますw
今、釣りかシロートの臭いプンプンしない?
386 :
デフォルトの名無しさん :2005/11/20(日) 09:07:55
ゆで過ぎ逆卍固めのことじゃないか?
まあ、宿題は宿題スレでって感じかな。
389 :
まゆ :2005/11/20(日) 14:56:42
返事遅れてすぃません・・・↓↓ 382番の答えでぁってるんでしょうか?
>>389 知らん。それを判断するのは君の仕事だ。
391 :
まゆ :2005/11/20(日) 15:09:15
ですょねw コンパイルしてみますw
392 :
まゆ :2005/11/20(日) 15:14:18
エラーになってしまうのですが・・・;
メアドは伏せとくことをおすすめする。。。
394 :
デフォルトの名無しさん :2005/11/20(日) 15:25:21
,j;;;;;j,. ---一、 ` ―--‐、_ l;;;;;; 女のふりして質問すれば回答率が高い {;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;; ヾ;;;ハ ノ .::!lリ;;r゙ `Z;i 〈.,_..,. ノ;;;;;;;;> そんなふうに考えていた時期が ,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f 俺にもありました ~''戈ヽ `二´ r'´:::. `!
2ch で女の名前を使う奴は全員ネカマ。これ定説。
396 :
まゆ :2005/11/20(日) 15:32:37
この問題が先にぁりました!! 1.実数型変数a, b を宣言し、そのアドレスを画面に表示するプログラムを作成。 2.上記のプログラムでポインタ変数 *pa, *pb を準備し、それぞれに変数 a, b のアドレスを入力して、それを画面に表示させる。 3.上記のプログラムで変数 a, b にキーボードから数値を入力し、その和 sum を計算して画面に表示させる。ただしポインタ *pa, *pb を用いて和を計算する。 一応、2番までは理解できたんですヶド、先ほど書いた問題のと関連ぁるんでしょうかね?
宿題は宿題スレへ。
399 :
まゆ :2005/11/20(日) 15:35:37
ネカマぢゃなぃですから・・・;
>>399 きもいギャルみたいな文面使うなよまじめに答える気も失せる
ネカマでも女でもどっちでもいいがとりあえずエラーの内容くらい晒せ
>>399 ネカマじゃないっていうんだったら出すもん出して証拠見せてみろよ(`・ω・´)
とりあえず、おっぱいうpしてくれたら信じる。
404 :
デフォルトの名無しさん :2005/11/20(日) 15:52:16
001.c:9: warning: type mismatch with previous implicit declaration 001.c:4: warning: previous implicit declaration of `wasa' 001.c:9: warning: `wasa' was previously implicitly declared to return `int' ってでました。
>>374 リークしたまま終了したら、リークしたままなのでまずいんジャマイカ?
Javaとかなら掃除してから終わってくれそうだが
言語じゃなくてOSの問題なんじゃないの?
>>399 よし、 1 年 R O M っ て ろ 。
な。
>>407 おいおい、かわいそうだろ。半年間にしてやれよ。
プログラムが確保したメモリー領域を開放するのは、そのプログラムの責任。
>>405 OSによっては、OSが処理してくれる。
まぁ、そんな気持ち悪いプログラム組みたくはないが。
gcc使ってんのか?一番目のは関数のプロトタイプ宣言してねえから出てんじゃないの?
まゆちゃああああああああああああああん
>>404 あそこまで詳しく書いてくれてるんだから、それくらい自己解決してやれよ・・・。
まず、プロトタイプ宣言を入れりゃ、動くだろ
int main(void){
の上に
void wasa(int a, int b, int **pwa, int **psa);
を追加
int *pwa, *psa;
の下に
pwa=malloc(sizeof(int));
ppsa=malloc(sizeof(int));
を追加すれば、とりあえず動く
あと、aとbに何らかの値入れないと答えでないぞ。
キャストしろやはげ
まゆちゃんでぬきぬきしたい
416 :
デフォルトの名無しさん :2005/11/20(日) 16:18:53
413番さんもありがとうございますです!! C言語できる人ってあたしから見たら天才ですよ・・・w
まあ今日は2回セックスしたし明日はすっきり工程レビュー
>405 fjにカエレ
420 :
デフォルトの名無しさん :2005/11/20(日) 17:15:37
382番の方の(**)を使わずに、ってできますか?? malloc(sizeof(int))とかも習ってないので;
できる
422 :
デフォルトの名無しさん :2005/11/20(日) 17:22:31
是非教えてください!
先コンビニいってくるわ、ほんでウンコしてきてから教えてやる
425 :
デフォルトの名無しさん :2005/11/20(日) 17:28:28
381番も見てるんですけど、わからないんです・・。
習ってないって・・・ その辺のサイト見りゃ載ってるよ
>>425 >とりあえず問題・解説か学校見直してくれ。
>>1 いい加減にしてくれ。
学校の宿題をここで聞くなボケ 宿題スレがあるだろボケ 死ねぼけ カスぼけ
430 :
デフォルトの名無しさん :2005/11/20(日) 18:56:52
で、おっぱいでpは?
_ ,.'´ ヽ )) l ノメノハ)〉 ペコリ ! (!l - -ノ| )) ゴメンナサイ ノノ( JJ)リ! ` `i_j_j
ε=(ノ゚ー゚)ノタダイマ ?
433 :
デフォルトの名無しさん :2005/11/20(日) 20:16:20
マイクロソフトが出しているvisual C++って普通のC言語と同じ? 独習Cっていう本をかってC言語を勉強しようと思っているんですけど ソフトはVisual C++でいいのかな?つーかこれくらいしか安めのないし。 あとアカデミック版だかという4500円くらいのCとjavaとbasicがセットになった visualも売ってて、それとvisual C++ってCに関しては同じ機能なの? Visual C++のほうは20000円だからほかに何か機能でもあるんですか? あとこれらのソフトを買えば普通にC言語できますよね。コンパイラーだかを 買う必要はないんですか?
>>433 スレ違い。この板だけでもVC++の話題は腐るほどあるんだからその辺ででも聞け。
435 :
デフォルトの名無しさん :2005/11/20(日) 20:30:12
>>433 雑誌類は何読んでる?
あなたに合った単行本はそれによると思うけど
とりあえず、コンパイラはタダででもOK。
437 :
デフォルトの名無しさん :2005/11/20(日) 21:08:48
ダータ=サポートなし
有料コンパイラを買って、「独習Cのxxページの例題が動かないのですが」とサポートに電話する。 受け付けてくれるの?
439 :
デフォルトの名無しさん :2005/11/20(日) 21:32:52
>>433 独習Cを使ってCの勉強をするんなら、添付のCD-ROMに入っている
Borland C++ Compilerで十分なのでは?
Cygwinとかでもいいだろうし。
Visual C++を買う必要はないと思うよ。
440 :
デフォルトの名無しさん :2005/11/20(日) 21:40:04
ダータ=マニュアル冷たい (内容的にはともかく)
441 :
デフォルトの名無しさん :2005/11/20(日) 21:41:44
gcc ベースで FAQ まとめてるサイトが「初心者」という設定で話しているケースは珍しい たいてい UNIX 系 OS の SG くらい自力でやってるだろうって前提で話している
フリーコンパイラの導入の仕方を書いたページなら hello, world程度までのコンパイル方法くらいは書いてくれてるだろう。
>>442 独習CにはBorland C++のインストール方や設定についての記載が
あったな・・・
COSx=Σ * (-1)~n / (2n)! * x~2n Θ * M_PI / 180.0 を使ってcos(x)の求め方を教えてください。 自力で求める為の式です。 それとも、他の解き方あったらお願いします。
446 :
444 :2005/11/20(日) 22:56:28
いぁ、独習なのですがテキストには <math.h>のほうが載ってまして。興味あって調べているのです。 数学板とwikipediaのお世話でやっとオイラーの展開までたどり着いたんです。 こういうのは宿題スレ行きなのですか? 学校で勉強してるわけじゃないのでどこで聞けばいいのかなと思ったのですが。 向こうのほういいですか?
>>446 テイラー展開をして(マクローリンでも良い)適当なところまで計算させる。
グーグルで検索すると最初のほーにCのソースがあるんだが。
>>433 おまいがニートもしくは学生をちゃちゃと卒業して
とっととVCとかC#つかって開発やってる会社に入れば
只で満喫できるだろう。その辺をがんばれ
450 :
444 :2005/11/20(日) 23:30:30
Cでのインラインアッセンブラの質問してもOK?
ソデスカ・・・
455 :
デフォルトの名無しさん :2005/11/20(日) 23:43:13
>>451 質問の内容による
判定条件がかなりタイトなので
よーく調べて聞いてね(はぁと
先に釘さすようだけど、VC使っていく気なら、最新の2005では、インラインアセンブラが一切使えない。 SIMDやCPUID呼ぶならIntrinsics使うか関数丸ごとアセンブラで書くしかないから そっち覚えたほうがいいよ。
>>456 マヂデスカ!2005使えないんですか・・・→2005購入予定削除
サンクスデス。
>>455 ちなみに質問というのは
int(なんでもいい)の変数のポインタにどうやって
レジスタ(この際eax)の内容を叩き込んでやれば
いいか、という質問でした。
いや、インラインアセンブラがない如きでVC 2005を捨てるのは惜しいと思う。
そもそもOS自体にバグが満載。
VCでやってることって、数学計算くらいしかないので 速度が優先できなければVC2005使ってもどうしようないわけですよ。 作ったプログラムもLinuxと互換性のあるプログラムを作成することが目的なので、 Win系のインターフェースを使うわけにもいかないですし・・・ (でも、自動ベクトル化の機能がどれだけ備わっているかによっては、 即時購入って方向もあるんですけどね・・・)
VCでコンボボックスについてお聞きしたいのですが・・・ ▼で登録済の文言をリストから選ばずに、直接そこに手入力した 文言をCStringの変数に取得させることはできますか?
できるっつーかすれ違い
>>462 逆からっすか。
んー、考えてみます。
(情報サンクス)
>>460 っ[Intel C++]
2005でためしにIntrinsicsでMMXとかSSE使ってみたけど、2003のがまだ速い。
上位エディションに付くプロファイリング機能無しじゃ全然遅い。
ICCならせいぜい4万程度の投資なんで、ネイティブアプリにこだわるなら
VC++ Standardあたりとインテグレートすればいいと思われ。
>>461 おもっきしスレチガイだけどマジレス。
コンボボックスはエディトコントロールとリストボックスの組み合わせなんで、
エディト部のハンドル拾ってGetWindowText
>>465 うちの教授に買ってくれるか相談してみます。(w
467 :
461 :2005/11/21(月) 00:42:14
>>465 質問する場所が違ってました。すみません
GetWindowText の使い方を調べてみます
ありがとうございます
いい加減、スレ違いの質問に答えるの止めろ阿呆。 莫迦がしつこく居座るだけだ。
どもです。 lintみたいな静的な解析ツールで、以下のソースで警告なんかを出してくれる やつってありますか? splintは色々やってみたんだけど警告出してくれませんで した。もしかしたらsplintの使い方を間違えている可能性もあるのですが。。。 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { char *p; char *p2; if ((p2 = malloc(10))!= NULL) { goto end; } p = NULL; end: free(p); return 0; }
472 :
471 :2005/11/21(月) 20:08:10
書き忘れました。 出して欲しい警告は、pが不定値のままfreeに渡される可能性があるって 事と、p2をfreeし忘れている事です。
473 :
デフォルトの名無しさん :2005/11/21(月) 22:36:57
巡回セールスマン問題の解を求めるプログラムを作ったのですが、これでは全ての回路が表示されてしまいます。最小値だけでしかも順列の最初の値が0の回路だけを表示させるにはどうすればいいのでしょうか?どなたか教えてください。長くてすいません。 #include<stdio.h> #define MAXN (100) #define YES (1) #define NO (0) void perm(int d); int n, a[MAXN], used[MAXN]; int dist[MAXN][MAXN]; int main(void) { int i; int j; // printf("Input n: "); scanf("%d", &n); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &dist[i][j]); } }
474 :
デフォルトの名無しさん :2005/11/21(月) 22:37:33
if (n > MAXN) { printf("Change the value MAXN.\n"); exit(1); } else if (n < 0) { printf("Error!(Input nonnegative integer.)\n"); exit(1); } for (i = 0; i < n; i++) used[i] = NO; /* 始めはどの値も使っていない */ perm(0); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("%2d ", dist[i][j]); } printf("\n"); } }
475 :
デフォルトの名無しさん :2005/11/21(月) 22:38:38
/* 深さdの節点を根とする木を作成する関数 */ void perm(int d) { int i; if (d == n) { for(i = 0; i < n; i++) printf("%d", a[i]); printf("\n"); } else { for (i = 0; i < n; i++) { if (used[i] == NO) { a[d] = i; /* 配列のd番目にiを代入する */ used[i] = YES; /* iを使ったことを記憶する */ perm(d + 1); /* 再帰呼び出し */ used[i] = NO; /* 命令文を追加する */ } } } }
477 :
デフォルトの名無しさん :2005/11/21(月) 23:14:34
変数の宣言に関して質問です。 私の今読んでいる入門書には >これを次のように記述するとコンパイルエラーになります。 int idt; //宣言 idt=100; //それを使用する double ddt; //また変数を宣言する ddt=23.45 //それを使用する。 とあるのですが、実際にはエラーになりませんでした。 これは推奨できないが可能である、という意味でしょうか?
478 :
477 :2005/11/21(月) 23:16:03
追記。以下の項についてです。 変数は先頭部分にまとめて記述します。 例えば ・・・
>>473 ソースは全く読んでないが、
プロセスごとに減点する
減点数が大きいなら以降は枝切りしつつ、全部チェックする
最高得点とその経路を記録
最高得点以上のものがあれば、得点と経路を上書き、
最高得点と同じ得点ならば、経路を追記、
でいいんじゃないの
481 :
477 :2005/11/21(月) 23:37:49
borlandというコンパイラ?を使っているのですが、 実行しても通常通り表示されましたが。 改訂98年発行の本だからでしょうか
483 :
デフォルトの名無しさん :2005/11/22(火) 06:38:34
>改訂98年発行の本だからでしょうか あくまで非標準拡張だった頃のものだな
bccはC99対応じゃないし。 ・・・C++に対応しているだけで。
C++対応も中途半端 ちょっと複雑なことをするとコンパイル通らない Boostなんてもちろんダメ
>>477 そうできるほうが便利だったり都合が良いこともあってC++ではできるようになった。
BorlandのコンパイラもC++コンパイラ。
>>485 「当時の標準規格」への対応度は、そう悪くなかったよ。
VC++6.0がダメだとかgcc2.9xが対応してないとかと同レベル。
>>487 そうは言っても某の最新コンパイラがアレなんだから擁護する気にならん
最新って6でしょ? 6でもあんななの?
最新は5.64(BCBやBCBXに付属) 一時期6のプレビュー版も公開されてたようだけど今でも入手方法あるの?
BCB6 って、入ってるコンパイラのバージョンって 5.64 なんだ。 なんとまぁ・・・。
492 :
デフォルトの名無しさん :2005/11/22(火) 12:15:14
デカイプログラムのいろんな場所にある浮動小数点数計算を 固定小数点数計算に変更したいんですが、 どういうアプローチを取るのが効率的ですか? 1) それっぽい場所を grep した後手作業 2) Perl で頑張った後手作業 3) Emacs-Lispで頑張った後手作業 4) yaccを使う(自動化可能?) など考えましたか、yacc は知らないので敷居が高いです。 地道にやるしか無いと思いますが、 俺だったらこうやる的な案があれば教えて下さい。
1) float, doubleを fixに置換 2) コンパイル 3) コンパイルエラーを潰す C++だったら固定小数点クラスの演算子定義しちゃえば、 置換だけですみそうだけどな。
494 :
デフォルトの名無しさん :2005/11/22(火) 13:18:50
>>493 ありがと。
やっぱ無難にそんな感じですかね。
量が多いんで修正ミスでバグが入りそうというのが気がかりです。
演算子定義という方法は忘れてました。
CだけどC++に書き換えようかな。検討します。
とりあえす定数部分はEmacs-Lisp+手作業で変換してみました。。
>>494 >493で指摘されていないけど、%gなどのprintf()系やscanf()系の変換指定子にも要注意。
>>495 なるほど。ありがとございます。
コンパイルエラーにならないものがあると辛いですね。
でも、ヤッパ直しミスが怖い。。
a = (b + c) * d / e + f * g;
もしこんなのあったら頭痛いです。。Wooo
特に変なことやってなければそのままC++通るでしょ。
malloc でキャストしてないとか、 そういう微妙な仕様の違いでエラーになることはままある。
499 :
デフォルトの名無しさん :2005/11/22(火) 20:10:09
普通に実行するとプログラムが落ちちゃうのに、 デバッガから実行すると成功する。これってどんな原因が考えられますか? エラーメッセージは、 fatal error has occurred!! というダイアログが一枚出て終わりです
>>499 スレ違い。環境依存スレかお使いのコンパイラ特化スレ、或いはデバッガの環境スレにでもどうぞ。
getcharみたいなんだけどリターンを押したとき \nは読み込むけど改行はしない、これを実現するにはどうすればいいでしょうか
端末制御の問題。エコーバックを殺して火の中に投げ込め。 詳細は各環境独自のスレにて熟知すべし。
504 :
デフォルトの名無しさん :2005/11/22(火) 21:42:16
C言語ってどのへんくらいから中級者になるのでしょうか
標準ライブラリを使いこなせるようなったら。
506 :
デフォルトの名無しさん :2005/11/22(火) 22:35:07
>>504 C++は邪道とかJavaは遅いとか嬉しそうに言い始めたら中級者
>>504 紙にプログラム書いて、500行ぐらいのまともなそれが
エラーなし一発で動いたら
上級者はBSDのディベロッパになれたらだな
509 :
デフォルトの名無しさん :2005/11/22(火) 23:08:07
WindowsはダメなOS、UNIX最高とか言い始めたらC言語上級者
>>507 試しにやってみたけど、OCRで読み取った段階で文字化けしちゃった。
どうやら漏れは中級者じゃないらしい。
#cat > foo.c で100行ならやっとことあるんだけど。
単純に自分の作りたいものを作れるのが上級者だ。 これこそがどの言語でも共通の「上級者」の定義だと思う。
「作りたいもの」が初心者の域から脱してない人も多いよね。 自分が作れるものしか「作りたい」と思わないような。
513 :
デフォルトの名無しさん :2005/11/23(水) 00:24:40
>>504 文法をほぼ習得し終わった時点
関数ポインタを返す関数とか普通に使えて標準ヘッダ内に出てくるマクロが読めるあたり
再帰の無謀な使いまくりに飽きてきた頃
1ソースあたりの行数で4桁が全然珍しくなくなってきたらへん
組み込みかOSベースかはあんまり関係ないけど他分野の人の発言に耳従うのが次の目標かも
>>513 >1ソースあたりの行数で4桁が全然珍しくなくなってきたらへん
世の中には1ソースファイル1関数なんてコーディング規約もあるわけだが。
#この際是非は別として。
私は近頃、1関数あたりの行数が4桁なんてのが 全然珍しくなくなってきたのですが、どうでしょう?
517 :
デフォルトの名無しさん :2005/11/23(水) 00:46:35
おいら挑発はうざいだけなので いくら煽ってもリターンは与えません
518 :
デフォルトの名無しさん :2005/11/23(水) 01:04:39
昔から自分の使ってる言語の処理系を自分で書いて1人前ってのはあるな
糞コードを吐くCコンパイラなら書いたことあるな。
520 :
デフォルトの名無しさん :2005/11/23(水) 01:54:06
Cやってるやつはプログラム意味論とか勉強してる?
>>520 それはやってないと思って聞いているのか?
>>521 そういう人にあまりお目にかかったことがないから・・・
>>522 俺はコンパイラの理論とかなら勉強してるけど、意味論としてはちゃんと勉強してないな。
一応、オブジェクト指向ぐらいは勉強したけどね。
オブジェクト指向がCでなんの役に立つのか、少し疑問。
>>524 いろんな言語を勉強してるってだけですよ
#include <stdio.h> typedef struct { cahr cahr_p; int cahr_w; } CHARPROF; void print_string(CHARPROF *char_list){ int print_w, idx; print_w += char_list[idx].char_w; return print_W; } 質問なのですが、CHARPROF *char_list 及び char_list[idx].char_w; の部分がわかりません。 構造体のtypedefは次に呼び出されるときには、型名にできるのでしょうか
CHARPROF型の ポインタ変数char_listの宣言、、
>>526 型名として使いたいからtypedefするんですっ
530 :
デフォルトの名無しさん :2005/11/23(水) 15:29:54
指定したバイトだけ標準出力に書き込む(read(2)みたいなやつ) 標準ライブラリってなんですか?教えて下さい。
fwrite
fnprintf()
君たちさっきから何の話をしているんだ?
535 :
デフォルトの名無しさん :2005/11/23(水) 18:31:04
>>530 System.out.println()
>>533 530をネタに超能力合戦しているとおもわれ。
>530 は「ライブラリ」はなんですかと訊いているんじゃないのか?
それだと意味が通らない。そこでエスパー様の登場ですよ。
read(2) みたいなやつ、ってんだから write(2) だろう。 だがスレ違い。
基本情報のC言語の問題がトレースしないで解いたら半分しか解けないのだけど、 そこら辺どうですか?
読んでる途中で、力尽きるのだけど。。
>>540 トレースしないで解くというのがいまいちピンと来ないが
上から下まで全ての行に目を通せば正解できるだろ
543 :
デフォルトの名無しさん :2005/11/24(木) 00:05:02
>>535 は文盲
あの発言は幾何学模様であり意味わかって書いてない
>>542 変数の値の変化を紙に書き出すと、A4の紙が3〜4枚必要なのですが
試験問題の用紙の空いてるスペースに書くのにも限界があるんでつ
漏れの脳さんはD-RAMなので時間が経つと前の記憶が消えはるんでつよ
ヽ(`Д´)ノ ugagagaaa
547 :
デフォルトの名無しさん :2005/11/24(木) 00:27:10
>>545 ビットフェードエラーは一概に DRAM 自体の問題じゃない
おおかたコンビニの姉ちゃんの手の感触ばかりアドレッシングを繰り返すリフレッシュ回路の欠陥と見た
さすがのカスも RAS には注意が届かなかったと見える
>>544 その必要あるか?
俺は今年秋のFEでC取ったが、少なくともCの所でメモる必要なんて皆無だったぞ
ただ単に、この関数は○○してるんだな。って感じで読んでいけば穴埋まったし
>>544 書き出すにしても、ループの始めと終わり数個くらいでいいんじゃね?
>>544 とりあえず関数の出入り口でどうなってるのかを書き出すのと
書くループに不変の表明を付けておけば十分だろ
>>550 そうしておきます。
RASには、十二分に注意を払うよう心掛け致したいと思います
552 :
デフォルトの名無しさん :2005/11/24(木) 02:17:03
構造体変数を使うときmemset(3)なんかでゼロクリアしてる 例をよく見かけますが、これってなんか意味あるんでしょうか?
>>552 自分の各コードに自信が無い香具師がよくやるバグの上塗り。
x& ってなんですか? たとえばx&0xfffeとかの場合なんのためにつけてるんですか?
555 :
デフォルトの名無しさん :2005/11/24(木) 03:50:43
556 :
デフォルトの名無しさん :2005/11/24(木) 03:51:10
557 :
デフォルトの名無しさん :2005/11/24(木) 05:14:50
scanf("%d", &m); int box[m]; for (i = 0; i < m; ++i) box[i]=0; 配列の数を入力できるように作りたいのですが 上のようにやると何故か error C2143: syntax error : missing ';' before 'type' error C2065: 'box' : undeclared identifier と怒られます 理由が全くわからないのでどうか教えてください
配列の数は定数で指定しないと駄目。 可変長にしたいならmalloc()を勉強せ。
しかもブロックの先頭じゃないと宣言できないし
gcc使ってください。コンパイルオプションは、-std:c99で。
たったそれだけのために開発環境を変更するのはイヤです。
563 :
デフォルトの名無しさん :2005/11/24(木) 07:56:24
>>561 資源を自動管理してもらいたいなら他に色んな言語があるだろ
C は資源管理自体の開発に使用する言語ってとこは理解しているか?
565 :
557 :2005/11/24(木) 13:11:23
え、ちょ、すいません
>>561 は俺じゃないですよ?
JAVAしかやってなかったので配列の長さは指定できないってのを知りませんでした
なんとか他の手考えてやってみます、ありがとうございました
566 :
デフォルトの名無しさん :2005/11/24(木) 14:57:38
学校で音声解析(認識)を研究しているんですが、子音の解析方法がまったく見当がつきません。 ググっていろいろ調べてみたんですけど、子音はあんまりなくて。 (母音に関してはフォルマント周波数とかがわかったんですが) なにか良い方法(もしくはURL)があったら教えてください。
>>566 C言語なんの関係も無いだろ。
さようなら。
しーん
ビットフィールドの説明で例えば typedef struct { unsigned bool: 1; }Boolean; というのがあったとしてboolには1か0しか値としては 代入されないから真偽を制御する有効な使い方だとかあったんですけど boolに0以外を代入しても値として0になるかもしれないので あまり有効とは思えないのですがどうなんでしょうか?
どれもいっしょだと思いますが、 「まあ、そういう使い方も出来ますよ。」 ということでいったんじゃないでしょうか。 char型に0x100いれてもオーバーフローをおこして0になるように、 その人の使いかた次第かと思います。
>>569 ビットフィールドのメンバの型には int か unsigned int しか使えない。
俺は signed か unsigned と書くようにしてる。
まあ、そもそもビットフィールドを使う状況自体が少ないがな・・・。
キャリーフグリとか確認しろよ。
573 :
デフォルトの名無しさん :2005/11/24(木) 19:02:28
しつもんなのですが #include <stdio.h> main() { printf("Hollo"); return 0; } このソースの ;はなんでいるのでしょうか。気になって夜も眠れません。
文の終わりに必ず必要です。 でないと複数の文が書けません。 それ以前にコンパイルエラーを起こします。 寝ないでください。
holloにはつっこまんのかい。
printf("hollow ataraxia\n");
>>573 日本語文章の「。」と同じ。
文の終わりを意味する。
>>575 要求仕様も書かれていない以上、
「hollo」が間違いであると断定する術は、我々にはない。
>>573 もう少し捻りましょう。
つか、最近 Vipper 大杉。
>>580 最近良く見かけるけど vipperって何?
>>580 Vipperというか言葉が流行っているだけじゃ?
そういう俺もVipに入り浸ってるが。
>>581 半年ROMr(ry
583 :
デフォルトの名無しさん :2005/11/25(金) 02:02:01
>>582 君は気持ちが悪いから
死ぬか、無理ならせめてvip板から出てこないでもらえるか?
584 :
デフォルトの名無しさん :2005/11/25(金) 02:03:30
2ちゃんには、社会不適格者がイパーイ(゜д゜)
585 :
デフォルトの名無しさん :2005/11/25(金) 02:05:08
>>582 (゜д゜) vipperは巣にカエレww
オマエガナーw
587 :
デフォルトの名無しさん :2005/11/25(金) 09:28:15
wwvipとかうぜええwwwwwうえっうえwwwwww
588 :
デフォルトの名無しさん :2005/11/25(金) 09:49:19
コードブロックに関しての質問です。 if(){ . . . } if() { . . . } 上記の2つではどちらのほうが良いのでしょうか? もちろん一人でやる分には好きなほうで良いのでしょうが、 一般的な方があれば教えてもらいたく思います。 もしあれば、理由も合わせて聞きたいと思います。 よろしくお願いします。
誤送信でageてしまいました。すみません。
会社でコーディングの規則があるならそれに従う。ないならどちらでも。
あ、そうですか。それじゃあ自分は後者が好きなのでそっちにします。 仕事でやっているのではないので。 即レスありがとうございました。
すみません。そんなスレがあったんですか。 他にも勉強になりそうなので、見てくることにします。 ありがとうございました。
594 :
デフォルトの名無しさん :2005/11/25(金) 10:32:39
586 黙れガキが
595 :
デフォルトの名無しさん :2005/11/25(金) 10:33:39
黙れクソガキ
596 :
デフォルトの名無しさん :2005/11/25(金) 10:34:23
586 黙れやクソガキ
あんまりやるとバカがVIPにコピペ貼って来たりするからやめれ
598 :
デフォルトの名無しさん :2005/11/25(金) 12:48:34
プログラマーになるにはどのくらいまで極めればいいのでしょうか。 それとC言語とゲームプログラミングはまったく関係ないんですか?
599 :
デフォルトの名無しさん :2005/11/25(金) 12:49:31
質問) √を計算する関数教えてくださいOTZ
失礼あげてもたOTZ
603 :
助けて :2005/11/25(金) 13:48:02
神経衰弱を行うゲ−ムの作成のプログラムを作成しなくてはいけません。Visual C++ 6.0 で作成するんですけど誰か助けてください
何をどう助けるの?
それだけでは誰も答え(られ)ません。
606 :
助けて :2005/11/25(金) 13:57:14
返事ありがとうございます。問題は、(神経衰弱を行うゲ−ムを作成すること。ただし 、カ−ドは52枚使用して、絵柄の区別はないものとする。)です。 配列と乱数とFor文とif文で作らないといけないのですが、何をどうしていいのかさっぱりわかりません。 誰か助けてください
何のためにその問題を答えるのきみは?
609 :
デフォルトの名無しさん :2005/11/25(金) 14:03:46
>>603 神経衰弱ゲーム作成プログラムか…。
神経衰弱を作るより難しいな。(w
610 :
助けて :2005/11/25(金) 14:24:08
607さんが教えてくれたところで聞いてきます ありがとうございました
611 :
デフォルトの名無しさん :2005/11/25(金) 15:19:32
> 神経衰弱を行うゲ−ムを作成すること。 > ただし、カ−ドは52枚使用して、絵柄の区別はないものとする。 絵柄の区別がなければ、絵を合わせる事は出来ないのでは?(w
>>611 ダイヤ、ハート、クローバー、スペードが無いのなら出来なくはないだろ?
数字だけあわす感じ。
そういう意味じゃないのかな?
絵柄はグラフィック的には必要だけど、神経衰弱にはいらないと思う
あ、覚えるのにいるのか
いや、枚数さえ配列に記憶しておけばできる。
linuxなんですけど recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen); のfromで送信元のIPアドレスがわかるんですが、ネットマスクが何bitなのか解る方法ってありますか?
管理者に訊く。あと、サブネットマスク 外部が知ってどうすんの?
618 :
デフォルトの名無しさん :2005/11/25(金) 15:49:59
619 :
611 :2005/11/25(金) 15:52:17
>>612 カードがトランプであるとどこに記述されている?
# って言うか、ネタにマジレス(ry
620 :
616 :2005/11/25(金) 15:54:41
>617 >外部がしってどうすんの? 秘密。
まずは、ネットマスクって何なのかの勉強から。
いろいろ紛れ込んでるのか?秋だからなー。
>>620 イエルモンナライッテミロ(・ρ・)!
>いろいろ紛れ込んでるのか? コテハンとかな。
624 :
デフォルトの名無しさん :2005/11/25(金) 19:41:44
突然すみません。私はプログラム初心者です。 C言語かC++を学びはじめたいと思っています。 用途としては、数値計算をするプログラムを将来作りたいと思っています。 そこで、質問なのですがCとC++どちらを始めた方がよいですか? 誰か親切な方、教えてくれませんか?
Cでいいよ。
C にしる!
>>624 数値計算ならCで十分。
C++をbetterCとして使うのもあり。
#include <stdio.h> void main (void) { int dai,syou,work1,work2; printf("数字を2つ入力して下さい:"); scanf("%d" "%d",&work1,&work2); dai=(work1>work2)?"work1":"work2"; syou=(work1<=work2)?"work2":"work1"; for(;dai>syou;dai--,syou++;) printf("平均値は%dです。\n",dai); }
cmd.exe /C LCC.EXE heikin.c *** コンパイル開始 *** heikin.c 15: Warning: illegal pointer combination (=) heikin.c 17: Warning: illegal pointer combination (=) heikin.c 19: syntax error near ';' heikin.c 19: syntax error near ')' *** コンパイル終了 *** どうやって修正したらいいのか分からない。
int dai,syou,work1,work2; dai=(work1>work2)?"work1":"work2"; syou=(work1<=work2)?"work2":"work1";
釣り禁止!
633 :
デフォルトの名無しさん :2005/11/25(金) 20:40:20
>>625 〜
>>628 レスありがとうございます。
ついでといっては、数値計算程度ならCで十分なら、
C++はどんなプログラミングに使うのですか?
634 :
デフォルトの名無しさん :2005/11/25(金) 21:26:12
64ビット整数どうしの割合(%)を出したいんですけど以下の場合aが18446744073709551を超えるとマズーです。 何か良い方法は無いでしょうか。 ULONGLONG a,b,c; ry) c = a * 100 / b;
635 :
デフォルトの名無しさん :2005/11/25(金) 21:34:29
>>634 64bitsより大きいレジスタを使うw
>>634 多倍長整数演算ライブラリでぐぐって見る。
>>633 数値計算程度にも。
C++はCよりも便利なのであって、CとC++は使用される分野は完全にかぶっている。
639 :
デフォルトの名無しさん :2005/11/25(金) 22:46:32
>>634 多倍長ライブラリを探すのも実用的だが、
あなたの場合は、それをあえて自分で作ってみることのほうが
長い目で見て生産的であると見受ける
640 :
デフォルトの名無しさん :2005/11/25(金) 22:50:50
多倍長ライブラリってまともなもんあったっけ?
641 :
デフォルトの名無しさん :2005/11/25(金) 22:59:04
いくらでもヨタ、ゼタ、那由他、不可思議・・・
無料大スキー
643 :
デフォルトの名無しさん :2005/11/25(金) 23:28:14
>>634 アセンブラでかけばいいじゃん。486ぐらいからなら80bitsのレジスタもあったし。
645 :
デフォルトの名無しさん :2005/11/25(金) 23:33:21
ナビ○コ?
チップスターか?
うわっ…誤爆
>>637 サンクスコ。
でも割合求めるだけなのに楽じゃないなぁ。
>>639 と言う訳でこんなんでました。
_int64 i = 10000;
_int64 j = 30000;
_int64 k = 0;
k += i / j;
i = i % j;
i *= 10;
k *= 10;
k += i / j;
i = i % j;
i *= 10;
k *= 10;
k += i / j;
このスレとしては__int64はねぇだろと言っておく。
long long だよね。
652 :
デフォルトの名無しさん :2005/11/26(土) 14:44:42
int64_tだろ
自作の型 MYINT64 を定義
__m64とか使うツワモノは居ないか流石にww
655 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/11/26(土) 18:37:54
>>635 XMMレジスタのことを言ってるのなら、128ビット単位の算術演算はサポートしてないぞ。
SSE3まででサポートするのは1bit単位の論理演算と8ビット・16ビット・32ビットの算術演算と64ビットの
足し算引き算程度だぞ。そもそも演算器自体が64ビットSIMDユニット×2で実現されてるし。
AltiVecは128ビットだけどこれも整数は32ビットまでだな。
掛け算なら適当にテーラー展開して掛け算してやればいいんで、
そもそもレジスタ幅あんま関係ない(ことパフォーマンスではなく精度に関しては)
C++だと多倍長整数型を自前で定義して従来の整数型と似た操作法で演算できる。
純粋なCで数値計算やろうと思うくらいならFORTRANでもやったほうがいい。
大概の高度な数値計算用ライブラリはFORTRAN用に用意されたものを
Cで使えるように変換しただけ。
>>634 有効精度上位53bit程度に落ちていいならdouble型にキャストするのが正解。
多倍長の割り算って、実装面倒なんだよね。 double で十分っしょ。
割り算は逆数計算させるだけでいいんじゃない? ニュートン法かなんかで
658 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/11/26(土) 22:21:51
パーセント表示がどうとか言う時点で精度としてそんなに厳密である必要ない希ガス。 どうせ出力の書式は %.2f とかなんだろ。 現実問題として無限循環小数なんていちいち扱っていられないし。
そこでベクトルスパコンですよ!!!
unsigned で作ってみた。 int64_t でもほとんど同じになるはず。 unsigned percent(unsigned a, unsigned b) { if(a > b) { return a / b * 100u + percent(a % b, b); } if(a <= ~0u / 100u) { return a * 100u / b; } return 100 - (a != b); }
間違えた。 100 - (a != b) はとんでもない間違い。 テスト範囲は広く取ろうねという教訓。
662 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/11/26(土) 23:18:31
unsigned=64bitなコンパイラかよ。。。
663 :
デフォルトの名無しさん :2005/11/26(土) 23:20:05
664 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/11/26(土) 23:23:15
いや別に。。。どういう処理系使ってるんだろうなと思って。 でもそこまでやって小数点以下切捨てなら最初から浮動小数使ったほうがいい希ガス。
大雑把には a / (b / 100) でイケるね。 まあ、これが a * 100 / b とは等しくならないこともあるけど、キニシナイ。 ただ、a == b の時に確実に 100 になるよう、 a == b の時は 100 を返すようにした方がいい。 return a == b ? 100 : a / (b / 100u);
a == 102 b == 103 a / (b / 100) == 102 無理があるな。
いや、オーバーフローするような桁数があれば大丈夫。 せいぜい 1 しか違わない。
a == b なら何もしないでも確実に 100 になるね。 むしろ、a != b で 100 になる方を何とかした方がいい。 a / (b / 100) - (a != b) でどうよ。
uint64_t percent(uint64_t a, uint64_t b) { if(a > b) { return a / b * 100u + percent(a % b, b); } if(a <= ~(uint64_t)0 / 100u) { return a * 100u / b; } return a / (b / 100u) - (a != b); } uint64_t にしたら、最終的にこうなるのか? double でいい気がするが。
670 :
デフォルトの名無しさん :2005/11/27(日) 00:08:54
div 0
doubleの有効精度は53bit程度なのかー。 64から53に11ビット落ちるのなら、 分子も分母も7ビットシフトしてから計算したらどうなるのかな。
672 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/11/27(日) 00:29:13
うまくテーラー展開してやれば精度落とさずに演算できそうなテラキモスwwwww でも割り算は微妙す。
673 :
デフォルトの名無しさん :2005/11/27(日) 09:56:52
乱数で平面上に点をn個作りたいと考えています。 そのとき,縮退のない(どの3点も一直線上になく,どの4点も同一円周上にない)ような 点集合にしたいのですが,このようなものを保障するにはどのように実装すべきでしょうか?
C言語関係ないだろ。
675 :
デフォルトの名無しさん :2005/11/27(日) 10:04:13
そんなの乱数じゃないじゃん そもそも ISO/IEC9899 が定義する範囲には真の乱数はないし・・・
676 :
デフォルトの名無しさん :2005/11/27(日) 10:11:31
Cのセマフォで質問です。 semget , semmat など・・。 セマフォ同士での、デッドロックってあり得るんですかね。 プロセスA プロセスB セマフォA 取得 取得 見たいな感じで、正常ならば プロセスA プロセスB セマフォA 取得 待ち セマフォA 開放 取得 となる。
>真の乱数 ワロスw
680 :
デフォルトの名無しさん :2005/11/27(日) 10:19:43
スレの条件に合わないレスを棄却しているわけだが
>>676 要求リソースが二つ以上あるとデッドロック起こりえるよな。
682 :
676 :2005/11/27(日) 10:50:08
>>681 そもそも、セマフォって、排他制御のためにあるのに、
なんでデッドロックが起こってしまうんですかね。
セマフォ自信は排他制御されないから。
684 :
676 :2005/11/27(日) 11:28:25
>>683 となると、実際セマフォをつかって排他制御をやると
かんがえると、
ミューテックス+セマフォになるんですか。
これで、完璧?な排他制御が可能でしょうか。
685 :
676 :2005/11/27(日) 11:32:40
>>683 試してみて、セマフォのデッドロックの頻度なんですが、
10個のプロセスを断続的に起動させた場合でも、
起こるときには起こりえると考えたほうがよさそうですね。
逆に、ロックファイル形式の法が逆に、デッドロックの
確立が少ないのかも・・・・。
688 :
676 :2005/11/27(日) 11:41:06
>>687 アトミックならば、完全な排他制御いけるはずですよね。
676さんへ 「デッドロックとは」でぐぐればきみの知りたいことは 一番上のリンクの最初の章に過不足なく書かれています セマフォはスレ違いなので別スレへお引越ししましょう
690 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/11/27(日) 12:06:12
>>673 乱数であることが保障されてるんなら、
・3つ目の点を打って1直線上になったら乱数更に取り出して打ち直し
・4つ目の点を打って同一円状になったら(以下同
ノイズ使ったハードウェア実装もあるけど、ソフトウェアで実現するならMersenneTwisterが最良。
691 :
デフォルトの名無しさん :2005/11/27(日) 12:31:41
692 :
デフォルトの名無しさん :2005/11/27(日) 12:35:42
fff003ff0040600507000080a0090b000(このあともたくさん続く こんな感じのunsigned charの配列があって、 これをunsigned shortの配列に12ビットずつ格納したいんたけどどうしたらいいんでしょうか?
unsigned short x 3の配列に48bitsずつ格納。
694 :
693 :2005/11/27(日) 12:44:41
あ、違った。
>>689 そのページ読んだけど、デッドロックって回避できないのか…orz
スレ違いスマソ
696 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/11/27(日) 13:05:51
>>692 ひょっとして文字列は0〜fの16種類しか存在しない?
3文字取り出して対応する4bit値に変換
'0'→0, '1'→1 … 'f'→15
で、(n1 << 8) | (n2 << 4) | n3 とかでよくね?
697 :
デフォルトの名無しさん :2005/11/27(日) 13:09:35
>>696 ごめん、文字じゃなくて16進数のデータだった
>>692 char が 8 ビットの環境だとすると、
3 バイトを 2 つに分割するのを続ければいいだけ。
ビット演算を駆使すれば簡単なはず。
注意点は、データが奇数の時にどうするかってことくらいやね。
700 :
デフォルトの名無しさん :2005/11/27(日) 17:53:00
>>699 ちょっと頑張ってみる。
とりあえずこんな設計をしたMSは腹を切って死ぬべきである
701 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/11/27(日) 18:00:39
702 :
デフォルトの名無しさん :2005/11/27(日) 18:01:13
703 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/11/27(日) 18:01:55
理解した。
OK牧場
フォートランで READ(*,*) ((A(I,J),I=1、M),J=1,N) という処理をするのをCで記述するとどうなるのかわかんない。 for(I=1; I<=M; I++){ for(J=1; J<=N; J++){ なんか処理 の2重ループでいいのかな? 行列を読み込んで使うプログラムをフォートラン→Cになおせと いわれてるんだけどフォートランと違う値が出たりでうまくいきません。。
readはどこへいった?
707 :
デフォルトの名無しさん :2005/11/27(日) 19:59:42
質問です。 int ptr[5][4][3]; ptr[i][j][k]; と互換性のあるポインターって *(ptr+i+j+k) なんですか? それとも *(ptr+i*j*k) なんでしょうか?
試す前に、きちんと仕様書を読もう。 試してたまたま動いてしまって、それをそのまま知識として吸収してしまうのが一番怖い。 むやみに動いた結果をそのまま鵜呑みにしてはいけない。
>>705 ですが
READのとこの記述はfscanfを使ってきちんと動作してるぽいのですが
((A(I,J),I=1、M),J=1,N)の記述の部分が
I=1からMまでの繰り返しの中にJ=1からNまでの繰り返しがあるのか
J=1からNまでの繰り返しの中にI=1からMまでの繰り返しがあるのか
調べてみてもよくわからなかったもので。。。
>>707 &ptr[i][j][k] という意味じゃなくて?
それとも *(*(*(ptr+i)+j)+k) が欲しいのけ?
>>710 移植なら、まずはフォートランの文法から調査汁。
>>705 A(I, J), I = 1, M をさらに J でループ回してるから、
for(J = 1; J <= N; ++J) {
for(I = 1; I <= M; ++I) {
scanf("%lf", &A[I][J]);
}
}
みたいな感じやね。
ただ、配列が 1 オリジンじゃなくて 0 オリジンなこととか、
そのあたりの配慮を忘れずに。
さらに言うなら、FORTRAN の配列のメモリ上の配置は A(1,1), A(2,1), ..., A(M,1), A(1,2), A(2,2), ..., A(M,2), ... A(1,N), A(2,N), ..., A(M,N) で、C の場合は A[0][0], A[0][1], ..., A[0][M-1], A[1][0], A[1][1], ..., A[1][M-1], ... A[N-1][0], A[N-1][0], ..., A[N-1][M-1] なので、キャッシュの関係で for(J ... ) for(I ... ) ... A[I][J] ... よりも for(I ... ) for(J ... ) ... A[I][J] ... の方が効率が良い。 まあ、効率が要求されないなら、 バグを出さないようにベタに移植した方がいいと思う。 配列も、サイズを 1 増やして宣言して、 1 オリジンであるかのように扱うとか。
715 :
676 :2005/11/27(日) 21:46:43
>>698 デッドロックと排他の使い分け間違えた。
デッドロック:セマフォを用いても無理なものは無理。
排他:セマフォ使えばOK.
こんなところでまとめました。
ロックファイルでいけるんなら、セマフォいらんのに〜。
なんで、ロックファイルのこるんだろ?
I/Oがおかしくなるんかいな。
>>705 です
712さんの言うとおりフォートランでリード文について説明のある
教科書の部分を調べたのですが基礎中の基礎のようで載っておらず
断念を・。。
>>713 さんありがとうございます
明日早速もう一度作り直してみます
714も参考になりました。
717 :
デフォルトの名無しさん :2005/11/27(日) 22:48:44
カタカナやめろ えづきそう
気持ち悪いのはカタカナだけではない
719 :
デフォルトの名無しさん :2005/11/27(日) 23:21:43
やーっほーっふぉーとらんらんらん
全角とか。 大文字なのは FORTRANner だからだろうなぁ。
素直にf2cを使えばいいだけの話では?
関数fが与えられているとき f'(x)を離散的に求めるにはどうすればよいでしょうか 具体的にはfが いろいろなdouble func(double);という形で存在するとき double delta_func(double (f)(double),double x)と定義して f'のx点での値を求めたいわけです 小さいhを用意してf(x+h)-f(x)/hを返すことは簡単ですが いかんせん精度が低いので 具体的なプログラムでなくても数学的なアイディアでもかまいませんので お願いします
微分係数ですね
>>723 微分係数の定義自体がそれな訳だからそれぐらいしかないんじゃね?
数学板で聞いたほうがいい意見聞ける予感
char *top3name[ ][3] = { { "apple", "orange", "grape" }, { "dog", "cat", "rat" }, { "tomato", "cabbage", "carrot" } }; ここでポインタpを宣言して、p = tbl;として printf(p[0][1]);とかしたい場合、pはどんな型で宣言すればいいのか教えて下さいな
p = tblじゃなくてp = top3nameね
char ***p
>>726 こうかな?
char *(*p)[3]
>>729 どうもです。理由は勉強してみます。
あと728の人はうそつきだけど許しちゃう。
733 :
デフォルトの名無しさん :2005/11/29(火) 01:55:49
wchar_tは欠陥型だから使うな
それ以前の問題のような気が。
735 :
732 :2005/11/29(火) 02:00:09
736 :
726じゃないですけど :2005/11/29(火) 14:27:21
>>729 どういう仕組みですか?
top3nameはchar*型の2次元配列というのは合ってますか?
なんでそうなるのか分かりません
オシエテ!!
>>736 top3name は「char* の配列 (要素数は [3]) を指すポインタ。
慣れるしか。
738 :
736 :2005/11/29(火) 14:40:16
char *top3name[2][3][4] この場合はどうなりますか?
内側の ????[] を (*p) に変えるだけだろ。 何も悩むことはない。
740 :
736 :2005/11/29(火) 15:16:23
と、いう事は・・・ char *(*p)[3][4] で合ってますか?
742 :
736 :2005/11/29(火) 15:21:57
ご丁寧にありがとうございました。
良く分からなくなった時は、
>>739 の方法で
機械的に導き出せそうですね
教えてくれたサイトで修行してきます
if( 0 <== i && i<= 8) wk = 0; else if(9 <= i && i<= 16) wk = 1; else if(17 <= i && i<= 25) wk = 2; else if(26 <= i && i<= 34) wk = 3; else if(35 <= i && i<= 43) wk = 4; else if(44 <= i && i<= 52) wk = 5; else if(53 <= i && i<= 61) wk = 6; こういうのをもっとスマートにやる方法ないでしょうか。
そういうプログラムは要求するほうがセンスナス
>>743 先ず確認しておきたいが、16以降61までは9ずつなのに最初だけは8ずつなのは間違いではないね?
>>743 規則性があるなら、
wk = i <= 8 ? 0 : (i+1)/9;
みたいに規則を見付ける。規則性がないなら、
const int maxvalues[] = {8, 16, 25, 34, 43, 52, 61};
for (wk = 0; wk < sizeof(maxvalues)/sizeof(mavalues[0]); wk++) {
if (i < maxvalues[wk])
break;
}
みたいにテーブルを作っておく。
>745を前提とすると、精精これくらいかな。 #iは0以上61以下のの整数と仮定しているけど。 wk = -1; static const int wks[] = {8, 16, 25, 34, 43, 52, 61,}; for (unsigned ic = 0; ic < sizeof(wks) / sizeof(* wks); ++ic) { if (i <= wks[ic]) { wk = ic; break; } } #一応wkが-1かどうかで61を超えた場合の異常判定はできると。
>>743 if を使ってもまだこのくらいになる
if (0 <= i && i <= 8)
wk = 0;
else if (i <= 16)
wk = 1;
else if (i <= 25)
wk = 2;
else if (i <= 34)
wk = 3;
else if (i <= 43)
wk = 4;
else if (i <= 52)
wk = 5;
else if (i <= 61)
wk = 6;
62以上がwk = 6になっちゃうし、醜いけど・・・
wk = (0 <= i && i <= 8) ? 0 : i <= 16 ? 1 : i <= 25 ? 2 : i <= 34 ? 3 : i <= 43 ? 4 : i <= 52 ? 5 : 6;
i が 61 以上の場合どうなるんだ?
743には書いてないね
sizeof(wks) /sizeof(* wks)ってなに?
>>751 >746のsizeof(maxvalues)/sizeof(mavalues[0])と同工異曲。
そんなの無理して工夫しなくていいよ。 普通にif並べるかテーブル作るかのどっちか。
#define numberof(v) (sizeof (v) / sizeof *(v))
それにはelementofっていう名前を付けようよ……
長い。 ELEMOF だな。
elementofは変だろ 要素「数」なんだから
nitemsだな
the number of elements of の略で elementof じゃないのか?
こうやって省略することばっか考えてるからCプログラマは 読みにくいコードばっか書くんだよな #define TheNumberOfElementsOfArray(v) (sizeof (v) / sizeof *(v)) これでいいだろ
sizeof *(v) 確かにCプログラマはこんなことは書きません
>>764 不勉強を晒してますよ。
sizeofはその場合括弧を伴う必要がなく、マクロ引き数のvには括弧をつけるべきなので
sizeof *(v)と書くのは至極当然なのです。
#まさか空白の個数を問題にしているわけじゃないよね。
俺ならこうだな #define numof(v) (sizeof(v)/sizeof((v)[0]))
昔はnumberofをマクロ定義していた。 今は、>747のように書いてしまう習慣がついてしまった。 やはり、小さいプログラムばかり作っている所為だな。 #そういえばX11にも同じようなマクロがあったなぁ。
低レベルな連中だな
そういうスレだからな
質問です。 signedは全ビットを使って数値を表す、 unsignedは最上位ビットを符号で使い残りのビットで数値を表すということでいいのでしょうか?
もちつけ
#define the_number_of_elements_of_array(v) (sizeof (v) / sizeof *(v))
すみません逆でした unsignedは全ビットを使って数値を表す、 signedは最上位ビットを符号で使い残りのビットで数値を表すということでいいのでしょうか?
774 :
デフォルトの名無しさん :2005/11/29(火) 23:54:47
初歩的な質問なんですけど整数って実数とどう違うんですか?
776 :
755 :2005/11/30(水) 00:02:56
1. あのマクロを最初に見たのが XtIntrinsics の XtNumber だった 2. 標準 C に offsetof がある で numberof に決まったのだ。俺の中で。
777 :
デフォルトの名無しさん :2005/11/30(水) 00:03:57
小学校へ入り直せ
779 :
デフォルトの名無しさん :2005/11/30(水) 00:09:12
780 :
デフォルトの名無しさん :2005/11/30(水) 00:10:30
>>773 >signedは最上位ビットを符号で使い残りのビットで数値を表すということでいいのでしょうか?
-1は1000000000000001でなないよ。singnedのマイナス値は2の補数で表現されます。
781 :
デフォルトの名無しさん :2005/11/30(水) 00:12:50
-1は0000000000000001+XXXXXXXXXXXXXXXX=1+0000000000000000となるXXXXXXXXXXXXXXXXです。 つまり-1は1111111111111111です。
>>777 にも解りそうに書くと、
整数=少数点がない数
実数=少数点もある数
と言った感じ。
正確には違うから、そのまま覚えるなよ。
784 :
782 :2005/11/30(水) 00:27:59
少佐とか少尉って言うなら 大佐じゃなくて多佐だろ? 多佐・中佐・少佐・多尉・中尉・少尉 だろ?
>>777 実数 虚数・複素数でない全ての数
整数 実数のうち、分数にすると分母が1になる数
>>788 で?
790 :
デフォルトの名無しさん :2005/11/30(水) 00:52:13
791 :
デフォルトの名無しさん :2005/11/30(水) 00:54:21
C言語を勉強しようと思っています。 プログラミングは初めてです。 候補として Microsoft Visual C++ .NET Standard Version 2003 と Borland C++Builder 6 Personal を考えているのですがどっちがいいでしょうか? 2つ以外にもおすすめがあれば教えてください。 C言語?はつぶしがきくからしいので IT業界への転職を考えて勉強しようと思っています。
792 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/11/30(水) 00:57:27
>>791 Visual C++ 2005の日本語版もうすぐ出るからそれまで辛抱。
Expressなら無料だし。まあWinアプリ作るのは辛かろうけど。
>>791 OSをWindowsからLinuxに変えればいい。
Cコンパイラが標準で入っている。
Linuxはフリーのが転がってるからいいね。
794 :
デフォルトの名無しさん :2005/11/30(水) 01:01:20
はじめまして。私は学生です。 今回C言語について質問をしたいと思い、こちらにお邪魔しました。 質問はC言語で座標の計算をするにはどうしたらよいのか、 ということです。 どうなんでしょうか。 なにぶん初心者のようなものなので。。。。 よろしかったらご返答、よろしくお願いいたします。
始皇帝氏はお帰りください。
796 :
デフォルトの名無しさん :2005/11/30(水) 01:06:12
>>794 >質問はC言語で座標の計算をするにはどうしたらよいのか、
>ということです。
座標の計算とは具体的にどういう計算のことですか?
798 :
デフォルトの名無しさん :2005/11/30(水) 01:18:30
CADの授業でベジェ曲線の事を勉強しています。 それのプログラムをつくれ、といわれました。 ですから、グラフ上での座標と実数との計算をしたいのです。 例えば(1,1)*3で答えを(3,3)っていうのはできるんでしょうか??
>>798 (1,1)*3をどう計算すれば(3,3)になるのかはわかってるよな?
それをそのままプログラムとして書けばいい。
800 :
デフォルトの名無しさん :2005/11/30(水) 01:22:25
>>798 おそらく、2つの座標系での座標変換のことを言ってるんですね。
ひとつは画面の描画対象のウィンドウの座標で、もうひとつがベジェ曲線が
存在する座標。
801 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/11/30(水) 01:22:41
>>793 まーLinux解ってると転職には有利かもね。
もっとも、MSのSQLサーバとかIISの知識も十分潰しがきくというか、潰す必要ないくらいの需要はあると思うけど。
802 :
デフォルトの名無しさん :2005/11/30(水) 01:28:29
先ほど試しにこれをうちました。↓ t=(1,1)*3; printf("%d",t); 解は3でした。 すみません、わかりません。。。
803 :
デフォルトの名無しさん :2005/11/30(水) 01:28:36
一行分の文字列を入力し、次に数字nを入力すると、文字列がn番目から表示される って問題の解答例を教えてくれませんか? これがわからない僕はやばいんですかね
>>800 Bezierなんだから、点のブレンディング係数じゃないの?
ビッグエンディアンともう一つのやつはなんで違う必要があるのでしょうか? 頭から順に並べていったら不都合がある場合とかあるんですか??
>>802 ベクトルのような計算をするには、そのように「自前で書く」必要があります。
t=(1,1)*3; printf("%d",t);
ではなく
t_x = 1 * 3; t_y = 1 * 3; printf("(%d, %d)",t_x, t_y);
のように。
>>805 その「頭から並べる」の規則が違うんだよ。
不都合とかいうよりも、歴史の問題だと思うんだけど。
808 :
デフォルトの名無しさん :2005/11/30(水) 01:46:29
>>806 ご親切にありがとうございました!
がんばってみますww
809 :
デフォルトの名無しさん :2005/11/30(水) 01:50:49
>>803 1.gets関数で文字列を読み込む。これをchar s[256];に格納する。
2.gets関数でnを入力する。atoi関数でintegerに変換しint n;に格納する。
nが0ならば抜ける。
3.strlen(s) < nならば表示する文字列はないので抜ける。
4.strlen(s) >= nならばprintfでs+n-1を表示する。
これをCで書いてください。
810 :
デフォルトの名無しさん :2005/11/30(水) 01:58:44
#include <stdio.h> #include <stdlib.h> #include<string.h> int main() { char s[256], sn[256]; int n; printf("%s\n", "文字列を入力してください\n"); gets(s); printf("%s\n", "Nを入力してください\n"); gets(sn); n = atoi(sn); if (n <= 0) return 0; if (strlen(s) < n) return 0; printf("%s", s+n-1); return 0; }
811 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/11/30(水) 01:59:26
>>805 違う必要があるんじゃなくて、現に違うものが存在して、それらを両方触らないといけない場合、
違いを意識して移植性を高める必要があるってことだけ覚えておけばよい。
基本的にIntelプロセッサなんかはリトルエンディアン。Macに採用されてるPowerPCなんかはビッグエンディアンだね。
数値が大きくなっていったときに後ろのほうのバイトを付け加えてより大きな数を表現するといったときに、
番地の大きいほうが上位ビットになるリトルエンディアンのほうが有利。
データの先頭16bitに1234Hってデータが入ってれば、32ビットの変数として呼び出しても、下16ビットは1234H。
また、32bitのデータを上位16ビットを切り捨てて読む場合は、同じアドレスを2バイトだけ読めばいい。
ビッグエンディアンのほうが優位なケースもあるけどこれは省略
813 :
デフォルトの名無しさん :2005/11/30(水) 02:01:16
こんばんわ。 初歩の質問かもしれないですが、インクリメントですすめられたポインタを 元の位置にもどすのはどうすればいいのでしょうか?
814 :
デフォルトの名無しさん :2005/11/30(水) 02:01:55
816 :
814 :2005/11/30(水) 02:04:42
>>813 ポインタを最初の位置に戻すのだったら、最初の位置を別の変数にセーブしておいて
それを=でかぶせる。
1下げるんなら--p。
817 :
デフォルトの名無しさん :2005/11/30(水) 02:08:37
>>815 つりじゃないです><
デクリメントするしかないのですか?
fopenでファイルを開いて、fgetsをつかって一行ずつ読み出すんですけど
一度NULLまで読み込んでまた最初から読み込みたいんですけど。
またfopenからしないといけないんですかね?
818 :
デフォルトの名無しさん :2005/11/30(水) 02:09:51
819 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/11/30(水) 02:11:21
やりたいことがいまいちようわからん ファイルストリームのポインタ操作ならfseekだ。
821 :
デフォルトの名無しさん :2005/11/30(水) 02:12:49
>>817 それって、ポインタではなくてファイルポインタだよね。
固定長レコードのファイルならば、fseek関数を使ってもどす。
可変長レコードのファイルは無理。
頼むから初心者はスレ違いだということに気付いてくれ。
>>817 途中の理解に問題あり捲くりだが、ファイルの読み直しならrewind()で巻き戻せる。
但し、fopen()で開いたものが巻き戻せるものの場合に限るが。
823 :
821 :2005/11/30(水) 02:15:09
可変長ファイルでもファイルの先頭にもどすなら、fseek関数かrewind関数。
>>821 >また最初から
ゆえに、
>可変長レコードのファイルは無理
は間違い。
seekする前にfgetposで現在の位置を取得。 その後、fsetposで元の位置に戻す。
たくさんの返信ありがとうございます。
>>822 すれ違いでしたか><すみません。
でも、これで解決しそうです。がんばってきます。
828 :
821 :2005/11/30(水) 02:23:15
>>825 だから、ファイルの先頭に戻すんだって
そもそも、ファイルのレコードを検索するのにまた頭からなめるって効率悪くねえか!?
ファイルサイズが大きいものでなければ、全部メモリ(=変数)に読み込んで、
変数で処理するのがベター。
小さければ、キャッシュに乗ってるだろう。
基本的には、メモリにマッピングして操作するのが簡単だし速いな。
Cのプログラムを組む上でアセンブラの知識って有るのと無いのとでは全然違いますか?
832 :
デフォルトの名無しさん :2005/11/30(水) 03:50:51
2つの配列を一度に入力するにはどのように書いたらいいんでしょうか? 例えばa[ ]とb[ ]に一度に1 2 3 4 5 6みたいに入れたいのですが。 ポインタはまだわからないです。 cout<<"ベクトルを2つ入力 -->"; for(j=0;j<c;j++) { cin>>a[j]>>b[j]; } 自力だとこうなのですがエラーが出て…
完全に誤爆しました。すみません。
834 :
791 :2005/11/30(水) 08:19:06
>>792 2005はいつ頃発売予定なんでしょうか?待つかどうか分かりませんが
>>791 であげた2つのうちではどっちがお勧めですか?
835 :
743 :2005/11/30(水) 09:00:40
テーブル作ったほうがよさげですね。ちなみに数値の範囲に規則性はなく、iが0未満ならwk=0で61以降ならwk=6にします。
837 :
803 :2005/11/30(水) 11:24:14
スキャナーで読み取ったものを採点へと連動させるようなプログラムが作れないorz
>>835 おいおい、テーブル作るにせよそうでないにせよ、条件をちゃんと見直せよ。
841 :
デフォルトの名無しさん :2005/11/30(水) 14:14:37
LINUXでgetch()使いたい時はどうしたら良いですか?
843 :
デフォルトの名無しさん :2005/11/30(水) 14:25:30
>>842 即答ありがとうございます。^^
理解するのに時間がかかりそうですが...
844 :
デフォルトの名無しさん :2005/11/30(水) 23:14:57
C言語のWindows用のフリーの統合開発環境は例えば何がありますか? あと、Visual C++は価格はおよそどのくらいですか?
値段すら調べられない奴が、言語を使えるとは思えない。
846 :
デフォルトの名無しさん :2005/11/30(水) 23:25:21
あの、下のようなプログラムを実行すると、 2 1 と表示されるんですが、なんで1 2の順番で表示されないのでしょうか? int integer = 1 ; printf ( "%d %d \n" , integer , integer++ ) ;
>>849 に自己レス
何ぼけてるんだ俺は。printfに限らず、関数の引数の評価順序は未定義
今回は、まずinteger++が評価された後で2となったintegerが評価されたから
つーか、FAQに書いてあっただろ
852 :
デフォルトの名無しさん :2005/12/01(木) 00:10:42
>>848 849-850
は逝ってよし
1 1
が正しい。
処理系定義ですら無いよね。 同じコンパイラでも、最適化オプションで簡単に変わっちゃったりするし。 これは関数の引数の評価順だけど 式の評価順も同じ。
855 :
デフォルトの名無しさん :2005/12/01(木) 00:21:54
結果がどうなるかどうかわからんコードは書くなということでしょう >printf ( "%d %d \n" , integer , integer++ ) ;
857 :
デフォルトの名無しさん :2005/12/01(木) 00:24:09
つーかVC6はともかくVC8ってなんだ?
VisualC++2005はVC8.0
>int integer = 1 ; >printf ( "%d %d \n" , integer , integer++ ) ; 最適化して、わざわざこう解釈するコンパイラもある。 printf("%d %d \n", 2, 1); 臍曲がりなコンパイラだと思ったが、最適化しない場合と同じ値になるように工夫されていたようだ。
>>860 MSDNのprintfの引用なんだけど
> 書式指定は必ずパーセント記号 (%) で始め、左から右に解釈されます。
>printf は最初の書式指定 (もしあれば) を見つけると、
>format 直後の引数の値をその書式指定に従って変換して出力します。
>2 番目の書式指定を見つけると、2 番目の引数を変換して出力します。以後も同様です。
>書式指定より引数の数が多いと、余分な引数は無視されます。
>書式指定より引数が少ないと、結果は予測できません。
これは、間違い?
>>864 解釈するってのは引数として渡された値であって、
この場合は引数として渡す値の評価順が不定だから、未定義の動作になる。
文章は間違いではない。
866 :
デフォルトの名無しさん :2005/12/01(木) 00:43:06
>>864 それは、printf関数の中身の処理だね
ここで問題になってるのは、printf関数の引数をスタック上の引数リストに積むときの順番。
これは言語仕様にはないから、不定となる。
フォーマット文字列の解釈が、引数リストと一致しているかどうかの話と 引数を評価する順序は全然別。 (stdcallがどうなのかは知らないが) 昔のpascal呼び出し規約とcdecl呼び出し規約では、 引数がスタックに積まれる順番が逆だったが これも、引数の評価順とは無関係。
868 :
867 :2005/12/01(木) 00:45:17
>>866 それ(積まれる順番)とも違うって俺が書いてたのに
869 :
デフォルトの名無しさん :2005/12/01(木) 00:48:49
>>868 ケツから入れるかもしれないし、先頭から入れるかもしれない。
まあ、そんなことはどうでもいいだろ。処理系の内部事情だから。
870 :
867 :2005/12/01(木) 00:50:38
ん、無関係って事はないか。
評価順がスタックに積まれる順番によって規定されているわけではないって事だな。
実際のコンパイラでは一致する場合が多いけど。
>>869 どうでもいいなら、「引数の評価順は未定義」という意味をちゃんと理解しろよ。
871 :
867 :2005/12/01(木) 00:54:56
872 :
869 :2005/12/01(木) 00:56:25
866=869ですけど
873 :
869 :2005/12/01(木) 00:59:00
「積まれる順番」でなくて「積むときの順番」な
つまり、適当な事(ウソ)を書いておいて、 それを指摘されて「どうでもいい」と逆ギレしたと。
876 :
869 :2005/12/01(木) 01:36:01
>>874 いったい何が問題なのか?
「どうでもいい」のは、引数の評価順とかスタックに積む順番とかの話だ。
それはコンパイラの内部事情の話なので、「どうでもいい」ことなのだ。
つまり、言語仕様には規定されていないことをここで論じてもしょうがない
ということだ。また、処理系の内部事情で結果が変わるようなコーディング
をしてはいけないということだ。
つまりおまえは、自分で書いた
>>866 に対して、
>>869 の「そんなことはどうでもいい」と言ったか?
その「どうでもいい」事を書き始めたのがおまえだろ。
その間違いを他人に指摘されたら
他人に対して(自分で書き始めたくせに)「そんなことはどうでもいい」と言い放つ姿勢が
矛盾してるんだよ。
┏┳┳┓ ハイ. ┏┳┳┓ ┏┫┃┃┃池沼と遊ぶのは ┃┃┃┣┓ ┃┃┃┃┣┓ ここまで ┏┫┃┃┃┃ ┃ ┃┃┏━━━┓┃┃ ┃ ┃ 池沼 ┣┫ . ・∀・ ┣┫. STOP!┃ ┗━━━━┛┗┳━┳┛┗━━━━┛ ┏┻┓┃ ┏━┛ ┣┻┓ ┗━━━┫ ┗━┓ . ┗━━━┛
∩_ 〈〈〈 ヽ 〈⊃ } ∩___∩ | | | ノ ヽ ! ! / ● ● | / | ( _●_) ミ/ <こいつら最高にアホ 彡、 |∪| / / __ ヽノ / (___ ̄\ / (_ノノノ│ ∪
>>880 阿呆は
>>866 だけのように見えますが。
なぜ「こいつら」と纏めてしまうのでしょう?
1. 何を揉めてるのかなど興味がないが、揉める事自体が阿呆。
2. 何を揉めているのか判らない。
3. 実は
>>866
・・・
884 :
866=869 :2005/12/01(木) 02:48:56
いったい何が問題なのか?俺にはわからん。説明してくれ!
866 :デフォルトの名無しさん :2005/12/01(木) 00:43:06
>>864 それは、printf関数の中身の処理だね
ここで問題になってるのは、printf関数の引数をスタック上の引数リストに積むときの順番。
これは言語仕様にはないから、不定となる。
869 :デフォルトの名無しさん :2005/12/01(木) 00:48:49
>>868 ケツから入れるかもしれないし、先頭から入れるかもしれない。
まあ、そんなことはどうでもいいだろ。処理系の内部事情だから。
873 :869:2005/12/01(木) 00:59:00
「積まれる順番」でなくて「積むときの順番」な
>>866 が大嘘だって事だけ理解していれば、
それ以外どうでもいい
886 :
866=869 :2005/12/01(木) 03:00:04
処理系1
1. arg1評価しをprintf関数の引数リストに積む。
2. arg2評価しをprintf関数の引数リストに積む。
3. arg3評価しをprintf関数の引数リストに積む。
4. printf関数へジャンプ
処理系2
1. arg3評価しをprintf関数の引数リストに積む。
2. arg2評価しをprintf関数の引数リストに積む。
3. arg1評価しをprintf関数の引数リストに積む。
4. printf関数へジャンプ
int integer = 1 ;
printf ( "%d %d \n" , integer , integer++ ) ;
の結果は
処理系1では 1 1
になるだろうし
処理系2では 2 1
になるだろう。
これのどこが大嘘なんだ
>>885
ケツからいれるってのが不謹慎って事ですね。
889 :
866=869 :2005/12/01(木) 03:14:40
>まあ、そんなことはどうでもいいだろ。処理系の内部事情だから。 の「そんなことはどうでもいいだろ」は確かに、不適切な表現ではあったな。 誤るよ。
補足。 そんな内部事情は本当にそれこそ「どうでもいい」こと。 C言語において、引数の評価順は「不定」。 そして、それはスタックに積まれる順番などという話とは関係ない。 「スタックに積む」と「式を評価する」の間に関係があるとしても それは単に処理系内部の都合だけであって、 C言語の仕様の話の中に「スタックに積む順番が」という話を持ち出すのは間違い。
891 :
866=869 :2005/12/01(木) 03:18:45
>>890 ご指摘ありがとう。そのとおりだ。
スタックを使わないものもあるからね。
おっと、まだ分かってなかったか。
>>890 にも書いたが、
「式を評価する順番」と「評価した結果(値)をスタックに積む順序」に関して
仕様は何一つ規定していない。
つまり、この2つをさも関係あることのような書き方をしている
>>866 は大嘘。
893 :
866=869 :2005/12/01(木) 03:24:30
>>892 おっ!まだおきていたか。
>「式を評価する順番」と「評価した結果(値)をスタックに積む順序」に関して
>仕様は何一つ規定していない。
まあ、厳密にいうとそのとおりだな。
さきに引数の評価をすべてしてしまうからかもしれないからな。(ショボーン)
>>888 先に断って、かつワセリン使えば不謹慎という程でもない。
>863を読んでいれば評価の順序と積む順序に関連がないことくらい想像つくだろうに。
896 :
デフォルトの名無しさん :2005/12/01(木) 04:14:37
???
あるメモリ(変数)が動的に確保中のメモリかどうか、というのは調べることができませんか?
isdyna
>>897 出来ないし、出来る必要も存在しないはずだ。
確保中のメモリってなんだろ。 確保済みのメモリなら判らんでもないけど。 #今まさにヒープから確保されようとする最中のメモリ?w
scanf()で%cで受けるのは一般的じゃないんでしょうか? scanf()を使わないから知らなかっただけなんだろうか? 仕事でCを使ってる人が知らなかったんだが...
使ってないから知らないんだろ
>>901 あまり使いたくなる場面に出会ったことはない。
freadするか、fgetc系使うかの方が多いな。
>>901 気にするな、そんな香具師は掃いて捨てるほどいる。
特にprintf()系やscanf()系は不勉強な香具師が多い。
漏れの体験だが、sprintf(buf, "%*.*s", len, len, str);と
書いただけで「難しいプログラムを書きますね」と言われたぞ。
>>906 そうだねw。最初にでかい領域を確保して、細切れにして使うわけね
・・・残念ながらそれは回答の名に値しないな
908 :
901 :2005/12/01(木) 11:29:34
printf()、scanf()はかなり難しい関数と聞きました。 scanf()は使い勝手が悪いとも感じるんですが... やっぱしちゃんと勉強しといた方が良いんですよね...
>>907 メモリ管理するのに、その方法しかないわけじゃないし。
>>908 Cで文字列を加工するには、sprintf()/sscanf()はそれなりに使える。
一通り覚えておくといいと思う。
#例えば、典型的な空白を含む文字列をsscanf()で切り出すには"%[^ ]"を使うとか。
>>897 アドレスの値で大体分かるんじゃないか?
静的、スタック、ヒープでアドレス表示してみれば、
それぞれのアドレス範囲は明らかに違うはず。
912 :
デフォルトの名無しさん :2005/12/01(木) 20:15:37
質問です。UTF-8をShift-JISに、Shift-JISをUTF-8に変換したいのですが、 既にライブラリなどであるならばそれを使いたいと思うのですが、 探しても処理系の機能を利用するものばかりで、純粋に変換するライブラリは見つかりませんでした。 どなたかそういったライブラリをご存知でしたら教えてもらえませんか?
iconv
iconv(に限らないけど)、Shift_JISとCP932の違いを把握しておかないとヤヴァイ
>>913-914 Thx。iconvって名前しかしらなかった。
GNUのライブラリを使った経験が無いけどトライしてみる。
Cygwin上のgccで-mno-cygwinでコンパイルしたらiconv.hが見つからなくなった
curses.hは時代遅れですか?
919 :
・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/01(木) 22:35:38
>>917 mingw環境のほうにiconvがインスコされてないんじゃね?
>>919 その通りでした。結果的にCygwinスレとのマルチポストになってしまい申し訳ない
921 :
デフォルトの名無しさん :2005/12/02(金) 15:05:15
int型のシンボルに数値を埋め込む場合どうしたらいいですか?
922 :
デフォルトの名無しさん :2005/12/02(金) 15:07:55
short intの誤りでした
意味が分からん
short int hoge = 123; とかでいいんじゃない?
925 :
デフォルトの名無しさん :2005/12/03(土) 20:57:52
よろしくおねがいします #include<stdio.h> #include<math.h> int main(void) { printf('%f', sin(45)) return 0; } とすると0.85904 となります。 でも実際は0.707です。 どうしたらなおせるのでしょうか?
ウサマ・ビン・ラジアン
せめてコンパイルが通るプログラムを持ってきてください><
929 :
925 :2005/12/03(土) 21:05:00
すいません。元のソースはこれです。 #include<stdio.h> #include<stdlib.h> #include<math.h> int main(void) { FILE *fp; double Q=1000.0, gamma=0.000008; //設計定数 double A, seita; //変数 double W, g1, g2; //目的関数 double sin(double seita); double cos(double seita); fp = fopen("beam.in", "r"); if(fp == NULL) { puts("beam.inが開けません"); return 1; } /* beam.inから設計変数読み込む */ fscanf(fp, "%lf %lf", &A, &seita); fclose(fp); fp = fopen("beam.out", "w"); if(fp == NULL) { puts("beam.outが開けません"); return 1; }
930 :
925 :2005/12/03(土) 21:05:41
W = (16 * 0.001 * A) / (sin(seita)); g1 = A * sqrt(1 - pow(sin(seita), 2.0)); g2 = (Q) / (2 * A * cos(seita)); printf("%f", sin(seita)); fprintf(fp, "%f %f %f", W, g1, g2); fclose(fp); return 0; }
931 :
925 :2005/12/03(土) 21:08:10
それで、beam.inに14.14 45.0と入力して表示すると printf("%f", sin(seita)); からなぜか 0.85904 が表示されます。。
いまは、関数すら調べずに質問するのが流行なのか?
どの言語でも標準API だと三角関数の引数はほぼラジアンだよな。
>>933 Radianが分からないってオチじゃね?
もう氏んでくれって感じだが
936 :
925 :2005/12/03(土) 21:15:45
いや、素直に radian と書けば良いのにわざわざ くだらんだじゃれにかけてる奴が悪い
いや、素直にリファレンス見れば良いのにわざわざ くだらん質問してる奴が悪い
printf('%f', sin(45 * 3.1415927 / 180))
2 ち ゃ ん ね る ( ´,_ゝ`)プッ
>質問する前には最低限検索を。
943 :
デフォルトの名無しさん :2005/12/04(日) 00:06:03
システムコールの授業で「標準入力からテキストを入力し、空行を取り除いて標準出力に出力するプログラムを書け。ただし、入出力を行うシステムコールを直接使用すること。」っていう課題が出ました。 下のプログラムをもうちょっと改良したらできるらしいのですが……お願いします。 #include <stdlib.h> #include <unistd.h> main(){ charbuf[1024], buf1[1024], *p; ssize_tlen, len1, len2; charc, s = '\n',n; size_ti,j; while ((len = read(STDIN_FILENO, buf, sizeof(buf))) > 0) { len1 = 0; for (i = 0; i < len; i ++) { c = buf[i]; if (!(s == '\n' && c == '\n')) { buf1[len1] = c; len1 ++;} s = c; printf("%c",s);} p = buf1; while ((len2 = write(STDOUT_FILENO, p, len1)) >= 0 && len1 > len2) { len1 -= len2; p += len2;} if (len2 == -1) { exit(1);}} if (len == -1) { exit(1);} return 0;} よろしくお願いします。
Macかyo
945 :
デフォルトの名無しさん :2005/12/04(日) 00:16:50
そうです。ってか宿題はここじゃなかったんですねヾ(;´▽`` ごめんなさい!!!
汚いソースだな こんなもん教材に使ってるから いつまでもセキュリティホールが埋まらないんだよ
いやソース自体は
>>943 が書いたんじゃないのか?
読む気が失せるのは同じだけど。
948 :
デフォルトの名無しさん :2005/12/04(日) 00:36:21
授業って何? プログラムって学校で習うもんなの? そんな授業おれの学校にあったら・・・ うはーww夢がひろがりんぐww てか、高校?進学校とかではやらないよね 専門学校とかかな。。
949 :
デフォルトの名無しさん :2005/12/04(日) 00:56:05
大学でプログラミングの授業やってるんです。
問] 関数str_ncmp():src1が示す文字列とsrc2が示す文字列をn文字まで比較し、同じなら0を返し 異なるならば0以外の数値を返す。 [書式]int str_ncmp(char *src1, char *src2, int n) (注)stdio.h以外のヘッダファイルは使ってはいけない。
>>950 次からは宿題スレに逝け
int str_ncmp(char *src1, char *src2, int n)
{
int i;
for(i = 0; i < n; i++){
if(*src1 != *src2){
return 1;
}
src1++;
src2++;
}
return 0;
}
>>949 d
やっぱ大学じゃないとやらないのか
高校入る前から鬱だ。。
#include<stdio.h> int main(void){ char array[10][10]; char **p; p=array; } これをコンパイルすると warning C4047: '=' : 間接参照のレベルが 'char ** ' と 'char (*)[10]' で異なっています。 って言われたんですけど何かおかしいですかね?
#include<stdio.h> int main(void){ char array[10][10]; char (*p)[10]; p=array; }
arrayはarray[10][10]の先頭のアドレスを持つ。
結局arrayは&array[0][0]と同じでchar *型ということですか。 納得しました。
>>957 アドレスは同じだが、意味は全然違うぞ。
961 :
デフォルトの名無しさん :2005/12/04(日) 19:57:36
あるデパートでは、買い物3000円以上なら1割引、5000円以上なら2割引で販売している。 キーボードから買い上げ金額を入力して、支払い金額を計算するプログラムをつくりなさい。 ただし、消費税は考えないものとする。 自分なりにやってみたがダメだった↓ #include<stdio.h> int main(void) { int a; printf("買い上げ金額="); scanf("%d",&a); if(a>=5000){ a=a*20/100; printf("支払い金額=\n",a); } else if(a>=3000){ a=a*10/100; printf("支払い金額=\n",a); } else{ printf("支払い金額=\n",a); } return 0; }
#include <stdio.h> int main() { int a; printf("買い上げ金額="); scanf("%d",&a); if(a >= 5000) a *= 0.8; else if(a >= 3000) a *= 0.9; printf("支払金額=%d\n", a); return 0; }
>>948 うちの高校にプログラムの授業あるよ。工業高校だけどね。
↓こんなテキスト使ってる
#include <stdio.h>
void main(void) {
int data[5] = {10, 20, 30, 40, 50};
int *p;
int i, n;
n = 0;
p = data;
for(i = 0; i < 5; i++) {
n = n + *p;
p++;
}
printf("合計%d\n", n);
}
もう俺は慣れたよ。。
2980円より3000円の方が安いんだな。
a=a*20/100; ?
支払い金額が表示されない。 #include<stdio.h> int main(void) { int a; printf("買い上げ金額="); scanf("%d",&a); if(a>=5000){ a=a*0.8; printf("支払い金額=\n",a); } else if(a>=3000){ a=a*0.9; printf("支払い金額=\n",a); } else{ printf("支払い金額=\n",a); } return 0; }
969 :
961 :2005/12/04(日) 20:22:24
こうか! #include<stdio.h> int main(void) { int a; printf("買い上げ金額="); scanf("%d",&a); if(a>=5000){ a=a*0.8; printf("支払い金額=%d",a); } else if(a>=3000){ a=a*0.9; printf("支払い金額=%d",a); } else{ printf("支払い金額=%d",a); } return 0; }
>>969 支払い金額の表示
最後に一個書けばいいと思わない?
#include<stdio.h> int main(void) { int a; printf("買い上げ金額="); scanf("%d", &a); if(5000 <= a) a *= 0.8; else if(3000 <= a) a *= 0.9; printf("支払い金額=%d", a); return 0; }
973 :
デフォルトの名無しさん :2005/12/04(日) 20:42:23
キーボードから「c」を入力した時に「OK!」、それ以外の時には「NG!」と出力するプログラムをつくりなさい。
宿題スレに行きなさい
975 :
デフォルトの名無しさん :2005/12/04(日) 20:43:31
cでパターンまっちを実装した拡張ないですか?
あるよ
977 :
970 :2005/12/04(日) 20:47:33
978 :
デフォルトの名無しさん :2005/12/04(日) 20:50:20
979 :
デフォルトの名無しさん :2005/12/04(日) 20:51:12
何でここはID無いの?
982 :
aaa :2005/12/04(日) 20:53:13
出なかったw ハズカシス
2 名前: デフォルトの名無しさん [sage] 投稿日: 2005/12/04(日) 20:49:15 IDチェック
そんな瑣末ごとはどうでもいい
みんなスーパーハカーだから、IDなんていらないんだよ。
へー
regex
ってどう発音するんですか?
>>991 “regular expression”と読むんじゃないか?
れげっくす
れぐいーえっくす
れじっくす
りじぇっくす
セックス
れじぇっくす
999 :
992 :2005/12/05(月) 01:17:43
普通は略さないで読むんですか? ネイティブの人とかはどう発音してるんだろう
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。