C++はスレ違いですがまったく対応できない回答者も信頼しない ほうがいいと思います。
C++撲滅運動
はC絶滅運動と同義になってしまう
1おつ ARToolKit試したいけどjavaのがねーわ
/ // / // ______ / // / / // /| r'7\ ,.ヘ‐'"´iヾ、/\ニ''ー- 、., / / / / | |::|ァ'⌒',ヽ:::ヽrヘ_,,.!-‐-'、二7-ァ'´|、__ `'ー-‐''" ヽ、_'´ `| |:::::|'" 二.,_> ,.へ_ / //__// / / / `ヽ7::/ か っ も | / // メ,/_,,. /./ /| i Y // ァ て う. |'´/ ∠. -‐'ァ'"´'`iヽ.// メ、,_ハ , |〉 | 約 ク ヽ! O .|/。〈ハ、 rリ '´ ,ァ=;、`| ,ハ |、 / | 束 ソ > o ゜,,´ ̄ . ト i 〉.レ'i iヽ|ヽ、.,____ | し ス / ハ | u ,.--- 、 `' ゜o O/、.,___,,..-‐'"´ | た レ | / ハ, / 〉 "从 ヽ! / | じ は |,.イ,.!-‐'-'、,ヘ. !、_ _,/ ,.イヘ. ` ヽ. ッ .ゃ .立 |/ ヽ!7>rァ''7´| / ', 〉`ヽ〉 ! ! な て .', `Y_,/、レ'ヘ/レ' レ' い .な ヽ、_ !:::::ハiヽ. // / で い ./‐r'、.,_,.イ\/_」ヽ ', / / す / `/:::::::/ /,」:::iン、 / / 〈 ,,..-‐''"´ ̄ ̄77ー--、_\.,__ / ,.:'⌒ヽ ´ | | , i |ノ `ヾr-、
随分昔に会社の人に聞いて使ってた記憶があるのだが、printf関数なんかのフォーマット指定子に いくつか隠しフォーマット(というか一般的に使われて無い)みたいなのがあったと思うんだけが・・・ 誰か知ってる人いない?
printf系のフォーマット指定子なんてマイクロプログラミング 言語みたいなものだけど、MS以外の処理系は似たり寄ったり 合わせてるけどMSはバシバシ独自拡張してるね 気に食わないんだが、こういうレベルのまでC規格として 共通化制定されてしまうと別の意味で秩序が乱れてしまう んで、基本的に処理系定義のものだと思ったほうがいいのかもね
printf((scanf("%s",&p),p),"abcd");
>>7 POSIXのprintf()のマニュアルくらいは目を通してから再質問してくれ。
まさかとは思うが、ISOの範疇で書かれた"%*.*s%n%%"の説明くらいできるよな。
scanf("%*[^\n]%*c");
ルートキットの作り方おしえてくsf
man読んだけどないな もう大抵の物クラスライブラリにしてるからprintfを使うことは、ほとんど無いんだが 気になるから、そのうちソース読んでみよう サンクス
そう言えばprintfって文字を読まずに飛ばして次のフォーマットを読み込めるのがあったな。 普段使わないから忘れたけど・・・
14だけど確かこんな奴だった→ %*c
int num = 5; char *str = "abcdefg"; printf("%5s\n", str); printf("%*s\n", 5, str); printf("%*s\n", num, str); こういう? 使ってみるとすぐ利点が理解できると思うよ。
今いろいろいじってて最初は意味不明だったけど いろいろ数値を変えていじっててようやく意味が分かった。 *の中には精度用の値を入れられるのか。
sprintf(buf, "%%%ds\n", num); printf(buf, str); を1手で実現できる
>>18 こんな使い方もあるんだ。
目からうろことはまさにこのことだなあ。
sprintfはいろいろと便利だから使えるね。
いろいろと面白い情報ありがとうございました。
あ、あとちなみに僕は
>>7 ではないです。
>>9-11 辺りも何が起きるか試してみたら色色面白いと思うのだけど。
printf()やscanf()の機能って記憶できるくらい勉強したほうがいいの?
scanfはそのうち使わなくなる printfはsprintfで長く使うだろうけど、使うほど覚えるだろう。 でもこれに限らず、覚えることよりもさっと調べる手段を持つ方が大事。
sscanfは結構使うな
構造体につける変数名は最初を大文字にするのが一般的でしょうか? それとも小文字にするのが普通でしょうか? 書籍やネットで調べてみると、 struct BookShelf {}; のようにJavaのクラス名のような付け方と struct bookshelf{}; のように全て小文字の付け方をする人が多いようです。 そしてFILEという構造体が何故大文字なのかが謎です。いつもFileと書いてコンパイルエラーに。。
>>25 コーディングスタイルというやつ。いろいろなスタイルがあるからどれが一般的かとはいえない。
FILEに関しては「謎」ではなく大文字で定義してあるから。
一般にマクロ名称は大文字にすることが多い。しかし小文字にしたって悪くはない。
28 :
デフォルトの名無しさん :2009/08/19(水) 17:48:36
C言語の勉強を始めて2週間目の者です。 書籍を参考に勉強していたのですが、昨日完読しました。 他の言語の経験があるおかげなのか、書籍にあるポインタの説明はわりと楽に理解しました。 が、今日はUNIXのコマンドのソース読んでいて、ポインタに関する面白いコードを見つけました。 完読したC言語についての書籍は、ポインタに関する説明が物足りない気がします。 ポインタってもっと奥が深いものだと思ったのです。 というわけで、ポインタを完全にマスターできるような、おすすめの書籍を 紹介していただけたらと思います。
29 :
28 :2009/08/19(水) 17:51:27
ちなみに、前橋市の「C言語ポインタ完全制覇」というのを見つけたのですが Amazonのレビューのいくつかにネガティブな意見もありました。 Rubyのまつもと氏もこの本を「迷教科書」と表現していました。 不安です。どうしたらよいでしょうか。。
ポインタ完全制覇は注釈がよかった、それ以外はどうでも良い そのほかポインタについてそこそこ語られているもの エキスパートC何たら、これは知らない知識が載っていて満足 CプログラミングFAQ、手元にあれば安心できる Cの強化書、まぁこれはこれで読みものとしてよかった ここがへんだよ上下、実験的で蘊蓄野郎がなかなか強い 叫ぶなんたら、もう内容忘れた
32 :
28 :2009/08/19(水) 18:33:07
>>30-31 アドバイスありがとうございます。
いろいろ悩みましたが、「エキスパートCプログラミング」を買うことにしました。
ポインタだけでなく、雑多でinterestingな内容があるみたいです。
Amazonなどでも良い評価をされています。
ありがとうございました。
ポインタ制覇もエキスパートCも相当古い本だよね。どっちもC99には一切触れてないし今から読むような本なのかね? Java1.2辺りの仕様を指摘して批判してたりしていかにも時代錯誤という感じ。 そこそこ新しい本で定番の本買ったほうが無難な気もする。ポインタ本なんてたくさん出てるし。
Javaなら標準のコレクションフレームワーク(LinkedListとかHashMapとか)を使って数行で書けるような処理が、 Cでは一から構造体を定義して連結リストを自分で作って、要素を削除・追加するための関数を書いて・・・とやらなければならないのでしょうか? ある程度の規模になれば連結リストは当たり前のように使うだろうし、毎回同じようなコードを書くことになりそうです。 実際の開発現場などでは有名なライブラリとかフレームワークのようなものがあるのでしょうか?
>>33 C99になってポインタまわりの挙動って変わったんだっけ?
>>35 C++つかえば一通り揃ってる。
Cに限定して言うと、大抵のCプログラマはその手の自作ライブラリを溜め込んでる。
(会社やプロジェクトごとにライブラリを揃えてることもある)
ただ、メモリ効率や速度を気にしてその都度チューニングすることも多いけど。
そもそもC99なんて使ってる人いるのか
>>38 使ってるよ。
全部の機能を使ってるわけじゃないけど。
40 :
35 :2009/08/19(水) 22:35:06
>>37 ありがとうございます。
なるほど、Cに限定すると世間一般で共通して使われてるようなモノは無いのですね。
すごく奥深そう。大学とかでじっくり勉強してみたかったなぁ。
C++も少し漁ってみましたがこちらはJavaに近いですね。
ライブラリ作ってる時が一番楽しい。 希望いっぱい、夢いっぱい(笑) だからライブラリは、いつも一新する。 流用できる? うるさい黙れ。
43 :
デフォルトの名無しさん :2009/08/20(木) 01:57:24
ライブラリみたいな高度な物は未だに作った事がない もうはじめて3ヶ月もたつというのに・・・
前に作ったプログラムのソースを流用してれば、それはソースと言う名のライブラリーだ
>>45 しかしそれをライブラリーと本気で呼ぶヤツがいたら
縁を切るしか。
俺レベルになると要件聞いた瞬間に数千行程度のソースコードがだいたいイメージできるしライブラリとか要らんわ
>>47 すげーなwww
無能な働き者でないことを願うばかりだ
最近のアホは高度になったな
char test[] = "2B"; っていう配列testがあって、中身のデータ2Bを二桁の16進数文字として解釈して ascii文字の+に変換したいのですが、そういうライブラリ関数みたいなのはありますか?
strtol()とか
萌えキャラが初心者にもわかりやすく丁寧にかつ少しエロく説明してくれる書籍、又はソフト、サイトを教えてください。
エロゲやりながらK&Rを読む
>53の発言によって後に伝説となる恋愛アドベンチャノベル「おしえてA・B・C」が作られることになる 冬コミにでも期待しとけ
>>53 ニコニコのミクと学ぶC言語でも見てろ。
どうせ、動画見ただけで分かった気になって何も身につきはしないだろうがなw
宣伝乙
「はじめてのC」でいいじゃん。
「はじめてのC」・・・いつ聞いてもドキっとするタイトル。
俺は読んだことないんだよね。 タイトルで有名になっているんじゃないかという 気がするのだが、どうなの? 実際良い本なの?
はじめての○○って感じの本には碌なのがない
麻奈ちゃんが、やさしくレッスン
63 :
デフォルトの名無しさん :2009/08/21(金) 14:57:44
麻奈タン(*´д`*)ハァハァ
65 :
デフォルトの名無しさん :2009/08/21(金) 17:49:29
C言語で野球ゲーム作ろうと思って、 4種類くらい変化球作ってピッチャーに投げさせたんだけど、 投げるのはいいけどバッターが打つってどうすればいいの? キー入力したタイミングで空振りとかヒットとかにしようと思ったんだけど、 ピッチャーがボール投げてる最中は割り込み出来ないからダメなの?
その質問力じゃ一生かけても無理だろ
いやあ、やりたいことはすんなり分かるんだけど。 フレーム管理にするかマルチスレッドにするかだよね
Javaだとコンパイルエラーになるのに、Cだとint型の変数にdouble型の変数を代入してもコンパイルエラーにならないんですけど… これってただ小数点以下が切り捨てられるだけなのですか? 発見しづらいバグを誘発しそうでとても恐ろしいんですけど。
>>68 警告は出るだろ。
警告レベル高めにして、警告がでないように書くってのはCでも基本。
警告やらエラーが出ないと気づかないようなアホは、 何も考えずにキャストしまくってバグだすよ。
>>68 Cの勉強をせずにCでプログラムを書こうとする行為がとても恐ろしいんですけど。
73 :
デフォルトの名無しさん :2009/08/21(金) 19:57:31
配列を初期化するとき int a[10] = { 0 }; でこの配列の全ての要素を0にできると思いますが 2次元配列や3次元配列の場合は同様にできないのでしょうか?
75 :
デフォルトの名無しさん :2009/08/21(金) 20:11:28
>>74 int a[10][10] = { { 0 } };
でいいですか?
>>68 慣れるとその類のバグはすぐ見つけられるようになるよ。
>>75 俺も初心者で勉強中だが、こんな初歩的なものは自分で本かネットで調べろ。
聞いてばっかりじゃ伸びないよ。
79 :
デフォルトの名無しさん :2009/08/21(金) 20:29:39
int a[10][10] = { { 0 }, }; だったかもしれない
>>75 その書き方を認める処理系の信用度を1回だけ
デクリメントしておいてくれれば良い
やべぇ俺初心者じゃないつもりでいたけど 正解がわからねぇw
84 :
65 :2009/08/21(金) 23:08:19
あのですね、 ピッチャーの球種は乱数で決定する。 それでバッターはその球を打つ。 でも、実際ボールって打てない? マルチスレッドって命令実行中に割り込むってことですか? そんなことって出来るのでしょうか。 基本を教えて欲しいのですが。
アクションゲームでマルチスレッドは使わないだろう。
ピッチャーが投げるところまではできているような口ぶりだけど、 ぜんぜんできてないんじゃないか。
87 :
65 :2009/08/21(金) 23:24:35
とりあえず打つことを教えて欲しい 誰か解る人いない?
しつこい
マルチじゃなくてマイクロスレッドじゃね
そこまで言うなら、とりあえずソースをうpしてみろよ。
もういいって
こいつはまずGUIプログラムを作れるのかどうかすら疑問だ。
93 :
名無しさん :2009/08/22(土) 00:16:19
#include <stdio.h> #include <string.h> int main(void) { char *p="A"; char *h="B"; char *rp; int length; length=p-h; printf("%d\n",*p); printf("%d\n",*h); printf("%d\n",*p-*h); printf("%d\n",length); return 0; } これで最後のlengthが何故 -4 って出るかがわからない 上の*p-*hはA(64)-B(65)で-1ってわかるけど length=p-h;これが何故-1なのか不明教えてくれ
94 :
名無しさん :2009/08/22(土) 00:18:06
-1じゃなくて-4な
95 :
デフォルトの名無しさん :2009/08/22(土) 00:20:24
>>93 アドレスの引き算したんだろ
メモリ上に配置されてるんだけど4バイト境界で収まってるんじゃね?
メモリ上に
A\0??B\0??
という感じで
?のところは何が入ってるか不定という意味で使ってる
ちゅかまぁ、length=p-h; は仕様的に違反だけどね。 これはポインタの引き算だけど、 二つのおぺらどんが同じ配列のオブジェクト またはその配列の最後の要素の一つあとでないときは 不定となるっていうルールなので、 length のあたいは超不定。
こまけぇこたぁいいんだよ
rand関数と確率を組み合わせたらネットカジノ作れるんじゃね
おそらく小さいアドレスから大きいアドレス引いたから-4なのだろう
>>65 「ピッチャー投げた」と表示
(内部でどの球種(コース)かは決められている)
↓
「バッターどうする?」と、その選択肢も書いて、
その後、scanfなどで入力待ち状態にし、
ユーザーに入力してもらう
1、速球のタイミングで積極的に打つ
2、変化球のタイミングで積極的に打つ
3、ボール球に気をつけて消極的に打つ
・・・など
↓
投手の投げた球種(コース)と打者の打ち方により、
結果(空振り、アウト、ヒットなど)を計算する
キー入力したタイミングで空振りとかは難しいかもしれない。
ピッチャー投げたの後にclockで時間を計り始め、
バッターの入力のタイミングが0.5秒だったら速球のタイミング、
0.6秒なら変化球のタイミングとかできるかもしれないけど。
103 :
93 :2009/08/22(土) 10:11:29
http://情報処理試験.jp/FE21a-pm/t09.html 基本情報の午後問でlengthが使われていて。
void convert(const char *path, const char *base, char *result)
const char *pp, *bp;
int length;
Cの答えがlength=bp ‐base
これもあのわかりずらいアドレスの引き算なのか?
104 :
デフォルトの名無しさん :2009/08/22(土) 10:14:13
おい・・・
変数aとbが連続で宣言されても、それぞれがメモリのどこに配置されるかは不定。 後から宣言したbはaよりも後ろのほうに配置されただろう、なんて思い込みはやめること。
やさしいC
107 :
デフォルトの名無しさん :2009/08/22(土) 11:07:29
やさC
108 :
93 :2009/08/22(土) 11:11:44
独習Cがおすすめ C言語でRPG作ってんだけど 2次元配列でマップつくってswitchでキャラおいて。 扉も作って持ち物メニューとステータスも作った。 もちろん、鍵を使う?Y/Nも実装して扉の前の座標にたって、鍵の名前をstrcmpで一致させて そしたら開くようにした。
ヨッシー
独習シリーズを薦める奴がまだいるのか ネタなのか本気なのか罠なのか
入門書なんてなんでもいいだろ。 ある程度知識つけたら、後はひたすら書いてけばそのうちなれるし。
使えなさ過ぎる入門書が多すぎるけどな 独習Cは1冊目に読むには向かないとは思う。
他人の否定ばっかしてないで自分のおすすめを挙げろよ役立たず共が
114 :
デフォルトの名無しさん :2009/08/22(土) 12:18:01
今読んでいるソース(ヘッダファイル)に #define HOGE(aaa) #define HAGE(bbb) HOGE(bbb) のような記述があります 使われ方から察するに、 HOGE を変数のように扱って、 HAGE(bbb) は HOGE に bbb を入れているようなのですが、 その考えで正しいのでしょうか?
違います。入門書読んで。
>>115 どう違うんでしょうか?
ググっても入門書読んでも分からなかったんで聞いているんで
分かるようでしたら教えていただけると幸いです
プリプロセッサだからそういう扱いではないってだけ
ではどういう扱いなんでしょうか? 分からない人に分かるように説明してもらえると助かるんですが
すみません、質問の仕方を変更します。 #define HOGE(aaa) とはどういう意味なんですか?
プリプロセッサエラーかな
121 :
デフォルトの名無しさん :2009/08/22(土) 13:09:11
#define HOGE(aaa) なら分かりますが、 #define HOGE(aaa) は分かりません。
マクロは理解して使わないと危険だからなあ #define HOGE(aaa) xxxxxx(aaa,0x01) これはxxxxxx関数の引数を2つ用意したけど実際は第一引数しかかわなくなったとかで マクロを使った場合のイメージ
>>121 では、お分かりになる
#define HOGE(aaa)
の方で結構ですので教えていただけると助かります。
124 :
122 :2009/08/22(土) 13:13:55
>>121 間のスペースが全角とか半角を皮肉るのはどうかとw
>>125 ソース及びヘッダ等関連ファイルのテキスト検索やってみた?
UPDATE_COUNT(
とかをキーワードにして
使われなくなって放置されてるとかそういうのではないの?
>>125 マクロってのは単純に置き換えるだけだから、
#define HOGE(x)
は何も無い状態に置き換える(削除する)
俺も詳しくは知らないんだけど、なんか暗黙のなんたらってどっかで見た記憶がある
>>126 grepしてみたところutil.h内でしか使われていません。
util.hにはバイトアライメントされていないデータを読込むためと思われるコードがあり、
例えば3bit読込むマクロには
UPDATE_COUNT(3); \
のようにUPDATE_COUNTの引数には読込んだbit数が入っています。
しかし、それを何かに使っている様子がないので
一体何のためにあるのかまったく分かりません。
もしかしたら使われずに放置されているのかもしれませんね
>>127 なるほど、そういうことでしたか
確かに何もない状態に置き換えになりますね
こうやって見てみると質問しときながら解決してもあいさつもしないプログラマ志望のやつって 現場でやっていけるのか不思議に思うんだけど、今はそれが主流なのかな
てめぇは老後の心配でもしてろよ
>129 とりあえず、コメント読んどけ ~/mpeg_lib-1.3.0% sed -n 44,45p util.h /* Macro for updating bit counter if analysis tool is on. */ #define UPDATE_COUNT(numbits)
>>103 アドレス先の問題において、bpはもともとbaseを基にしたアドレスでしょ。
>>93 とはまったく意味合いが異なる。
ってか文字列長出すならちゃんと終端文字の位置探せ。
C言語初心者です。フローチャート書くのが苦手です。 フローチャートをうまくコツってありますか?
ひたすら練習
>>134 Cのコードを書いて、そこからフローチャート起こすと、楽で早いよ。
フローチャートが書きやすいコードを書く
>>134 フローチャートかあ。まだ教えているとこあるの?
たまーーーーにフローチャートを提出しろって客はいたが どうせ見ないだろおまえと言ってしまった
クラス図なら描くがフローチャートは描かんなぁ
フローチャートって書くの? いらないな、うん。
規格などで動作フローを厳密に定義するときにフローチャートは使われたりしている。 または、順序や条件が複雑な問題を考えるときに、頭ん中を整理したくて書きたいことはあるな。
フローが分断されるようなイベント駆動とかメッセージ指向のパラダイムを持つ言語って フローチャートの意味がまったくない
イベント受けた後の処理(要するに、イベントハンドラの中身)が複雑な時は フローチャートで整理することもあるよ。
複雑な処理を整理するのにフローチャートを使うとか言ってる人が いるけど、初心者はマにうけないようにな。 フローチャートは特別表現力が高いわけじゃないし、描くのも、 プログラミング言語に比べたらすごい労力になるから、そういう用途に つかったら、ひどい目にあう。
え? フローチャートって、裏紙に適当に描くものだろ。ホワイトボードでもいいけど。
チャート系はなあ・・・ 今の開発規模やプログラムの作り方では使いにくにくいんだよな フローチャートとかねえ そういえば某H社が使う変なチャート図はなんていうんだろ
プログラムコードそのものを設計する目的でフローチャートを使うのは間違っているが、 フローそのものが解決したい問題の本質であるときは、それを「もろ」に書くために有用。
カナダ人作成の韓国人の問題解決フローチャートとかですな。
151 :
デフォルトの名無しさん :2009/08/23(日) 15:49:00
フローチャートとか書くだけむだだろ かっこつけか伝統とかしかないな。 書くだけ 無 駄 なんだよ プログラマーのステータスだろ フローチャートを書いて、ブログやHPに載せて見せびらかすのはww
152 :
デフォルトの名無しさん :2009/08/23(日) 15:58:14
知的に見られたいために、人間の誕生など 何かをフローチャート化して知的ぶるw ITに進むやつはバカで知的にみられたいのか知らんがバカがおおすぎww 必死にgrepネタ出してるけどそれで何かするわけでもないしコマンドを覚えて無駄ww なんだかんだいってエクセルとワードを使いこなせるやつのほうが世間一般的にウケがいいなw
人間の誕生
154 :
デフォルトの名無しさん :2009/08/23(日) 16:01:16
>>152 うっせーんだよITドカタw
マ板にいけ。
155 :
デフォルトの名無しさん :2009/08/23(日) 16:01:58
芸能界も覚せい剤を使って 怖くみられて 普段は優しそうだけど 実は怖いっていうギャップを狙ってるのかw 芸能界は覚せい剤など、コネなどステータスかと思ってマネするのと同じだなww
フローチャートだけではプログラムの1側面して表現できておらぬ。 状態遷移図やシーケンス図なども駆使して多角的に表現できなくてはならない。
>>152 wの数を数えると
そいつの程度の低さが分かるって言うけど本当なんだね。
158 :
デフォルトの名無しさん :2009/08/23(日) 16:17:46
図星なのかしらないけど 程度の低さなどとしか言い返せないww
延びていると思えばこれ流れか スレ立てて別のところでやれ
いや、もう別のスレを立てられる方が迷惑だろ。 このスレないで収めてくれ
処理時間を大まかに把握したいときにフローチャートが役に立つことはある。
データの流れを書いた物があればいい
アクター図で十分なきもする
標準ライブラリの使い方について詳しく説明してる定番本のようなものはありますか? K&Rのライブラリの説明はあまりにも簡素すぎて今の私には使いこなせません。
C言語のライブラリの辞書買えばいいのでは
>>164 MS-Cの頃は、それなりの書籍があって、MS-C 独自関数も含めて標準ライブラリの使い方を書いた本があったんですけどね。
今はどうかな?
時間があるならUNIXプログラミングから勉強するのもお勧め。 システムコールレベルのコード読んでると標準ライブラリ見てるだけでは気付かなかったことが色々分かってくる。 Javaから始めた人がCを勉強して色々気付くのと同じ感覚。
普通にMSDNみればいいんじゃねぇの
MS独自拡張のライブラリなんか覚えても他で通用しないんじゃ汎用性に欠ける。 昔からそうやって利用者を囲い込む姑息な企業だからな。
POSIXはその囲い込みに失敗した良い例というわけ
>>164 ちょっとちがうけど「Cプログラム診断室」は?
人の書いたコードをけなしながら「そういう処理は標準関数をこうつかえよw」みたいな
つっこみがいっぱいあったような記憶が。
今でもネットで見れると思う。
172 :
デフォルトの名無しさん :2009/08/23(日) 21:55:27
C言語始めたばかりで、自作関数の勉強をしています。 「キーボードから整数の入力を受け取って、それを10倍した値を返す関数を作って下さい。」 という問題で下記を作ったのですが、失敗作のようです。 どこがどう間違っているのか解説お願いします。 #include<stdio.h> int sum(void); int main(void) { sum(); printf("%d",(int)(num * 10)); return 0; } int sum(void) { printf("整数を入力してください\n"); scanf("%d",&num); return 0; }
174 :
デフォルトの名無しさん :2009/08/23(日) 22:02:00
それだとだめだよ #include<stdio.h> int sum(void); int main(void) { printf("%d\n",sum()); return 0; } int sum() { int num; scanf("%d",&num); return num*10; } こう
なんでsumなんだろう
>>172 おまえ、雑記帳ってサイトでネタにされてたよ。
キーボードから整数の入力を受け取って、それを10倍した値を返す関数を作って下さい。 でぐぐれかす
178 :
デフォルトの名無しさん :2009/08/23(日) 22:12:19
>>174 ありがとうございます!
自分のだと自作関数内の数値がメイン関数に反映されてないっぽいですね。
見比べながら復習しようと思います。参考になりました。
>>170 POSIXいいぞ。
教科書どおりのfopenとかだけで20年以上飯食えてるからな。
どこで質問したらよいのか分からないので質問させてください。 僕は意味不明なファイルがどういうものか知りたくて (たとえばCドライブにあるsetting.iniとかを見て「こいつはこのソフトを動かすのに使われているんだな」って分かるような) プログラミングを始めました。言語はVB.NETです。 それで、VBの方は簡単なゲームを作れるところまでできてきたのですが、当初の目的の 「ファイルがどういうものかを知る」というのがいまひとつピンときません。 VBだから当たり前なのかもしれないのですが、なぜかC言語なら分かる気がしたのでVisualC++をとりあえずインストールしました。 そこで伺いたいのは、別にCとかC++とか関係なくC系の言語を学べばファイルというものがどういうものなのか理解できるのでしょうか? 本当にあいまいな質問ですみません。 また、職業はプログラマとかではないので将来プログラミングをバリバリ使って働くわけでもないです。 そういう意味で僕の目的を満たすには、C言語を学ぶのはオーバーワークなんでしょうか? ご回答よろしくお願いします。
181 :
93,174 :2009/08/23(日) 22:36:47
>>173 C言語がいちばん簡単だから安心しろ^^
資料もおおいし。
最初からPythonとかマイナー言語進める奴はバカだな
何かの記事でハッカーはPythonを使うとかバカの一つ覚えてかっこいいと思って使ってる奴が多い。
名前が蛇みたいでかっこいいとか^^;(滝汗)
>>180 VBでもファイルを読み書きしたり、作ったりと言うようなプログラムは作れるでしょ。
>>180 setting.iniに関していえば、初期設定情報をファイルとして外に出したと思っていい。
184 :
デフォルトの名無しさん :2009/08/23(日) 22:42:23
>>181 救いようのない馬鹿だな。
何調子のってんだ?
>>180 これはいい燃料ですね
とりあえず.NETならXMLという話をどこかできいた
Windowsならレジストリ
188 :
93,174 :2009/08/23(日) 22:46:31
>>184-185 Pythonをやればハッカーだと思って勉強しちゃったカスですか かっこわらい
189 :
93,174 :2009/08/23(日) 22:47:18
図星で反論 テラパオスですね かっこ笑い
190 :
デフォルトの名無しさん :2009/08/23(日) 22:47:55
>>188 ポインタも理解できないお前の方がカスだけど(爆笑)
191 :
93,174 :2009/08/23(日) 22:49:26
バーベルで頭ぶっ叩いたら即逝しそうだなクソガリ かっこわらい
>>191 Pythonで挫折したんですね、わかります。
たしかに、Pythonはクソ言語だな
>>193 どうした?
夏休みの宿題が終わらなくて泣いているのかな?w
じゃあてめぇが素晴らしい言語を設計してみろカス
この間うちのチームに入ってきた奴が3年近くPGやってるはずなのにファイルを触ったことが 無いっていうのを聞いて驚いたんだが、今はそういうのが多いの?
夏休みの宿題か… ただの一度も完遂したことがないな
197 :
デフォルトの名無しさん :2009/08/23(日) 22:54:11
93 : 名無しさん : 2009/08/22(土) 00:16:19 #include <stdio.h> #include <string.h> int main(void) { char *p="A"; char *h="B"; char *rp; int length; length=p-h; printf("%d\n",*p); printf("%d\n",*h); printf("%d\n",*p-*h); printf("%d\n",length); return 0; } これで最後のlengthが何故 -4 って出るかがわからない 上の*p-*hはA(64)-B(65)で-1ってわかるけど length=p-h;これが何故-1なのか不明教えてくれ
>>194 どうした?
夏休みの宿題が終わらなくて泣いているのかな?w
じゃあてめぇが素晴らしい言語を設計してみろカス
199 :
デフォルトの名無しさん :2009/08/23(日) 22:55:02
93 : 名無しさん : 2009/08/22(土) 00:16:19 #include <stdio.h> #include <string.h> int main(void) { char *p="A"; char *h="B"; char *rp; int length; length=p-h; printf("%d\n",*p); printf("%d\n",*h); printf("%d\n",*p-*h); printf("%d\n",length); return 0; } これで最後のlengthが何故 -4 って出るかがわからない 上の*p-*hはA(64)-B(65)で-1ってわかるけど length=p-h;これが何故-1なのか不明教えてくれ
>>195 ファイルってのは標準関数でオープンしたりするあれ?
それとも特定の開発現場でSQLを使わなくてアクセスできるあれのこと?
202 :
93,174 :2009/08/23(日) 22:57:28
ぷぎゃー くやしいのぅwwwwwww草w
>>200 標準関数でオープンしたりするアレ。
特定の開発現場は知らん。
93の釣りに釣られた奴は低能なんだろうなw 低能の釣りに低能が釣られる
ファイル触ったこと無いって よっぽど高級なことやってたに違いない アルゴリズマー
>>181 > C言語がいちばん簡単だから安心しろ^^
簡単なことで躓いている奴が言う台詞じゃねぇ・・・w
>>203 まあ分業でやることが増えてるからそういう人もいるんじゃないの?
208 :
93,174 :2009/08/23(日) 23:01:05
>>204 おいおい、見苦しいぞ低脳君 かっこわらい
なんで93が暴れてるのか不明なんだけど、まとめてくれ > 93
211 :
180 :2009/08/23(日) 23:03:47
皆さん素早いレスありがとうございます。
>>182 確かにそうですね。その辺りもやってみます。
>>183 それについてはネットで検索して「なんとなく分かるような分からないような」という感じです。
でも、教えていただきありがとうございます。
>>186 xmlですか。
そういえば以前ちょっとだけやって何に使うんだろうと思ったことはあります。
やっぱりファイルといえども全部を理解しようとするのは無理なのかもしれなかったです。
C言語をやるかどうかはもう少し考えてみたいと思います。
醜い
213 :
デフォルトの名無しさん :2009/08/23(日) 23:05:13
夏だなぁ
214 :
荻原 :2009/08/23(日) 23:07:18
夏は暑いな
>>211 ファイルの識別をしたいのか?もちろんVBでもできるよ。
大抵のファイルにはヘッダやフッダがあるから、バイナリで先頭数バイトを読んでみれ。
ヘッダ一覧は別ファイルでDBにでもしておけばいいだろう。
216 :
180 :2009/08/23(日) 23:18:23
>>215 VBでもできるんですか!
自分の勉強不足で全く知りませんでした。
それではもう少しVBをやってみたいと思います。
スレ違いの質問に答えて下さりありがとうございました。
>>211 iniなんかはWindowsAPIに読み書き関数が用意されていて
フォーマットも分かりきっているけど
「俺は■■■みたいに書いて△☆ミのように読みたいんだ!」っつーフォーマットを自分で決めればいい
>>216 極窓か?識別プログラム自体は楽だろうが、
ファイルのヘッダのデータ収集が一番めんどくさそうだ。
あるソースファイルの中で、別のファイルで定義された関数を使っている場合、 gccでコンパイルする時にコンパイラは何を元に関数の実体の場所を探しているのですか? たとえばJavaであればclasspathというのがありますが、Cにも独自の環境変数が用意されているのでしょうか?
もっとも早くMD5が取得できるライブラリ教えてくだしあ
221 :
デフォルトの名無しさん :2009/08/24(月) 00:42:31
ファイルを整理するソフトを作ろうと思っています。 結構色々なソフトがありますが、ファイル数が多いとハッシュを取得するのに結構案時間がかかってしまいます。 なので、咲にファイルサイズを取得してから同一のサイズのファイルだけハッシュの取得、比叡するという事をしたいです。 どうすればいいですか?
222 :
221 :2009/08/24(月) 00:44:37
自決しました
>>219 リンカオプションですべてのファイルの位置をちゃんとぴっちり設定する必要があるのだ。
なぜスコープ付き#defineがないのか
なぜならCプリプロセッサはC言語とは全く関係ないからだ
コンパイラへの命令だって本で読んだよ!
Cプロプリセッサへの命令。
ちょっとこのプログラムどこがおかしいのか見てくれないだろうか 52枚のトランプカードから2枚引くプログラム作ってみてコンパイル通ったけどおかしな数値しか出てこないんだ 構造体でマークと数字を別々に保管してるの作ろうとしたら二枚目で同じカード引かないようにするトコで行き詰ってこういう形になった 要するに配列52個用意して一度引いた配列に0代入して同じの引かないように作ったんだが、何か間違ってたんだろうか int i,j,x,y,z=0; int pcard[2]; //プレイヤーの引いたカード・今回は二枚なので char *mark[]={"Diya","Clober","Spade","Heart"}; //数字をマークに変換する為の変数 srand(time(NULL)); //乱数の種をまく int allcard[52]; x=1; for(x=1;x<5;x++){ y=x*100; for(i=0;i<13;i++){ allcard[z]=i+y+1; z++; } } //52種類のカードを用意 //100の位がマーク //1〜10の位でカードの数字 for(i=0;i<52;i++){ printf("%d\n",allcard[i]); } //確認用
printf("\n\n\n\n二枚引いてください。\n"); printf("まずは一枚目です。"); j=0; //jは今が何枚目のカードなのか while(getchar()!='\n'){} i=rand()%52; //出した乱数をとりあえず変数に保存しておく pcard[j]=allcard[i]; allcard[i]=0; //今回引いたカードにはゼロを入れておく printf(" %d to %s\n",pcard[i]%100,mark[pcard[j]/100]); //プレイヤーカードを100で割った余りのを出力 //プレイヤーカードを100で割った数値に対応したマークを表示 j=1; //プレイヤーカード二枚目 printf("\n二枚目を引いてください。\n"); while(getchar()!='\n'){} i=rand()%52; pcard[j]=allcard[i]; while(allcard[i]==0){ i=rand()%52; pcard[j]=allcard[i]; } //既に引いたカードならやり直し allcard[i]=0; //今回引いたカードにゼロを入れておく printf(" %d to %s\n",pcard[i]%100,mark[pcard[j]/100]);
>>230 まずアプローチがちがう
配列 シャッフル
でggrks
>>227 その本は焼き捨てるか、
窓から投げ捨てると良いよ。
このご時世ならリサイクルもありだな。
>printf(" %d to %s\n",pcard[i]%100,mark[pcard[j]/100]); pcard[i]%100じゃなくて、,pcard[j]%100だろ
>>234 ありがとうございます。視力が弱いせいでiとjが同じに見えてました
凡ミス・・・確認不足・・・恥ずかし・・・もうちょっと区別の付きやすい変数にしとこ・・・xyz使い回すか
0で埋めるより、抜いたところに一番後ろのカードを入れると無駄なループしなくていいよ。 allcard[i] = allcard[51-j]; i = rand() % (52 - j);
237 :
デフォルトの名無しさん :2009/08/24(月) 22:33:01
だれか助けていただけないでしょうか。 2プロセス間(A,B)でメッセージ通信を行っています。 この際に例えばAでBからのメッセージ1を受信後、さらにBよりメッセージ2を受信しようとすると、 セグメンテーションエラーがでます。 GDBを利用してデバッグしましたが、具体的にエラーが出ている行数や関数名等が表示されず、 大変困っています。
238 :
デフォルトの名無しさん :2009/08/24(月) 22:35:37
デバッガ使ったけどバグ直ってないニダ 謝罪と賠償ニダ
はいはい とりあえずソースを見せろ
>>233 独習Cってそんなにまずいの?w
2回も読んだよ
ハーバートシルト先生の本は ともかく平易で読みやすくキレイにまとまってはいるんだけど 平易にしすぎるせいか、意味があいまいだったり、 コードが安全でなかったりするんだよね。 STL標準講座も標準講座MFCもそんな感じだった。 とっかかりの本としてはいいんだけど それだけで終わるとプログラマとしても終わってしまう。 別の本で、曖昧な箇所をきっちり矯正しておく必要あり。 ある程度他の言語を使ってきた人には二度手間本。
独習C++も簡単?
いつになったらwindowsアプリ作れるようになるんですか
>>237 *((char*)p+1)なことやってるとか
handleを生ポインタで扱ってるとか
作って消して渡して読み取ってるとか
そもそもメッセージングには何使ってるんだおい
PS3薄型と旧型の違い 旧型PS3: Linuxインストール機能内蔵でPS3をPCとして使うことができる。 PPC Linux用の無料のソフトがいっぱい動く。 また、Cellの開発ツールも無料で入手できるので自分でCellのプログラムを作って実行させることができる。 ドルビーTrueHD、DTS-HDMAはリニアPCM変換で対応。 HDD〜80G 実勢価格36000円程度 薄型PS3: Linuxインストール機能は除去された。 ブラビアリンク機能でブラビアと連動した電源のON OFFができる。 ドルビーTrueHD、DTS-HDMAのビットストリーム出力対応。 HDD120G 比較して低騒音低発熱 実勢価格29980円
インクリメントに使う一時変数の名前を最初にiとしたヤツは死刑。
フォントによってはiとjの区別がほとんどつかないのもあるよねw lと1の区別がつかないのもあるし、mとnも似てるし、oは0と混同するし、qは9と似てる場合もあるし。
Cの標準ライブラリの関数名決めた奴の方が問題だろ
253 :
デフォルトの名無しさん :2009/08/25(火) 20:37:20
代入してある数値の牛乳2本とジュース1本。1000円出しておつりはいくら? 消費税1.05%込み、答えは整数で。 って言う問題でコレ作ったんだけどコンパイルできない。 正答は知ってるけど、全然違うやり方だし、コレのどこがおかしいのか知りたいので アドバイスお願いします。 #include<stdio.h> int main(void) { int juice,milk,money,change,tax; juice = 198; milk = 138; money = 1000; tax = 1.05; printf("%d",(int)(tax * (money - (juice + milk * 2)))); return 0; }
254 :
253 :2009/08/25(火) 20:39:28
すいません、違うの貼ってしまいました。 コレです。 #include<stdio.h> int main(void) { int juice,milk,money; double tax; juice = 198; milk = 138; money = 1000; tax = 1.05; printf("%d\n",(int)(tax * (money - (juice + milk * 2))); return 0; }
money - (int)(tax*(juice + milk*2))
257 :
デフォルトの名無しさん :2009/08/25(火) 20:57:31
というか、算数レベルの間違いしているのか。。
乙。酔っ払いに立ち向かうなんて偉いじゃんw
259 :
253 :2009/08/25(火) 21:07:07
下記のプログラムについて質問です。 ブロック内でvalue2の宣言をしていないのに普通に使え、ブロック外でもブロック内での変更が 有効なのはなぜですか? 普通だったらブロック内→使えない ブロック外→20になるように思えるのですが。 #include <stdio.h> int main(void) { int value1 = 10; int value2 = 20; printf("1:value1 %d\n",value1); printf("1:value2 %d\n",value2); { int value1; value1 = 30; value2 = 40; printf("2:value1 %d\n",value1); printf("2:value2 %d\n",value2); } printf("3:value1 %d\n",value1); printf("3:value2 %d\n",value2); return 0;} 実行結果 1:value1 10 1:value2 20 2:value1 30 2:value2 40 3:value1 10 3:value2 40
>>260 >普通だったらブロック内→使えない ブロック外→20になるように思えるのですが。
それはどこの言語のルールだ。
Cではこれが普通なのだ。
仕様どおりなのだ。
レキシカルスコープでggr
>>260 >>260 {
int value1;
value1 = 30;
value2 = 40;
printf("2:value1 %d\n",value1);
printf("2:value2 %d\n",value2);
}
はブロック外でなくブロック内。
ブロック内で新たに宣言したらそれを使用、 ブロック内で宣言しなかったらブロック外の変数をそのまま使用。
ふくろだたき
>>261 ありがとうございます。もう少し詳しく説明してもらってもいいですか?
ローカル関数の寿命はブロック内、value1は別ブロック内で宣言されているので、
当初のvalue1とは名前が同じだけの別物の変数ですよね?
value2が宣言なしに別ブロック内で使えていること(このvalue2は当初のvalue2と同じものなのか別物なのか)
別ブロックを抜けたあとにも関わらず当初宣言されていた20が適用されず40になっていること
ここがよく理解できません。よろしければ詳しいアドバイスお願いします。
C++ならこの問題簡単なんだろうなあ でもこのスレはCだから面倒だなあ
プログラミング言語作りたいんだけどflexとyaccって今でも使われてるんですか?
>>267 話は単純なのだ。変数は宣言されたスコープ内では常に有効だ。
A{
B{ }
}
のような場合、B{ }の中はA{ }のスコープの中でもあるのだ。
だからA{}の中で宣言された変数はB{}の中でも使えるのだ。
そんだけ。
>>262 すみません、ポインタはまだ勉強していないのでよく分かっていません。
>>263 ググってみましたがC言語での説明が見つからなかったので、後で詳しく調べてみます。
>>264 { (ブロック1){ (ブロック2)} } とした場合、ブロック1=ブロック2となるのでしょうか?
>>265 value2はブロック2で宣言されていなかったのでブロック1と同じものになるということでしょうか。
このルールは、例えば { (ブロック1)} {ブロック2 } といった環境でも適用されますか?
>>267 1.上位ブロックで定義されたシンボルは下位ブロックでも同じものとして参照できる。
2.上位ブロックで定義されたものと同じシンボルが下位ブロックで定義されたら
それは別物とする。
こういう規則ですよ。
>>270 なるほど!!!理解することができました。
皆様親切にどうもありがとうございます、とても助かりました!
>>272 ありがとうございます!おかげさまで完全に理解できました。
そのルールで考えると
下位ブロック内でのvalue1は別物であり下位ブロック内のみで有効、
下位ブロック内でのvalue2は上位ブロックと同じもの
となるのですね。詳しい説明、どうもありがとうございました。
>>271 ブロック内で宣言した変数はブロック内でのみ有効。
だからブロックが終了したらそれと同時に破棄される(例外はあるが)。
どうしてもブロック外の変数が使いたいなら、{ }以外の場所で
グローバル変数として宣言すべき。
C言語の壁はextern 構造体 配列 ポインタじゃ。
関数ポインタ嫌い
C言語なんか簡単じゃのぉ ドクターゲロなんてワシよりだめだのー 則巻センベエさんと話あったらドクターゲロとドクターミューはポインタが理解できてないっていってたの(笑)
>>275 { } { } となった場合でも使えるのがグローバル変数なんですね。
ちょうど勉強中のところなので参考になります、どうもありがとうございました!
いや、グローバル変数はファイルをまたいでってことだな。 広域でも static 付けた ファイル内のみ有効なのはグローバルとは言わん。
なんでグローバル変数まで飛躍しちゃったんだ?
坊やだからさ。
284 :
デフォルトの名無しさん :2009/08/26(水) 10:04:16
typedef unsigned char UCHAR; *((UCHAR*)0x4AAA) = 0xAA; この場合0xAAが代入されるのはどこですか? 0x4AAA番地?0x4AAA番地に入ってるアドレスの番地?
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0x4AA0 xx xx xx xx xx xx xx xx xx xx XX xx xx xx xx xx このXXの部分が書き換わる
>>284 いろいろツッコミどころがありすぎるが
**((UCHAR*)0x4AAA) = 0xAA;
後者はこう
>>286 それは
>**((UCHAR*)0x4AAA)
に突っ込んでくれ、ってこと?
今時そんなコード書くなんて
坊やだからさ。
290 :
デフォルトの名無しさん :2009/08/26(水) 11:54:44
>>284 0x4AAA番地
おかしなレスはスルーしとけ
組み込みか
0x4AAA番地に入ってるアドレスの番地に何かを代入するなら
>>286 でよくね?
>>293 それならUCHAR**にキャストしないと
アッー
セグるんですけどどうやって原因の箇所を見つけ出したらいいですか。
printfデバッグ
printfを入れるのと入れないのとでセグる場所が変わるんですけどどうしたらいいですか。
変わらなくなるまでprintf入れまくれ
目視デバッグ
>>298 配列やポインタ操作で
予約している大きさを突破して書き込んでいるパターンかも
>>298 おそらく、どこかでスタック上のメモリーを壊しているか
初期設定されていないスタック上のデータをアクセスしている。
printfなどの関数を呼ぶとスタック上のメモリーが呼ばないときと変わるので
上のようなケースでは呼ぶ場合と呼ばない場合とで動作が異なってくる。
データを破壊している配列やポインタはどうやって特定すればいいですか 現代の科学技術ではこの問題に対して人類は目視デバッグでしか対抗できないのですか
304 :
デフォルトの名無しさん :2009/08/26(水) 23:00:26
つ デバッガ
釣りくさ
いや、ソース見せてみて サークリデバッグしとくから
cygwinでコンパイルすると警告が出ない。 メモリ破壊プログラム。 void sub(int** p) { *p = (int*)100; } int main(void) { int* p; sub(&p); return 0; }
pに100を代入しているだけだもんな。
mallocで割り当てられたアドレスと同じアドレスをちゃんと解放したのに クラッシュするなんてことはありえるんですか?
一見pに100を入れてるように見えるけど 実はアドレスの0x64(100)番地を差すって意味になってるとか?
わりい、ごめん。メモリ破壊しないわw
>>310 二回ちゃんと開放したらクラッシュするかもね
単に型が一致しないってエラーが出るだけか
デバッグしながら実行したら出た「DAMAGE after Normal block」 ってのググったらバグの内容だけはすぐに分かった。原因はまだ分からない あまりにも珍事だったんですぐ聞いてしまった。ごめん ほんと初心者の常識なんて当てになんないねぇ
デバッグ終了した くだらない書き間違いだったmalloc(10 + sizeof(int)) 見つけるのに2時間かかったが・・・ ありがとうございました
セグった後でそのアドレスの前後に何という名前の変数や関数が格納されているかを確認できないすかね。linux環境で。
今だから、ゲーム作る本買おうとして、はじめに読んだら、C言語を知ってて前提みたいなことかいてアンの だからやさしいC++って本買ったら、C言語からおしえやんの 猿でもわかるC言語みたら、いきなり数学やらすから蕁麻疹でてやめた
向いてないからやめて正解だと思うよ
ばかっ! あきらめたらそこで試合終了だよ!
いつまでも終わらない死合はもういやだお…
向いてない感じがばりばりだから 止めとくのが良いかと。 どの言語だって上になるにつれて難しくなってくるし。
向いてないとかすぐ人を遠ざけるw自分が知ってる知識をこれ以上広げたくない、俺がしってりゃいいw ちょっとばかしできたからと、直ぐ調子に乗るのがお前の悪いところだ
あなたがその博愛精神を生かして懇切丁寧に教えてあげれば宜しかろうと存じます。
>>324 与えられた時間内にそれなりの結果を出さないといけないんだよ
向いてないものにかかりっきりとか馬鹿じゃねーの?
アドバイスお願いします。 A,B以外の場合にプリントエフ文を実行させたくて作ったプログラム(プログラム三行目) が、Aの場合でも実行されてしまいます。 A||Bに直したらうまく実行されるようになりましたが、なぜなのかが理解できておらず 困っています。分かる方、宜しくお願いします。 if(A)printf(A) if(B)printf(B) if(!(A && B))printf(A,Bではありません)・・・失敗 if(!(A || B)printf(A,Bではありません)・・・成功
!(A && B) は、 (!A || !B) と同値だと、中学くらいで習ったような
(!A&&!B) が !(A||B) と同値なのも同じくらいに習うよな
!(A && B) = (!A || !B) だから、Bでない時でもAだったから実行されてしまったということ、 !(A || B) = (!A && !B) だから、!(A || B)でprintf(A,Bではない)の実行が成功したということ が理解できました。ありがとうございます! ただ、!(A && B)というのは 否定(AとB)なのに、 なぜ(A,Bでない)にならずに(Aでない または Bでない)になるのかが感覚的に理解できないのですが、 括弧内の&&論理演算子の偽が適用された(!で(&&)の真が偽に切り替わった)訳ではなく、 単純に論理的に考えると(AとB)の反対は(AかB)になる、ということなんでしょうか? 読みづらい質問で大変恐縮ですが、よろしければ回答お願いします。
331 :
デフォルトの名無しさん :2009/08/27(木) 10:34:37
ド・モルガンの法則は高等数学Aだと思うが。 俺がゆとり世代だからか。
>>331 ド・モルガンの法則ググって幸せになれました、感謝です!
自分は高校でも習った記憶ないのですが、文系特化した私立高だったので飛ばされたっぽいです。
>>318 1. ソースコードを目で追って確認
2. デバッグモードでコンパイルすると落ちた箇所の関数名とライン数が出るコンパイラもある
(gccは知らない)
3. デバッガーで実行し、落ちたところの状況を調べる。
4. gccでコンパイルするときにリンクマップファイルを出力する。
そのリンクマップファイルに書かれている関数のアドレス、外部変数のアドレスを目安につきとめる。
まあ、こんなところかな。
シンボル付きでコンパイル/リンクしてれば core と一緒にデバッガに渡せばすぐ判るだろjk
「セグる」って略はおかしいだろ。 Wikipedia を wiki と略すぐらいおかしい。
江川スグる
ソフトウェアキーボードのような他の窓などにキー情報を送るアプリとか簡単に組めるようになりますか?
主語が無いのでわからない。
341 :
デフォルトの名無しさん :2009/08/27(木) 18:18:29
Can you 〜? Can I 〜?
なおさらおかしいかもしれんが 「SEGVる」 はわりと使う
343 :
340 :2009/08/27(木) 19:06:39
主語が無いのでわからないとか国語力とかいうやつって やたらとコミュニケーションとかを重視して、技術力を忘れてるバカだよな。 だいたい339の言ってる事はわかるだろ。 何故そうやって主語が無いのでわからないとかいうんだろうな^^; 過去に、お前主語が無いよって指摘されたのか、主語を国語で習ってそれから使いだしたやつだよな(爆笑)
344 :
93,174 :2009/08/27(木) 19:11:17
テラワロス wwwwwwwwwwwwww
345 :
340 :2009/08/27(木) 19:15:09
なんで最近の馬鹿は 英語 コミュニケーション能力 を重視してるわけ?(笑) 過大評価し過ぎだろ^^; マスコミの影響だろうな。英語ができれば給料があがるとか。 ITが発達してきて忘れられてる物などのドキュメンタリー番組の影響を受けて やたらとコミュニケーション能力を過大評価しすぎ。 英語できないとだめ そんな事無い。日本で働いてるなら英単語くらい コミュニケーション能力 いらない 話かけて応答できるくらいで。 技術力がなくて仕事に興味が無いっていうやつは邪魔。 だいたい企業の紹介文に、明るく前向きにコミュニケーションがとれるかた! とIT系にやってるのはコンプレックスの裏返し。 ネクラ企業、怪しい企業とみられたくないように必死に女性などの画像をはって 明るくみられたいための手段(笑) だいたいお見通しですよ(爆笑)
346 :
デフォルトの名無しさん :2009/08/27(木) 19:15:50
340の言ってることが的中しすぎて反論できない(笑)
地球人と同等の知能でもことば通じない宇宙人と一緒に仕事したくないだろ普通 コミュニケーション能力が欠如してるやつってのは普通の人から見たらほとんど宇宙人とかわらないんだよ 自覚してくれまじで
主語を付けたとしてもまだわからんと思う。
うっせばーか!C++の本買ったからこんなショボスレこっちから出てってやるよ!
主語は「私」だろ。 日本語の口語では主語をはっきり言わないことが多い。 文脈や相互の立場から主語は暗黙のうちに理解されている。
>>350 (私は)ソフトウェアキーボードのような他の窓などに
キー情報を送るアプリとか簡単に組めるようになりますか?
質問です。 C言語の勉強をはじめたばかりで、下記の問題の正答に納得できない部分があります。 Q1:関数に数値を渡すために宣言する変数のことをなんと呼ぶか。 自分の答え:実引数 正答 :仮引数 Q2:関数を作るのは何のためか、簡潔に説明せよ。 自分の答え:プログラムとは関数の集まりであり、関数を作らない限り動作しないから。 正答 :機能別に関数を作り、それを組み合わせることでプログラム全体が完成し、 大きなプログラムでも作りやすくなるため。 Q1 実引数=呼び出し側の関数が関数側に渡す数値。 仮引数=関数側が呼び出し側から実引数を受け取るための特別な変数。 というように理解していたので、渡すための変数なら実引数のように思えたのですが、 なぜ仮引数になるのか。 Q2 大きなプログラム云々の前に、関数を作るのはプログラムをつくるためだと思うのですが、 なぜこのような正答になるのか。 長文ですみませんが、アドバイスもらえたら助かります。宜しくお願いします。
354 :
93,174 :2009/08/27(木) 19:47:22
>>352 ワロタ wwwwwwwwwwwwwwwwwww
>>352 こんなことに頭を使うより、具体的なコード作成練習をするべき。
>>352 Q1
「と理解していた」ていうけど、本来の意味を無視して自分勝手に解釈してるだけ
Q2
「云々の前に」というけど、これもまだ大したプログラムができない自分をを中心に
勝手に解釈してるだけね
357 :
93,174 :2009/08/27(木) 19:57:54
この「宣言する」というキーワードがミソだな。 俺が問題作成者なら 「関数に数値を渡すために宣言する変数」 →「関数に数値を受け取るために宣言する変数」  ̄ ̄ ̄ ̄ ̄ ̄
358 :
93,174 :2009/08/27(木) 19:59:07
>>355 まだ引数、仮引数、実引数あたりの知識が曖昧な感じなので、間違って覚えてたら
困ると思って質問しました。
>>356 仰る通り自分勝手に解釈しているので、どこが間違っているのか指摘してもらうために
ここで質問したんですが…ずいぶんな言い方されてますが、嫌なことでもあったんですか。
あんまり噛み付かないでくださいね。
これくらいで随分な言い方と感じてたら世の中渡り歩けないぞ
361 :
93,174 :2009/08/27(木) 20:06:07
気楽に行こうぜ wwwwwwwwwwwwwwwwwwww
363 :
93,174 :2009/08/27(木) 20:13:09
こういう、ひねくれた事ばかり言っているから 問題が素直に解けないんだな かっこわら
364 :
デフォルトの名無しさん :2009/08/27(木) 20:16:34
回答者でない、ましてやアドバイスもなく嫌味ばかり言う人間に礼儀正しくする必要は感じないのですが
ここはIDでないから自演で成りすましが多い。 バカがくだらないことしてるって鼻で笑って気にしないのが一番。
アドバイスがあればいいんだね。 main"関数"すらないプログラムだってかけるんだぜ。 よってプログラムを作成するために必須であるとはいえない。 char main = 0;
memcpyやCopyMemory関数を使えば、あるバッファから別のバッファへのコピーができます。 それに対し、あるバッファ(配列)を特定の値で埋めるような関数はないでしょうか? 例えば、DWORD型配列の先頭ポインタpBuffDstに対し、4要素分( 4 * sizeof( DWROD ) = 16[ Byte ] )すべてに0xfe8d9aを埋めたいときなどに使える関数です。 今はfor文で回して、各要素に順番に代入していますが、関数を使えば記述がシンプルになるほか、 速度面でも改善されるかもしれない、と期待しています。 (for文によるコピーよりもCopyMemoryやmemcpyのほうが断然速かった経験があるため) もし、そういう関数をご存知でしたら教えてください。 よろしくお願いします。 m(_ _)m
memset
あーすまんよく読んでなかった 自前で作ったらどう?
>>352 その問題からは、どっちが正しいとも言えない。
多分、初心者か中級者が作った問題なんだろうけど
問題が悪いとしかいいようがない
世の中渡り歩いてるなら、相手の意図を汲み取って回答するようにしよう
>>343 なんでそんな自己批判を繰り返すのですか?
>>367 for文で書いても普通に最速になるはず
memcpyが速い理由として、CPUの特殊命令(SSEとか)を使っている可能性が
あるけど、仮にそうでもよほど大きなサイズでないと for文との差は出ない。
>>365 ありがとうございます。煽り耐性身につけようと思います。
文句言うだけの暇人なんて気にしない!
>>366 参考になりました。Q2はプログラムとは基本的に関数の集まりであるから、と考えることにします。
>>377 私もこの問題は曖昧すぎるように思いましたが、初心者の時点で問題が悪い、と決めつけるのは
学習の妨げになると思っているので、他の方の意見が欲しくて質問しました。
あと、作った方は筋金入りのプロみたいですよ。間違っても良問だとは言えませんが。
欲しかった答えがもらえたので失礼します。ありがとうございました。
374 :
367 :2009/08/27(木) 20:51:05
>>368 ありがとうございました!
速度はあまり変わりませんでしたが、勉強になりました!
>>372 う〜ん、for文の二重ループで1920x1080の画像を同サイズのバッファにコピー移ししたときに
計測(QueryPerformance〜を利用)しましたが、
for文記述: 約3.0[ms]
CopyMemory: 約1.6[ms](memcpyもほとんど同じ)
でした。
CPUはCore2Duo E8600@定格です。
VC++の設定で「拡張命令セットを有効にする」は設定なしにしているので、SSEとかは
入ってないはずです。
不思議ですね・・・(汗)
375 :
368 :2009/08/27(木) 20:54:16
x86の命令に大量に転送するために使うのがあったはずなんだわ その関数の中ってアセンブラでかかれてない
>>373 必ずしも関数の集まりである必要はないんだけど、なぜ関数の集まりになっているのかというと、
先の回答の通り。
>>372 for文回すときでも、アライメント合わせて複数バイトまとめて転送とかは基本テクニック。
あとパイプラインを乱さないために、ループ一回で16byteくらいはコピーした方がいい。
378 :
372 :2009/08/27(木) 21:02:27
>>374 for文がバイト単位でコピーしてるなら、copymemoryの方は
アライメントを揃えてワード単位でやってるかもしれない。
逆にいうとそれぐらいの工夫はfor文でも普通にやるもんだと思う。
あと確かに
>>375 のいう命令(loopだっけ)で効率化されるけど、
ほとんどの時間はメモリアクセスに掛かってるんじゃないかなあ
>>374 4byteデータでfillする話と
for文の二重ループで1920x1080の画像を同サイズのバッファにコピー
の話はまるで違うように思わんでもないが
for文で2重ループももったいないな
381 :
372 :2009/08/27(木) 21:06:40
あ、思い出した。rep プレフィクスか
382 :
368 :2009/08/27(木) 21:08:39
そうそう rep movsd とか
383 :
368 :2009/08/27(木) 21:09:44
384 :
367 :2009/08/27(木) 21:14:06
>>375 なるほど。
そうだったんですか。
>>377 >>378 アライメントというのを考慮しないといけないんですね。
ありがとうございます。
>>379 はい、それはまた別の話です。
あと、1920x1080とは言いましたが、UYVY形式になっていますので、RGB形式とはちょっと違ってきますね。
385 :
367 :2009/08/27(木) 21:15:04
以下に単純コピー時のコードを記します。 DWORD *pBuffSrc; DWORD *pBuffDst; ・・・ (pBuffSrcに画像データが入る) ・・・ W = 1920 / 2; H = 1080; // pBuffDstにコピーする for( int Y = 0; Y < H; Y++ ) { for( int X = 0; X < W; X++ ) { *( pBuffDst + X ) = *( pBuffSrc + X ); } pBuffSrc += W; pBuffDst += W; } ------------------------------------------------------------- 関数コピーの場合のコードを以下に記します。 CopyMemory( pBuffDst, pBuffSrc, DataSize );
386 :
368 :2009/08/27(木) 21:16:33
>>384 x86はアライメント無視しても実行速度低下というペナルティで済むけど
他のプロセッサはアライメント無視すると実行不可になるから
387 :
368 :2009/08/27(木) 21:18:49
>>385 for文を一つにしたらどう?
ピクセルデータといえど 縦 x 横 / バイト数 分繰り返すのも同じだし
あーすまん >縦 x 横 / バイト数 分繰り返すのも同じだし これ変だな 縦 x 横 分繰り返すのも同じだし
動画のエンコードで左右比較したいって言ってた人か 左側だけ新しいのを貼り付けたいってこと?
とおもったら半分に限ったわけでもなかった。 1重に落とすのが楽だろうね
392 :
367 :2009/08/27(木) 21:32:04
>>386 x86は寛容ですね!
>>387 >>388 >>390 ありがとうございます!
一重にしたらかなり高速化されて、CopyMemoryとほぼ同じ1.4[ms]となりました!
(それでも若干(70[us]ほど)まだCopyMemoryのほうが速いです)
ありがとうございました!
393 :
368 :2009/08/27(木) 21:36:33
>>392 寛容というかアライメントの話は8086までさかのぼるんだけどねw
x86はひたすら互換を維持することで今まで拡張されつつ残ったCPUだからねえ
8086はx86じゃないのか?
395 :
368 :2009/08/27(木) 21:49:17
そうだよ ただアライメントの話をするにはどこからそうなってるかというので8086とあえて言ってるだけ 8086をベースにモードが増えたりレジスタを拡張したりそれまでは バス速度とCPUの速度が一緒だったのをCPUだけクロックあげる仕組みいれたりと・・・
int count = H * W; while (count--) *pBuffDst++ = *pBuffSrc++; とやるのはどうなんだろうか。
397 :
363 :2009/08/27(木) 22:03:25
うんちくび
398 :
デフォルトの名無しさん :2009/08/27(木) 22:05:05
レス番コテばっかでワケワカメ
idほしいよね
const DWORD *pSentinel = pBuffSrc + H * W; do { *pBuffDst++ = *pBuffSrc++; } while (pBuffSrc != pSentinel) このほうがいいかなぁ。 だけど、CopyMemoryで実現できることをなんでわざわざループでどうにかしようとしているんだろう。
401 :
363 :2009/08/27(木) 22:08:54
お世話になります。現在、C言語を勉強中なのですが以下のプログラムでわからないことがあります。 #include <stdio.h> #define MATHMAX 1000 typedef struct{ char mathbox[MATHMAX][MATHMAX]; } MATH; int matharr(MATH *math){ long int roop1, roop2; for(roop1=0;roop1<MATHMAX;roop1++){ for(roop2=0;roop2<MATHMAX;roop2++){ math->mathbox[roop1][roop2]=1; } } return 0; } int main( void){ MATH math; matharr(&math); return 0; } 現在、構造体の勉強中なのですが、これは間違っていますでしょうか? MATHMAXの値を大きくすると、セグメンテーションフォルトになってしまいます。
>>401 4byteデータでfillしたいという話ならループの話に持ってってもいいけどねえ。
なぜ画像コピーの話になったのやら。
405 :
363 :2009/08/27(木) 22:10:53
>>403 スタックに巨大な領域を確保しようとしているから
とりあえずは static を追加すればおk
int main( void){
static MATH math;
matharr(&math);
return 0;
}
408 :
デフォルトの名無しさん :2009/08/27(木) 22:12:36
>>403 int main( void){
MATH math;
この確保だとスタックという場所にMATHが確保されるんだけどスタックはそれほど大きな場所じゃないので
エラーがでます
mallocで動的に確保するかstaticで確保しましょう
410 :
363 :2009/08/27(木) 22:12:57
411 :
363 :2009/08/27(木) 22:16:49
主語が無いよ 日本語でおk と言われて不快だろ? 人に言われて嫌なことを言うな。
412 :
デフォルトの名無しさん :2009/08/27(木) 22:18:43
>>410 こういう、ひねくれた事ばかり言っているから
問題が素直に解けないんだな かっこわら
413 :
403 :2009/08/27(木) 22:19:16
皆様ありがとうございます。 スタックと言うものを少し調べてみたのですが、プログラムの間違いではなく、OS?の仕様と言う認識でよろしいでしょうか?
staticはスタックのことでよろしいですか
>>411 やられたらやりかえすのは悪いクセだということを小学校で習わなかったかい?
>>415 いえ
staticをつけると実行ファイルの中に確保されます
>>417 初期化してなければそうでもないんじゃね?
初期化してないっつーのは、要は全部 0 ってことな。これもまあ初期化ではあるけど。
staticはスタックに確保されるかって質問に「実行ファイルに確保される」って答えはおかしいよな
>>420 初期化の有無とかでかわるのかも知れないがstaticをつけると実行ファイルの中に
すでに組み込まれてる場合もあるよ
その場合はスタックでもないし
>>422 そりゃ、実行ファイルはstaticがどう初期化されるかって情報を
持ってるだろうけど「実行ファイルに確保される」は変だろ。
>>415 場合によって意味が変わるから本を読むとかググって調べるといいよ
>>423 じゃあなんというんだいw
実行ファイルがstaticありとなしで配列分程度サイズが増減する場合はどこにあるっていうんだよw
実行ファイルがメモリにロードされた時点でメモリに存在するし
配列はスタックの上には無いぜ
mallocで確保したわけでもない
あんな質問馬鹿にされるかと思ったのになんて有意義(そう)な議論やってるんだ 俺は感動したよ
実行ファイルがどうこうと、プロセスになってからの挙動は、レイヤーが違うからなぁ。
初期値があるんだから実行ファイルの中に無かったらおかしいだろ。 文字列リテラルだって実行ファイルの中にあるわさ。 わざわざコピーする手間省くためにロードしたそれをそのままアクセスしてるだけだろ。
429 :
367 :2009/08/27(木) 23:13:55
>>396 考えてくださって、ありがとうございます。
結果は約3.0[ms]でした。
>>400 結果は約2.5[ms]でした。
>だけど、CopyMemoryで実現できることをなんでわざわざループでどうにかしようとしているんだろう。
僕が「forループでコピーするよりCopyMemory等の関数のほうが速い」と言ったのに対して、
そんなことはなく、ループでも同等に速くなるはず、という意見をいただいたからで、
それを実証すべく、ループでのコピー方法を考えるという流れになりました。
>>428 そこはぜんぜん否定してないよ。
「static変数はスタックに確保されますか?」って文脈だと
「実行ファイルに確保される」って答えは変って話。
static変数はメモリーにロードするときのアドレス解決の情報のみが実行ファイルに格納されている。 初期値があれば初期値も入っている。 ということではないかな?
char *p = "Fack you."; p[2] = 'u'; こういうのって許されるの?
>>432 ふつうのコンパイラではダメでしょ。
"Fack you."の文字列が格納してあるところにセグメント/ページにwriteプロテクトをかけている。
writeプロテクトを設定しないコンパイラ(環境)だったら許される。
実行ファイルに確保ってどういう事だよ… 実行時に静的領域に確保されるんだろ?
そんなこと規格書に書かれているのか
>>435 言語か?それともコンパイラか?OSか?
>>436 お前どんだけ無能なんだよww
規格とヘルプの違いも知らんのか。
ローダーが読めなきゃだめだろ
441 :
400 :2009/08/28(金) 01:08:36
>>429 あれ、おそくなっちゃった?ごめんね><
>>437 何言ってるのかわからないので放置しまう^p^
>>434 だから環境によるって何度も言われてるじゃないか。
初期値があれば勿論のこと、なくても
定数 0 の羅列が実行ファイルに確保されることだってある。
444 :
デフォルトの名無しさん :2009/08/28(金) 12:06:42
今年開成高校に入学した者ですが、C言語を独学で勉強したところ夏休みだけでマスターしてしまいました。 最近はP2P技術に興味がありwinnyなんかのソースを解読したいと思っています。 大学レベル程度のことでしたら独学でいけますが、ハッカーになるためには次に勉強するべきことは何でしょうか? 英語はTOEIC730ぐらいです。
そういえば家の研究室にTOEIC950持ってるやついたな 俺?おれ420ですよ論文やばい
446 :
デフォルトの名無しさん :2009/08/28(金) 12:13:23
論文ってことは大学生ですか?大学生で420とかやばいですね。
TOEICって新しいC言語ですか
博士課程れす^p^ めっちゃやばい日常会話ができない
449 :
デフォルトの名無しさん :2009/08/28(金) 12:18:23
なんか最近変な奴が多いな。 夏だからか。。
>>444 > ハッカーになるためには次に勉強するべきことは何でしょうか?
それくらいググればいくらでも出てくるだろ。。
ってかC言語マスターしたならそれでいいんでね?
まず必要なのは日本語の勉強じゃね? スレタイに書いてある程度の漢字も読めないみたいだし。
マジレスするなら次はC++のマスターだな winnyはC++で書かれてるはずだし
開成行くような奴がハッカー…高卒でもなれるもん目指してどうするよw
俺はFランだが、ガキの頃から独学でやってきて今ココ。
開成に外部からじゃ肩身がせめーだろw
英語の自慢がしたいだけだよ。 スルーしておけ。
460 :
デフォルトの名無しさん :2009/08/28(金) 15:18:29
結局もう出てこないしな。
>>443 スタックじゃなければどこよ?って話なんだから実行時のメモリの使い方だろが。
初期値がどこに確保されるか?って話じゃないのに何故実行ファイル?
結局実行ファイルがロードされた領域の名前を誰も挙げないってことでFA?
すみませんが以下のプログラムの::の意味を教えてください while(1) { Move1(); ::Sleep(10); } 「::」でググってもうまくヒットしてくれない
>>463 C++
スコープ解決演算子
名前空間の中にも同じSleep()という関数があり、それと
区別してWin32 APIのSleep()を呼び出す
#include <stdio.h> void convert(long num,char str[]); int main(void) { char str[80]; char u[80]="4"; long i; i=1234567;// 1,234,567 convert(i,str); printf("%s\n",str); return 0; } void convert(long num,char str[]) { int i=0,j=0; char table[]="0123456789"; char tmp; do{ str[j++]=table[num%10]; num/=10; i++;
if(i%3==0 && num!=0) { str[j++]=','; } }while(num!=0); str[j--]='\0'; for(i=0; i<j; i++,j--) { tmp=str[i]; str[i]=str[j]; str[j]=tmp; } } これって出力結果が1,234,567になるけど i%3の時に,を入れるって書いてありますよね? いれたらかぶっちゃいませんか? str[3]=4にして num/=10 iが3だから str[3]=',' 4が消えてしまうんですが。流れが全然よめません。どなたか詳しく教え てください。
>>465 > char table[]="0123456789";
これ無駄だろ。
char *table="0123456789";
にしろよ。
>>469 IPAの基本情報の午後問題にtable[]って書いてあったんだけど(笑)
俺ならこうだな。 str[j++]="0123456789"[num%10];
インクリメントがちょいわからなん do{ str[j++]=table[num%10]; num/=10; i++; if(i%3==0 && num!=0) { str[j++]=','; } }while(num!=0); i++ってループをぬけたら+1だっけ? それともi++をやった直後+1だっけ?
ケン・トンプソンの埋め込んだバックドアってどんな方法で偽装してたの?
なん……だと……!?
480 :
デフォルトの名無しさん :2009/08/29(土) 03:47:12
ブロック文について質問です。 ブロックを何重も使ってプログラムを書いた場合、1つのブロックの範囲がどこまでなのかがわかりません。 例えば下のようになっている場合、一番はじめの { が閉じられるのは4番目の } なのか、最後の } なのか、という感じの疑問です。 { { { } { } } } また、ブロック文について参考になるサイトがあったら教えてください。よろしくお願いします。
インデントしろや。 それと、対応するカッコがすぐ見つけられるエディタ/開発環境使えよ。
>>480 }はそれよりも前の一番近い{と対応する、というのが本来の考え方だけど、
一番内側の{}ペアが一つのブロックになると思えばいいよ。
そのブロックをさらに挟み込む形でブロックがあって、一番外までという感じ。
483 :
デフォルトの名無しさん :2009/08/29(土) 05:37:47
>>481 ー482
ありがとうございます。
{ が単純に次の } に対応してしまう訳ではなく、下位ブロックからきちんとセットで認識していくと分かって納得しました。
見やすいプログラムを書けるよう気をつけようと思います!
算数の()と同じ考え方で、悩むようなことはないと思うんだが。
>>480 これで悩む理由がわからん
直感で理解できるだろう
プログラム向いてなさそう
486 :
デフォルトの名無しさん :2009/08/29(土) 07:44:27
>>485 例えば、 { { } という打ち間違いがあった場合にどういう判断がなされるのか(どういった手順でブロックを認識していくのか)という意味を含んだ質問だったのですが。
下手な質問でまさに知りたかったことを教えてくれた
>>482 さんと比べて、
>>485 さんは思考が安直ですね。
嫌味とか通じなさそうw
>どういった手順でブロックを認識していくのか こういう話がしたいんだったらCスレから離れて構文解析等のキーワードでぐぐるべきだな
むしろ本読むなりコンパイルしてみるなりで解決できることなのに 燃料として機能するとは…
{}が初見で理解できない低脳が嫌味とか、なんの冗談だよw
490 :
デフォルトの名無しさん :2009/08/29(土) 08:03:53
ハイハイ、アルゴリズム体操だよ(^^) 文字列走査してー 開き括弧('(', '{', など)に出会ったらー、スタックに push push ! 閉じ括弧(')', '}', など)に出会ったらー、スタックから pop pop ! して 対応するものと == 演算子で比較するお (^^
491 :
デフォルトの名無しさん :2009/08/29(土) 08:15:42
{} だけでいいのなら、括弧が開いていることを示すフラグを用いるのもおk。 開きおっぱい括弧 { に出会ったらフラグ反転。 閉じおっぱい括弧 } に出会ったら、フラグの値が真(=括弧が開いている)なら 括弧終了ということで、またフラグ反転。
492 :
デフォルトの名無しさん :2009/08/29(土) 08:18:46
後付して言い訳してるけど、どう見てもブロックの範囲とは関係ないと思うが。
この前の
>>352 と同じ人でしょ?
ケンカの売り方が似ている・・・
>>486 コンパイラの立場にたって考えればすぐ分かる内容だな。
496 :
デフォルトの名無しさん :2009/08/29(土) 09:47:42
最近頭のおかしいのがまた復活したからな。 成りすまされたくなかったらトリップつけたほうがいいかも。
括弧はちゃんと両側用意されてるから良いんだけど、 引用符って片方しかないんだよね。 “ ” ‘ ’ が正しい筈なのに、後ろの一つずつしかない。 特に ' は引用符でない記号とも共用だしな。
ネストしないなら記号一つで十分だし
そりゃそうだ
入門の質問であればあるほど荒れるなぁ /* /* */ */ も置いておきますね
lisp暦12年の俺の出番だな
503 :
デフォルトの名無しさん :2009/08/29(土) 15:11:55
ワロタ w
504 :
デフォルトの名無しさん :2009/08/29(土) 16:14:16
>>490 ありがとう
長年悩んでいた問題が氷解したw
>>490 俺もそれやってみたら、股間にストレッチパワーが溜まってきた!
C言語について質問があります。 フレーム(frame)という構造体へのポインタ配列を メンバにもつブロック(block)という構造体を作りたいんですが。。。 blockはframe(mallocで動的に確保する)を任意の個数 持つとして、 struct block { frame * buf[]; } という構造体を宣言した場合、実行時に buf[0] = (frame*)malloc(sizeof(frame)); といった書き方ができますか? この場合、コンパイラはbuf配列の個数が わからないような気がしますが。。。
>>506 規格では保証されてないけど
struct block {
frame *buf[1];
};
としといてblockの領域を大目に取って置いてframeを
mallocで1を超えて確保する事はよくある
何回も言うけど規格で動作は保証されてないので
本当は鼻から悪魔
でもなぜかよく使われるテクニック
>>507 ご教授、ありがとうございます。
構造体の内部で、
frame *buf[];
とした場合、
frame *buf[1];
とコンパイラは判断するということでしょうか?
C99なら似たようなことは可能 struct frame { int foo; }; struct block { unsigned size; struct frame *buf[]; }; void * malloc(); foo(bufs, nbufs) int *bufs; unsigned nbufs; { struct block *blk = 0; blk = malloc(sizeof(struct block) + sizeof(struct frame *)*nbufs); blk->size = nbufs; for ( unsigned i = 0; i < nbufs; ++i ) { blk->buf[i] = malloc(sizeof(struct frame)*(i+1)); } return 0; } 規格のセクションは、ガチ規格スレで聞いてくれたら答える
>>509 ありがとうございます。
この場合、
struct block {
unsigned size;
struct frame **buf;
};
としないのは、
使用する側に、bufはポインタ配列であることを
明示するのが目的なのでしょうか?
度々の質問ですいません。
>510 ただC99なら最後のメンバが配列の場合要素数を省略できることを示したかっただけ ポインタ配列であることを明示しているわけではない で、コンパイル通るように適当に作ったのでbufs使うの忘れていた >510の場合はまた違う確保の方法になるだろ 一例としては struct block *blk = malloc(sizeof(struct block) + sizeof(struct frame *)*nbufs); blk->buf = (char *)blk + sizeof(struct block); blk->buf[i] = malloc(sizeof(struct frame)*nelems); もっと効率よく一度にメモリを確保してもよい
>>508 違う
frame *buf[]; はコンパイルエラーになるから
frame *buf[1]; としている
このテクニックはメモリがシームレスに連続している事を前提として
いるから、規格は無視してとにかくこうしないと困るという場合に
用いられる事が多い
513 :
デフォルトの名無しさん :2009/08/29(土) 19:13:25
以下のように初期値を入れる処理を書いたら上司に怒られました。 long n = 0; 以下のように書くべきだといわれました。 long n = 0L; C言語の本を読めば分かるといって理由は教えてもらえませんでした。 サフィックスをつけないといけない理由が分かりません。 誰か教えてください。
C99とか現場でも使われてないのに初心者に教えんなよ
>>513 long 型だから
よほど古いコンパイラを使ってるのでない限り気にしないけど
516 :
513 :2009/08/29(土) 20:06:20
サフィックスをつけないと、どんな不具合が発生するのでしょうか。
>>516 0なら特に困ることはないよ。
longがintより大きい環境で、intを超えた定数のときはLをつけないとエラーになるんだったかな?
もう忘れた。
int → long の変換が実行時に行われる。かも 大抵のコンパイラならコンパイル時に何とかしてくれるはず
intとlongのサイズが違う環境だと ↓こういうときもLをつけないとバグるかな? printf("%ld %d", 10L, 20); ただの代入だと、困るようなことはないと思う。
520 :
513 :2009/08/29(土) 20:35:55
皆さんありがとうございます。 もっと致命的なことが、起こるのかと思っていました。 私は経験もそんなにないのですが、先輩に指摘された long n = 0L; のような初期化は現場で一般的にどこでも使われるのでしょうか?
>>520 一般的ではないんじゃないの?
上司の言うとおり、Cの本を適当にいくつかみてみて、longの変数に
代入してる箇所で、Lがついているか確認してみたら?
そんなにつけたくないならつけなきゃいいじゃん。 long val = 2000000000 + 2000000000; とかしちゃえばいいよ
過去に付けるべきところに付けなかったアホが居た職場だと、 そういうバカなルールが出来ることはままあるな。
f の付け忘れは稀によくある話
506です。 丁寧にありがとうございました。
char型の配列の要素はひとつ1バイト、int型の配列の要素はひとつ4バイトで 要素番号0からメモリ領域が連続しているってので合ってますか?
あってる
sizeof(int)は環境依存で4とは限らない。
今int=2バイトのプロセッサでC言語使う開発ってあるのかな? int=2バイトだとそのままアセンブラで組みそうだけど
逆に64ビットでint8バイトが主流になるかもよw
longなら8バイトになった環境もあるが、intは4バイトのままだなぁ
搭載メモリ16GBとかが普通になったらintも8バイトになるかもね
>>533 そういえあ64bit windowsの場合アプリケーションが使える最大メモリはかわってるんだっけ?
32bit windowsは2GBが最大だっけ?
intが8バイトだと、4バイトの整数使いたいときに困るなぁ。 shortを4バイトにしたら、今度は2バイトの整数使えなくなるし。
534 1プロセスが最大2GBな メモリ自体は3GBまで認識=32bit 64bitはどうなんだろう 果てしなく大きい事は確かだが
>>536 理論上は果てしなくだがPC業界ってなぜか中途半端なところを最大にしちゃうから幾度となく拡張する羽目になってるよねw
HDDとか言い例だし
まあ新しく変われば物が売れるからいいのかねw
x86のレジスタのように素直に元の名前はそのままにしてくれるほうがいい
>>535 まあその頃には
int32_tやint16_t型が、
独自拡張も含めて、「当然のように使える」という状態になってるよ。たぶん。
32bitをカバーできないなら、__int32 とかが使われて、ね。
その変わりx86-64のアーキテクチャは目も当てられないほど ひどい物になってしまったけどな まあ幸いな事に命令コードに関してだけで、ハードウェア的には まずまずの線を行っているのでまだよかった
>>540 差し当たってtime()の返すtime_tはまず64bitにされる罠
>>536 Windows x64 では、1ユーザープロセスは8TBまで。
2GBの400万倍。
>>538 例えばポインタとかデータサイズを256bit長にしたとして、それで解決すると思う?
現時点では処理が重くなってメモリも無駄に消費するだけだけど、いずれ足りなくなって拡張することになる。
「そんなバカな、256bitもあれば人類が滅亡するまで大丈夫だろ」って議論は過去に何度もなされてる。
歴史が繰り返した結果が今のぐちゃぐちゃの規格なわけだ。
これはある程度経験を積まないと理解できない話なんだけど、
一般的には、最初から保険をかけておくより、足りなくなってから拡張した方がコストは安く済むんだよ。
546 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 08:28:37
世の中には可変アドレッシングといううわなにをするくぁwせdrftgyふjlp;@:「
ちゃんとくぁせふじこってやれよ
if文を一行で書くことは推奨されますか。 if(...) { ... } みたいな。
550 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 13:36:36
一行で書くときはオッパイ括弧は省略するかな。 if (...) break; みたいな。
551 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 13:39:26
逆を言うと、オッパイ括弧を付けるときは必ず複数行に書くようにしている。
pascalと同じ流儀だね 複文を書くときはbegin-endで囲み、単文の時は書かない
そして if(...) 処理; 後から追加した処理; とかやらかしてプギャーするんですね分かります。
それはない やった事は一度も無い
555 :
名無しさん@そうだ選挙に行こう :2009/08/30(日) 13:47:38
>>533 うん、そういうのが嫌だから、基本的には
if (...) {
...
}
を使っている。ただ、ループを抜けるときの式(break文のみ)などのときは
>>550 の方が好み。
昔はbreak, returnの時はif ( cond ) statement;だったけど 今はコードを統一するために if ( cond ) { statements; } にしている、スタイルを統一することは重要 確信犯的に for ( x; y; z ) for ( u; v; w ) { if ( c ) s; } こんなの見てびっくり、マジ止めてほしいわ
インデントだけだと、
>>553 みたいなことやらかす可能性高いよな。
ない あるとすればインデントを間違えた時だけ
自動インデント機能使えば、そういうミスはないけどな。
Visual Studioって switch case 文を入れ子にすると インデントめちゃくちゃになるよね。
>561 kwsk
↓ここらへんのソースを見るとふつーにifの波カッコを省略してる。 linux git postgresql subversion firefox python apache vim ruby gimp OpenOffic jdkのライブラリのソース 机上の空論じゃなくて、実践でばりばりコードを書いてる人たちは、省略したってバグるとか思ってない。
前にもどこかで同じようなの見たなぁ
できる人だけを基準にしていいなら、そういうことも言ってられるんだけどね。
こういうのはできる、できないって関係ないでそ。 高度なコードを書いたりする人は、ケアレスミスもぜんぜんしないとかってわけじゃないだろうし。
自分の書いたコードが他人にメンテされるような環境の人じゃないんだろ。 趣味でやってる人かな。
>>563 これって、趣味レベルで、他人にメンテナンスされないプロダクツなんだ。
ぽまいらはC++ Coding Standardsとか読まないのか?^^ { }をつけるかつけないかみたいな些細な話は チームで統一すべきコーディング標準の中には含まれないって書かれてるじゃろ。 重要なことは自分自身の書くソースコードの中では「一貫性を保つこと」であって 他人のコードに強制するのは間違っている、とも。本嫁よ、夏休みなんだから^^
現場が本に書いてある通りに回るなら、誰も苦労なんてしないw
int array[10] = {1,2,3,4,5,6,7,8,9,10}; i = sizeof(array) / sizeof(array[0]) printf("%d\n",array[i]); という感じにsizeof演算子で求めた要素数を変数に代入して、要素番号として使うことは無理なんでしょうか?
>>571 要素数でアクセスすると配列の最後の要素を1超えた要素になるよ
アドレスを取る事は許されるが要素の参照は許されない
>>553 俺は結構このミスやらかすな。注意力が足りないのかな・・・
if(...)|
処理;
VC++のエディタだとif文の括弧の右側にカーソルがあるときにエンターを押すと、
if(...)
|
処理;
↑の場所にカーソルが来るんだよ
自分がミスをする人間なら
>>555 みたいに書けばいいと思う
>>572 ありがとうございます。
では求めた要素数-1すればおkですか?
>アドレスを取る事は許されるが要素の参照は許されない
申し訳ないです、勉強はじめたばかりで理解できないので、
もう少し詳しく教えてもらえないでしょうか?
>>574 int array[10] = {1,2,3,4,5,6,7,8,9,10};
i = sizeof(array) / sizeof(array[0])
printf("%d\n",array[i-1]);
printf("%p\n", &array[i]);
みたいな感じ
配列のいんでくすは 0 から 要素数-1 だ。おけ? 要素数を超えた"アドレスそのもの"までは使うことはできるが、アドレスが指している"要素"を使うとアクセス違反になる。おけ?
知らないなら今のうちに覚えておこう、「半開区間」。 件のケースなら[0.10)のように記述する。 0以上10未満。10を含まない。 10-0=10で、要素数10個と簡単に計算できる。 for ( int i = 0; i != 10; ++i ) が何回ループするかなど、簡単におまんこできる。
>>575 >>576 >>577 printf("%d\n",array[i-1]); がエラーになっちゃうのは何故なんだ・・・。
皆様の教えてくれたことを理解する作業に入ります。ありがとうございました。
>>578 そりゃ変数 i が定義されてないからでしょ
>>579 セミコロン忘れてました。バカスw
ご指摘どうもありがとうございました!
581 :
デフォルトの名無しさん :2009/08/31(月) 02:25:41
初心者におすすめの本を教えてください
ローベル
ロベールの翻訳は分かりやすい
初歩のラジオ
猫でもわかるは、ソース量多くて嫌になる
586 :
デフォルトの名無しさん :2009/08/31(月) 16:44:09
すまん教えてくれ 新入社員からdelete[]pを使わなく良いかと質問があったんだが 現実的にdelete pで良いんだよな?
C++スレ逝け new[]で確保したらdelete[]pで解放しないと鼻から悪魔だぞ
もしかしてC++でも使っているの スレ違いだが簡単に答えると意味に違いがある delete[] p;はp = new T[n];の時、delete p;はp = new T;の時 メモリの管理情報が異なるので使い分けなければならない
デストラクタが呼ばれないだけで悪魔は出ないわ
590 :
586 :2009/08/31(月) 16:59:25
ごめんスレ違いだった
>>587-
>>589 ありがとう仕様として知っていたけど
return 0; return (0);程度の違いだと思っていた
>>590 とりあえずEffective C++を読むといいよ
英語版はどっかの誰かがWebに載っけてたと思うし
593 :
デフォルトの名無しさん :2009/08/31(月) 21:33:56
C言語であるパラメータの構造体のアドレスをゲットする関数について教えてください。 例えば typdef struct AAAAA{ int a; int b }AAAAA_t; のような構造体がある場合、 get(int param) { ????? } を下記のようなmain関数から呼び出すと、paramに上記構造体のアドレスが返却されるという ものを実装してますが どうしてもうまくいきません。 宜しくお願いします。 int main(void) { get( ??? ); }
595 :
デフォルトの名無しさん :2009/08/31(月) 21:38:44
いろいろ調べたり、実装してみたのですが、なかなかうまくいきません、 ヒントだけでも構わないのでお願いします。
>>593 void get(AAAA_t** param) {
*param = &どこかにあるAAAA_tの実体;
}
こういうこと?
文面からすると初心者っぽいけど、いまからこんな変なコードを書くのはお勧めしない。
597 :
デフォルトの名無しさん :2009/08/31(月) 21:40:50
get()の引数はあくまでint型でポインタではないのです。 596さんのおっしゃるようなAPIだとうまく実装できるのですが・・・
>>597 ポインタ使わないとどうやってもmain()に値を返すことは不可能だよ。
599 :
デフォルトの名無しさん :2009/08/31(月) 21:48:37
多分get()の引数は int main(void) { AAAAA_t a; get((int)&a); ] となるような気が。。
AAAA_t* a; get((int)&a); void get(int param) { *(AAAA_T**)param = &実体; } で、できるね。一般的な64bit環境では動かないだろうけど。
601 :
デフォルトの名無しさん :2009/08/31(月) 21:58:45
<<600 ありがとうございます。 試してみます! >一般的な64bit環境では動かない よくわからないので簡単におしえてください。 Linuxでも動かないですか?
一般的な64ビットの環境だとポインタ型は8バイト、int型は4バイトってことでは
試してから言え
なんで get(int param) { ????? } の形式じゃないといけないのかがまったくわからない。 なにか根本的な勘違いをしてる気がする。
もっと高水準の言語を使っていて その機能をCで実装したいとかなのかなあ 自分も以前、配列を渡して要素数を返す関数を書こうとしてはまったことがある
>>593 アドレスだろうが何だろうが
param で返すのはダメだろw
ひどすぎる……
607 :
デフォルトの名無しさん :2009/08/31(月) 23:05:53
/* code を改良せよ */ if ( !(c == 'y' || c == 'y') ) return; length = (length < BUFSIZE) ? length : BUFSIZE; flag = flag ? 1 : 0; quote = (*line == '"') ? 1 : 0; if (val & 1) bit = 1; else bit = 0; と 云う様な物なのですが 着目点が掴めないので助言をして頂けないでしょうか…
普通に&aでいいと思うのだが…何がしたいのだろう???
>>607 その問題の模範解答が改良かどうか疑問なので
分かったら教えて欲しい
下は改良というより書き換えただけ
改悪と言えなくも無い
'y' は両方小文字であってるのか?
if(toupper(c)!='Y') return;
if(length>BUFSIZE) length=BUFSIZE;
flag=!!flag;
quote=(*line=='"');
bit=val&1;
先越されてしまった。 flagについては、 if(flag) flag = 1; の方が代入が一つ減る可能性あるかな。
612 :
デフォルトの名無しさん :2009/08/31(月) 23:22:02
>>610 小文字では在りませんでした…
if ( !(c == 'y' || c == 'Y') )
return;
こうです
613 :
デフォルトの名無しさん :2009/08/31(月) 23:37:55
>>612 plus
打ち込み miss です
取り敢えず レスして頂いた source を比較して着目点を考える事にします…
上がって居る時に またお願いします
614 :
デフォルトの名無しさん :2009/09/01(火) 00:38:05
>>613 plus
もう一つ打ち込み miss が在りました…
flag = flag ? 0 : 1;
こうでした…
レスしようと思ったら
>>610 と全く一緒だったでござる
616 :
デフォルトの名無しさん :2009/09/01(火) 01:16:14
ちょっとスレの意図とずれるかもしれないですが 日経ソフトウェアのMissionCのようなC言語学習ソフトがあったら教えてください
618 :
デフォルトの名無しさん :2009/09/01(火) 01:31:37
/* 次の部分の問題点は何か */ int read(int *ip) { scanf("%d", ip); return *ip; } insert(&graph[vert], read(&val), read(&ch)); 個人的に source に問題点が無い様に思えて仕方在りません 着目点も分からないのです… 今度の source は打ち込み miss は無いです 二度 確認しました…
>>614 flagに1と0しか入らないことが確実なら
flag = 1 - flag;
とでも書かせたいのかね。
flag ^= 1; の方がいいかも
flag = !flag; だとおもうんだけど
>>618 2個あるread呼び出しのうち、どちらが先に呼ばれるかが分からないのが問題
>>621 そう思うんならそれでいいんじゃね?
実行速度とか気にするほどのもんでもないしな。
>621 それは改良じゃなくて、改悪w
>>619-620 はflagに1と0しかはいらないという勝手な思いこみの上でしか動かんでしょ?
flagという変数名とflag = flag ? 0 : 1;この文を見て、 それ以外の可能性を考えるほうが不自然だと思うが。 そもそもflag = flag ? 0 : 1;より劣るflag = !flag に改悪しちゃいかんよなw
何が劣るの?
なんか言い方がアレだったかもしれないのでこれ置いときますね flag = flag ? 0 : 1; 00411A25 xor eax,eax 00411A27 cmp dword ptr [flag],0 00411A2B sete al 00411A2E mov dword ptr [flag],eax flag = 1 - flag; 00411A31 mov eax,1 00411A36 sub eax,dword ptr [flag] 00411A39 mov dword ptr [flag],eax flag ^= flag; 00411A3C mov eax,dword ptr [flag] 00411A3F xor eax,dword ptr [flag] 00411A42 mov dword ptr [flag],eax flag = !flag; 00411A45 xor eax,eax 00411A47 cmp dword ptr [flag],0 00411A4B sete al 00411A4E mov dword ptr [flag],eax
flag = 1 - flag; これが消費クロックは少なそうだな あーでもあれか参照と書き込み両方あってもキャッシュに持ってくるからそれほど差はねーか
大して有利に見えないflag = 1 - flag;はそのままにして、 flag ^= 1; は flag ^= flag に書き換えるとか、せこくない?w
あ、これは失礼。 flag ^= 1; 00411A3C mov eax,dword ptr [flag] 00411A3F xor eax,1 00411A42 mov dword ptr [flag],eax いずれにしても flag = 1 - flag; flag ^= 1; は元のコードと挙動が異なる事には変わりないですね。
/* code を改良せよ */ if (toupper(c) == 'Y') return; length = (length < BUFSIZE) ? length : BUFSIZE; flag = !!flag; quote = (*line == '"') ? 1 : 0; bit = val & 1; 可読性落ちるだけだな
可読性をあげるための課題であったとすれば if (flag != 0) { flag = 1; } else { flag = 0; } とすべきだったのかもね。 if (flag == 1) { flag = 1; } else { flag = 0; } とするのが愚であることは分かると思うけど。
可読性が落ちるのに、実行速度は変化ないんじゃ改悪といわれてもしかたないような。
バグを入れるよりはマシじゃね?
フラグ立てる処理なんてゲームにしたって1フレーム単位でみても何万回もやるようなことじゃなければ 可読性重視でいいよw
っていうか、フラグの単純なonoffを620以外の方法で書いてるやついんの?
>>625 勝手な思い込って言えるほど、この場合のflagの初期値に0と1が入らないと思うなら、
いったいどんな数字がflagの初期値だと思うの?
書かれていない以上、他の値を考慮するのは当たり前じゃない? ミスタイプではあったが、最初に書かれたコードは flag = flag ? 1 : 0; であり、flagに1か0しか入らないのであれば、このコードを削除することがいちばんの改良法なわけだし。
それぞれのステートメントに使われている変数に関連性がないから アルゴリズムの改良も出来ないし,外部化することも出来ない となると可読性くらいしか残らないんだけど,所望の動作が分からないのでコメントでも加えればいいんでね?
他の値を考慮するか、出題が問題として成立しうる状況を考慮するかの違いだな。 些細な間違いをいつまでもグダグダいって、建設的な代案を出せないどころか それにケチつけるだけかw
夜なんだからしかたがない
>>618 2回read関数の入力があるけど最初の入力がvalかchかが環境依存
なんだこの流れw
>>621 の何が悪いのか分からない素人の俺に優しく教えてくれ
flag = flag ? 0 : 1;に比べて可読性が落ちるって言いたいみたい。 速度的には変化はないみたいだし、「改良」とは言えないってことじゃね。
挙動を変えちゃった方が息巻いててワロタよ
一応 >flagに1と0しか入らないことが確実なら って書いてるのに、しつこく絡むほうもどうかと思うがなw
アセンブラ素人だが、クロックについては全部3クロックでいいの?
>>652 今のx86はわからねえw
flagが置かれてるメモリは参照書き込みあるけどキャッシュに持ってきてるから
誤差のようなレベルだけどな
むしろflagの置き場所で効率が変わるかもしれない
flagがeaxに置かれればflag ^= 1が1ステップになるくらいか
655 :
653 :2009/09/01(火) 15:57:50
まあflagというくらいだから時々見る箇所と反転したりと状態を書き換えるところが 離れてるからレジスタに乗ってるってことは少ないと思うので そういえばデータ領域ってキャッシュ転送する場合は一定サイズのブロックで行われるんだっけ?
比較が入ってない方が早いのは確定だろ。
>>656 いやいやw
今のプロセッサで今回のような微たるクロックの削減を考えるのは無意味だってw
flagの参照更新箇所がものすごい回数あるならあれだけどさ
この程度から慣らしとかないと、いざ削減が必要になったときに どうしたらいいかわからなくなりそうだが。
いまどき削減が必要って、PCIか?
>>659 どうだろ
今のプロセッサの場合はキャッシュの効率の方が重要だったりするしね
その昔のおじさんたちはゲームを作るのに三角関数などの計算をあらかじめ行って
テーブル化しておいたけど今のプロセッサは下手すると計算した方がいい場合がほとんどだしねえ
それだけメモリとCPUの速度差が無視できないレベルになってる
>>659 どこが重いかをプロファイルして実測比較していくんだろうね
>>658 コンペアが重いのは今でも変わってないだろ。
>>663 メモリアクセスよりはよっぽど速い。つーか、処理速度を語りたいなら他所に行ってくれ。
そもそも今のPC用プロセッサでの話かどうかも分かんないし。 細かいこと気にするくらいだから、もっと遅いプロセッサ使ってる可能性もある。
文字列と文字の間にに0x00を入れたいんですがどうすればいいんですか? 終了コードとしてあつかわれちゃうのです
>>666 何のために?
行間を空けたいのならスペースの文字コード入れるとか
>>666 文字列として扱わないようにすればいいよ
>>666 文字列を終端の\0に頼らず自分で長さ管理する
char s[] = "文字列" "に0x00" "文字";
671 :
デフォルトの名無しさん :2009/09/01(火) 23:16:40
ひねくれ
>>666 C++なら文字列クラスがあるのに。
それに相当するのってc言語にもあるっけ?
>>673 俺の開発環境がC++で本当に良かったと痛感するわ。
そもそも '\0' を終端コードとしたデータ構造が文字列だろ。 そのルール破るならそれは単なるバイト列だよ。
"\0\0"が終端な奴はたまにあるけど、文字列かと問われると唸ってしまう
677 :
デフォルトの名無しさん :2009/09/02(水) 00:40:52
>>666 おまえみたいに掟破りなことをするのがいるからC#が誕生するんだよ
C♯だろボケ
どっちでもいいだろボケ
static inlineが有るとはいえcで文字列処理を独自に用意すると 文字コード其々にライブラリ化せないかんのがにんともかんとも
^といった累乗記号に相当するC言語での演算子はありますか? 元利計算に使いたいのですが、ググっても分からず困っています。
682 :
681 :2009/09/02(水) 05:27:05
すみません自己解決しました。 重ねて質問なのですが、累乗する際に有効な計算式や関数があったら教えてください。
pow
>>683 有用な関数を教えてくださり、どうもありがとうございました。
元金、利率、期間(年単位)を入力して元利合計の計算を行うプログラムを作っているのですが うまく作動しません。改善点を教えていただけると助かります。 #include<stdio.h> #include<math.h> int main(void) { int period; double rate,rating,sum,money; printf("元金の入力:"); scanf("%d",&money); printf("利率(年利)の入力:"); scanf("%lf",&rate); printf("期間の入力:"); scanf("%d",&period); rating = pow((1 +rate),period); sum = money * rating; printf("元利合計は%dです\n",(int)sum); return 0; }
686 :
685 :2009/09/02(水) 07:31:57
何度もすみません。
>>685 のプログラムについてなんですが、計算の途中経過を逐一チェックしようと
プログラムの間にprintf関数をはさんでみた所、全ての数値は正しく計算されており、
最後の変数sumでも正しい結果が得られました。
printf関数の挿入以外は上記のプログラムと全く同じで、計算方法は全く同じなのに
どうしてこのような結果になるのか全く分からず困っています。
アドバイスよろしくお願いします。
moneyの型とscanf関数の指定子が一致してないよ。
printf("元利合計は%dです\n",(int)sum); ↓ printf("元利合計は%fです\n",sum);
コンパイラによって速度に影響出たりするの? あと一番よく使われるコンパイラ教えて
>>687 >>688 こんな朝早くに回答してくれて本当に感謝です。
どこもいじっていないと書きましたが、成功したプログラムでは指定子が一致していました。
printf関数挿入の際に無意識で直していたようです…。
基本的な所からきちんと見直していかなければいけませんね。
どうもありがとうございました!
今すごい無意識をみた
内なる小人さんが活動したんだろう
疲れてると時々あるよね いたずらする小人さんの方が多いけどw
696 :
デフォルトの名無しさん :2009/09/02(水) 18:28:45
テキストファイルヲ開いて行数ごとに配列に代入するにはどうしたらいいの?
一行取得するような処理があるので、テキストファイルの先頭から最後まで取得して代入する
scanf関数から入力された数値の上2桁(2009なら20)と下2桁(2009なら09)を それぞれ違う変数に代入したいのですが、良い方法はありますか?
/100 %100
>>698 欲しいのは数値化文字列か、先ずそこをはっきりしろ。
>>699 助かりました。どうもありがとうございます。
>>700 計算に使用したいので欲しいのは数値です。
>>699 さんの方法でやってみようと思います、どうもありがとうございました。
ツェラーの公式の結果を求める下記のプログラムを作ったのですが、 2000年2月1日の結果を求めたところ2という結果が返ってきました。 wikiなどを見たところ2は月曜日に当たるように思うのですが、 カレンダーを確認すると2000年2月は火曜から始まっています。 C言語に直しているサイトを参照してみたのですが、自分では間違いがわからず困っています。 間違っている所がありましたら教えてください。よろしくお願いします。 if((month == 1) || (month == 2)){ year--; month += 12; } day = (year + year / 4 - year / 100 + year / 400 + (13 * month + 8) / 5 + 1) % 7; /*ツェラーの公式*/ printf("ツェラーの公式の結果%d\n",day); ※yearとmonthはscanfから入力された数値を用い、日にちは1で固定しています。
Wikiとは式が違うんじゃないの? そのサイトに、0ならば日曜日とか書いてない?
2が火曜日であってるな
Wikiってゆーなクズ。
wikiとwikipediaの区別が付かないヤツは…(ry
いちいちめくじら立てんな
その杜撰さがバグを招くのだよ。殊にCに於いては。
>>707 > いちいちめくじら立てんな
無能なヤツの言い訳w
言った本人でもない俺が言い訳? 馬鹿だねぇ
ウィキペならぎりぎり許す
>>710 ねぇねぇ、無能って
どんな気持ち?
∩___∩ ∩___∩
♪ | ノ ⌒ ⌒ヽハッ __ _,, -ー ,, ハッ / ⌒ ⌒ 丶|
/ (●) (●) ハッ (/ "つ`..,: ハッ (●) (●) 丶 今、どんな気持ち?
| ( _●_) ミ :/ :::::i:. ミ (_●_ ) | ねぇ、どんな気持ち?
___ 彡 |∪| ミ :i ─::!,, ミ、 |∪| 、彡____
ヽ___ ヽノ、`\ ヽ.....::::::::: ::::ij(_::● / ヽノ ___/
/ /ヽ < r " .r ミノ~. 〉 /\ 丶
/ /  ̄ :|::| ::::| :::i ゚。  ̄♪ \ 丶
/ / ♪ :|::| ::::| :::|: \ 丶
(_ ⌒丶... :` | ::::| :::|_: /⌒_)
| /ヽ }. :.,' ::( :::} } ヘ /
し )). ::i `.-‐" J´((
ソ トントン ソ トントン
>>712 ねぇねぇ、無能って
どんな気持ち?
∩___∩ ∩___∩
♪ | ノ ⌒ ⌒ヽハッ __ _,, -ー ,, ハッ / ⌒ ⌒ 丶|
/ (●) (●) ハッ (/ "つ`..,: ハッ (●) (●) 丶 今、どんな気持ち?
| ( _●_) ミ :/ :::::i:. ミ (_●_ ) | ねぇ、どんな気持ち?
___ 彡 |∪| ミ :i ─::!,, ミ、 |∪| 、彡____
ヽ___ ヽノ、`\ ヽ.....::::::::: ::::ij(_::● / ヽノ ___/
/ /ヽ < r " .r ミノ~. 〉 /\ 丶
/ /  ̄ :|::| ::::| :::i ゚。  ̄♪ \ 丶
/ / ♪ :|::| ::::| :::|: \ 丶
(_ ⌒丶... :` | ::::| :::|_: /⌒_)
| /ヽ }. :.,' ::( :::} } ヘ /
し )). ::i `.-‐" J´((
ソ トントン ソ トントン
ウィキペディアには信頼性がないという信念にもとづき、wikiと略す。 でたらめ多いしね。
>>715 って言うやつ自身よりはWikipediaの方がマシなのであった。
C#も略せばCじゃんwwww でC#厨に居座られたくないからな WikipediaがゴミだったとしてもWikiと略すのはいやだな
というか略すと別の物と一緒になる場合は その略は不適当だろ? 例:USBメモリ->USB とか。 カルボナーラスパゲッティ と カルボナーラ も違うとか聞いたがな。忘れたけど。
うんそうだね
実はここのスレタイの「C言語」は「C#言語」の略 お前ら今からはC#の話だけをしろよ
専用ブラウザをセンブラ、グラフィックボードをグラボ、ファミコンをピコピコ、電子レンジをチン… このように、現代の若者は単語を略すのが好きです。 略して、ゲワタリャです。
C#言語ってw
C#もC言語です
724 :
デフォルトの名無しさん :2009/09/04(金) 18:42:02
C OBOL言語の略か
Cを半音あげたからC#じゃねえの。CにOOPを++したのがC++で。 だからC#の#は省略できない。 東中野を中野というのようなもの。
PAS C AL S c heme S c ala C ASL BASI C みんなC言語
>>725 ほんとにOOPを追加しただけなのでしょーか?
>>727 「だけ」ではないだろう。
ただしメインはoopということで。
>>728 なんでも++しているような気がしてならないのですがきのせいですかそうですかっ
テンプレートとか例外処理とか演算子のオーバーロードとかそういうこと? C++は最初は「C with Classes」という名称で、それに上のようなものが 後になって追加された。
C++ ++ → C♯ って聞いたけど...
Cというかdelphi風なんだよな。C#は。 開発者が同じというのもあるんだろうけど。
>>731 何を言ってるんだと思ったけどやっと理解した
なんと安易なw
Javaほどマヌケじゃないよ^^
でもdelphiじゃねーよな。
Pascalなめんな
麻雀の配牌をランダムに生成し、 ソートして並べる、というプログラムが欲しいのですが どなたか御教授願えないでしょうか?? よろしくお願いします
順番がおかしい
>>739 > 麻雀の配牌をランダムに生成し、
ここは乱数で行う。
> ソートして並べる
これはもう容易だろ。
具体的には麻雀の牌136枚にそれぞれ
0〜135の通し番号を付けるのがいいかもね。
ライブラリにソーと関数あるんだからそれ使えよ^^
744 :
742 :2009/09/05(土) 17:22:48
>>743 まあそうなんだけどね。
車輪の再発明はするべきではないが、
ソートを知らない初心者の場合は
その限りではないと思ってさ。
うん、まあいいや。
>>739 教えて欲しいというなら何が分からないのか言うべき
単に答えだけが欲しいんだろ?素直になれよ
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct tag_mj_tile_t{
int id;
}mj_tile_t;
char *get_symbol(char *dest, int id){
sprintf(dest, "%.2s", &("1m2m3m4m5m6m7m8m9m1p2p3p4p5p6p7p8p9p1s2s3s4s5s6s7s8s9s東南西北白發中"[(id/4)*2]));
return dest;
}
void swap_tile(mj_tile_t *a, mj_tile_t *b){
mj_tile_t t;
t=*a; *a=*b; *b=t;
}
int compare_tile(const mj_tile_t *a, const mj_tile_t *b){
if(a->id<b->id) return -1;
return (a->id>b->id);
}
int main(void){
int i;
mj_tile_t tile[136], haipai[14];
char symbol[10];
srand(time(NULL));
for(i=0;i<136;i++) tile[i].id=i;
for(i=0;i<136;i++) swap_tile(&tile[i], &tile[rand()%(i+1)]);
for(i=0;i<14;i++) haipai[i]=tile[i];
qsort(haipai, 14, sizeof(mj_tile_t), (int (*)(const void*, const void*))compare_tile);
for(i=0;i<14;i++) printf(" %s", get_symbol(symbol, haipai[i].id));
return 0;
}
何かおかしいか?
749 :
747 :2009/09/05(土) 18:25:58
>>748 ああごめん、全然おかしくない。
むしろすごいと思う。
こっちこそ邪推してすまん。
最終的にソートするんなら、ランダムで生成するは必要ないと思うんだが。
>>751 とりあえずもう一度落ち着いて考えてよう。
毎回四暗刻っていうか、天和になるならありがたいことです。
三カンツだったすまん
むしろ山の中が固定なら壮絶な牌取り鳴き合戦が毎回
配牌が128枚ある麻雀について語るスレはここですか?
違いますのでお引き取りください。
名前付きパイプの具体的な使い方がわからない! 誰か教えてくだしあ><
DrawLineという線を引く関数を利用して直径1mの円を書くプログラムを作りたいと思ってるんですが、 うまく作れません。どなたか作成、または作成の仕方のアドバイスをしてもらえませんか? DrawLine (0,0,1,1) このように初めに始点の座標、次に終点の座標xyを指定して線を引くプログラムです。 DrawLine (0,0,cos(e), 1) 現在このようにして0,0を中心にcosのθ部分をfor文で微小変化させながらx軸周りに円を書こうと思ったのですが、このプログラムだと高さが1 の部分の線しか表示されません。 そこでy座標の1を変数hにしてどうにかしようと思ってるのですがどのように変化させればいいか考えてみたのですがわかりませんでした。 hをどのように変化させていけばきれいな円が書けるか教えてください。、どなたかお願いします。
double x0 = 0, y0 = 0, x1, y1, PI = 3.14; for(i=1; i<n; i++) { x1 = cos(2 * PI / n * i); y1 = sin(2 * PI / n * i); DrawLine(x0,y0,x1,y1); x0 = x1; y0 = y1; } 円ってこんな感じに描くんじゃねーの?
>>764 あらぬ疑いをかけて申し訳ないです。
直径1mの円描画乙おめ
>>764 課題なら専用スレへ。
Cとは関係ない話だし。
>>761 使い方です><
既に動いてるC言語プログラムと通信って可能ですかね?
>>770 そのプログラムが出力(或いは入力)するファイル名が判っていて事前に作って置けるのであれば、
名つきパイプに出力(或いは入力)させることはできる。
しかし、やっぱりスレ違い。
arctan2(y,x)関数でxが0の場合、角度は0度(0ラジアン)となりますが、正しく値が帰ってきますか?
atan2でした
>arctan2(y,x)関数でxが0の場合、角度は0度(0ラジアン)となります いいえ。マニュアルを読みましょう。
だからそれは数学上の場合を言ってるんです。実際はどうなるのかを聞いています
>>775 不思議!数学の定義から始めて欲しいところだね
>>775 >だからそれは数学上の場合を言ってるんです。実際はどうなるのかを聞いています
いいえ。xが0の場合は数学的には解がありません。
寧ろあれだ、何故xが0のときに角度が0になると思い込んだのかその根拠を知りたいところだ。
90度じゃないの
>>779 便宜上、atan2()はそう解釈するよう仕様が決められているね。
>>779-780 ___, - 、
/_____)
. | | / ヽ || 数学もC++も、どっちもできなくても腹は減るんだな。
|_| ┃ ┃ ||
(/ ⊂⊃ ヽ ) /  ̄ ̄ ̄ \
! \_/ ! ( ( (ヽ ヽ
,\ _____ /、 | −、ヽ\ !
ゝ/  ̄ ̄ ̄ \ /. \/ ̄\/ .\ |・ |─ |__ /
/ _____ヽ | | _┌l⊂⊃l | | ┌ - ′ ) /
| | / ─ 、−、! | | / ∋ |__| | | ヽ / ヽ <
|__|─ | /|ヽ | | /`, ──── 、 | | ` ─┐  ̄
( ` ─ o−i ヽ / \ .ノ_ .j ̄ ̄ |
ヽ、 ┬─┬ノ / ̄ ./ ヽ- 、\ /  ̄ ヽ\
// /ヽ─| | ♯| / i | ..) ) \ i ./ |\\
| | / `i'lノ))┘/ , ─│ !-l⊂⊃l┐__ヽ__/\ / | | |
| | | ̄| / /| / ( (... .ヽ / |____|∈ __./ .| | |
|_|/ヽ、_/ ./ ` ─ /\ /ヽ  ̄ \-──| \|_|
| | |───/____i l=======l |_____ __\ |\ | |
|/ ヽ── |______\ l二|^|二二|^|二l 丿______ |_丿 \|
l ̄ ̄ ̄ ̄ ̄ | | | |. | | | | | | | |  ̄ ̄ ̄ l
| ̄| ̄ ̄ ̄ ̄.| |────| |. | | | | | |.──────| | ̄ ̄ ̄| ̄|
はいはい。 -- DESCRIPTION `atan2' computes the inverse tangent (arc tangent) of Y/X. `atan2' produces the correct result even for angles near pi/2 or -pi/2 (that is, when X is near 0). RETURNS `atan2' and `atan2f' return a value in radians, in the range of -pi to pi. If both X and Y are 0.0, `atan2' causes a `DOMAIN' error. You can modify error handling for these functions using `matherr'.
ほいほい
-- Function: double atan2 (double Y, double X)
-- Function: float atan2f (float Y, float X)
-- Function: long double atan2l (long double Y, long double X)
This function computes the arc tangent of Y/X, but the signs of
both arguments are used to determine the quadrant of the result,
and X is permitted to be zero. The return value is given in
radians and is in the range `-pi' to `pi', inclusive.
If X and Y are coordinates of a point in the plane, `atan2'
returns the signed angle between the line from the origin to that
point and the x-axis. Thus, `atan2' is useful for converting
Cartesian coordinates to polar coordinates. (To compute the
radial coordinate, use `hypot'; see *Note Exponents and
Logarithms::.)
If both X and Y are zero, `atan2' returns zero.
加えて
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/atan2.3.html 処理系定義って事かね
>>772 arctan y/x がxが0の場合に0になる根拠まだ〜
三角関数わかってないアホってだけだろw
根拠はアホ
788 :
デフォルトの名無しさん :2009/09/07(月) 23:54:49
#include <stdio.h> void print_rec(int num); int main(void) { print_rec( 0 ); return 0; } /* 100を起点に、引数までの数値を表示する再帰関数 */ void print_rec(int num) { if( num <= 100 ) /* 100まで再帰呼び出し */ { print_rec( num+1 ); printf( "%d\n", num ); /* 再帰呼び出しから戻ってきたときに表示 */ } } このプログラムでprint_rec( num+1 );の部分でnum+○の○の部分だけ減っていくのが よく分からないのですが、なぜ−ではないのでしょうか?
>>788 print_rec(0) は何をするか? ・・・ print_rec(1) を呼び出した後、0を表示する。
print_rec(1) は何をするか? ・・・ print_rec(2) を呼び出した後、1を表示する。
print_rec(2) は何をするか? ・・・ print_rec(3) を呼び出した後、2を表示する。
以下略
表示するのは、呼び出した後であることに注意しよう。
つまり、0を表示するのは、1を表示した後である。
void print_rec(int num) { if( num <= 100 ) /* 100まで再帰呼び出し */ { printf( "%d\n", num ); /* 再帰呼び出しする前に表示 */ print_rec( num+1 ); } }
>>785 > y が +0 (-0) で x が +0 の場合、+0 (-0) が返される。
さらに条件が付くけど、これは?
>>791 「これは?」って、何を聞きたいの?
まさかとは思うけど、「数学上」と断りをつけているのに「xが0の場合」とだけ書いているにも拘らず
「更に」yが0の場合のことを語っているなんて寝言を言いたいなら眠った方がいい。
793 :
、 :2009/09/08(火) 09:23:37
教えて下さい。C言語で利用できるワイルドカードの記述方法を教えてください。*で指定するとビルドエラーが出ます。宜しくお願いします。
Win32でFindFirstFile(), FindNextFile() を使った方がいいのでわ? Linuxはどうなってるのかしらね
>>793 ビルドエラーが出ていると言う時点で、何か大きな勘違いをしている。
何をしたいのか、どんなエラーが出るのか書きたまえ。
796 :
793 :2009/09/08(火) 09:48:52
テーブルの構築で、二つの要素があります。ここでは、A、Bとします。検索時Bを引っ掛けたいのです。Aはなんでもよいです。Aの部分をワイルドカードにしたいです。エラーの種類は構文エラーです。
>>796 ここはCの入門編の質問スレだから、Cの用語で質問できないのならお門違い。
798 :
デフォルトの名無しさん :2009/09/08(火) 10:23:28
>>796 該当部分のソースのせて。
あなたの説明では必要な情報が全部落ちてる。
納期が迫ってるんです。速く教えてくれないと困るんです。
必要な情報を最初からすべて明らかにするのが最も速く適切な回答を得られる
802 :
デフォルトの名無しさん :2009/09/08(火) 12:03:44
納期が迫っているのにビルドできないとかwwwwwwwwwwww 超かわいそうwwwwwwwwwwww
だってさ、 > テーブルの構築で、二つの要素があります。 > ここでは、A、Bとします。検索時Bを引っ掛けたいのです。 > Aはなんでもよいです。Aの部分をワイルドカードにしたいです。 > エラーの種類は構文エラーです。 このレスは無いとおもうぜww スレタイ知らなければ ぱっと見ではC言語の質問しているとは思えないだろ?
>>803 select * from table_a where B = 検索条件;
と回答してしまいたくなるよなぁ
xが0なら π/2 or -π/2だろ、数学的に考えて
周期関数の一部を切り取ってるかどうかわからねぇだろ・・・jk
>>806 それが言えるのはyが0でないときに限る。
同様に、
yが0なら π or -だろ、数学的に考えて。
も成り立つ。ただしこれも言えるのはxが0でないときに限る。
そして
数学の世界で厳密に語るなら
x=y=0の時は未定義(不定の値)となる。
C99の世界で厳密に語るなら
未定義だったり不定だったりはせず、
The atan2 functions compute the value of the arc tangent of y/x, using the signs of both arguments to determine the quadrant of the return value. A domain error may occur if both arguments are zero.
この様に定められている。
厳密に考えるならNaNが帰ってくるべきなのかな 極限値とるにしても近づけ方によって値が変わるし
810 :
808 :2009/09/08(火) 19:11:46
>>809 どうだろうねぇ。
NaNだと数じゃないって意味になっちゃうからねぇ。
まあNaNにするべきという見解もありだろうけど、
数学的には任意(不定)ってだけで数じゃないとまでは言い切って無い気がする。
べきとかべきじゃない議論は不毛になりやすいから
あんま深入りはしないでおこう。
811 :
デフォルトの名無しさん :2009/09/08(火) 21:53:26
winsock通信であるサーバから受信した文字に必ず\0が含まれてしまい のちの処理に影響が出てしまうのですがどうにかできませんか
不要なら消せばいいじゃん 受け取ったデータを全部使う必要なんてないぜ
>>811 そのプロトコルに準拠するような処理にするしかない
>>811 そのプロトコルを作った人を呪え。
普通はテキスト部とバイナリ部を分けるから問題にならんと思うのだが……
関数のプロトタイプ宣言で仮引数の変数名を省略できるけど、 変数名まで書くのと省略するのとどっちが主流なの? int func(int x, int y); int func(int, int);
>>815 名前を書いたほうが、プロトタイプ宣言を見ただけで意味が分かる
>>815 俺は昔後者の方がタイプ量が少ないと思っていたが
今は全部前者
コピペで貼り付けてる
省略出来たんだ?w
>>818 こいつバカ過ぎるwww
>>815 どっちが主流かどうかはちょっと分からん。
しかし変数名は飾りじゃない以上、付けるべきでは?
むしろ付けないのはC++でオーバーロード解決のためにつかう
便宜上のクラスとかじゃね?
int func(int, int); int func(x,y) int x; int y; { }
>>820 スレ違いになるから詳しくは書かないが、C++の場合は宣言だけでなく定義の仮引数名も省略できる。
823 :
820 :2009/09/09(水) 18:45:22
>>822 うむ、俺も
> C++でオーバーロード解決のためにつかう
> 便宜上のクラスとかじゃね?
これはそれを言いたかったんだが。
わかりにくかったかな?・・・。
まあいいか。スレ違いだしね、
オーバーロードとポリモーフィズムの違いがよくわかんね
機能選択が動的か静的かの違いだと考えればイイと思うよ
オイラー法を使って物体のt秒後の位置を求めたいのですがC言語で表そうとするとどのような式になるのでしょうか? 必要なパラメーターと各パラメーターの変数を使った式を書いていただけませんか? よろしくお願いします
加速度 10 を積分して速度を求めたいのですがどのような方法がありますか?
初速度が0の場合は加速度=速度ってことですぬ ありがとうございます
どう考えてもC言語の問題じゃないから これにて終了。
加速度から速度を求めるのは積分じゃないような
>>815 プロトタイプなんてコンパイラがみるもんで、人間がみるもんじゃないから
書かなくていいよ。
void hoge(int x, int y);
void hoge(int row, int col) {・・・}
となってて、プロトタイプ見て信じてたらひどいことになる。
積分と微分は単なる対立関係じゃなく循環してて、無限回積分すると微分してることになるんだよ
>>833 その例はさすがに無理があるというか、当てはまらないだろう。
一旦バッファに入れて1文字ずつ読めば?
その方法が分からないのです><
OnReceiveの引数でいいんだよね。 str[0] str[1]って感じで文字ごとにアクセスできるよ
842 :
838 :2009/09/10(木) 04:27:53
>>839 ,841
ありがとうございます。
私のやりたいことを伝えられなくて申し訳ありません。
以下のようにGPSのデータを加工しようと考えています。
rx_dataには一文字ずつ入って欲しくて
rx_data = ?
の?の部分を何とか作れないかと考えています。
/* 受信データの取り込み */
while(1){
i = 0;
do{
rx_data = sci1_rx(); // 1文字受信
rx_b[i] = rx_data; // 受信データを順に配列変数に入れる
i++;
}while(rx_data != '\n'); // 改行文字の場合は取込停止
rx_b[i] = '\0';
for(i = 0; i < 6; i++){ // 文字列rx_bから最初の6文字を取出す
b[i] = rx_b[i];
}
b[i] = '\0';
c = strcmp(a, b); // 文字列aと文字列bを比較する
if(c == 0){ // 取得した文字列がRMCセンテンスの場合
for(i = 0; i < 2; i++){ // 緯度データの切り取り
lati_s1[i] = rx_b[i +16];
}
lati_s1[i] = '\0';
・・・・・
sci1_rxの実装方法が分からんってこと? 受信自体をどこでやるのかが不明なんだけど、sci1_rxの中でやりたいと思えばいいの? …質問者がレスするたびに内容が変わりまくるパターンだろうか
UDP使って送信ってできたよね?
845 :
838 :2009/09/10(木) 05:36:37
>>843 ありがとうございます。
シリアル通信は
ttp://www.takebay.net/~daigo-ao/paddlewiki.pl/title_A5B7A5EAA5A2A5EBC4CCBFAE2852532D3233324329A4C7C1F7BFAEA1A6BCF5BFAEA4F2B9D4A4A6A5D7A5EDA5B0A5E9A5E0.html で行っているのでsci1_rx() ※本来で有れば一文字ずつ受信の所をなんとか上のソースを活かして実装できない物かと考えています
現状のソースではは str や pszBufの中身を取り出すと
$GPGSA,A,3,24,12,26,14,30,22,27,21,09,18,,,2.5,1.6,1.9*3B
$GPRMC,202700.000,A,3559.7317,N,13939.6303,E,0.17,228.81,090909,,*05
$GPGGA,202701.000,3559.7317,N,13939.6302,E,1,10,1.6,22.1,M,39.1,M,,0000*68
$GPGSA,A,3,24,12,26,14,30,22,27,21,09,18,,,2.5,1.6,1.9*3B
というような感じで一行ごとに出てきます。
sci1_rx();にあたる部分を実装したいと考えています。
strcpy(a, "$GPRMC"); while(1){ i = 0; do{ rx_data = sci1_rx(); // 1文字受信 rx_b[i] = rx_data; // 受信データを順に配列変数に入れる i++; }while(rx_data != '\n'); // 改行文字の場合は取込停止 rx_b[i] = '\0'; for(i = 0; i < 6; i++){ // 文字列rx_bから最初の6文字を取出す b[i] = rx_b[i]; } b[i] = '\0'; c = strcmp(a, b); // 文字列aと文字列bを比較する if(c == 0){ // 取得した文字列がRMCセンテンスの場合 for(i = 0; i < 2; i++){ // 緯度データの切り取り lati_s1[i] = rx_b[i +16]; } lati_s1[i] = '\0'; ・・・・・ 一文字ずつの受信が出来れば、 /* 受信データの取り込み */ 以降のソースでGPSデータの加工が可能になります。 よろしくお願いします。
>>845 こんな感じかねぇ。インデックスの計算とか間違ってるかもしれないけど。
char* gBuf;
int gBufLen = 0;
int gBufIndex = 0;
get1(){
if(gBufIndex == gBufLen){
gBuf = sci1_rx();
gBufLen = strlen(gBuf);
gBufIndex = 0;
}
return gBuf[++gBufIndex];
}
>>846 もうちょっとレベリングすると「なんてアホな子としてたんだろう」ってなるからおk
849 :
838 :2009/09/10(木) 11:50:10
>>847-848 ありがとうございます。
get1()
の部分が良く分かりません、また
error C2143: 構文エラー : ';' が '{' の前にありません。
となります。
お願いします<(_ _)>
頭痛くなってきた。 strncmpとかstrstrつかいなよ
>>846 受信スレッドの中を文字列解析処理に書き換え
255バイト毎に読み込んでるところを
1バイトづつ読む込むsci_rx()に書き換えればいいのでは?
255バイト毎に読み込んでるところを生かすなら、
sci_rx()って処理は無理かと?
1文字ずつ取り込む必要性が感じられない。
受信データの中に"$GPRMC"という文字列が含まれていた場合に、
データ中の特定の数バイトを変数へ取り込みたいんだろ?
よほどトリッキーなことしない限り、普通は
>>850 の言うようにstrstr()とstrncpy()で簡単にできる。
sci_rx()を使いたいならコンソールアプリにすればいいような?
854 :
838 :2009/09/10(木) 23:59:05
たくさんのレスありがとうございます。 今日、こんな感じを考えてみました、 int i; for(i = 0; i<256; i++){ if(pszBuf[i] == '\0') break; rx_data = pszBuf[i]; } これでもOKでしょうか? って私が質問するのも変ですが今試せる環境がないので。。。 strncmp、strstrって意見を頂いたので調べてみます。 ある程度知識のある方からすればしょうもない質問とは思いますがよろしくお願いします。
要は、行単位で受信イベント発生しているんでしょ? で、これからデータを取ればいいんだよね? >$GPRMC,202700.000,A,3559.7317,N,13939.6303,E,0.17,228.81,090909,,*05 だったら、これがbufに入っていると仮定して、 #define RMC_STR "$GPRMC," if (strncmp(buf, RMC_STR, sizeof(RMC_STR) - 1) == 0) { double valueA, valueB, valueC; char letterA, letterB, letterC; if (sscanf(buf + sizeof(RMC_STR) - 1, "%lf,%c,%lf,%c,%lf,%c", & valueA, & letterA, & valueB, & letterB, & valueC, & letterC) == 6) { // success } } こんな要領でしょ。
だったら、 if (sscanf(buf, "$GPRMC,%...",...) == xx) で良いだろ
文字列の切り出し以前に、発想を変えないとはまるような
受信イベント来た 自前バッファの末尾に 受信データ文字(列) を連結する 字句解析側( $から始まって LF(CRLF?) が1単位か?)は 自前バッファ が空でなければ 自前バッファの先頭の1文字を取得 (さらに 自前バッファを先頭側へ詰めたり リングで管理したりして ところてんの筒のようにする) ※ TCPもそうだけど、シリアル通信は行単位や全てのデータが一気に来るとは限らないからね
そろそろアホな事してるって認識になってきたころあいですね
そんなことないよ。 俺ライブラリが充実しそうだと夢がふくらんでる頃合い
まだだったか
863 :
デフォルトの名無しさん :2009/09/11(金) 23:19:59
(struct ~ *)&~ ↑これって何?
~とかいてあるの?
867 :
838 :2009/09/12(土) 00:48:06
>>859 どうも行単位でイベントが発生しているわけではないようです。ようやく気づきました。。。
ごめんなさい。
既存のソースを流用するのはあきらめようと思います。
質問し直させて下さい。
bufに
07,02,13,,,,1.5,0.9,1.2*3C
$GPGSV,3,1,11,02,80,342,31,04,60,116,27,05,56,304,33,10,48,290,29*7B
$GPGSV,3,2,11,13,29,042,19,07,26,087,23,08,21,127,34,29,09,322,36*7E
$GPGSV,3,3,11,15,08,216,25,24,03,308,32,17,01,168,19*48
$GPRMC,145317.000,A,3559.7367,N,13939.6392,E,0.12,7.19,110909,,*0A
$GPGGA,145318.000,3559.7369,N,13939.6395,E,1,09,0.9,23.0,M,39.1,M,,0000*65
$GPGSA,A,3,04,15,29,10,08,05,07,02,13,,,,1.5,0.9,1.2*3C
$GPRMC,145318.000,A,3559.7369,N,13939.6395,E,0.08,292.44,110909,,*01
$GPGGA,145319.0
の様なデータが送られて来る場合
$GPRMCセンテンスの"," ごとに区切られたデータ12個をa,b,c,d,e,f,g,h,i,j,k,l
の変数に入れるにはどうしたら良いでしょうか?
どうせ行単位で届く保障なんてないんだから 受信バッファから1バイトずつ読んで「","が来たら次の変数に」、「"LF"が来たら1行そろった」 の判定を繰り返せばいいんじゃないの?
>>867 sscanf()でいいだろ。上で誰か実例挙げてたと思うが。
a = foo(); if(!a) a = bar(); を a = foo() ||| bar(); みたいに一括して書く方法ないですか? foo, barは0,1以外も返す可能性があります。
if ( !( a = foo() ) ) { a = bar(); } a = foo()?foo():bar();
if((a = foo()) || (a = bar()) ); つーか、どうしたいのかを明確にしろよ。
a = (a = foo()) ? a : bar(); とか。 読みにくいだけで、意味は全然無いと思うけどな。
875 :
838 :2009/09/12(土) 03:34:22
if(strstr(buf, "$GPRMC")){ float time = 0; char valid = 0; float latitude = 0; char NorthSouth = 0; float longtitude = 0; char EastWest = 0; float sog = 0; float direction = 0; int date = 0; float magneticDeclination = 0; char magneticEastWest = 0; int checkSum = 0; sscanf(buf, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,%f,%d,%f,%c*%x", &time, &valid, &latitude, &NorthSouth, &longtitude, &EastWest, &sog, &direction, &date, &magneticDeclination, &magneticEastWest, &checkSum); } これでOK? 上手く動かないんだけどな。。
>>875 >>867 のGPRMCが含まれる行と形式が違わないか?
あと、bufに対してsscanfをそう書くって事は先頭にマッチさせられるような状況を作ったってこと?
a = MAX( foo(), bar() ); 両方やっちゃって良いならこれでも良いけど、処理変わるよな。
>>875 とりあえず動かした。
char *p;
if(p = strstr(buf, "$GPRMC")){
float time = 0;
char valid = 0;
float latitude = 0;
char NorthSouth = 0;
float longtitude = 0;
char EastWest = 0;
float sog = 0;
float direction = 0;
int date = 0;
float magneticDeclination = 0;
char magneticEastWest = 0;
int checkSum = 0;
// sscanf(buf, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,%f,%d,%f,%c*%x",
sscanf(p, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,%f,%d,,*%x",
&time,
&valid,
&latitude,
&NorthSouth,
&longtitude,
&EastWest,
&sog,
&direction,
&date,
// &magneticDeclination,
// &magneticEastWest,
&checkSum);
}
879 :
838 :2009/09/12(土) 04:06:39
>>867 ,
ありがとうございます。
形式違いますか?あれ、どこかな?
先頭にマッチさせられるような状況は作れてません><
>>878 ありがとうございます。
うーん。&time.....それぞれにちゃんと値が入りません。
先頭にマッチさせてないことが原因でしょうか?
デバッグできない人? これは動くよね #include <stdio.h> #include <string.h> int main() { char *buf = "hoge$GPRMC,202700.000,A,3559.7317,N,13939.6303,E,0.17,228.81,090909,,*05hoge"; char *p; if(p = strstr(buf, "$GPRMC")){ float time = 0; char valid = 0; float latitude = 0; char NorthSouth = 0; float longtitude = 0; char EastWest = 0; float sog = 0; float direction = 0; int date = 0; float magneticDeclination = 0; char magneticEastWest = 0; int checkSum = 0; // sscanf(buf, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,%f,%d,%f,%c*%x", sscanf(p, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,%f,%d,,*%x", &time, &valid, &latitude, &NorthSouth, &longtitude, &EastWest, &sog, &direction, &date, // &magneticDeclination, // &magneticEastWest, &checkSum); printf("$GPRMC,%f,%c,%f,%c,%f,%c,%f,%f,%d,%f,%c*%x\n", time, valid, latitude, NorthSouth, longtitude, EastWest, sog, direction, date, magneticDeclination, magneticEastWest, checkSum); } return 0; }
>>879 > 形式違いますか?あれ、どこかな?
コメントアウトされてることに気づきませんか
ていうか、sscanfの戻り値は必ずチェックするようにしろよ
というかこれまさか業務のコードじゃないよな
RMCセンテンスって機器によって内容がマチマチだったような 特に列数が11個だったり12個だったり
strstr()とstrncpy()を使わないで、ひねってやりたい年頃。 薄っぺらい人間はひねりたがる。 繁殖期に男が料理などにはまって、良い夫を演じるのに似てるな。
887 :
838 :2009/09/12(土) 19:34:13
>>レス下さった皆さん
ありがとうございます。
>>880 バッファのタイミングを弄ったら無事に出来るようになりました。
>>883 じゃないですよ。
>>884 そうみたいです。しかも説明書の解説と実際のデータが違って昨日は混乱しました。言い訳ですが。。
> というかこれまさか業務のコードじゃないよな ま、業務のコードでもひどいのはいくらでもあるけどな。
つーか問題点が整理できてない ・シリアル通信を用いてデータ単位毎にイベント発生(or ブロッキングからの脱出)する+当該データを取得する しくみ [大前提] 通信資源からの入力操作は "行単位" や "転送側の送出操作単位" が保証されるわけではない # 装置が 1回 send してるにもかかわらず 複数回 recv しないとデータが揃わない とか # 装置が 複数回の send が 1回 recv でまとまってやってきた とか (最もプロトコルによっては、"時間" により データ終端を規定してたりすることもあるが…) ・1データ単位から如何にして値を取得するか
890 :
デフォルトの名無しさん :2009/09/15(火) 08:03:11
指定オフセットから指定バイト分文字を書き換える関数無い?
891 :
デフォルトの名無しさん :2009/09/15(火) 08:17:30
と思ったら配列要素でできるのか事故解決
つmemcpy()
893 :
デフォルトの名無しさん :2009/09/15(火) 13:08:12
gccってやつどこからDLするの?
ggrks
TDM版を使うとなにがいいことあるの?
>>897 君がビルドした物を俺が使うより良い
とか。
899 :
デフォルトの名無しさん :2009/09/15(火) 21:12:36
intel c compilerでscanf_s();って使えますか?
>>900 言い換えると俺がビルドした物を
>>900 さんはインストールする気になりますか?
ってこと。
冗談じゃねぇよって思うだろ?
>>901 いやいや、MinGWプロジェクトが配布してるバイナリじゃなくて、TDMがビルドしたバイナリを使う利点はなんですか?と
聞いたつもりなんだけど、、、もしかして前者は存在しないの?
最新バージョンを使いたい人向け?なのかな? で、その最新バージョンをTDMがビルドしたものを使うとCPU負荷が異常に高くなってしまうと
>>899 持ってないからわからん。
持ってるのなら試してみてはどうですか
905 :
デフォルトの名無しさん :2009/09/15(火) 22:22:25
char s2[256]; char *point=&s; ↑エラー出る何で?
906 :
デフォルトの名無しさん :2009/09/15(火) 22:23:07
char s[256]; char *point=&s; 間違え こうだった
_s 系の関数はMS独自だと思ってたが結構ポピュラーなのか?
sが未定義っていうエラーだよね?
>>906 char * に char ** を代入しようとしているから
× char *point=&s; ○ char *point=s;
問題のあるポインタ変換ってでます
912 :
デフォルトの名無しさん :2009/09/15(火) 22:26:36
914 :
913 :2009/09/15(火) 22:27:57
すまん、途中だった char s[256]; char **p = &s; これなら通るかのように読めたわけだが
915 :
909 :2009/09/15(火) 22:32:04
>>914 うーん
char * に char *[256] を代入しようとしているから…
でいいのかな
ややこしいな
いや、通るぞ。
>>906 これがなんでだめなのかは、sが配列だからに他ならない
配列で定義したsは、その時点でアドレス変数(つまりポインタ)
になるので、ポインタ変数へはそのまま代入しなければならない
つまり、
>>909 が正しい
>>916 文法的には間違っていないからでは?
ただし、配列の場所(アドレス)を格納している配列sの場所(アドレス)
をポインタpointに代入していることになる
実質ポインタのポインタとなる
コンパイラが、ある人にとってはありがた迷惑なエラー(ワーニングだとおもうが)を吐き出しているということだと思う
919 :
909 :2009/09/15(火) 22:41:07
>>917 ごめん
>>909 は正しくないんだ
関係ないけど
char s[256];
char (*p)[256] = &s;
これは正しい
920 :
917 :2009/09/15(火) 22:43:49
>>919 ところで、これは、ポインタ配列pにsのアドレスを入れてるけど、
どういうことになるんだろう?
こんがらがってきた
>>918 ポインタのポインタ?
char **p = (char **)&s;
が問題ないと言っている?
>>923 char (*p)[256]はポインタ配列定義にならないんだっけ?
>>926 char *p[256]とchar (*p)[256]は違うということか
つまり、これはポインタのポインタ?
char s[256] = {1, 2, 3}; char **p = (char **)&s; printf("%d\n", **p); これはp[0]を出力しない。 char *p = (char *)&s; これは合法
>>927 char [256] 型を指すポインタであって、ポインタのポインタではない
char (*p)[256] = &s; こうした場合、配列の先頭要素にアクセスするには、*p[0] **p のどちらでも動作する。 ならばポインタのポインタではないか、といいたくなる気持ちも分からなくはないが、 char (*p)[256]; char **q; としたときの、sizeof(*p) と sizeof(*q) は違う。 *p は char [256]型であり、*q は char *型だから。
ちょwwwTDMの利点が分からないままありがちな配列ポインタ談義にwww C FAQでも読んでろwww
>>929 char[256]型って、実質ポインタだったりしないのかな。。
たとえば、char s[256];で定義して、*sを参照したらアドレスが
出てくるんだよね?
>>930 やばい、わからんw
qはchar **型じゃないの?
不安な人はC FAQでも読み直したらええねん
>>932 > char[256]型って、実質ポインタだったりしないのかな。。
しない。
char[256]型の変数を宣言すると、
char str[256];
こうなるよ。
>>933 qはchar **型だよ。だから、*qはchar *型
連投スマソ
>>935 もちろん、表面的には*出てこないし、ポインタではないんだけど、
中身というか、メモリ上では実質ポインタと同じなのかなと言う意味
関係ない?けど、配列へのポインタは関数ポインタの後で理解したなぁ あんまり使わないといえば使わない、、、んだけど、配列を関数に渡したいという要望自体は初心者でもありがちだし。。。
簡単な話だ。ポインタ「変数」はその名の通り保持する値が変わり得る。 配列の先頭アドレスは変わらない。故に配列≠ポインタ。
>>941 なるほど説得力があるな。
ただ、やったことはないから、そもそもできるかわからんが、例えば
char str[256];
str = &str[1];
ってやると、先頭アドレス1バイト分、後ろにシフトした配列に
なったりしない?
だったら、やってみろって話になるかもしれんが。w
配列はポインタ変数じゃなくてポインタ定数
例えば、 char str[256]; str++; でもいい。 どうだろうか?
>>943 あ、やっぱ定数扱いなんだ
じゃあ、無理だね
するとポインタでできるような
>>944 も無理だね
ありがとございます
添え字の無い配列は、式の中ではポインタとなる つまり char str[ 256 ]; char* s; s = str; s++; とかは可能
>>946 うん、それだと納得
だって、sは明らかにポインタとして定義されてるからね
むしろs++でアドレスとsizeof(char)ずつインクリメントできないと困る
ということは、やっぱりstr++のように、配列として定義したstrに
対してポインタのような演算はできないということなんだね
微妙だけど char str[ 256 ]; char* s; s = str + 12; とかは可能
>>948 なるほど。
配列をアドレス定数として扱っての演算は可能ということなのね
理解が深まった
ありがとう
int main() { char str[5][100] = {{1, 2, 3}, {2, 4, 6}, {3, 6, 9}, {4, 8, 12}, {5, 10, 15}}; char (*p)[100] = &str[0]; char (*end)[100] = &str[5]; do { printf("%d\n", ((char *)p)[1]); } while (++p != end); return 0; } 配列型を意識したコードでなんか例がないかと考えた結果こんなことに。 ++pで何が起こってるかを見てもらえれば分かるかなぁ?
951 :
デフォルトの名無しさん :2009/09/16(水) 05:31:35
do{ i=strlen(r); r[i]=20; }while(i+1 != strlen(r)); x0を探し出してスペースに変えるもの作ろうとしたら 符号が違うだとかでエラー出るよ どうしたらいの
どいつもこいつもバカばっか
>>951 0が2個連続してないと延々とメモリを書き換えていきそうだな
954 :
デフォルトの名無しさん :2009/09/16(水) 06:54:22
文字列の間にある0を抜きたいだけだからそれはいいんだよ
>>951 rが指す先が通常のC文字列として扱えるのならそのコードはおかしい。
rが指す先が特殊なバイト列ならstrlen()を使うのはおかしい。
特に後者の場合、コーディング規約でchar以外の型にtypedefすることを要請する場合もあるほどだ。
>951 rの型はなんなのよ 符号というからおそらく unsignedが付いているんだと思うけど エラーではなく警告じゃないかな
昔 char str[] = "abcde"; と char *str = "abced"; の扱いの違いで悩んだ記憶があったなあ
よく分からんけど r[i]=20; は r[i-1]=20; じゃないの?
>>951 #include <stdio.h>
int main()
{
char s[] = "hello\0world\0";
char *p = s;
char *q = p + sizeof(s) - 1; // ここでは配列のサイズから文字列の長さを算出
printf("len=%d\n", strlen(s)); // strlenは途中の\0を拾うから役に立たない
printf("len=%d\n", sizeof(s) - 1);
for(; p < q; p++)
if(*p == '\0') *p = ' ';
printf("%s\n", s);
return 0;
}
おまえらすごいな 俺には質問の意味が理解できん…
エスパーにはエスパーで対抗するしかないからなあ
>>951 >符号が違うだとかでエラー出るよ
どの行にでるか、程度のことも解らんのかお前は。
どうせ i が int なんだろうけど。
>>958 r[i] = 0x20;
CとかJavaってさ、逆にPHPとJavaScript習得している場合は習得は大変なの? Cとか習得後はPHPとか簡単だと聞くけど
素養ができてれば他の言語を学ぶのは簡単
Cはポインタがあるし文字列型やGCがないから一苦労あるかも Javaは簡単だと思うよ
そんな事をきいてどうする?
GCなんてものは、動的確保したものを不要になり次第ちゃんと解放してれば不要な機能だ。 つまりプログラマの意識の問題。一方、コンパクションは処理系ではなくOSの仕事であるべき。
お前が何と吠えたところで世の中はかわらないけどな
PHPやJavaScriptでGCに慣れ切ってる人がCに来ると、 その「ちゃんと解放する」という考え方自体がこれまでなかったわけだから、 苦労するんじゃないかな、と思った次第
そんな奴いるのか?
単なる杞憂ならいいんだ 何も言うことはないよ
Basic → アセンブラ → Javaと移ってきた俺に言わせれば、 領域の確保と解放?なにそれpgrって感じだったな。
Triassic → カンブリア → Juraと移ってきた俺に言わせれば、 領域の確保と解放?なにそれpgrって感じだったな。
974 :
デフォルトの名無しさん :2009/09/16(水) 17:58:34
ここには職業Pはいなそうだな
C++撲滅運動
ハッシュテーブルや辞書型の構造体を提供するC用の有名なライブラリとかありますか?
>>976 どうしても C でないとダメというのでなければ C++ の STL を使うのが楽
お前は何を言っているんだ
CSTLだろ
981 :
デフォルトの名無しさん :2009/09/17(木) 04:39:34
memcpyでコピー先のアドレスから30バイトずらしたところに移すには? memcpy(&s+30,b,4); こうしたらコンパイルはできたが実行すると問題発生した
&イラネ
>>981 sの型による
s+1としても、実際は内部的にs+sizeof(s)だけポインタずらされるから
どうしてもというなら(char *)にキャストするとか
984 :
デフォルトの名無しさん :2009/09/17(木) 07:02:08
スレを勃てるまでもない…(ry ってスレは今 無くなった??
985 :
デフォルトの名無しさん :2009/09/17(木) 07:33:18
connect(sock, (struct sockaddr *)&server, sizeof(server)); (struct sockaddr *)&server これは、何をしてるの?
キャスト。 マジレスすると、 その手のコードの場合、大抵はserverの型は struct sockaddr ではなく、 struct sockaddr_in とかが使わている。 で、connectが受け取るのは struct sockaddr * なので、キャストして渡している。 socket関係を自力で書くときはほとんどそういう形になる。
>>985 connectの第二引数の型がstruct sockaddr *なのでそれにあわせてキャストしている
多分serverはsockaddr_in型なんだろう
>>984 スレを勃てるまでもないC/C++の質問はここで
無くなっちゃったね
990 :
984 :2009/09/17(木) 20:42:22
>>988 無くなったか。
まあ関連スレはいっぱいあるし、いっか。
次いってみよー
1000なら民主最高
1000じゃなかったら政権交代すべき
民主党は早くマニフェストどおり政権交代しろよ
梅
1000ならC#が流行になる
1000ならプログラミング引退
ぬるぽ
■━⊂( ・∀・) 彡 ガッ☆`Д´)ノ
人生初の1000get
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。