1 :
v(^o^i)d :
04/06/25 17:14
2 :
デフォルトの名無しさん :04/06/25 17:15
4 :
デフォルトの名無しさん :04/06/25 17:18
前スレ
>>998 スゲー笑った。
しかも突っ込む機会すら与えない場所だし。
1000で突っ込まれてるけどな
5ゲット 乙
orz
8 :
デフォルトの名無しさん :04/06/25 17:26
>>1 さんお疲れ様です。
前スレ989です。
どうも分からないのですが、
真ん中(count==5)は、その状態の時だけ{}の中が実行されるという意味ではないのですか?
countに5が代入されてしまうのですか?
int count; for(count=0; count<=5; count) { if (count==5) printf("count==%d",count); }
そりゃif文だ。 forのそれはループの終了条件、 故にtrueになった時点でループから抜け実行されない
俺もやっちまった orz
count = 5 → countに5を代入。式全体は5。 count == 5 → countが5ならtrue(1)。 =と==は別物
int count; for(count=0; count<=5; count++) { if (count==5) printf("count==%d",count); }
for(count=0; count<=5; count++); printf("count==%d",count);
>>15 いやそれだったら count<5 でしょw
俺もそれでいんでね?とか思ったけど
あ、そらそうや
あれだな テニスでいうとドロップショット打たれましたみたいな。 野球で言うとチェンジアップ打たれましたみたない。 お前ら間違えすぎ
19 :
デフォルトの名無しさん :04/06/25 17:44
>>10 えっとつまり、count==6にすればいいということですか?
include <stdio.h>
void main()
{
int count;
for(count=0; count==6; count++){
printf("abc\n");
}
}
今度はこれで試してみようとしたらvoidが構文エラーになってしまいました。。
20 :
デフォルトの名無しさん :04/06/25 17:47
お前ら いま 輝いてるぞ。
メシでも食って風呂入って、それから考えてみな。
考える前に知識を
#include <stdio.h> main(void) { int count; for(count=0; count<=5; count++){ printf("abc\n"); } return 0; }
>>19 C言語を使えるようになることはないと思う。あきらめれ。
27 :
デフォルトの名無しさん :04/06/25 18:11
>>24 ありがとうございます。forのことを勘違いしてたみたいです。
「countが5の時だけ表示」とするのはforだけじゃできないんですね。
#include <stdio.h>
main(void)
{
int count;
for(count=0; count<=6; count++){
if (count==5){
printf("%d\n",count);
}
}
return 0;
}
で出来ました。みなさんありがとうございました。
では。
28 :
デフォルトの名無しさん :04/06/25 18:29
a = 5; 代入って言い方、変じゃない? 代入かなぁ? って思うよ。 あと、"function"を「関数」って言ったりも変。 全然関数になってないfunctionもあるし。 数学の時の訳を、そのまま使っちゃってるのかな? 元は何て言葉だったのかな? 代入って。
for(count=0;count<=6;if(count==5)printf("%d\n",count);count++); ほら、for だけで、できている(ように見えるだろ)。
>>28 変なら替わりになんて言葉を使ったらいいんだ
それは一体何言語のソースですか
しまった・・・・orz for(count=0;count<=6;if(count==5)printf("%d\n",count),count++);
お前、アフォかバカかどっちだ?
アフォです。
#include <stdio.h> int main(void) { int count; for(count=0;count<=6;if(count==5)printf("%d\n",count),count++); return 0; } In function `main': 5: error: syntax error before "if"
for(count=0; (count==5)?printf("%d\n", count),0:1; count++); だろ。
初歩的ですが教えてください。 ファイルをオープンするというのは内部的には何をやっている のでしょうか?まさかメモリに読み込んじゃいないですよね?
内部とは?
>>40 ファイル管理システムに「開いたよ」というのを登録してる。
>>40 Oh!Yes!とかパイ乙が何か色々してる。
stdio.h に構造体 FILE の定義が書いてあるよ
45 :
デフォルトの名無しさん :04/06/25 19:55
int true() { return 1; }; int false() { return 0; }; void *null() { return (void *)0; };
int n, m = 5; if ( n = m ) { ; } とやるとif内の評価式はどうなるんでしょうか?n = mが正常に終了したとして 1になるのか、それとも n = mの式自体の値として5でしょうか?
#include <stdio.h> int main(void) { int n, m = 5; printf("(n = m) == %d", n = m); return 0; } $ ./a.out (n = m) == 5
m = 0 にしてやってみたら分かるやんけ
49 :
デフォルトの名無しさん :04/06/25 20:27
質問が初歩過ぎてつまらない。 こんな序盤で人にきいてばっかいるなよ。 先ずはマニアル読めよ。
age房はロクな書き込みしてないようだがな。
>>47-48 さん
ありがとうございます。ちょっと手を変えてテストすれば分かることでしたね。
>>40 kernel2.6系fsがext2なら
open(2)
sys_open
filp_open
dentry_open #ext2ならこの中で
generic_file_open
おじゃまします。。 自分でMPIの勉強をして来いといわれたので、 Windows上で動くバーチャルマシンのようなものを 探しているのですが、いいものをご存知でしょうか? よろしくおねがいします。。
>>42 レスどうもです。
なるほど。それでもしかして排他制御とかできるんですかね。
#include <stdio.h> int main(){char a[99],b[99],*e="+-*/",*f;int s=0,c;float m=0,n;while(1){printf( "%f :",m);fgets(a,99,stdin)?0:exit(0);if(sscanf(a,"%s",b)>0){if(sscanf(b,"%f", &n)>0){m=s?c?c-1?c-2?m/n:m*n:m-n:m+n:n;s=0;continue;}else{if(!b[1] && (f=strchr (e,*b))){s=1;c=f-e;continue;}}}*a-'q'?0:exit(0);puts("Input errror (type 'q' t" "o exit)");}} このプログラム以前作ってもらったやつだが、コンパイルできん。 コピペじゃいかんのか? 初心者で全然わからん
ハーマオイニーたんカワイイ
#include <stdio.h> #if 0 int main(){char a[99],b[99],*e="+-*/",*f;int s=0,c;float m=0,n;while(1){printf( "%f :",m);fgets(a,99,stdin)?0:exit(0);if(sscanf(a,"%s",b)>0){if(sscanf(b,"%f", &n)>0){m=s?c?c-1?c-2?m/n:m*n:m-n:m+n:n;s=0;continue;}else{if(!b[1] && (f=strchr (e,*b))){s=1;c=f-e;continue;}}}*a-'q'?0:exit(0);puts("Input errror (type 'q' t" "o exit)");}} #else int main(){return 0;} #endif これならコンパイルできるぞ
>>57 コンパイラが腐ってるんだろ。うちではコンパイル通った
64 :
デフォルトの名無しさん :04/06/25 21:34
> m = s ? c ? c - 1 ? c - 2 ? m / n : m * n : m - n : m + n : n; こんな書き方見たことない・・・ 多分内側から順番に展開されると思うんですけど、最終的にどうなるんですか? m = s ? m + n: c ? m - n: c - 1 ? m * n: c - 2 ? m / n: n; インデント崩れると思いますので↑エディタにコピペして見てください
>>65 それちがう。
if (s) {
if (c) {
if (c - 1) {
if (c - 2) {
m = m / n;
}
else {
m = m * n;
}
}
else {
m = m - n;
}
}
else {
m = m + n;
}
}
else {
m = n;
}
と同じ。
m = s ? c ? m - n: c - 1 ? m * n: c - 2 ? m / n: m + n: n; 三項演算子で展開するのはここまでが限界かな。
#define __TEXT(q) L##q となっている場合に__TEXT("hoge")はどのような展開をされるんですか? また、ここでの##とはどういう意味を持つのでしょうか? Googleで検索しにくい(記号を含むため)ので、どうかご教示下さい.
>>61 コンパイルできたが、実行してもできん
電卓のシュミレーターなんだが
>69 トークン連結演算子と言うんですね。ありがとうございます
72 :
デフォルトの名無しさん :04/06/25 23:06
if文でbreakは使ってもいいんですか? おしえてください。
73 :
デフォルトの名無しさん :04/06/25 23:08
if文から抜けるってこと
74 :
デフォルトの名無しさん :04/06/25 23:12
hyouka(int point){ if(point>10){return('A');break;} if(point>=7){return('B');break;} if(point>=4){return('C');break;} if(point<=3){return('D');break;} } この関数は正常に実行されますかね?
break文について書いてある入門書を読むことをお勧めする。
ごめんなさい char hyouka(int point){ if(point>10){return('A');break;} if(point>=7){return('B');break;} if(point>=4){return('C');break;} if(point<=3){return('D');break;} } の間違いです。 で、これは実行されますかね?
77 :
デフォルトの名無しさん :04/06/25 23:16
基本的に、breakはループから抜けるために使うのですよ。 普通は、while, for文などから抜けるために使用します。 returnは、関数から抜けるのに使用します。 はっきり言って、>74のプログラムはおかしいと思います。
78 :
デフォルトの名無しさん :04/06/25 23:18
for(i = 0; i < 2; i++) { switch(i) { case 0: break; } }
79 :
72,74,76 :04/06/25 23:18
入門書を読んだのですがあまりif文中にbreakを使っている例がなくて こまってます。 でも使っちゃいけないともかいてないのでさらに困るわけです。
80 :
72,74,76,79 :04/06/25 23:19
>>77 サンクスです。
今日のテスト激しく減点のヨカーン・・・(TT)
82 :
デフォルトの名無しさん :04/06/25 23:22
>76 の場合だと、 char hyouka(int point){ if(point>10){return('A');} if(point>=7){return('B');} if(point>=4){return('C');} if(point<=3){return('D');} } で十分では? returnが実行された時点で、 hyoukaという関数を抜けるので、 breakはまったく意味がないと思います。
おまえ、コンパイルしてみてから来いよ。
84 :
72,74,76,79 :04/06/25 23:25
>>82 言われてみれば確かに・・・elseも必要ないみたいですね。
>>83 今日テストがあって(ペーパー)今家に帰ってきたんですが、
家ではできないんですよ。
なんとかすりゃできるのかも知れませんが初心者なもんで・・
ここからは C言語ならK&Rに聞け! Part 83 に改編しました
87 :
デフォルトの名無しさん :04/06/25 23:29
>>79 明らかに釣りだな
おまえ要するに break/goto を使っちゃいけない
理由を誰かに聞かれて返答できなくて
本読んでもわからなくて、
ここへ聞きに来たんだろ
で、ご予算は?
88 :
72,74,76,79 :04/06/25 23:29
K&R プログラミング言語C ってうちの教授が推奨してました。 ちなみに僕は 「定本 明解C言語 入門編」 を持ってます。 ま、どうでもいいですよね。
89 :
デフォルトの名無しさん :04/06/25 23:30
>79 その入門書はかぎりなくへぼいような気がする。。。 他の入門書を買うことをおすすめする。
90 :
72,74,76,79 :04/06/25 23:30
fgetcとgetcの違い、使い分けがあれば教えていただけませんか?
93 :
72,74,76,79 :04/06/25 23:33
>>81 スイッチでもいいんですが、ifを使いたかったんです。
理由は、switchよりもifを先に習ったので。
>>92 stdinをfgetcするのがgetc。
ここだとswitchかえって面倒
K&R原書はCの開発者本人が書いた仕様書付きの書籍で 我々が言っているK&Rはその原書をベル研に出向していた人が訳した本 K&R以外のCの本はパチもん
97 :
デフォルトの名無しさん :04/06/25 23:44
最後の >if(point<=3){return('D');} は、 return('D'); でいいんだろ。
>>97 >言われてみれば確かに・・・elseも必要ないみたいですね。
彼(彼女?)はきっとこれをelseだと解釈しているみたい
>>94 ん〜、よく分からん
両方こういう書き方でfpから1文字入力。戻り値は正常なら入力された文字、エラーならEOFですよね
int getc(FILE *fp)
int fgetc(FILE *fp)
stdinが関係ありそうなのはgetsとfgetsじゃないんですか?
>>76 何のために break したがってるのかがわからん。
101 :
72,74,76,79 :04/06/25 23:49
ですよね。 でもいろいろわかりました。 ありがとうございました。
同じエラー処理を延々何度も書き連ねるよりもgotoを使ったほうが余程良い
>>92 getcはマクロを使って実装されているかもしれない。
そのため、
・副作用のある引数を渡した場合に予期しない状態になるかもしれない
・getcの関数ポインタを取得できないかもしれない
(ほかに影響があるかもしれないけど)
通常使う分にはどちらを使ってもかまわないと思うけど、どちらかと言うと
fgetcの方が安心かも。
104 :
デフォルトの名無しさん :04/06/26 00:10
92 ではないが、マクロのgetc を使う利点ってのはなんだろ? どこにも過去の互換性などという言葉がでてこないから、 なにかあるがために、マクロのgetc と関数のfgetc がある わけだよね。 あんで?
は?fgetcはFILE(ファイルだったりstdin/outだったり)から読むんでしょ
うわ、違うジャン 使わないものは忘れるのね(逃
>・副作用のある引数を渡した場合に予期しない状態になるかもしれない >・getcの関数ポインタを取得できないかもしれない ここらへんって標準ライブラリの仕様として何か規定があるの? それとも一切縛りなし?
手元の解説書には、「マクロとして実装される場合があることを除き、getcはfgetcと等価」と書いてある。
よく聞くのは、関数呼び出しよりもマクロの方が速いからという理由。 ベンチとったこと無いから分からんが、今じゃほとんど変わらないのでは という気もしなくは無い。
call 〜 retのオーバーヘッドが気になる場合にはgetc()のほうがいいかも。 ループ内で数億回まわしたら差が体感出来るかもしれない。
#define getc(a) fgetc(a) かもしれない。
初心者は何も考えずfgetc使っとけ、ってことでいいですか?
>>112 標準入力を扱うんであれば普通にgetcでいいと思うよ。
>>109-110 昔は16ビットのCPUでクロック12MHzとか言ってたわけで。
マクロと関数の速度差を身をもって体験した奴も多かったんじゃないかな。
今となっては、仰せのとおりで。
ゲットチャーってよむんだよ、ばーか。
ゲッチャーだろ
キャラじゃなくて? characterのcharだろ?
ゲットシャーだお
プログラムのビデオ見せられたとき char は 「キャー」と読んでたので ゲットキャーじゃねーの?
>>119 じゃあ fgets() は げっとす か?
>>121 ネイティブな発音だとゲッキャーくらいになるのかね?
>>121 Cのビデオなんて、
あなたはHな人ですね。
呼んだ?
128 :
デフォルトの名無しさん :04/06/26 01:05
> 旧MacOSは改行コードが\rだった。 これはうそ。いまのMacOSでもAqua側のアプリケイションでかけばふつうに0x0dです。 そういえば、昔懐かしいOS/9も0x0dですね。MC68000用が出たところまでは覚えてる んだけどその後どうなったのだろう? > CP/M-86は改行コードが\r\nで、ファイル末尾のレコードは\x1bが詰められていた。 CP/Mにかぎらず、汎用機系は多かったね。末尾の0x1aは、テキストファイルにかぎった もので、ディレクトリーにファイルサイズが書いてなかったので、セクターブロック単位 でしか、「ここが終わり」がわからなかっただめです。 > MS-DOSもファイル末尾に\x1bが付加されているのが普通だった。 これは大うそ。MS-DOSでそんなものをつけるのは、edlin.exeだけです。 (あとは、それをみて勘違いした日本のごく一部のソフトだけ。)
129 :
デフォルトの名無しさん :04/06/26 01:09
> 943 :デフォルトの名無しさん :04/06/25 14:28 > K&Rを真似てvoid mainにしたら散々こき下ろされますタ。 こいつもウソつき。そんなことは書いてない。
あっそ
131 :
デフォルトの名無しさん :04/06/26 01:15
> 全然関数になってないfunctionもあるし。 > 数学の時の訳を、そのまま使っちゃってるのかな? もとの英語でも数学用語の流用的に「function」と「assign」を使っているのだから、 「函数」「代入」「添字」と訳すのは「正しい」 まあ、化学で、酸と塩基が結合してできる「塩」(えん)は、 英語ではなんていうか知ってるか?
なんか誤爆されまくりの様相
一日中張り付いてるわけにもいかないからひとまず前スレに突っ込み入れてるんでしょう
>>128 は少し参考になった。Cとはほとんど関係ないけど
134 :
デフォルトの名無しさん :04/06/26 01:23
ありがとうございます。正しく空白をあけたらコンパイルできました。 #include <stdio.h> int main() { char a[99], b[99], *e = "+-*/", *f; int s = 0, c; float m = 0, n; while (1) { printf("%f :", m); fgets(a, 99, stdin) ? 0 : exit(0); if (sscanf(a, "%s", b) > 0) { if (sscanf(b, "%f", &n) > 0) { m = s ? c ? c - 1 ? c - 2 ? m / n : m * n : m - n : m + n : n; s = 0; continue; } else { if (!b[1] && (f = strchr(e, *b))) { s = 1; c = f - e; continue; } } } *a - 'q' ? 0 : exit(0); puts("Input errror (type 'q' to exit)"); } }
135 :
デフォルトの名無しさん :04/06/26 01:25
> K&R訳書版第二版281ページ やーい > 訳本 へぼ
136 :
デフォルトの名無しさん :04/06/26 01:27
> よく聞くのは、関数呼び出しよりもマクロの方が速いからという理由。 いまどきinline関数で実装するのがふつうだろぼけ > gets
>>135 つーかおまいはあれか。キーボードスレ荒らしてた阿呆か。
最近、どーでもいい所に出てきて荒らす奴は全員生越に見えてきた。やばいねー。
139 :
デフォルトの名無しさん :04/06/26 01:30
ogo氏は先週亡くなりました。
え、本当?うわーい、犬板のスレ見てこよう。
141 :
デフォルトの名無しさん :04/06/26 01:33
えらそうにK&Rのページ数言ってるのがいいのだが、 それが訳本のほうだというのが、かなりはずかしい ;-)
貴様は日下部かと
143 :
デフォルトの名無しさん :04/06/26 01:34
ちゃんぺ
144 :
デフォルトの名無しさん :04/06/26 01:35
函数は「function」の音訳だ。 なるべく発音が似るように
犬板から生越のスレが消えてた!残念!
146 :
デフォルトの名無しさん :04/06/26 01:37
unsigned short a, b; a = b - 1; のような場合でも、右辺は一旦intに格上げされるんですか? VCで-W4でコンパイルするとウォーニング出るんですけど。
ウォーニングきたー
148 :
デフォルトの名無しさん :04/06/26 01:41
ようするに技術的な内容には答えられないやつなのね
VC2003 /W4 警告でません
>>131 > まあ、化学で、酸と塩基が結合してできる「塩」(えん)は、
> 英語ではなんていうか知ってるか?
base
ついでに言えばVMwareスレを荒らしてたのもおまいか。 って流石にアレは馬鹿すぎたから違うな…。
構造体のメンバ値を構造体定義時に決めることは出来ませんか? struct hoge { int n = 0; };というようにしたいのですが、これではコンパイルエラーが出ます。
strlenはなんて読む? ストアレンが大半かな?
ランタイムライブラリとWIN32APIの特徴って何? APIがDLLであるってだけですか? また、マルチスレッドなプログラムではAPIは使えないって見たけど、 それはなぜですか?
>>155 > ランタイムライブラリとWIN32APIの特徴って何?
さあ
> マルチスレッドなプログラムではAPIは使えないって見たけど、それはなぜですか?
排他処理の問題
Win32APIはスレッドセーフだよ
>>155 WIN32APIスレで聞いた方がよかったような
ランタイムライブラリ
ANSIで定められたもの+αを収録。なのでWindowsでない環境でも殆どは同じ関数がある。
WIN32API
ANSI C/C++はWindowsのコマンドプロンプトみたいな文字列しか入出力できない環境を想定していているから
ウィンドウ・マルチスレッドなど、Windows環境限定だったりOSとして用意しておいた方がよさそうな物だったりが中心。
159 :
デフォルトの名無しさん :04/06/26 07:31
>>153 struct hoge {
int n;
int b;
} hage[]={{0,1},{1,2}};
161 :
デフォルトの名無しさん :04/06/26 09:24
%をstdoutに出力したいのですが,どうすればいいのでしょうか…. printf("文字列%文字列"); printf("文字列\%文字列"); では,いずれも無理なのですが…。
%%
164 :
デフォルトの名無しさん :04/06/26 09:35
> strlenはなんて読む? > ストアレンが大半かな? なんで「str」が「すとあ」なんだ? じゃあstrcmpやstrstrもそう読むのか? なんかstrore.hでもインクルードしそうだな。 > base それは塩基だろ
165 :
デフォルトの名無しさん :04/06/26 09:41
> getcの話してんだろボケ getcの話にきまってるだろ
166 :
デフォルトの名無しさん :04/06/26 09:44
アセンブラスレに、今時アセンブラなんてなんの意味があるんですか? とかぬかすドキュンが絶えず流れこんでくるんだが、おまえらどうにかしろよ。 最近じゃアセンブラもかけないCプログラマがいるっていう話らしいからな。 全部おまえらのせい。
読み方と言えばブラシハンドル(HBRUSH)を ハブラシって読んでる。脳内では。 口には出せないが…
168 :
デフォルトの名無しさん :04/06/26 09:59
>>165 ハァ?
何いってんの?
よく読んでみろよ
169 :
デフォルトの名無しさん :04/06/26 10:02
>>161 ,162
printf("%s", "文字列%文字列");
第一引数にベタ書きするなよボケ。
170 :
デフォルトの名無しさん :04/06/26 10:03
読む読まないは関係なく、getcの話に決まってるだろ。 getcはいまどきinline関数で実装するのが常識。マクロにはしない
171 :
デフォルトの名無しさん :04/06/26 10:06
> 第一引数にベタ書きするなよボケ。 ふつうする。
たまに printf(s); とか見かけるとさすがにそれはないんじゃないかと思う。
173 :
デフォルトの名無しさん :04/06/26 10:11
putsでいいじゃん。
175 :
デフォルトの名無しさん :04/06/26 10:12
printf(a, b);はよくやるけどなあ
printf("%s\n", "HELLO, WORLD.");
178 :
デフォルトの名無しさん :04/06/26 10:20
putsは改行するところがいいんだろ
179 :
デフォルトの名無しさん :04/06/26 10:21
puts(char *s) { printf("%s", s); }
ベタ書きのクセがついてるプログラマがフォーマットストリングバグの温床
181 :
デフォルトの名無しさん :04/06/26 10:26
マクロかどうかなんて関係あっちゃいけねえんだよ マクロにすることによって 原 仕 様 が 守 れ な い ようなら、それはベンダの責任範囲に属するバグだ ユーザ側でするべきことはコンパイラのバグに対するのと同類の対策であり 決してそれが正しいと思ってはならない
182 :
デフォルトの名無しさん :04/06/26 10:29
> マクロかどうかなんて関係あっちゃいけねえんだよ > マクロにすることによって > 原 仕 様 が 守 れ な い っていうか、もともとのCのgetcはマクロで実装されてただろ
#define puts(s) fputs(s, stdout)
goto使う時点で設計ミスだな。 僕一人では何もできないよママン・・・か?w
185 :
デフォルトの名無しさん :04/06/26 10:35
>>182 お前の言う「もともとのC」とは何のことだ
>>180 printf(szStr);とかは駄目だが、printf("String");は別に良いだろ。
187 :
デフォルトの名無しさん :04/06/26 10:49
>>186 おれもそう思う
何が危険かがわかってないやつほど
#define OK (0)
return (OK);
とか書くのと同じ
ただし、リテラルを埋め込みで使うこと自体に
別な意味で抵抗がある場面もある
キチガイにマジレスはいらない。
189 :
デフォルトの名無しさん :04/06/26 10:59
>>188 は、誰に噛み付いているのかも示せないチキン君
どうしてプログラマってみんな パチンコが嫌いなの? 何か理由があるのかな?
>>190 論理的に負けるのが分かってるからじゃない?
>>181 仕様では
「基本的にはfgetsと同等だけど、マクロで実装されてるかもしれないから注意してね」
だろ。
193 :
デフォルトの名無しさん :04/06/26 11:02
煙が立ち込める環境が嫌い うるさいの嫌い 何より、そんな金ない
194 :
デフォルトの名無しさん :04/06/26 11:03
>>192 何で口語に訳す必要があるんだ? 原文がなからだろ、どーせ
>>192 テメエわざとか?
getsとfgetsの話だって言ってんだろボケ!
>>192 テメエわざとか?
getsとfgetsの話だって言ってんだろボケ!
198 :
デフォルトの名無しさん :04/06/26 11:05
>>196 おお、それは見落としていた
確かにそうだ
どっちにしても同じことだが
このスレには、cとsの区別が付かない人が多いようですね(藁
201 :
デフォルトの名無しさん :04/06/26 11:11
> 何が危険かがわかってないやつほど > #define OK (0) > return (OK); で、何が危険なの? どっちもまあ括弧はいらないが、つけて「危険」だとは思えない。 (前者は(-1)とか(c + 1)とかなら括弧は必須だろうし、後者の場合は、まあ長いときに 見やすくするために括弧つける程度だろうなあ)
202 :
デフォルトの名無しさん :04/06/26 11:12
> お前の言う「もともとのC」とは何のことだ ベストセラーの本の名前では?
203 :
デフォルトの名無しさん :04/06/26 11:12
portable Cのころもマクロだったなあ
204 :
デフォルトの名無しさん :04/06/26 11:13
>>201 >で、何が危険なの?
(・∀・)ニヤニヤ
>見やすくするために
プププ
205 :
デフォルトの名無しさん :04/06/26 11:14
>>202 名指しできない時点で終わったな
ばいばい
206 :
デフォルトの名無しさん :04/06/26 11:14
たしかに「おまえ」じゃあ名指しにはならんな。
208 :
デフォルトの名無しさん :04/06/26 11:16
CやC++で括弧のすぐ内側に空白あけるやつってVB厨あがりらしいんですが、 VBではそういうふうに書くのが流行っているのですか? わたしがVBを使ったことがあるのはかなり昔で、そのころはそんなのは見たことなかったのですが...
何で仕様に書いてあることをそのまま理解できないやつばかり難だ。
210 :
デフォルトの名無しさん :04/06/26 11:17
おいしいよね > なん
212 :
デフォルトの名無しさん :04/06/26 11:19
>>210 志村、後ろ後ろ!
と真顔で言うタイプだな
213 :
デフォルトの名無しさん :04/06/26 11:19
仕様書みたけど #define HOGE (0) が危険だなんて書いてなかったぞ
215 :
デフォルトの名無しさん :04/06/26 11:21
古いですね、もうすれ5の時代ですよ > すれよん
216 :
デフォルトの名無しさん :04/06/26 11:30
でもいまどきのgetcはマクロなんかで実装しませんよ。 inline関数なら、べつに引数の副作用なんか気をつけなくても平気でしょ?
217 :
デフォルトの名無しさん :04/06/26 11:31
gets/putsは、改行とりのぞいて/改行つけくわえて くれるから便利だよね。 fgets/fputsほどは使わないけど。(getsがすごく危険なので)
218 :
デフォルトの名無しさん :04/06/26 11:32
おなじまくろでもgetcharなら使うけど、 getcがマクロ実装のとき、つかわないですよねfgetcにしちゃう。
219 :
デフォルトの名無しさん :04/06/26 11:33
#undef
220 :
デフォルトの名無しさん :04/06/26 11:34
(getc)
222 :
デフォルトの名無しさん :04/06/26 12:01
ごまかしたいからといって、そんなこといっても無駄です > 221
>>186 何故いけないの?szStrに%が混入しても分かりにくいから?
>>187 可読性を下げる(本人は上げようとしてるつもり)以外に悪い理由は?
224 :
デフォルトの名無しさん :04/06/26 12:05
>>223 変態の相手はごめんだ
あっちいけ しっしっ
225 :
デフォルトの名無しさん :04/06/26 12:06
お、224はかなり都合がわるくなってきたな? ;-)
個人的には、OK=0と決め打ちされるのは嫌。
227 :
デフォルトの名無しさん :04/06/26 12:07
size_tはいいが、 ptr_diffって名前が長すぎると思わない?
228 :
デフォルトの名無しさん :04/06/26 12:07
> 個人的には、OK=0と決め打ちされるのは嫌。 はあ? こいつバカか...
229 :
デフォルトの名無しさん :04/06/26 12:08
きめないからdefineするんだろうが
230 :
デフォルトの名無しさん :04/06/26 12:09
fopen(filename,"r+"); でファイルから読み込みを行って,その次に書き込みを行おうとするときに fopenやfflushを使用しないとうまくいかないというのは何故でしょうか.
>>227 Win32APIプログラミングやればWIN32_FIND_DATA型なんてのも出てくるからもう慣れた
OK(というか、正常終了)時には0以外を返したいこともあるじゃん。
233 :
デフォルトの名無しさん :04/06/26 12:10
>>225 ほう、俺が都合が悪くなったらそんなに嬉しいか
あんたに出来ないことをやってくれるスーパーマンでも現れたか?
fopenやfflush 訂正 fseekやfflush
>>224 あのー、ここは質問スレなんですけど。変態初心者の巣ですよ。
>>223 の後者のほうは
#define BEGIN {
#define END }
if (hoge) BEGIN
.....
END
と同様なんじゃないかと。アホかと思う書き方だがなんとか読んで読めなくはない。
ただ唯一違うのは、関数が正常値として0を返す物だと決めてかかってること?
もうひとつ質問なのですが, 元々あったファイルに別の内容を挿入したいのですが,fopenでmodeにr+を 指定すると,元々あったデータが上書きされて消えてしまって困っているのですが 解決策は何かあるのでしょうか? ちなみにファイルに出力したいのはstdinの内容でそのフォーマットは特に決まって おりません.
>>237 ありがとうございました.
どうやら私がやろうとしていることは無理なようでね.
別の方法を考えます.
K&R日本語版、p176の install函数って正しいですか? /* 見つからなかった */時の、登録手続きが変な気がするのですが。
マルチになりますが、すいません C言語をCASLUに書き換え可能なソフト知ってる?
242 :
デフォルトの名無しさん :04/06/26 13:17
目的が一目瞭然だな。 しかし、
>>240 お前はプログラムングにむいてないから、
なるべく早い段階で手を引いた方がいいよ。
struct hoge *phoge; int i; for(i = 0; i < 10; i++) ++phoge = (struct hoge *) malloc(sizeof(struct hoge)); というようなコードをgccでコンパイルすると、左辺が異常としてハネられます。 for(i = 0; i < 10; i++) { ++phoge; phoge = (struct hoge *) malloc(sizeof(struct hoge)); } のようにポインタのインクリメントとメモリ割り当てを別々に行うと大丈夫です。 最初の書き方に曖昧な点は無いと思うんですが、何がいけないのですか? 出来れば一行にすっきりまとめたいと思うのですが…。
プログラマってどうして 韓国が嫌いな人が多いんですかね? 私の知り合いのプログラマもみんなして 韓国が嫌いとか言っているのですが。
氏ね
>>245 プログラマは韓国が発祥の地だからですよ
集団強盗スリしたり飲酒して車暴走させて人撥ねまくったり 勝手にコード拾って組み込んだり(しかもGPL!!)無能だし いったい韓国人はどうなってるんだ。
>>244 for(i = 0; i < 10; i++, phoge++)
phoge = (struct hoge *) malloc(sizeof(struct hoge));
でいいじゃん。
>>244 そもそも、そんなプログラムを書いたらだめだ。
251 :
デフォルトの名無しさん :04/06/26 14:17
>>244 ++phoge = (struct hoge *) malloc(sizeof(struct hoge));
あなたを意図にわからん
というのと同じくらい無茶苦茶だ
phoge = malloc(sizeod(struct hoge) * 10); でいいんじゃねーの?
×sizeod ○sizeof
Shift+BSで前の書き込みを呼び出すのはなんとかしてくれ。せめてオプションにして欲しい。 HHKを使ってるんでほんの少しのタイプミスで書き込み全部消えちゃう。。。 仕方ないから長文を書くときは他のエディタで編集してコピペしてるけど、これじゃ2chブラウザの意味半減。。
ウホッ!はげしく誤爆
256 :
デフォルトの名無しさん :04/06/26 14:26
返答ありがとうございます。
>>249 malloc()の左辺でやるのは無理ということでしょうか?
>>250-251 動的に数の決まる構造体にメモリを割り当てつつそれらを初期化する関数を書いているんですが、
こういう場合普通はどうするものなんでしょうか。単純に二つ以上の文に分割するものですか?
>>252 上に挙げた理由で、それは難しいです。
phoge = malloc(sizeof(struct hoge) * countNeededStructures());
というようにすれば出来なくはないと思いますが、この場合あまり意味がありません。
と言ってしまえば一文に詰め込むのにもたいした意味は無いんですけど…。
>>244 お前がやりたいのは↓じゃねーか?
struct hoge *phoge[10];
int i;
for(i = 0; i < 10; i++)
phoge[i] = (struct hoge *) malloc(sizeof(struct hoge));
>>258 あーあ、こたえちゃった。芋づる釣りシュウリョー。
>>258 それをやるなら>252でも同じ。
ほんとに動的にメモリ確保するなら、リスト構造とかで管理しなきゃだめだ。
>>257 >phoge = malloc(sizeof(struct hoge) * countNeededStructures());
>というようにすれば出来なくはないと思いますが、この場合あまり意味がありません。
なぜ意味がないのか言ってみろ。
お前らコミュニケーション下手すぎ
for の終了条件を 10 とハードコーディングしている時点で、動的とはいえない。
>>260 一応、領域をポインタ列として確保することでリスト構造のようなものを目指しているんですが、それが間違いの元なのかもしれません。
>>261 最初に必要となる構造体数を数えずに「まだ構造体が必要か?」「要る」「じゃ、割り当てる」という方向性を取っているから、です。
つまり、必要となる構造体数を数え上げるのに必要な時間・空間コストをケチるために必要性判定と割り当てを並行してやっています。
>>263 余計な部分を省いて論点"インクリメントしたポインタへのmalloc()が許されないのは何故か?"を明確にするつもりでした。
実際のコードでは構造体が必要かどうかの条件判定をしています。
書き込み途中で送信してしまいました。 最初に必要となる構造体数を数えずに「まだ構造体が必要か?」「要る」「じゃ、割り当てる」という方向性を取っているから、です。 つまり、必要となる構造体数を数え上げるのに必要な時間・空間コストをケチるために必要性判定と割り当てを並行してやっています。 +予め必要数を計算する方式にすると、計算に使ったデータ(構造体初期化に使う)の保存場所として別に領域群を確保する必要が出る等、 +更に煩雑化してしまいますので、出来れば避けたいのです。そういう状況に陥る事自体がおかしいのかもしれませんけど、残念ながら +他の解決法を思いつきませんでした。
>>265 普通に考えられる方法はは2つ。
1.
>>258 のように、あらかじめポインタの配列を確保しておき、その配列にmallocで確保した領域へのポインタを入れていく。
2.リンクリストと、その処理関数をつくり、確保した領域へのポインタをnodeに持たせて管理する。
244のコードからは > 必要となる構造体数を数え上げるのに必要な時間・空間コストをケチるために必要性判定と割り当てを並行してやっています。 の片鱗もうかがえないのだが。
268 :
デフォルトの名無しさん :04/06/26 15:29
> #define BEGIN { > #define END } > と同様なんじゃないかと。 だーかーらー...そんな定義するのはアホだってば、 2行めが違ってるじゃん。
269 :
デフォルトの名無しさん :04/06/26 15:30
> for(i = 0; i < 10; i++) 空白あけろ ぼけ > phoge[i] = (struct hoge *) malloc(sizeof(struct hoge)); 空白あけるな ぼけ
270 :
デフォルトの名無しさん :04/06/26 15:31
> アセンブラ… (;´Д`) ハァハァ 妹の名前はコンパイラ
271 :
デフォルトの名無しさん :04/06/26 15:32
> HHKを使ってるんでほんの少しのタイプミスで書き込み全部消えちゃう。。。 もったないのでわたしにください。
272 :
デフォルトの名無しさん :04/06/26 15:33
> つまり、必要となる構造体数を数え上げるのに必要な時間・空間コストをケチるために必要性判定と割り当てを並行してやっています。 それが「動的メモリー割り当て」の醍醐味ってもんだろ?
>>266 割り当てられた各構造体に力関係や順序関係は必要無いため、リンクリストの特徴である"データの挿入・削除の容易性"
を使う必要は無いと判断しました。一方で単純に数決め打ちでのポインタ列確保で無駄にメモリを消費する必要も、
オーバーフローの危険性を持たせる必要も無いと考えました。ポインタに使うメモリ等微々たるものですので、どちらかというと
オーバーフローを気にした結果です。
丁寧にお答えいただいておいて申し訳ないのですが、
>>264 に書いた通りそれは枝葉の部分です。
>>267 も同様です。
>269 > さらに、プログラムの書き方に関する見解は所詮見解にすぎない。" 書き方論争(style wars)"に引きずり込まれても、たいてい何も産み 出さない。
struct phoge** hoge; int i; hoge = malloc(sizeof(struct hoge*)*10); for(i = 0; i < 10; i++){ *(hoge++) = malloc(sizeof(hoge)); } がやりたいのか?
>>273 あのさ
>>244 は、ポインタ配列確保せずに phoge をインクリメントしている。
つまりは宣言も確保もしていないメモリ領域を破壊するプログラムだってことわかってる?
struct *phoge; で確保されるのはポインタ変数1つだけ。
一つしか確保していないのに、インクリメントしたらどこへ行くと思ってんの?
>>244 かっこつけてメモリの消費とか、オーバーフローとか言う前に
とりあえず基礎からやり直したほうがいいと思う。
278 :
デフォルトの名無しさん :04/06/26 15:38
> ++phoge = (struct hoge *) malloc(sizeof(struct hoge)); > 書き方に曖昧な点は無いと思うんですが、何がいけないのですか? おまえぼけすぎ。「左辺値」ってものがまったくわかってない。 phoge++ = (struct hoge *)malloc(sizeof(struct hoge)); って書いてためしてみろよ! (mallocの前に空白あけるんじゃないぞ!)
訂正 ×struct *phoge; ○struct hoge *phoge;
>>275-276 まさにその通りでした。ポインタ自体の領域確保を怠っていました。
しかし必要なポインタの数も最初から分かっていない場合はどうすれば良いのでしょうか。
今ひとつ理解出来ていないので少し考えてみます。
>>278 残念、同じ結果です; error: invalid lvalue in assignment
>>280 >しかし必要なポインタの数も最初から分かっていない場合はどうすれば良いのでしょうか。
だからリストつかえよ。
>>280 最初からわかってないのなら、適当に引数で受けるようにすればよかろう。
一度確保した後に追加するような場合には reallocなどを使ってサイズを
変更するか、リスト構造あたりを使えばよい。
リスト構造ってなんだかわかっていないんでわ。 リンクリストとかで検索かけたほうが良いとおもわれ。
>>281-283 なるほど! 疑問が氷解しました。realloc()でサイズを変更するリスト構造を使ったほうがスマートに出来そうです。
ありがとうございました。
>>284 構造体内に次の構造体へのアドレスを格納してチェーン式に構造体群を繋ぐ方法だと考えていますけど、間違ってますかね。
>>285 >realloc()でサイズを変更するリスト構造
ハァ?
>>286 改行削除で消しすぎました;;
realloc()でサイズを変更するより
リスト構造を〜
と書いていました。すいません。
reallocではパフォーマンが悪い場合が少なくないことも覚えておこう。
289 :
デフォルトの名無しさん :04/06/26 16:10
> realloc()でサイズを変更するリスト構造 神コロさんみたいに合体させるなよ。コーヒー噴出しちゃったじゃないか。
>>289 こんばんわrealloc初心者です。
今年新卒で記念に初めてreallocを使おうと思っているのですが
俺の尻の穴に貴方の野太いちんぽぶち込んでくれませんでしょうか?
今が旬のオススメrealloc使用法なんかを教えて欲しいです。
よろしくお願いいたします。
291 :
デフォルトの名無しさん :04/06/26 17:55
連結リストつかえ!
292 :
デフォルトの名無しさん :04/06/26 17:56
> 構造体内に次の構造体へのアドレスを格納してチェーン式に構造体群を繋ぐ方法だと考えていますけど、間違ってますかね。 質問する前に、ちゃんとCの入門書ぐらい読めよ ぼけ
ごちゃごちゃヌカすだけで質問に答えられないage厨
294 :
デフォルトの名無しさん :04/06/26 18:04
>>292 質問と確認は違うだろう。
>>293 sageてるだけで、やってる事は余り変わら内気ガス。
296 :
デフォルトの名無しさん :04/06/26 18:29
で、まだ質問には答えてないなw
そりゃ、ここの住人はレベルが低いからな
freopen("hello.txt", "w", stdout); freopen("hello.txt", "w", stderr); fputs("hello\n", stdout); fputs("bye\n", stderr); これを実行してから hello.txt の中を見ると「bye」しかありません。 "hello.txt" のかわりに "con" にすれば「hello」も表示されるのですが、 なぜでしょうか?
ファイルポインタが同じ位置を指すから
>>293 NGワードに登録しておいてたほうがいいよ
「ぼけ」を?
303 :
デフォルトの名無しさん :04/06/26 23:53
オンラインのコンパイラってどこにあんの?
意味がわからないけど、多分SourceForgeにあるよ。
オンラインのコンパイラってtelnetつかってコンパイルする サービスのこと?
俺もようわからんのだけど、オンラインのコンパイルサービスってのがあるんじゃないの? 昔のスレにそんなことが書いてあった。
だからtelnetとかでどっかのサーバにつなげてコンパイルすればいいじゃん
308 :
デフォルトの名無しさん :04/06/27 03:02
すいません、質問です。 暗黙の型変換をさせない方法ってありますか? float型の変数に右辺の値(int型の変数)を↓の様な感じになるようにただのビット列として代入したいんですが・・・ int i=1のとき、 floatの中身のビット列:0x0001(これだといくつになるか分かりませんが)
できるが、なぜやりたい?
>>309 えーと、詳しく言ってしまうと誰が見てるか分かりませんのでアレなんですが、
int→floatのキャストの真似事をしないといけないんです。
>>311 なるほど、unionはこういう使い方もできるんですね。
これで行けそうです。
ありがとうございました。
>312 キャストとunion 結果が全く違うぞ(w
>>313 なんか不味かったですかね?
意図した動作はしてるんですが・・・
>>314 気にするな。
しいて言うなら、310の説明の仕方がまずかったんじゃないか?
>不味かった int→floatのキャスト、ビット値で等しくするのとは違う 整数値1を1.0みたいに浮動小数点形式で表現し直す事 >意図した動作 ならいい
説明の行間を読んでunionと言ってみたわけで。 ポインタ使っても型のキャスト使ってもやれるだろうけど。
>型のキャスト使って できないだろがヴォケ
float f; *((int*)&f) = 0x00000001;
>319 そりゃ"ポインタ使って"の話だろ?
322 :
デフォルトの名無しさん :04/06/27 04:39
"="を使わないで("=="はOK)プログラムを書くことはできますか? 書けるとしたら、どのようなものまで作れますか? hello WorlD程度しかできませんか?
^ & | でなんとかなる。
(ネタ?)‥、
>>322 データ処理諦めて、
簡単なプログラムならかけないこともないとは思うけど
真夜中の暇つぶり質問でしゅか?
printf("%d", sin(atof(gets(buffer)))); とかやれば簡単な計算なら出来るけど、 gets(buffer); double x = atof(buffer); double y = sin(x); printf(%d", y); とほぼ同じコードが生成されるだけなんだが。
代入文(Cでは代入演算子だが)なしでも大抵のプログラムは書ける。 「代入は不要。むしろ有害。」と言ったえらい人がいたような。。。
/* a = 5 */ a ^= a; a |= 5; も駄目だったらいやだな。
代入の代わりに引数にして渡せば問題ないな 細かい関数だらけになるが…
初期化もつらいだろ?
while(a!=b) a++; なんてどうよ。
>>331 そこで登場するのが308からの流れだな!
推奨NGワード: 「空白あけろ」「空白あけるな」「ぼけ」「ボケ」
334 :
デフォルトの名無しさん :04/06/27 06:10
バイナリファイルの扱いに関して分からないことがあるので質問させてください。 00 00 00 01 というバイナリファイルを fread(i,sizeof(int),1,fp); このように読み込んだ時、i には 16777216(01 00 00 00)が代入され、バイト単位で逆転してるようです。 これを防ぐ関数や一発で元に戻す演算、関数などがあれば教えて欲しいです。
335 :
デフォルトの名無しさん :04/06/27 06:14
>>334 リトルエンディアンは反転します。
読み込んだ跡に、2byte単位で反転させるべし。
LOWERとかintの上位2バイト、下位2バイトを取得する
ようなもんがあったきが・・・・BCBでしかやったことないのですが。
VCLならgetLowerみたいのあったとおもうんですが。。。
すみません、最近さわってないので(^^;
htonl htons ntohl ntohs
337 :
デフォルトの名無しさん :04/06/27 06:27
早速の回答ありがとうございます。 getLowerとLOWERって聞いたことないんで調べたんですけどいまいち分かりません(汗 BCCでプログラミングしてるのでBCBでできるならBCCでも出来ると思うんですけど・・・
>>334 i = MAKELONG(MAKEWORD(LOBYTE(LOWORD(i)), HIBYTE(LOWORD(i))), MAKEWORD(HIBYTE(HIWORD(i)), HIBYTE(HIWORD(i))));
340 :
デフォルトの名無しさん :04/06/27 06:46
>>338 書き込みしてる間に書き込まれたみたいです
>>339 すいません;関数が定義されてるヘッダが分かりません;
というかその関数ってBCCで使えますか?
関数・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・( :c o)
342 :
デフォルトの名無しさん :04/06/27 08:10
関数じゃなくファンクションだ。
343 :
デフォルトの名無しさん :04/06/27 08:13
「函数」と書きたいだけの厨房が時々来るね。
344 :
デフォルトの名無しさん :04/06/27 08:16
>>341 でもさ、実際問題としては
関数とも言えるんじゃないかな?
345 :
デフォルトの名無しさん :04/06/27 08:17
339じゃ関数と見分けがつかない罠
346 :
デフォルトの名無しさん :04/06/27 08:21
あ・・・そうですね; まぁどっちにしろ定義されてるヘッダがないんです; もう自分で関数作ってしまおうと思います; お騒がせしましたm(_ _)m
347 :
デフォルトの名無しさん :04/06/27 08:24
>>345 一応どういう働きをするかは分かってるつもりです;
int ByteReversal(int Num,int size) { int RetNum = 0,i; // byteサイズが1〜4以外の時エラー if((size<1)&&(size>4)){ return 0; } for(i = size-1;i >= 0;i--) RetNum |= (( Num & (0xFF << (8*i)) ) >> (8*i)) << (~i * 8); return RetNum; } とりあえずこんな感じに作りました。 お騒がせしました;;
349 :
デフォルトの名無しさん :04/06/27 09:42
知ってますけどあんまり使ってません; int型とかOSによってサイズが違うとか聞くので動作不安定になりそうで・・・ (まぁ他のOSに移植したりしませんけどね) >348のソースバグがめっちゃありました;;
352 :
デフォルトの名無しさん :04/06/27 09:59
>>351 知っていたら↓こんなまぬけなコードは書かないよ。
int ByteReversal(int Num,int size)
{
int RetNum = 0,i;
// byteサイズが1〜4以外の時エラー
if((size<1)&&(size>4)){
return 0;
}
そうやって改善策を出さなきゃ例の荒らしと同じなのが悲しいところ。この書き込みモナー
>>352 if((size<1)&&(size>4))
このif文の事いってるんなら&&と||を思いっ切り間違えてます;;
なんかバグで失敗してますけど最初はshort intにも対応させるつもりで書いてたのでsizeはどっちみち受け取らないとダメだと思います。
voidポインタはいちいちポインタ型で扱うのがめんどくさかったので第二引数でサイズを指定してもらってます。
まぁ言うまでもなくsizeof()でNumを指定してもshortを検出できないので;
355 :
デフォルトの名無しさん :04/06/27 10:12
>>354 short intに対応って、Numはint型じゃないか。
ってwindows.hで定義されてたんですか;
357 :
デフォルトの名無しさん :04/06/27 10:15
ちなみに俺の環境だと32bit用と16bit用の二種類が用意されている。
>>336 と同じもの。
元々ファイルから読み込んで変換することを目的にしてますから当然2byte単位で反転させたい時もあるわけで・・・ その時はint型の下位2byteだけをひっくりがえせばそれで済むかなぁ・・・と でもやっぱりforループを2回に分けたりサイズによって処理変えたりするべきでしたね(- -;
>>356 339は間違いだった。MAKELONG/WORDの左右が逆だった。んで直すとこう
i = MAKELONG(MAKEWORD(HIBYTE(HIWORD(i), HIBYTE(HIWORD(i)))), MAKEWORD(HIBYTE(LOWORD(i)), LOBYTE(LOWORD(i))))
>>334 ほれ、int版だ。これ見てshortも作るよろし。
int ByteReversal(int num){
void *vp;
int nbyte = sizeof(int);
vp = #
for(int i =0; i<nbyte/2; i++){
*(unsigned char *)vp ^= *((unsigned char *)vp+nbyte-1);
*((unsigned char *)vp+nbyte-1) ^= *(unsigned char *)vp;
*(unsigned char *)vp ^= *((unsigned char *)vp+nbyte-1);
nbyte--;
}
return *(int*)vp;
}
ありがとうございます。 頑張って作りたいと思います;
>頑張って作りたいと思います; 職業病?;
>>363 別にそんなことありませんよ
というか高校生で、プログラミングも趣味です。
>>334 せっかく作ってくれたんですけど無理にループを使わずswitch()つかったら一つの関数で済むように普通に作れました;
int ByteReversal(int Num,int size)
{
int i;
unsigned char cNum[4];
// byteサイズが2〜4以外の時エラー
if((size<2)||(size>4))
return 0;
for(i = size-1;i >= 0;i--)
cNum[i] = ( Num & (0xFF << (i*8))) >> (i*8);
switch(size){
case 2:
return (cNum[0]<<8)|cNum[1];
case 3:
return (cNum[0]<<16)|(cNum[1]<<8)|cNum[2];
case 4:
return (cNum[0]<<24)|(cNum[1]<<16)|(cNum[2]<<8)|cNum[3];
}
}
なんだか吐きそうになった
int ByteReversal(int n) { int ret, i; for(i = 0; i < sizeof(int); i++) *((unsigned char *)&ret+i) = *((unsigned char *)&n+sizeof(int)-i-1); return ret; } 行数減しただけ、トリッキーな上に無駄
>>366 え・・・
一番簡単にしかも効率的に作ってる・・・
>>369 おそらく、ビット演算よりも都度代入(メモリコピー)を複数回ループでやってる点を言ってるんじゃないかな。
その点ではswitchのハードコードのほうが”効率”はいいように思う。
こんな書き方もあるんだなぁ・・・ めっちゃわかりやすいですw ありがとう御座いました。
もっとわかりやすく書いた方が・・・ こんなのはどう? int ByteReversal(int num){ union{ int n; char c[4]; } a,b; a.n=num; b.c[0]=a.c[3]; b.c[1]=a.c[2]; b.c[2]=a.c[1]; b.c[3]=a.c[0]; return b.n; }
無責任に推測を言い捨てるのもアレだし、どうせ内部的に領域確保してメモリコピーする分switchのほうが
遅くなるかも・・・と思い実際にベンチ取ってみた。
コードはこんな感じ。
int main() {
int i, j;
for (i = 0; i < 10; i++)
for (j = 0; j < 16777216; i++)
>>364 ByteReversal(j, sizeof(int));
>>366 ByteReversal(j);
return 0;
}
結果(最適化無し)
>>364 real 0m8.529s
>>366 real 0m6.958s
結構、圧倒的な差がついた。switchの余計な分岐分かと思い、switchを無くして4byte決め打ちでやってみたが
real 0m8.943s
一方、最適化(-O2)かけると上から順に
real 0m5.058s
real 0m3.009s
real 0m4.816s
(;´∀`)どこから「どうせ」が沸いたんだろう・・・「ひょっとすると」の間違いでした。
バイトオーダーを反転する固定コードだと移植性が低いなあ。
TCP/IPネットワークバイトオーダーと同じ、ビッグエンディアンのデータだとわかってるのなら
socketの関数使うのが簡単だよなあ。つまり
>>336 か。
そうでなきゃ
unsigned char src[4] に読み込んで
(src[0] << 8*3) + (src[1] << 8*2) + (src[2] << 8*1) + (src[3])
あたりが無難。
シフトって、内部でその回数やってるんでしょ? 結構時間かかるかもね
>>372 あ〜共用体使う方法かぁ
それも有りですねw
>>373 私が書いたソースが遅くなるのは明らかだとw;
switch以前にメモリコピーの数は一緒ですけどシフト演算とか余計に使ってたらそれだけ遅くなりそうな・・・
>>377 CPU依存だが、いまどきのCPUなら普通何ビットシフトだろうと同一サイクルかと
>>377 x<<31とx<<1とで処理時間が変わるわけないだろ。
ビットシフトよりポインタ移動のほうがはるかに速いわけね
>>379 >>380 そうなのか・・・
制御屋でH8/300ばっかやってるから、てっきり・・・
H8/300は1ビットシフトの命令しかないもので
x86ならbswapという命令があったような気がするのだが。
16bitCPUか・・・
387 :
デフォルトの名無しさん :04/06/27 11:59
お前らがシフトの100回や200回を気にするようなプログラム書けるようなタマかよ(プ
君は斡旋ブラスレに篭って出てこないでくれ。
藻前等の中に、Cプログラマのくせして プリキュア見てない奴っているか?
390 :
デフォルトの名無しさん :04/06/27 12:07
っていうかバイトが「反転」しているわけではなく、 「正しい」順序で入ってるだけじゃん。 同じプログラムで読んで書く場合でもないのに freadやreadでintのアドレス渡すのがそもそも間違い。 バイト単位で読め(もしくはバイトの配列)
速度上げてみた。コンパイル後のサイズも上がってそうだが。
その上、処理系によって動k(ry
#include <limits.h>
#define ByteReversal2(x) (((x&0xFF)<<8)|((x&0xFF00)
>>8 ))
#define ByteReversal4(x) (((x&0xFF)<<24)|((x&0xFF00)<<8)|((x&0xFF0000)
>>8 )|((x&0xFF000000)
>>24 ))
#if UINT_MAX == 0xFFFFFFFF
#define ByteReversal ByteReversal4
#elif UINT_MAX == 0xFFFF
#define ByteReversal ByteReversal2
#else
#define ByteReversal(x) x
#endif
>>364 よく見たら高校生だったのか…(・∀・)人(・∀・)ナカーマ
393 :
デフォルトの名無しさん :04/06/27 12:19
> #define ByteReversal2(x) (((x&0xFF)<<8)|((x&0xFF00)
>>8 ))
括弧つけろ ぼけ
394 :
デフォルトの名無しさん :04/06/27 12:21
#define SwapByte2(x) ((((x) & 0xff) << 8) | (((x) & 0xff00) >> 8))
おや、レス番が飛んだ
#defineの展開後の方のxは括弧でかこんどいて・・・ 忘れてた( ´・ω・`)
397 :
デフォルトの名無しさん :04/06/27 12:23
ふつう関数にするぞ。 inline int SwapByte2(int x) { return ((x & 0xff) << 8) | ((x & 0xff00) >> 8); } これなら括弧いらない。
やっぱつっこまれてるし・・・
>>366 同じ高校生だったとは・・・
なんか知能の差を感じる・・・(- -;
400 :
デフォルトの名無しさん :04/06/27 12:25
そもそもなんでReversalなんだよ。名詞だが、後置就職には使わないぞ。 (前置ならともかく)
そんなの適当です;
402 :
デフォルトの名無しさん :04/06/27 12:26
>>397 の関数とマクロ版とどっちが速いかくらべてみろよ
たいがいの処理系では同じだが、
たまに関数のほうが速かったりするからおもしろい
403 :
デフォルトの名無しさん :04/06/27 12:26
404 :
デフォルトの名無しさん :04/06/27 12:27
おれならシフトしてからマスクするがなあ
偽ちゃうし;
16bit程度なら、テーブルってのもあり。
>>402 inlineとマクロどっちが良いかと思って
マクロを選んだわけですが…
やっぱ俺はへたれヽ(゚∀。)ノ
408 :
デフォルトの名無しさん :04/06/27 12:53
> 16bit程度なら、テーブルってのもあり。 でかすぎ...Unicode<->SJISの変換とかで「しかたなし」に使うサイズだぞ
409 :
デフォルトの名無しさん :04/06/27 12:53
> inlineとマクロどっちが良いかと思って > マクロを選んだわけですが… そう思うならまず試せよ!
410 :
デフォルトの名無しさん :04/06/27 12:54
まだ試してないのか! 早くやれ!
>>412 キュッシュミス多発でほぼ確実に遅くなるぞ、そのサイズはw
>>412 たったこれぐらいの処理に256KB…
完成後のソフトは何GBの予定ですか?
/* 32bit int環境では使わないこと! さもなくば地獄の業火に投げ込まれるだろう。詳しくは選挙公報を熟読すべし。 */ int table[65536], from, to; /* 熱心にテーブル作り */ from = 12345; to = table[from];
>>412 馬鹿っぽいから、そういうこと言うのは2ちゃんねるだけにしとけよ。
-int table[65536], from, to; +unsigned int table[65536], from, to; /* ええい、負の値なぞ入れられてたまるか! */
>>418 ムダにレス重ねないでいいように、何が、どういった理由で、も一気に書きなさい
420 :
デフォルトの名無しさん :04/06/27 13:23
希ガスもNGワード推奨だな。
・そもそも、256kbではなく128kbだということに気付け ・テーブルは実行時生成すりゃファイルサイズなんてほとんど食わない ・以下延々とネタにマジレス
422 :
デフォルトの名無しさん :04/06/27 13:30
そんなにTableにコダワル話じゃないだろ。 も前ら会議で本論と関係ないことのたまって白い目で見られるクチだろ?
>>415 shortなら16bitのとこも多いんじゃない?
なにはともあれ、テーブルってのははありえないっしょ。 メモリ空間、処理速度共に普通にビットシフト等した方が効率よいからね。
>>421 実行時に生成させる過程で、そもそもテーブルいらねぇじゃん、と気づけ。
おまえら、何年前からタイムスリップしてきたんだよ。
void sort_data(long *x) { int n,m; for(n=1;n<=4;n++) { for(m=n;m<=3;m++) { if(x[m] > x[m+1]) swap_data(&x[m],&x[m+1]); } } return; } このままだと、なぜか最初のx[0]がスワップされません。 5,6,1,3,7と入力すると5、1,3,6,7とソートします。 んで、n=-1とすると、ちゃんと順番に表示してくれるのは、なんででしょう?
上のソースの訂正です。 ×n=1 ○n=0 ×n<=4 ○n<=3
void sort_data(long *x) { int n,m; for(n=0;n<=3;n++) { for(m=n+1;m<=4;m++) { if(x[n] > x[m]) swap_data(&x[n],&x[m]); } } return; } こうとか?
>>433 そっちのやり方のほうがよさげですね。
ありがとうございました
n = 0 5 > 6 ⇒ 5 ←→ 6 6 > 1 ⇒ 6 ←→ 1 : 6 > 7 ⇒ 6 ←→ 7 n = 1 1 > 3 ⇒ 1 ←→ 3 : : 1周目で5が先頭に残ったまま
× if(x[n] > x[m]) ○ if(x[n] < x[m])
× if(x[n] < x[m]) ○ if(n[x] < m[x])
>>435 あ、なるほど!単純なミスでしたね。
ありがとうございます
× if(n[x] < m[x]) ○ if(*(n+x) < *(m+x))
440 :
3日悶えた。 :04/06/27 20:41
ポインタの指すアドレスが0x01など、極端に小さな数字になって困っています。 下記2つのルーチンの相性が悪いみたいです。 PICT make_picstrct(int tbl[]);/* PICT構造体を作る。最終的なEPS図版の作るわけではない。 */ void ComposeFile(PICT picture); /* PICT構造体のパラメータからEPSファイルを組み立てる */ main()内で、 newpics[0] = make_picstrct(table[0]);/* 成功 */ ComposeFile(newpics[0]);/* 怪しい? */ newpics[0] = make_picstrct(table[0]);/* 失敗 */ のようにした場合、1回目のmake_picstrct()は成功し、次のComposeFile()でポストスクリプトファイルを出力することが出来ます。 しかし、そのあとでもう一度make_picstrct()を呼び出すと、make_picutstrct内で宣言しているポインタが、異常に小さなアドレスを指すようになってしまいます。
441 :
3日悶えた。 :04/06/27 20:42
>>440 の続き
デバッガで追ってみると、1度目にmake_picstrct()を呼び出したときは
(gdb) print xax
$1 = (int *) 0xbfe809e4
となっているのですが、2度目に呼び出すと、
(gdb) print xax
$2 = (int *) 0x2
となります。エラーは下記です。
Program received signal SIGSEGV, Segmentation fault.
0x08048912 in make_picstrct (tbl=0xbfe802c0) at mini.c:159
159 *xax = 0;
(gdb) print *xax
Cannot access memory at address 0x2
ちなみにmake_picstrct()だけループしても[]内を変数にしてもセグメンテーション違反は起きません。
連書きすみません。 どこまで略せばいいのか、どこまで詳しく書けばいいのかわからず、すみません。 ああ、あれかも、となにか思いついたらご教授ください。 重要な部分で不明な点もあればご指摘ください。
Googleでも引っかからない関数出されてもな。 「たぶん tableを破壊してるんじゃねーの」くらいしか言えん。 原因はComposeFileのバグかもしれないし、 呼び出し側で適切にメモリ確保してないからかもしれないし、 make_picstrctの直後でComposeFileを呼んではいけないという仕様かもしれない。
>>440 ソース晒すのイヤでしょ?
あと3日悶えてください
445 :
デフォルトの名無しさん :04/06/27 21:06
#include <stdio.h> #include <stdlib.h> int main (void) { int val, sum = 0, num = 0, heikin; FILE *fp; fp = fopen("seiseki.txt","r"); if(fp == NULL) { printf("open error!!\n"); exit(1); } while(!feof(fp)) { fscanf(fp, "%d", &val); sum += val; num++; } fclose(fp); heikin = sum / num; printf("平均値は%3d\n", heikin); return 0; } をコンパイルして実行すると「毎度お騒がせしますエラーです」みたいなのが出てきます。 どこが悪いのか教えてください。seiseki.txtの中身は 10 20 30 です。
つーかこの時期にそんなpurpose-specificな物出されるともうアレとしかw
> 毎度お騒がせします池沼です
>>440 です。
ありがとうございました。
例の3つの関数の各前にprintf("unko");と入れるとちゃんと動作しました。
呪われています。
と、いうことで、どこかがアドレスを破壊しているようなのであと3日悶えてみます。
それでもダメならソース丸投げのほうでおねがいしてみます。
>>448 レスありがとうございます。って、事はうちのPCがおかしいってことなんでしょうか。
コンパイラは出来るのですが実行すると「問題が発生したので....」が出るのですが。
プログラム的に問題ないなら面倒なので次の学習過程に移ります。どうもありがとうございました
451 :
デフォルトの名無しさん :04/06/27 21:26
>>445 それってよ、ファイル名のとこがちげぇんでね "C:/unko/unko1/ファイル名" とかさあ "../unko/ファイル名" ってな感じじゃね
Winペケポン使いか。
>>445 それかあれだ foef関数でいいんだっけ? その関数定義してやんなんといけんでしょ
実行に必要なライブラリを入れてないとかそんなんだろ。
>>445 そのコードで起きるとしたら0除算エラーかな?
あぁ、自分で判ったような気がする・・ while(!feof(fp)) がおかしいですね。 while(feof(fp))に直したら動きました。 どうもfeof()を反対の意味で認識してたようです。 皆様レスありがとうございました
空行が入って fscanf(fp, "%d", &val); が失敗してるってことはない?scanf()が何かとトラブルの元の悪寒。
ガビソ
>>457 > heikin = sum / num;
ループを一回も通らなかったらnumは0だから
0除算起きると思ったんだけど、何故出ないんでしょう?
>>461 データ無しで通すようなテストしてないんじゃ
>>461 whileをかならず一回通ってるからnumがインクリメントされてます。
>>458 while(feof(fp))
なんかしたら逆にエラーでますけど;
feofの使い方は元のほうがまだマシ。
書き間違えてる・・ while(feof(fp)==0)です。これにしたら動きました
!feof(fp)と意味変わりませんけどまぁ動くなら良いのかな?
あぁそうか。真って0ですよね。だとしたら同じ意味か。 なんでこっちでよくてあっちでダメなんだろう・・・エロい人助けて
えっ、真って0なんだ。そりゃ手持ちのプログラム全部書き換えなきゃやばいな。
あ、俺もだ書き換えなきゃ
やっべーよもう納品しちゃったよ
このままでは単位が・・・
つまり、if(a)の内部展開はif((a) == 0)ということだね
feof()はファイルポインタが終端にある時に0以外を返してます。 NOT演算は真を偽に、偽を真にしますからそれでwhileでループするって感じです (自分もややこしくて忘れる時があるのでいつもwhile(1)で無限ループって覚えてます;)
if(a)が真になるのはaが0以外の時だからif(a!=0)では? 内部展開とかしてないと思うけど
ウワーン(;´Д`)こんがらがってきた・・・真は1・・・でよいのですか先生。
あまり初心者をいじめないでくれ。マジで判らなくなってきた。ちと整理しよう・・
feof()は「ファイルの終わりだったら1を返す。まだだったら0を返す」
!feof()は「ファイルが終わってなかったら1を返す」
だからwhile(feof(fp)==0)は「0が返ってくるうちは繰り返し」で・・・
ってとこまではあってるんディスカ?
んでwhile(!feof(fp))は「ファイルが終わってなかったら1が返ってきて、1は真だから無限ループ」
だからやっぱ
>>445 はおかしくないのかな何も。もういいや動いたし・・
真は0以外と解釈してます
基本的に真とは非零の値を指すけど、Cではそう厳密に考えてもあまり意味がない。 比較演算の結果は1or0だが他のものはプログラマが好き勝手に決められるわけで。 返り値0を正常終了とする関数も一杯あるでしょ。
whenever one writes if(expr) where "expr" is any expression at all, the compiler essentially acts as if it had been written as if((expr) != 0)
※ ただいま、ネタとマジの区別のつきにくい方にはオススメ出来ない状況となっております。ご注意ください。 ※
マルチ厨呼んで来い、マルチ厨
"ある" が 1(0以外) "肯定" "Yes" "真" "ない" が 0 "否定" "No" "偽" と覚えるといいと思うんだが。
生物の神経系の知識があるなら全か無かの法則を使うと1・0が分かりやすいと思うんだが。 と余計混乱するようなことを言ってみる。
NULL以外は真
>441です。 自己解決しました。make_pictstrctという自分で書いた関数のバグでした。 その下位のルーチンに変数を渡す方法をしくじってました。 intで宣言して&で渡さなきゃならんところを、int型ポインタで宣言して そのまま放り込んでました。 3日間も・・・なさけないっす。ご鞭撻サンクスでした。
NULLはポインタについてのみ使われるものであって、普通の条件判定に使うべきもんじゃない。
>>481 feofはデータが"ある"ときに0を返します。
>>475 あってると思いますよ
==、!=、!はその条件にあわせて真と偽を返しているだけで、ifは真と偽を区別してるだけだと思います。
if(1)とかwhile(1)はそのまま真を渡してるから動作します。
>>486 エラー内容を数値として返す時は0で"ある"とか"成功"の方が好都合だからじゃないの?
if (1)もwhile (1)も if (1 != 0) while (1 != 0) というように扱われ、この結果は真であるから通るわけで。別にここは0以外の値(すなわち非零の値)ならば何でもいい。
if (-1) なんてのも真なので、理解があいまいだと苦しむかもしれない。
>>488 EOFであるか?と聞く関数なので
データがあればNo, データが無ければYesを返しているだけです。
>>491 まぁ実際はそうなんだけどね・・・
そんなこと言っても処理成功の時に0を返してそれ以外の時に1を返す関数はいっぱいありますし・・・
べつに関数はエラーコードを返すと決まっているわけではないし。 (特に、feofは失敗しないはず)
int isEOF(FILE*);
あ〜そうか; Yes Noを返してきてるのか
何故シンプルにfp != EOFとしないのか分からないけど深い理由があるの?
497 :
デフォルトの名無しさん :04/06/27 22:32
#include <stdio.h> int main(){ printf("%p %p %p \n", printf, *printf, &printf); return 0; } この辺の仕様がキモくてしょうがないんだが、 何でこんな仕様になってるんだ? なんとかならないのか?
499 :
デフォルトの名無しさん :04/06/27 22:35
>479 ワロタ。ナイスタイミングでGJ!!
ん?FILE*とEOFって単純比較出来たような気がしたけど、Perlか何か別の言語だっけ? ひとまず怪しげな入門書を引っ張り出してきて引いたら while (fscanf(....) != EOF) 使ってた。
>>500 単なるポインタであるFILE*変数自体は
再代入でもしない限り変化しないわけだが。
>>500 ファイル終端に到達したらEOFになるんじゃあ?
fscanf()の戻り値の型ってFILE*なんだー、ふーん
fscanf()の戻り値の型はintじゃないのか
演算子のオーバーライドが必要だな。
演算子のオーバーロードも考えないとな
507 :
デフォルトの名無しさん :04/06/27 22:57
x(n)という関数があってそしてx(n+1)=x(n)+Cだとしたときに y(n)=x(n)+x(n+1) y(n+1)=x(n+1)+x(n+2)以下半永久にfor文で やらせるプログラムを作ろうとしています それでx+=x+cを使ってしまうとxがx(n+1)の値になってしまって x(n)をどうやって指定するのか分からないし… ということで詰まってしまってプログラムが書けません。 こういう場合はどういうプログラムを作ればいいのでしょうか? すみませんが教えてください。よろしくお願いします。
関数xの引数がintな場合なら、x(n)の値を一度配列に入れておけば?
y(n+1)=2*x(n)+C だな。
ロヂスチック射象
x(0)いくつよ?
きり
文字列の中で#記号を使うにはどうしたらいいのでしょうか? printf("#\n"); のように、#記号を表示したいのです。
あ、普通にできました。すみません。
char *型からconst char *型って暗黙の変換がなされますよね? 関数の引数にするときによくあるパターンだと思います。 ところがchar **型からconst char **型へは暗黙の変換がされない ようですが、これはなぜなんでしょうか?
>>515 char **p=0;
char * const *cp=p;
517 :
デフォルトの名無しさん :04/06/28 20:36
#include<stdio.h> int main() { (*(int(*)(char*,...))puts)("100 = %d\n", 100); return 0; } 100 = 100 と表示されません。 コンパイラがバグっているのでしょうか?
puts?
>>517 バグってるのはお前の頭。素直にprintfを使いなさい。
何やってんの
ブライトさん・・・
522 :
デフォルトの名無しさん :04/06/28 21:02
>500 feofを使いなされ
VCのコンパイラなんですけど、 #define HOGE(p) test(__FILE__, __LINE__, p,...) void test(char *file, int line, char *fmt, ...); void main(void) { int p; HOGE("hoge = %d\n", p); } こういう感じでうまくdefineを定義して可変長引数を渡したいのですが、 どうやればいいですか?
>>516 説明になってないしchar*const* != const char**
>>525 いまいちぴったり合ったFAQが探せなかったのですが、
一般的にはできない。ということですね。。
>>523 なんというか、HOGEマクロの定義自体が狂ってないか?
>>527 すみません。どうやってもエラーが出るので書いているのは正しくないです。
#define HOGE(s...) test(__FILE__, __LINE__, s) かな
>>523 #define HOGE test(__FILE__,__LINE__,
HOGE "hoge = %d\n", p);
>>529 駄目でした。
>>530 いけますけど、見やすくならないでしょうか?
なんとなく関数2個作ってコールバックでいけそうと気づきました。
532 :
デフォルトの名無しさん :04/06/28 22:05
こういうことしたがる奴は C使いにはむいてないよな。
こんなことで試行錯誤するくらいなら他のことやった方がいいということは言えるな。 設計手法とかには全然関係ないわけだし。 Tips の探求をしているだけというなら分かるけど。
>>532 そうですか、ではどうすると一番良いでしょうか?
>>533 確かにある意味興味本位ですが。
535 :
デフォルトの名無しさん :04/06/28 22:16
ポインタの利点を教えてください。
>>534 C++とかC#でも使ったらどうかな。
Cファミリでなくてもいいなら
RubyとかPerlとか使いなよ。
>
>>535 関数に大きいデータを渡すときに渡すデータがポインタだけですむ
539 :
デフォルトの名無しさん :04/06/28 22:19
>>535 無ければこりゃちょっともうどうしようもない
>>536 VCのコンパイラですが、ソースはC言語なのです。
VCはデバッガとして使用しているだけでC++は使用できないんです。
コンパイラがgccとかでしたら、最新の環境でうまくいくのですが。
542 :
デフォルトの名無しさん :04/06/28 22:33
543 :
デフォルトの名無しさん :04/06/28 22:38
すいません。余剰を求める場合、整数なら%を使えばいいのですが、 小数の場合どうすればよいのでしょう? どなたか、教えてくださいm(__)m
544 :
デフォルトの名無しさん :04/06/28 22:39
if文とswitch文の巧い使い分けを求む!!
全部三項演算子にすれば全くもって問題ない
さすがにそれはつらい
547 :
デフォルトの名無しさん :04/06/28 22:43
>>543 「小数の余剰」の定義を記せ
答え:_________
\mathbb{Z} を知らないんじゃないの >小数剰余の中の人
549 :
日本語ダメ夫 :04/06/28 22:51
>>543 余剰が小数の場合です。
例えば10.2mod3=1.2とか
552 :
デフォルトの名無しさん :04/06/28 22:54
>>552 そりゃ配列格納して指数で呼ぶのが普通じゃない?
554 :
デフォルトの名無しさん :04/06/28 22:58
質問失礼します。 if (++r >= 360) { …処理… } このif文は条件を満たしていればブロック内を処理しますが、 条件を満たしていなければrに1を加算するのでしょうか?
いいえ。 条件を満たしていようといまいとrに1加算し、更に条件を満たしている場合にはブロック内の処理もします。
>>550 ありがとうございます!
その関数の存在を初めて知りました
557 :
デフォルトの名無しさん :04/06/28 23:03
>>555 回答ありがとうございます!
ということは、if文というのは、条件を指定する括弧内の
関係演算子or論理演算子までを実行するということでしょうか?
或いは、括弧内を全部実行した上で条件分岐をするということでしょうか?
558 :
デフォルトの名無しさん :04/06/28 23:05
>>557 ちなみに、
++r
と
r++
の違いわかってますか?
559 :
デフォルトの名無しさん :04/06/28 23:08
>>558 はい。理解していますよ。
式の値が、+1を実行した後のrの値か、+1を実行する前の値かの違いという事ですよね?
ごめんなさい。
>>555 もちょっと間違ってます。
「ひとまずrに1加算した上で条件判定を行い、条件を満たしていればブロック内を実行する」がより正確なとこです。
>>557 括弧内が真又は偽であることが確定するまで処理を行います。
これは&&や||で条件を書き並べて練習するとよく分かると思います。
561 :
デフォルトの名無しさん :04/06/28 23:12
>>560 ありがとうございます。
真偽の程はともかくとして、カッコ内に四則演算があれば
それは実行されるということでよろしいのでしょうか?
562 :
デフォルトの名無しさん :04/06/28 23:12
>>559 なんか微妙に違うかな。
if(++r >= 360)だったら、
r += 1 を実行した後に r >= 360 を評価。
if(r++ >= 360)だったら、
r >= 360 を評価した後に r += 1を実行。
>>561 ええと、なんだか誤解されそうなのが怖いんだけど。
ひとまず、括弧内に普通の四則演算を書いておけばまず実行されると見て間違いない。
ただし、
int a = 1, b = 2;
if ( a == b && ++a == b) { ; }
というような場合 ↑
ここの++aは実行されない(一番目の評価が偽であり、真偽判定が完了しているため)事に注意。
>>564 A && BでAが偽の場合と
A || BでAが真の場合はBは評価されない。
だったよな?
>>561 じゃないけど何か不安だ
++,-- は特殊な演算子だし
昔はインクリメント・デクリメントを使うとCPUに優しいコードが吐かれたのかもしれない。 最近じゃ実行速度差なんてつかないだろうから、もっぱら可読性の問題だけど。
if(d != 0 && x / d){ ; }
そもそも、条件文に「++(--)」やら「+=(-=など)」を使うこと自体、 常軌を逸しているとしか思えない。
つまり int a=1; だと if(a++=1){・・・}は{ }内実行されなくてaは2になって if(++a=1){・・・}は{ }内実行されてaは2になるってこと?
572 :
デフォルトの名無しさん :04/06/28 23:36
573 :
デフォルトの名無しさん :04/06/28 23:37
慢心して居直る若年寄に将来性もなし
575 :
デフォルトの名無しさん :04/06/28 23:37
良い意味での子供っぽさをなくしたら技術者は寿命
>>571 何故、実験しないのかかなり問い詰めたい
それもそうだな。いってくる
>>574 またおまえか!
独りではチームと呼べないことに早く気づけよ!!
580 :
デフォルトの名無しさん :04/06/28 23:42
逆じゃん・・・
皆様ありがとうございます。 上記の皆さんの様々なやり取りwを読んで、勉強になりました。 ただの言い合いのように見えても実は内容があったような気がしました。
32767をインクリメントすると-32768になる環境とかあるんだっけ。
>>568 使用方法によっては前置か後置かで速度が大幅に変わるプロセッサも存在する。
今ではコンパイラが速いほうに修正すると思うが。
可読性とか言うけど、 while( *p != '\0' ) { p = p + 1; l = l + 1; } while(*p++ != '\0') l++; 下の方が読みやすいと思う人が多いんじゃないかな。
while(*p++) l++; hehe まー、個人的にはこういう場面では後置より前置のほうが処理の流れが分かりやすいので好き。 余計に煩雑化するから結局後置にするけど。
すいません、初心者です。 配列に10万個のデータを入れたいのですが、 for文で挿入するとスタックオーバーフローになってしまいます。 解決方法を教えてください。
100個ずつ挿入すれば大丈夫じゃないかな:P
>>585 間違えてるじゃん。
可読性は大事だよ。素直に書こう。
何の配列? memset じゃだめ?
type juuman[100000];
もしかしてこんなん書いてる?としたらそれが原因だよ。
>>587
>>587 配列と元データはどうやって用意してるのか。
静的に確保しようとすると失敗する可能性高い。
593 :
デフォルトの名無しさん :04/06/29 00:19
>>590 ランダムな数値なんです。
memsetっていうのがあるんですか。
調べてみます。ありがとうございます。
すいません。理解できなかったので、もう一度整理して質問させてください。 テキストに10万個のランダムなデータが入っていて、 それをfscanf関数を使って配列に格納したいのです。 このまま591さんが言ったようにjuuman[100000]にしようと思ったのですがだめでした。 memset以外の解決方法はありますか?
596 :
デフォルトの名無しさん :04/06/29 00:45
ん? ローカルに確保してるだけなんじゃないの? だからスタック不足。 グローバルで確保すればOKでしょ。 type juuman[100000];
分かってないのはわたしだったのね。 代入と比較を間違えるなヴォケエエエエエエエエエエエエエエエエエエエエエエエエエエ!!!@#@!@!!!
!@#$%^&*()_+|〜
ローカルってそんな小さいの?
一般的には数キロバイトってとこだな。
じゃあ動的に確保されるときの尾っぽの部分はどこへ逝くの?
ヒトラーの尻尾だな
608 :
デフォルトの名無しさん :04/06/29 02:26
剰余と余剰の区別ぐらいつけろよ ぼけ
609 :
デフォルトの名無しさん :04/06/29 02:27
int v[10], num=0; FILE *fp; 略 whie(!feof(fp)) { fscanf(fp, "%d", &v[num]); num++ } で、ファイルから整数を取りv[ ]に入力してnumでデータ数を数えたいのですが numが何故かデータ数よりも1多くなってしまいます。何故そうなるかの理由を教えて候。 例えばファイルに 10 20 と入ってるとnumが3になってしまいます
610 :
デフォルト :04/06/29 02:29
質問です。 C言語の本に付属してるコンパイラを使ってC言語の勉強してるんですが、 先週からつまづいてしまいました。 サンプルファイルをコンパイルすると、きちんと「hellow world」と表示されるのですが、 自分でまったく同じプログラムを打っても 「エラーE2206 不正な文字’’ エラーE2206 不正な文字’@’ ・ ・ ・ エラー2141 宣言の構文エラー 24error in compile」 と出るだけなんです。 サンプルファイルをコピーして貼り付けても同じメッセージが出ます。 どういうことかわかる人がいたら助けて!
読んだ時にエラー判定してないから、1つ余計にカウントされてる
612 :
デフォルトの名無しさん :04/06/29 02:30
>>609 numはnum++で0,1,2,3,4・・・と規則的に増えてゆくだけだから。
...カッコとかダブルクォーテーションとかの数があってないだけだな
おおっと、なんでもない。なんでもない。
>>610 貴様は全角スペースや変な全角文字を24行目付近に使用してはおるまいな?
>>611 すいませんエラー判定ってなんですか?
本には一言も書いてないのですが、具体的になにをしなければ
いけないんでしょうか。
>>611 あ、ごめんなさい。自分へのレスかと思いました。
>>616 エラーじゃなくてEOF判定だな。
while(fscanf(fp, "%d", &v[num])!=EOF)
num++;
こうすればよい。
>>615 24行も書いていないです。
#include<stdio.h>
main()
{
printf("hellow worle\n");
}
だけなんです
あれ?fscanf()ってそんな戻り値だったけ?
うぅよく判らんすまんがこれで理解があってるかチェックしてください。間違ってたら息の根を止めてください ファイル内容 10 20 を読み込んだ場合 whileで論理チェック(ファイルは終わってないかどうか) ↓ 終わってないので10をnum[0]へ。numを0から1にする ↓ whileで論理チェック ↓ okなので20をnum[1]へ。numを1から2に。 ↓ whileで論理チェック ↓ ファイル終わってるのでループ終了。 じゃ、ない?
622 :
デフォルトの名無しさん :04/06/29 02:39
>>615 24行目にエラーがあるんじゃなくて、エラーが24個見つかったんでしょ。
まず、英語の勉強をしたもれ。
>whileで論理チェック(ファイルは終わってないかどうか) ここが間違い(w
627 :
デフォルトの名無しさん :04/06/29 02:42
>>621 もう読み込むべきものがないときにfscanfして初めてEOFがセットされる。
>>619 やっぱどっかに変な文字が混入してると思うんだけどなぁ・・・。そのコードは普通にコンパイル通って実行もうまくいくし。
whileで論理チェック(ファイルは終わってないかどうか) ↓ 終わってないので10をnum[0]へ。numを0から1にする ↓ whileで論理チェック ↓ okなので20をnum[1]へ。numを1から2に。 ↓ whileで論理チェック ↓ okなのでfscanf。EOFがセットされる。numを2から3に。 ↓ while中のfeofで判定。 ↓ ループ終了。
というネタ?
631 :
デフォルトの名無しさん :04/06/29 02:46
feofってほとんど使わない。 大抵は入力関数の戻り値を調べることで済む。
>>628 変な文字は何度も確認しました。
驚くべきことに、他のサンプルファイルでもこうなることがあるんです。
>>629 ありがとー!!よく判った。
fscanfがeofを吐き出すのはなにもないものを読み込んだ時なんだね。だから三回ループしてたのか
助かりました謝謝
>>633 つまり、fscanfの返り値==0の場合も処理を考えたほうがいいね
>>634 本付録のBorland C++ Compiler5.5です
よーしgcc(MinGW)にのりかえよー
>631 例えばfscanf()は書式分の変換できなかった場合は変換できた個数を返す 読もうとして変換したかった個数より少なかった場合、 ・最初の変換の前にファイルの終端文字 (end-of-file) があって、入力の失敗が生じた この場合はfscanf()の戻り値でEOFかどうかわかるが ・エラーやファイルの終端文字の出現が変換が始まった後で生じた この場合はfeof()でEOFかどうか調べる
gcc しか使ったことがないので分かりません
640 :
デフォルトの名無しさん :04/06/29 02:57
エディタに問題があるんじゃねーの? ワープロを使っているとか。
C標準ライブラリの関数でもかなり良質のドキュメントが載ってるからMSDN Libraryは素晴らしい。 つーか正直なところMSDN Library以上に引きやすく、読みやすく、よくまとまっており、関連事項への参照があり、セキュリティ警告も出してきてくれる ドキュメントツール(?)は無いと思うわけで。 そんな私はMinGW使いなのですよ。
メモ帳です。。
あれだな。きっと勝手にUnicodeで保存するハイパーメモ帳なんだ。
Wordにしとけ。スペルミスのところにちゃんと赤線を引いてくれるぞ。
645 :
デフォルトの名無しさん :04/06/29 03:02
Win2000のメモ帳ならUnicodeも使えるが、デフォルトはUnicodeじゃないしなぁ。 やっぱりハイパーか。
>610 かくちようし、何にしてる?
そういえばこちょうしで言語推定(確定)をしちゃうコンパイラもあるね。gccなんかもそうか。
>>644 今ワード使ったら、赤線ひかれまくりで、
エラーも出るし、なんかだめでした。
>>646 拡張子は.cです。
それをコンパイルすると.exeという実行ファイルができるんですが、
そこまでで終わってしまうんです
あ、終わってしまうというのは、実行ファイルをコンパイルするとエラーが出ると言うことです
・エディタを変える ・コンパイラを変える ・OSを変える ・人生を変える ・無に帰る
エラー E2206 C:\xxx\xxx.cpp 18: 不正な文字 ' ' (0x8140) xxx.cpp ファイルの 18 行目に全角スペース (日本語のスペース) があるので半角スペースに修正する。 同様の間違いに、二重引用符が半角「"」ではなく全角「”」になっている、一重引用符が半角「'」ではなく全角「’」になっている、などがある。 注意すること。
653 :
デフォルトの名無しさん :04/06/29 03:18
できることならそうしたい
you can do it!
ワードパットでもだめですた。。。ウイルスかな
・エディタを変える <- 今ここ -> ・コンパイラを変える ・OSを変える ・人生を変える ・無に帰る
考えたくないけど確かにコンパイラが怪しい。 サンプルファイルしか読み込まないなんて。いや、サンプルファイルすら 読み込まないBorlandC++Compiler
ワードとかなんか余計なスペースとか入りそう・・・(偏見?) まぁBCC Developerとかのほうが使いやすいんじゃないかな?
660 :
デフォルトの名無しさん :04/06/29 03:31
>>658 BCCのせいにするなYO! BCCはそこまで酷くはないYO!
家のBCCはちゃんとさっきのコピペ読み込みました
>658 ...あんちボーランドか(w
じゃー、コンパイラは飛ばしてOS変えようか
VC++よりBCCの方が好きだな・・・ VC++はなんか新規プロジェクトの時出来る意味不明なファイル多いし
665 :
デフォルトの名無しさん :04/06/29 03:34
>664 ...あんちマイクソ(w
>>663 により、Linux厨とFreeBSD厨の争い開始。
98とかめっちゃ不安だな・・・
>>668 それこそ問題のような。コンパイルするとバイナリの中に隣のメモリ空間がコピーされることがあったりとまぁウハウハな環境だよ。
2000かペケポンをお勧めする。
確か(Windows)98のメモ帳はShift JISしか扱えなかったはず・・・
>2000かペケポン ハードウエアが(w
BCCやらVC++やら・・・まるで別世界や・・・
vim on linux using GNU gcc は少数派なのか・・・
>>651 下から二番目でお願いします・・・
MS-DOS6.0 & RED2 も現役(w
>>673 Linux使う時はGCCも使ってる
VC++はDirectX使う時だけだな・・・BCCでDirectXつかえねぇ(7以下も・・・)
>>673 俺もvim好きだよー、マウスある環境だとやはり別コンセプトのエディタがいいからVxEditor使ってるけど
俺もLinux好きだよー、マシン一台空けるのめんどいからcoLinux使ってるけど
俺もgcc好きだよー、(こればっかりは完全に同じなのでネタ続かず)
98じゃC言語すら厳しいんですか・・ 保守派の僕にはつらい
まぁ別に出来なくはないけどねw 自分は95でBCCとK2Editor使ってましたよ
無視された。
>>665 すいません無視したわけじゃないんですが・・
ソース自体には問題はないはずなんです。
ちゃんと起動するサンプルのソースをそのままメモ帳にコピーしても
動かないので、問題は違う場所にあるんだと思います。
わざわざリンクありがとうございます
うーん、BCC再インスコしてみれば?そこまでいけばstdio.hがちゃんと存在しないとかライブラリがかけてるとか、そういうのを疑った方が
>>610 hellow world ぐらい自分でソース打てよ
コピペだと改行コードとかいろいろ問題ある。
あ、自分で打ったソースがエラーか それだったらコンパイルとおったソースと バイナリで比較してみろ
>>683 改行コードをコピペ元に忠実にファイル内部でコロコロ変えてくれるエディタというのには出会ったことが無いので是非紹介して頂きたい。
>>682 たしかに。再インスコしてみます。
>>683 バイナリってどうやってみるんですか?もしかしてメモ帳でexe開いたときに
画面いっぱい文字化けが出てくるやつですか
あと質問ばかりで恐縮なんですが、ワードパットでソース書くときって
ファイルの種類はword6ドキュメント、字体は欧文でいいですか?
688 :
デフォルトの名無しさん :04/06/29 07:55
>>649 .exeの実行ファイルが出来てるならそれで問題ないだろ?
>>650 なんでそのEXEファイルをさらにコンパイルするんだ?
>>688 の指摘が何故今になって出てきたか理解に苦しむ
どういう雰囲気だったんだ?
夜中は
>>650 がなかったような・・・
なわけないか。でも全然目に入らなかった。
ん?実行ファイルをコンパイル?逆アセンブルか?
692 :
デフォルトの名無しさん :04/06/29 12:50
ファイルから実数型のデータを入力し、分散を求め、ファイルに出力するプログラムを作成せよ。 提出期限は、次週の授業開始時までとする。 ただし、プログラム仕様は下記のとおり。 (1) 入力するデータの数は100個とする。 (2) 分散を求めるために、ファイルを2回読み込む方式を取れ。 (本当は配列で取っておき、計算する方が効率が良いが、 前章のファイル入出力の復習の意味を含め、2回読み込 む方式を採用することにする) (3) ファイルへの出力フォーマットは、下記のとおり。 平均 = 平均の計算結果 分散 = 分散の計算結果 ただし、最大値、最小値が複数存在する場合には、データ中での先頭からの番号は、 若い方にせよ。 (4) 入力ファイル名は、input.dat、出力ファイル名は、output.dat。 お願いします。
693 :
デフォルトの名無しさん :04/06/29 12:52
すいません、実行ファイルをコンパイルするといういいかたは違ったかもしれません。 教科書には、例えばhellow.cというソースを実行するまでの過程は 「まず @bcc32 hellow.c と打ち込んで、コンパイルがうまくいったら 実行可能ファイルhellow.exeが作られる。 Aそれでは今できたばかりの実行可能ファイルhellow.exeを打ち込んでみましょう。 Hello World と表示されましたか?」 とあるんですが、僕ができたのは@までで、Aでは不正な文字があるというエラーが 24個出てわけがわからないんです。
697 :
デフォルトの名無しさん :04/06/29 12:59
#include <stdio.h> int main() { return fprintf(stderr,"エラー: 不正な文字がある\n"); }
>>696 「打ち込んだ」というのは具体的にどうやったのか。
>>696 ソースを作成して(例: hellow.c)
コンパイルする(例: bcc hellow.c)と、実行ファイル(例: hellow.exe)が出来る。
のは理解できてるよね。
あとは、実行ファイルを実行すればいい。
サンドバッグに打ち込んだんじゃねぇか?
難だ34って?
>>698 コンパイルしたときと同じように
bcc32 rei1_2.exe
と打ち込んでいたのですが、今言われてみて改めて本を確認すると
rei1_2
とだけ打ち込めばいいそうで、やってみたところ
hellow world
できたあああああああああああ!!!!!!!
氏のう。。プロ板の皆さん、こんな僕に90レスも付き合ってくださって
ありがとうございした。今度おごります!!
あ、rei1_2はファイル名です
>ファイルの種類はword6ドキュメント、字体は欧文でいいですか?
そんなわけない。テキストファイルだ。その程度の違いも分からない奴はワードパットやめろ。
今まで何をしたらどうだったか、全部忘れてしてしまえ。
>>610 から一貫して、言ってることがおかしい。
>サンプルファイルをコンパイルすると、きちんと「hellow world」と表示される
コンパイル直後で出るわけ無い
>サンプルファイルをコピーして貼り付けても同じメッセージが出ます
コピー直後は出ない
>それをコンパイルすると.exeという実行ファイルができるんですが、
>そこまでで終わってしまうんです
>あ、終わってしまうというのは、実行ファイルをコンパイルするとエラーが出ると言うことです
実行ファイルが出来たのなら問題ない。実行ファイルはコンパイルできない。
>考えたくないけど確かにコンパイラが怪しい。
馬鹿言え
>Aそれでは今できたばかりの実行可能ファイルhellow.exeを打ち込んでみましょう。
>Aでは不正な文字があるというエラーが24個出てわけがわからないんです。
ありえない。
コンパイル、実行のそれぞれの意味が分かってないように見える。
わかってない奴は、やったことの順序を正確に、一切はしょらずに報告しなきゃだめだ。
ファイルの場所やコマンドラインに打ち込んだ内容のコピペ、問題が起こる一番短いソースのコピペなどなど。
それを中途半端にして、言ってることが既におかしいから、誰も本当の間違い・勘違いを指摘できない。
タッチの差だったか。 >コンパイルしたときと同じように >bcc32 rei1_2.exe 繰り返すが、これは最初のレスで書くべきことだぞ。途中から予想はついてたけどな。 何をやったか正確にわからなきゃ、何が起こってるか、こちとらわかんないんだから。
>>704 たしかに。。コンパイル、実行の意味がわかってないのに
恐るべき自分の思い込みでした。
目が痛いので眼科に行って、医者に「最近眼圧が高くて・・」と訴えたところ
医者「なんで眼圧が高いってわかるの?」
自分「あ、そういえばなんでだろ」と
逆に聞かれた時とまったく一緒ですね。
早くC言語極めて質問スレで役に立ってみせます
707 :
デフォルトの名無しさん :04/06/29 13:29
BCCもわけのわからんファイルをよこすなくらい言えよな。
708 :
デフォルトの名無しさん :04/06/29 13:47
でも実際に眼圧が高かったんだろ?
>>702 最期にこれだけはツッコましてくれぃ!
何 だ hellow world て w
はろうぃーんわーるどさ
>>610 コンパイルたら、実行たら、なにをどうしているのか
意味をちゃんと理解しろ。
それでようやくなんとかスタートラインに立てる。
>それでは今できたばかりの実行可能ファイルhellow.exeを打ち込んでみましょう。 >Hello World >と表示されましたか?」 >hellow world >できたあああああああああああ!!!!!!! 大丈夫ですか?
いつまで構うつもりだ
すみません。 あるプロセスからperlのスクリプトを起動しようとして、fork(), execle() したんですが、スクリプトの行頭でperlに与えるスイッチとして-Twがないと、 何故かexecle()に失敗します。まぁ、それは置いといて、このときexecle()を 呼び出したプロセスがdefunctになります。 親プロセスはwaitpid()で子プロセスが死ぬのを待っているのですが捕らえきれて ないようです。 こんな場合、waitpid()よりもwait()を使ったほうがいいのでしょうか。 ただ、単純なwait()だと、他のプロセスをfork()、execle()していると間違って シグナルを貰ってしまいそう?なので不味い気がします。
>>716 スキルのない奴ほど意味なく「スレ違い」を連発。
>>717 藻前こそ
>>1 嫁
>GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
スキルのない教条主義者ほど使えないものはないな…
煽りの下手な低脳ほど使えないものはないな...
適切なスレすら選べない低脳にかまう必要は無い
1行レスしかできない低能ドモが増えたなw execle()に失敗したら、exit()してるか?
親まで殺す気か!
pid = fork(); if (pid == 0){ if (execle(....) < 0){ exit(-2); // 戻り値に特に意味無し } } if (pid > 0){ waitpid(pid, ... ); } こうか?
スレ違いな話題を続けるからあほな書き込みが続く
ちなみに、スレに沿った質問なんてほとんど無いわけだが。
無くしてもいいんじゃない?
gotoを使うべきケースを教えてください。
caseを使うべきケースを教えてください。
switchを使うときですいっち
>ケースバイケースじゃないかな。 ちなみに、こういうレスをスレ違いとのたまう奴は居ないわけだが。死んでいいよ。
↑ スレ違いのテンプレート ・よく読みもしないで脊髄反射レス ・単に「スレ違い」と言いたいだけ。 ・冗談をスレ違いだ、とは指摘しないダブスタ野郎 ↓
標準ライブラリにディレクトリ作成機能がないんですが これは付け忘れですか?
739 :
デフォルトの名無しさん :04/06/29 18:41
ちなみに、初期の MS-DOS にも ディレクトリの概念はなかった。 特殊ファイルである CON や NUL が、ディレクトリに関係なく使用できるのは その当時の名残であると伝えられている。
その割には、テキスト入出力は付いてるのな。
>>740 それはライブラリ側で対応できる(とANSIはみた)からだろう。
>>738 それはいいわけじゃないのですか?
ファイルの概念を持たない環境も、
標準入出力の概念を持たない環境もあるでしょう?
>>741 それを言うのならすべてライブラリ側で対応できますよ。
743 :
デフォルトの名無しさん :04/06/29 19:16
>>742 ノイマン型でない環境もあるかもしれないよな。
ワイヤードロジックを使う環境とか。
作られた当時からライブラリが進化してないだけだろ。
>>742 言い訳って何よ?バカじゃない?
単純に、仕様としてディレクトリという概念が必要な関数が策定とされなかっただけじゃん。
標準ライブラリでもディレクトリは扱えるわけだが。 作成するのができないだけで。
ライブラリを作ろう!
けっきょく char *型からconst char *型への暗黙変換はあって char **型からconst char **型への暗黙変換はないという 仕様なんでしょうか??
誤解を恐れずに敢えて言うならば、その通りだ。
>>748 char **p=0;
char * const *cp=p;
標準ライブラリでも ディレクトリは作れるだろ。 system("mkdir hoge"); とか、他にもやり方はあるし。
752 :
デフォルトの名無しさん :04/06/29 20:46
>>745 相手にすんなって
人を小馬鹿にすることでしか自我を確認できない寒ーい中年が
PG系の大手掲示板によくいるんだよ
ネットであろうがリアルであろうが
そんなことばっかりしてる奴にロクなのいないよ
黙って冷ややかに憶えといてやろうぜ
> 人を小馬鹿にすることでしか自我を確認できない寒ーい中年が > PG系の大手掲示板によくいるんだよ 特にでるふぁいしか知らないような逝き遅れがね
>>750 それってつまり・・・
char ** → const char **
は無理で
char ** → char * const *
は暗黙変換ありってことを言いたいのでしょうか?
ただ、char * const * p;
とした場合、定数なのは *pですよね?つまりポインタが定数。
ポインタのポインタと実体は変更可能ということですよね。
const char **だと実体が定数なんで、char * → const char *
みたいにchar **の場合も実体を定数にする暗黙変換がやりたかった
んですが・・・素直にキャストしるってことですかね。このへんの
仕様がどうもわからん。
756 :
デフォルトの名無しさん :04/06/29 22:00
char **a; a=(char**)calloc(10,sizeof(char*)); a[0]=(char*)calloc(10,sizeof(char)); a=(char**)realloc(a,20*sizeof(char*)); a[19]=(char*)calloc(10,sizeof(char)); strcpy(a[19],"abcde"); printf("%s\n",a[19]); free(a); どこかの掲示板で2次元配列はreallocでは確保できないというのを見たのですが、上記のプログラムは正常に動きました 問題点はありますか?
>>756 a[0]とa[19]がfreeされていない
758 :
デフォルトの名無しさん :04/06/29 22:04
>>756 reallocが使えるのは最上位の配列要素の数の変更のみで,
他の配列要素は変更できません。
>>755 char **p=0;
const char * const *pp=p;
760 :
デフォルトの名無しさん :04/06/29 22:08
>>758 ということは、2次元配列のサイズを変更するということはでき二のですか?
くだらない質問だけど検索すると物凄い数出てくるのでサクっと教えてください #define PI 3.14f ってのが出てきたのだけどこのfってどういう役目をしてるのですか? 例えば #define PI 3.14と書くのとはどう違うのでしょうか。桁数?
>>610 コンパイルするとき、なんていうコマンド入れてる?
「う」は宇宙の「う」 「f」は?
764 :
デフォルトの名無しさん :04/06/29 22:13
fuseikakuのf
>>761 検索ワードにサフィックスを咥えてもう一度ぐぐってこい。
floatのf
fusianasanのf
>>766 あなたの野太いちんぽを咥えさせて頂けませんか?
oyoso3のf
ポッキーのfだろ
fuckのp
初心者の俺はネタかどうかの判断つかないが歯がゆい・・ つまり数字の後ろにfってつけると「それはfloat型だぞ」という宣言みたいな感じの認識でよろしくて? #define PI (float)3.14と同じ意味? だとしたら何もない時は何になるの?intかな。 つうか根本から間違ってそうな気もしてきた・・・
>>774 少数の場合、dとして扱うかfとして扱うかは結構違うので
longで宣言した関数からreturn 0L;をやったり int hoge(long, long); な関数にhoge(20L, 15L); というふうにやるのは結構無意味だと思うんですけど、どんなもんなんでしょうか?
3.14 double型 3.14f 3.14F float型 3.14l 3.14L long double型 小数点文字がついた時点でintではなくなる
>>776 少なくとも、無意味ではないですが、だからといって特別な効果があるわけでもないです。
>>776 intの範囲に収まる値なら確かに無意味そうだ。
>>779-780 intが32bit値と仮定してですけど、hoge(4100000000, 4100000000);などとしてもコンパイラが勝手にlongとして
解釈してくれると思うんですがどうなんでしょう。
intの範囲に入るfloat型か、たしかに無意味かな。
int と long のサイズが違う処理系で、 1 << n と 1L << n では、nの値によっては、結果が変わってしまう処理系がある。
_| ̄|○
786 :
デフォルトの名無しさん :04/06/29 22:54
フェムト
>>759 あ、つまりポインタを定数にすることで、暗黙変換ができるようになり、
実体も定数にしたければ頭にconst付ければいいということですか。
なんかわかりづらいですね。それとも理にかなってるのかな?
char ** → const char ** この暗黙変換を禁止した理由ってなんだろ。
>>781 いや、それは違うんじゃないか。
Lがついていない以上、ただのintだろう。
>>787 それ「エキスパートCプログラミング」に載ってた。
規格書読めば分かることらしい。
じゃーK&R読んでみよう
標準入力から任意の桁の数字を1桁ずつ配列に入れるにはどうしたらいいでしょうか? 例:32030 a[0]=3,a[1]=2,a[2]=0,a[3]=3,a[4]=0のように代入したいんです
gets or scanf
793 :
デフォルトの名無しさん :04/06/29 23:16
794 :
デフォルトの名無しさん :04/06/29 23:18
>>791 getcharでいいのでは?
aはchar型なわけでしょ?
scanfで文字列としてとってstrlenやってからまわした方がやりやすいかも。
>>787 typedef char* charp;
charp *p=0;
const charp *pp=p;
↑キモいからそんな事はやめて
>>793 isdigit() で数字判定も入れるべし
>>787 char const c[]="do not write";
void f(char const** p){*p=c;}
void g(char** p)
{
f(p);
(*p)[0]='\0';
}
>>796 おお・・そんなやり方が。
無理やりにでもやりたいなら、そういう方法ということですか。
表記上*が1つの宣言なら、いけるんですね。
2つなら1段階デリファレンスしたものをconst指定して・・・
ってもうこのへんでやめときます。
言語作った人がどういう考えでこのように実装したのか
ちょっと気になったんですが。
エキスパートCにのってるそうなので立ち読みしてきます。
どうもでした。
>>800 typedef char* charp;
const charp *pp;;
この時ppの型はchar * const *だ
>>799 あ、定数性が失われる・・・ということですか
ああそうか〜そうだそうだ〜
char **→const char **やっちゃうと
const char *が代入できちゃって
元のchar **の方でデリファレンスしちゃうと
charが書きかえれるわけでconst char *の
実体が変わっちゃうってこと?(意味不明)
>>801 おお、それも見落としていた〜
マクロみたいに展開すりゃいいってもんじゃないんですね〜
うおおお
こうしてみると昔どっかのスレでconst charとchar constの どっちの形式を使うかで話題になっていて、自分はconst charの 方がメジャーだろうとこっちを使っているのですが、constの理解 のしやすさでいえばchar constもいいかもしれませんね。 char const ** char * const * char ** const typedef char* charp; charp const *pp;
806 :
デフォルトの名無しさん :04/06/30 02:16
C言語で、エクセルファイルに計算結果は書き込めるんでしょうか?
808 :
デフォルトの名無しさん :04/06/30 02:35
あの学校のプログラミングの授業で微分方程式を必ず用いてプログラム作れっていう 課題が出たんですけどどんなのやればいいですかね? ちなみにバネ2本つないで振動させるっていうのは駄目らしいです。
>808 宿題スレで聞くといい。
>>804 const char*
と
char* const
では、意味が違う。前者はポインタの差しているcharがconstant.
後者はポインタがconstant.
>>808 コマの運動方程式を立てたシミュレーション。
ドキュメントが欲しくてPSDKのupdateを始めて6時間、まだCore SDKすらインスコおわんねぇ・・・ 15KB/sってあんた・・・
書き場所間違った。
>>810 const char*
と
char const*
では意味が同じ、だが下の方が良い書き方ではないのか?ということを
>>804 は言ってるんだろ
標準ライブラリ関数とシステムコールの使い分けについて、 なんかガイドとかないでしょうか?
標準にあれば標準を使い 標準になくシステムコールにあればシステムコールを使う
>>816 意味は違うっつーの
804もconstの理解云々書いてるだろーが
>>820 char const* と const char* でどう意味が違うのか、言ってみな。
お前がバカなのは良く分かるけど、810のレスくらいちゃんと読んでやれよ。 char* const a; const char* b; a = "aho"; /* ダメ */ b = "baka"; *a = 0x0; *b = 0x0; /* ダメ */
char const* a; const char* b; の違いじゃないのか
824 :
デフォルトの名無しさん :04/06/30 11:25
Cでoracleへ接続・操作したいんですけど、どうしたらよいのでしょうか? 環境はwin200・Visual Studio6.0です。 お願いします。
win200 キター!
>>827 これは環境スレだったのですね。
旅立ちます
>>822 は *const と const* の違いが分かってない?
829は頭良すぎ
すげーだろ。
charは絶対チャーって読むよな
833 :
デフォルトの名無しさん :04/06/30 16:01
プログラムを誰か作ってくれませんか?
言語はCで。詳細は、
[email protected] 1万円でお願いします。しかし、期限は今週の金曜まで!
ええっと、レベルはプログラム経験2年くらいの人なら半日もかからず終わります。
当方、プログラム経験がないため、四苦八苦してるオヤジです。
>>833 安いよ。あと100倍だったら請負ってあげるけどね
半日もあまったら中途半端で何していいやら 100倍はいらないが1万ごときじゃ足りん
あっそ
838 :
デフォルトの名無しさん :04/06/30 16:10
この手の書き込みって必ず何人かは釣られるよな。
おm
とりあえず内容を聞いてみたい。 当方Cでの開発経験2年程。私くらいなら妥当な値段かも・・
>>833 616 :デフォルトの名無しさん :04/06/30 16:11
未経験のオヤジの目算じゃ当てにならないな
5分で終わるかもしれないし3ヶ月の案件かも知れん
ああ、そうだった。 ここはCスレである前に2ちゃんねるだったんだ。
843 :
デフォルトの名無しさん :04/06/30 16:18
>>840 詳細はここではいえないのですが、概要はこうです。
@あるテキストファイル(Aとします)を読み込む。
Aもう一つのテキストファイル(Bとします)を読み込む。
ここで、AとBが完全のデータが完全に一致していたら、
Aファイルに「OK」、一致していなければ「NG」と記述するプログラムをお願いしたいのです。
Aファイル、Bファイルの中身はここではお教えできませんが。
よろしくお願い致します。
844 :
デフォルトの名無しさん :04/06/30 16:19
詳細を聞かないと、どつぼに嵌まる可能性があるよな。1マソが高いのか 安いのか。まさか、CAD作ってくれとか?
845 :
デフォルトの名無しさん :04/06/30 16:20
(訂正) AとBのデータが完全に一致していたら(略) すいませんです。
846 :
デフォルトの名無しさん :04/06/30 16:20
メール出してそこでやれやうっとうしい
それぐらいで良いなら承るよ
850 :
◆4m36BLkkLA :04/06/30 16:22
>>844 トリップつけます。
いいえ、違います。
エクセルに貼り付けるやり方も存在するらしいですが、Cでお願いしたいと思います。
あははははははははははははははだfdslfじゃdfw0おkbvmpそいs
852 :
◆4m36BLkkLA :04/06/30 16:23
こんにちは!yosinobuといいます。都内の大学3年だよ。 ここの掲示板で見かける女の子のコメントで「処女を捨てたい!」 って子がいますけど、力になりたい!です。 もし、男性とHしたことないけど、 身近に相談相手がいないって人がいましたら、 メールくださいね(^_^)大学ではサッカーをしてますよ♪ だから見た目も悪くないと思います!
>>843 そこまで具体的に出来てるなら出来たも同然やん・・周りの人間に頼めよ
858 :
◆4m36BLkkLA :04/06/30 16:33
捏造ですか。。
>>833 linuxであればcmpというツールがあるし、
windowsならcygwin入れれば使えるし、
webで探せばそういったツールはいくらでもありますよ
どうしようもないスレ
>>833 system("diff A B");
/* 事後処理 */
我ながら完璧だ。
そんなのにc使っちゃぁ・・・
-------------------- キリトリセン --------------------
詳細は流せないが単純にHEX単位で 比較するだけじゃないらしい
察してやれ
何を?
>>867 char const* と char *const が同じだと思って優越感に浸ってる
あるいは
const char* と char const* が同じって事に気づいた
char const* と char *const は違うって事に気づいた
そして逃げた
逃げたのか。なるほど
871 :
◆4m36BLkkLA :04/06/30 17:06
>>864 どうですか?できそうですか?
メールお待ちしております。
やっと整理できた。 >804 「const char より char const の方が理解し易いかも。」に対し >810 が勘違いして「const char* と char* const は違う。」 >816 が「そんな話はしていない」と指摘。 >820 の勘違いは解けず「違うっつーの」 >821 が再度指摘。 >822 が引っ込みつかなくなる。 >823 が更に指摘。 >829 がアサッテの方角へ。
必死だな
どこかのスレで、確かに
>>804 と同じ話は出た。
俺も書いたから間違いない。
ちなみにその時は、const指定が型を修飾すると考えたほうがわかりやすいかも、という意見も出ていた。
>>843 > (日)あるテキストファイル(Aとします)を読み込む。
> (月)もう一つのテキストファイル(Bとします)を読み込む。
「半日もかからずに終わる」というのはうそですね。
分かりやすさとはデファクトスタンダードな書き方に倣う事だ。 俺理論でマイナーな書き方をされたら迷惑なだけ。
int signed
char define