C言語なら俺に聞け(入門篇) Part 49
レス数が1000を超えています。これ以上書き込みはできません。
初心者、初級者の方は他の質問スレのほうが良いかもしれません。
教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 126代目
http://pc12.2ch.net/test/read.cgi/tech/1242655611/
・C++言語はスレ違いですが、ある程度なら対応です。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 48
http://pc12.2ch.net/test/read.cgi/tech/1242129892/
過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
0002デフォルトの名無しさん
2009/06/06(土) 23:47:58乙
0003デフォルトの名無しさん
2009/06/07(日) 09:49:490004デフォルトの名無しさん
2009/06/08(月) 06:54:14これに関する規格はどこかで読めないでしょうか?
0005デフォルトの名無しさん
2009/06/08(月) 07:03:330(整数値)はfalseに変換される。
0以外の整数値はtrueに変換される。
trueは1に変換される。(他の値にはならない。)
false整数値は0に変換される。
これが規格のどこかに書いてあった。
忘れたけどね。
0006デフォルトの名無しさん
2009/06/08(月) 07:36:26ありがとう
0007デフォルトの名無しさん
2009/06/08(月) 09:42:48これは単純に\rが無視されるだけなのかそれとも\r\nと続いたときのみ\rが無視しされるのどっちなんでしょう?
\r\r\nのような場合はどうなりますか?
0008デフォルトの名無しさん
2009/06/08(月) 10:04:040009デフォルトの名無しさん
2009/06/08(月) 11:33:39\r\nの2バイトを\nに変換する
\r -> \r
\r\r\n -> \r\n
0010デフォルトの名無しさん
2009/06/08(月) 13:14:14ってことなの?
0011デフォルトの名無しさん
2009/06/08(月) 13:32:30int main(int argc, char **argv)
{
unsigned int from_len, to_len,mv_len;
char *p = NULL;
char in[MAX_LEN],from[MAX_LEN],to[MAX_LEN];
のというプログラムで、コマンドラインからの引数(文字列)をプログラム内の変数に代入したいです。
具体的にはfromにargv[1]の文字列を、toにargv[2]の文字列を入れたいのですが…。
from=argv[1]というようにやっても、
「型が合わない変数に代入しようとしています」というエラーが出てしまいます。
どうしたらいいのでしょうか?
0012デフォルトの名無しさん
2009/06/08(月) 13:33:250013デフォルトの名無しさん
2009/06/08(月) 13:40:58ありがとうございます!
0014デフォルトの名無しさん
2009/06/08(月) 15:51:540015デフォルトの名無しさん
2009/06/08(月) 18:40:49これは、オペレーティングシステムのレポートに使うプログラムのサンプルなのですが、
コンパイル時にエラーが出ます。授業中スライドに表示されたのを打ち込んだのですが、
どこが悪いのか困っています。
os.c: In function ‘main’:
os.c:36: error: expected expression before ‘]’ token
となる原因を教えてください。
0016デフォルトの名無しさん
2009/06/08(月) 18:54:26文法的には、if(execv(argv[0],argv[])==(-1)){ の argv[] の部分がおかしい。
内容自体はC言語の話から外れるが、UNIX系OSのexecvのことであるのなら、
argv[] を argv とすればよかろう。
0017デフォルトの名無しさん
2009/06/08(月) 18:56:220018>>15
2009/06/08(月) 20:29:140019デフォルトの名無しさん
2009/06/08(月) 21:06:37入ってるの? POSIXじゃね?
0020>>15
2009/06/08(月) 23:09:21ありがとうございます。
0021デフォルトの名無しさん
2009/06/08(月) 23:11:03ISO/IEC 9899 : 1999 (E)には、載ってなかった。
最新のドラフトISO/IEC 9899:201xにもないな。
regexとか入ってくれないものかなぁ。
0022デフォルトの名無しさん
2009/06/09(火) 12:17:01どこをみればわかるのでしょうか?OSはGNU Network Object Model Environmentです。
お願いします。
0023デフォルトの名無しさん
2009/06/09(火) 12:21:18なけりゃ知らん
0024デフォルトの名無しさん
2009/06/09(火) 12:25:40コンパイルはどうやってんの?
コマンドラインなら、大抵は -v オプションで出るよ
gcc -v とか
0025デフォルトの名無しさん
2009/06/09(火) 12:47:41gccって打ち込んでるならコンパイラ名はgccで通じるよ
正式にはGNU Compiler Collectionだけど
0026デフォルトの名無しさん
2009/06/09(火) 16:13:10arr[idx++] = data++;
idxとdataが別のものである場合、それぞれインクリメント前の値で処理が行われるのであってますよね?
0027デフォルトの名無しさん
2009/06/09(火) 16:13:490028デフォルトの名無しさん
2009/06/09(火) 16:16:02参照後 セミコロンまでの間のどこかで インクリメントがなされる
idx は arr[ ] に値を積んだ後 ; までの間
data は 右辺値 として参照した後 ; までの間
002926
2009/06/09(火) 16:17:59*p++ = *q++;
は完全に合法ですよね?
*(arr + idx++) = data++;
と展開するといかにも怪しい感じになるんですが、どうなんだろうと思いまして。。
0030デフォルトの名無しさん
2009/06/09(火) 16:19:29合法なはずだけどどうだったろうかと思って心配になってました。
ありがとうございました。
0031デフォルトの名無しさん
2009/06/09(火) 16:30:24hoge++ と書いた場所から 副作用完了点までのどこかで hoge のインクリメントが発生する
という仕様
hoge++ と書いた場所から 副作用完了点までの間に hoge(ポインタ使用のエイリアスも含む)
が登場しちゃうと仕様の立場としては
後のhoge参照前にインクリメントが発生するのか
後のhoge参照後にインクリメントが発生するのか
定まらない
(さらに C89なら このようなケースで鼻から悪魔出しても良いとなっている)
0032デフォルトの名無しさん
2009/06/09(火) 16:32:05何時インクリメントを発生させるかを規定しているわけではないのさー
0033デフォルトの名無しさん
2009/06/09(火) 16:50:550034デフォルトの名無しさん
2009/06/09(火) 16:54:39お前は何をやってもダメ
C言語どころか日本語も英語もダメ
とでも言えばいいのか?
0035デフォルトの名無しさん
2009/06/09(火) 17:35:11a[i++] = i ;
こいつは即論外として
a[i �@] = i ++ �A;
|i �@参照
|参照値により a[ ] を
|i �A参照
|i インクリメント (�A記述〜 ; までの間のにインクリメント操作挿入)
こう解釈できそうだけど
�@での i参照と �Aの i 参照の翻訳順(?)が �@→�A とは限らないから やっぱNG ってこと?
0036デフォルトの名無しさん
2009/06/09(火) 17:38:370037デフォルトの名無しさん
2009/06/09(火) 18:51:01A
↓ 添え字確定の為 i �@参照
↓ a[] に右辺値を代入
B
A〜B間ならどこでも i のインクリメントを発生させてよいことになる
ポストインクリメント演算子とその参照の共存は論外
0038デフォルトの名無しさん
2009/06/09(火) 20:34:550039デフォルトの名無しさん
2009/06/09(火) 20:39:07strcat()でできることと比べて何がしたいのか分かりやすく言ってくれ
0040デフォルトの名無しさん
2009/06/09(火) 20:43:43#include<stdio.h>
int main(void){
const char *p="abcde" "12345";
puts(p);
return 0;
}
0041デフォルトの名無しさん
2009/06/09(火) 21:16:48とやると
error C3861: 'getch':識別子が見つかりませんでした
となってしまいます。
なにがいけないんでしょうか?
(コンパイラはVC++EEです
0042デフォルトの名無しさん
2009/06/09(火) 21:18:20がソースの頭にないとか
0043デフォルトの名無しさん
2009/06/09(火) 21:42:380044デフォルトの名無しさん
2009/06/09(火) 21:44:130045デフォルトの名無しさん
2009/06/09(火) 22:29:14ではなくて、コンソールIO
0046デフォルトの名無しさん
2009/06/10(水) 05:21:15コンソールIOの略だったことを今更になって知った俺がいる。
0047デフォルトの名無しさん
2009/06/10(水) 06:01:34ソースコードのここはこうしたほうがいい
等の助言を頂くことはできますか?
0048デフォルトの名無しさん
2009/06/10(水) 06:16:40助言できない典型例は、「何がしたいのか分からないので改善方法も分からない」ってやつかなぁ。
まあ、気軽に書いてみたらいいよ。
0049デフォルトの名無しさん
2009/06/10(水) 06:19:19リンクを貼ってね
0050デフォルトの名無しさん
2009/06/10(水) 19:00:44codepad
ttp://codepad.org/
ここにソースを貼り付けるのがオススメだよ。
なお、2chに書いたソースの利権は2ch管理者の物になるので
根幹に関わる大事なところは伏せた方が絶対によい。
訴訟になったりした時のためにも。
0051デフォルトの名無しさん
2009/06/10(水) 19:12:250052デフォルトの名無しさん
2009/06/10(水) 19:23:48そもそも、そんな大事なソースなら掲示板に晒してはいけない。
0053デフォルトの名無しさん
2009/06/10(水) 19:37:290054デフォルトの名無しさん
2009/06/10(水) 20:12:16書いた人の物だろ。
んで、もしその規定に反するようなソースを貼り付けたら
どうなるのかは・・・知らない。
0055デフォルトの名無しさん
2009/06/10(水) 21:31:33法廷で立証できるかは疑問だがな
0056デフォルトの名無しさん
2009/06/10(水) 22:03:51ttp://piza2.2ch.net/tech/kako/984/984182993.html
ここで出てきた
>海外のプログラマーが、たったの七行足らずで
>DVDのプロテクトを解除するプログラムを作成!
これくらいなら主張できるんじゃない?
偶然かぶったと言い切れないだろ、さすがにね。
005756
2009/06/10(水) 22:06:21switch(掲示板に貼り付ける程度の10〜20行程度のプログラムに利権が
)
case 主張できない :自分の権利も認められない
case 主張できる :2ch運営の権利となる。
結局自分の権利は認められないことになるな。
0058デフォルトの名無しさん
2009/06/10(水) 22:06:250059デフォルトの名無しさん
2009/06/10(水) 22:18:59重要な部分とは、アルゴリズム=アイデアでしょ、アイデアは保護できない
0060デフォルトの名無しさん
2009/06/10(水) 22:25:46アルゴリズムは保護できるだろ?
0061デフォルトの名無しさん
2009/06/10(水) 22:26:58アルゴリズムもアイディアも保護できないなら、
何なら保護できるの?
0062デフォルトの名無しさん
2009/06/10(水) 22:29:00ああいうのは権利放棄されたのかね?それともそういう以前の問題かな?
0063デフォルトの名無しさん
2009/06/10(水) 22:31:24そういう詰め込み方がありなら
1レス2kBで相当書けそうな気はする
0064デフォルトの名無しさん
2009/06/10(水) 22:48:25広く一般に知れ渡っている知識やアルゴリズムは、著作権の対象とはならない。
これは一般的な考え方であって、実際には法廷で戦わないと結論はすべて出ない。
が、まず負けるだろう。
例えばだ、アルゴリズム辞典等で乗ってるアイデア等は、その後同じプログラムを
書いても、勝つことは難しい。では何が一番良いか、プログラムが同じでも、それに
長いコメントを書くことだ。コメントは明らかに著作物だと認められる。あと
大きなプログラムも著作権が認められやすい。
だが、実際は総て法廷で争う以外結論は出ない。
0065デフォルトの名無しさん
2009/06/11(木) 01:18:360066デフォルトの名無しさん
2009/06/11(木) 06:07:57NULLって数字としても使えるものなんですかね?
gccだとNULLをポインタ変数以外で使うと警告がでます。
0067デフォルトの名無しさん
2009/06/11(木) 06:28:540068デフォルトの名無しさん
2009/06/11(木) 07:09:28アルゴリズムもアイディアも保護できないなら、
何なら保護できるの?
0069デフォルトの名無しさん
2009/06/11(木) 07:10:40staticキーワードでローカル(プライベート)にする - C言語とC++入門勉強ルーム
ttp://www.mapee.jp/cpp/static_2.html
0070デフォルトの名無しさん
2009/06/11(木) 07:50:47著作権で保護されるのは実装、つまりプログラマがプログラムを書くことに費やした努力。
アルゴリズムを考えるのに費やした努力を保護するのは特許権。
0071デフォルトの名無しさん
2009/06/11(木) 08:23:12ありがとうございます。
ではソースを分割した際にexternをつけて関数などを宣言するのは理解しているのですが
プロトタイプ宣言ではなく関数の実体のところにexternをつけると扱いは同じなのでしょうか?
0072デフォルトの名無しさん
2009/06/11(木) 08:50:100073デフォルトの名無しさん
2009/06/11(木) 09:31:540074デフォルトの名無しさん
2009/06/11(木) 12:16:18その色データをエスケープシーケンスで文字”■”に色をつけて
コンソール上に画像みたいなものを表示させたいのですが
どうすればいいのでしょうか?
windows APIのDIBを使うのでしょうか?
0075デフォルトの名無しさん
2009/06/11(木) 12:22:090076デフォルトの名無しさん
2009/06/11(木) 12:57:390077デフォルトの名無しさん
2009/06/11(木) 13:29:470078デフォルトの名無しさん
2009/06/11(木) 15:11:01externは不要ですよ。
関数の場合
extern char foo(int num);
char foo(int num);
どっちでも同じ。
変数の場合はおっしゃるとおり
extern long hoge;
long hoge;
意味が違う。
0079デフォルトの名無しさん
2009/06/11(木) 20:30:07if(A){
if(B){
・・・・・
}
}
ってのと
if(A && B){
・・・・
}
って一般的には動作変わってしまうものでしょうか?
0080デフォルトの名無しさん
2009/06/11(木) 20:32:290081デフォルトの名無しさん
2009/06/11(木) 20:43:50Bに副作用があるなら変わるかな
0082デフォルトの名無しさん
2009/06/11(木) 20:45:290083デフォルトの名無しさん
2009/06/11(木) 20:50:43どっちもAが偽だったらBは評価しないでしょ。
0084デフォルトの名無しさん
2009/06/11(木) 20:56:27全く同一で、変わらないよ。
C++で&&が変にオーバーロードされているとかじゃないかぎり。
0085デフォルトの名無しさん
2009/06/11(木) 20:59:06変わらない。短絡評価があるんだから。
008781
2009/06/11(木) 21:12:24008879
2009/06/11(木) 21:35:37自身で実際書いたプログラムとしては、aを配列添字(別の関数から値を取得)、Bを配列として
条件式A : a!=-1 // エラー値
条件式B : b[a]==NULL
のように記述したのですが、>>79の前者だと・・・・・の部分が全く実行されず
疑問に感じたので質問させていただきました(自身はこの二つは同じものだと考えていたので)
ご指摘いただいた副作用や短絡評価について少し調べてみましたが、原因がよく分からなかったため
とりあえず後者の記述で統一しようかと思います
お騒がせしました。
0089デフォルトの名無しさん
2009/06/11(木) 21:38:580090デフォルトの名無しさん
2009/06/11(木) 21:48:43もし本当にそうだとしたら、原因は別のところにある。
使っているコンパイラの最適化のバグとか、メモリを破壊しているとかなど。
0091デフォルトの名無しさん
2009/06/11(木) 22:18:28いやいや、君C言語で仕事したことあるの??
0092デフォルトの名無しさん
2009/06/11(木) 22:18:49グローバル変数やstatic変数を使わなければ危険はないんでしょうか?
0093デフォルトの名無しさん
2009/06/11(木) 22:22:01printf("%x",dragon);
で16進数表示をさせると
0と表示されますが。
00や0aなどのように2桁で表示させるには
if文で一桁だった場合だけ0を付けるというやり方でよろしいでしょうか?
0094デフォルトの名無しさん
2009/06/11(木) 22:25:400095デフォルトの名無しさん
2009/06/11(木) 22:28:04double angle;
main(void)
{
printf("角度を入力");
scanf("%f",&angle);
printf("%f",angle);
}
何がだめなんでしょう
0096デフォルトの名無しさん
2009/06/11(木) 22:28:59scanf("%lf", &angle);
0097デフォルトの名無しさん
2009/06/11(木) 22:30:520098デフォルトの名無しさん
2009/06/11(木) 22:44:44あるよ?
短絡評価はいたずらにプログラムを複雑化し、可読性を下げる
さらには実行順序を強制することでコンパイラの最適化の機会さえ奪う
使うべきでない
0099デフォルトの名無しさん
2009/06/11(木) 22:49:36いる件について
0100デフォルトの名無しさん
2009/06/11(木) 22:52:470101デフォルトの名無しさん
2009/06/11(木) 22:54:53これ自体はこれで問題ないし、可読性も悪いとは思わない。
if (i >= 0) {
if (a[i] == NULL) {
}
}
可読性なら、こっちのほうがよろしくないと思うぐらいだ。
0102デフォルトの名無しさん
2009/06/11(木) 22:56:24structに入れようとしてもエラーが出てしまい、できません
0103デフォルトの名無しさん
2009/06/11(木) 23:00:48こんな風に書いたらエラーが出たって事?
typedef struct{
static int a;
static int b;
static char* c;
}ABC;
0104デフォルトの名無しさん
2009/06/11(木) 23:02:35static struct ttt a;
010591
2009/06/11(木) 23:09:25>さらには実行順序を強制することでコンパイラの最適化の機会さえ奪う
>101が言うような
if (i >= 0) {
if (a[i] == NULL) {
}
}
こんなif ifになっているコードと短絡評価は等価だよねぇ。
>短絡評価はいたずらにプログラムを複雑化し、可読性を下げる
可読性は水掛け論だから取り扱わないことにするとしても
>さらには実行順序を強制することでコンパイラの最適化の機会さえ奪う
こちらは全く当てはまらない指摘では?
0106デフォルトの名無しさん
2009/06/11(木) 23:15:20基本的な文体、構造体やポインタまでひととおり理解したら、次はライブラリの扱い方を勉強すべきと言われました
なのでライブラリを勉強しようと思うのですが・・・まず何をやればいいのかわかりません
最初に「Hello World」を表示したように、ライブラリの扱いを覚えるならまずこれをやれ、ってを教えてください
0107デフォルトの名無しさん
2009/06/11(木) 23:16:340108デフォルトの名無しさん
2009/06/11(木) 23:18:140109デフォルトの名無しさん
2009/06/11(木) 23:19:560110デフォルトの名無しさん
2009/06/11(木) 23:25:13つまり
#include<math.h>
を読み込んで平方根とか累乗の値を求めるのもライブラリを扱ってるうちに入るんですか?
しかし、それで何かができるって気がしません
ライブラリを使いこなせばあれこれできるようになると聞きますが
0111デフォルトの名無しさん
2009/06/11(木) 23:26:300112デフォルトの名無しさん
2009/06/11(木) 23:26:45じゃあ標準関数(ライブラリ)を使いそうなお題を自分で用意して
それに取り組め
0113デフォルトの名無しさん
2009/06/11(木) 23:29:05それは順序性のある条件だからそれでいい
(if二段構えの方がいいと思うが)
問題なのはこんなの
if(i >= 0 && j >= 0)
コンパイラはj >= 0を先にやりたくても出来ない
こんなのに短絡評価を使うのは馬鹿げているので、こう書くべきである
#define AND(A,B) (!!(A) & !!(B))
#define OR(A,B) (!!(A) | !!(B))
if(AND(i >= 1, j >= 0))
0114デフォルトの名無しさん
2009/06/11(木) 23:31:01C言語だけではたいしたことは事はできない(一部の天才を除く)。
これは別にC言語が悪いわけではないが、APIというものに頼らねばならない。
技術者ですらAPIや外部ライブラリに頼る形になる。
んでどうすりゃ良いかというと・・・
>基本的な文体、構造体やポインタ
これが「本当にしっかり理解出来ているなら」次にC++に進むのが個人的にはオススメ。
(理解出来てないと死ぬけど。)
そしてC++から利用できるライブラリがいっぱいあるから
それを使ってより色んな事が出来るようになれる。
0115デフォルトの名無しさん
2009/06/11(木) 23:31:17a != -1 && b[a]==NULL
a != -1&&b[a]==NULL
この二つって、演算子の前後の空白の違いだけだから問題ないよね
でも、それってこう読まれたりしないの?
a != -1 & &b[a]==NULL
0116デフォルトの名無しさん
2009/06/11(木) 23:31:46コンパイラがそれを最適化できるの?
0117デフォルトの名無しさん
2009/06/11(木) 23:33:070118デフォルトの名無しさん
2009/06/11(木) 23:34:21それは逆にコンパイラの最適化機能に期待しすぎだ。
そっちのほうが必ず速いという保証が全然ない。
むしろ遅くなる可能性も大きい。
>>115
しない。
0119デフォルトの名無しさん
2009/06/11(木) 23:34:29>>112
画像や動画をいじるプログラムを作れるようになるのが目的です
たとえばjpgファイルを読み込んで、色を反転させて表示させたりとか、そういうの
しかし「どこの延長線上にそれができるようになるのか」という、スタートラインがわかりません・・・
例えば「画面に赤い点を表示する」ということすらどうやっていいかさっぱりわからない
>>114
ええ、もう別の言語ですか・・・
0120105
2009/06/11(木) 23:35:19君のレスの言いたいことを理解したわ。
#define AND(A,B) (!!(A) & !!(B))
これは無理矢理にbool型ないしint型にした上でビット演算を適用している訳か。
・・・これって短絡評価による最適化の邪魔が無くなるというメリットより
bool型ないしint型に変換する方が遅そうだけど、本当に速い?
0121デフォルトの名無しさん
2009/06/11(木) 23:35:40ありがちだけどな。
0122デフォルトの名無しさん
2009/06/11(木) 23:35:56本当に基本はできた自信があるなら、
既存のプログラムのソース読んだら?
関係ありそうな本買ってきて、サンプルプログラム見るとか。
0123デフォルトの名無しさん
2009/06/11(木) 23:36:07maximal munchというルールがあってだな
&は後ろに&や=が来ないと確認してからトークン切られるようになってる
0124デフォルトの名無しさん
2009/06/11(木) 23:37:06&&と空白なしで記述された場合はそうとしか読まれないってことで大丈夫?
それと、短絡評価についてだけれど、
if (A && B)とあった場合に、コンパイラが気を利かせてBを先に評価するようなことはありえないの?
if (i >= 0 && 1==1) と書かれていた場合とかでも常に i>=0を評価する?
0125デフォルトの名無しさん
2009/06/11(木) 23:37:21画像は特定の圧縮フォーマットを使ってる場合はそれ相応のデコード処理をする必要があるけど
それをやってしまえば色深度に応じた2次元配列のデータに過ぎない。
0126デフォルトの名無しさん
2009/06/11(木) 23:38:06おお、ありがとうございます。すっきりしました
0127デフォルトの名無しさん
2009/06/11(木) 23:38:130128114
2009/06/11(木) 23:38:36>画像や動画をいじるプログラムを作れるようになるのが目的です
だからこそのC++なのだ。
C++はすんげー険しいけど、そういう事をしたいなら外部に転がっているライブラリを使うことになる。
>例えば「画面に赤い点を表示する」ということすらどうやっていいかさっぱりわからない
それは俺の言う、
>別にC言語が悪いわけではないが、APIというものに頼らねばならない。
>技術者ですらAPIや外部ライブラリに頼る形になる。
ってやつだ。つまりC言語の言語仕様にないから純粋なC言語ではできないんだ。
そして外部に転がっているライブラリはC++用のライブラリでクラス化されていたりする。
その方が使いやすいからね。
0129デフォルトの名無しさん
2009/06/11(木) 23:38:51短絡評価は必ず左からやることになってるけど、
1==1は、常に真だからコンパイル時に取り除かれちゃう可能性はある。
0130124
2009/06/11(木) 23:39:23if (A || B)とあった場合に、コンパイラが気を利かせてBを先に評価するようなことはありえないの?
if (i >= 0 || 1==1) と書かれていた場合とかでも常に i>=0を評価する?
0131デフォルトの名無しさん
2009/06/11(木) 23:40:27>>111がボソッと言っているが、
もう目的としての勉強は要らない段階。
あとは、これ作りたい(作らないといけない)→それにはあれが必要
→「それ」を使えるようにする(or 挫折)、の繰り返しで。
0132デフォルトの名無しさん
2009/06/11(木) 23:40:58そういうものですか
なんかわかりやすい「次はこれをやれ」ってのは、文法を覚えるときとは違ってないんですね
>>125
とりあえずbmpファイルをtxtファイルに変換してみて読み込んでいじってみるとかそれくらいはできたんですけど
bmpファイルの読み方がいまいちわかんないんで思い通りに画像をいじるという段階には程遠いんです
1ピクセルごとの三原色とかわかりやすく順番に書いててくれたらいいのに、とか
いや圧縮してるわけだからそういうふうにはならないんだろうけど
0133デフォルトの名無しさん
2009/06/11(木) 23:41:03amazonあたりで「画像処理」とかで検索したらそういう書籍がいっぱいでてくるよ。
まあでも、その前に、標準関数でファイル入出力とか文字列操作とかは
できるようになってたほうがいいね。
0134デフォルトの名無しさん
2009/06/11(木) 23:41:15言語仕様上そうなんじゃない?
||がオーバーロードされていたらどうするんだ。
・・・と思いきやC言語スレだったか。
0135デフォルトの名無しさん
2009/06/11(木) 23:43:16BMPにも種類がいろいろあるとかはさておいても、
RGB値についてはわかりやすく順番に並んでない?
0136128
2009/06/11(木) 23:43:17だからこそクラス…(ry
まあ俺はC++大好き人間だから多少偏ったこと言ってるかも。
他の人の意見も合わせて総合的に自分で判断してくれ。
でも俺はC++に移るのがオススメ。
0137デフォルトの名無しさん
2009/06/11(木) 23:45:37||をオーバーロードするのとboolへのキャストを用意するのとどっちがいいんだろ
0138デフォルトの名無しさん
2009/06/11(木) 23:46:17何の形式だか忘れたけど、1ピクセル分のRGBを16ビットに詰め込んでて
Gだけ6ビット割り当ててるんだったかな?
人間の目はRやBよりGの変化に敏感だからって
0139デフォルトの名無しさん
2009/06/11(木) 23:47:19要するにjpgファイルやらbmpファイルやらが、どういうふうに処理されているのか理解できていれば、データをいじれるってことですよね?
>>128
やはりC++ですか
次はJavaに手を出してみようかなと思っていたのですが、そういうことなら考えてみます
とはいえ、そもそもCですらまともにちゃんとしたプログラムを何か作れてもいないわけだから、別の言語の習得なんてまだまだだと自分では思っていたのですが
>>135
とりあえず何枚かデタラメに白と黒だけのbmpファイル作ってtxtに変換して読み込んでみたんですけどよくわかんなかったです
0140デフォルトの名無しさん
2009/06/11(木) 23:48:03それは一般的な16bitのRGBフォーマットだ
0141デフォルトの名無しさん
2009/06/11(木) 23:51:04今mspaint.exeで白黒24bitBMPを作ってバイナリエディタで見てみたんだが、データ部は見事に
00 or FFで埋め尽くされていたよ。
0142128
2009/06/11(木) 23:52:26>次はJavaに手を出してみようかなと思っていたのですが、そういうことなら考えてみます
ああ、Javaを教えてくれる人がもし身近にいるとかだったらJavaでもいいかも。
でも所詮Java止まりだろう。
もっと高級言語(Pythonとか)でもいいだろうけど、
普遍的なのはやっぱC++だよ。
C++は難解さも一段と勝るけど。
0143デフォルトの名無しさん
2009/06/11(木) 23:52:52まずは
ファイルフォーマット 仕様
という単語にbmp jpeg pngといったキーワードとセットにしてぐぐるということを教えてあげないと
0144デフォルトの名無しさん
2009/06/11(木) 23:53:08txtで読み込んでました
あの超初心者っぽい質問なんで恥ずかしいんですが、そんなふうにファイルの内容を16進数表記で表示させるにはどうすればいいんでしょうか
0145デフォルトの名無しさん
2009/06/11(木) 23:54:480146デフォルトの名無しさん
2009/06/11(木) 23:55:24ごもっとも。
>>144
ばいなりえd、、、
fgetcして、%Xで出力すればいい
0147デフォルトの名無しさん
2009/06/11(木) 23:57:23ひとつ確認
if(a && b)
if(a & b)
副作用が無くてこれらの意味が同じになる場合についてのみ話してるんだよね?
0148デフォルトの名無しさん
2009/06/11(木) 23:58:43例えばこれを読み込んでデータを二次元配列に展開して、FFを00に、00をFFに変えたのち出力すれば白と黒が反転したbmpファイルができるってことですよね?
画像をいじるプログラムを作れるようになるという、最初の一歩が踏み出せた気がします
0149デフォルトの名無しさん
2009/06/11(木) 23:59:08違うぽ
0150デフォルトの名無しさん
2009/06/12(金) 00:00:271、画像フォーマットを勉強して、1からエンコーダ・デコーダを書く。
2、ありもののライブラリの使い方を調べる。
初心者を脱したくらいのレベルだと1のほうに魅力を感じるかもしれない。
それは悪いことではないが、しばらくプログラマをやっていくと、2の方が重要なことに気づく。
30年かけて蓄積されたライブラリを最初から作ったら、作りたいものができるまでそれ以上の時間がかかるわけだし。
外部ライブラリを使うというのは独特、これはこれで高度な技術。
C言語の外部ライブラリを使いこなせるようになるには、C言語の知識だけじゃダメだったりする。
ライブラリとは何か、ってとこからOSや処理系の知識まで複数の分野をカバーする必要がある。
文法や標準ライブラリの勉強というのはいわば箱庭の中で遊んでいるようなもの。
その温室から外に出るには、自力で調べ自力で試行錯誤する力を身につけなければならない。
っつっても、いまやグーグル先生がいるから茨の道手ほどでもないんだけどけどね。
0151デフォルトの名無しさん
2009/06/12(金) 00:00:43エンディアnゲフンゲフン
0152デフォルトの名無しさん
2009/06/12(金) 00:00:44全部反転したらだめだよ。
RGB値のとこだけ。
それがどこなのかはファイルフォーマットを調べてね。
一歩踏み出せてよかった
0153デフォルトの名無しさん
2009/06/12(金) 00:03:27参考書や規格書を毎回手でめくって調べてたんだろうか
想像も付かない
0154デフォルトの名無しさん
2009/06/12(金) 00:04:50違う?
意味が変わる場合は設計も変えろって事?
0155デフォルトの名無しさん
2009/06/12(金) 00:05:19yes
高い書籍買ったりしてたよ。
0156デフォルトの名無しさん
2009/06/12(金) 00:09:08a == 2
b == 1
であるとき
( a && b ) == 1
( a & b ) == 0
!!a == 1
!!b == 1
( !!a & !!b ) == 1
0157デフォルトの名無しさん
2009/06/12(金) 00:10:10でもある程度の時代からパソ通のフォーラムがこのスレのような専門的な質問とかも
できるようになってたので金持ってるやつはそういうところで情報交換してたみたい。
0158デフォルトの名無しさん
2009/06/12(金) 00:12:41プレーンテキストファイルだったけど、コンパクトにまとまってて重宝した。
アセンブラもついてたしな。
0159デフォルトの名無しさん
2009/06/12(金) 00:14:14コンパイラが最適化しうる余地を作ったってことになるのかなぁ?
0160デフォルトの名無しさん
2009/06/12(金) 00:15:14バイブルには載ってないけどDLLのstrings見るとそれっぽい関数があるんだけど!
という時代?
0161デフォルトの名無しさん
2009/06/12(金) 00:16:490162デフォルトの名無しさん
2009/06/12(金) 00:17:42あのマニュアルは良かった
Windows95 で使ってたから
DOSモードで直接RGBプレーンに書き込んで画面表示なんかも出来たな
A000:0000 〜 だっけか
0163デフォルトの名無しさん
2009/06/12(金) 00:18:21今でも参考書や規格書は買うが。
昔はネットニュースでFAQをはじめとするドキュメントを入手してたな。
あとはフリーソフトウエアのソース参考にしたりとか。
0164デフォルトの名無しさん
2009/06/12(金) 00:19:180165デフォルトの名無しさん
2009/06/12(金) 00:20:07それはテキストVRAMの位置じゃね?
というかDOS/VとPC98系ではその辺の仕様が違うはず
0166デフォルトの名無しさん
2009/06/12(金) 00:20:16if (複雑な条件 && i != 0)
と書かれていた場合に、 i != 0を先に評価することで処理が速くなることはあると思うよ
0167デフォルトの名無しさん
2009/06/12(金) 00:21:280168デフォルトの名無しさん
2009/06/12(金) 00:27:11・両辺の評価を行うことが強制されるのかどうか
・評価順を最適化することが許されているのかどうか
これがわからん
>>113はそうであるかのごとく書いているけれど
0169デフォルトの名無しさん
2009/06/12(金) 00:29:10両辺の評価は強制
最適化は実際やってるコンパイラがあるのかわからん
0170デフォルトの名無しさん
2009/06/12(金) 00:30:29&は+とかと同じだから
両辺とも評価されるし、評価順は不定(コンパイラが好きにしていい)
0171デフォルトの名無しさん
2009/06/12(金) 00:31:33ncursesライブラリでコンソール上に色付きで表示できるよ
画像データはBMPが単純だからBMPのフォーマットを調べてバイナリデータを解析すればいいよ
0172デフォルトの名無しさん
2009/06/12(金) 00:35:27SetConsoleTextAttribute
SetConsoleCursorPosition
0173デフォルトの名無しさん
2009/06/12(金) 02:01:43右辺なり左辺なりが0であることがわかれば、もう一辺の値がどうであれ0になることはわかるのにね
ああでも最適化できるかというと難しい気がしてきたわ。。
0174デフォルトの名無しさん
2009/06/12(金) 02:21:47副作用がなければそういう最適化もできるよ。
そもそも今時のコンパイラなら、短絡評価の違いが現れる場合以外、
&でも&&でも同じように最適化したコードを吐いても不思議ではないと思う。
0175デフォルトの名無しさん
2009/06/12(金) 03:08:54平均実行速度の最適化なら見た目の記述云々より
必要な処理を最低限のリソースで実現するプログラムがいい
コンパイラの最適化なんかよりアセンブリか機械語レベルで人間が直した方がいい
0176デフォルトの名無しさん
2009/06/12(金) 03:19:570177デフォルトの名無しさん
2009/06/12(金) 03:21:43なるほど。。コンパイラさまさまだね
>>175
すごいですねー
実際どういうときに速くなりますか?
0178デフォルトの名無しさん
2009/06/12(金) 04:30:19>AND(A,B) (!!(A) & !!(B))
VC++2008だと最適化有り無し共に&&より遅かった
0179デフォルトの名無しさん
2009/06/12(金) 04:33:33NULLはCでは
#define NULL (void *)0
とかで定義されてる
C++では単純な0かもしれないし、何かのオブジェクトかもしれない
32ビット環境では、intといったら32ビットで、メモリアドレスも32ビットだが
64ビット環境では、intといったら32ビットで、メモリアドレスが64ビットになるかもしれない
アドレスと整数を暗黙のキャストで都合よく変換できてることに依存すると後々困ったことになる
型が異なる演算や代入なんかでNULLを使いたいならキャストすべし
0180デフォルトの名無しさん
2009/06/12(金) 07:54:31やっぱり遅そうだもんな。
どう考えても処理が増えてる。
0181デフォルトの名無しさん
2009/06/12(金) 08:42:480182デフォルトの名無しさん
2009/06/12(金) 10:13:51!!A はコンパイラにとってはA ? 1 : 0 と同じこと。
つまり、条件分岐を行なうか条件セットを行なうコードになる。
従って、処理速度的にメリットはない。
尤も、マクロではAND(i >= 1, j >= 0)としているので
省略はされて、(i >= 1) & (j >= 0) と評価されるから関係ないといえば関係ない。
で、このコードは条件分岐を二回経てから&を行なうので、
単純に i >= 1 && j >= 0と書くより早くなる筈がない。
>>113
結論、せめて得意のCPU向けのアセンブリ出力くらい眺めてから書こう。
>>181
メモリアクセスは「全く」増えないと思うよ。
恐らくは最適化で全てレジスタに配置されている筈だから。
0183デフォルトの名無しさん
2009/06/12(金) 14:17:27関数名が思い出せない
0184183
2009/06/12(金) 14:23:240185デフォルトの名無しさん
2009/06/12(金) 15:01:440186デフォルトの名無しさん
2009/06/12(金) 16:00:21と
for(i=0;i<10;++i)
0187186
2009/06/12(金) 16:01:05for(i=0;i<10;i++){ }
と
for(i=0;i<10;++i){ }
ってどう違うのでしょうか?
0188デフォルトの名無しさん
2009/06/12(金) 16:01:53C言語では一緒
0189デフォルトの名無しさん
2009/06/12(金) 16:09:23原則同じ。C++流に慣れた人がしばしば後者を使いたがる。
# 私もだけど。
0190デフォルトの名無しさん
2009/06/12(金) 16:53:430191デフォルトの名無しさん
2009/06/12(金) 17:57:30C++だとどう違うの?
「コンパイラによる最適化は無効な条件下において」
C言語でもC++でも、
for(i=0;i<10;i++){ }
は後置増分演算子だからテンポラリオブジェクトを作る分だけ
for(i=0;i<10;++i){ }
の前置増分演算子版よりか遅くなりそうなイメージなのだが。
0192デフォルトの名無しさん
2009/06/12(金) 18:01:55実体がクラスだと無駄なコピーコンストラクタ呼ばれたりするので大差が付くことがある
0193デフォルトの名無しさん
2009/06/12(金) 18:09:52つまり、インクリメントされたiの参照が返る。
++iはコピーしない文、コストが安い…だったと思った。^^
イテレータの話が出たのでついでに。
STL愛用者は(そうできるケースでは)
for( i = 0 ; i != 10; ++i) { }
のように書いたりする。なぜなら、
!= をサポートするイテレータの方が < をサポートするイテレータよりも種類が多いから。
0194191
2009/06/12(金) 18:13:26ありがとう。
イテレータじゃなくて生のポインタだったとしても、
「コンパイラによる最適化は無効な条件下において」
は遅くんだよね?
実測は不可能な程度だとしても、理論値的な意味で。
0195デフォルトの名無しさん
2009/06/12(金) 19:36:12組込型なら違いはない。
その例では式の結果が使われていないから前置インクリメントと同じコードを吐けばいいし、
例えそうでなかったとしても、インクリメントする命令を後回しにすればいいだけ。
よほど複雑な式ならともかく、最適化なんて意識しなくても自然とそういうコードになると思う。
0196デフォルトの名無しさん
2009/06/12(金) 19:45:520198デフォルトの名無しさん
2009/06/12(金) 19:56:32Linuxとかだと、最近は256色端末も使えると思う。
どれくらい広まっているのか知らないけど。
0199デフォルトの名無しさん
2009/06/12(金) 19:56:40なまぽで for 文の条件式ならほぼ確実にコンパイラが最適化しちゃうけど
最適化がないなら、理論的にはPOD型でも遅くなる。
この件に関しては名著 C++ Coding Standardsでも
「時期尚早に最不適化してしまわない」や
「インクリメント演算子とデクリメント演算子の標準形式を使おう」
といった項で説明している。小さな習慣ですむなら守るべきだろう。
0201デフォルトの名無しさん
2009/06/13(土) 13:31:53x86 + gcc の場合だけど、前置式も後置式もステップ数は変わらなかった
0202デフォルトの名無しさん
2009/06/13(土) 15:30:50最適化禁止で?
0203デフォルトの名無しさん
2009/06/13(土) 15:31:430204デフォルトの名無しさん
2009/06/13(土) 15:34:450205デフォルトの名無しさん
2009/06/13(土) 15:35:30いいえ
0206デフォルトの名無しさん
2009/06/13(土) 15:42:210207デフォルトの名無しさん
2009/06/13(土) 15:45:340208デフォルトの名無しさん
2009/06/13(土) 16:54:27typedef struct {
int NO;
char NAME[10];
} STD_t;
STD_t sample[2];
sample[0].NAME="長谷川";
こんな感じで構造体char型のNAMEに文字列を入れたら
「'const char [5]' から 'char [10]' に変換できません。」というエラーになりました。
constについて調べましたが、定数宣言?は行ってませんし、なぜこういうことになったのでしょうか?
0209デフォルトの名無しさん
2009/06/13(土) 17:00:09char nane[10];
name = "長谷川";
ができないのと同じ。
0210デフォルトの名無しさん
2009/06/13(土) 17:00:14char NAME[10];
を
char *NAME;
にするか、
sample[0].NAME="長谷川";
をstrcpyなんかを使って書き直せ
0211デフォルトの名無しさん
2009/06/13(土) 17:09:160212201
2009/06/13(土) 17:19:53最適化しない場合で。
"i++"より"++i"が優れてるのは、演算結果を一時的に
覚えておく必要が無い点だけど、レジスタがたくさんある普通の
CPUで単純な演算なら、その辺の差は必ずしも出ない
0213デフォルトの名無しさん
2009/06/13(土) 17:24:00Effective C++の第二版にも書いてあった気がする。
Google Coding Standardsにも確か書いてあったと思う。
いるんだよ、こういう人がw
0214デフォルトの名無しさん
2009/06/13(土) 17:28:24PowerPCターゲットにしたコンパイラで、最適化しても前置インクリメントの方が
速くて、そっち使ってたことがあったな。
0215デフォルトの名無しさん
2009/06/13(土) 17:32:42やってることが少ないんだから
前置きを習慣づけて損することはないならそっちの方がいいと思う
0216デフォルトの名無しさん
2009/06/13(土) 18:21:50これを高速化するにはハードを変えるしかないんでしょうか?
0217デフォルトの名無しさん
2009/06/13(土) 18:28:11もうこれ以上無理っていうところで初めて実際に出力するようにすれば
だいぶ早くなります。
0218デフォルトの名無しさん
2009/06/14(日) 01:34:59ファイルI/Oで構造体を丸ごとバイナリread/writeするのは危険ってことでしょうか
0219デフォルトの名無しさん
2009/06/14(日) 01:36:51読み込みと書き込みを行うのが同じエンディアンでCPUのビット数が同じなら問題ないはず
0220デフォルトの名無しさん
2009/06/14(日) 01:38:07危険です
0221デフォルトの名無しさん
2009/06/14(日) 01:38:53にゃんでやねん!
0222デフォルトの名無しさん
2009/06/14(日) 02:59:26やるのなら、コンパイラに対してパディングするなっていう指示をした上でやるべき。
0223デフォルトの名無しさん
2009/06/14(日) 08:50:25同一OS環境で、コンパチCPUで 、同一アプリケーションで読み書きかなら問題ない。
ひとつでも違えば危険、
0224デフォルトの名無しさん
2009/06/14(日) 08:51:560225デフォルトの名無しさん
2009/06/14(日) 09:41:10コード全体で使いまわしてる例が多いな。
それをやられると、すごいコードに柔軟性がなくなる。
0226デフォルトの名無しさん
2009/06/14(日) 12:03:25というか、データ構造の仕様が先にあって
それに合わせて構造体を定義するものだろう
0227デフォルトの名無しさん
2009/06/14(日) 12:55:21エンディアンの問題があったりすると思いますが、
完全に安全なプログラム(パディングなし、他の環境でコンパイルした
プログラムでも全く同じファイルを書き出す・読み出せる)
にするためにはどうするのが望ましいでしょうか。
(あるていど速度も犠牲にするということで)
0228デフォルトの名無しさん
2009/06/14(日) 13:21:57charで読み出して合成するしかないね
でも浮動小数点は・・・・
0229デフォルトの名無しさん
2009/06/14(日) 13:22:380230デフォルトの名無しさん
2009/06/14(日) 13:25:50writeWord(FILE* fp, WORD w)
{
fputc(w & 0xff, fp);
fputc((w>>8) & 0xff, fp);
}
writeDWord(FILE* fp, DWORD w) ・・・
みたいな関数を作っておいて、項目ごとに書き出せばいいよ。
0231デフォルトの名無しさん
2009/06/14(日) 13:26:03汎用的なデータ形式にエンコード/デコードするのが正攻法。
0232デフォルトの名無しさん
2009/06/14(日) 13:31:240233デフォルトの名無しさん
2009/06/14(日) 13:31:26ファイルのヘッダは、構造体まるごとリードライトのバイナリなのに、
本体はテキストになってるって変態フォーマットも見たことある。
0234デフォルトの名無しさん
2009/06/14(日) 13:36:18むしろその方が他のアプリと連携しやすい。
0235デフォルトの名無しさん
2009/06/14(日) 13:59:31パディングがあっても無くても、環境ごとに構造体を
正しく定義すればOK
汎用性を求めるなら229の言うように全部
unsigned charにするのが確実
0236デフォルトの名無しさん
2009/06/14(日) 16:25:41バイナリが将来にわたる保守性を破滅的状況に導く極端なケースについても紹介。
0237デフォルトの名無しさん
2009/06/14(日) 16:46:060238デフォルトの名無しさん
2009/06/14(日) 16:47:16・・・っとここはC言語スレだったか。
0239デフォルトの名無しさん
2009/06/14(日) 17:02:41それをやろうという概念が、シリアライズ(マーシャリング)。
ということで検索したらこんなのあった。別に推薦しないけど。
ttp://kmaebashi.com/programmer/serializer/index.html
0240デフォルトの名無しさん
2009/06/14(日) 17:03:17があるのに
#ifndef HOGE
#define HOGE
#endif
を使うのはどうして?
0241デフォルトの名無しさん
2009/06/14(日) 17:05:40pragma はコンパイラによって様々
once が使えないことがあるから
0242デフォルトの名無しさん
2009/06/14(日) 17:07:050243デフォルトの名無しさん
2009/06/14(日) 17:19:20そう。
だけどあまりに人気があるpragmaだから、他のコンパイラも採用していることがある。
0244デフォルトの名無しさん
2009/06/14(日) 17:27:51コンパイル時間も多くかかるようになる(場合が多かったと記憶している)
0245デフォルトの名無しさん
2009/06/14(日) 17:47:28#include <stdio.h>
#include <stdint.h>
enum Endian {
LITTLE_ENDIAN,
BIG_ENDIAN
};
uint32_t read_uint32(const char* data, Endian e) {
uint32_t ret = 0;
unsigned char* p = (unsigned char*)data;
int i;
switch(e) {
case LITTLE_ENDIAN: for(i = 0; i < 4; ++i) ret += p[i] << i * 8; break;
case BIG_ENDIAN: for(i = 0; i < 4; ++i) ret += p[3 - i] << i * 8; break;
}
return ret;
}
int main(void) {
char little[] = {0xDD, 0xCC, 0xBB, 0xAA}; // リトルエンディアンで保存された0xAABBCCDD
char big[] = {0xAA, 0xBB, 0xCC, 0xDD}; // ビッグエンディアンで保存された0xAABBCCDD
printf("%0X %0X\n", read_uint32(little, LITTLE_ENDIAN), read_uint32(big, BIG_ENDIAN)); // => 0xAABBCCDD 0xAABBCCDD
}
0246デフォルトの名無しさん
2009/06/15(月) 01:44:43正しい
けど実行環境のバイトオーダーが分かってるなら、
普通に4バイト読んで、必要に応じてhtonl()等を呼べばいい
0247デフォルトの名無しさん
2009/06/15(月) 02:22:13関係ないがLITTLE_ENDIANとBIG_ENDIANは記号定数としてstdio.hで定義されてる可能性がある
その書き方で変換できてるが、こういう場面では += を使わずに |= を使うべき
あるいは
uint8_t *p = (uint8_t*)&ret;
for(i=0; i<4; ++i, ++p) *p = data[i];
のようにも書ける
0248デフォルトの名無しさん
2009/06/15(月) 07:57:44もうすこし改良することにしました
0249デフォルトの名無しさん
2009/06/15(月) 19:48:08Cを演習しながら覚えられる良書はありませんか?
0250デフォルトの名無しさん
2009/06/15(月) 19:56:50書籍スレも見つけられないような盆暗には、どんな良書も焚き付け程度にも役に立たないと思いますが。
0251デフォルトの名無しさん
2009/06/15(月) 19:59:29なんで>>249みたいなところに仕事が行くんだろう?
0252デフォルトの名無しさん
2009/06/15(月) 20:00:53代わりに見つけておいた。
まぁ、業務命令なら命令出した人間に聞くのが筋だろうけどね。
推薦図書/必読書のためのスレッド 49
http://pc12.2ch.net/test/read.cgi/tech/1244882261/
0253デフォルトの名無しさん
2009/06/15(月) 20:01:150254デフォルトの名無しさん
2009/06/15(月) 20:02:13>253か、或いは外注に出せる予算がなくなって内製せざるを得なくなったとか。
まぁ、ろくなもんじゃないよ。
0255デフォルトの名無しさん
2009/06/15(月) 20:08:400256デフォルトの名無しさん
2009/06/15(月) 20:21:38まあいっか。プログラマが世の中にたくさんいるってことは簡単にできんじゃね?
ちょっくらおぼえて作ってよ。C言語っての有名らしいしさ。
という発想なんじゃないのかなー
0257デフォルトの名無しさん
2009/06/15(月) 21:30:41プログラミング言語のない人が書いたCのプログラムなんて
やさしさの半分はメモリリークでできているでしょう。
0258デフォルトの名無しさん
2009/06/15(月) 21:44:200259デフォルトの名無しさん
2009/06/15(月) 21:46:23出るんですけどなぜ?
0260デフォルトの名無しさん
2009/06/15(月) 21:48:21x^n/n! が無限大というか double で扱える範囲外とか
0261デフォルトの名無しさん
2009/06/15(月) 22:42:36どうすればいいでしょうか?
一応エスケープシーケンスを使って8色の画像なら表示できました。
できれば256色表示したいのですが・・・
0262デフォルトの名無しさん
2009/06/15(月) 22:43:400263デフォルトの名無しさん
2009/06/15(月) 22:45:160264デフォルトの名無しさん
2009/06/15(月) 22:49:120265デフォルトの名無しさん
2009/06/15(月) 22:53:37あと、テレビとかで、外人のジャーナリストとか学者がタイプするところを
みてると、けっこう一本指打法だったりする。
0266デフォルトの名無しさん
2009/06/15(月) 23:01:43ほとんどのプルグルマは思考速度の方がはるかに遅い^^
考えてる時間1000に対して打ち込む時間1。
他人のコードを読んでいる時間が1000000、
課長が俺好みの女で業務中にわざと足を広げて
俺にパイパンのあそこをちらちらと見せ付けてくるのが気になってる時間が1000000000000くらい。
0267デフォルトの名無しさん
2009/06/15(月) 23:04:34時間比率から考えると
女課長は脳内に1万人以上24時間待機してるな
0268デフォルトの名無しさん
2009/06/15(月) 23:04:53タイピング速度をもろ要求されるのはパンチャーくらいだろ
とにかく打つのが仕事なんだし
0269デフォルトの名無しさん
2009/06/15(月) 23:08:36256色表示可能な端末エミュレータの準備はできてる?
0270デフォルトの名無しさん
2009/06/15(月) 23:08:480271デフォルトの名無しさん
2009/06/15(月) 23:10:40なるべく静かで、なるべく速い方がかっこいい。速いけどうるさいのははた迷惑
0272デフォルトの名無しさん
2009/06/15(月) 23:30:520273デフォルトの名無しさん
2009/06/15(月) 23:33:11会社組織でやってるとバンバン仕事回ってきて死ぬよ
バグ鳥は他人がやってくれるならいいけど
0274デフォルトの名無しさん
2009/06/15(月) 23:35:260275デフォルトの名無しさん
2009/06/15(月) 23:35:49ひたすらコーディングするだけ。
0276デフォルトの名無しさん
2009/06/15(月) 23:41:24タイピング速度を上げて生き残れ
0277デフォルトの名無しさん
2009/06/15(月) 23:42:330278デフォルトの名無しさん
2009/06/15(月) 23:43:19頭の中にコードができてるのに、タイプが追いつかないであせることがしばしばある。
0279デフォルトの名無しさん
2009/06/15(月) 23:46:38脳が追いつかないのかよ。ご愁傷様
0280デフォルトの名無しさん
2009/06/15(月) 23:49:030281デフォルトの名無しさん
2009/06/15(月) 23:50:51「パンチャーじゃねえし」とか言って、暴れてるやついたな。
コンプ強すぎ。
0282デフォルトの名無しさん
2009/06/15(月) 23:55:00行数カウントは難しいかも
トータルではあまり行数は増えないけど
書く量はそこそこ
0283デフォルトの名無しさん
2009/06/15(月) 23:55:04いつも書いてる途中でリファクタリングしまくってる
0284デフォルトの名無しさん
2009/06/16(火) 00:40:58{
int i,sum=0;
int num[3] = {10,20,30};
for(i=0; i<(sizeof(num)/sizeof(num[0])); i++)
sum += num[i];
printf("%d\n", sum); // @1
hoge(num);
return 0;
}
void hoge(int *num)
{
int i,sum=0;
for(i=0; i<(sizeof(num)/sizeof(num[0])); i++)
sum += num[i];
printf("test : %d\n", sum); // @2
}
hoge関数でsizeofを読んでしまうとポインタサイズの取得になってしまい困っていますs。
@1と@2の結果を同じにしたいのですが、何か良い方法がないでしょうか?
0285デフォルトの名無しさん
2009/06/16(火) 00:46:28素直にmain()で求めたsizeof(num) / sizeof(num[0])を関数の
パラメータに持たせなせえ
0286デフォルトの名無しさん
2009/06/16(火) 00:47:57↓
hoge(num,(sizeof(num)/sizeof(num[0])));
void hoge(int *num)
↓
void hoge(int *num,int size)
for(i=0; i<(sizeof(num)/sizeof(num[0])); i++)
↓
for(i=0; i<size; i++)
0287デフォルトの名無しさん
2009/06/16(火) 00:55:27for(i=0; i<(sizeof(num)/sizeof(num[0])); i++)
↓
for(i=0; i<size; i++)
0288デフォルトの名無しさん
2009/06/16(火) 01:00:57関数 hogeの中の num はポインタ型( int* 型)。
型が違うのだから、当然利用するメモリサイズも違う。
配列型は全体のサイズを1要素のサイズで割るとその要素数がわかるというだけの話で
ポインタ型にはそのような特性はない。
したがって、hoge を
void hoge( int (*num)[3] ) {
int i,sum=0;
for(i=0; i < sizeof *num / sizeof (*num)[0]; i++)
sum += (*num)[i];
printf("test : %d\n", sum); // @2
}
のように記述し、呼び出しでは
hoge( &num );
とすれば、意図したとおりの動作となる。
0289デフォルトの名無しさん
2009/06/16(火) 03:10:04このときのhogeの引数の型って何になるの?
0290デフォルトの名無しさん
2009/06/16(火) 07:07:51int(*)[3] (int3つの配列へのポインタ)
0291デフォルトの名無しさん
2009/06/16(火) 07:37:31サイズ固定で汎用性がないけどね
0292デフォルトの名無しさん
2009/06/16(火) 13:08:09配列の要素数って最初に宣言しないといけないんですか?
たとえば
int a[];
って宣言しといて、aにどんどん要素を入れていってあとで要素数を決めるってことはできないんでしょうか
0293デフォルトの名無しさん
2009/06/16(火) 13:09:04途中で追加することはできません。頑張ってmalloc()/realloc()/free()の使い方を勉強してください。
0294デフォルトの名無しさん
2009/06/16(火) 13:14:300295デフォルトの名無しさん
2009/06/16(火) 13:16:46reloadしろ
0296デフォルトの名無しさん
2009/06/16(火) 13:45:10realloc()だけあれば他は要らないけどね。
# 初心者は使い分けた方が判り易いか……
0297デフォルトの名無しさん
2009/06/16(火) 15:38:35free(ptr) = realloc(ptr, 0) も保証されてるの?
0298デフォルトの名無しさん
2009/06/16(火) 15:40:12realloc(ptr,0)の戻り値はNULLもしくはfreeに渡すことができるポインタらしいんだけど。
0299デフォルトの名無しさん
2009/06/16(火) 15:44:39--
realloc() は、ポインタ ptr が示すメモリブロックのサイズを変更して size バイトにする。
新旧のサイズのうち、小さいほうのブロックに含まれる内容は変更されない。
新しく割り当てられたメモリの内容は初期化されない。
size がどの値であっても、 ptr が NULL の場合には malloc(size) と等価である。
size が 0 で ptr が NULL でない場合には、 free(ptr) と等価である。
ptr が NULL 以外の場合、 ptr は以前に呼び出された malloc(), calloc(), realloc() のいずれかが返した値でなければならない。
ptr が指す領域が移動されていた場合は free(ptr) が実行される。
--
4行目と5行目に注目。
0300デフォルトの名無しさん
2009/06/16(火) 15:52:390301デフォルトの名無しさん
2009/06/16(火) 16:07:24ttp://www.freebsd.org/cgi/man.cgi?query=realloc&apropos=0&sektion=0&manpath=FreeBSD+7.2-RELEASE&format=html
0302デフォルトの名無しさん
2009/06/16(火) 16:18:470303デフォルトの名無しさん
2009/06/16(火) 16:23:59使い分けた方がいいんじゃなかろか。
0304デフォルトの名無しさん
2009/06/16(火) 16:43:47malloc free と等価であることが明らかな環境であれば、reallocで済ませると。
すごーい
0305デフォルトの名無しさん
2009/06/16(火) 21:45:300306デフォルトの名無しさん
2009/06/16(火) 22:35:45#define FREE(p) realloc(p,0)
0307デフォルトの名無しさん
2009/06/16(火) 22:37:32そんなプロはおらんやろ〜
0308デフォルトの名無しさん
2009/06/16(火) 23:36:45そうであれば、二重freeの危険性があるfree使うより、reallocで解放した方が安全だったりする?
0309デフォルトの名無しさん
2009/06/16(火) 23:38:420310デフォルトの名無しさん
2009/06/16(火) 23:41:19それなら
#define FREE(p) (free(p),(p)=NULL)
とか
0311デフォルトの名無しさん
2009/06/16(火) 23:44:530312デフォルトの名無しさん
2009/06/16(火) 23:46:05DirectX のサンプルには必ずあった気がする
0313デフォルトの名無しさん
2009/06/17(水) 00:13:090314デフォルトの名無しさん
2009/06/17(水) 00:49:01malloc(0)の挙動は処理系定義で、NULLを返すか、
1以上の何らかのサイズでmallocしたかのように振る舞うか(ただしその領域にアクセスしたらダメ)
どちらかを選ぶことになっている
0315284
2009/06/17(水) 00:58:55了解です。
C++ならいい方法があるのでしょうか?
>288
ひとつの解決方法として参考にさせていただきます。
0316デフォルトの名無しさん
2009/06/17(水) 01:07:380317デフォルトの名無しさん
2009/06/17(水) 01:08:500318デフォルトの名無しさん
2009/06/17(水) 02:42:170319デフォルトの名無しさん
2009/06/17(水) 03:42:42C++なら参照渡しだろ?
と元の話を読まずに書いてみるテスト
0320デフォルトの名無しさん
2009/06/17(水) 07:27:070321デフォルトの名無しさん
2009/06/17(水) 12:17:400322デフォルトの名無しさん
2009/06/17(水) 12:41:09共有されるのでマルチスレッドでは問題になる
0323デフォルトの名無しさん
2009/06/17(水) 13:11:31>>288じゃなくて?
0324デフォルトの名無しさん
2009/06/17(水) 22:55:21スレッドやDLLの安全性がよくまとまってるサイトとかありますか?
0325デフォルトの名無しさん
2009/06/17(水) 23:27:450326デフォルトの名無しさん
2009/06/17(水) 23:30:170327デフォルトの名無しさん
2009/06/17(水) 23:34:460328デフォルトの名無しさん
2009/06/18(木) 00:56:270329デフォルトの名無しさん
2009/06/18(木) 05:03:140330デフォルトの名無しさん
2009/06/18(木) 05:09:45頭固すぎだろ
doubleをカウントアップ用変数に使った場合、==で判定するケースは足しこむ数字と==で比較する数字に
注意しないとだめかもな
0331デフォルトの名無しさん
2009/06/18(木) 05:24:02小数点数を駆使したコード書いた事無いからよくわからんけど
0332デフォルトの名無しさん
2009/06/18(木) 05:28:160333デフォルトの名無しさん
2009/06/18(木) 05:28:21足しこむ数字にもよるし単なるカウントアップ/ダウンなら安全にするために
左側をカウンタ、右側を判定に使う数字とした場合
>= とか <= を考えた方がいいかもね
0334デフォルトの名無しさん
2009/06/18(木) 06:14:06#include <stdio.h>
int main(void)
{
double i;
for (i = 0.0; i != 1.0; i += 0.1)
{
printf("%f\n", i);
}
return 0;
}
0335デフォルトの名無しさん
2009/06/18(木) 06:15:30for (i = 0.0; i != 1.0; i += 0.125)
{
printf("%f\n", i);
}
0336デフォルトの名無しさん
2009/06/18(木) 06:16:24↓
for (i = 0.0; i <= 1.0; i += 0.1)
0337デフォルトの名無しさん
2009/06/18(木) 07:28:54使うときは条件判断で「<」か「>」を使い、値の範囲に注意する。
ループの判定で、「==」や「!=」がちゃんと動くか保証がない以外にも、
すごく大きな数だと、+1しても値が変わらないことがある。
0338デフォルトの名無しさん
2009/06/18(木) 09:10:05簡単なケースだとfor文でもいけそうですし、多くなるとスタックの問題もありそうですし
0339デフォルトの名無しさん
2009/06/18(木) 09:22:090340デフォルトの名無しさん
2009/06/18(木) 09:33:28ループで処理するとA(B)の停止条件が既知でないとBx(B)を遡れない
0341デフォルトの名無しさん
2009/06/18(木) 11:49:24main(argc,argv)
int argc;
char**argv;
{
hogehoge;
}
っていうように書いてる人がいました、
これって文法違反じゃないの?
でも無事にコンパイルもできるし。
これってどういう意味ですか?
グローバル変数?
0342デフォルトの名無しさん
2009/06/18(木) 11:51:33K&Rでググるとか
0343デフォルトの名無しさん
2009/06/18(木) 11:52:05main(int argc, char **argv)
{
hogehoge;
}
の昔の書き方。
0344デフォルトの名無しさん
2009/06/18(木) 11:58:17っていうか、もしかしてCにオーバー道路がないのも、この古い遺産のせい?^^
0345デフォルトの名無しさん
2009/06/18(木) 12:08:14なるほど、ありがとうございます!
よくわかりました!
ちなみに、knuth先生がwc.wでこのように書いてました。
0346デフォルトの名無しさん
2009/06/18(木) 12:08:31f(double a,double b){ }
が
f(a,b)double a,b;{}
とかけてショートコーディングでたまに使う
0347デフォルトの名無しさん
2009/06/18(木) 12:13:54ANSI通さないコンパイラ使わないといけなくなって、K&R形式に書き直したことはあったけど。
0348デフォルトの名無しさん
2009/06/18(木) 12:35:080349デフォルトの名無しさん
2009/06/18(木) 17:42:012 #include<math.h>
3
4 // gcc ex3.c -lm
5
6 int main(){
7 int i;
8 float x1 = 0.0;
9 double x2 = 0.0;
10
11 for(i=1; i<20000000; i+=1000000){
12 x1 = 1.0/i;
13 printf("%20.18lf %20.18lf %20.18lf\n", x1,
14 ((float)sqrt(1+x1)) -1, x1 / (((float)sqrt(1+x1)) +1));
15 }
16
17 printf("--------------------------------------------------------------\n");
18
19 for(i=1; i<20000000; i+=1000000){
20 x2 = 1.0/i;
21 printf("%20.18lf %20.18lf %20.18lf\n",
x2, sqrt(1+x2) -1, x2 / (sqrt(1+x2) + 1));
22 }
23 }
このプログラムを実行すると x1 の方の ((float)sqrt(1+x1)) -1 の値が途中から0になるのはどうして?
0350デフォルトの名無しさん
2009/06/18(木) 17:50:33(float)1.0000001192 == 1.0
だからじゃないか?
0351デフォルトの名無しさん
2009/06/18(木) 17:52:420352デフォルトの名無しさん
2009/06/18(木) 18:13:070353デフォルトの名無しさん
2009/06/18(木) 19:43:11n!=n*(n-1)!
int fact(int n) {
if(n==0) return 1;
else return n*fact(n-1);
}
0354デフォルトの名無しさん
2009/06/18(木) 19:49:56float なんかの、良例あるかな
0355デフォルトの名無しさん
2009/06/18(木) 19:58:08さんざん言われているのに、forは結局intだね(キリッ といわれても困る
0356デフォルトの名無しさん
2009/06/18(木) 20:03:16ループ条件にポインタを使うことはあるね。
C++だと、イテレータとかも出てくる。
0357デフォルトの名無しさん
2009/06/18(木) 20:07:51無限ループの為の空っぽ指定
while (1) や while (true) とかと違ってマジックナンバー使わないし
lint なんかで警告されないし
0358デフォルトの名無しさん
2009/06/18(木) 20:08:06・されるのなら
・されないのなら
どっち?
されないと思ったから結局intにつながるのか、
されると思ったからfloatの良例を求めているのか
0359デフォルトの名無しさん
2009/06/18(木) 20:08:47その1は全然魔法じゃない
0360デフォルトの名無しさん
2009/06/18(木) 20:11:42まあね
非ゼロなら何でも良いけど代表で1が居るのが気持ち悪い ってのは教条主義すぎか…
0361デフォルトの名無しさん
2009/06/18(木) 20:46:07while(1)
while(!0)
while(0==0)
0362デフォルトの名無しさん
2009/06/18(木) 21:06:36while(forever) {
programing();
sleep(hour(3));
}
0363デフォルトの名無しさん
2009/06/18(木) 21:09:28foreverの値を1にするのが気持ち悪いそうです
0364デフォルトの名無しさん
2009/06/18(木) 21:11:24programing();
sleep(hour(3));
goto LOOP;
0365デフォルトの名無しさん
2009/06/18(木) 21:25:06たとえば代数式の評価など
0366デフォルトの名無しさん
2009/06/18(木) 21:37:36すべてのアルゴリズムは、再帰がなくても書くことができる。
0367デフォルトの名無しさん
2009/06/18(木) 21:40:38「<」を使えばいい。
for (double x = 0.0; x < 1.1; x += 0.1)
こういうふうに、値の範囲が分かった上で使うのはいいのだ。
入力された初期値や増分でやるのは、あまりよろしくない。
0368デフォルトの名無しさん
2009/06/18(木) 21:46:06そのかわり余分な空間計算量が必要になりませんか。2分木を非再帰でかくのは結構パワーが必要ですよ。
0369デフォルトの名無しさん
2009/06/18(木) 21:49:53再帰のほうが分かりやすければ再帰を使えばいい。
0370デフォルトの名無しさん
2009/06/18(木) 21:57:380371デフォルトの名無しさん
2009/06/18(木) 21:59:09しかし実際には10000回くらいやってもぜんぜん平気。
0372デフォルトの名無しさん
2009/06/18(木) 21:59:110373デフォルトの名無しさん
2009/06/18(木) 22:09:34質問�@「関数の引数に空の配列を入れて、関数の中でそこに値を代入すると、帰って来た配列も書き換えられている」
事をポインタと言うそうですが、単にポインタを使うと言うとアドレスの場所を指すポインタと勘違いされてしまいました。
実際「*」等も使用していませんし、この用語の使い方はあっているのでしょうか?
質問�A#include<stdio.h>をヘッダファイルと言い、画像などのフォーマットもヘッダーファイルと言う名前が使われています。
これは同じ物を指しているのでしょうか。
両方とも名前が同じなので口頭で伝える際に上手く伝えられません。
まだ習ったばかりなので、細かい用語に勘違いがあったら申し訳ありません。
よければその勘違いも含めて答えて下さったら嬉しいです。よろしくお願い致します。
0374デフォルトの名無しさん
2009/06/18(木) 22:11:58「配列を渡して書き換える」ことをポインタとは言わんよ。
0375デフォルトの名無しさん
2009/06/18(木) 22:16:52両方とも間違ってるな。
修正は他の人だれかやってあげてくれ。
0376デフォルトの名無しさん
2009/06/18(木) 22:18:34引数に空の配列を
func(char a[])
このことだと思うけど
func(char *a)
と同じだよ。
画像などのフォーマットにはヘッダー部が含まれているだけじゃないかな。
それを定義したヘッダーファイルを見たのかもしれないけど。
0377デフォルトの名無しさん
2009/06/18(木) 22:18:48あるだろうけど、ヘッダーファイルと言うことはなさそう。
0378デフォルトの名無しさん
2009/06/18(木) 22:22:02質問2 ヘッダーという意味では先頭に付加されてますが「先頭に付加される物」という言葉が同じだけと思ったほうがいいでしょう。
C言語などでincludeするヘッダーはご存知のように構造体の定義などが別ファイルとして記述できたりします。
特定のファイルフォーマットで使われるヘッダーというのはファイルのサイズや構造を明記したエリアのことをいいます。
0379デフォルトの名無しさん
2009/06/18(木) 22:27:09shirokoro="horumon"
とやるとどんな文字の長さでもshirokoroの中にはいるんですか?
これは動的にちょうどいいメモリの量を確保してくれるんでしょうか?
0380デフォルトの名無しさん
2009/06/18(木) 22:29:13文字列の先頭のアドレスが変数にはいるだけ。
文字列は最初から、どこかに確保されている。
0381デフォルトの名無しさん
2009/06/18(木) 22:31:20ちゃんと授業聞いていたのかという疑問もあるなあ。
�@Cでは関数の引数に配列を渡すと、実際にはポインタ(先頭アドレス)が渡される。
�AC→「ヘッダファイル」と画像→「ファイルヘッダ」が混乱していると思われる。
「header」を英和辞典で引いて、その英単語の意味を理解せよ。
0382デフォルトの名無しさん
2009/06/18(木) 22:42:09"horumon"は文字列リテラルの先頭アドレスを返している。
それをchar*型のshirokoroで受け取っているだけ。
"horumon"自体はコンパイル時に定まっているためプログラム起動時に勝手に確保される。
意味分かる?
0383デフォルトの名無しさん
2009/06/18(木) 23:16:52「引数として配列を渡す実際にはポインタ(先頭アドレス)が入る。」
こういう意味だったのですね。
�A
#include<stdio.h> はヘッダー「ファイル」である
画像などのヘッダー はヘッダー情報が格納された「エリア」である
前者はヘッダファイル、後者はファイルヘッダ
なるほど、わかりました!
レスありがとうございます。大変参考になりました!
本当は習ったというより独学で教科書を先読みしている段階です・・・
矢張り自分の認識の甘さを痛感しました。もう少し勉強しようと思います。
ありがとうございました!
0384デフォルトの名無しさん
2009/06/18(木) 23:40:24あたまいいな。
今後もがんばれ。応援してる
0385デフォルトの名無しさん
2009/06/19(金) 00:04:27超亀レスだが、最近と言うか数時間前に2分木を非再帰で書いた。
3日くらい前から、紙とペンで唸りながらようやく形になった。
単純なことなら再帰の方が速くできるが、通りがけ順でfor()+イテレータ(構造体に一工夫したモノ)のように各節を扱うことはできない。
非再帰(非スタック利用)で書くことで、これができるようになった。
再帰はとても便利だとは思っている。
クイックソートにしろツリーにしろ同じ処理、同じ構造に適用するにはとても優れている考え方。
実際のプログラミングで再帰を使ったのは、ポップアップメニューを動的に作る関数だったな、ああ、なつかしい。
0386デフォルトの名無しさん
2009/06/19(金) 00:08:56例えばprintf関数がどういうコードかとか読むことってできるんでしょうか
特にsqrt関数とかどういうふうにやってんのか気になります
0387デフォルトの名無しさん
2009/06/19(金) 00:10:430388デフォルトの名無しさん
2009/06/19(金) 00:11:200389デフォルトの名無しさん
2009/06/19(金) 00:13:00gccのソースコードでも眺めるといいよ
0390デフォルトの名無しさん
2009/06/19(金) 00:16:43読めるってわかったらとりあえず調べないか?
やり方を聞くまで動けない人間なんて要らないよ
0391デフォルトの名無しさん
2009/06/19(金) 00:17:360392デフォルトの名無しさん
2009/06/19(金) 00:22:14VC++も、ライブラリのソースがついてくるよ。
0393デフォルトの名無しさん
2009/06/19(金) 00:23:57コードは、コンパイルして機械語になって、ライブラリに入ってる。
ランタイムライブラリのソースコードをインストールすれば読める。
0394デフォルトの名無しさん
2009/06/19(金) 00:31:560395デフォルトの名無しさん
2009/06/19(金) 00:40:03ですよねぇ、普通そうですよねぇ
0396デフォルトの名無しさん
2009/06/19(金) 01:16:47sqrtなんかは、FPUの平方根求める命令使って求めてることが多いんじゃない?
0397デフォルトの名無しさん
2009/06/19(金) 10:02:51math 系はソース無しだよね
0398デフォルトの名無しさん
2009/06/19(金) 10:23:01>#include<stdio.h>で読み込んでるだけだと聞きましたが
いいえ。stdio.h にあるのは宣言だけです。
コンパイルされた現物はライブラリにあり、そのソースは
あったりなかったりです。
0399デフォルトの名無しさん
2009/06/19(金) 13:15:100400デフォルトの名無しさん
2009/06/19(金) 15:14:540401デフォルトの名無しさん
2009/06/19(金) 15:29:58K&R第2版に、mallocの生の版が出てきてちょっと驚いた。
システムコールを使うからUNIX限定だけど
環境依存のコードをどうやって関数内に閉じ込めるかについて
とても勉強になった。
0402デフォルトの名無しさん
2009/06/19(金) 18:39:27それは無い。明らかに無い
0403デフォルトの名無しさん
2009/06/19(金) 19:31:030404デフォルトの名無しさん
2009/06/19(金) 19:33:30毎日腹筋100回
0405デフォルトの名無しさん
2009/06/19(金) 19:52:08#include <fcntl.h>
#include <sys/stat.h>
#define STDIN 0
#define STDOUT 1
#define STDERR 2
int main ( void )
{
char prompt [64] = "-> ";
char command [256];
int st;
int out; /* 出力ファイル用ファイル記述子 */
fprintf(stderr, "%s", prompt);
/* ファイルをオープン */
out = open ("outfile", O_CREAT | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR);
/* リダイレクション処理
* 標準出力 -> ファイル
*/
dup2(out, STDOUT);
while (gets(command) != NULL) {
if (fork () == 0) {
if (execl(command, command, (char *) 0) == (-1))
exit(1);}
else {
wait (&st);
fprintf(stderr, "%s", prompt);}}}
シェルを実現するプログラム。入力したコマンドの実行結果をoutfileに出力したいが、うまく行かない
どこを訂正すればいいか教えて下さい。
0406デフォルトの名無しさん
2009/06/19(金) 21:38:40aとbを代入したf(a),f(b)をS = (f(a) +f(b))/2 っていう形にして
Sを使いたいんですけど、どうしたらいいか教えてください。
0407デフォルトの名無しさん
2009/06/19(金) 21:41:330408デフォルトの名無しさん
2009/06/19(金) 21:42:530409デフォルトの名無しさん
2009/06/19(金) 21:46:18例えばこうだ。
int f( int x ){ return x; }
int main() {
int s = ( f( 10 ) + f( 6 ) ) / 2;
}
これで晴れて s は 8 だ。
0410デフォルトの名無しさん
2009/06/19(金) 22:11:07感動です!!
本当にありがとうございます。
最近Cをはじめたばかりなのでやりたいことはいっぱいあるんですけど、
今みたいに思ったことがなかなかできないんですよね(笑)
0411デフォルトの名無しさん
2009/06/19(金) 22:23:58((2*x*x*+25)/(1+x*x)の部分はどこにいれればいいんですか?
0412デフォルトの名無しさん
2009/06/19(金) 22:46:53関数fじゃないの
0413デフォルトの名無しさん
2009/06/19(金) 23:52:19{
return (2 * x * x + 25) / (1 + x * x);
}
0414デフォルトの名無しさん
2009/06/20(土) 00:07:10f : R -> R, ∀x e R∃y e R[y = (2*x*x + 25)/(1 + x*x)]
0415デフォルトの名無しさん
2009/06/20(土) 00:28:320416デフォルトの名無しさん
2009/06/20(土) 05:05:34お遊戯とか、お歌とか...しばらく遊んでろ。
0417デフォルトの名無しさん
2009/06/20(土) 08:57:47どううまくいかないのか分からないが fflush
0418デフォルトの名無しさん
2009/06/20(土) 09:42:34例えば、
st1->a=12 ,st2->b=13のときその中身同士を足した数を変数に代入して関数の引数に使おうと思ったのですが・・・
当たり前ですが
int wa=st1->a+st2->bとしてもだめですし・・・誰か教えて下さい。
0419デフォルトの名無しさん
2009/06/20(土) 09:45:24それがダメなら分からんね
ポインタの指してる先がおかしいんじゃね?
0420デフォルトの名無しさん
2009/06/20(土) 09:47:210421デフォルトの名無しさん
2009/06/20(土) 09:49:08st2->b
まず確認したいんだけどこの二つ型は?
0422デフォルトの名無しさん
2009/06/20(土) 09:53:01> int wa=st1->a+st2->bとしてもだめ
どう「だめ」なのかちゃんと日本語で説明してくれないと教えようが無い。
0423デフォルトの名無しさん
2009/06/20(土) 09:53:470424デフォルトの名無しさん
2009/06/20(土) 10:03:120425デフォルトの名無しさん
2009/06/20(土) 14:00:49それはポインタの中身じゃなくて構造体のメンバのようだけど
0426デフォルトの名無しさん
2009/06/20(土) 14:07:21エスパー的に
0427デフォルトの名無しさん
2009/06/20(土) 14:08:31いやすでに上で型は何?ってでてる。
構造体もいわゆる型だ
0428デフォルトの名無しさん
2009/06/20(土) 14:10:15char str[80] = "これはファイルシステムのテストです\n";
FILE *fp;
char *p;
p = str;
while (*p) {
if (fputc(*p, fp) == EOF) {
printf("ファイル書き込みエラー\n");
exit(1);
}
本ではこうなってたんだけど、これってなんでpをインクリメントしなくてもいいの?
0429デフォルトの名無しさん
2009/06/20(土) 14:15:31さあ
0430デフォルトの名無しさん
2009/06/20(土) 14:18:07関数の仕様を調べる癖をつけたほうがいい
http://www9.plala.or.jp/sgwr-t/lib/fputc.html
ファイルfpへ1文字を、intからunsigned charに変換して書き出し、ファイル位置指示子を進めます。
0431デフォルトの名無しさん
2009/06/20(土) 14:18:33本に乗ってるソースコードが間違ってるのはよくあること。
0432デフォルトの名無しさん
2009/06/20(土) 14:21:13それちゃんとソース全部書いてる?
}が一つ足らないだろ
0433デフォルトの名無しさん
2009/06/20(土) 14:22:35++p;
}
って書いてあったりして。
0434デフォルトの名無しさん
2009/06/20(土) 14:44:240435デフォルトの名無しさん
2009/06/20(土) 14:46:07その本の名前教えて
0436デフォルトの名無しさん
2009/06/20(土) 14:46:36segmentation faultになってしまいます。
0437デフォルトの名無しさん
2009/06/20(土) 14:48:35だから型を教えてくれと
構造体なのか、単なるint型なのかchar型なのか
構造体ならその中が何かと・・・
0438デフォルトの名無しさん
2009/06/20(土) 14:57:15unsigned int ip_len
unsigned int ip_hdl
と宣言されていてip_lenとip_hdlの差が必要なのでその差を計算したいのですが…
セグメってしまいます。
0439デフォルトの名無しさん
2009/06/20(土) 14:58:13ptr->a.ip_len
とかしないとできないよ
0440デフォルトの名無しさん
2009/06/20(土) 15:06:39char aa[]=”abc”; …�@
char bb[10]={‘a’,’b’,’c’,’\0’}; …�A
char *cc = aa; …�B
0441デフォルトの名無しさん
2009/06/20(土) 15:11:280442デフォルトの名無しさん
2009/06/20(土) 15:43:48気が滅入るものだがCコンパイラははっきし言ってある種の馬鹿なので
気にしないほうがいいw
C/C++は古参のプログラミング言語で、プログラミング言語理論の
発達の前に既にあったもの。その後の理論から見て修正したほうがいい
文法とか表現法とか多数あるんだが(どれとかいちいち指摘はしないが)
今更直せないというものが多い。
C/C++が絶対正しく自分が間違いなんだとは思い込まないことが肝要
質問する以前の問題としてこのことを踏まえるべき。
以上、適当に修正してテンプレに入れておくことを推奨
0443デフォルトの名無しさん
2009/06/20(土) 15:50:55断る
0444デフォルトの名無しさん
2009/06/20(土) 15:57:59分かった。
以下の様に修正して入れようか?
Cコンパイラにエラーを吐かれても、自分が間違ってないと
思う輩ははっきし言ってある種の馬鹿なので気にしないほうがいいw
C/C++は古参のプログラミング言語で、仕様書にあるとおりに書けないヤツを
駆逐する能力がある。
C/C++の仕様書が正しく自分が間違いなんだと心にたたき込むべし。
「プログラムはあなたの思うようには動かないが あなたの書いたようには動く」
質問する以前の問題としてこのことを踏まえるべき。
0445デフォルトの名無しさん
2009/06/20(土) 16:00:59良しとしよう。賛成の者、起立!
0446デフォルトの名無しさん
2009/06/20(土) 16:02:080447デフォルトの名無しさん
2009/06/20(土) 16:06:350448デフォルトの名無しさん
2009/06/20(土) 16:08:280449444
2009/06/20(土) 16:10:35今更そんなこと言えない空気になってしまった。
0450デフォルトの名無しさん
2009/06/20(土) 16:11:460451デフォルトの名無しさん
2009/06/20(土) 16:26:260452デフォルトの名無しさん
2009/06/20(土) 16:32:50そうそう。分かるわ。
0453デフォルトの名無しさん
2009/06/20(土) 16:36:37なんとなく動いてるということが 後から判明した時には…
0454デフォルトの名無しさん
2009/06/20(土) 16:39:46#include <assert.h>
struct ST {
int a;
int b;
};
int main( void ) {
struct ST st = { 12, 13 };
struct ST *st1 = &st;
struct ST *st2 = &st;
int wa = st1->a + st2->b;
assert( st1->a == 12 );
assert( st1->b == 13 );
assert( wa = 12 + 13 );
}
ちょー問題なく動く。
0455デフォルトの名無しさん
2009/06/20(土) 16:41:01assert( wa == 12 + 13 );
0456デフォルトの名無しさん
2009/06/20(土) 16:41:38そういうのはやめてくれ
0457デフォルトの名無しさん
2009/06/20(土) 16:43:510458デフォルトの名無しさん
2009/06/20(土) 16:45:330459デフォルトの名無しさん
2009/06/20(土) 16:54:170460デフォルトの名無しさん
2009/06/20(土) 16:55:250461デフォルトの名無しさん
2009/06/20(土) 16:55:41何がよくないか聞きだしたりして、ちゃんとわかる人を作らないと
社会に出てこられても大変なだけだw
0463デフォルトの名無しさん
2009/06/20(土) 17:00:170464デフォルトの名無しさん
2009/06/20(土) 17:01:26struct ST {
int a;
int b;
};
int main( void ) {
struct ST st = { 12, 13 };
struct ST *st1 = &st;
struct ST *st2 = &st;
int wa = st1->a + st2->b;
}
assertなしのこれならOKってことね。
0465デフォルトの名無しさん
2009/06/20(土) 17:01:43基礎がわかってないのに応用とかもっと後のこと教えてどうすると
0466デフォルトの名無しさん
2009/06/20(土) 17:02:29お前わざとだろ
0467デフォルトの名無しさん
2009/06/20(土) 17:04:05なるほど。これは自分には無理そうです。
ほかの人、がんばって答えてあげてください。
0468デフォルトの名無しさん
2009/06/20(土) 17:05:03応…用……?
0469デフォルトの名無しさん
2009/06/20(土) 17:05:35確認する有効な方法って何?
もちろん、強力なIDEが値やアドレス監視機能を提供してくれるのがベストだけど。
まさか、printf で値を表示したりしないよね?
0470デフォルトの名無しさん
2009/06/20(土) 17:06:140471デフォルトの名無しさん
2009/06/20(土) 17:06:510472デフォルトの名無しさん
2009/06/20(土) 17:07:30そうそう
で質問の仕方もわかってないし、ソースも断片しか貼ってない(片方は閉じてさえいない)
初心者もいいところじゃん
assertなんてまだ先の先
0473デフォルトの名無しさん
2009/06/20(土) 17:13:22main(){
int a;
int b;
int n;
int i;
for(i=0;i<n;i++)
{
if(a==i)
{
a=a+b;
printf("%d\n",a);
}
else
{
a=a-b;
for(j=0;j<n+j++)
{
a=f(a);
}
}
}
0474デフォルトの名無しさん
2009/06/20(土) 17:24:43何が言いたいの?
0475デフォルトの名無しさん
2009/06/20(土) 17:33:56http://www002.upp.so-net.ne.jp/ys_oota/mdp/
0476デフォルトの名無しさん
2009/06/20(土) 17:45:37#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* strcpy */
#include <netinet/in.h> /* ntoh hton */
#include <arpa/inet.h> /* sockaddr_in */
#include <net/ethernet.h> /* ether_header ETH_P_ALL */
#include <sys/socket.h> /* socket */
#include <netinet/ip.h>
#include </usr/include/netinet/udp.h>
#include </usr/include/netinet/tcp.h>
#include </usr/include/netinet/if_ether.h>
/** mac address "network to ascii" */
union {
unsigned int x;
unsigned char y[4];
} A;
0477デフォルトの名無しさん
2009/06/20(土) 17:46:20struct st1{
unsigned char a;
};
struct st2{
unsigned char a;
unsigned char b;
};
struct st4{
unsigned char a:1;
unsigned char b:1;
unsigned char c:1;
unsigned char d:1;
unsigned char e:1;
unsigned char f:1;
unsigned char g:1;
unsigned char h:1;
};
struct ipfrag{
unsigned char ip_fra1:1;
unsigned char ip_fra2:1;
unsigned char ip_fra3:1;
unsigned int ip_off:13;
};
0478デフォルトの名無しさん
2009/06/20(土) 17:46:25最初の質問の番号を名前欄に書いたほうがいいなw
0479デフォルトの名無しさん
2009/06/20(土) 17:47:32部屋に湧いたゴキブリをガチャポンのカプセルに閉じ込めて
何匹も飼っている俺が断言する
ゴキブリが軟便を出すようになったら、死が近い証拠
268 :('A`):2008/09/18(木) 22:00:31 0
http://p.pic.to/zkvzp
現時点での長老
288 :286:2008/09/18(木) 23:05:57 0
ごめんコマンドーに釘付けだった
ちなみにゴキブリ共は走ってる所を
上からカプセルをかぶせるようにして捕まえた
http://c.pic.to/s8rjj
先代長老(故)
画質悪くてすまんね
376 :('A`):2008/09/24(水) 03:03:51 O
長老がなかなか死なん
なんかウンコ喰って生き延びてるぽい
414 :('A`):2008/09/27(土) 22:05:45 O
http://m.pic.to/xon6l
10匹目捕獲成功
0480418です
2009/06/20(土) 17:48:25char *mac_ntoa(unsigned char *d){
static char str[18];
sprintf(str,"%2x:%2x:%2x:%2x:%2x:%2x",d[0],d[1],d[2],d[3],d[4],d[5]);
return str;
}
void print_arp(struct ether_arp *arp){
printf("hardware address format %u\n",ntohs(arp->arp_hrd));
printf("protocol address format %u\n",ntohs(arp->arp_pro));
printf("hardware length %u\n",arp->arp_hln);
printf("protocol length %u\n",arp->arp_pln);
printf("operation %u\n",ntohs(arp->arp_op));
}
0481418です
2009/06/20(土) 17:49:27int main(int argc, char *argv[]){
int rsock,rsin_size;
struct sockaddr_in rsin;
struct ether_header *eth;
struct ip *ip;
struct tcphdr *tcp;
struct udphdr *udp;
struct ether_arp *arp;
char p0[1518], *p;
unsigned int data_length=ip->ip_len-ip->ip_hl;
0482418です
2009/06/20(土) 17:50:27if ((rsock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0 ){
perror("socket");
return(0);
}
rsin_size = sizeof(rsin);
while(1){
if(recvfrom(rsock, &p0, sizeof(p0), 0,
(struct sockaddr *)&rsin, &rsin_size) < 0 ) {
perror("recvfrom");
}
p = (char *)p0;
eth = (struct ether_header *)p;
print_ether(eth);
if(ntohs(eth->ether_type) == ETHERTYPE_IP){
p=p0+sizeof(struct ether_header); //ehternetのヘッダが終わった先.同様にUDPのヘッダ分ずらす。
ip=(struct ip *)p;
print_ip(ip);
if (ip->ip_p==17){
p=p0+sizeof(struct ether_header)+sizeof(struct ip);
udp=(struct udphdr *)p;
print_udp(udp);
p=p+sizeof(struct udphdr);
print_data(p,15);
}
0483418です
2009/06/20(土) 17:51:51if(ip->ip_p==6){
p=p0+sizeof(struct ether_header)+sizeof(struct ip);
tcp=(struct tcphdr *)p;
print_tcp(tcp);
}
}
else if(ntohs(eth->ether_type) ==ETHERTYPE_ARP){
arp=(struct ether_arp *)p;
}
}
}
これでdata_lengthがセグめっちゃいます。
0484418です
2009/06/20(土) 17:53:120485デフォルトの名無しさん
2009/06/20(土) 17:54:00そこまで大きいのはtxtにしてロダ経由の方が・・
0486デフォルトの名無しさん
2009/06/20(土) 17:57:38ttp://codepad.org/
ここに貼れ。
つーかこれ
スレの点プレに入れないか?
余りに長いならcodepadに貼れ、と。
0487デフォルトの名無しさん
2009/06/20(土) 17:58:16「ポインタの中身の数値同士を足した数」の得かたもわからないのん?^^
っていうか、肝心の struct ip がどんな構造体なのかどこにも書いてねーでやんの。
sturct ip *ip は初期化されてねーし。
わかるかボケ。w
0488デフォルトの名無しさん
2009/06/20(土) 17:58:58このポインタは ipという構造体型のポインタ
unsigned int data_length=ip->ip_len-ip->ip_hl;
この行の前にipにstruct ipの実体を入れてない
0489デフォルトの名無しさん
2009/06/20(土) 18:01:250490418です
2009/06/20(土) 18:04:41ほんとだすみません。
struct ip{
unsigned int ip_hl:4;
unsigned int ip_v:4;
u_int8_t ip_tos;
u_short ip_len;
u_short ip_od;
u_short ip_off;
u_int8_t ip_ttl;
u_int8_t ip_p;
u_short ip_sum;
struct in_addr ip_src,ip_dst;
}
0491デフォルトの名無しさん
2009/06/20(土) 18:05:020492デフォルトの名無しさん
2009/06/20(土) 18:07:47それもないとわからないけど俺が言いたいのは
ip = malloc(sizeof(ip));
とかして実体を作る必要もあるし
長さを計算するってことはそもそも今回作ってるアプリで実態を用意しないで
どこかからもらってきた領域がその構造体ってことだよね。
その辺の関数は省略してるのかな?
0493デフォルトの名無しさん
2009/06/20(土) 18:09:39hoge();
とかしておけばいいよ
struct ip *ip;
ip = hoge(); //ipに入れるstruct ipサイズの領域のアドレスが渡される?
で今回の計算でいいのかな?
0494デフォルトの名無しさん
2009/06/20(土) 18:12:18Solaris だと、たぶん全部されてると思う。
0495デフォルトの名無しさん
2009/06/20(土) 18:12:55コピペだけでやりくりしてる文型プログラマなんだろう
こういうやつが後の悪夢を生むんだなー
0496418です
2009/06/20(土) 18:14:10それで問題の
unsigned int data_length=ip->ip_len-ip->ip_hl;
がなぜだめなのかがわかりません。
0497デフォルトの名無しさん
2009/06/20(土) 18:14:51Solarisでは、ということは基本的に保障は無いわけですね。thx
0498デフォルトの名無しさん
2009/06/20(土) 18:15:03まあここで散々言われてるがへこまずどう聞けば的確な答えがもらえるかとか
を学んで欲しいわ。
そうでないとこういうソースを後で見る側が死ぬww
0499デフォルトの名無しさん
2009/06/20(土) 18:16:410500デフォルトの名無しさん
2009/06/20(土) 18:20:37C標準のライブラリなら何度includeしても問題は発生しないことになってる。
0501デフォルトの名無しさん
2009/06/20(土) 18:35:55セグメ(´・ω・`)
0502デフォルトの名無しさん
2009/06/20(土) 18:38:45ダメじゃないよ
0503デフォルトの名無しさん
2009/06/20(土) 18:39:22struct ip *ip;
を宣言してから
unsigned int data_length=ip->ip_len-ip->ip_hl;
を計算するまでの間にipには何か入れる関数を呼んでるんだよね?
0504デフォルトの名無しさん
2009/06/20(土) 18:45:48Segmentation Faultじゃろ?不正なメモリへのアクセス。
どう考えても ip の値がおかしい。
「ipは実行してほっとけば入ってきます」ってあるんだから
そのほっといて入ってくる処理のほうがおかしくなってる。
ほっとくと入ってくる処理を書いたやつのケツに
いますぐちんぽ突っ込んでデバッグしろって言って来い。
0505デフォルトの名無しさん
2009/06/20(土) 18:49:01「はぁ、ふざけんな。てめぇの方のバグだろ?」
と逆ギレするので(特に理系プログラマに多い)、
バグを指摘するときはなるべく強硬な姿勢で、
有無を言わせず、怒りをあらかじめあらわにした上で
上から目線で、力強く、がなりたてるようにいうことが肝要。
これ間違えると逆襲されるから注意ね。
0506デフォルトの名無しさん
2009/06/20(土) 18:50:26いえ、このままです。実際に送られてくるパケットを解析するので。
0507デフォルトの名無しさん
2009/06/20(土) 18:50:44unsigned int ip_len
unsigned int ip_hdl
となってるが
>>490
は片方がshortになってねーか?
実行マシンはx86じゃなければ境界踏んでねえかな?
ipに何か入れるとか言ってる関数ってすでにプリコンパイル済みで
ip構造体の中身が変わってるのにリコンパイルしてないとかそんなことやらかしてねえ?
0508デフォルトの名無しさん
2009/06/20(土) 18:51:410509デフォルトの名無しさん
2009/06/20(土) 18:51:54それじゃあ受け取ってないってw
int main(int argc, char *argv[])
これに渡されるのか?
0510デフォルトの名無しさん
2009/06/20(土) 18:54:51愛のコーダ(大島渚)、怒りのプログラマ
0511デフォルトの名無しさん
2009/06/20(土) 18:55:06多くの人が指摘しているとおり、ipに有効な値が入っていない。
(C90までの)C言語では、宣言とコードを混ぜることができない。
struct ip *ip;
unsigned int data_length = ip->ip_len - ip->ip_hl;
までに、ipに値を代入することはできないのだよ。
わかるか、規格書を読んでから出直してきてください。ありがとうございました。
0512デフォルトの名無しさん
2009/06/20(土) 18:57:59>(C90までの)C言語では、
原因はこれ、かな。w
data_lengthをip=(struct ip *)p;のすぐ後ろあたりに書き込んだものの
中途宣言のエラーが出たから先頭に移動したら…
っていうか、釣りだよね、これ?^^;;;
0513デフォルトの名無しさん
2009/06/20(土) 19:03:47その事を意識して見直したら解決しました(´・ω・`)ほんとみなさんすいません。
0514デフォルトの名無しさん
2009/06/20(土) 19:07:57間違えました。
>(C90までの)C言語では、宣言とコードを混ぜることができない。
これは、正しかったが、
>ipに値を代入することはできないのだよ。
これは、間違っている。極めて特殊な方法で代入できる。混乱させてすみません。
0515デフォルトの名無しさん
2009/06/20(土) 19:10:410516デフォルトの名無しさん
2009/06/20(土) 19:43:240517デフォルトの名無しさん
2009/06/20(土) 19:50:50?
0518デフォルトの名無しさん
2009/06/20(土) 19:56:15?
0519デフォルトの名無しさん
2009/06/21(日) 01:40:54バイナリファイルは基本的に16進数ですよね
だから16進数のまま扱いたいのですがどうすればいいでしょうか
どういうことかっていうと、たとえばバイナリファイルの「f」の部分のみを抽出して「0」に置き換えるとします
そうするとC言語の普通の文法だと10進法で処理されるからうまくいきません
たとえばa[10000]っていう配列に順番にバイナリファイルを読み込むと10進法で記録されちゃいますよね
そうじゃなくて配列の1番目から順番に、0〜fの16進法の数値を入れたいんです
どうすればいいでしょうか
0520デフォルトの名無しさん
2009/06/21(日) 01:45:40char a[10000]っていう配列に順番にバイナリファイルを読み込むと160進法
で記録されます
0521デフォルトの名無しさん
2009/06/21(日) 01:46:55○16
0522デフォルトの名無しさん
2009/06/21(日) 01:52:32charが8ビットなら、1要素に十六進法で2桁分格納されるということに気付け。
0523デフォルトの名無しさん
2009/06/21(日) 01:53:12たとえば
0123456789abcdef
というバイナリファイルがあるとします
これを読み込んで、char a[15]という配列に順番に最初から格納していくと
a[0]=0
a[1]=1
a[2]=2
・
・
・
a[10]=a
a[11]=b
という具合になるんでしょうか?
なるとしてですね、たとえばこの場合、fの部分のみを0に変えたいとします
しかし
if(a[n]==f) a[n]=0
とやっても変わらないですよね?
だって演算の時はfじゃなくて15になってるから(実際できませんでした)
0524デフォルトの名無しさん
2009/06/21(日) 02:01:4316進数のfはC言語では0xfと書く。fとはかけない。
0525デフォルトの名無しさん
2009/06/21(日) 02:08:3916進数は2進数で言うところの4ビットを1文字にまとめたもので、charは8ビットだから、charの配列には1要素あたり16進数が2つ入るという認識でいいでしょうか?
>>524
書くとしてどこに書けばいいんでしょうか
今いろいろやってみたんですが
424d4605・・・で始まるバイナリファイルをchar型のa[10000]という配列に読み込んでみたところ
a[0]を%xで表示すると42となりました
これは>>522さんの言うとおり、16進数の文字列が1要素あたり2文字入るということだと思うんですが
それでですね
a[60]の場合、バイナリエディタで見たところ、この位置には「ff」があるんですね
だからa[60]を%xで表示すると、上の理屈だとffにならないとおかしいと思うんですが、なぜか「ffffffff」と8つも入っています
char型の配列には1要素あたり16進数の数が2つしか入らないはずなのに、なんで8つも入ってるんでしょうか?
あとこれを%dで表示すると-1になってしまいます、訳がわかんないです
0526デフォルトの名無しさん
2009/06/21(日) 02:08:480527デフォルトの名無しさん
2009/06/21(日) 02:11:260528デフォルトの名無しさん
2009/06/21(日) 02:12:05おお、unsigned charにしてみたら、ちゃんとa[60]の要素がffになってくれました
しかしなんで charのままだとa[60]はffffffffになって、unsigned charだとffになってくれたんでしょうか・・・さっぱりわかりません
0529デフォルトの名無しさん
2009/06/21(日) 02:20:210530デフォルトの名無しさん
2009/06/21(日) 02:26:34なるほど
charの場合は正負を表現する符号がついて、ffffffffのうち上位6つのfは負の数を表すもので、残りの2つのfがもともとのバイナリファイルにあったffってことですね
unsigned charは符号が付かないので最後の2つのffのみが残ると
0531デフォルトの名無しさん
2009/06/21(日) 02:54:44心配なら見ればいいのに
0532デフォルトの名無しさん
2009/06/21(日) 10:04:270533デフォルトの名無しさん
2009/06/21(日) 10:36:03判定部分でインクリメントやディクリメントしたほうが良い理由はなんでしょうか?
0534デフォルトの名無しさん
2009/06/21(日) 10:43:560535デフォルトの名無しさん
2009/06/21(日) 11:48:24別にそんなことないよ?
誰が言ってた?
0536デフォルトの名無しさん
2009/06/21(日) 12:05:02何行くらいなら大規模っていう?
企業レベルで。
0537デフォルトの名無しさん
2009/06/21(日) 12:27:510538デフォルトの名無しさん
2009/06/21(日) 12:29:580539デフォルトの名無しさん
2009/06/21(日) 12:44:590540デフォルトの名無しさん
2009/06/21(日) 12:49:290541デフォルトの名無しさん
2009/06/21(日) 12:55:51むしろ普通にライブラリを書いたりしてあっという間に数千行だよ?
0542デフォルトの名無しさん
2009/06/21(日) 13:24:020543デフォルトの名無しさん
2009/06/21(日) 13:26:53優秀な学生はここにはいないのか
0544デフォルトの名無しさん
2009/06/21(日) 13:28:530545デフォルトの名無しさん
2009/06/21(日) 13:40:340546デフォルトの名無しさん
2009/06/21(日) 13:48:120547デフォルトの名無しさん
2009/06/21(日) 13:51:40今は全然そう思わない。
0548デフォルトの名無しさん
2009/06/21(日) 13:53:23あのころは行数が気になってちょくちょく見てたもんだ。
0550デフォルトの名無しさん
2009/06/21(日) 14:10:500551デフォルトの名無しさん
2009/06/21(日) 14:19:120552デフォルトの名無しさん
2009/06/21(日) 14:29:420553デフォルトの名無しさん
2009/06/21(日) 14:31:160554デフォルトの名無しさん
2009/06/21(日) 14:32:170555デフォルトの名無しさん
2009/06/21(日) 14:41:26これだから**はw
0556デフォルトの名無しさん
2009/06/21(日) 14:49:43発注の場合、一ヶ月1000行ぐらいだと思うよ
テストとかドキュメントも含めて
0557デフォルトの名無しさん
2009/06/21(日) 14:53:550558デフォルトの名無しさん
2009/06/21(日) 14:59:390559デフォルトの名無しさん
2009/06/21(日) 15:01:060560デフォルトの名無しさん
2009/06/21(日) 15:04:39機能次第じゃないの?
文字列操作とかやりだすとたいしたことしてないのにやたら行数食うけど
そういうのじゃなければ案外少ない行数であれこれできるしねえ
0561デフォルトの名無しさん
2009/06/21(日) 19:56:070562デフォルトの名無しさん
2009/06/21(日) 22:14:05continueしたときのカウンタの変更忘れを防ぐため。
0563デフォルトの名無しさん
2009/06/21(日) 22:56:240564デフォルトの名無しさん
2009/06/21(日) 23:08:090565デフォルトの名無しさん
2009/06/22(月) 00:03:52例文を打ち込んでプログラムを実行しろって書いてあったんだがどうやって実行するの?
borland c++ compilerをダウンロードしてTerapadに打ち込んだんだがこのあとどうすればいいのかわからない。
0566デフォルトの名無しさん
2009/06/22(月) 00:04:260567デフォルトの名無しさん
2009/06/22(月) 00:08:43ソースをプリンタに印刷してじっくりにらめっこした?
画面だけでは発見出来ないバグが印刷すると簡単に
発見できたりするよ
0568デフォルトの名無しさん
2009/06/22(月) 00:09:46デバッガで走らせてもいいし、怪しそうなところにデバッグ用の出力入れるのもよいかも。
自分では、論理ミスはしてないと思っていても、実はある条件分岐がうまくいってないことはよくある。
ソースをどこかに上げて意見を聞いても良いかもしれないよ。
その時は、どのように実装したかを説明するようにしよう。そうすると、意外にも間違っている箇所に気がつくことがあるから。
0569デフォルトの名無しさん
2009/06/22(月) 00:09:50他から領域破壊されてるとかじゃない限り
二分木程度ならコード眺めてたら分かるんじゃない?
0570デフォルトの名無しさん
2009/06/22(月) 00:10:130571デフォルトの名無しさん
2009/06/22(月) 00:10:28デバッガ使わずにどうやってバグ見つけるの?
0572デフォルトの名無しさん
2009/06/22(月) 00:11:50おーいwww
0573デフォルトの名無しさん
2009/06/22(月) 00:15:110574デフォルトの名無しさん
2009/06/22(月) 00:15:57日々勉強っすね
0575デフォルトの名無しさん
2009/06/22(月) 00:54:42hoge構造体へのポインタ変数hogeにmallocでリソースを割り付け、
使い終わった後に解放するというシンプルなプログラムです。
解放する際に、free関数の引数に構造体hogeの先頭のメンバ変数numを
アドレスとして渡しています。
hogeそのものと&(hoge->num)が一致するので、 &(hoge->num)で渡しても
問題がないか検討してみました。結果、エラーは表示されませんでした。
解放する際は hogeの代わりに&(hoge->num)でも構わないでしょうか。
struct imp{
int num;
char name[20];
};
void main(void){
struct imp *hoge;
hoge = malloc(sizeof(struct imp));
…
free(&(hoge->num));
}
0576デフォルトの名無しさん
2009/06/22(月) 00:56:500577デフォルトの名無しさん
2009/06/22(月) 00:57:430578デフォルトの名無しさん
2009/06/22(月) 00:59:51俺もやらないけど。
0579デフォルトの名無しさん
2009/06/22(月) 00:59:51そういうおかしな癖を付けるな
後から苦労するぞ
それも並大抵の苦労じゃない
0580デフォルトの名無しさん
2009/06/22(月) 01:00:40デバッグするのは俺じゃねぇ。
0581デフォルトの名無しさん
2009/06/22(月) 01:01:41そのソースを人に見せたら馬鹿にされる。されない場合は無能のレッテルが
0582デフォルトの名無しさん
2009/06/22(月) 01:04:41>>575
そのソース持って上司に伺いを立てに行け
クビにならなきゃいいけどな
0583デフォルトの名無しさん
2009/06/22(月) 01:09:14保証はされていないはず。
いずれにせよ、そんなことをしないといけないのは、コーディングが下手な可能性が高い。
0584デフォルトの名無しさん
2009/06/22(月) 01:10:10もしくは言語仕様やコンパイラの実装への関心からそういう質問が出てきたのか
そのどっちかだろうな。本人は何とも言ってないが
0585デフォルトの名無しさん
2009/06/22(月) 01:22:10前者です。あるプロジェクトに対する品質検証で、
リソースリーク検出ツールを使ってソースを網羅的に検査します。
検査後、リソースリークの疑いのある指摘がリスト表示されます。
リストされた中には、ツールの誤指摘が含まれているので、
人手で精査して正常検出/誤検出か判断します。
その精査作業で>>575のようなケースにぶつかりました。
これがリークかそうでないのかで悩んでいたわけです。
0586デフォルトの名無しさん
2009/06/22(月) 01:23:250587デフォルトの名無しさん
2009/06/22(月) 01:25:24じゃあ、この「デバッグするのは俺じゃない」「馬鹿にされる」「クビにならなきゃいいけど」って
さんざん言われてるコードの面倒みなきゃいけないほうの立場か。そりゃ大変だな。
0588デフォルトの名無しさん
2009/06/22(月) 01:33:14そのコンパイラでは問題が無くても、別のコンパイラで
は問題になる可能性が高い。
構造体のアドレス値と先頭要素のアドレス値を一致させることを
コンパイラが守る義務は無いので、freeにmallocで得た
アドレス値以外を渡す可能性がある。そうなるとfree関数は
正常に動作しない。
0589デフォルトの名無しさん
2009/06/22(月) 01:35:16保証されている。
ISO/IEC 9899:1999 (E) 6.7.2.1 Structure and union specifiers Semantics 6, 7, 13訳すの面倒だから自分で読んでおいて。
C++は、保証されてないと昔聞いたことがある。今度確認しておきます。
ANSI Cも今度確認しておきます。n1336も今度確認しておきます。
0590デフォルトの名無しさん
2009/06/22(月) 01:38:21ソース修正に回す方がいいだろうね。
0591デフォルトの名無しさん
2009/06/22(月) 01:41:270592デフォルトの名無しさん
2009/06/22(月) 01:41:53もちろん最新の注意を払って。
0593デフォルトの名無しさん
2009/06/22(月) 01:42:360595デフォルトの名無しさん
2009/06/22(月) 01:49:56俺も全く同じ事を思った
0596デフォルトの名無しさん
2009/06/22(月) 01:50:23いいかげんなことを言うな。
コードの著作権は会社なり団体にあり、それが固定された
コンパイラに解釈させて正しく動作する限り、
それが他のコンパイラに解釈させて異常動作することを
以て勝手に変更する行為は、会社に対する業務妨害罪に抵触する。
ある会社内部の業務約款が他の会社で通用しないという理由で
その会社の約款を修正することが認められるならば、社名の
変更だって可能になるだろう。
(以上縦読みプリズ)
0597デフォルトの名無しさん
2009/06/22(月) 01:54:14コンパイラ作成者はISOの規格を遵守する義務は法的には
全くないことには注意。強制力の無い紳士協定みたいな
もので結ばれているに過ぎない。
0598デフォルトの名無しさん
2009/06/22(月) 01:57:32だからこそ規格に準拠したコンパイルであることが明記されてたりするんですね
0599デフォルトの名無しさん
2009/06/22(月) 01:58:350600デフォルトの名無しさん
2009/06/22(月) 02:01:460601デフォルトの名無しさん
2009/06/22(月) 02:06:540602デフォルトの名無しさん
2009/06/22(月) 02:38:20そのCコードが、それを所有する会社なり団体の業務約款に
相当するものかどうかの判定は、日本語で書かれた会社登記
関係書類や近年の活動内容と照らし合わせた上で、最終的には
CPUアセンブリニモニックコードとCPU動作統計検査で
判定されることになるが、
こういうの訴訟にされてもまともに審議するヒマな裁判所
など無いから念のため。(訴訟自体認められないんで)
0603デフォルトの名無しさん
2009/06/22(月) 13:00:03int main(stdin)
でよかったのに、家のCygwinだとエラーが出ます。
どういう問題があるんでしょうか?
0604デフォルトの名無しさん
2009/06/22(月) 13:07:26もう少しマシな釣りを希望する
0605デフォルトの名無しさん
2009/06/22(月) 13:07:34そんな阿呆なコードの断片だけ引用しないで、きちんと全文貼り付けた上でエラーメッセージも貼りましょう。
0606デフォルトの名無しさん
2009/06/22(月) 13:08:57俺のマシンに入ってるcygwinでは問題ない。
バージョンが違うのではないだろうか。
0607デフォルトの名無しさん
2009/06/22(月) 13:24:03typedef struct{
int number;//学生番号
char name[20];//名前
char password[8];//パスワード
}student;
int main(stdin)
{
student *person1, *person2;
student class[2];
scanf("%d",&person1->number);
scanf("%s",person1->name);
scanf("%s",person1->password);
printf("%d,%s,$s,%s,%d",person1->number,person1->name,person1->password);
}
つりとかじゃなくて普通に分からない。
0608デフォルトの名無しさん
2009/06/22(月) 13:27:01int main()
int main(int argc, char *argv[])
の2パターンだけ知っていればいい。
0609デフォルトの名無しさん
2009/06/22(月) 13:28:14先が長そうだ・・・
0610デフォルトの名無しさん
2009/06/22(月) 13:29:15この場合上でいいのかな?
俺的にはscanfのたびにコマンドラインから入力するシステムにしたいんだが。
0611デフォルトの名無しさん
2009/06/22(月) 13:31:44自分のアプリを起動するときにオプションとかを指定するタイプなら下
ただ単に起動してアプリ内で入力待ちをするのなら上でいい
0612デフォルトの名無しさん
2009/06/22(月) 13:32:16コマンドラインからはコマンドを実行することができるだけ。インタラクティブな操作はできない。
0613デフォルトの名無しさん
2009/06/22(月) 13:32:39でも今度は一つScanfを入力したところで変なエラーが出た。
26454 [main] class 2432 _cygtls::handle_exceptions:Ellor while dumping state(probably corrupted stack)
Segmentation faulst (core dumped)
0614デフォルトの名無しさん
2009/06/22(月) 13:33:37person1に適切な値が代入されていないから。
0615デフォルトの名無しさん
2009/06/22(月) 13:35:430616デフォルトの名無しさん
2009/06/22(月) 13:36:310617デフォルトの名無しさん
2009/06/22(月) 13:37:190618デフォルトの名無しさん
2009/06/22(月) 13:37:320619デフォルトの名無しさん
2009/06/22(月) 13:39:19つまり、Numberに何も代入されてない=アドレスが決まってないのに、&でアドレスを指定したのがいけないってこと?
0620デフォルトの名無しさん
2009/06/22(月) 13:41:28student *person1, *person2;
これだと構造体をさすポインターだけしかない
person1 = (person1)malloc(sizeof(person1));
としないと実体ができない
0621デフォルトの名無しさん
2009/06/22(月) 13:44:45な、なんだそりゃあ
そんなの学校で習ってないです。
学校ではそういうの無しに出来たと思うのですが…。
0622デフォルトの名無しさん
2009/06/22(月) 13:53:39int main()
{
student person1, person2;
student class[2];
scanf("%d",&person1.number);
scanf("%s",&person1.name);
scanf("%s",&person1.password);
printf("%d,%s,%s",person1->number,&person1->name,&person1->password);
}
では駄目なのでしょうか?
0623デフォルトの名無しさん
2009/06/22(月) 13:57:11しばらくこの方向でやってみます。
答えてくださった方ありがとうございました。
0624デフォルトの名無しさん
2009/06/22(月) 13:57:33やりかたはそういう方向性でもいいんだけど何の学習をやるのかにもよるよ
あと、その書き方だとポインタじゃなく構造体に直接入れるので&つけてるとエラーになると思うよ
0625デフォルトの名無しさん
2009/06/22(月) 14:06:390626デフォルトの名無しさん
2009/06/22(月) 14:26:59int main()
{
student person1, person2;
student class[2];
scanf("%d",&person1.number);
scanf("%s",&person1.name);
scanf("%s",&person1.password);
printf("%d,%s,%s",person1->number,person1->name,person1->password);
}
正しくはこうな
それからclass[2]が全く使われてないんだけどこれから使うのか?
0627デフォルトの名無しさん
2009/06/22(月) 14:28:29CPU別に最適化できるフリーのコンパイラってありませんか?
0628デフォルトの名無しさん
2009/06/22(月) 14:28:42最終の printf 部漏れてる漏れてる
0629デフォルトの名無しさん
2009/06/22(月) 14:37:31どうでもいいが、8バイトのパスワードは8要素の配列には入らないと思うんだ。
0630デフォルトの名無しさん
2009/06/22(月) 14:43:03こうか失礼
汚れ仕事は(エラー発見)はコンパイラにさせる癖がついてしまってるんで
0631デフォルトの名無しさん
2009/06/22(月) 15:10:55>>630は汚れ仕事をコンパイラにさせた後でレスをすべきだと思う
0632デフォルトの名無しさん
2009/06/22(月) 15:47:34間違え教えるなよ
0633デフォルトの名無しさん
2009/06/22(月) 15:59:310634デフォルトの名無しさん
2009/06/22(月) 16:57:160635デフォルトの名無しさん
2009/06/22(月) 16:58:550636デフォルトの名無しさん
2009/06/22(月) 17:36:530637デフォルトの名無しさん
2009/06/22(月) 17:38:030638デフォルトの名無しさん
2009/06/22(月) 17:55:14「PODは、Cと移植性のあるレイアウトを持つ:メンバー変数は、宣言順に格納される」
とあるし、Effective C++ではCスタイルのstructはFORTRANなどにも渡せるとあるので
structの最初のデータメンバがstructのアドレスと一致することがCで保証されているなら
C++でも(それがPODである限り)保証されていると見ていいんじゃないかなーとか思った。
思っただけ。
0639デフォルトの名無しさん
2009/06/22(月) 18:03:380640デフォルトの名無しさん
2009/06/22(月) 18:06:08意図してるのかどうかはしらないが
0641デフォルトの名無しさん
2009/06/22(月) 19:00:47struct imp{
int *num;
char name[20];
};
int main(void){
struct imp *hoge;
hoge = malloc(sizeof(struct imp));
hoge->num = malloc(sizeof(int));
*(hoge->num) = 10;
strcpy(hoge->name,"taro");
free(hoge->num);
}
構造体の宣言によるけどこんな荒業が使える。
0642デフォルトの名無しさん
2009/06/22(月) 19:03:000643デフォルトの名無しさん
2009/06/22(月) 19:05:00free(hoge) -> free(&(hoge->num)) -> free(&hoge->num)
free(hoge->num) -/-> free(hoge)
0644デフォルトの名無しさん
2009/06/22(月) 19:18:16どう荒技なのかよくわからんが、
free(hoge)とfree(&(hoge->num))が同じかどうかの話でしょ
0645デフォルトの名無しさん
2009/06/22(月) 19:22:45荒業はいいすぎた。ところで
free(&(hoge->num))をやった後にfree(hoge)をやると2重フリーになるのでfreeを
呼ぶのは一回でいいのかな。
0646デフォルトの名無しさん
2009/06/22(月) 19:29:430647デフォルトの名無しさん
2009/06/22(月) 19:35:06試してみたら、二重開放になっていた。
よって、呼ぶのは1回でよい。
cc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-44)
CFLAG=-Wall -std=c89 -ansi -pedantic
規格通りということだな。
>>589
ANSI Cにも同じようなことが書いてあった。
n1336は、ISO/IEC 9899:1999 (E)と変わってない。ちなみに6, 7, 13ではなくて5, 13だった。
C++は、個人的に利用しないのでどうでもいい。
0648644
2009/06/22(月) 19:36:01free(hoge->num);をやった後に、
free(hoge);、もしくはfree(&hoge->num);をすればいいのでは?
0649デフォルトの名無しさん
2009/06/22(月) 19:38:43何自信満々に確保した領域をほったらかしにしてんの
0650デフォルトの名無しさん
2009/06/22(月) 19:47:47>>641の場合、
free(&hoge->num)とfree(hoge)は等価だと何度いえばわかるんだ。
だから、>>645の言うとおり、>free(&(hoge->num))をやった後にfree(hoge)をやると2重フリーになる
のよ。
0651デフォルトの名無しさん
2009/06/22(月) 19:49:420652デフォルトの名無しさん
2009/06/22(月) 19:52:29だから>>641はhogeをfreeしてないだろっての
0653デフォルトの名無しさん
2009/06/22(月) 19:54:290654デフォルトの名無しさん
2009/06/22(月) 19:56:09なんか面白いこと思いついた気がしただけだろ
そっとしといてやれ
0655デフォルトの名無しさん
2009/06/22(月) 19:58:29そんなことは見ればわかるだろ。
ちなみに私のレスは、>642,643,647,650ね
何度も言っているが、>>645は、>free(&(hoge->num))をやった後にfree(hoge)をやると2重フリーになる
かと聞いているので、なると答えただけだよ。
まぁ、入門篇だからしかたないか。
0656デフォルトの名無しさん
2009/06/22(月) 20:00:09そりゃ同じものを指してるんだから2重フリーになるよ。
> よって、呼ぶのは1回でよい。
でもこうはならないだろ?っていうのをみんな言ってんだけど
0657644
2009/06/22(月) 20:04:102重フリーになるのかどうかを聞いてるのではなく、
1度のfreeで両方とも解放されるのかどうかを聞いてるように見えないか?
流れ的に。
0658デフォルトの名無しさん
2009/06/22(月) 20:05:030659デフォルトの名無しさん
2009/06/22(月) 20:07:29free(hoge->num)しているのは、>>641があったので前提としていた。
そのあとで、>>645>ところで
>free(&(hoge->num))をやった後にfree(hoge)をやると2重フリーになるのでfreeを
>呼ぶのは一回でいいのかな。
は、free(&(hoge->num)とfree(hoge)のいずれかを1回呼ぶと解釈された。
その後は、ぐだぐだになっていったということかな。
私が読み取り間違えていたの?
0660デフォルトの名無しさん
2009/06/22(月) 20:15:010661デフォルトの名無しさん
2009/06/22(月) 20:21:30わかったことは、641,645が、free(hoge->num)とfree(&(hoge->num))を等価と考えていたので、
free(&(hoge->num))とfree(hoge)が等価だと最近聞いて、混乱したと。
その結果、2重フリーを気にしたが、示したコード片は、まさに2重フリーをするコードであったので、
>>647(私だが)が641,645の知りたいこととは違ったことをいい始めたと。
0662デフォルトの名無しさん
2009/06/22(月) 20:22:57どう荒技なのかよくわからんが、
(話していた内容は)
free(hoge)とfree(&(hoge->num))が同じかどうかの話でしょ
(free(hoge->num)は話題に出ているもののどちらでもない、関係ないものだよ)
(なのでhoge自体が解放されてないよね)
で、やっぱり荒技の意味は相変わらずわからないが、
>>648に続く。
>>641の
> 構造体の先頭メンバがポインタだったら・・?
と、荒技、ということを考えると
free(hoge->num)と記述することで、hoge->numの先が解放され、さらにhogeとhoge->numが
同じものを指している(もちろんダウト)から、hoge自体も解放される
ということを言いたかったのではないかなあと、今なら思える。
0663デフォルトの名無しさん
2009/06/22(月) 20:25:51hoge->numとhogeを%pで表示させると同じ値だったから一度のfreeで解放
させられないかと思ったんだ。でも駄目みたいですね。
あと645の&〜は記入ミスです。
0664デフォルトの名無しさん
2009/06/22(月) 20:32:25そんなばかな。
とりあえず、コンパイラとそのバージョン、実行環境を教えてくれ。
0665デフォルトの名無しさん
2009/06/22(月) 20:39:23コンパイラ:gcc version 3.4.4
実行環境:cygwin
0666デフォルトの名無しさん
2009/06/22(月) 20:40:30int *num;
char name[20];
};
int main(void){
struct imp *hoge;
hoge = malloc(sizeof(struct imp));
if(hoge == NULL){return 1;}
hoge->num = malloc(sizeof(int));
*(hoge->num) = 10;
strcpy(hoge->name,"taro");
printf("No :%d\n",*(hoge->num));
printf("Name :%s\n",hoge->name);
printf("hoge->num = %p\n",hoge->num);
printf("hoge = %p\n",hoge);
free(hoge->num);
free(hoge);
printf("%p\n",hoge->num);
printf("%p\n",hoge);
return 0;
}
0667デフォルトの名無しさん
2009/06/22(月) 20:42:39--------------
hoge->num = 0x6b0188
hoge = 0x6b0168
--------------
ごめんなさい 6と8をごっちゃにしてました。
どうみても同じじゃないです。お騒がせしました
0668デフォルトの名無しさん
2009/06/22(月) 20:44:500669デフォルトの名無しさん
2009/06/22(月) 21:06:20∧___∧
/ - - \
| ▼ |
/| =(_人_)= | >>668
/ ((ヽ、__ ゚し-J゚__ノ)) もしゃ
| _____ ノ もしゃ
∪⌒∪ ∪
0670デフォルトの名無しさん
2009/06/22(月) 21:09:470671デフォルトの名無しさん
2009/06/23(火) 03:08:00メモリ解放はOSのプロセス管理に任せるくらいのことはしないと。
0672デフォルトの名無しさん
2009/06/23(火) 03:16:20よきに計らってくれるんだから任せた方がスムーズに決まってる。
他言語でガベージコレクタを手動でせっせと起動するかっていうと、たいていの場合は任せるっしょ。
0673デフォルトの名無しさん
2009/06/23(火) 05:00:28> 他言語でガベージコレクタを手動でせっせと起動するかっていうと、たいていの場合は任せるっしょ。
確かに「他言語で」GCが言語仕様上規定されているならそうするだろうが
GC機能がないC/C++では、それは全く当てはまらないと思うが。
>メモリ解放はOSのプロセス管理に任せる
これは単にうまく動いてくれちゃっているだけで
言語仕様上はメモリーリークするコードになっているわけじゃないか。
0674デフォルトの名無しさん
2009/06/23(火) 06:04:31今更free論争なんて蒸し返したくないんで、あんまり突っ込まないで欲しいけど。
0675デフォルトの名無しさん
2009/06/23(火) 06:18:160676デフォルトの名無しさん
2009/06/23(火) 07:25:580677デフォルトの名無しさん
2009/06/23(火) 07:44:330678デフォルトの名無しさん
2009/06/23(火) 09:09:090679デフォルトの名無しさん
2009/06/23(火) 13:01:000680デフォルトの名無しさん
2009/06/23(火) 13:59:450681デフォルトの名無しさん
2009/06/23(火) 14:01:03環境によるんじゃない?
開放してくれるのもあればしないのもあるだろうし
組み込みレベルになるとしないのもあるんじゃないかな?
限定はよくない。
0682デフォルトの名無しさん
2009/06/23(火) 14:03:38言語仕様上のくだりはでたらめ
0683デフォルトの名無しさん
2009/06/23(火) 14:09:11「あんまり突っ込まないで欲しい」のは本当らしい。
0684デフォルトの名無しさん
2009/06/23(火) 14:10:180685デフォルトの名無しさん
2009/06/23(火) 14:57:09調べたら%hhdっぽいような事は書かれてたんだけどmsdnで調べても無くて
VCで実際にやってみても%dと指定したのと同じになってるんだけど
もしかして出来ないの?
ちなみにshort型は%hdで行けました
0686デフォルトの名無しさん
2009/06/23(火) 15:02:420687デフォルトの名無しさん
2009/06/23(火) 15:51:07intで読んでcharに代入
0688デフォルトの名無しさん
2009/06/23(火) 16:30:15あ…ありのまま 今 起こった事を話すぜ!
「2chのプログラム板を眺めていたと思ったら
いつのまにか古のネットニュースになっていた」
な… 何を言ってるのか わからねーと思うが(ry
0689デフォルトの名無しさん
2009/06/23(火) 16:38:500690デフォルトの名無しさん
2009/06/23(火) 16:43:510691デフォルトの名無しさん
2009/06/23(火) 20:30:16void vfree(void **p);
int main(void)
{
char *str;
str = (char*)malloc(10);
printf("str = %p\n",str);
vfree(((void**)&str));
printf("str = %p\n",str);
vfree(((void**)&str));
printf("str = %p\n",str);
return 0;
}
void vfree(void **p)
{
free(*p);
*p = NULL;
}
0692デフォルトの名無しさん
2009/06/23(火) 20:38:31でいいんじゃない?
0693デフォルトの名無しさん
2009/06/23(火) 20:39:320694デフォルトの名無しさん
2009/06/23(火) 20:40:49熟語の意味を辞書で引いて揚げ足取るやつとか居ないから違うと思われ
0695デフォルトの名無しさん
2009/06/23(火) 22:01:540696デフォルトの名無しさん
2009/06/23(火) 22:03:08が使えるかもしれない。
0697デフォルトの名無しさん
2009/06/23(火) 22:03:27むり。
関数の外にはgotoできない。
0698デフォルトの名無しさん
2009/06/23(火) 22:13:31どうしてもしたい場合は setjmp/longjmp
0699デフォルトの名無しさん
2009/06/23(火) 22:21:020700デフォルトの名無しさん
2009/06/23(火) 22:29:37調べが足りませんでした
>>687氏の方法で実装してみようと思います。
ありがとうございました
0701デフォルトの名無しさん
2009/06/23(火) 23:03:05すんげークソ設計な予感がするけど
大丈夫か??
0702デフォルトの名無しさん
2009/06/23(火) 23:06:00やるのはいいけど、あとで後悔するぞ
0703デフォルトの名無しさん
2009/06/23(火) 23:59:55ありがとうございます。goto無しでやるように書き換えようと思います。
>>701
ミニゲームのゲームオーバー画面からタイトル画面に飛ばせたらと思って…
後、例えばとある関数があって、その関数は引数によって微妙に処理を変えたいのですがどうすればよろしいでしょうか?
例えるならCASL�Uの命令のように。
LD GR1,GR2 //これだったらGR2の中身をGR1にコピー
LD GR1,X //これだったらX番地の内容をGR1にコピー
LD GR1,X,=2 //これだったらX番地+2番地の内容をGR1にコピー
といったような感じに、引数によって内容をが微妙に異なるようなことは出来るのでしょうか?
0704デフォルトの名無しさん
2009/06/24(水) 00:08:40> 引数によって内容をが微妙に異なるようなことは出来るのでしょうか?
できる。
0705デフォルトの名無しさん
2009/06/24(水) 02:21:49たとえば複数の数を渡して、その中から一番大きい数を返すina maxという関数を作るとして
このint maxに渡す数が1と2の2つだけだったり、10と20と30と40と50の5つだったり、そういう複数のパターンに対応させるようにしたいのです
0706デフォルトの名無しさん
2009/06/24(水) 02:23:310707デフォルトの名無しさん
2009/06/24(水) 02:25:140708デフォルトの名無しさん
2009/06/24(水) 02:26:250709デフォルトの名無しさん
2009/06/24(水) 02:27:58ここを見るのがいいと思う。
引数なしは無理だけど要件を見る限り大丈夫だろ、と思う
0710デフォルトの名無しさん
2009/06/24(水) 06:22:38引数によってというのがわからん
引数が10以下なら〜20以下なら〜とかなら普通にできるがそういう意味じゃないよな
0711デフォルトの名無しさん
2009/06/24(水) 07:06:08引数の型によって変えるならC++使え
0712デフォルトの名無しさん
2009/06/24(水) 07:13:05そういうのはジャンプしないほうが
状態の遷移を考えて・・・
0713デフォルトの名無しさん
2009/06/24(水) 07:20:150714デフォルトの名無しさん
2009/06/24(水) 07:26:39経験だからねえ
スクリプトがメインの時代だとこういうジャンプを考えるのはありえなくないんだわww
その昔N88BASICくらいしか学生が手に出来なかった時代は余裕でやらかしてたからww
0715デフォルトの名無しさん
2009/06/24(水) 12:11:18void func(int *p,int num);
void func(int *p,int *p2);
void func(int *p,int *p2,int *p3);
みたいな3つの関数って宣言出来るんですか?
0716デフォルトの名無しさん
2009/06/24(水) 12:13:23ここで規格を語ってる方ひとこと↓
0717デフォルトの名無しさん
2009/06/24(水) 12:18:50そういう機能はオーバーロードと呼ばれていて、Cではできません
0718デフォルトの名無しさん
2009/06/24(水) 12:47:44ある問題(例えば100万以下の素数を生成する)をコーディングしたとして、
そこで書いたアルゴリズム(プログラム)の実行時間を知りたい場合、
どのような方法で知るのが一般的なのでしょうか?
コマンドラインからコンパイルor実行時に何かコマンドを繋げる、
プログラム中に time.h sys/* などをインクルードしてプログラム実行開始からの時間を取得して計算する、
などが考えられるのですが、具体的にどのようなコードを追加したりするのか教えていただけると助かります。
0719デフォルトの名無しさん
2009/06/24(水) 12:52:590720デフォルトの名無しさん
2009/06/24(水) 12:54:17特殊なマクロを提供しているのは知っていたので
早速、「tgmath.h 実装」でぐぐってみたら、gcc は独自拡張で実装してたり、
あるサイトでは厳密なCコードでは実装できないと書かれていたり、
どうなってんのって感じ。^^; Sun Studio 12 がC99完全合致らしいので
それのヘッダを見れば秘密がわかるのか?
0721デフォルトの名無しさん
2009/06/24(水) 13:16:03printf("%s\n", crypt("hogehoge","ab"));
例えばこの出力を100万回ループさせると
十数秒かかるのですが、Perlで同じことをすると1秒程度で処理を終えます。
調べたところPerlのCrypt関数は、CのCrypt関数を使っているそうなんですが
CとPerlではなぜ処理速度がこんなに変わるのでしょうか?
0722デフォルトの名無しさん
2009/06/24(水) 13:28:000723721
2009/06/24(水) 13:34:07Perlでは下のprint文を同じく100万回ループさせています。
print crypt("hogehuga","ab") . "\n";
0724デフォルトの名無しさん
2009/06/24(水) 13:36:48puts(crypt("hogehoge", "ab"));
に変えてみろ
0725デフォルトの名無しさん
2009/06/24(水) 13:38:46>CのCrypt関数を使っているそうなんですが
C“には”「Crypt」なる関数は用意されていません。
>CとPerlではなぜ処理速度がこんなに変わるのでしょうか?
最軽量コンパイラとインタプリタの比較ですか?
0726デフォルトの名無しさん
2009/06/24(水) 13:39:21ベースとなる処理速度の違いを差し引く必要があるので
crypt関数を取り除いて(pirnt文だけで)空回ししてみるとわかるかも。
(デバッグモードのcではprintfが異様に遅いとか…)
0727721
2009/06/24(水) 13:49:24putsで試してみたのですがprintfと変わりませんでした。
ちなみにcryptを使わずにprintfだけにすると速いです。
>>725
たまたまCとPerlの両方でプログラムを書いたら実行速度があまりに違ったので
その原因を知りたくなりました。
>>726
printfだけだと速いですがcryptが入ると遅くなりました。
0728デフォルトの名無しさん
2009/06/24(水) 13:57:47もう少しちゃんと動くライブラリを探すと良いかも。
0729デフォルトの名無しさん
2009/06/24(水) 16:17:1710万回ループで26秒かかった(cygwin)
2ちゃんのトリップ検索はアセンブラだったような
Bitslice DESアルゴリズムとかいうのを使ってるらしい
0730デフォルトの名無しさん
2009/06/24(水) 16:19:53結果をプールしているんじゃなかろうか
0731デフォルトの名無しさん
2009/06/24(水) 16:22:46perlって、そういう最適化がきくのかね。
Cryptが同じ引数なら、同じ結果になるって知っていれば、
最適化できるけど。
0732デフォルトの名無しさん
2009/06/24(水) 16:30:370733デフォルトの名無しさん
2009/06/24(水) 17:26:48全く同じ引数が与えられたら計算せずに前の値を返して
いるだけなんじゃねーの?
いくらなんでも速度が違いすぎるぞ
0734デフォルトの名無しさん
2009/06/24(水) 18:08:08・中で定義域に収まるように(端点などに)修正する
・エラーを返す
どっちがいいかな。好みの問題?
0735デフォルトの名無しさん
2009/06/24(水) 18:10:25エラーを返すほうが好きだ
0736デフォルトの名無しさん
2009/06/24(水) 18:13:22エラーを返す
だな。
呼び出してる側が本来は修正をしないといけないのに勝手にエラーに
ならないようにされると後々困ることになる。
バグ取りにならない
0737デフォルトの名無しさん
2009/06/24(水) 18:13:48両方とも妥当な場合がある、結果仕様による
0738デフォルトの名無しさん
2009/06/24(水) 18:18:10いちおうゲームに使う予定なんで、できるだけエラーでストップして欲しくないから修正を使いたいんだけど
あんまり嫌われるようだったら考え直したい
0739デフォルトの名無しさん
2009/06/24(水) 18:19:320740デフォルトの名無しさん
2009/06/24(水) 18:20:40それでいいかもな。
修正する関数は、デバッグモードのときにはエラーで止まるようにして
リリースのときには修正するようにするとか。
0741デフォルトの名無しさん
2009/06/24(水) 18:21:54あ、それいいですね。いただきます
ほかの方もあざっしたぁー
0742デフォルトの名無しさん
2009/06/24(水) 18:24:59それは無い
同名のものは、出来る限り同じ機能であるべきだ
>>738
命名規則を決めておいて自動修正有り無しの両方つくるとか
0743デフォルトの名無しさん
2009/06/24(水) 18:29:33math.hみたいな感じの統計版ってある?
大げさなものじゃなくて、中央値とか分散とか程度でいいんだけど・・・
0744721
2009/06/24(水) 18:41:38CとPerlでは同じライブラリを使ってるという情報がありました。
他のライブラリでも試してみたほうが良さそうですね。
>>729
トリップ検索で有名なフリーソフトはたくさんありますが
だいたい1秒間に〜100万トリップ程度は検索しているようです。
ということは100万回Cryptしているのだと思うのですが
ソースが手に入らないのでどういったプログラムを書かれているのかわからないです。
>>732
画面の描画ではなくてプログラムの実行が1秒で終わるということでした。
>>730 >>733
乱数を生成してループの度に結果を変えましたが
特にキャッシュしているわけではなさそうです。
0745デフォルトの名無しさん
2009/06/24(水) 18:57:39・出力はどうしてんの?100万行をttyに垂れ流し?
・もし/dev/nullとかに捨ててるなら、
ちゃんと動いてるか確認しよう
0746デフォルトの名無しさん
2009/06/24(水) 19:13:52b.hもa.hをインクルードしている場合
何が起こりますか?
0747デフォルトの名無しさん
2009/06/24(水) 19:17:120748デフォルトの名無しさん
2009/06/24(水) 19:17:310749デフォルトの名無しさん
2009/06/24(水) 19:19:120750デフォルトの名無しさん
2009/06/24(水) 19:25:400751デフォルトの名無しさん
2009/06/24(水) 19:28:28インクルードガードを書いておけば問題なし
>>749
CSTL でググれ
0752デフォルトの名無しさん
2009/06/24(水) 19:29:570753デフォルトの名無しさん
2009/06/24(水) 20:36:20ありがとうございます
0754デフォルトの名無しさん
2009/06/24(水) 22:41:25#include <stdio.h>
#define n 10
int kaijou( int x ),m;
double SIN=0,angle=1;
main(void)
{
printf("角度を入力");
scanf("%lf",&angle);
angle=atan(1)*4/180.0*angle;
printf("%frad",angle);
for(m=0;m<=n;m++)
{
SIN=SIN+(double)pow(-1,m)*(double)pow(angle,2*m+1)/kaijou(2*m+1);
}
printf("サインの値は%f",SIN);
}
int kaijou(int x)
{
int y=1,count;
for(count=1;count<=x;count++)
{
y=y*count;
}
return y;
}
テイラー展開を使ってsinを求めるんですけど角度が大きくなると
値がおかしくなります 項数を増やすと-1.#indo00って出ます なぜ?
0755デフォルトの名無しさん
2009/06/24(水) 22:44:08ソースはほとんど読んでないけどレスしてみる。
オーバーフローしてない?
0756デフォルトの名無しさん
2009/06/24(水) 22:49:54bcc32は内部コマンドまたは外部コマンド
操作可能なプログラムまたはバッチファイルとして認識していません。ってでます
↑環境変数の設定やbcc32.cfgとlink.cfgファイル作ってもできません
0757デフォルトの名無しさん
2009/06/24(水) 22:54:110758デフォルトの名無しさん
2009/06/24(水) 22:54:460759デフォルトの名無しさん
2009/06/24(水) 22:55:510760デフォルトの名無しさん
2009/06/24(水) 22:56:11bccじゃなくて、VisualStudioを使った方がいいよ。
0761デフォルトの名無しさん
2009/06/24(水) 22:56:24-------------------------
前処理(変数初期化)
本体
(異常があったときに ラベルに飛ぶ)
return(OK)
:ラベル
例外処理
-------------------------
というようなスタイルで書いているのですが、
こういう構造が古いと書いてあったウエブがあったのですが、
どこが古いのかわかりますか?
そのウェブサイトを思い出せれば、いいのですが、
再度検索してもヒットしないので
もしウェブサイトにこころあたりがあれば
教えてください。
0762デフォルトの名無しさん
2009/06/24(水) 22:57:24>どこが古いのかわかりますか?
goto使ってるとこじゃない?
0763デフォルトの名無しさん
2009/06/24(水) 23:01:11bccも悪くないよ。
「初心者のうちは。」
0764デフォルトの名無しさん
2009/06/24(水) 23:03:16linusの最近のコードでもそういう書き方してるし、いいんじゃないの?
0765デフォルトの名無しさん
2009/06/24(水) 23:06:15sin cosを大量に使うゲームには有効そう
でも
http://letsphysics.blog17.fc2.com/blog-entry-90.html
f(x)=-1/5+(1+x2)log[5-x]Tan[x]/(5-x2)
これを
f5(x) = -0.2 + 0.33 x - 0.04 x2 + 0.49 x3 - 0.062 x4 + 0.24 x5
こうするとうのには後何の知識がいるんだ?
0766デフォルトの名無しさん
2009/06/24(水) 23:09:28思い出せた
なんだっけ?
0767デフォルトの名無しさん
2009/06/24(水) 23:10:25ソースファイルはどこにあるのでしょうか?
また、ネットを漁っていて気になる発言があったのですが、
CPU(もしくはOS)に、三角関数の計算アルゴリズムが実装されているのでしょうか?
以上、よろしくお願い致します。
0768デフォルトの名無しさん
2009/06/24(水) 23:13:00なにかってのは元の数式の近似値だよね?
重い計算をしなくてもテイラー展開しておけば簡単な計算式でできると。
0769デフォルトの名無しさん
2009/06/24(水) 23:13:130770デフォルトの名無しさん
2009/06/24(水) 23:14:05> テイラー展開って面白そうだね。
> sin cosを大量に使うゲームには有効そう
標準ライブラリのdouble sin(double x)やdouble cos(double x)の実装がどうなっているかは
しらないが、近似値を求めると言うことはテイラー展開(正確にはテイラーの定理)を使っている可能性はある。
>>766
いろいろ近似値を求められるよ。
πとかeとか。
数学オタクの俺が言うんだから間違いない。
ちなみにテイラー展開とテイラーの定理をごっちゃにしているやつが
多すぎるのでそういう輩の説明は信用しないように。
0771デフォルトの名無しさん
2009/06/24(水) 23:14:19テイラー展開は元々平均値の定理から導かれた物だ
微分を知っていれば事足りる
0772デフォルトの名無しさん
2009/06/24(水) 23:15:33標準関数ライブラリのsinやcosよりどれぐらい高速なんですか?
0773デフォルトの名無しさん
2009/06/24(水) 23:18:10math系のソースの中身が見えない場合は実測してみなとなんとも
最近は環境によってはハードウェアレベルでsin計算しちゃうのもあるのでテイラー展開するまででないとかある
0774デフォルトの名無しさん
2009/06/24(水) 23:18:15あくまでも勉強用と考えましょう
ライブラリは様々なテクニックを使って例えば0やπ/2に近い時は
最適化されていたりするので
もしくは数値演算コプロセッサを使う事を前提としていたりするので
0775デフォルトの名無しさん
2009/06/24(水) 23:19:00コンパイルできました
ありがとうございました
0776デフォルトの名無しさん
2009/06/24(水) 23:20:04三角関数の値なんてfpuの一命令で求められる時代なんだから、標準ライブラリより速くなることはない。
0777770
2009/06/24(水) 23:23:00やっぱ数学オタクの俺のいうプログラミングの話は信用しない方が良いかもね。
0778デフォルトの名無しさん
2009/06/24(水) 23:23:06漏れが愛用しているZ80にもそんな機能があるのだろうか。
0779デフォルトの名無しさん
2009/06/24(水) 23:24:220780デフォルトの名無しさん
2009/06/24(水) 23:26:08ねーよ
ここでも見ろ
http://www.st.rim.or.jp/~nkomatsu/ICcollection.html
0781デフォルトの名無しさん
2009/06/24(水) 23:26:390782デフォルトの名無しさん
2009/06/24(水) 23:27:54面白そうと言った者です。
高卒です、すみません
0783デフォルトの名無しさん
2009/06/24(水) 23:28:35俺が使うことは一生なさそうだ
0784デフォルトの名無しさん
2009/06/24(水) 23:31:1180387系にはある
FPATAN
0785デフォルトの名無しさん
2009/06/24(水) 23:35:04ほう
0786デフォルトの名無しさん
2009/06/24(水) 23:42:09三角関数使わないっすよね?
0787デフォルトの名無しさん
2009/06/24(水) 23:45:30元々ジンバルロックというガウス座標特有の現象を避ける為に
考え出されたもので宇宙ステーションのアーム操作にも応用されている
0788デフォルトの名無しさん
2009/06/24(水) 23:46:16ゲームによってはいると思うよ。
モデルとモデルのアングル求めたりアングルからベクトルに直したりと・・・
0789デフォルトの名無しさん
2009/06/24(水) 23:50:27×ガウス座標
○オイラー座標
物理と混同していた
0790デフォルトの名無しさん
2009/06/25(木) 00:06:44使うよ。
0791デフォルトの名無しさん
2009/06/25(木) 00:08:31初心者だからこそ、余計なところでつまずく環境はお勧めできないと思うんだ。
0792721
2009/06/25(木) 03:06:14出力は/dev/nullですが、プログラムは実際には動いています。
以下プログラムのコピペです。
for (i = 0; i < 10; i++) {
for(j = 0; j < 8; j++){
str[j] = rand() % 8 + 1;
}
printf("%s\n", crypt(str,"ab"));
}
0793デフォルトの名無しさん
2009/06/25(木) 03:12:46cryptの実装の違いだろ。
0794721
2009/06/25(木) 03:29:18他のライブラリを試してみることにします。
レスを下さった方ありがとうございました。
0795デフォルトの名無しさん
2009/06/25(木) 04:44:230796デフォルトの名無しさん
2009/06/25(木) 06:30:43自分の必要なだけの精度しか求めないようにするとか、
入力に何らかの仮定ができて、もっと簡単な近似式を使えるとか、
大量のデータの計算でSIMD命令を活用するなど、
どうしてもという理由があって特定の目的に絞れば、汎用品である標準ライブラリよりは速くできるかもしれない。
0797デフォルトの名無しさん
2009/06/25(木) 09:31:56デバッグとリリースモードで動作の違うのは普通にあるよ。
0798デフォルトの名無しさん
2009/06/25(木) 09:41:22>>740みたいにそんな気軽にやるもんじゃないだろw
0799デフォルトの名無しさん
2009/06/25(木) 09:42:580800デフォルトの名無しさん
2009/06/25(木) 09:51:07異なるのは例外とすべき
0801デフォルトの名無しさん
2009/06/25(木) 10:06:24達人プログラマー(うろ覚え)で、リリースビルドでもassertは無効にするなって書かれてたり
して、スキル高い人でも、そうじゃないって意見はあるけど、一般的にはassert()とか
assert()的な動作のコードはよく使われています。
0802デフォルトの名無しさん
2009/06/25(木) 11:48:41バカか。動作のおかしいperlの方出せよ
#!/usr/bin/perl
for($i=0; $i<10000; $i++)
{
for($j=0; $j<8; $j++){ $str .= int(rand(8)) + 1; }
print crypt($str, "ab"),"\n";
}
time ./cryptest.pl > /dev/null
real 0m3.636s
user 0m3.600s
sys 0m0.010s
main()
{
int i,j;
char str[10]={0};
for(i=0; i<10000; i++) {
for(j=0;j<8;j++) str[j]=rand() % 8 + 1;
printf("%s\n", crypt(str, "ab"));
}
}
time ./cryptest > /dev/null
real 0m3.431s
user 0m3.400s
sys 0m0.000s
0803デフォルトの名無しさん
2009/06/25(木) 11:50:31main()
{
int i,j=0,sum=0;
while(j<=0){
printf("aは? ");scanf("%d",&j);
}
sum=0;
for(i=0;i<=j;i++){
sum=sum+i;
}
printf("1から3までの和は %d\n",sum);
}
0804k
2009/06/25(木) 12:02:21float fmin(float,float);
float main(void)
{
float a,b,min;
printf("aの値は?\n");
scanf("%f",&a);
printf("bの値は?\n");
scanf("%f",&b);
min=fmin(a,b);
printf("%fの方が小さい\n",min);
return 0;
}
float fmin(float x,float y)
{
float z;
if(x<y)
z=x;
else
z=y;
return z;
}
0805デフォルトの名無しさん
2009/06/25(木) 13:48:13ある設定NOが1-99まであって、そのNOに応じて
EEPROMから設定内容を読みだすのですが、
設定内容の読み出し関数が設定NOの数だけあり、戻り値がunsigned longだったり
charだったりばらばらです。
ifやswitch文で99も分岐させるのは嫌なのですが、関数ポインタに
しても型が違うのでうまくいきません。どういうやり方がすっきり作れる
でしょうか?
0806デフォルトの名無しさん
2009/06/25(木) 13:53:160807デフォルトの名無しさん
2009/06/25(木) 14:10:15読み出し関数が設定NOの数だけあり・・・
それならswitchでいいだろ
0808デフォルトの名無しさん
2009/06/25(木) 14:12:390809デフォルトの名無しさん
2009/06/25(木) 14:18:530810デフォルトの名無しさん
2009/06/25(木) 15:10:58static const struct {
proc func;
int ret_type;
} proc_table[] = {
{(proc)func_1, 1}, /* char */
{(proc)func_2, 1}, /* char */
{(proc)func_3, 4}, /* int */
{(proc)func_4, 2}, /* short */
:
とかやっといて、
unsigned long ret = proc_table[code].func();
してから proc_table[code].ret_type で switch 分岐、キャスト。
0811デフォルトの名無しさん
2009/06/25(木) 15:11:43○ [設定No]
0812デフォルトの名無しさん
2009/06/25(木) 15:18:51キャストすんな。
0813デフォルトの名無しさん
2009/06/25(木) 16:26:51>>810 の亜種
共通の戻りの型を一まとめにテーブル化 要素に設定No をおいて
渡された設定No をキーに for でなめてく
typedef long (*l_proc)(void);
typedef char (*c_proc)(void);
static const struct { l_proc func, int NO } l_proc_table[] = {
{ func1, 0 },
:
};
static const struct { c_proc func, int NO } c_proc_table[] = {
{ funcA, 10 },
:
};
for (i=0;i<sizeof(l_proc_table)/sizeof(l_proc_table[0]); i++) {
if (l_proc_table[i] == <渡された 設定No>) {
l_proc_table[i].func(); /* 呼び出し: 被代入変数は ptr で受ける? */
return;
}
}
for (i=0;i<sizeof(c_proc_table)/sizeof(c_proc_table[0]); i++) {
if (c_proc_table[i] == <渡された 設定No>) {
c_proc_table[i].func(); /* 呼び出し: 被代入変数は ptr で受ける? */
return;
}
}
0814デフォルトの名無しさん
2009/06/25(木) 16:31:11Cで仮想関数モドキをやろうとしてるの?
0815デフォルトの名無しさん
2009/06/25(木) 17:54:32void addCopy(char *pData)
{
char cTest = 10;
pData = &cTest;
}
0816デフォルトの名無しさん
2009/06/25(木) 17:57:50char addCopy(char *pData)
{
char cTest = 10;
pData = &cTest;
return cTest;
}
0817デフォルトの名無しさん
2009/06/25(木) 17:59:24そのコードでは無理
void addCopy(char *pData)
{
char cTest = 10;
*pData = cTest;
}
ならば可。
呼び出し元は受け用の実体変数を用意して
char c;
addCopy(&c);
と呼び出せば良い
0818デフォルトの名無しさん
2009/06/25(木) 18:00:42戻り値の型の数だけテーブル化はいいですね。
どうも1つのテーブルにこだわりすぎて思いつかなかったです。
設定NOは2つのテーブルで同じものは絶対ないので、
おかしなことにもならないですし。
0819デフォルトの名無しさん
2009/06/25(木) 18:01:47やはりこれでは無理ですか。
ありがとうございました。
0820デフォルトの名無しさん
2009/06/25(木) 18:04:191つのテーブルだと テーブルのindex == 設定NO とすることができるので
呼び出しにかかる時間コストはゴミという利点はあるけどね。
for でなめて引っ掛ける という性質上
時間コストは1つのテーブルの時より悪くなるのは仕方ないな
0821デフォルトの名無しさん
2009/06/25(木) 19:16:52O(1)にできそうだけどね。
0822デフォルトの名無しさん
2009/06/25(木) 19:24:27switch でも良いじゃん とループ
マクロである程度の簡略化はできるだろうけど、エントリの数だけ並ぶのは同じだし
#define IMP(no, func) case no: result = func (); break;
unsigned long result; /* 最も大きいサイズの型で受ける予定で */
switch (NO) {
IMP(1, funcA)
IMP(2, funcB)
:
}
#undef IMP
0823デフォルトの名無しさん
2009/06/25(木) 19:35:090824デフォルトの名無しさん
2009/06/26(金) 14:15:37単純そうだが、上手なアルゴリズムは難しいな。
0825デフォルトの名無しさん
2009/06/26(金) 14:20:11何が難しいと感じたのか詳しく。
0826デフォルトの名無しさん
2009/06/26(金) 15:23:55対戦してみたら、ほんとうに勝てなかったな。
0827デフォルトの名無しさん
2009/06/26(金) 15:31:47すげーな、それ。
ベイズ推定とかしていたのだろうか。
0828デフォルトの名無しさん
2009/06/26(金) 15:33:01乱数を用いた初心者向けのプログラムの中でも
もっとも簡単な基礎プログラムな気がするが。
0829デフォルトの名無しさん
2009/06/26(金) 19:17:31system関数で外部コマンド使うとか、自作するしかないのでしょうか。
自作を試みても100行超えてしまいます。Perlではたった1行で済むのに・・。何この差・・
0830デフォルトの名無しさん
2009/06/26(金) 19:21:400831デフォルトの名無しさん
2009/06/26(金) 19:21:48Perlでやればいいよ
regex?
0832デフォルトの名無しさん
2009/06/26(金) 19:22:42言語の目的が違うから?
perlは元からテキストなどを扱いやすいようにしてある言語だと聞いてるけど。
Cは元はそういう趣旨じゃないし。
それに一行で済むって、それはインタプリタ内で命令にあった処理を行ってるだけで
早い話あなたが実装した100行超のようなのが見えないところに実装されてるだけですよ
0833デフォルトの名無しさん
2009/06/26(金) 19:24:410834デフォルトの名無しさん
2009/06/26(金) 19:25:11scanf 系のマッチングでなんとかなるかもしれないし、ならないかもしれない
0835デフォルトの名無しさん
2009/06/26(金) 19:27:520836デフォルトの名無しさん
2009/06/26(金) 19:36:02一体 >>829 は何を指して「パターンマッチ」と言っているんだ?
0837デフォルトの名無しさん
2009/06/26(金) 19:42:26お前の「普通」はよく分からない
0838デフォルトの名無しさん
2009/06/26(金) 20:26:540839デフォルトの名無しさん
2009/06/26(金) 20:42:49適当なライブラリ探してきて使えばいい。
printfもscanfも、ライブラリ関数だ。
0840デフォルトの名無しさん
2009/06/26(金) 21:10:19このさいc++でもいい
0841デフォルトの名無しさん
2009/06/26(金) 21:21:37Boost.Xpressiveは?
0842デフォルトの名無しさん
2009/06/26(金) 22:45:240843デフォルトの名無しさん
2009/06/26(金) 22:46:320844デフォルトの名無しさん
2009/06/26(金) 22:55:30a=b++じゃだめなのかな
0845デフォルトの名無しさん
2009/06/26(金) 22:57:120846デフォルトの名無しさん
2009/06/26(金) 22:57:24自分で実行しろ。
>>842
お前もググれ。
ちょっといい加減にバカが多すぎる。
0847デフォルトの名無しさん
2009/06/26(金) 23:00:35a=++bの動き:bを1加算してからaに代入する
a=b++の動き:aにbを代入してからbに1を加算する
明らかにa=(b=b+1)は上の動き
0848デフォルトの名無しさん
2009/06/26(金) 23:00:35前置インクリメント、後置インクリメントでググると良いよ
0849デフォルトの名無しさん
2009/06/26(金) 23:11:47なんとなくわかりました。
でもこんなのコンパイラを作る人とかにしか関係ないと思うのですが
なんで必要なんですか?
0850デフォルトの名無しさん
2009/06/26(金) 23:15:180851デフォルトの名無しさん
2009/06/26(金) 23:26:27テキスト処理に使うだろ
0852デフォルトの名無しさん
2009/06/26(金) 23:32:54何も分かっていないwwww
もういいよ、じゃあコンパイラでも作ってろ
0853デフォルトの名無しさん
2009/06/26(金) 23:45:12少しわかりました
>>852
わかってたら質問しません。
0854デフォルトの名無しさん
2009/06/26(金) 23:45:52なかなか見込みのある男だ
ガンバレ
0855デフォルトの名無しさん
2009/06/26(金) 23:51:460856デフォルトの名無しさん
2009/06/27(土) 00:03:340857デフォルトの名無しさん
2009/06/27(土) 00:09:15俺も真っ先にそう思った
0858デフォルトの名無しさん
2009/06/27(土) 00:13:290859デフォルトの名無しさん
2009/06/27(土) 00:14:060860デフォルトの名無しさん
2009/06/27(土) 00:15:22お前「なんとなくわかりました。」
俺「何も分かっていないwwww」
お前「わかってたら質問しません。」
だから俺がさっきから「何も」分かっていないと
言ってるじゃないか。
部分否定じゃなくて完全否定だよ?
頭おかしいのかな?
0861デフォルトの名無しさん
2009/06/27(土) 00:33:14C言語でCGIプログラムをつくりたいのでパターンマッチングがないと不便です。
Perlでやれというのはなしで。
0862デフォルトの名無しさん
2009/06/27(土) 00:34:24それがC/C++の世界
0863デフォルトの名無しさん
2009/06/27(土) 00:36:18パターンの種類を列挙できるならやってみて
0864デフォルトの名無しさん
2009/06/27(土) 01:01:20Webサーバは何使うの?
0865デフォルトの名無しさん
2009/06/27(土) 01:15:340866デフォルトの名無しさん
2009/06/27(土) 02:06:51ApacheモジュールのPHPのほうがCのCGIより速いんじゃない
0867デフォルトの名無しさん
2009/06/27(土) 02:20:370868デフォルトの名無しさん
2009/06/27(土) 04:17:37int main(void)
{
int a,b;
char d;
printf("aha");
scanf_s("%d",&a);
printf("bha");
scanf_s("%d",&b);
printf("dha");
scanf_s("%c",&d);
printf(" %d ",a);
printf(" %d ",b);
printf(" %c ",d);
return 0;
}
dの入力ができません。
どなたか試してくれませんか。
0869デフォルトの名無しさん
2009/06/27(土) 05:29:320870デフォルトの名無しさん
2009/06/27(土) 19:03:45あとその構造体の中の関数ポインタに登録されている関数を実行するコードはどのように書けばいいでしょうか?
0871デフォルトの名無しさん
2009/06/27(土) 19:15:55#include<stdio.h>
struct foo{
int a, b;
void (*bar)(struct foo *);
};
void prt_a(struct foo *p){
printf("a=%d\n", p->a);
}
void prt_b(struct foo *p){
printf("b=%d\n", p->b);
}
void prt_ab(struct foo *p){
printf("a=%d b=%d\n", p->a, p->b);
}
#define CALL_BAR(x) (x)->bar(x)
int main(void){
struct foo hoge={1,2,prt_a}, huga={3,4,prt_b}, haga={5,6,prt_ab};
CALL_BAR(&hoge);
CALL_BAR(&huga);
CALL_BAR(&haga);
hoge.bar(&hoge);
return 0;
}
0873デフォルトの名無しさん
2009/06/27(土) 20:44:46ポインタ配列のほうが効率良くメモリを使用できると思うのですが、
二次元配列でないと駄目な状況とはどのような場合なのでしょうか?
0874デフォルトの名無しさん
2009/06/27(土) 20:52:521回のmallocで済む
0875デフォルトの名無しさん
2009/06/27(土) 20:58:20http://ysserve.int-univ.com/Lecture/c2/e_04-03.html
0876デフォルトの名無しさん
2009/06/27(土) 21:00:10使わない所はNULLで開放してればいいわけだし
0877デフォルトの名無しさん
2009/06/27(土) 21:03:21かならずってわけじゃないでしょ
0878デフォルトの名無しさん
2009/06/27(土) 21:06:520879デフォルトの名無しさん
2009/06/27(土) 21:08:07連続してる方がキャッシュ効率が良くなって速くなりそうな気はする
0880デフォルトの名無しさん
2009/06/27(土) 21:08:46ソートは速いね。
構造体が大きければ大きいほど。
0881デフォルトの名無しさん
2009/06/27(土) 21:09:530882デフォルトの名無しさん
2009/06/27(土) 21:34:48どのように宣言すればいいのでしょうか?
0883デフォルトの名無しさん
2009/06/27(土) 21:43:53>883
struct A;
struct B {
struct A *a;
};
struct A {
struct B b;
};
0884デフォルトの名無しさん
2009/06/27(土) 21:50:46ありがとうございます
0885デフォルトの名無しさん
2009/06/28(日) 00:17:420886デフォルトの名無しさん
2009/06/28(日) 00:28:440887デフォルトの名無しさん
2009/06/28(日) 00:41:31typedefは#defineのようなプリプロセッサーに対する指令でないから
untypedefはない。
0888デフォルトの名無しさん
2009/06/28(日) 02:20:070889デフォルトの名無しさん
2009/06/28(日) 09:45:15//hogeになにか入れたりします。
if(hoge % 1 == 0)
{
//処理
}
こういうロジックがあるのですが
hoge % 1 って常に0ですよね・・・?
0890デフォルトの名無しさん
2009/06/28(日) 09:47:32これを使って、全く別のint型の変数abcdにアクセスしたいのですが、どのような方法がありますか?
0891デフォルトの名無しさん
2009/06/28(日) 09:53:220892デフォルトの名無しさん
2009/06/28(日) 09:59:02むり。
0893デフォルトの名無しさん
2009/06/28(日) 10:23:310894890
2009/06/28(日) 10:28:38なんとできないのですか・・・
抽象的な質問になって申し訳ないのですが
こういう場合、普通どういう方法を使うのでしょうか?
自分だと、単純にif文かswich文で
文字列abcdが入っていたら、変数abcdをうんたら〜しか思いつきません
0895デフォルトの名無しさん
2009/06/28(日) 10:32:38まあ仕組みを組めばできなくはないけどな・・・・
0896デフォルトの名無しさん
2009/06/28(日) 10:40:42Cにもハッシュテーブルがあれば、やりたいことが簡単にできそうだけどね。
解決策としては、全部番号にする手がある。
文字列をデータベースみたいに配列に格納して、変数も配列にする。
で、1番の文字列が見つかったら、1番の変数を操作するようにする。
変数名じゃなくて、文字列表の中の番号を使う。
0897デフォルトの名無しさん
2009/06/28(日) 11:51:37>>自分だと、単純にif文かswich文で
>>文字列abcdが入っていたら、変数abcdをうんたら〜しか思いつきません
それでいいんじゃない?
対象の変数が少なければ、それが普通かと
0898デフォルトの名無しさん
2009/06/28(日) 13:56:43{
Person dmy={"",0,NULL};
Person *start=&dmy;
Person *wkdtp;
Person *ip;
char name[30],age_ss[10];
while(1){
printf("名前="); gets(name);
if(strcmp(name,"")==0) break;
printf("年齢="); gets(age_ss);
wkdtp=(Person *)malloc(sizeof(Person));
if(wkdtp==NULL){
printf("メモリを確保できません\n");
exit(1);
}
0899898
2009/06/28(日) 13:57:29strcpy(wkdtp->name,name);
wkdtp->age=atoi(age_ss);
for(ip=start;ip->next!=NULL;ip=ip->next){
if(wkdtp->age < ip->next->age){
wkdtp->next = ip->next;
ip->next = wkdtp;
break;
}
一番下のfor文で、
ip=startでip->nextの値はNULLになるのではないでしょうか?
後まだ存在しないip->next->ageにアクセスしようとしていいのでしょうか?
0900898
2009/06/28(日) 14:04:02スレ汚し申し訳ありませんでした。
0901デフォルトの名無しさん
2009/06/28(日) 15:24:58exec*()前にmalloc()したメモリはfree()しなくても大丈夫ですか?
0902デフォルトの名無しさん
2009/06/28(日) 15:41:39エラーが起きなければ返ってこないので freeしようがない。
0903デフォルトの名無しさん
2009/06/28(日) 17:47:24処理のところにちょこちょこbreakが入ってたりしない?
なんかのなごりというのが有力な気もするけど。
0904デフォルトの名無しさん
2009/06/28(日) 18:47:570905デフォルトの名無しさん
2009/06/28(日) 19:00:31うはっマジだ。ぐぐったら1じゃなくて-1だな。
#include <limits.h>
volatile int m = INT_MIN;
volatile int n = -1;
void main() { int i = m % n; }
VC落ちたw
0906デフォルトの名無しさん
2009/06/28(日) 19:02:03元々二回に一回等の処理したくて %2だったのが %1に変更されたんじゃないかと推測
0907デフォルトの名無しさん
2009/06/28(日) 19:22:36hoge &1 == 0
と勘違いしたんじゃないかな。
0908デフォルトの名無しさん
2009/06/28(日) 21:15:54って書けば、変数宣言するときに
num i ; で
int i ;
と同じ意味になる(numはintの別名になる。)というのはわかってるんだけど
typedef struct tagDATEDATA
{
int Year ; // 年
int Mon ; // 月
int Day ; // 日
int Hour ; // 時間
int Min ; // 分
int Sec ; // 秒
} DATEDATA, *LPDATEDATA ;
って書いた場合はなにがどうなるの?
0909デフォルトの名無しさん
2009/06/28(日) 21:19:35LPDATEDATAがstruct tagDATEDATA*の別名になる
0910デフォルトの名無しさん
2009/06/28(日) 21:33:44理解は出来たが、いややっぱり複雑で…微妙に理解出来てないかも。
LPDATEDATAって入力したらこの構造体へのポインタになる・・・の?
0911デフォルトの名無しさん
2009/06/28(日) 22:16:34DATEDATA date;
LPDATEDATA pDate = &date;
pDate->Year = 2009;
0912デフォルトの名無しさん
2009/06/28(日) 22:22:16とつくづく思うが、そんなリスト見かけるよな。
0913デフォルトの名無しさん
2009/06/28(日) 23:15:08適切なスレが見つからないため質問させてください。
sample.txtの変更を監視するプログラムです。
epollの練習に書いてみたのですが、epoll_ctlがエラーを返します。
fd = open("sample.txt", O_RDONLY|O_NONBLOCK);
epfd = epoll_create(1);
memset(&ev, 0, sizeof(ev));
ev.events = EPOLLIN|EPOLLET;
ev.data.fd = 0;
epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev);
for(;;) {
epoll_wait(epfd, &ev, 1, -1);
printf("sample.txt is changed.\n");
}
このコードが期待通りに動きません。
調べてみるとepoll_ctl(2)が-1を返しており、errnoにEPERMが入っています。
また、fdを通常ファイルではなく、標準入力(1)にすると正常に動作します。
sample.txtの権限は644としており、読み書きが可能な状態としています。
どこが間違っているのでしょうか?
0914デフォルトの名無しさん
2009/06/29(月) 00:08:100915デフォルトの名無しさん
2009/06/29(月) 00:43:05これってどういう意味でしたっけ
ググってもヒットしてくれなくて・・・
0916デフォルトの名無しさん
2009/06/29(月) 00:45:140917デフォルトの名無しさん
2009/06/29(月) 00:51:540918デフォルトの名無しさん
2009/06/29(月) 05:30:31こっちで頼むわ
http://nanajigen.blog74.fc2.com/
0919デフォルトの名無しさん
2009/06/29(月) 20:08:33'0'<=c && c<='9'
'a'<=c && c<='z' || 'A'<=c && c<='Z'
(*p>='a' && *p<='z')
(*p>='a' && *p<='z')&&(*p>='A' && *p>='Z')
上の5つの条件式なんですがなぜ上のように記述するのかいまいちわかりません
良かったら解説というか考え方をお願いします
0920デフォルトの名無しさん
2009/06/29(月) 20:09:434つでしたねすいません
0921デフォルトの名無しさん
2009/06/29(月) 20:11:46半角文字の範囲をチェックしてます。
http://e-words.jp/p/r-ascii.html
この場合は数字の0-9とアルファベットの小文字a-zと大文字A-Zの範囲の文字かどうか
なぜこういうことでOKなのかといえば文字コードが連続してるから
0922デフォルトの名無しさん
2009/06/29(月) 20:12:14四つ目の条件はおかしい気がするぞ
0924デフォルトの名無しさん
2009/06/29(月) 20:14:090925922
2009/06/29(月) 20:15:37本当にその式でいいのか分からない
真ん中の && と一番最後の >=
0926デフォルトの名無しさん
2009/06/29(月) 20:27:59>>923
>>924
>>925
4つ目は打ち間違いでした
*p<='z'ですね
>>925
一応プログラムはちゃんと動いてたのであってるとは思います
ちなみに3つ目は英文字列を全て大文字に変換するプログラム
4つ目は英文字以外を全て空白に変換するプログラムで使用した条件式です
どうも理解できないですね(馬鹿なだけ)
文字コードで連続しているのはわかりました
0927デフォルトの名無しさん
2009/06/29(月) 20:30:35'0'<=c && c<='9'
この部分は
0x30 <=c && c<= 0x39
としてるのと同じ
0928デフォルトの名無しさん
2009/06/29(月) 20:30:584つ目間違えました
すいません
この条件だとこうなるのかな(!(*p>='a' && *p<='z')&&!(*p>='A' && *p>='Z'))
0929デフォルトの名無しさん
2009/06/29(月) 20:41:29cの値が0x30以上かつcの値がcの値が0x39以下ってことでいいんですかね?
0930デフォルトの名無しさん
2009/06/29(月) 20:42:26そうですね
a-z A-Zも同じようにそれぞれの文字コードの範囲としても置きかえれます
0931デフォルトの名無しさん
2009/06/29(月) 20:48:06*pの方は文字列チェックでcだけの方は1文字だけ?
0932デフォルトの名無しさん
2009/06/29(月) 20:53:47なるほどなるほど
ちなみに'0'<=c && c<='9'とc>='0' && c<='9'は同じ意味になりますよね?
>>931
1文字だけって訳じゃないです
0933デフォルトの名無しさん
2009/06/29(月) 21:56:240934デフォルトの名無しさん
2009/06/29(月) 22:08:260935デフォルトの名無しさん
2009/06/29(月) 22:24:11ttp://www.bohyoh.com/CandCPP/C/Library/
ここ便利かもね。
0936デフォルトの名無しさん
2009/06/29(月) 23:26:26プログラムで出力したファイルを
バッチファイルで日付を入れてリネームしたいのですが
ワイルドカードの使い方がわかりません。
例えば
test.txt ->test_090629.txt
としたいのですが、
拡張子を除いた部分の「test」をどうやったら抜き出せるのかわからないのです。
OSはWindows vistaです。
よろしくお願いします。
0937デフォルトの名無しさん
2009/06/29(月) 23:27:55じゃなくて
'0'<=c && c<='9'
の方が数直線的に見やすくてよくね?って言ったらハァ?って顔された俺は異端なのかね
0938デフォルトの名無しさん
2009/06/29(月) 23:30:10右なら右とか
0939デフォルトの名無しさん
2009/06/29(月) 23:34:07というように、cを主語にして考えるので、前者の方が見やすい。
0940デフォルトの名無しさん
2009/06/29(月) 23:35:26c<='9'
嫌ならこう書いてもいいしな
0941デフォルトの名無しさん
2009/06/29(月) 23:37:02おれもその表記のほうが好きだ。数学的思考。
0942デフォルトの名無しさん
2009/06/29(月) 23:37:44c < '0' || '9' < c
とかもわかりやすいと思ってたのにな。。
100 <= i && i < 1000 とかさ。。。
0943デフォルトの名無しさん
2009/06/29(月) 23:39:06「cは、'0'と'9'の間にある」っていう
ひとつのパターンで見る考え方もあるが?
世の中のコードを検索して比率を調べてみたら面白いかもしれない。
0944デフォルトの名無しさん
2009/06/29(月) 23:39:38数学的な値域の表現 0 ≦ c ≦ 9 の形に近い というやつね
>>939
たまたま 1回 c の評価をしてるだけ って立ち場だね
c が '0' 以上で' d が '9' 以下 なら
c <= '0' && d <= '9'
って書くし と。
どちらの主張も理解できるだけに悩ましい。 おれは上段のほうが好み
0945デフォルトの名無しさん
2009/06/29(月) 23:55:090946939
2009/06/29(月) 23:59:36主語は左に無いと読みにくくて・・・。
あと&&が左右を完全に分断しているように見えるので、
おっしゃるような一つのパターンとして見ることができません。
数式なら断然「0 ≦ c ≦ 9」が見やすいんだけどね。
0947デフォルトの名無しさん
2009/06/30(火) 00:01:56うん。
大小比較は大抵 < か <= にそろえてる
0948デフォルトの名無しさん
2009/06/30(火) 00:02:19その辺は数学の数式に慣れろというのと同じでc言語のお作法になれろというか
バグを出しにくい書き方を覚えろとしかいえない
0950デフォルトの名無しさん
2009/06/30(火) 00:12:15この件で、C言語のお作法ってあるのかな?
とおもって、K&Rパラパラめくったら、同じようなコードを発見!
表紙の白いバージョン53ページ
if ( c >= 'A' && c < 'Z')
って書いてあるぞ。28〜29ページにも同じようなコード。
ということです。
でも、個人的には 'A' <= c && c <= 'Z' のほうが好きだけど。
0951デフォルトの名無しさん
2009/06/30(火) 00:13:230952デフォルトの名無しさん
2009/06/30(火) 00:14:23K&Rの書き方は他の部分でも必ずしもスマートなわけではないと記憶してる
0953デフォルトの名無しさん
2009/06/30(火) 00:14:35たぶん
'A' <= c && c <= 'Z'
これは嫌いなグラマー多いと思う
0954デフォルトの名無しさん
2009/06/30(火) 00:16:530955デフォルトの名無しさん
2009/06/30(火) 00:17:35まさかGNUコーディングスタイルとかで決まってないか?
0956デフォルトの名無しさん
2009/06/30(火) 00:18:41もしかして世の中ではソース読むときにいちいち日本語に直して理解するのが多数派なのか?
0957デフォルトの名無しさん
2009/06/30(火) 00:18:530958デフォルトの名無しさん
2009/06/30(火) 00:21:31そんな難しく考えてなくて
c <= 'Z'
1つだとこう書く
たまたま文字の範囲チェックなので挟む
でも
c >= 'A'
c <= 'Z'
の間なので
&&で繋げる
それだけ
0959デフォルトの名無しさん
2009/06/30(火) 00:22:160960デフォルトの名無しさん
2009/06/30(火) 00:45:13今「*」で図を書くプログラムに挑戦しているのですが平行四辺形・菱型・星型・渦巻き・ハートができません。
基礎であろう四角形と三角形(逆三角形と旗型)は作成できました。
作成する際の条件なのですが、
�@2〜9を入力すると入力した行分の高さの図ができる。
�A繰り返しをしようする。
です。
どうか皆さんの知識を分けていただけないでしょうか?お願いします。
0961デフォルトの名無しさん
2009/06/30(火) 00:56:27菱形は
▲
▼
星はええと、*なのか☆なのかによる
渦巻きハートは努力次第
0962デフォルトの名無しさん
2009/06/30(火) 00:57:25挑戦するだけなら自分にわざわざそんな条件つけないしょ
0963デフォルトの名無しさん
2009/06/30(火) 00:59:30宿題スレへどうぞ
0964デフォルトの名無しさん
2009/06/30(火) 00:59:320965デフォルトの名無しさん
2009/06/30(火) 01:00:53ハートは半円二つ+三角形で。
0966デフォルトの名無しさん
2009/06/30(火) 01:08:37星型は*です。
>>962
宿題ではありません。三角形と四角形が�@�Aの指定があったのでそのままの条件で作れないかと思い
そのようにしました。
0967デフォルトの名無しさん
2009/06/30(火) 01:10:100968デフォルトの名無しさん
2009/06/30(火) 09:59:23*****
*****
*****
*****
--
これだって立派に菱形でもあり平行四辺形でもある。
0969デフォルトの名無しさん
2009/06/30(火) 10:09:260970デフォルトの名無しさん
2009/06/30(火) 10:25:54理解力なさす
0971デフォルトの名無しさん
2009/06/30(火) 10:26:57今回の「◆」と「▲▼」にしたって、単に「対角線が水平と垂直になる四角形」と
「二辺が水平で残りの二辺が傾斜した平行四辺形」とするだけでいいのに。
0972デフォルトの名無しさん
2009/06/30(火) 10:29:47「*」と言われても、フォントによって五傍星も六傍星も八傍星もあるのだが。
0973デフォルトの名無しさん
2009/06/30(火) 10:37:23入力に応じてファイルを選択して表示すればいいんじゃないの?
ファイルを1行ずつ読むところで繰り返しを使用するし
0974デフォルトの名無しさん
2009/06/30(火) 10:43:330975デフォルトの名無しさん
2009/06/30(火) 11:00:47・平行四辺形(▲▼)
三角形(▲)を作れればその応用。行内の開始点は▲と同じで、長さ一定とするだけ。
・菱形(◆)
これも三角形(▲)と逆三角形(▼)の応用。▲を出力したら、続けて▼を(1行減らして)出力すればいい。
後は高さに注意。三角形の行数の2倍-1行必要だから、2行では菱形に見えない。
・星型
これはややこしいな。出力したい形をエディタで書いておいて、規則性を探してみればいいよ。
順番としては、後回しにすることお勧め。場合によっては、>973-974のようにデータ構造を考えた方がいいかも。
・渦巻き
四角い渦巻きならそれほど難しくない。これもエディタで書いてみてから
上半分と下半分に分けて規則性を探せばいい。
但し、9行使っても目立った渦巻きにならないのに2行では渦どころか一巻きもできない。
そこはどう解釈する? 規則性を見つけやすいだけ星型よりはましかな。
・ハート
>965にもあるけど、上半分の半円を工夫すれば後は菱形の応用かな。これも行数に注意。
0976デフォルトの名無しさん
2009/06/30(火) 11:31:14ぎりぎり一巻きぐらい。
#include <math.h>
#define MAX 60
main()
{
int i,t;
double v,w,x,y;
char table[MAX][MAX+1];
memset(table, ' ', sizeof(table));
w = 3.0/180;/* radian */
v = 0.03;
for(t=0; t<1000; t++) {
x = t*v*sin(w*t*M_PI);
y = t*v*cos(w*t*M_PI);
x += MAX/2;
y += MAX/2;
if(x < 0 || x >= MAX || y < 0 || y >= MAX) continue;
table[(int)y][(int)x]='*';
}
for(i=0; i<MAX; i++) {
table[i][MAX]=0; printf("%s\n", table[i]);
}
}
0977デフォルトの名無しさん
2009/06/30(火) 12:13:41table[MAX][MAX]にしておいて、printf("%.*s", MAX, table[i])とした方がいいと思うの。
0978デフォルトの名無しさん
2009/06/30(火) 12:28:46↓だと大量に警告が出てコンパイルは通るのですが、実行するとcore dump吐いて落ちてしまいます。
これの正しい書き方が分かる人がいましたらご教示ください。
#include <stdio.h>
int main()
{
char ***pppChar = {
{"abc", "def", "ghi", NULL},
{"jkl", "mno", NULL},
NULL
};
char **ppChar, *pChar;
for(ppChar = *pppChar; ppChar != NULL; ppChar++){
for(pChar = *ppChar; pChar != NULL; pChar++){
printf("%s ", pChar);
}
printf("\n");
}
return 0;
}
0979デフォルトの名無しさん
2009/06/30(火) 12:51:13は?
指摘してる人もいるが2行だと要求してる図形にならないのもあるだろ
0980デフォルトの名無しさん
2009/06/30(火) 12:52:37// 二つ問題がある。一つは可変長配列の初期化、もう一つはポインタの型
#include <stdio.h>
int main()
{
char * firstStrings[] = {"abc", "def", "ghi", NULL};
char * secondStrings[] = {"jkl", "mno", NULL};
char ** stringArrays[] = {firstStrings, secondStrings, NULL};
for (int i = 0; stringArrays[i] != NULL; ++i) {
for (int j = 0; stringArrays[i][j] != NULL; ++j) {
for (int k = 0; stringArrays[i][j][k] != '\0'; ++k) {
putchar(stringArrays[i][j][k]);
}}}
for (char *** p = stringArrays; * p != NULL; ++p) {
for (char ** q = * p; * q != NULL; ++q) {
for (char * r = * q; * r != '\0'; ++r) {
putchar(* r);
}}}
return 0;
}
0981デフォルトの名無しさん
2009/06/30(火) 12:55:17いっぺんにchar型へのポインタ配列のポインタ配列は初期化無理みたいね
#include <stdio.h>
int main(void)
{
char *ppChar1[] = {"abc", "def", "ghi", NULL};
char *ppChar2[] = {"jkl", "mno", NULL};
char *ppChar3[] = {NULL};
char **ppChar[3], ***pppChar;
char **ppCharx;
ppChar[0] = ppChar1;
ppChar[1] = ppChar2;
ppChar[2] = ppChar3;
for (pppChar = ppChar; *pppChar != NULL; pppChar++) {
for (ppCharx = *pppChar; *ppCharx != NULL; ppCharx++)
printf("%s ", *ppCharx);
printf("\n");
}
return 0;
}
0982デフォルトの名無しさん
2009/06/30(火) 13:00:13●一番外の配列の要素数宣言は省略できるけど、内側は無理(固定量ならOK)
●内側がポインタになってて そこに配列の先頭を渡す宣言で、なおかつ その配列が個別に実体の大きさが違う
int で似たようなのを考えると こんな感じかねぇ…
int pData1[] = { 1, 2, 3, 0 };
int pData2[] = { 4, 5, 0 };
int pData3[] = { 6, 0 };
int *ppData[] = { pData1, pData2, pData3, NULL, };
int i;
for (i=0; ppData[i] != NULL; i++) {
int *pData;
for (pData = ppData[i]; *pData; pData++) printf("(%d)", *pData);
printf("\n");
}
0983デフォルトの名無しさん
2009/06/30(火) 13:03:581行に2個'*'がでることもあるし。。
0984デフォルトの名無しさん
2009/06/30(火) 13:04:52は?
0985デフォルトの名無しさん
2009/06/30(火) 13:15:37何とかなりませんかね
char **ppChar[] = { ppChar1, ppChar2, ppChar3 };
0986デフォルトの名無しさん
2009/06/30(火) 13:17:040987デフォルトの名無しさん
2009/06/30(火) 13:19:06エラーメッセージも貼るといいよ
0988デフォルトの名無しさん
2009/06/30(火) 13:29:26%.<数値>s というフォーマット知らない?
フォーマット文字列内の数値部を引数からもってくる って仕様の
%.*s という指示があるわけで 決して * を表示しようとしているのではないぞ
0989デフォルトの名無しさん
2009/06/30(火) 13:40:200990デフォルトの名無しさん
2009/06/30(火) 13:43:05エラー E2063 strstr1.c 16: 不正な初期化(関数 main )
どうもポインタ配列で他のポインタ配列を初期化しようとすると
だめみたいだ
0991デフォルトの名無しさん
2009/06/30(火) 13:47:12関数ポインタの配列だと同じようにポインタで初期化できてるし(ポインタ配列じゃなく関数だけどさ)
0992デフォルトの名無しさん
2009/06/30(火) 13:48:12strstr1.c: In function 'main':
strstr1.c:19: error: incompatible types when assigning to type 'char **[3]' from type 'char **'
0993デフォルトの名無しさん
2009/06/30(火) 13:49:57char **ppChar = { ppChar1, ppChar2, ppChar3 };
こう書いてるだろ?
char **ppChar[] = { ppChar1, ppChar2, ppChar3 };
とは全然意味が違うんだぜ
0994デフォルトの名無しさん
2009/06/30(火) 13:51:24>>985
ちゃんと書いてます
0995デフォルトの名無しさん
2009/06/30(火) 14:55:000996デフォルトの名無しさん
2009/06/30(火) 14:55:200997デフォルトの名無しさん
2009/06/30(火) 15:00:46#include <stdio.h>
int main(void)
{
char *ppChar1[] = {"abc", "def", "ghi", NULL};
char *ppChar2[] = {"jkl", "mno", NULL};
char *ppChar3[] = {NULL};
char **ppChar[3], ***pppChar;
char **ppCharx;
char **ppCharx[] = {ppChar1, ppChar2, ppChar3};
for (pppChar = ppChar; *pppChar != NULL; pppChar++) {
for (ppCharx = *pppChar; *ppCharx != NULL; ppCharx++)
printf("%s ", *ppCharx);
printf("\n");
}
return 0;
}
0998デフォルトの名無しさん
2009/06/30(火) 15:06:31>char **ppCharx;
>char **ppCharx[] = {ppChar1, ppChar2, ppChar3};
なんだコレ。
0999デフォルトの名無しさん
2009/06/30(火) 15:11:201000デフォルトの名無しさん
2009/06/30(火) 15:17:35↓
char **ppCharx[3] = {ppChar1, ppChar2, ppChar3};
これでだめなの?
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。