あおいjぐおあいうといつおいぐおいくおい
うgはおいうごいうとう89
gじょいあうごいうt98w48
事件の匂いがします
スレタイ、いいかげん、C言語じゃなくてCにしない? めっちゃ素人くさいんだけど。
C言語でいいよ
いおあうごいあういちょあうといqgじゃきじょg
プログラミング言語の後ろに言語をつけるのって、すごいダサい。
頭の悪いレスはやめろよ
このスレがどんだけダサいスレか気付いてないやつがいるようだな。名前の問題じゃねーよ
CはC言語でないと検索のときに不便なんだよ
>>15 >>13 のレスって最近よく見るけど、本人は気のきいた返しとか思ってるのかね。
すごい頭悪そうだよな。
「C」で思い付くものはいくらでもあるが「C言語」だと1つに特定される。 言葉の選び方で言えば後者のほうが圧倒的に合理的である。
ジョイ具あおいうちおあうとい8349う789qちおgkじぇwq
>>19 文脈でわかるだろ。
検索云々とかいう話もあるけど、そもそもCとかC言語だけで検索することが
ないから、どうでも話。
ぎおぱういとぐあいつくぉ3う809qごいかg
あぼーん
>>18 >>12 が最高に無意味なレスをしてるって気付かせようとしてるんだけど
馬鹿にはそれが分からないからね。馬鹿にはちゃんと馬鹿って言わないとさ
C言語で良いだろ。
あぼーん
>>24 >>18 は煽ってるだけだから、マジにレスしなくていいよ。
まあ、バカだからわかんないかもしれないけど。
あぼーん
>>24 「だからなに?」の一行レスとか、反論を思いつかないから何か
適当に言ってるだけのようにしか見えないよ。
本人の主観だと「無意味なレスをわからせる」効果があるってことになってるのか。
あぼーん
おい意味不明なレスしてるクズ 巻き添え規制くらうヤツのこと考えろよバカタレ
あぼーん
これどうやってNGすればいいの……
あぼーん
あぼーん
36 :
デフォルトの名無しさん :2010/01/09(土) 16:46:32
突然すみません。 わからない問題があるんですが この整数を入力し、入力したデータの平均値(小数点以下切り上げ) に対して”※”と表示するプログラムを作成せよ ・”※”の表示はいくつでも表示できるようにする。 ただし、平均値が0の時はエラーの表示する。 ・繰り返し処理としてfor,while,do whileのいずれかを用いる 以上です
あぼーん
あぼーん
39 :
デフォルトの名無しさん :2010/01/09(土) 16:51:31
この整数値× 整数値○
本当に”※”なのか? *←これなんじゃないの? for,while,do以外の処理のほうが珍しいな
あぼーん
あぼーん
あぼーん
uuencode/decode もあったなあ
ごあjぎおあうちおあうお
あぼーん
質問なのですが、 const char *g_str1 = "global string"; main(){ char *str = "test string"; str = g_str1; str[6] = '-'; puts(str); } staticをつけたのにコンパイル、動作問題なしです。 なぜでしょうか?
>>48 warning レベルが低くて、運が良かったから
あぼーん
あぼーん
あぼーん
あぼーん
これ何かのSOSだろ
あぼーん
あぼーん
おいがいgjgぁじょい
58 :
sage :2010/01/09(土) 22:23:13
暗号文か?
>>48 static?
そのソース中にはないようですが???
あぼーん
あぼーん
あぼーん
>>63 手元の環境(VC)に入力してみたが、コンパイルが通らなかった。
>>49 のレスのとおりじゃないかな。
貴方が求めるそこまで優秀なコンパイラが 無償に近い価格で頒布される わきゃないという説明で許してくれ
double d(1<=d<=0xffffffff)の整数部分だけ取り出したいのですが この場合はfloorでなくてキャストでいいのでしょうか?
あぼーん
あぼーん
あぼーん
71 :
デフォルトの名無しさん :2010/01/10(日) 09:31:54
マイナスの時どうするかだと思う
諦めて枕を濡らす
1より大きいマイナスの数ってなんだ?
76 :
72 :2010/01/10(日) 15:04:49
1<=dだったのか じゃmodf
77 :
デフォルトの名無しさん :2010/01/11(月) 11:18:21
WITH 12 プロセス WITH 7 金融制裁協議 WITH 7 金融 WITH 7 制裁 WITH 7 協議 WITH 6 金融制裁 WITH 2 米朝 WITH 2 米 WITH 2 朝 WITH 1 長い WITH 1 に WITH 1 が WITH 1 「 WITH 1 」 という「WITH スコア 語」からなる文字列があって、"WITH " や " " をstrstrで探しながらスコア、語の 組みを拾っていますが、'「'の後あたりで' 'を探すstrstrが失敗してエラーになります。 文字コードの問題かなとも思うのですが、良くわかりません。 対処法わかる方教えてください。
あぼーん
あぼーん
あぼーん
expected expression before 〜 gccのエラーなんですがどういう意味でしょうか? ググっても具体的な内容が見つからないので・・・
〜前後のソースさらせない?大抵 ; とか } がたりないんだと思うけど。
あぼーん
あぼーん
翻訳してみるといいよ
86 :
77 :2010/01/11(月) 11:40:01
問題は別の所にあったようです。失礼しました。
susieプラグインみたいなプラグインってどうやって読み込んで、利用するの?
>>82 構文チェックをしましたが;や{}は問題なさそうです
〜には構造体の型名が入っていて、複数行でこのエラーが発生しているので構造体に何か問題があるかもしれないです
エラーの起きた行と、エラーメッセージ全部を引用しろよ なんでわざわざ人を試すようなことをするんだ?
>>89 今書いてるものが一応C言語ではあるけどでも厳密にいえばC言語じゃないんであんまり詳しく尋ねるのもどうかと思って・・・
expected expression before 〜が何か特定のエラーを指すものだったら意味がわかればなんとかいけるかも、と・・・
91 :
デフォルトの名無しさん :2010/01/11(月) 12:13:33
>>88 とりあえず最初のエラーメッセージうpしる
> 構文チェックをしましたが;や{}は問題なさそうです 問題なければ、コンパイラはエラーを出さない。 > expected expression before 〜が何か特定のエラーを指すものだったら意味がわかればなんとかいけるかも、と・・・ エラーメッセージに書いてある通り。 〜の前に式が期待されているのに、式で無い。 コンパイルエラー解決できない奴って、ウルトラ恥ずかしい超初心者ってわかってる?
47: error: expected expression before 'params_spe' 57: error: expected expression before 'params_spe' 58: error: expected expression before 'params_spe' 70: error: expected identifier or '(' before '.' token 76: error: expected expression before 'params_spe' 92: error: expected expression before 'params_spe' 全部構造体がらみのエラー・・・
あぼーん
単にparams_speが構造体と認識されてないだけじゃん。
あぼーん
エスパーすると typedef struct を調べればいいんジャマイカ?
構造体の名前、間違えてるんじゃないの? param_spe とか
>>37 とか
>>96 とか、謎の言語にならない書き込みをしているヤツって
なんなの?タダの荒らしなの?
もしそうなら2ch運営から規制か損害賠償になったりしないの?
規制には出来るよ
ウィルスにひっかかったやつが重要な内容を暗号化して書きこんでるのかと思ったが・・・
なわけねえだろ
多分目隠し監禁された状態で必死に携帯からSOSを発してるんだよ
gets() を叩かれたのが、そんなにプライドに触ったのか。
(σ・∀・)σゲッツ!!
>>106 ほんとだ。
なんでだろうね。
wikipって、記述した人に質問できるシステムないのかな?
あと、バッファクリアしないとgets()と同じ動作にならないって書いてあるけど
バッファクリアしても、おんなじ動作ではないわな。
ウィキペディアはド素人でも書くことができるから気にしない方が良いよ。
\rも改行じゃなかったっけ
ウィキペディアはわしが育てた
113 :
デフォルトの名無しさん :2010/01/11(月) 16:44:14
error: expected declaration or statement at end of input の意味がわからんのだが、誰か教えてくれ
115 :
デフォルトの名無しさん :2010/01/11(月) 16:46:13
114>> さんくす
116 :
デフォルトの名無しさん :2010/01/11(月) 16:55:58
error: ‘for’ loop initial declaration used outside C99 mode ってエラーが出たんだが、 その行がload_set( file, &datafile ); なんだが?
エスパーじゃねえんだから、ソースはれや
まあだいたいわかるけど、うっかり答えると延々続きそうだしなw
a=a+b a+=a+b これの違いがわかりません。誰かたすけてくだしあ
どう違うのでぃすか!!
a+=b → a=a+b a+=a+b → a=a+a+b
UTF-8で書かれたソースファイルをビルドするにはどうすれば良いのでしょうか
1) UTF-8で書かれたソースファイルが通るコンパイラを使ってビルドする 2) コンパイラが受け付けるエンコーディングに変換してからビルドする
utf8で書かれたソースを許容するコンパイラでコンパイルする。
126 :
123 :2010/01/11(月) 20:28:17
有り難う御座います UTF-8に対応したフリーのコンパイラはありますか?
VC++
>87 拡張子 spi だけど単なる DLL だから LoadLibrary して GetProcAddress して使う。
C++じゃなくてCのコンパイラってないよね
'\0'と0は同じでしょうか? 同じなら、よくある int str[] = "abc"; str[1] = '\0'; というのを str[1] = 0; としてもいいのでしょうか?
>int str[] = "abc"; これコンパイル通らないだろ
>>133 すみません、以下の間違いでした。
char str[] = "abc";
値としては'\0'と0は同じ。 だからstr[1] = 0;ってしても問題はない。 ただ、'\0'が文字列の終端を意味することを考えたら、0にするのはお勧めできない。
137 :
デフォルトの名無しさん :2010/01/12(火) 11:27:48
はじめまして。 C言語でジャンケンの後出しプログラムを作成したいのですが、 どのような風にすれば作れるのでしょうか? 相手のプログラムは状態遷移を使ってくる強敵です。 よろしくお願いします。 ジャンケン回数は10000回です。
>>137 後出しでいいのなら、相手が出した手を読み取って勝ちの手を出せばいいんじゃねーの?
139 :
デフォルトの名無しさん :2010/01/12(火) 11:51:39
それを今調べているのですが、なかなか見つかりません。 どうすれば良いですか?
10000回もするなら usleep(50)くらいにしないと駄目だわ
>>137 貴方が今つかっているじゃんけんの枠組みについて説明しなければ答えようがありません。
貴方の言う「じゃんけん」とは一体なんですか?
「相手のプログラム」とは一体なに?
じゃんけんの出す手を決めるアルゴリズムを競わせる枠組みのようなものがあるんじゃないですか?
143 :
デフォルトの名無しさん :2010/01/12(火) 15:57:56
#include<stdio.h> int main(void){ float a,b,wa,sa,seki,syou ; printf("2つの数値の入力してくれださい。\n") ; scanf("%f %f,&a,&b") ; wa=a+b ; sa=a-b ; seki=a*b ; syou=a/b ; printf("2数の和は%f,差は%f,積は%f,商は%fです。\n",a,b,wa,sa,seki,syou) ; return 0 ; } ↑を入力して実行してみてコマンドプロントで数字を入力したら 問題が発生したため終了します。ご不便をおかけして申し訳ありません。 と出たのですが、どうしてでしょうか?
>>143 おめでとう! Cプログラマなら誰もが一度は通るミスだw
そうか? Perlとかphpから来たならやりそうだが・・・
scanfがうんこ過ぎるだけ。
高度に抽象化すると143みたいな考え方になるんだろうか
printfのフォーマットも負けず劣らず、うんこだぞ。
152 :
デフォルトの名無しさん :2010/01/12(火) 18:49:10
153 :
デフォルトの名無しさん :2010/01/12(火) 18:55:08
C言語です 2つ以上の文字列を一つにまとめるのってどうやるんですか? 例えば char data[40],data1[20],data2[20]; で data1="hato" data2="poppo" のときに data="hato poppo" ってしたいんですけど
strcpyとstrcat組み合わせてもいいけどスペース入れたりするなら sprintfでいいんじゃない?バッファの長さチェックとか適時やるとして、 sprintf(data, "%s %s", data1, data2); とか
156 :
デフォルトの名無しさん :2010/01/12(火) 19:00:10
157 :
デフォルトの名無しさん :2010/01/12(火) 19:04:46
解決しました!
ってか
>>155 のまんまでした
sprintfめっちゃ便利ですね
ありがとうございました〜
ローカルスコープを使うためだけにcppとしてコンパイルしたら それはC言語で作ったものと呼べるの?
VC++でもC99対応してないしなあ
以下のif-elseif-else文を、switch文or条件分岐を使わない形に変更するには どうすれば良いでしょうか int x,y; x = a-b; if (x < 0x3){y = 1;} else if (x < 0x7){y = 2;} else if (x < 0xf){y = 3;} else if (x < 0x1f){y = 4;} else {y = 5;} よろしくお願いします。
y=5-1*!!(x&~0x1f)-1*!!(x&~0xf)-1*!!(x&~0x7)-1*!!(x&~0x3);
y = 1 + (x >= 0x3) + (x>=0x7) + (x>=0xf) + (x>=0x1f);
164 :
123 :2010/01/12(火) 23:21:24
>>127 有り難う御座います
PCにVisual Studio 2008が入っています
Shift_JISでは問題なくビルド出来る文章が、UTF-8(BOM無し)だと以下のエラーが出ます
これは何か設定が悪いのでしょうか
警告 warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
エラー error C2001: 定数が 2 行目に続いています。
エラー fatal error C1057: マクロ展開中に予期せぬ EOF を検出しました。
メモ帳で作ったBOM付きにするとか。 メモ帳でShift JISに変換するとか。
167 :
123 :2010/01/13(水) 00:36:16
保存オプションでBOM無しを設定出来るので大丈夫だと思ったんですが、ビルドは現状無理なんですね とりあえずBOM付きで管理することにします 皆様どうも有り難う御座いました
>>161 テーブルを作っておいて
y = hoge_table[x];
gccだったら
y = 31 - __builtin_clz((x+1)|2&0x1f);
かなあ。
でも x の値について何も書いてないから INT_MAX まで考えると かなり大きいテーブルがいるね
170 :
デフォルトの名無しさん :2010/01/13(水) 01:21:08
普通に161の書き方の方がいいと思うけどね
161の { } って付ける?
ここでアンケートされても
スレタイ読めんのかカス!
>>176 それって言語の問題じゃなく単純に不注意だよね
>>177 計算途中にも型があるから
2 を 2.0 と書いたり N を (double)N と書いたりするといいよ
>>178 不注意には違いないんだけど
後で式を追加したりするときにやっちゃう人がよくいるんだよ
インデントされてるからぱっと見ではわかりにくかったり
そういう宗教問題は堂々巡りで決着つかないよ。
else if (x < 0x7) y = 2; こうでなく else if (x < 0x7) y = 2; こうする人がいるの?
>>182 y = 2; が長くなって画面の横幅はみだしたらそうしてる
もう一括して{}付けるようにしようかなとも思ってる
184 :
177 :2010/01/13(水) 03:26:06
>>179 期待してた値が出ました
ありがとうございます!
任意長の文字列が与えられて数字のゾロ目がどうかを判断する関数を教えてください。 int is_zorome (char * n); is_zorome("334"); /* false */ is_zorome("aaaa"); /* false */ is_zorome("2222"); /* true*/
int is_zorome(char *n) { char *p = n + 1; if(*n<'0' || '9' < *n) return 0; while(*p) if(*p++!=*n) return 0; return 1; }
scanf("%d",&p[i].math); だろう
>>189 ありがとうございます
質問を小出しにしてしまってすみませんが
scanf("%s",p[i].s);は&いらないのに
scanf("%d",&p[i].&math);はなぜ必要なのでしょうか
構造体じゃないときと同じだよ sはchar s[100]だからsへのアドレスは &s[0]であり、sと同じ mathはintだからmathへのアドレスは&math
文字列が浮動小数点の形式を取っているかを調べる関数とかありますでしょうか?
>>194 ありがとうございます。
厳密ではないけれど、変換しきれない文字列はわかりますね。
196 :
デフォルトの名無しさん :2010/01/13(水) 20:16:25
郷に入れば郷に従えで C++ なら STL のソースを読んだり JS なら prototype.js のソースを読んだりすると学習しやすいのですが C言語にはそういったものは Linux Kernel 以外にありませんか?
多くの人の強烈な個性の苦肉の策の張り合わせと、 専ら政治力学が支配的な分業ソフトウェア開発で 書かれた巨大プログラムソースくらい学習に適 していないものはない。 Linux-Kernelも然り。 portotype.jsも然り。 STLも然り。
>>197 いや私が読みたいのは
その「苦肉の策で練り上げられた強烈な個性があるもの」ですので
巨大かどうかは全くどうでもいいんです。
Matzの言う落下傘方式で興味のある要点から読んでいきますし。
199 :
sage :2010/01/13(水) 21:27:31
あ、そ。
録音するツールって作ってみたいのですが どこから手をつければいいんでしょうか? こんちわ世界から先が見えませんw
Win32APIで用意されている構造体や関数を使います
puts/getsに相当する音声関数を見つけます。
ALSAでぐぐれ
#include <windows.h> #include <mmsystem.h> #pragma comment(lib,"winmm") int main(argc,argv)int argc;char *argv[];{ static MCI_OPEN_PARMS BGM; static MCI_PLAY_PARMS BGM2; int HIT; BGM.lpstrElementName="C:\\WINDOWS\\system32\\oobe\\images\\title.wma"; HIT=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD_PTR)&BGM), mciSendCommand(BGM.wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD_PTR)&BGM2); getchar(); }
typedef struct spethread_params_t { unsigned long long int count; char get[11]; } params; この構造体のサイズを32バイトにしたいのだけれど typedef struct spethread_params_t { unsigned long long int count; char get[11]; char pad[13]; } params; だと40バイトになってしまいます どうしたらよいのでしょうか?
208 :
207 :2010/01/14(木) 13:05:18
すみません 自己解決しました
コンパイルオプションとかalignとかあるよね
211 :
デフォルトの名無しさん :2010/01/14(木) 22:19:11
ifとかで{}付けないことがあるようだけど どこからどこまでが範囲なの?
ありがとう
曖昧になったな
どこが?
うん、まあ、ここらへん。
理解できないなら出てくんなよバカが
文の終了はセミコロンで示すんじゃないの
大体そんな感じ
逆じゃね
int x; //宣言 x=10;//x=10が式、x=10;は文;
223 :
214 :2010/01/14(木) 23:59:58
>>215 >>219 とりあえずお前ら2者は
文を理解すべきだと思うんだお
できないならただのでしゃばりバカ
質問してるのに出しゃばりバカとか言われた…なんだこのスレ
教え方が下手な奴の典型。自分だけ分かればそれでいい、と勘違いしてるが あまつさえ自分でもよく分かってないんだよ。許してやれ
あぼーん
仕様書読め、の一言で終わるような話はこうなっちゃうよね
あぼーん
あぼーん
仕様書をいちいち読んでる奴が2chなんて見るかよ
あぼーん
あぼーん
あぼーん
>>233 いや、ちょっと違う。
酢は入れないし箸を使う。
>>234 __ i`:. __ ウィエッホッホッホッホwwwwww
(__.`ー-::... ,rt': : :\ ,::-'",...) ッホッホッホッホッホホーホwwww
,..::ア - ::::::)-:'':':'(|i(゚):(゚)テ):-:-:-::、イ::: `┬-っ オホーホwww
(,.::'",::' / ,....: : : : r'" ・・' く/i!: : : : :!、,:::::,<` `ニつ オーホホホホホーwwwww
`-(_λ_/: : : : : ( トェェェイ )/: : : : : : : : : ;,.,`::`つ イェッホーwwwww
`-;;;;;;;:/i\二二_/" : /\;,;,;,;,;/ `'" ウッホホwwww
\:.:.:.:/ `i , :く. アオーwwwwwww
`i: :i : : !": : : ) ウッヒャッホーオwwwwwww
r: :i DK:!-┬" ウッホッホッホッホwww
r--`:、 /000 ウッホッホwww
000O" ウーホホホホホーwwwwww
if(a!=b)(typeof(a) c=a;a=b;b=c;});
int a[50]; int b; b=a[-1]; こんなコードを書いても、コンパイラはエラーを出さなかったのですが 明確にエラーだと言えない理由があるのでしょうか? 例えば本当にこんな使い方をする場面があるとか・・・
エラーじゃないからエラーは出さんよ
「配列 添え字 マイナス」でググる
int* a; ... b=a[-1]; ポインタのなら実際に見たことがある 配列のはない
>>239 Cには、書けるけどそのような書き方をしてはいけない、というものがなぜかたくさんあります
「C言語 未定義」でぐぐってみてください
参考書を見て勉強してるのですが、?な所があるので教えていただきたいです 配列を使ったバブルソートで、小さい順に並び替えるのですが int a[] = {70,51,30,80,50,56}; int p[]; int i,j,t,min,s,N=6; for (i=0;i<N;i++){ min = a[p[j]]; ←この部分 s = i; for (j=0;j<N-1;j++){if (a[p[j]] < min) min=a[p[j]]; s = j;}} t=p[i]; p[i]=p[s]; p[s] = t;} for (i=0;i<N;i++) printf("%d ",a[p[i]]); 初期化していない変数jを使用しているのと、minが何週しても動かずに終わるだけなんじゃね?と考えた次第で a[p[i]]なのかと思いつつも、何分ド素人のため正否の判断が付かず これで合ってるというのなら理解できるまで読み返してきます。。。
iだな pも初期化してないような気がするが・・・ あと、それはバブルソートではなくて、選択ソートではないでしょうか
>>245 やはりiですか、ありがとうございます
バブルソートではなく直接選択法で行うって書いてありました。しかも書き込みミスで2行目はint p[6];ですorz
>>246 int p[] = { 0, 1, 2, 3, 4, 5 }; とかじゃね?
>>247 for (i=0;i<N;i++) {p[i]=i};
この行付け忘れてましたorz
なんかもうgdgdですいません吊ってきま。。。
atexitてコンソール画面の×押した時は飛ばないの?
飛ばない atexitはプログラムが正常終了したときだけ
251 :
デフォルトの名無しさん :2010/01/15(金) 20:14:05
int aa; int bb; volatile int cc; a(){}; b(){a();}; c(){}; main(){ b(); aa = 3; } というソースを解析して 使っていないc, bbを削除してくれるツールないですか?
lint
グローバル変数は他のソースからexternで参照されているかもしれないから、 リンクする全ソースを見ないとわからないな コンパイラによってはコンパイルオプション次第で 未使用変数をリンクしないようにしてくれるものもある
>>251 ソースコード上から消してほしいってこと?
>>254 そういうことです。リリースビルドで使っていない無駄なデータやコードを削って
バイナリのサイズを小さくできるツールです。
それってC言語に関係あんの?コンパイラの話?エディタのマクロ?
オプティマイザを完全に切らない限り大抵の場合自動で削られると思うが?
英文が与えられて、単語の頻度をカウントするのはどうするのでしょうか? char s[] = "This is a pen. That is a pencil. He is tall.";
>>255 >>254 はソースファイルのサイズを減らしたいのかどうかを聞いたのだけど・・・
コンパイラにもよるけど普通は最適化で自動削除されると思う。
ソースファイル上から削除するのはリファクタリングツールを使えばできるかも。
>>263 単語の数を数えるのならそれで良いけど
"頻度"だから
265 :
263 :2010/01/16(土) 12:59:50
英文が与えられて、文字の頻度をカウントするのはどうするのでしょうか? char s[] = "This is a pen. That is a pencil. He is tall.";
>>265 char s[] = "This is a pen. That is a pencil. He is tall.";
char* p = s;
int count[256];
memset(count, 0, sizeof(count));
while (*p != '\0') count[*p]++;
Cにはハッシュテーブルってなかったっけ?
ポーペンでperl呼ぶのがベスト
falseってNULLみたいに必ず定義されているものじゃないの? gccでもbccでもコンパイルの時未定義扱いなるんだが
C言語にはtrueもfalseもない
Cだろ?trueもfalseもねーよ。
マクロで
#include<stdio.h> int main(void){ int x; scanf("%d",&x); if(x%2==0){ printf("%d is an even number.\n",x); } else{ printf("%d is an odd number.\n",x); } return(0); } これは何を判定してるんでしょうか??
偶奇
配列をカンマ区切りで出力するとき、以下のコードだと、 0, 1, 2, 3, と、最後にカンマがあって醜いですよね。 これを、 0, 1, 2, 3 というふうに出力するスマートな方法ってないですかね? #include <stdio.h> int main() { int i; int n[] = {0, 1, 2, 3}; for(i=0; i < sizeof n / sizeof *n; i++) printf("%d, ", n[i]); return 0; }
#include <stdio.h> int main() { int i; int n[] = {0, 1, 2, 3}; for(i=0; i < sizeof n / sizeof *n; i++) if (i) putc(','); printf("%d", n[i]); return 0; }
カンマが後ではなく前に付いていると考えればいい。
以下のコードを実行すると、 ffffff82 ffffffa0 と表示されます。 何故、頭にffffffが付くのでしょうか? 82 a0 と出力する方法はありますでしょうか? Windows XP Borland C++ 5.5.1 for Win32 ソースはShift-JISで保存 void main() { int i; char *s = "あ"; for(i=0; i<2; i++) printf("%x ", s[i]); }
>>282 unsigned char にすればおk
>>278-281 まぁスマートな方法なんて無いわな。
for(i=0; i < sizeof n / sizeof *n; i++)
printf("%s%d",i?" ,":"", n[i]);
仕事で書くなら
>>279 的な書き方するけど、
残念ながらバグってる。
>>282 符合拡張ってやつだ
マイナスの値をビット数増やしても、マイナスのままにしようとするから
>>283 ありがとうございます。
うまくいきました。
をっと、符号拡張ね
289 :
デフォルトの名無しさん :2010/01/17(日) 18:38:04
//bmi #include<stdio.h> int main(void){ double height,weight,BMI; printf("身長(m)"); scanf("%f",&height); printf("体重(kg)"); scanf("%f",&weight); BMI=weight/height/height; printf("BMIは%fです。\n",BMI); if(BMI>=25){ printf("肥満です\n"); } else if(BMI<18.5){ printf("低体重です\n"); }else{ printf("標準です\n"); } return 0; } ↑BMI数値を計算するプログラムを作っていたのですが 計算結果がうまくいきません どこが間違ってるのでしょうか?
>>289 printf("height=%f weight=%f\n", height, weight);
を追加してみる
scanf("%lf"
>>284 その3項演算子はダサい。3項演算子の魔術師と呼ばれた俺様が教授してやろう。
for(i=0; i < sizeof n / sizeof *n; i++)
printf(i ? ", %d" : "%d", n[i]);
printfの魔術師ならこうだな。 printf( "%.*s%d", !!i, ",", n[i] );
294 :
293 :2010/01/17(日) 19:55:32
つかこれで良かったか printf( ",%d"+!i, n[i] );
printf("%s%d", ","+!i, n[i]);
全然エレガントじゃないが、流れとしてはこうなんだよな i = 0; while (1) { printf("%d", n[i]); if (++i == sizeof(n)/sizeof(n[0])) break; printf(","); } ということは、 こんな感じにも出来るか? do { printf("%d", n[i]); } while (++i == sizeof(...) && printf(",")); 要素0をifで弾いたり、&&以下を評価しなきゃいけないのが美しくないが。 (後者は,演算子を使ってtrue相当にすれば条件分岐にはならないがもっと汚くなる)
IOCCC目指すの?
printf("%d", n[0]); for(i=1; i < sizeof n / sizeof *n; i++) printf(",%d", n[i]);
299 :
デフォルトの名無しさん :2010/01/18(月) 05:15:49
失礼します。 とある(任意の)通貨体系、例えば361、147、75、1円玉なんていう無茶な通貨だとして、 お釣りの値を入力したら最小の枚数で切り抜けるプログラムを考えます。 この場合例えばお釣りが150円だったら、147×1、1×3で計4枚でなく、75×2で計2枚となるのが正解です。 通貨体系もお釣りも任意に与えられるので、それぞれがどんな値であっても最小の枚数を出すプログラムなんですが、これを考えるとき、どんなアルゴリズムが考えられますか? 申し訳ないのですがお早めに答えて頂けると助かりますm(_ _)m
C言語と関係ねえじゃん
C言語はアルゴリズムを考えなければならないので関連はあると思ったんですが…
部類が違ったみたいですねすみません。
>>301 ありがとうございます。
ただ少しだけ欲しいものと違ったようです。ありがとうございました。
305 :
デフォルトの名無しさん :2010/01/18(月) 12:40:15
これからプロクラミングを学ぼうと思います。 まず最初の目的はwebブラウザを作成したいと思っています。 そこで質問なのですが、C言語ではwebブラウザを作成することはできますか? またプログラム初学者が学びながらwebブラウザを作成するのに適した言語があれば教えてください。
>>305 ブラウザをゼロから作るのは相当難しい
上級者でもかなり機能制限しない限り無理
単にIEコンポーネントを使うだけならC++でおk
ひと昔前だったらDelphiだったけど今はC#一択 C/C++なんて論外
適材適所 IEコンポーネントでブラウザ作るならC#最強伝説
HTMLメッセージを直接表示する程度のものだったら 勉強にはなるよね。
>>305 Java, C++&Qtとかなら、最初からHTMLを表示するためのコンポーネントがあったりするので便利。
大量の人と金と時間を使っても未だに文句言われるwebブラウザを作ってる会社もあるしな
312 :
デフォルトの名無しさん :2010/01/18(月) 17:47:28
for (;;) { c == '0' && break; putchar(c); } と書いたら error: expected expression before ‘break’ ってどういうこと? 他の言語でもイディオムとしてよく使われるよねこれ。 if (c == '0') break; って書かないとダメなの?マンドクセ
じゃあ他の言語でやればいいじゃない。
314 :
312 :2010/01/18(月) 18:34:04
>>312 諦めてくれ。breakは式ではなく、独立した文として使うしかない決まりなんだ。
316 :
312 :2010/01/18(月) 18:53:43
>>315 わかった。
僕も男の子ですから、潔く諦めるよ。
初心者がC++使うなんてないわ。それこそ上級者でもバグ量産なのに
バグ量産言語だからな。
assignment makes pointer from integer without a cast というエラーの意味はなに??
C言語のほうがC++よりバグ量産言語
>>319 そのまんまの意味だと思うが、何がわからない?
>>319 キャストせずに整数からポインタへ代入している
それくらいの英語は読む努力しようよ
C言語はそういうエラーでないだろ int x=100; int *p=x; こういうのもできる。 C++だと319のエラーが出てくる。
Cでもふつーウォーニングぐらい出るだろー。
326 :
デフォルトの名無しさん :2010/01/18(月) 21:45:10
警告は「ふつー」出ないんだよ
int*にintを代入はできない アドレスを示す変数に○バイト整数の代入だからな
#include <stdio.h> // buffer overflowは無視している文字列置き換え関数 void replace(char *buf, char *pre, char *aft) { char *p; p = strstr(buf, pre); if (p){ char *p_2 = p + strlen(pre); replace(p_2, pre, aft); memmove(p + strlen(aft), p_2, strlen(p_2)+1); memcpy(p, aft, strlen(aft)); } } int main(void) { char buf[1024] = "C:\\programfile\\LOG"; replace(buf, "LOG", "RESULT"); printf("%s\n", buf); return 0; } というソースを以前見たんですがバッファオーバーフローはどうすれば避けられますか?
329 :
デフォルトの名無しさん :2010/01/18(月) 22:20:41
>>328 自分でバッファオーバーフローが起こらないようにいつも注意しとけば
避けられます
330 :
デフォルトの名無しさん :2010/01/18(月) 22:31:44
331 :
299 :2010/01/18(月) 23:05:14
今さらですがすみません。別スレに移動させていただきました。
了解です
333 :
デフォルトの名無しさん :2010/01/18(月) 23:52:34
すみません while((n < 1) || (n >= MAX)) この「||」というのはどういう条件の事なんでしょうか? 早急に返答をもらえると助かります(__)
or
335 :
デフォルトの名無しさん :2010/01/19(火) 00:02:06
>>334 ありがとうございます。
おかげで解決しました。
336 :
デフォルトの名無しさん :2010/01/19(火) 01:54:25
棒人間が歩くプログラムをつくりたいのですが 頭と胴体を動かすのは簡単なのですが 足と手の動きをどうすればいいのかまったくわかりません; なにかヒントか教えてくれませんか><?
>>336 キャラクターの状態(向き、徒歩、ダッシュ、停止、生死)に応じた
肩、肘、手首、股関節、膝、足首
それぞれの座標をすべて配列に入れとけばいいんじゃないかな
肩位置固定、肘関節無し、右向き徒歩の手首の座標を考えてみると
,,◎ ◎ ◎ ◎ ◎ ◎ ◎ ◎
| \  ̄ \ | /  ̄ /
このような動きになり規則性が見えてくるね
この場合は1サイクル8コマの繰り返しなので
要素8の配列を用意すればいい
2dなら必要な情報はX,Yの座標なので
CならPoint構造体でも作って
Point migitekubi[state][frame].x
とかでアクセスすればいんじゃないかな
338 :
デフォルトの名無しさん :2010/01/19(火) 04:23:03
>>337 説明ありがとうございます
自分が未熟なためいまいちわからないです><
もう少し簡単なほうほうはないでしょうか?
lineで足を書いて、座標をずらしてやっているのですが
いまいち思っているような動きになりません・・・
もう少しヒントをいただけたらありがたいです
実際にハリガネで作ってみろよ
>>338 > もう少し簡単なほうほうはないでしょうか?
ない。
前もって画像を用意しちゃう方法があるけど
それは趣旨と異なるし、結局手法は同じなので難易度的には大差ないね。
> lineで足を書いて、座標をずらしてやっているのですが
> いまいち思っているような動きになりません・・・
それはインプットした数値に問題があるだけ。
コマ数増やしたり座標詰めるしかないよ。
軽く答えちゃっててなんだけど
言語差の問題ではなくアルゴリズムの問題なので
相応のスレで質問し直した方がいいと思うよ。
>>336 は面白いな、失業中でニートしているから今日作ってみるかw
棒人間でパラパラマンガでも描いて見れば一発な気もすんだが。
もっと深いところで悩んでるのかも 前もって用意して当てはめるならどーとでもないが 生年月日、血液型、食生活、私生活、スタミナ、季節、ボイド時間他もろもろ 腕の振りもその都度変わって来るわけだから それら全てのパラメーターを受けた上で その数式を模索してるのかもしれない
>>346-347 thx
>>344 のYahoo!知恵袋の回答には
NULL ← void* 型
0 ← int 型
'\0' ← char 型
と書いてありましたが、間違いなんですね。
間違い sizeof演算子がchar型に対してsizeof(int)を 返す処理系だから。 sizeof は処理系依存 環境依存。
sizeofでchar型に対して1を返さない処理系ってなんだよw
sizeof(char) は常に1、sizeof('c') は sizeof(int) に等しいはずで そうでない非標準コンパイラなど…まあ、使わされてる人は可哀想ではある。
349が何もわかってないのに出鱈目かいたアホってだけのことじゃね?
これ↓と char s[] = "abc"; これ↓の違いは何ですか? char *s = "abc";
>>354 どっちを使うかは好みの問題なのでしょうか?
>>355 文字列の一部の書き換えを行うかどうか
書き換える→配列
書き換えない→ポインタ
定数にはそもそも型など内 ' 'は整数定数32 sizeof ' 'が何を返すかは処理系依存 0でも 文句言えない。
>>356 なるほど、そういう使い分けをするんですね。
d
>>353 char s[] = "abc";
s += 1; <= エラー
char *s = "abc";
s += 1; <= OK
printf("%d¥n",sizeof 32L); printf("%d¥n",sizeof 32LL); どんな値になる?
定数に型はないって言った直後に、整数定数ってどういうことだw
364 :
353 :2010/01/19(火) 15:11:52
#include <stdio.h> #define ZERO 0 int main() { printf("%u\n", sizeof '\0'); printf("%u\n", sizeof ZERO); printf("%u\n", sizeof( (char)'\0')); printf("%u\n", sizeof '0' ); } %dなんて使うなよ "abc"はどれが正しいの? const char* const ccs = "abc"; const char* cs = "abc"; char* s = "abc"; で char a[] = "abc" のaは上のどのポンタにアサインできるの?
ローカルで宣言したchar a[] = "abc"は アセンブリ出してみるとわかるが、 char a[4] = {'a', 'b', 'c', '\0'}; もしくは char a[4]; strcpy(a, "abc"); 相当のことが行われている
図示するとこんな感じですか? 全部コピー ┌──────┐ ↓ .│ char s[] │ アドレス.┌─┐ アドレス┌┴┐ 200 │ a.│←─ 100.│ a.│ ├─┤ ├─┤ 201 │ b.│←─ 101.│ b.│ ├─┤ ├─┤ 202 │ c.│←─ 102,│ c.│ ├─┤ ├─┤ 203 │ 0.│←─ 103.│ 0.│ └─┘ └─┘ 先頭アドレス値のみコピーされる char *s アドレス.┌──┐ .アドレス┌─┐ 200 │ 100.│←─ 100│ a.│ └──┘ .^^^├─┤ 101│ b.│ ├─┤ 102│ c.│ ├─┤ 103│ 0.│ └─┘
そんな感じ
s[]="abc";の場合にはコピー元があるわけじゃないだろ
実装依存でしょ
>>369 魔法じゃないんだから、あるに決まってるだろ
4バイト程度なら、即値命令で代入してるかも知れんし そこらへんはコンパイラ次第。
>>366 上と下では大違いだよね。
a[0]を書き換えられるか(上)、書き換え禁止か(下)。
374 :
デフォルトの名無しさん :2010/01/19(火) 20:47:11
char *s は「禁止」してねえじゃんw
鼻から鼻毛が出るんだっけ
>>375 出るかもしれんな。未定義の動作だから。
"abc"は定数だからメモリではプログラム領域に置かれる。関数の置き場所と一緒。 ならばコピー元は"ある"ことになる。
おっといけね 俺未定義の動作してたわ
本当に未定義なんですか? char *s = "abc"; に対して、さらに *(s + 0) = 'x'; *(s + 1) = 'y'; *(s + 2) = 'z'; とすればアウトなんですが。 未定義、未定義と知らない言葉をふりまわしているのでは?
馬鹿か釣りか知らんがお前は消えろ
>char *s = "abc"; C勉強し始めたばかりでよくわからないんですけど これって先にメモリを確保しないといけないような気がするのですが、どうなんでしょうか
確保しないといけないなんて事はありません
>>381 実行してみてください。
#include <stdio.h>
int main()
{
char *s = "abc";
printf("%s\n", s);
return 0;
}
うるせえ馬鹿
>>385 じゃあ、これも。
#include <stdio.h>
int main()
{
char *s = "abc";
printf("%s\n", s);
*s = 'x';
printf("%s\n", s);
return 0;
}
abc sex
oops
これでxだけにできた #include <stdio.h> int main() { char *s = "abc"; printf("%s\n", s); s = "x"; printf("%s\n", s); return 0; }
つまりどういうこと
*s = 'x'; ┌─┐ ┌─┐ │ x.│←│ a.│ ├─┤ ├─┤ │ b.│ │ b.│ ├─┤ ├─┤ │ c.│ │ c.│ ├─┤ ├─┤ │ 0.│ │ 0.│ └─┘ └─┘ s = "x"; ┌─┐ ┌─┐ │ x.│←│ a.│ ├─┤ ├─┤ │ 0.│←│ b.│ ├─┤ ├─┤ │ c.│ │ c.│ ├─┤ ├─┤ │ 0.│ │ 0.│ └─┘ └─┘
394 :
393 :2010/01/20(水) 08:01:15
スマソ s="x"は別アドレスだから間違ってるね orz
char *s = "abc"; *s = 'x'; が許されない実装って具体的には何なんですか?
>>395 #include <stdio.h>
int main()
{
char s[] = "abc";
printf("%s\n", s);
s = "x";
printf("%s\n", s);
return 0;
}
>>381 リテラルはプログラム開始時に読み取り専用メモリに配置されるので動的なメモリ確保は必要ありません。
int i = 10 + 20;
「10」も「20」もメモリ確保してませんよね?
これと同じことです。
それからリテラルの値を変更したときの動作は未定義ですが、読み取り専用メモリなのでアクセス違反を起こすと思います。
> リテラルはプログラム開始時に読み取り専用メモリに配置される 嘘です。信用してはいけません。
int *x=100; これはなぜ通らないんですか?
401 :
デフォルトの名無しさん :2010/01/20(水) 11:16:50
K&Rが買ってきたのですが難しくて読めません。 K&Rを売って他の本を買おうと思うのですがお勧めはありますか?
int *x=(const int*)&100; と出来ない理由は?
405 :
401 :2010/01/20(水) 11:55:26
>>404 ありがとうございます。
リンクしてくださった解説サイトを参考に勉強することにします。
入門書のほうはCの絵本がよさそうですね。
406 :
R :2010/01/20(水) 13:46:05
はじめまして今年の4月から情報系の大学に行くので大学に入る前に独自でC言語を勉強しようと思って最低限はいろいろなサイトで勉強しました。 そこでモンテカルロ法で円周率を求めるプログラムを作ろうと思ってプログラムを書いた時点で選択した乱数の数で円周率を出すことは出来たのですが これを相手方のユーザーもしくはコンソール上にうってもらった数値から円周率を出すように変更したいのですが以下のプログラムのXXXを 相手方のユーザーもしくはコンソール上にうってもらった数値をいれるように変更したいのですがどのように変更すればいいでしょうか? a_max…乱数の発生回数 n…円の中に入った乱数の数 pa…円周率 プログラムは↓
407 :
R :2010/01/20(水) 13:47:48
#include <stdio.h> #include <stdlib.h> int main(void) { double a,a_max,n; double x,y,pa; n=0.0; a_max=XXXXX.0; // 乱数の発生回数 for(a=0;a<=a_max;a++) { /*0〜1の乱数を生成*/ x=rand()/(RAND_MAX+1.0); y=rand()/(RAND_MAX+1.0); /*0<=x,y<=1の範囲にある中心原点半径1の 円の中に乱数による点が入ったらカウントする*/ if((x*x+y*y)<1.0) { n+=1.0; } } pa=n/a_max*4.0; //半径1の円の面積すなわち円周率 printf("%f\n",pa); return 0; }
なんで高校生がモンテカルロ法なんて言葉平気で使うんだ?
>>406 scanf("%f", &a_max); // 乱数の発生回数を入力させる
>>408 プログラミングやってたらリア中でも知ってておかしくない
scanf では double は %lf
412 :
409 :2010/01/20(水) 14:58:59
ゴメン、うっかりした。 scanf("%lf", &a_max);
知っていることと正しく使えることとは違うだろ
変な絡み方w
乱×法
>>402 >否定するなら詳細を頼む。
未定義だつってんだろが阿呆。
因みに、Microsoft は VC++ 6.0 までは .data セグメント、
それ以降は .rdata セグメントに置かれる。
で、多くのコンパイラではオプションで指定できる。
なんで char *a="hogehoge"; はaを文字列定数へのポインタとして解釈してくれるのに int *x=12345; は整数定数12345へのポインタとして解釈してくれないの? 趣味の問題?
xに12345が入ってるなら正しいのでは?
比較する相手がおかしい int *x=12345; と対応するのは char *a='A'; じゃないのか "hogehoge"に対応する整数配列定数のようなものはC99にしかない
int *x=(int*)12345; ね。ただし int *x= (const int*)&12345; は通らないね。 同様に char *s=(const char*)&'A'; もNG. リテラルだけは特別で暗黙的に char *s=(const char*)&("const char"[0]); と解釈される。これは慣習であるとしかいいようが ない。因習というほどのものでもないとオモ
C99を導入して char *a = (char[]){ 'h', 'o', 'g', 'e', 'h', 'o', 'g', 'e', '\0' }; int *x = (int[]){ 12345 }; と書けばいいYO! "hogehoge" は (char[]){ 'h', 'o', 'g', 'e', 'h', 'o', 'g', 'e', '\0' } の略記法だと思えばいいんダ!
文字列リテラルの特別扱いは、文字列型がないcにおける僅かばかりの文字列サポート。
>>420 リテラルとは、ソース上の定数のこと。
int *x=(int*)12345;の「12345」やchar *s=(const char*)&'A';の「'A'」もリテラル。
文字列リテラルは定数ではない 文字列リテラルは静的記憶期間の配列として保持される
main() { extrn putchar, n, v; auto i, c, col, a; i = col = 0; while(i<n) v[i++] = 1; while(col<2*n) { a = n+1 ; c = i = 0; while (i<n) { c =+ v[i] *10; v[i++] = c%a; c =/ a--; } putchar(c+'0'); if(!(++col%5)) putchar(col%50?' ': '*n'); } putchar('*n*n'); } v[2000]; n 2000; 解説をお願いします
>>423 char arr[] = "abc";
が
mov dword ptr arr, 00636261H
とコンパイルされたとしても
規格上何の問題ないわけだが。
で c=arr[2] mov ebx,00636261h mov al, byte ptr [ebx+2] とやったところでセグメンテーションエラーとw
>>425 char配列初期化のための簡易記法である""形式の書き方も
文字列リテラルって言うんだっけ?
少なくとも、
例えばprintfに渡す時に直接書く場合のフォーマット文字列なんかは
文字列リテラルと言い切れると思うけど。
(もちろんprintfにはリテラル以外も渡せる)
>>395 MS-DOS はOKだった。
cygwin-gcc ではだめだった。
で、普通に文字列リテラル "abc" を考えると どこかに4byteの領域が確保されていると言い切れるはず。 だけど static char x[3] = "abc"; の場合は、3byte分しか確保されていないわけだ。 (staticだから、auto変数と違ってコピーは起こらない)
>>429 static をもちだしてくるとは、今の文脈ではちょっと微妙。
>>405 K&R は売っぱらわないで積読することをおすすめします。
このスレ95%くらいがごみレスで構成されているよね
Cの絵本の到達点低すぎだぞ
>>428 MSCとBCCはOKだった(MS-DOSってこれのことかな?)。
gcc系はダメなんか。
>>431 staticだと文字列リテラルとは呼ばないけど、autoだと文字列リテラルと呼ぶ、って?
ていうか、配列の初期化に使うものであっても ""で囲まれた文字は「文字列リテラル」と呼ぶのか。 だとすると、「必ず確保される云々」は厳密には正確じゃないのかもね。 ちなみに、sizeof等に使った「実際にはどこからも指されてない文字列リテラル」の領域を 確保してしまうコンパイラもある。 規格でどうなっているかは知らない。 例えば memcpy(dst, src, sizeof("abcde")); なんていうコードがあると、使われていない"abcde\0"の領域が用意されたり。
>>402 処理系依存。全てのメモリが書き込み可能な環境など腐るほどある。
例: DOS
>>426 お前の脳内コンパイラは酷いバグを抱えてるな。
>>427 >文字列リテラルって言うんだっけ?
言うけど?
441 :
デフォルトの名無しさん :2010/01/20(水) 21:44:17
>>420 > char *s=(const char*)&("const char"[0]);
不要な括弧に、型が変化しないキャスト・・・死ぬの?
型は変化してるぞ C++に毒されすぎ
演算子の優先順位など変化する可能性があるんで 括弧を付けないのは..... 死ぬの?
括弧がどうしてもカッコワルクて性に合わんと思うのなら マクロでも使え
C++の次の規格では演算子の優先順位の変更が可能になるかもな
これだからC++厨は
>>448 おい、俺もC++厨だけど、十把一絡げに否定するなよ。
>>449 C言語とC++は「別の言語」です。
スレタイ読んだらさっさと巣にお戻りください。
括弧省略はプログラマの職業上の知恵という奴ではなく、 既に犯罪の一種と認定されてるし...
よくあるイディオム以外は括弧つけて欲しいな
>>450 知ってるよ。
だからといって、・・・まあめんどくせえからいっか。
多くの引数値からあるフォーマットのファイルを出力するプログラムを組んでいるのですが、 入力値が8個から10個ぐらいになります。 main 関数の argv で全部渡すようなコマンドを作ったのですが、多くの引数を渡すもっとスマートな方法 ないでしょうか?
456 :
デフォルトの名無しさん :2010/01/21(木) 00:02:58
ファイルの入出力を習ったのですが出力に困っています 例えば 1 1.000000 1.000000 1.000000 2 1.000000 1.000000 1.000000 という内容のtxtファイルがあり、 それぞれの数字を変数に入れて出力したいのですが、 while(fscanf(fpi,"%d %lf %lf %lf", &i, heikin2, saikou2, saitei2) != EOF){ printf("%d %f %f %f\n", i, a, b, c); } とすると 1 0.000000 0.000000 1.#QNAN0 2 0.000000 0.000000 1.#QNAN0 と出ます、どうしてでしょうか? a,b,cは配列の変数です
457 :
デフォルトの名無しさん :2010/01/21(木) 00:04:17
while(fscanf(fpi,"%d %lf %lf %lf", &i, a, b, c) != EOF){ の書き間違いです
458 :
sage :2010/01/21(木) 00:09:25
&
460 :
デフォルトの名無しさん :2010/01/21(木) 00:11:53
&入れてもできないんですよ ってか教科書も&無いんですよね それも分かりません
>>454 環境変数
コマンドラインの欠点は、引数順序がデリケート
hogehoge=parameter
とか構文っぽいパラメータを渡す方法もあるが
コーディングは面倒な割に無益で疲労する。
環境変数ならまぁ一種のperlの連想配列みたいに
扱えるんで引数が多い場合は格段にラク。
シェルスクリプトとか組みあせてやってみそ
>>460 a b cは配列ならa[0]のようにオフセットを指定しないと。
さらにfscanf()に渡すなら&が必要。つまり&a[0]のようにする。
463 :
デフォルトの名無しさん :2010/01/21(木) 01:00:32
>>462 ありがとうございます、できました
教科書は誤植ですかね
本来分数で計算するもの(シンプレックス法)を無理やりfloat型で計算しているのですが 出力で-0.0000と出るのですがこれはどういった意味でしょうか?
計算機が出す数字は信用出来ない という意味 それは半分本当として、数字を奇麗にそろえて 出力する場合絶対値が小さい負の数、例えば-0.00000000000001 とかは前半の部分しか出さないってことはするだろ?
ありがとうございます 問題がわかりました
シンプレックス法の場合最初はfloatで、最適値に近い 制約条件が絞られてからは有理数でやらなければならない 場合もあるかも知れないがまぁ基本的にはfloatじゃね?
for文内でstringの配列作るじゃん? そのstringからfloatの値を取るじゃん? floatの値が小さい順から並び変えるじゃん? そのfloatに対応したstringの変数を順に選択していくのってどうするんじゃん?
じゃんじゃん構造体作ると破滅するじゃん
470 :
デフォルトの名無しさん :2010/01/21(木) 04:39:09
C言語で構造体を返り値として返す関数を作っているのですが、 その関数内で何か処理を失敗したときは、NULLを返したいと思っています。 しかし、return NULL;とすると、関数の定義と違う型の返り値だと怒られてしまいます。 どうすればいいのでしょうか?イメージとしては下のような感じのものを作っています。 typedef struct mypoint{ int x, y; } POINT; POINT getPoint(int i, int j) { POINT p; if(i<0 || j<0) return NULL; else { p.x = i; p.j = j; } return p; } if( pt = getPoint(i, j) ){ printf("ポイントは〜〜\n"); }else{ printf("不正値\n"); } ほんとはポイントとかじゃないですけど、やりたい事はこんな感じです。
>>468 stringが使えるならvector使っちゃえばいいじゃん
>>470 >構造体を返り値として返す
値返しなんだから
>return NULL;とすると
ポインタで返そうとするとエラーなのは当然であって、
ここは
1. ポインタで返す。 ← 関数内でmallocする。呼び出し元がfreeし忘れると悲惨。
2. 呼び出し元で戻り先の構造体を用意し、そのポインタを引数で渡す。
3. 「内容が正しいかどうか」を示すフラグを構造体内に用意する。
のどれか。
>>472 ありがとうございます。2の方法で無事解決しました。
あと、スレッド局所変数というか、修飾子の__delspec(thread)のlinuxバージョンってないでしょうか?
474 :
デフォルトの名無しさん :2010/01/21(木) 07:01:18
__threadあたりが臭いんですけど、コンパイルが通らないです・・・
エラーメッセージによる。これじょうしキ
宣言は __thread static char *buf; エラーメッセージは '__thread' before 'static' です。 あともう一つ質問があるのですが・・・。 linuxでpthread_createで作ったスレッドを呼び出した親から殺したいんです。 仕様上、作ったスレッドで長い時間Sleepを使ってるのですが、それでちょっと色々不便してまして。。 親から自由なタイミングで子スレッドを殺すにはどうすればいいのでしょうか? 子スレッドの方ではmallocとか自分でメモリ確保してないのでいつ殺しても問題ない状態です。
477 :
401 :2010/01/21(木) 07:59:03
物騒な流れになったきたな
すみません、pthread_cancelというのを見つけたのでこっちは解決しました。 30分くらい探してたのに、質問した瞬間見つかってしまった・・・。 __threadはまだよく分からないので、どなたかわかる方お願いしますm(_ _)m
環境書くのを忘れてました、たびたび申し訳ないです。 MaxOSX 10.5.8と、Xcode3.1.4で、C言語です。
引数で以下のように配列の大きさを指定したものを見るのですが、 void func(int arr[3]) 以下との違いはあるのでしょうか? void func(int arr[]) void func(int *arr)
みたことないし、書いたこともないな
つかthreadという概念が出来た背景を知ってほしいような...
>>476 The __thread specifier may be used alone, with the extern or static specifiers, but with no other storage class specifier. When used with extern or static, __thread must appear immediately after the other storage class specifier.
>>480 一緒
ただし人間が見たときに、ここは長さ3の配列を渡すんだな、と信じ込ませる効果があります
>>484 信じ込ませる、っていうのがタチ悪いなw
487 :
デフォルトの名無しさん :2010/01/21(木) 10:51:39
最近勉強を始めて現在は配列、自作関数の作り方程度まで理解していると思います。 入門書を読んでもポインタがいまいちわかりずらいので今の自分にあった課題を何か出してください。 なるべくポインタを理解する手助けになるようにお願いします。
文字列操作のstrcpyとかを自作してみるとか
malloc, free, 構造体。作って指して使って消す。
最初から余り深く考えず、失敗を恐れず時間をかけて 慣れ親しんでいくことが大切。英語の勉強と一緒。
>>483 ありがとうございます。
static __thread char *buf;
のように書き直しました。ただ、サポートされていないとエラーが出るのですが・・・
環境のせいですかね??みんなは普通に出来るんですか?
thread-local storage not supported for this target
pthread_getspecific/pthread_setspecificなら使えるんじゃない
while文が抜け出すときに、未入力で改行だけ押すとループ終了にしたいんですが、条件式にはどう書けばいいですか?
while(!未入力で改行だけ)
入力の読み取り方はどうしてるんだよ
while(?){ fgets(a[i],sizeof(add),stdin); i++; } こんな感じです。
fgets(add[i],sizeof(add),stdin);でした
>>497 if(a[0]=='\n')break;
とか
if(strlen(a)==1)break;
char ptr ="ABC"; char array[]; int len = 0; while ( isprint( ptr ) ) { array[len++] = ptr - 'A' ptr++; } これってarrayには何をいれてる? arrayにはいってるものを使いたいんだが、どうやってコピーすれば?
ありもしないものをコピーしようとしてもな
>>500 doubleの前にstaticを入れる
>>500 標準偏差の計算式合ってるの?
sqrt(((各人の点数-平均)^2)の合計, 2.0)
じゃなくて?
505 :
デフォルトの名無しさん :2010/01/22(金) 00:15:23
>>501 気持ちはわかってやれるが
悲しいほど適性のないコードだな
初心者ゆえの技量の低さとは異質な
不真面目さが箸にも棒にもかからない
>>503 変化無しでした…
>>504 おかしいですか?
猫でもわかるプログラミングを参考に組んだのですが…
直してみますー
C言語って文字列の結合ってできない? char a[]= "abc"; char b[]= "def"; char *c; cにabcdefっていれるみたいな
できますよ
strcat(strcpy(c, a), b)
>>500 1 total_xxxが初期化されていない。
2 標準偏差の求め方が間違っている。
プログラムが出来る人と出来ない人の違いってなに? 大学でC言語やってるんだけど周りとの差に落胆するんだが
>>512 「興味」と、「センス」かな。。。
うん。
アニメに興味が無い人にアニメを覚えさせたり 車に(ry のようなもので ふつうの人はC言語なんてどうでもいいんだよ
515 :
デフォルトの名無しさん :2010/01/22(金) 00:42:57
>>512 C といっても、所詮は機械
車やカメラが得意な者と苦手な者は残酷なほど分かれる
メタルの僕をいかにこき使うかにあたっての
サディズムが明暗を分ける
思い通りに動かせた時に喜べるかどうか?かな。
517 :
500 :2010/01/22(金) 00:48:36
>>510-511 数値ぴったりですね!
標準偏差以外の部分にも手を入れて頂いたようで、大変見やすくなりました
本当に助かりました ありがとうございました
518 :
age :2010/01/22(金) 01:04:52
Harrisオペレータの実行についての質問です。
http://www.img.tutkie.tut.ac.jp/programs/index.html このページの
6.特徴点が集中しないように改良した Harris オペレータ (Improved Harris 同梱)
のファイルをダウンロードしてtest-CHarrisを実行したのですが
コマンド入力の仕方がわかりません
ターミナルでmakeを実行して
./test-CHarris 5 1 0.04 0.0001 200 8 none stderr input.ppm
と入力したのですがエラーがでます
お願いします。
519 :
512 :2010/01/22(金) 01:04:52
一応興味もって大学に入ったんだけどね… もうちょっと頑張ってみます
char ptr1[10]; char ptr2[10]; ptr1 ="ABC"; strcat(ptr2,ptr1); なんでできない?
>>519 がんばる必要は無い
今の時点で差がついてるのなら、なにをやっても無駄
センスはどうやっても埋められないんだよ
むしろ、中途半端なウデでプログラム関係の会社に入ってもらっても、クソ以下の価値しかありません
>>520 出来る事もあるよ。
char ptr1[10];
char ptr2[10];
int i;
for(i=0;i<10;i++)printf("%02X ",ptr2[i]);
とかして確認してみよう。
523 :
デフォルトの名無しさん :2010/01/22(金) 01:32:44
>>519 この業界で一番の金持ちが言ってたが、
勝てそうにないとき、そのルールで戦わないで、ルールを変えてしまえってね
あんたに得意なところで勝負すれば良く、「同じ土俵に立つ」ことはない
没個性するとお決まりのベルトコンベアで処理施設に逝かされるだけだ
そりゃもったいない! この業界はまだ戦国時代で下克上してなんぼやねん
俺はいま追われる立場でつらいが、敵ながらあっぱれな若いの見てるとうれしくなる
>>520 C言語では文字列は特殊です。初期化はできても代入はできません。
switchで||って使える? case 1 || 2:みたいな感じで
>>525 ダメ。
case 1:
case 2:
と複数書く。
case 1: case 2:
一行に並べても良い
C言語って文字列を扱いにくいウンコ言語なのかぁ
文字列に限らず動的にサイズが変わるものはたいがい苦手 苦手っていうか糞面倒 熟練PGでも気を抜くとすぐバッファオーバーフローやらかすしな
wchar_t *test[]={L"test1",L"test2",L"test3",L"test4",L"test5"}; wchar_t test[][5]={L"test1",L"test2",L"test3",L"test4",L"test5"}; 前者はメモリが確保されていないポインタに代入しているように見えるのですが 後者のように自動的に確保されているということで良いのでしょうか
L"test1" のような文字列リテラルのためのメモリは、自動的に確保されています 後者は wchar_t test[][6]={略}; だよな? [][5] だと L'\0' が付かないよ (それで問題ない用途もあるだろうけれど)
533 :
531 :2010/01/22(金) 11:55:26
>>532 なるほど、どうも有り難う御座います
後者の添え字を間違えました。すみません
expected declaration or statement at end of input このコンパイルエラーの意味が分かりません main文での最後のreturn 0;の後の}の行にエラーが出たんですけど
今日、ステップ数という言葉を久しぶりに聞いた。
>>528 文法上では合法じゃね? やりたい意図と動作が異なるけど。
case 1 || 2: は
定数論理式 1|| 2 の結果が 1 になるから case 1: と記述したのと同じ動作なだけ
バカは黙ってていいから
caseは単なるラベル
540 :
無能 :2010/01/22(金) 19:12:50
k-means法をC言語でやれる方教えてください。 問題文は、 ・方法 1、初期値として、クラスタ数および初期のデータ分割を与える。 2、データ分割に基づき各分割の重心を求める。 さらに、重心と各事例データとの距離を求める 3、各事例を最も近いクラスタに割り当てる。 4、上記の割り当てが前回と同じであれば終了。 更新があれば2に戻る どなたかできる方教えてください
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | つぎでボケて! | |_________| ∧∧ || ( ゚д゚) || / づΦ
>>540 ここで具体的な質問すると宿題スレ池って言われるのがオチ
具体的な質問というよりこの場合 「問題文は、」 とか書いてあるからだな 宿題スレ池
544 :
デフォルトの名無しさん :2010/01/22(金) 20:04:49
http://codepad.org/OL5uG9np このコードで
gatu2>gatuの時にniti>niti2となる値を打つと実行画面が途中で止まってしまいます
2011年何月何日のデータを入力しますか?
月>>>>
>>3 日>>>>
>>31 2011年3月31日から何月何日までのデータを入力しますか?(2011年12月31日まで)
月>>>>
>>4 日>>>>
>>1 (ここから進まない)
なぜでしょうか?
>>544 なんつーか、まず構造を整理したほうがいいよ。
月による日数の種類は29日、30日、31日の3通りしかないんだから、条件分岐は3通りにできるはず。
>>545 途中で送信しちまったw
だから、月を入力させたらその中でswitch文で3分岐にするといい。
switch (gatu) {
case 2:
//29日
break;
case 4:
case 6:
case 9:
case 11:
//30日
break;
default:
//31日
break;
}
548 :
デフォルトの名無しさん :2010/01/22(金) 20:29:49
今年の2月は何日までだよ
#if 0 }while( (((niti2<=niti)||(niti2>31))&& ((gatu2==1)||(gatu2==3)||(gatu2==5)||(gatu2==7)||(gatu2==8)||(gatu2==10)||(gatu2==12)))|| (((niti2<=niti)||(niti2>30))&& ((gatu2==4)||(gatu2==6)||(gatu2==9)||(gatu2==11)))|| (((niti2<=niti)||(niti2>28))&& (gatu2==2))); #else }while( (((gatu2<=gatu)||(niti2>31))&& ((gatu2==1)||(gatu2==3)||(gatu2==5)||(gatu2==7)||(gatu2==8)||(gatu2==10)||(gatu2==12)))|| (((gatu2<=gatu)||(niti2>30))&& ((gatu2==4)||(gatu2==6)||(gatu2==9)||(gatu2==11)))|| (((gatu2<=gatu)||(niti2>28))&& (gatu2==2))); #endif
ねぇねぇ #if 0 A #else B #endif のAはどんな場合に有効なの? 何が0の時?
条件が0つまり偽なんだから常にelse部分が有効になる 主にデバッグしてる時に手早く0とか1に書き変えてコードを切り替えるのに使われる
>>552 どもども、そうなんですか
なんか低脳っぽいやりかた
しねよ
こういうやつはきっとコメントアウト使ってバグに悩む
> が大なりなら < が小なりで、 そんな感じのプログラムです。 よろしくお願いします。
fprintf(fpo,"%d %d %f %f %f\n",a, b, heikin[j], saikou[j], saitei[j]); このようにファイルに書き込めるようにしたら、ファイルの中身が 1 2 -92559631349317831000000000000000000000000000000000000000000000.000000 -92559631349317831000000000000000000000000000000000000000000000.000000 -92559631349317831000000000000000000000000000000000000000000000.000000 となってしまいました・・・何が起きているんでしょうか?
>>557 fprintf で出力されたのではないでしょうか?
あと、エッフェル塔のプログラムもお願いします。
560 :
557 :2010/01/23(土) 00:33:45
>>558 ありがとうがごいます
どうすれば入力した値どおりになりますかね?
>>560 a, b, heikin[j], saikou[j], saitei[j]
これらの型や値、OS、コンパイラ、バージョンなどは秘密なの?
562 :
557 :2010/01/23(土) 01:12:17
a,b,jがint型で後ろのはdouble型です OSはVISTAでvisual c++ 2008 express edition使ってます プログラムは for(b=niti;b<=niti2;b++) { printf("%d月%d日の気温データの入力\n",a,b); printf("平均気温は>>>"); scanf("%lf",&heikin[j]); printf("最高気温は>>>"); scanf("%lf",&saikou[j]); printf("最低気温は>>>"); scanf("%lf",&saitei[j]); j++; fprintf(fpo,"%d %d %f %f %f\n",a, b, heikin[j], saikou[j], saitei[j]); } です
563 :
デフォルトの名無しさん :2010/01/23(土) 01:42:10
voidポインタの使いどころがわかりません。 どんな型にでもキャストして使えるので便利そうですが、 例えば関数の引数にすると、意図しない型を入れても コンパイルエラーにならないので危険な気がしています。 関数の引数にvoidポインタを指定するのは例えばどういう 場面なのでしょうか? どういう型の引数がくるかわからないとき? わからなかったらそもそもどうキャストして 使えばいいのかもわからない気がするのですが??
>>562 > j++;
> fprintf(fpo,"%d %d %f %f %f\n",a, b, heikin[j], saikou[j], saitei[j]);
ここの行は上下逆では?
565 :
557 :2010/01/23(土) 01:53:25
>>564 そのとおりでした
ありがとうございました
>>563 例えば
コールバック関数の引数で使えば
好きな形でデータを渡せるようになる
567 :
デフォルトの名無しさん :2010/01/23(土) 02:19:15
>>566 すみません、イマイチわかりません。
好きな形で渡しても結局渡された側はキャストするのですよね?
だったらそもそもvoid*ではなくそのキャストする型を引数にすれば
よいと思うのですが?
569 :
デフォルトの名無しさん :2010/01/23(土) 02:36:21
>>568 いや、ある型でキャストするなら型ごとに関数用意するのと同じかと・・・
どういう型でキャストするのかの情報を別の引数で用意するってことかな。
それじゃわかってる人にしかわからねーよw
>>569 APIを作る人と関数を作る人は違う
標準ライブラリ関数qsortは
ソートする際の大小関係を
int func(void* void*)の比較関数を作って与えないといけない
基本型ならまだしも、構造体だったどうする気だ
>>567 qsort() を調べてみてください。
574 :
デフォルトの名無しさん :2010/01/23(土) 06:41:28
>>563 memcpyの引数もvoid*だよ
どんな型の変数にも使えるでしょ?
576 :
デフォルトの名無しさん :2010/01/23(土) 09:33:12
じゃあもう全部 void* でいいじゃん。 char * とかいらねーよな。
printf の %s は char* 型を期待しているから いちいちキャストしないとwarning出て面倒だよ。。
free()ってヒープにとった領域を解放するとおもうんですけど その領域って誰が管理してるんですか? 解放するにはポインタとバイト数が必要だと思うんですが free()にはポインタしか渡さないので心配です。
malloc/freeを含むメモリマネージャが管理している。 mallocで返る、freeに渡す領域の少し前の部分に色んなデータがしこまれていて そこにサイズなんかも記述されてる。
>>579 なるほどありがとうございます。
その辺、もう少し詳しく知りたいのですが
解説してるサイトとかないでしょうか?
私が見たサイトはただ解放されるとしか書いてなく
実際のところがよくわかりませんでした。
581 :
sage :2010/01/23(土) 10:14:31
「Cプログラマのためのアルゴリズムとデータ構造」にメモリ管理の話があったような希ガス。 char[SIZE] の領域を自分で管理して、malloc/free もどきを実装したような。
>>581 自分で管理するとするとmallocで確保した領域のポインタとサイズを
スタックに配列かなんかで持っておいてfreeされたときにスタックの配列
からポインタをキーに検索してサイズをゲットして解放する感じでしょうか。
Cコンパイラがこのような処理を自動で実行ファイルに埋め込んでくれている
ということなのでしょうか。
それならなんとなく納得できます。
583 :
sage :2010/01/23(土) 10:26:37
なんつーか、割り当てるブロックの先頭にヘッダを付けたような希ガス。 ヘッダには、ブロックが使用中であることを示すフラグとか、 次のブロックへのポインタとかあったような希ガス。 俺も初心者なので詳しいことは教えられないが 興味があったら本買ってみて読んでごらんよ。楽しいよ。
>>583 なるほど。もっと効率のいいやり方なんですね。
まぁ。それはそうだわなー。
>>584 おぉ。なんかわかりやすそうです。サンクス。
じっくり読みます。
>>584 ほとんどの実装がこうなっているならばあの忌まわしいmalloc/free論争に
ピリオドが打てるんだけどな
587 :
デフォルトの名無しさん :2010/01/23(土) 11:27:24
数値計算の自作プログラムの実行スピードが遅くて困ってるんだけど簡単に早くする方法って無い? ちなみに並列化はすでに完了。 変数の名前短くするとかは無駄かな? 何でもいいのでアイデアくれ。
utf8の文字列に対してstrstrとか、strchrって有効でしょうか?
ソースさらさないと曖昧論しか出てこないぞ プロファイルとってアセンブラリスト見てチューニング、SIMD、GPGPU、クラスタリング、マシンのリプレース
590 :
デフォルトの名無しさん :2010/01/23(土) 11:35:39
曖昧論で良いから教えて欲しいのよ。
>>587 > 変数の名前短くするとか
Cで、こんなこと言ってるあたりからすると、君には無理。
なにそのBASICw
>>587 巨大な行列の掛け算なら先に転置行列を作ってから計算すれば倍速くらいにはなる
ifの条件式を 1< i <10 1 <j <10 にしたいのですが if(i>=1 || j>=1 || i<=10 || j<=10) 上ではだめでした どうすればうまくできますか?
1< i <10と1 <j <10の関係は ORとANDのどっち?
if(i>1 && i<10 &&(または||) j>1 && j<10)
どういたしまして
情報系の大学生って4年間で何コマ分くらいプログラムの勉強するのですか?
2コマ
マジレスすると意味不明な講義ばっかりでプログラミングは専門学校以下 実装より理論重視
すみません、ありがとうございます。
理論も大事だぞ むろんプログラムを組めなきゃどうにもならないが、 そんなのはPCさえあれば自分でできることだし、 講義聞いたからって身に付くもんでもないからな
いや、理論こそが最も大事。 米国ではコンピュータサイエンス(情報科学)を学ぶ。だから合理的な構造やアルゴリズムが生まれる。
Information Scienceはコンピュータサイエンスと同義じゃないぞ 日本の大学でもやるけどね、人間行動学とか、そういう糞退屈なのを含む 工学部では特に、どうすれば効率よく金儲け出来るか。端的にいえばそんな話だね
スレタイを読む日本語力が求められる
613 :
デフォルトの名無しさん :2010/01/23(土) 23:06:35
>>612 お前には「流れ」を読むチカラが求められる
ある任意の自然数が奇数か偶数かの判断をするのには もっとも高速となる手段としてはどのようなものが考えられますか やはりビットを用いたほうがよろしいのでしょうか
速度が知りたければ実測する以外に無い
>>615 だれも速度が知りたいなんて話はしていないが馬鹿なの?
もしかして馬鹿なの?
O(1)だからどうでもいい
>>616 どんなアルゴリズムでやろうと結果は実測でしか知り得ないって話じゃないの?
仮説を立て実証するのが物理学
高速となる手段なのに速度はどうでもいいという・・・
2の補数表現でさえあれば最下位ビットを見ればいいが アーキテクチャによっては専用のフラグを持っているかも知れず 結局実測に勝るものなし。
>>620 高速化する方法と速度を知りたいって全然違う質問だよね?
どの程度高速化できたかは実測するしかないが、
高速化する方法が実測するしかないなんて馬鹿としか思えん。
流れ理解しろよ。
if (number & 1) { printf("奇数"); } else { printf("偶数"); }
ほんとお前らの盛り上げ力には脱帽だぜ
multimapの最も登録されている数が多いキーを知るいい方法があればご教授ください!!
ここはC言語か、スレを間違えました。取り下げです。
int is_odd(int n) {
return n - ((n
>>1 ) << 1);
}
>>614 には「そうだ。」
選挙に行こう
せーんきょーせんきょーあかるいせんきょー♪
631 :
デフォルトの名無しさん :2010/01/24(日) 13:11:22
//tasizan #include<stdio.h> int tasizan(int x,int y); int main(void){ int a,b,add; scanf("%d%d",&a,&b); add=tasizan(a,b); printf("0add=%d\n",add);; return } int tasizan(int x,int y){ int answer answer=x+y; return answer; } 関数を作るのが良くわかりません 出来ればわかりやすく教えてください
//tasizan #include<stdio.h> int tasizan(int, int); int main(){ int a, b; scanf("%d%d",&a, &b); printf("add = %d\n", tasizan(a, b)); return 0; } int tasizan(int x, int y){ return x + y; } どこが分からんの?
633 :
デフォルトの名無しさん :2010/01/24(日) 13:40:36
int tasizan(int x,int y); と add=tasizan(a,b); と printf("add = %d\n", tasizan(a, b); と int tasizan(int x,int y){ int answer answer=x+y; return answer; の組み合わせがなぜそうなるのか分からないです
634 :
デフォルトの名無しさん :2010/01/24(日) 13:49:18
意味が分からないのは俺だけか。
引数と戻り値って言葉の意味分かる? それとも、tasizan(a, b)とtasizan(x, y)で なんでaとbからxとyになっとんねんって疑問?
637 :
デフォルトの名無しさん :2010/01/24(日) 14:02:32
戻り値は知らないです
「やさしいC」「猫でもわかる」とかそこら辺の入門書を読むことを勧める
猫でも分かるは俺にはわからない
「猫でもわかる」ならば「人間にもわかる」が成り立つかどうかはさておき、実際には、猫に読ませても猫は理解できない。 さらには、猫が理解できたかどうかを僕たちが知る手段すらない。
ネタにマジレス
ニャー
冗談はさておき、 関数とポインタでつまずくと、今後習うことが一切理解できなくなるから 本気で勉強しろよ
ネコはああ見えて賢い動物だからな もっと下等な動物にあわせた入門書が必要なのかもしれない
戻り値知らんならもう関数の型はvoidにして参照渡しでいいじゃん
>>644 ポインタはともかく
関数で躓くとか、
優秀な小学生に負けるレベルだろ
小学生馬鹿にすんな
え?小学生じゃないの?
関数ポインタはポインタの一部 関数で躓くのはどうかなあ・・・
>>633 int tasizan(int, int); // 関数の宣言
int main(){
int a, b;
scanf("%d%d",&a, &b);
printf("add = %d\n", tasizan(a, b)); // ※1
return 0;
}
int tasizan(int x, int y){ // 関数の定義
return x + y;
}
※1で関数を呼ぶためには、その関数がどんなものなのか、
コンパイラが分かってなきゃいけない。
けど、それが出てくるのはmainの後。
それでは間に合わないので、先にコンパイラに教えてるのが上の宣言。
もし、
int tasizan(int x, int y){ // 関数の定義
return x + y;
}
int main(){
int a, b;
scanf("%d%d",&a, &b);
printf("add = %d\n", tasizan(a, b)); // ※1
return 0;
}
という順番であったのなら、
int tasizan(int, int); // 関数の宣言
は書かなくていい。ひとまず必要は無い。
ただ、流儀として使う関数全部を、いつも先に宣言しておく、という人々は居る。
中高の数学でy=x^2とf(x)=x^2の違いが分からないまま卒業した人
関数ポインタって実際に使ったことがないんだけど どういった便利さとかがあるのかよくわからないれす(^q^)
関数の宣言はヘッダファイルに書こうね(はあと)
普通に勉強してて最初にさわるのはqsort()あたりじゃないかなあ
>>654 大丈夫、数学系に行かない限りつかわないから。
強いて言うなら
y=x^2
は
double y = x^2;
で、
f(x)=x^2
は
double f(double x){return x^2;}
ってことかな?
>>655 ライブラリなんかのイベント処理を行うための
コールバック関数を記述するための
インタフェースとして使われることがよくある
660 :
デフォルトの名無しさん :2010/01/24(日) 15:10:38
どうでもいいけど、「関数」に反応して毎回、数学の定義上の「関数」出すのやめて。
>>660 でも同じ名前なんだからしょうがないじゃん。だろ?
テールスープ
>>655 関数ポインタはウインドウズならウインドウプロシージャ
void func(int *x) { char buffer[20]; fgets(buffer, 20, stdin); *x = atoi(buffer); } int main(void) { int num; func(&num); fprintf(stdout, "%d\n", num); return 0; }
667 :
デフォルトの名無しさん :2010/01/24(日) 22:45:53
>>655 おまえさんが使ってるテキスト、相当に問題ありそうだな
有用性を示すサンプルが見あたらないってことだろ
# もう1つ考えられる事態については言及を避ける
まあ、そう言わずに最後まで書いちゃいなヨ!
俺がエスパーすると つまり テキストすら使ってない! ってことだろ!
これぞホントの独習ってやつか
char型の変数の初期値を「あ」にして プログラムでその変数に「い」を追加して 「あい」にするにはどうすればいいですか? イメージとしては、 char a='あ' a=a+'い'; aの中身 a='あい'
char型は1バイト。 日本語とかは2バイト。 だからchar型では不可能。 配列にするか、ポインタでやるか。 char a[5]="あ"; strcat(a, "い");
UTF-8だと5じゃ足りない
UTF-8だと平仮名は3バイト
>>655 クイックソートではないソート法で 標準の qsort と同じ引数をとるようなソート関数を実装するとき
>>678 んー、それほど高度という気はしませんが。
Windows API をやれば、いやというほどでてきます。まあ慣れでしょうけど。
わかる人にはわかるけど、 わからない人にはおまじないみたいな処理に見えるのかもしれない
C言語の入門書で #includeやscanfの&をおまじないと書く入門書はゴミ。
なるほど。やっぱりそうなのか
>>681 そういう入門書って、文字列操作の部分が糞だな
代案を示せ。 ポインタを理解するまで、ry
気に入らないならK&Rでもよんどきゃいいよ
彼らは古き悪しきMSのように、デイファクトスタンダードづくりに余念がない
まあ最初からプリプロセッサだのアドレス演算子だの言われても意味不明だろ。
689 :
デフォルトの名無しさん :2010/01/25(月) 23:04:45
うん、最初の最初で「Hello Work」をprintするときに #include の説明してたら躓くだろうな。 いや「『こんにちは、世界』ってどういう意味だろう」ということにすら 疑問を持つ初心者もいるかもしれない(悪いことではないが...)
ハローワーク
>>689 世界初の原潜が処女航海で打電したメッセージだとか。
最初は関数の説明からすればいいのに
いやまずは「こんぴゅーたーのしくみ」からだろ。わりとマジで。
temp_buf[TEMP_BUF_SIZE], temp_buf2[TEMP_BUF_SIZE]は'\0'で初期化されてます。 文字列がtem_bufに格納され、その中から"search"を探索し、文字列が見つかれば そのsearchのs以降の文字をtemp_buf2にコピーしようとしています。 が、実行すると暴走してしまいます。 *pの使い方がおかしいような気もするんですが、 原因が分かりません。 環境はgccですが手元にpcが無いので詳細は分かりません。 もし必要でしたら調べてきます。ごめんなさい。 char com[] = "search"; char *p = strstr(temp_buf,com); if( *p != NULL ){ if( sizeof(temp_buf2) - &(temp_buf[TEMP_BUF_SIZE-1])-&(*p)+1 < 0){ fprintf( stderr, " buffer overflow 1\n" ); exit(-1); } strcat( temp_buf2, p ); printf("%s",temp_buf2); } よろしくお願い致します。
まずそれから #include "HelloWorld.c" が最初のプログラムで良くね?
手元にPCが無ければくよくよ悩まないほうがいい コンパイラの気まぐれな警告を潰していけば コンパイラと意思疎通が出来ていないだけだという ことがわかる。(要するに*pは1文字を表すので p==NULLと*p==NULLは意味が違うというだけ なんだが )
697 :
デフォルトの名無しさん :2010/01/26(火) 00:29:11
すいません ageます
>temp_buf[TEMP_BUF_SIZE], temp_buf2[TEMP_BUF_SIZE]は'\0'で初期化されてます。 で >文字列がtem_bufに格納され なのに >char *p = strstr(temp_buf,com); >if( *p != NULL ){ だからじゃないかな? 文字列を入れたtem_bufでなく'\0'で初期化したtemp_bufを見ちゃってる
>>696 かなりデバッグに苦しんでて悩まずにはいられないんです・・・
>>696 ,698
直します。
ありがとうございます。
>>699 そのスレで、
>スレチですね
>失礼します
って書いてるように自分としてはこちらに移動してきたつもりなんですが・・・
分かり難くてすみません。
>>700 確認してみます。ありがとうございます。
下記コードでprintfに渡す情報は、%dだけで引数の型情報を与えていないのに、異なるバイト数の 引数をきちんと処理できているのは何故でしょうか? #include <stdio.h> int main() { char a = 1; short b = 2; int c = 3; printf("%d %d %d", a, b ,c); /*=> 1, 2, 3 */ }
>>705 int printf(const char *format,...);
の定義に立ち返れ。
a,b,cをコンパイラはどう解釈してどのように渡しているか?
707 :
デフォルトの名無しさん :2010/01/26(火) 12:37:02
関数の定義によく出てくる「...」はどういう意味ですか?
可変引数 暗黙の格上げを行って引数を詰む char, short → int へ float → double へ 可変引数を持つ関数は 上記の格上げを考慮して、詰まれた値を抜き出し適宜操作 sizeof(int) != sizeof(void*) な環境で ポインタとして NULL をきっちり渡す場合 0 とは渡さずに (void*)0 と明示的にキャストすることもある # 0 と渡すと int で詰まれるから
実引数拡張
改行だけをしたいときは、どれがいいのですか? printf("\n"); putchar('\n'); puts("");
その場限りの非公開匿名共用体配列に突っ込んでその共用体の アドレスだけを渡してから呼ぶことのほうが多いだろ 値型が増えそうなので、暗黙のキャストは色々と問題が多いと いうことで、最近はしないようになってきている。 (ポインタ<->int 程度のことしかしない)
お前だけ
>>712 警告が出ない暗黙のキャストは安全だから、不必要なキャストはしないほうがいい。
> ポインタ<->int
これは、危険だから、暗黙のキャストはしない。
>>711 好きなように。
俺ならprintf、ただprintfは通常大きなコードを吐き出しから条件によっては谷逃げる。
コンパイラに警告を出させない為だけという意味では 警告が出ないキャストの記述は省略したほうが良い。 コード記述量とバグ潜入率は相関があるから。 ポインタとintの相互変換をキャスト無しで行っている コードをノーチェックで通してしまうようなコンパイラは 使わない方がよい
>>712 昔出てきたが execl() は 可変の終端を示すのに ヌルポを要求してる。
そこで安易に 0 とやっても コンパイラは警告のしようが無いので(可変部の型は確定しようがない) 危ないよ
って例
あ NULL がどう定義されているか自信が無い場合ね。
NULLがコンパイラ付属のライブラリレベルでユニークじゃ ないような処理系ってある?
くりかえしになるけど sizeof(int) != sizeof(void*) char a[1]; int* p = NULL; a[0] = NULL; /* 個人的に、この記述は嫌 */ 両方整合できる NULL 定義できてるかな? -------------------------- #define NULL (0) #define NULL ((void*)0)
>>719 ある。8086。0ですらない場合がある。
>>720 char c = '\0'; // ヌル文字、ナル文字
>>722 うん 俺はそう記述するか char c = 0; ってリテラルの 0 渡しちゃってる。
リテラルレベルでの暗黙のキャストと、コンパイラが作り出す(だろう)変数シンボルテーブル上のTYPE項目の一時的書き換え処理 のキャストは似ていてかなり違います。後者は明示的に指示しない と処理を単純化する為のオプティマイザの力から、おかしな コードを出す場合があります。特にコードの高速性を誇るコンパイラ の場合はその傾向が大です。リテラルレベルのキャストは省略可能 です。厳密にはこれはキャストとは言わないからです。
>>705 いわゆる promotion (暗黙の型変換)により、関数の引数は int に符号拡張されるからです。
例にあげたコードは、どれも int に格上げされて printf()に渡ります。
int とサイズの違う long では %ld としなければならないことになります。
>>717 そうそう、だから昔は (char *)0 としていました。
今でも (char *)0 としてください。
構造体のアライメント関係です。 ぐぐってみたのですが、いまいち理解できません。 struct { long l; short s; char c; }ST1; struct { short s; long l; char c; }ST2; ST1のshort、charは偶数バイトに丸められたのかな〜くらいで納得(?)したのですが ST2がサッパリ! なぜcharが4バイト扱いになってるの? OSはWindowsでコンパイラはVC。設定項目のアライメントサイズは8。 sizeof(short)は2 sizeof(long)は4になる環境です。
729 :
728 :2010/01/26(火) 18:33:04
肝心な事が抜けていた。 sizeof出みると、ST1は8になって、ST2は12になります。 この違いを理解したいのです。
>なぜcharが4バイト扱いになってるの? 「構造体全体のバイト数」が4の倍数でないと 配列にしたときにlongのアライメントがずれるから。
>>728 配列を作ったときに、longのメンバが必ず4バイト境界に配置されるようにするためです
ST1では、longが4バイト、shortが2バイト、charが1バイトで、素直に合計すると7バイトですが、
配列として使う場合、各要素が7バイトですと、次の要素の先頭のlongが4バイト境界に配置されませんので、
空白を1バイト入れて全体を8バイトにします
ST2では、shortが2バイトでその次にlongがありますが、素直に並べるとlongが4バイト境界に配置されませんので
2バイト空けて4バイト境界に配置されるようにします
short2バイト、空白2バイト、long4バイト、char1バイトで合計9バイトですが、ST1の場合と同様、
配列として使う場合にlongが4バイト境界に配置されるように、3バイトの空白を入れて12バイトにします
>>728 幅が四センチしかない短冊に、
上から順に詰めてシール張っていくような動作。
次のがはみ出るときは下に張り、
次のものがはみ出なければ続けて貼る。
printf("long %d\n", sizeof (long));
printf("short %d\n", sizeof (short));
printf("char %d\n", sizeof (char));
printf("%2d lsc %p %p %p\n", sizeof ST1, &ST1.l, &ST1.s, &ST1.c);
printf("%2d slc %p %p %p\n", sizeof ST2, &ST2.s, &ST2.l, &ST2.c);
long 4
short 2
char 1
8 lsc 0x403030 0x403034 0x403036
12 slc 0x403020 0x403024 0x403028
#pragma pack(4) ならそうなんだろうけど
#pragma pack(8) で
>>732 の詰めかたなんだよね
ヘルプの pack([n]) の説明がややこしー
pack(8)でも8バイトアラインメントを要求するメンバ(doubleとか)がなければ一緒では
カラーの画像からの相関係数を求めようとしてるのですが、RGBの指定をどうすればいいのかお願いします グレイスケール(PGM)での相関係数は出せました
doubleで0から1mでの乱数を作るにはどうすればいいですか?
738 :
737 :2010/01/27(水) 00:22:01
すみません0から1までです。
0〜10まで乱数作って1/10じゃダメなの?
741 :
デフォルトの名無しさん :2010/01/27(水) 12:42:45
関数のsscanf,fscanfの先頭についてるsとfって何の略か教えてください 調べてもわかりませんでした
sscanfは第一引数char *strから入力をもらうって事だからs fscanfは第一引数FILE *streamから入力をもらうって事だからf 後者はfgetsとかでいろいろ使われてるな
743 :
741 :2010/01/27(水) 12:51:25
sがstringでfがfileっぽいですね・・・ 無駄な書き込みすみませんでした
char name[3][10]={"Aさん","Bさん","Cさん"}; のような名前リストを作る時 これを関数で参照渡ししたい場合は void func(char *name[]); という形ではダメなのでしょうか?違う場合どこが悪いのか または(char *name) 書き直していただけるとありがたいです。 また上記の関数内で、名前リストの、例えば Bさん を表示したい場合は 仮引数を利用して、どうやってBさんの要素を示せばよいのでしょうか? わかりにくい説明で申し訳ありませんが、どなたかよろしければ指導お願いします。
>>737 ((double)rand() / ((double)RAND_MAX + 1))
execv(2) を使いたいのですが、 execv(char *path, char **argv) の第二引数を malloc() で作ってしまうと、execv() を実行したまま、戻ってこないため、free() できません。 こういうときは、malloc() しっぱなしですましてしまうものでしょうか?
>>744 void func(char (*name)[10])
とか?
>>744 以下のいずれか
void func(char (*name)[10])
void func(char name[][10])
void func(char name[3][10])
Bさんを表示したければ
printf("%s", name[1]);
もし void func(char *name[]) という形の関数に渡したいのなら
char *name[3]={"Aさん","Bさん","Cさん"};
とすればよい
#include <stdio.h> void func1(char name[3][10],int n){ int i; for(i=0;i<n;i++)printf("%s\n",name[i]); } void func2(char (*name)[10],int n){ int i; for(i=0;i<n;i++)printf("%s\n",*(name++)); } void func3(char name[][10]){ int i=0; while(name[i][0])printf("%s\n",name[i++]); } void func4(char (*name)[10]){ while(*name[0])printf("%s\n",*(name++)); } int main(){ char name1[3][10]={"Aさん","Bさん","Cさん"}; char name2[4][10]={"Aさん","Bさん","Cさん",NULL}; func1(name1,3); func2(name1,3); func3(name2); func4(name2); return 0; } 他にもあればよろしくです。
>>746 細かいことは気にすんな。
少なくとも Windows, Linux, MacOS ではfreeしなくても問題は起きない。
751 :
デフォルトの名無しさん :2010/01/27(水) 19:01:06
> for(i=0;i<n;i++)printf("%s\n",*(name++)); ばかにもわかるしーげんご?
752 :
デフォルトの名無しさん :2010/01/27(水) 19:06:11
>>746 その場合はfreeする必要はないとおも。
forkした親プロセスは注意した方がいいけど。
malloc -> fork -> exec の順なら、親プロセスはfreeしなくちゃならないけど、 fork -> malloc -> exec なら、気にしなくても良い。 vfork -> malloc -> exec だとめんどくさいけど、 今どきは vfork じゃなくて fork を使うべきだよね?
char *name[] = {"Aさん","Bさん","Cさん"}; とすれば、関数側は void func(char **name) {} でもよい。
>>754 関数側から要素数を調べる方法あります?
757 :
744 :2010/01/27(水) 20:05:49
返答してくださった方ありがとうございます。 提示された方法色々試してみます。
759 :
746 :2010/01/27(水) 20:23:19
BOOL Huruhon( char*name ) { if( !name )return FALSE; if( !open( name ) )return FALSE; if( !read(1) )return FALSE; if( !read(2) )return FALSE; close(); return TRUE; } 上記のような場合open()の失敗まではreturn FALSE;でいいですが、 read()で失敗した場合close()してreturnしなければいけません。 ですが、いちいちif( !read() ){close();return FALSE;} と、書くのは面倒ですよね。 かといってgoto使うのも、多段でif使うのもイマイチ。そこで下記のような書き方はどうなんでしょうか? while( 1 ){ if( !name )return FALSE; if( !open( name ) )return FALSE; if( !read(1) )break; if( !read(2) )break; close(); return TRUE; } close(); return FALSE;
>>760 その場合は do{ 〜 }while(0); を使う
素直にフラグかgoto使えよ
>>761 do - whileは全く使わないので忘れてました。
return入れ忘れてクルクル回る事がないし
そっちの方が良いですね。
>>762 フラグは値を保持するときなどの理由があるときならいいですけど必要なかったもので。
gotoはなるべく使わない方向ですね。
thx
C言語で連想配列ってどうやるの? 不可変でおk
文字列の配列のうち、インデックスとして指定された文字列が何番目にあるか検索。 真面目に実装するとツリーなりハッシュなりで高速化しないといけないが。
そんなもんねーよ。
if (!open(name)) return FALSE; if (!read(1) || !read(2)) close();return FALSE; close(); return TRUE; ループ使わんでも↑だけでいいんじゃないの? open()の仕様がわからんけど、name自体の判定せんでもopen()の成否で十分と勝手に想像。
なんで goto ダメなんだろ? フリーソフトウェアのソースとか読んでいると、例外処理で goto fail みたいなのをよく見るけどなぁ。 で、dだ先でclose()とかfree()してたり。
769 :
デフォルトの名無しさん :2010/01/27(水) 22:25:38
初心者な質問で申し訳ないですが、 「独習C」で勉強してるのですが練習問題9.6の2について、 巻末の解答のプログラムはちゃんと動きますか?
771 :
760 :2010/01/27(水) 22:37:22
>>767 >>760 は改行多すぎるって怒られたんでシンプルに書きました。
結果をまとめるのもいいですね。
まとめることができない事の方が多いですけど。
>>768 ダメではないと思う。
でも、do - while見やすくて良い気がします。
成功はdoの中でreturn、失敗はbreak。
Cでgotoだめという考えはもう古いよ。
773 :
769 :2010/01/27(水) 22:46:33
>>770 そこは見たのですがまだうまく動かなくて
コンパイルの時にエラーは出ないのですが、
目的の機能が備わってないと思うんです。
解答のコードで「if(ch==val)」の部分がダメなのかなと思ってますが、
独習C(第4版)を持っていて、誰か詳しい方はいませんか。
>>768 gotoダメよってのは初心者向けの方便
でも、それを方便と見抜けない人たちに絡まれるのも面倒だから
使わないほうが吉。
わけのわからない拘りが多すぎるよ BOOL ret = FALSE; if(name && open(name)) { if(read(1) && read(2)) ret = TRUE; close(); } return ret;
776 :
760 :2010/01/27(水) 23:11:27
>>775 いろいろ考えてくれてありがとう。
でも求めてた答えにシンプルで一番近いのが
>>761 なんだよね。
自分の中でdo - while( 0 )が流行りそうだ・・。
do { } while(0); は神が与えた構文。
>>776 ちょ!
落ち着け!
詳しくは流れを追ってないので知らないが、
お前のセンスはなにかがおかしい。
人様には見られないところに書くソースならともかく
そうでないならやめとこうぜ。
>>776 > while( 1 ){
> if( !name )return FALSE;
> if( !open( name ) )return FALSE;
> if( !read(1) )break;
> if( !read(2) )break;
> close();
> return TRUE;
> }
> close();
> return FALSE;
ワロタw
781 :
760 :2010/01/27(水) 23:28:44
>>778 なにかまずい?
breakだらけになること以外にw
>>781 do {} while (0); を嫌う人は一定数いる。
「ループするわけでもないのに do/while を使うな」だっけか<理由
構造体って言うとクラスも知らない田舎者に思われますか?
784 :
760 :2010/01/28(木) 00:01:30
>>782 理由がそれのみなら使っても全然オッケーな気が。
何か問題があるなら使わないけど。
do{ // while( 0 )
ってコメント書いておこうか。
漏れが昔、喜多見の国○学校のすぐ隣に住んでたから。 夕方、下校時間になるとJK達のガヤガヤ声がよく聞こえ、 あとからあとから湧きあがるほどのJK大群を目にしてた。 反対方向に道歩いてると肩がぶつかるほど (それじゃ鰯だよ) でも、今はどうか知らないが、 制服がイマイチ可愛くなかった気がする。 和泉多摩川は、 多摩川まで遊びに行った帰り(行きは歩いて帰りは疲れて小田急) にしか利用したことないので女高見たことないし・・ (休日しか利用した事ないからか・・)
786 :
760 :2010/01/28(木) 00:14:52
do{}while(0)なんてマクロ中では使うけど コード中に嬉しがって使うようなもんでもないだろ。
この手の文法の穴をついたテクニックは業務では 嫌われる。同様に蛇蝎のように嫌われるのはマクロ。 コード保全を重視する業務現場ではコーディング 規約でdo while(0)や定数以外のマクロの使用や定義 が禁止が明文化されているところも多いね。
emacsが switch () { case x: { } } だと、ちゃんとインデントしてくれないのだ。 do { } while(); だと、インデントしてくれるのだ。 emacsの設定に時間をかけたくないから、これでいいのだ。
case XXX:の後に{}を付けることがアブノーマル で多分Cでは出来ない。C++なら可能。 caseはラベルに過ぎず(但しgotoで何故か飛べない) switch内のコードは同一インデントレベルでシーケンス を為している。
文を書けるところにブロックを書く事は文法上正しい。 変数のスコープを限定するために使用する。
にも関わらずCでは禁止されているので このスレ的には、変数のスコープを細かく 制御する目的で{ } を乱立することを許す 文法は邪道であるという立場になるか...
mallocでええやん main(){ int sexsex; { int sex; } } こんなんなら #define length(x) sizeof(x) main(){ int* sex, sexsex; sex=malloc(length(sex)); free(sex); } の方が読みやすい
sexよりmankoの方がやる気が出る
>>792 switch の中のブロック文は禁止されてた?
gcc しか使ってないから知らないんだが、
どのコンパイラだとダメとか分かれば教えて欲しい
796 :
デフォルトの名無しさん :2010/01/28(木) 07:45:33
ものすごく初歩的なことなんですが、疑問に思ったので質問させてください C言語でint *p;と宣言したあとpに何も代入せずに scanf("%d", p);などとしてpを使っていいのでしょうか? それともint a;と宣言してp = &a;としてからではないといけないのでしょうか?
>>792 いや、禁止されていない。 {} は好きなところで使える。
>>796 pの指した場所がどうなっているか考えたら答えは出る。
>>796 だめだお
初期化してないpはどこを指してるか不定だから
do - while (0) は、ループの中で例外が発生したり、switch で例外条件を判定する場合には使えないんだよな。 if をあとで switch に変えたいときに困る。
>>797 使えるとしても意味はない。使えるとして...
if( contditional ) {{{{{
........
}}}}}
と書くのは趣味の問題ということになる。
>>802 つまり、規約で禁止されていないのに
>>792 > にも関わらずCでは禁止されているので
といってたわけ?
Cでは禁止されていないし、そのような書き方を普通にするのに、Emacsのマクロがうまくインデントしてくれないってことだろ。
switch(xxxx){ case CASE1:{ } case CASE2:{ } } という書き方はしないだろ 見た目と挙動の間にズレが出るから。
初心者なら質問の体裁を整えてからレスしてください。
>>805 俺は特にズレないんだが、見た目でどうなると思い、どう挙動したかを教えてくれないか
PASCAL(Dlephi)だと例えば var i:integer; case i of 1:begin ..... end; 2:begin .... end; else begin ... end; end; ラベルから後ろのbegin ... endが{ }に対応だが 一つのbegin ... end;が実行されたら他は実行されないことが 保証される点でCとは異なる。 Cの{ }は配列初期化子などに用いられるケースもあるけど大体において 排他的実行される処理を意味してて、switch文のように 必ずしも排他的とは言えない処理に使用するのは何だかな〜って感じ
0か1を出力する乱数を作るにはどうすればいいですか?
またか
rand()%2
ありがとう
こうしなさいって宿題スレで教わった rand() / (RAND_MAX / 2 + 1)
>>805 の書き方、case内に宣言した変数でコンパイルエラーになるのを避けるために俺はちょくちょくやってるな
#include <stdio.h> int main(void){ int i=1; { int i=i+1; printf("%d¥n",i); } return 0; } 今日試験で出た問題です。 この出力結果を教えて下さい。 携帯で打ち込みました。 PCを持っていません。
そんな問題出るわけないだろ。未定義。
良質な乱数が欲しかったら素直にMT使った方がいい
>>818 うちで実行したら 2281481 だったよ
824 :
819 :2010/01/28(木) 18:21:46
>>818 ごめん、そういうことか。
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
でコンパイルして実行させたら、
1628447137
になった。
C++は兎も角 Cでは構文にぶら下がってない{ }はまだしも その中で変数が宣言できるという甘言には うかつに乗らないほうがいいような気がしてきた
>>818 bcc32で実行したら2だった
printf("%d\n",i);
printf("%d\n",i);
と2行続けると
2147348481
2147348481
になった
>>826 いやいや、好きな場所で { } を使っても大丈夫。昔からそうです。
>>818 は定義と初期化を一緒にするから危ういのであって、昔の C の流儀に従えば間違いありません。
>>818 が問題なのは初期化されていない変数の値を使ってることでしょ。
#include <stdio.h>
int main(void){
int i=i+1;
printf("%d\n",i);
return 0;
}
問題の質はこれと一緒。
>>829 少しでもまともなコンパイラならコンパイルエラーまたは
重大な警告を出すだろ。そのコードは。
>>818 のコードの場合、状況からして意味的には外側のブロックの
iを指しているとしか解釈しようがないがどうしても
内側のi自身であるとしたい向きもあるようだ。
> 少しでもまともなコンパイラならコンパイルエラーまたは > 重大な警告を出すだろ。そのコードは。 そうなんw 見てみたいね。 gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) でオプション無しでコンパイルした限りは、 それはそれは静かなものだった。
コンパイラの実装のバグだろといいたくなるような挙動だな 正しく動くかエラーではじくかどっちかにしろよ
gccのオプション無しはわりと静か -Wall -Wextra -pedantic を付けよう -Werror も付ければ警告もエラー扱いになって実行ファイルが生成されなくなる
GCCは良心的で非常に優れているがオプソという制約から レアな細かい部分の対応には自然に限界があるだろ。 (対応するとコード量が爆発して誰も手がつけられなくなる)
>>833 gcc -Wall -Wextra -pedantic -Werror 59-829.c
でもやっぱり何のエラーも、警告も無しのまま。
>>835 いま info gcc を読んだところによれば、-O も付けないと警告してくれないらしい
>>836 情報サンクス! 出ました!
$ gcc -O -Wall -Wextra -pedantic -Werror 59-829.c
59-829.c: In function `main':
59-829.c:3: warning: 'i' might be used uninitialized in this function
838 :
818 :2010/01/28(木) 19:46:41
みなさまありがとうございました 結論は殆どのコンパイラでまともに対応していない ということですね。了解しました。
ちげーよ。 文法上は正しいので、エラーにならずコンパイル出来る事には問題ない。 動作は未定義。
int i = i + 1; を int i; i = i + 1; と昔風に書けばおかしいことはすぐわかると思うんですけれどもね。 規格ではどうなっているのでしょうかね。
>>820 rand() % 2
がうまくいかない理由を教えて
変数宣言:変数型 変数名 初期化子;
初期化子:=その時点で「見える」同一型の変数、定数で構成される式
あとは略
文法上正しくエラーとはしてはならないのが
>>818 のコード
結果も2出力でなければおかしい。
そもそも
main(){
int i=i+1;
...
がコンパイルが通ることがおかしい。
>>843 >その時点で「見える」
の意味合いにかかっているといえますね。
規格ではどうなっているのでしょうかね。
おかしい? だが俺はgccを信じるねw
>>840 H&Sを読み解くに……宣言子が終わった時点で、その識別子が有効になる
その後、初期化子が続くが、
初期化子の中でたった今宣言した宣言子を使うことは許される
つまり
int i =i+1;
^
この時点で内側のブロックの変数 i が有効になり、
外側の i はシャドウされて見えなくなる
その後の初期化子の i は内側の i だから、不定値に1を足した値が i となる
×初期化子の中でたった今宣言した宣言子を使うことは許される ○初期化子の中でたった今宣言した識別子を使うことは許される
確認したいが、
>>846 > その後の初期化子の i は内側の i だから、不定値に1を足した値が i となる
このケースでは、
不定の値ではあるが、
それを利用して演算をしてしまったがために
未定義の動作だよね?
>>842 ありがと。
質のいい乱数が欲しい場合は、rand() % 2 は回避したほうがいいんだね。
質のいい乱数とはどんな乱数なのか?は理解できなかったけどw
>>850 rand() % 0の場合は010101の規則的なパターンしかでないとか聞いたことが…。
規則的な乱数は、質の悪い乱数の一例かと。
おっとrand() % 2ね。
rand()%N派だが一度も困ったことはない はい論破完了
>>849 >> その後の初期化子の i は内側の i
かどうかにかかっており、これが、規格にどう書かれているのでしょうかね。私も gcc のインプリメントが正しそうな気が。
>>853 あなたのお使いの rand() が運良く優れているものだったか、それとも rand() % N の質の悪さに気がつかなかったかのどちらか。
C FAQ の権威をご存知ないのでしょうか?
>>855 自分の使ってるコンパイラで rand()%2 の出力を調べてみた?
>初期化子の中でたった今宣言した識別子を使うことは許される これってそもそもバグじゃね?W
858 :
855 :2010/01/28(木) 21:20:21
>>856 シミュレーションの際、rand() % N, あるいは rand() そのものの性質が悪く、別の擬似乱数器をインプリメントしたことがあります。
859 :
846 :2010/01/28(木) 21:24:00
>>849 あ〜そうだったかも
正直よく覚えてなかった。不適切な記述で申し訳ない
>>857 初期化子には式を書くことが出来る。
iは宣言済みなので式に使用する事が出来る。問題ない。
int i = sizeof(i);
(i)
sizeofは不当に優先順位が高いので、常に()を使う事にしているのだ。
>>860 によると
int *omnk=(int*)&omnk[123456];
これも正しくコンパイル出来るみたい
auto な変数に初期化子を置くこと自体、ちょっと抵抗を感じてしまうのは、単に私が古いせい?
>>864 うむ。
昔の時代のプログラミングだとか一人プロジェクトだとかならさておき、
そうでないなら基本的に「現代の方針」に従わないって
訳にはいくまい。
あれだ、歯の磨き方と同じ。
>>864 うん。
最近は初期化抜けを防止するために、初期化必須にする場合もある。
「デバッグビルドで動くけど、リリースビルドだと動かない。コン
パイラがおかしい」などという戯言を低減させる効果がある
int input[3]={0}; input[3]=1,1,1}; とはできないんですか?
出来ない。
>>869 ありがとうございます
input[3]={0};
を
input [3]={1,1,1};
にしたいときはどうすればできますか?
int input[3] = {1,1,1}; ↑これは出来る。 int input[3] = {0}; input[3] = {1,1,1}; ↑これは出来ない。
int input[3]={0}; int _input[3]={1,1,1}; input=_input; これはおk?
なぜ試さない
なぜ試す
流れ予想。 なぜ試さない→手元に環境がありません→codepad で試せ
>>875 codepad ってどこですか→ggrks
> 9899:1999 6.2.1p7 > (前略) Any other identifier has scope that begins just after > the completion of its declarator. って書いてあって構文上 declarator と initializer が別れてるんで(T declarator = initializer の形)、 initializer の中でその直前の名前が見える、で良さそう。
>>872 試すまでもなく無理。
memcpy(input, _input, sizeof input);
しとけ。
そういや C99 だと
memcpy(input, (int[]){1, 1, 1}, sizeof input);
とかできるんだっけ?
あのね、 ネットで送られてくるビッグエンディアンのunsigned long(32bit) データ(データ名big_ulong)が 構造体のメンバのunsigned short(16bit)配列、unsigned short ulong_data[2]に 格納されているんです どう、格納されているかと言うと memcpy( kouzotai.ulong_data, &big_ulong, 4); てな感じ kouzotai.ulong_dataを、処理CPUのエンディアンのunsigned long(32bit)に変換するコードって どう書くの? 戻り値はリトルCPUならリトル、ビッグCPUならビッグのunsigned long unsigned long UlongHenkan( unsigned short ulong_data[2] ) { ????? return xxxxx; }
数値計算のプログラム組んでるんだけど マルチスレッド対応させるにはどうすれば? CygwinでGCCなんだけど商用のコンパイラ買わないといけないの?
>>879 (unsigned long)ntohl(ulong_data[0] << 16 | ulong_data[1])
>>880 とりあえずOpenMPでも使えばいいと思うよ。
>>881 ntohlがない見たいなの
ntohlやntohsの実装ソースコードください、できればhtons,htonlも
お願いします、ペコリ
二次元配列の動的確保の話なんだが 連続性を保ったままa[i][j]の構文でアクセスできるような方法はない?
連続性を保ったまま ってのは (大きさを NxM として) &a[i][M] == &a[i+1][0] これだけじゃなくて (void *)a == (void *)&a[0][0] これも必要両方なの?
そうです
fortran使え
fortranの配列はクールですよね
>>884 二次元配列じゃなくて、マクロを使うのではダメなの?
>>889 に載ってる配列へのポインタじゃだめなの?
処理Aが正常終了しないと処理Bを処理してはいけないという場合に if(処理A == 成功) { if(処理B == 成功) { 正常処理; } else { エラー処理; } } else { エラー処理; } 上のコードのエラー処理が同じなのでひとつにまとめたいんですが、どうすればいいでしょうか?
&&
goto
setjmp, longjmp
エラー処理を関数にする
>>892 処理A、処理Bが成功時に0を返す‥という前提なら
int ret;
ret = 処理A;
if(ret == 0)
{
ret = 処理B;
}
if(ret == 0)
{
正常処理;
}
else
{
エラー処理;
}
とか?
俺としてはっちゅー話だけど。 安易にフラグ使うプログラミングは、オススメ出来ないなぁ・・・
if(処理A == 成功 && 処理B == 成功) { 正常処理; } else { エラー処理; }
&&かgotoだな それか関数にして sub(){ if(処理A!=成功){ エラー処理; return 〜; } if(処理B!=成功){ エラー処理; return 〜; } return 〜; } とか。 大差ないから具体例が欲しいね
if(A() && B()) これはA()が偽の場合B()の評価がスキップされることは保障されてるんですか? 保障されてるならそれでいいんですが・・・
されてるよ つーか気になるなら規格票読めよ
本当に?最適化を許してるだけじゃなくて?
ショートサーキットくらい、どんなウンコな入門書でも解説されてるだろ。
>>898 フラグよりgoto使った方がいいのでしょうか
>>908 大差ないからつまらん事にこだわらない方がいいよ。
大事なのは一貫性を持たせること。
行数を文字列リテラルに展開するマクロってないのかな 数値リテラルより文字列のほうが使いやすいよねこれ
911 :
908 :2010/01/30(土) 01:56:41
>>910 boostのBOOST_PP_STRINGIZEあたりを使えば可能。
まぁC++のライブラリだしとりあえず本質部分だけ示すとこんな感じ
#define STRINGIZE_(s) #s
#define STRINGIZE(s) STRINGIZE_(s)
puts( STRINGIZE(__LINE__));
つらつら考えてみたけど
>>892 のフローてあり得ないんじゃないか
yB()は一体何を始末してるんだ?
if(A()){xA();if(B())xB();else yB();yA();}else yB();
>913 別に普通にあるんじゃね。 Aが実行できてないし、Bは実行されていないから AもBも実行できなかった場合の始末でしょ。
いいけど、goto使うに比べてわかりにくい。
>884 mallocが確保する領域は、連続していることは保証されている。 ↓でやりたいことじゃないの? int (*p)[N] = malloc(int [M][N]); C FAQでは下のように書いて、「恐怖感を与える」なんて書いている。 だけど本質は前述と同じ。 int (*array4)[NCOLUMNS] = (int (*)[NCOLUMNS])malloc(nrows * sizeof(*array4)); プロトタイプ宣言を見ればわかるが、malloc自体は型なんて全く気にしていない。 単に引数で与えられたサイズの領域を確保して返してくれるだけ。 その領域にどういうやりかたでアクセスするかは、呼び出し側で決める必要がある。
>913 >915 gotoの方が読みやすいのは自分もそう思う。 だけど仕事でやってると、goto禁止されているから そういう書き方になっちゃう。 もうgoto見たとたんに、「書き直せ」なんだよな。
>>914 それだと913のyA()の役割が説明されてないよ
(A()&& (xA(),B()&&(xB(),true) )|| yB();
919 :
914 :2010/01/30(土) 10:34:11
>918 >913 いやその説明を私に求められても困るんだが。 >918さんが何を問題にしたいか、わからないんだけど。 問題にしているのはyBであって、yAについては Don't careでしょ。 元ネタの>892にはyAにあたる部分は空白だしね。 A()が真でB()の処理結果にかかわらず、実行する処理 がyA()だけど、聞きたいことはそういうことじゃないよね?
すげぇ goto論争ってまだやってんだw 嫌goto厨って実戦で悪手なgotoの使い方に遭遇したことあるんだろうか。 そういう世代ってそろそろ引退のお年頃って気がするけど。
>>920 別に嫌goto論者は現れていないようですが。
>>920 gotoに反応してるのはおまいだけのようですが
見えない敵と戦っている人がいます。 きっと病気ですから、このスレから立ち去ることをお勧めします。
#define goto switch(0){case
CはPASCAL系よりはgotoに関しては寛容だとオモ ラベルは宣言無しに重複しない限り勝手に定義出来るし.. (直後が空文はだめだけど) PASCAL系の場合はlabel宣言してからじゃないと使えない。
>>919 うむ。
BOOL A(){BOOL r=〜;if(r)xA();return r;}; // A()に関わる処理が xA() だけでよいのなら
if(A()&&B())xB();else yB(); // yB()重複の疑問が出てくる理由が無い
yB
xB yA
yB yA // 三態にBOOLなら足りまへんとなるが yA()に先んづる必要のある yB()って何なの?と
そんな大層な話じゃなかんべ。 &&がショートサーキットと知らんかっただけじゃ?
928 :
デフォルトの名無しさん :2010/01/30(土) 16:32:39
#include <stdio.h> #define larger(x, y) (((x) > (y)) ? (x) : (y)) #define smaller(x, y) (((x) < (y)) ? (x) : (y)) int main(void) { int x[] = {6, 10, 4, 1, 3, 9, 11, 3, 20, 3, 4, 4, 6, 3, 2}; int n = sizeof x / sizeof x[0]; int i, max, min; max = min = x[0]; for (i = 1; i < n; i++) { max = larger(max, x[i]); min = smaller(min, x[i]); } printf("最大値= %d\n", max); printf("最小値= %d\n", min); return 0; } というプログラムのint n = sizeof x / sizeof x[0];はなにを意味しているのですか?
配列の大きさを計算している
より正確に言うと配列の要素数な sizeof x == 配列全体のバイト長 sizeof x[0] == 配列の要素1つ分のバイト長
下記コードを実行すると、-79が出力されます。unsignedなのに何故、マイナス値になのでしょうか? void main() { unsigned int a = 'ア'; printf("%d", a); /*=> -79 */ }
932 :
931 :2010/01/30(土) 22:36:41
BCC5.5での結果です。
>>933 %uにしたら4294967217というえらいどでかい数値になりました。。。
4294967217=0xffffffb1 アの文字コード=0xb1 どうして上位が1で埋められるんだろう
>>931 printf("%d",a)は
printf( (const char*)"%d",(char*)(int)(signed char)a);
と翻訳されている。
"%u"指定の場合、printf文の中で
(unsigned int)(int)(char*)という型変換が連続的に
行われこのような結果を起こす。
ほんとだw キャストを徹底的に誤解してるw
て言うか全部間違えてる
符号ありなら最上位ビットがコピーされて符号拡張されるのはわかるけど、符号なしなら 0x0000001bになるんじゃないの?
'ア'がchar型だと思ってるやつはいないよな?
>>942 #include<stdio.h>
int main(void){
unsigned int x;
x=-79;
printf("%u\n", x);
x=(unsigned char)-79;
printf("%u\n", x);
x=(unsigned short)-79;
printf("%u\n", x);
x=(unsigned int)-79;
printf("%u\n", x);
x=(unsigned long)-79;
printf("%u\n", x);
return 0;
}
>>943 コンパイラは char だと思っているかも知れない
>>946 Shift-JISなら半角カナはchar。
Windowsは、クソとかいいそ。
>>947 C言語の規格を読み直せ
character literalはint型だ
おお。すまん。だから、caseに書けるんだったな。
半角カナってsizeof(char)*1かつマイナスで、意味がわからなくなったから全部ワイド文字で扱うようにした
>>948 MinGW だと 'ア' の値が
コンパイルオプションで変化する
sizeof('ア') は 4 だけどね
-fsigned-char
-funsigned-char
#if '0xFF' == 0xFF # error 変なコンパイルオプションつけてんじゃねーよ #endif
#if '\xFF' だた
'ア'は処理系によって-79になったり177になったりするんですか?
>>956 コンパイラにもよるしコンパイルオプションにもよるし文字コードにもよる
(float)Math.random()-0.5f; をCに直すとどうなりますか?
>>955 VC++なら/J
BCCなら-K
をつけて試してから言え
>>959 (float)((double)rand()/RAND_MAX-0.5)
>>961 ありがとうございます。
0から0.5までの乱数を作っていると考えていいのですか?
0から0.5じゃ中途半端すぎるだろ・・・
>>964 なんで?
0<=x<0.5を使うことあるだろ
>>963 ありがとうございます。
最後に0から9までの整数の乱数を作るときは
((int)rand()/RAND_MAX+10);
であっていますか?
>>966 それだとほとんど 10、稀に 11 が出る
(int)(rand() / (RAND_MAX + 1.0) * 10);
((double)rand()/RAND_MAX) なんか、↑これで[0.0, 1.0]ということが理解できてなさそうだな
>>967-969 ありがとうございます。
((double)rand()/RAND_MAX)
で0-1だからそれを10倍して0-10になるんですね
>>970 まず関数のリファレンスに当たった方が良い
割り算なんてクソ遅いのに 割り算使うやつはド素人
そこは自称プロ(笑)なら除算って書いとこうぜ
割り算は/0例外起きるから嫌い
[0.0, 1.0]の乱数を求めるのに除算を使わないでどう書くの?
>>972 FPUの無いアーキテクチャはかわいそうだね
>>977 >>と全角で書けばアンカーと認識されないと思ってるかわいそうな人
read.cgiの仕様からして全角はアンカーミスです。デイファクトスタンダードもほどほどに >>1 >>1
>>と全角で書いてもアンカーと認識されると思ってるかわいそうな人 という突っ込み待ちと見た!
全角>>でアンカーにならない専ブラなんてあんの?
while(1){ if(n) continue; hoge(); } while(1){ if(!n){ hoge(); } } これって処理速度に差出るの?
>>983 試してみた
大差ないけど気持ち前者の方が速い
最適化したら変わんなかったわ
rand()/(RAND_MAX/10+1) [0.0 , 1.0)
987 :
デフォルトの名無しさん :2010/01/31(日) 10:00:52
regex.h使って文字列がURL(とメールアドレス)かチェックする関数作ったんですが 正規表現部分が不安でして、どなたか添削してもらえないでしょうか? URL "^http[s]?://[0-9a-zA-Z_.-?:/~#&%=]+$" メールアドレス "^[0-9a-zA-Z][0-9a-zA-Z_+-.]+@[0-9a-zA-Z][0-9a-zA-Z_.-]+.[a-zA-Z]+$"
>>987 どこまで厳密にマッチさせたいか、にもよるから何とも言えないな。
やっつけ仕事(quick and dirty)ならそれでもいいかもだが、
厳密にマッチさせるとなるとその正規表現では不十分。
# あと http[s]? は https? でおkじゃね?
それが仕事のプログラムならばガチガチにチェックしない方がいいと思うぞ むしろノーチェックでいいくらい 入力を間違っていたらどうせ接続エラーになるだけだから
>>988 httpとhttpsのURLを"URLじゃない"って誤判定されなければ問題ない感じです。
> # あと http[s]? は https? でおkじゃね?
確かにそうですね。。いろいろ修正しながらやってたら上の表記になりました。
>>992 連続ドットはダメだけど、それに気持ち悪い例外をたくさん用意した
RFCの方が狂ってる。
>>989 ガチガチでなくてもおkです。
>>990 実は[]の並び順も重要って気づくのに1時間ぐらい奮闘してましたw
どんな並びがダメなのか理解はしてないんですが、とりあえずハイフン先頭にしておけばおkでしょうか?
>>992 !!
なんかそのページ見たら、上の正規表現でもいいかなって感じがしてきました。。
>>987 手抜きで良いらしいので、改良すべき点だけ。
ホスト名には"_"は許されていない。
メールアドレス正規式の.がエスケープされていない。
> どんな並びがダメなのか理解はしてないんですが
先頭の^は否定を表す。
-は文字範囲を表すので、指定する時は先頭(否定の時は^の次)に書く。
次スレ立ててくる
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。