C言語なら俺に聞け(入門編)Part 63
レス数が1000を超えています。これ以上書き込みはできません。
★前スレ
C言語なら俺に聞け(入門編)Part 62
http://pc12.2ch.net/test/read.cgi/tech/1269517734/
★過去スレ
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
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.72【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1267775473/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 135代目
http://pc12.2ch.net/test/read.cgi/tech/1269438098/
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0002デフォルトの名無しさん
2010/04/11(日) 00:41:480003デフォルトの名無しさん
2010/04/11(日) 01:37:570004デフォルトの名無しさん
2010/04/11(日) 01:42:160005デフォルトの名無しさん
2010/04/11(日) 03:32:21コマンドプロンプトやシェルスクリプトが利用するってのは聞いたことがあるんだけど、
それを利用して何を処理してんの?
0006デフォルトの名無しさん
2010/04/11(日) 03:42:50具体的な例で言うと、testコマンドなんかは
条件を満たしたときの戻り値が0、満たさなかったときの戻り値が0以外だな。
あと、変り種なコマンドとして、 : というのもある。
これは何をするのかというと、何もせず、戻り値として0を返すコマンドだ。
0007デフォルトの名無しさん
2010/04/11(日) 03:48:11プログラムが成功したか失敗したかを判断するのに使う
プログラムが動作失敗したらもうそれ以上処理を続行したくないとき
などで見るのが一般的な使い方になる
Linuxのデーモン起動スクリプトなどはこれを積極的に利用してて
プログラムが正常に終了しなかったときに処理を停止する機能を
先頭で有効にしていたりする。(set -e)
0008デフォルトの名無しさん
2010/04/11(日) 03:50:39分かりやすくありがとう
0009デフォルトの名無しさん
2010/04/11(日) 06:04:23駄目なんだ?
0010デフォルトの名無しさん
2010/04/11(日) 08:37:100011デフォルトの名無しさん
2010/04/11(日) 12:29:22別にダメじゃないだろ
定義されていないだけで
0012デフォルトの名無しさん
2010/04/11(日) 12:39:17多分起動元で値がとれない。
0013デフォルトの名無しさん
2010/04/11(日) 14:39:55それをintと置き換える意味がほとんどないからです。
0014デフォルトの名無しさん
2010/04/11(日) 15:20:37void と int が交換可能なのは、たまたま大概の処理系がそうなっているからだけのこと。
0015デフォルトの名無しさん
2010/04/11(日) 15:25:00一応訂正しとくけど、voidとintは交換可能ではないよ。
一般的なOSでは戻り値にintを期待してて、voidでは値が返却されず不定になってるけど
呼び出し元がたまたま戻り値を利用しないから問題にならないだけで。
0016デフォルトの名無しさん
2010/04/11(日) 15:29:44make で使おうと思ったら勝手に止まったり
0017デフォルトの名無しさん
2010/04/11(日) 15:33:43不定にならない処理系もある。M$ とか。
0018デフォルトの名無しさん
2010/04/11(日) 16:09:02それはコンパイラの親心機能だな。
0019デフォルトの名無しさん
2010/04/11(日) 16:42:210020デフォルトの名無しさん
2010/04/11(日) 17:20:07さすがにこのネタも古くなり、以前のようには釣れなくなってきました。
0021デフォルトの名無しさん
2010/04/11(日) 17:38:52釣り方に品が無い。
そもそもintってなんだよw、とか8bit時代はどうしてたんだよw、とか
今までとは違う方向へ話が広がるように釣ってくれないと。
0022デフォルトの名無しさん
2010/04/11(日) 18:48:59SSE を使うときに便利な構造体。
同じ128ビット内の内容を、byteやfloatやx,y,z,wで指せて便利。
asm("movaqu %0,%%xmm1;":"+m"(xmm));って風にそのままインラインアセンブラにも渡せて簡単。(ニモニックうろおぼえ)
配列にして渡せば、そのままパイプでだーーっと一度に計算できてたぶん速い。たぶん。
…いや、べつに。…なんとなく。
0023デフォルトの名無しさん
2010/04/11(日) 19:08:28wって何に使うの?
0024デフォルトの名無しさん
2010/04/11(日) 19:09:230025デフォルトの名無しさん
2010/04/11(日) 19:31:38共用体を初めて知ったの?
0026デフォルトの名無しさん
2010/04/11(日) 19:35:030027デフォルトの名無しさん
2010/04/11(日) 19:50:28あれ共有体だぞ
0029デフォルトの名無しさん
2010/04/11(日) 21:55:070030デフォルトの名無しさん
2010/04/11(日) 23:26:57MSDOSコールを嫌というほど書いた思い出があるな
farポインタとかhugeポインタ死ねよ
0031デフォルトの名無しさん
2010/04/12(月) 03:30:28far ポインタは良く使ったな。huge ポインタはときに seg:off で off が一回りしたときに seg をインクリメントしてくれないことがあるので怖くてちかづかなかった。
0032デフォルトの名無しさん
2010/04/12(月) 03:49:201MのRAMすら広すぎてもてあましてた
8MのRAMなんて高くて手が届かなかった
0033デフォルトの名無しさん
2010/04/12(月) 07:13:190034デフォルトの名無しさん
2010/04/12(月) 08:33:350035デフォルトの名無しさん
2010/04/12(月) 10:25:59farポインタの糞仕様に参ってたよ
1MB空間のどこでも指せるのに、そこから64KBしかアクセスできないと来たもんだ
巨大配列はhuge配列にするしかなかった
しかもものすごく遅いし
32bitになってフラットモデルと聞いて小躍りしたよ
0036デフォルトの名無しさん
2010/04/12(月) 13:15:40おまえ凄い勘違いしてるぞ、far はただの修飾子だよ。
0037デフォルトの名無しさん
2010/04/12(月) 13:23:23遅いし、64KBを超える配列の場合オブジェクトサイズが2の冪乗に限定されるけど。
0038デフォルトの名無しさん
2010/04/12(月) 13:38:08far配列の事ではないかと
0039デフォルトの名無しさん
2010/04/12(月) 19:33:27HP-UX 11iV2とHP-UX 11iV3 とでfreadの返り値が変わるなんてこと有り得ますかね?
utmpx読み込んで接続元のip割り出してたら、下記while文で無限ループしてしまいました。
while(fread(&u, sizeof(struct utmpx), 1, fp)==1) {
延々と1が帰ってくるはず無いんだが…。
いやね、問題が起きてるの、11iv2なんだけどさ、
再現環境作りたいんだが、手元に11iv3しか無くてションボリ。
ご存知の方いらっしゃいましたら助けてください。
0040デフォルトの名無しさん
2010/04/12(月) 20:32:58fread()の戻り値は、読み込んだ要素数だから、この場合、fpのファイルの終端になると1より小さい値を返すと思う、うん
とりあえず、fread()について
HP-UX 11i v2 fread(3S)
http://docs.hp.com/ja/B2355-91076/fread.3S.html
HP-UX 11i v3 fread(3S)
http://docs.hp.com/ja/B2355-60129/fread.3S.html
若干変わったみたいだけど、それが原因とは思えない
もう一度、本当にそのwhileで無限ループになっているのか確認した方がいい
また、そのwhileで無限ループになったと判断した理由を教えてもらいたい
差し支えなければ、その行を含む前後のコード、または、コンパイル単位のソースコード、あるいは、そのソフトウェアの全ソースコードを見せてください
0041デフォルトの名無しさん
2010/04/12(月) 21:06:59せっかく返信くれたのに申し訳ないんだが、全部は見せれない。ごめん。
ip取得でループから抜け出せないのはなんとなく想定できてたんで、現地環境で
if (ut.ut_type!=USER_PROCESS) {の上の行にprintfはさんで、ループしてることを特定、
その後fread(&ut, sizeof(struct utmpx), 1, rp)==1をfread(&ut, sizeof(struct utmpx), 1, rp) != 0
に変更して再コンパイルし、正常稼動を確認。
PIDCheckはutmpxのpidが正しいものかチェックしている関数
うーん、永遠に1が帰ってきてるとも考えづらいんですけど、別の原因だとすると、==1 を!=0にしたことで現象が改善する理由が不思議なんですよ。
0042デフォルトの名無しさん
2010/04/12(月) 21:08:03{
FILE *rp;
struct utmpx ut;
rp = fopen(UTMPX_FILE, "rb");
if (fp == NULL) {
return 0;
}
memset(&ut, 0, sizeof(struct utmpx));
while(fread(&ut, sizeof(struct utmpx), 1, rp)==1) {
if (ut.ut_type!=USER_PROCESS) {
memset(&u, 0, sizeof(struct utmpx));
continue;
}
if (PIDCheck(ut.ut_pid) == 1) {
fclose(fp);
strcpy(IP,ut.ut_host);
return 1;
}
memset(&u, 0, sizeof(struct utmpx));
}
fclose(rp);
return 0;
}
0043デフォルトの名無しさん
2010/04/12(月) 23:03:11まず最初に準備するものを教えてください
0044デフォルトの名無しさん
2010/04/12(月) 23:04:540045デフォルトの名無しさん
2010/04/12(月) 23:05:020046デフォルトの名無しさん
2010/04/12(月) 23:20:02いろいろな角度から検証してみた、ってか、よくわからなくなってきた
気持ち悪いけど、とりあえず!=0で運用してください
[メモリ破壊](25%)
ぱっと見では、していないようだ
あるとしたら、fread(), fclose(), strcpy()だが、fread()以外はそのすぐ後でreturnしているので、whileの無限ループに関与する可能性は低い
fread()については後述、それにしても、memset()を呼び出す必要はあるのか
[マルチスレッド](0%)
スレッドを使っているかどうか分からないが、広域変数やstaticな変数が無いので関係ない
[fread()==1となる数値](25%)
size_tの宣言がどのようなものか知らないが、例えば
typedef unsigned long size_t;
の場合、fread()==1となるfread()の戻り値は、1以外にも存在する
だたし、sizeof(long)(32bitとか) < sizeof(long long)(64bitとか)とする
例えば、-9223372036854775807がそうだ
size_t s;
s = -9223372036854775807LL;
if ( s == 1 ) { /* true */ }
これで、fread()==1の説明が付くが、fread()!=0を偽にする数値と一致するわけが無い
(s == 1) && (s == 0)なんてことはありえない、『ありえないなんてことは、ありえない』か
[最適化の影響](40%)
アセンブリを出さないと分からないけど、最適化のしすぎで意図しないコードに化けた可能性はある
コンパイラのバグで、unsignedとsignedを論理比較していたとか
[ライブラリのバグ](5%)
fread()にバグがあってどうかなっている
[そもそもIPGET()を複数回呼ぶループがある](5%)
ループ付近の変数で破壊が起きている
0047デフォルトの名無しさん
2010/04/13(火) 00:13:32の u ってなに?
0048デフォルトの名無しさん
2010/04/13(火) 01:44:31rpとfpの違いも分からん
0049デフォルトの名無しさん
2010/04/13(火) 08:58:17ありがとうございます!助かります。
読ませていただいた感じ、[fread()==1となる数値](25%)
が該当するかも、という気がします。
とは言うのも、64bit pa-riscなんですよ。cpuが。
ちょっと見方を変えて、環境に依存してる問題で何か原因が無いか考えて見ます。
現地環境で返り値見れれば早いんですけどね…。
>47
すみません、それ、utです。
fpはrp。さすがにそのまんま乗せるのはちょっと問題あると思ったんで
変数名や関数名ところどころ変えました。
事情は察してください。
0050デフォルトの名無しさん
2010/04/13(火) 09:01:57あれこれ想像せず、読み込んだ内容を表示するとかして確認すれば?
0051デフォルトの名無しさん
2010/04/13(火) 11:51:460052デフォルトの名無しさん
2010/04/13(火) 16:17:560053デフォルトの名無しさん
2010/04/13(火) 16:24:37そういう不可思議な現象は99%コード領域が書きかえられてることが原因だよ
どっかの馬鹿がヘマして未初期化のポインタ使って何か書き込んでる
0054デフォルトの名無しさん
2010/04/13(火) 18:40:52それリタイヤ寸前のプログラマの発想だよ
0055デフォルトの名無しさん
2010/04/13(火) 21:35:49なんで、mainの戻り値をvoidにすると怒られるの?
コンパイラはgcc-4.3.4
0056デフォルトの名無しさん
2010/04/13(火) 21:39:200058デフォルトの名無しさん
2010/04/13(火) 21:55:150059デフォルトの名無しさん
2010/04/13(火) 21:58:54処理系依存。処理系が int main() 前提だったらそのように書くしかない。
main() といえども、スタートアップの呼び出しの前提には逆らえない。
0061デフォルトの名無しさん
2010/04/13(火) 22:40:25その本ちょっと欲しかったんだが値段が高くて手か出なかった
0062デフォルトの名無しさん
2010/04/14(水) 01:29:13C++ の仕様。 void にしたかったら main.c にしてみれば?
0063デフォルトの名無しさん
2010/04/14(水) 01:45:40C++でもvoid main()はありうる。
ありうるだけだけど。
0064デフォルトの名無しさん
2010/04/14(水) 02:03:12ないよ。
ISO C++ 3.6.1 p2
> This function shall not be overloaded. It shall have a return type of
> type int, but otherwise its type is implementation-defined.
http://www.kijineko.co.jp/tech/superstitions/void-main.html
> 一方、標準C++では、main の返却値の型は int でなければならないことが
> 明記されていますので、・・・
http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.3
> main() must return int. Not void, not bool, not float. int. Just int,
> nothing but int, only int.
0065デフォルトの名無しさん
2010/04/14(水) 05:15:08C++にもfreestanding環境があったと思うが。
0066デフォルトの名無しさん
2010/04/14(水) 05:50:040067デフォルトの名無しさん
2010/04/14(水) 08:20:23ISO C++では、otherwise its type is implementation-defined
と int でない可能性も含んでいますね。
0068デフォルトの名無しさん
2010/04/14(水) 08:43:52直訳すると
「それ( main 関数)は int の戻り値型を持たなければならない、がそれ以外は型を実装定義とする」
なわけで、この記述では戻り値型が int でない可能性を含んでいない。
0069デフォルトの名無しさん
2010/04/14(水) 09:01:150070デフォルトの名無しさん
2010/04/14(水) 09:30:29> This function shall not be overloaded. It shall have a return type of
> type int, but otherwise its type is implementation-defined.
直訳
> この関数は多重定義させることはない。その関数はint型の戻り値を持つことになるだろう、
> しかし、それ以外は、戻り値の型は実装者定義である。
意訳
> この関数は多重定義できない。その関数の戻り値はint型であるが、それ以外は、戻り値の型を実装者定義とする。
それ以外のそれってなんだよと思って、原文見ると
ISO/IEC 14882:2003(E)
3.6.1 Main function
2 An implementation shall not predefine the main function. This function shall not be overloaded. It shall
have a return type of type int, but otherwise its type is implementation-defined.
わぁお、とある実装の話かよ
詰まるところ、別の実装では、main()の戻り値は実装者定義としている
ってか、スレ違い
0071デフォルトの名無しさん
2010/04/14(水) 09:39:26C/C++の宿題片付けます 135代目
http://pc12.2ch.net/test/read.cgi/tech/1269438098/l50
ここでなぜか一通り議論されてる。
0072デフォルトの名無しさん
2010/04/14(水) 10:01:55"its type" が「戻り値の型」にねじまがっている。正しくは main の型。
0073デフォルトの名無しさん
2010/04/14(水) 10:08:000074デフォルトの名無しさん
2010/04/14(水) 11:12:10同じだろ
0075デフォルトの名無しさん
2010/04/14(水) 12:41:58に関しては必須で、それ以外は環境依存ということなので、
intにしててだめな事はないんじゃないの
0076デフォルトの名無しさん
2010/04/14(水) 12:52:15馬鹿は黙ってなさい
0077デフォルトの名無しさん
2010/04/14(水) 13:01:020078デフォルトの名無しさん
2010/04/14(水) 14:39:020079デフォルトの名無しさん
2010/04/14(水) 18:18:59当スレにおいてあなたたちは「役立たず」です
C++相談室 part79
http://pc12.2ch.net/test/read.cgi/tech/1268846738/
C++上級者が集まるスレ
http://pc12.2ch.net/test/read.cgi/tech/1095113801/
0080デフォルトの名無しさん
2010/04/14(水) 18:38:570081デフォルトの名無しさん
2010/04/14(水) 18:46:140082デフォルトの名無しさん
2010/04/14(水) 19:42:27「関数の戻り値の型」と「関数の型」は違うだろ。
0083デフォルトの名無しさん
2010/04/14(水) 19:54:40char second; /* 秒 */
char minute; /* 分 */
char hour; /* 時 */
char weekday; /* 曜日 */
char day; /* 日 */
char month; /* 月 */
char year; /* 年 */
};
static struct timeData time;
とするのと
timeData[7]として配列0?6までそれぞれ秒から年というふうに意味を
与える使い方どっちがいいですかね?あんまり後者のような使い方は
好ましくないのかな?
ちなみに実際時刻をセットする関数getTimeがchar型のポインタになってます。
getTime(&time.second)とするか
getTime(timeData)とするか
これをみると逆に配列にした方がいいのかなって気がします。
(getTime(&time.second)みないに構造体を配列みたいに使ってもいいのか?)
0084あきら
2010/04/14(水) 20:04:15送れません・・・・
strcpy(buf,"POST / HTTP/1.1\r\n");
strcat(buf,"Host: ");
strcat(buf,host);
strcat(buf,"\r\n");
strcat(buf,"Content-Length: 117\r\n");
strcat(buf,"Cookie: 0\r\n");
strcat(buf,"User-Agent: MSIE7.0\r\n");
strcat(buf,"REFERER: http://aqbb.net/bbs.aqbb.net/form/test?guid=on\r\n");
strcat(buf,"Connection: close\r\n");
strcat(buf,"\r\n");
strcat(buf,"title=ABFA");
strcat(buf,ses);
strcat(buf,"[email protected]&comment=ABFA&pass=1234&ses=");
strcat(buf,ses);
strcat(buf,"&cookie=&upfile=&id=test&mode=thread");
strcat(buf,"\r\n");
strcat(buf,"\r\n");
これでレンタルサーバーにアップしてある
PHPで作成した自分の掲示板に投稿しようと
思いましたが送信できていないみたいです。
どうすればいいですか?
0085デフォルトの名無しさん
2010/04/14(水) 20:05:55getTime(&timeData[6]);
getTime(&timeData[0]);
getTime(&time.second);
getTime(&time.year);
getTime(&timeData[TIME_YEAR]);
getTime(&timeData[TIME_SECOND]);
0086デフォルトの名無しさん
2010/04/14(水) 20:07:57送信できていないのか、送信したが投稿処理がうまくいかなかったのかを切り分ける作業は終わった?
0087デフォルトの名無しさん
2010/04/14(水) 20:17:35春休みで宿題がなくてひまだったんです。
0088デフォルトの名無しさん
2010/04/14(水) 20:18:51関数の型は関数の戻り値の型のことだから一緒では?いいかたが違うだけでは?
0089あきら
2010/04/14(水) 20:19:21切り分ける作業と言うとどんなのですか?
PHPで
if($_POST["mode"] != 'thread')
{
echo'ERROR!!';
exit();
}
というようにやっています。
sendで送信してからすぐにrecvで受信し
表示させたときにPHP側の
ERROR!!の文字が返ってきました。
0090デフォルトの名無しさん
2010/04/14(水) 20:30:03パケットがとんでるかどうか見れば良かったんだけど、PHPから返事もらってんだね。
なんでPHP側のログ見ないの?
0091デフォルトの名無しさん
2010/04/14(水) 20:31:38$_POSTの中身見てみたら?
0092デフォルトの名無しさん
2010/04/14(水) 20:32:09int main(void) という関数 main について、
関数の型は int (void) であり、関数の戻り値の型は int である。
typedef int ReturnType;
typedef ReturnType FunctionType(void);
FunctionType main;
0093あきら
2010/04/14(水) 20:32:49PHP側のログ?
レン鯖だからログとか見れないと思う・・・
ちなみに
GETで送信することはできました。
POSTにしたら送れなくなった・・・
0094デフォルトの名無しさん
2010/04/14(水) 20:36:21type
return type of type
と二つ書かれてるんだからそこを意識しなよって意図が見えませんかね
0095デフォルトの名無しさん
2010/04/14(水) 20:40:58sesって何桁なの
content lengthあってんのかね
0096あきら
2010/04/14(水) 20:43:305桁です。
titleにも付けてる理由は
タイトル重複規制してるからです。
0097デフォルトの名無しさん
2010/04/14(水) 20:45:180098デフォルトの名無しさん
2010/04/14(水) 21:04:50次の優先順位でお願いします。
(1)ubuntuに標準で入っているもの(glibcには入っていないですよね)
(2)ubuntuのパッケージとして入手可能なもの
(3)最近もメンテされているメジャーなライブラリ(CSTLよりメジャーなものがいいです)
0099デフォルトの名無しさん
2010/04/14(水) 21:07:38自分で作れ
0100デフォルトの名無しさん
2010/04/14(水) 21:39:01GNOME環境だったら、KDEでも入っていると思うけどGLibとか
GtkでGUIのアプリ作るときに良く使われるから覚えておいて損は無い
CSTLでも別にいいと思うけど、嫌なら自分で作れ、とマジで言いたくなる
0101デフォルトの名無しさん
2010/04/14(水) 22:52:11> GNOME環境だったら、KDEでも入っていると思うけどGLibとか
これ使えそう。ありがとう。
0102デフォルトの名無しさん
2010/04/14(水) 22:59:170103デフォルトの名無しさん
2010/04/14(水) 23:14:500104デフォルトの名無しさん
2010/04/14(水) 23:20:33たまたまある環境では動作してたに過ぎない可能性を疑いたまえ
0105あきら
2010/04/14(水) 23:20:49>>84
お願いします。。。
0106デフォルトの名無しさん
2010/04/14(水) 23:32:450107デフォルトの名無しさん
2010/04/14(水) 23:40:05お前がメモリーをハンダ付けした糞ハードウェアとかならあり得るかもな。
0108あきら
2010/04/15(木) 00:49:16あぁリファラから辿りましたね?
それは知り合いのサイトですよ。
私もPHP使えますけどCの方が好きです。
0109デフォルトの名無しさん
2010/04/15(木) 00:53:28sendしないと送れないだろ。
0111デフォルトの名無しさん
2010/04/15(木) 01:05:17bufの初めの方をガンガン上書きしてるけどいいの?
0112あきら
2010/04/15(木) 01:09:17strcatだから連結だと思うのですが・・・
0113デフォルトの名無しさん
2010/04/15(木) 02:59:070114デフォルトの名無しさん
2010/04/15(木) 03:02:490115デフォルトの名無しさん
2010/04/15(木) 03:08:35ありがとう。
0116デフォルトの名無しさん
2010/04/15(木) 06:14:10Content-Lengthの値は合ってるの?
Content-Typeは指定しなくていいの?
0117デフォルトの名無しさん
2010/04/15(木) 07:47:58c++ の STL でいいのでは?
0118デフォルトの名無しさん
2010/04/15(木) 07:54:31よくないから、質問しているんだろ
0119デフォルトの名無しさん
2010/04/15(木) 08:02:530120デフォルトの名無しさん
2010/04/15(木) 11:02:38ググってもなかなかでなかった そもそも質問はここでいいのかな;
PS3とかLinux動くのわかるんだけど=C言語で作られたものですかね?
一般にもわかるような物でC言語で動いてる!ってもの何かないでしょうか?
0121デフォルトの名無しさん
2010/04/15(木) 11:06:32まとめても意味無いと思うんで、たぶんまとめられていることは無いでしょう。
Linuxは間違いなくC言語で作られています。
他にはApacheあたりもCだったような気がします。
「一般にもわかる」というのがどういうことかよくわかりませんが。
0122デフォルトの名無しさん
2010/04/15(木) 11:07:26中を覗いてみろ。
1000万行を超えるのCソース
を拝むことができる筈
0123デフォルトの名無しさん
2010/04/15(木) 11:13:26Rubyやemacs
0124デフォルトの名無しさん
2010/04/15(木) 11:19:25C言語勉強し初めて、PC疎い友人に「それって何ができるの?」と聞かれて
Linuxと言ってもわからないだろうし それ以外の物を説明できなかったので…
具体例として「〜がC言語でできてる」って説明したかったのですが理解が足りなかった;
0125デフォルトの名無しさん
2010/04/15(木) 12:14:520126デフォルトの名無しさん
2010/04/15(木) 12:52:340127デフォルトの名無しさん
2010/04/15(木) 13:04:51日本語喋れないと帰化できないのと同じで、
プログラミング言語(或いは環境)を知らないと
プログラムを作ることができない。
何故Cかと言えば、それが普及しているから。
帰化のアナロジーなら国際会議での英語と同じ。
0128あきら
2010/04/15(木) 13:27:24だ・・・れ・・・か・・・頼む・・・・
0129デフォルトの名無しさん
2010/04/15(木) 13:33:58"POST / HTTP/1.1\r\n"
"Host: %s\r\n"
"Content-Length: 117\r\n"
"Cookie: 0\r\n"
"User-Agent: MSIE7.0\r\n"
"REFERER: http://aqbb.net/bbs.aqbb.net/form/test?guid=on\r\n"
"Connection: close\r\n"
"\r\n"
"title=ABFA%[email protected]&comment=ABFA&pass=1234&ses=%s"
"&cookie=&upfile=&id=test&mode=thread\r\n"
"\r\n",
host, ses, ses);
0130デフォルトの名無しさん
2010/04/15(木) 13:45:470131あきら
2010/04/15(木) 13:51:13ありがとう。。。
でも昨日それに編集して試したけど出来なかったんだ・・・
0132デフォルトの名無しさん
2010/04/15(木) 13:55:132進数 0000 0000 1000 0000
16進数 0 0 8 0
*/
if (value & 0x0080) {
/* すごく立ってる */
}
0133デフォルトの名無しさん
2010/04/15(木) 14:04:300134デフォルトの名無しさん
2010/04/15(木) 14:05:360135デフォルトの名無しさん
2010/04/15(木) 14:08:32bitを上から数えるか下から数えるか、0オリジンか1オリジンかはケースバイケース。
下から数えて0オリジンなら
if (unsigned_short_value & (1 << 8)) desired_process();
0136デフォルトの名無しさん
2010/04/15(木) 14:10:480137デフォルトの名無しさん
2010/04/15(木) 14:20:27>129は本質に関係ない文字列処理の指摘だけだろ。
で、PHPで受信した文字列を全部ダンプしてみた?
0138あきら
2010/04/15(木) 14:25:00if($_POST["mode"] != 'thread')
{
echo'ERROR!!';
}
else
{
/*受取った文字列表示*/
}
PHPだとこんな処理してるんだけど
recvで見てみると
「ERROR!!」が返ってくる・・・・
0139デフォルトの名無しさん
2010/04/15(木) 14:49:39つーか、Cに関係ないところで躓いているんだろ。WebProg板にでも行けば?
0140あきら
2010/04/15(木) 14:56:00HTTP/1.1 200 OK
Date: Thu, 15 Apr 2010 05:53:20 GMT
Server: Apache
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html
300
<html lang="ja">
<head>
<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"><link rel
="stylesheet" href="pc.css" type="text/css"><title>えらー</title>
</head>
<body text="black" bgcolor="white" alink="green" vlink="blue">
<table width="100%"><tr><td bgcolor="skyblue"><div align="center"><font color="b
lack">えらー</font></div></td></tr></table>
ERROR!!
<hr color="skyblue" width="70%" align="center">
<center>-<a href="admin">Aqua Board</a>-</center>
</body>
</html>
0
0141デフォルトの名無しさん
2010/04/15(木) 15:19:33>139の2行目。
0142デフォルトの名無しさん
2010/04/15(木) 15:21:04サーバがなぜそれを返したかはサーバの都合だからそっち調べたら
0143デフォルトの名無しさん
2010/04/15(木) 16:19:31int a [ 2 ] [ 2 ] = { { 1 , 2 } , { 3 , 4 } } ;
printf ( " %d / %d / %d / %d \n " , a [ 0 ] [ 0 ] , a [ 0 ] [ 1 ] , a [ 1 ] [ 0 ] , a [ 1 ] [ 1 ] ) ;
とした時に 1 / 2 / 3 / 4 となる理由が分かりません。
1 / 3 / 2 / 4 となるような気がするのですが・・・
それは何故かというと、BASICが確かそんな感じだったからです。
なぜBASICと異なるのでしょうか。
よろしくお願いいたします。
0144デフォルトの名無しさん
2010/04/15(木) 16:31:330145デフォルトの名無しさん
2010/04/15(木) 16:33:10>>91をスルーするから>>137にめぐってくるわけだ。
0146デフォルトの名無しさん
2010/04/15(木) 16:48:01BASIC は2次元配列だけど、
C言語の場合は2次元配列ではなく、配列の配列なんだよ。
その違いはある。
けど、君が問題にしてるのは初期化時の書式の話であり、
BASICでは定義時に初期化など行えなかったから、比較のしようがないと思うけどな。
具体的にBASICではどうだったのかを書いて欲しいな。
0147デフォルトの名無しさん
2010/04/15(木) 17:18:14> 具体的にBASICではどうだったのかを書いて欲しいな。
Basicの件は勘違いだったようです。
0148デフォルトの名無しさん
2010/04/15(木) 17:20:17BASICじゃなくってフォートランだったようです。
http://docs.hp.com/ja/B3909-90020/ch08s04.html
0149デフォルトの名無しさん
2010/04/15(木) 17:22:22同じ方が両方やるときにわかりやすいとは思うけど、
違ってても別にどうってことはないだろ
0150デフォルトの名無しさん
2010/04/15(木) 17:29:05Cには[]という演算子はあるから配列の配列は書けるが、そいつは厳密な意味での2次元配列じゃないってこった。
0151デフォルトの名無しさん
2010/04/15(木) 17:34:28CとFORTRANで配列データを受け渡しをするんであれば、
その違い留意する必要があるけど、そうでないのであれば問題ないはず。
FORTRAN にしてもCの方法では初期化できないよ。
君が何を問題にしているのかがよくわからんよ。
C言語は配列の配列なので、添字の順番は今のでないと成り立たない。
BASICやFORTRANは純粋に多次元配列なので、C言語の順でもよかったんだけど、
最初にそう決めたんだから、今更変わることもないだろう。
0152デフォルトの名無しさん
2010/04/15(木) 17:53:402
3 int main(void)
4 {
5
6 printf("%s\n", NULL);
7
8 return 0;
9 }
このプログラムがセグメンテーションエラーになるんですけどなぜでしょうか
0153デフォルトの名無しさん
2010/04/15(木) 17:55:43メモリの0番地をリードしようとするから
0154デフォルトの名無しさん
2010/04/15(木) 17:55:47やりたいのはCです。
0155デフォルトの名無しさん
2010/04/15(木) 17:58:170156デフォルトの名無しさん
2010/04/15(木) 17:59:15Visual C++ 2008 Express Edition
0157デフォルトの名無しさん
2010/04/15(木) 18:00:330158デフォルトの名無しさん
2010/04/15(木) 18:01:09初学者にはちょっと敷居が高いんじゃないか?
0159デフォルトの名無しさん
2010/04/15(木) 18:02:57慣れればVC++で良いけど。エディタはサクラエディタに慣れると他のが使いにくくなった
0160デフォルトの名無しさん
2010/04/15(木) 18:04:44NULLポインタを渡したら(null)みたいに表示されるものと勘違いしていました. 馬鹿でした
0161デフォルトの名無しさん
2010/04/15(木) 18:05:110162デフォルトの名無しさん
2010/04/15(木) 18:38:08まだ英語版しかない
0163デフォルトの名無しさん
2010/04/15(木) 20:02:52GPIO.F5 = ~GPIO.F5;の「= ~」ってどうゆう意味ですか?
よろしくお願いします
0164デフォルトの名無しさん
2010/04/15(木) 20:08:410165デフォルトの名無しさん
2010/04/15(木) 20:09:17~は論理否定の演算子なので、~GPIO.F5はF5ビットを反転した値になる。
それをGPIO.F5へ代入している。
つまり、F5ビットが今の状態から反転するってこと。
0166デフォルトの名無しさん
2010/04/15(木) 20:11:20有難うございました
0167デフォルトの名無しさん
2010/04/15(木) 20:55:49論理否定と言ったら「!」のことを指す
「~」はビット反転とかビット否定とか1の補数とか
0168デフォルトの名無しさん
2010/04/15(木) 21:04:300169デフォルトの名無しさん
2010/04/15(木) 21:38:480170デフォルトの名無しさん
2010/04/15(木) 21:46:090172デフォルトの名無しさん
2010/04/15(木) 22:04:540173デフォルトの名無しさん
2010/04/15(木) 22:07:530174デフォルトの名無しさん
2010/04/15(木) 22:19:040175デフォルトの名無しさん
2010/04/15(木) 22:19:340176デフォルトの名無しさん
2010/04/15(木) 22:21:230177デフォルトの名無しさん
2010/04/15(木) 22:28:460178デフォルトの名無しさん
2010/04/15(木) 22:34:390179デフォルトの名無しさん
2010/04/16(金) 00:13:520180デフォルトの名無しさん
2010/04/16(金) 00:16:000181デフォルトの名無しさん
2010/04/16(金) 00:18:540182デフォルトの名無しさん
2010/04/16(金) 00:37:46int func1();
int func2();
int main(){
cat(func, 1)(); // -> func1();
cat(func, 2)(); // -> func2();
return 0;
}
0183デフォルトの名無しさん
2010/04/16(金) 08:07:21「それ以外」というのは main() がint を返さない場合のことですよね。
すなわち main() の型が実装によっていろいろかわることも許容しているではないでしょうか?
0184デフォルトの名無しさん
2010/04/16(金) 08:12:22main 関数の型を構成する要素(>>73,92参照)のうち、まず戻り値の型は int であるとし、
それ以外の要素について(つまり引数リストの型などについて)は実装依存であるということ。
0185デフォルトの名無しさん
2010/04/16(金) 12:31:24そうなんだ。
どうもありがとうございます。
では #defineの#は何ですか?
0186デフォルトの名無しさん
2010/04/16(金) 13:02:280187デフォルトの名無しさん
2010/04/16(金) 18:50:00#defineの#はディレクティブといふ。
C言語のソースファイルのコードはそのままコンパイラに食わせる訳じゃなくて、
プリプロセスという課程を経てプリプロセッサが吐き出したコードをコンパイラに食わせている。
プリプロセッサに命令を与える(認識させる)文字がディレクティブ(#)。
注意しなきゃいけないのは、マクロ中の#と先頭に付いている#は全く別であるということだ。
ディレクティブとしての#は先頭に付いている。
例えば一番簡単な例が
#include"xxxx.h"
#includeはプリプロセッサにxxxx.hっていうヘッダファイルを読み込んで、
それそのものをコピペする
もし君がgccを使用しているならgcc -Eでコンパイルしてみるといい。
プリプロセス済みのソースコードが画面に吐き出されるハズだ。
命令には以下のようなものがある。
#include,#define,#if(#ifdef)+#else+#endif
#ifの条件判定には式を、#ifdefの場合は予め定義の何かを使う場合が多い。
後他に#pragmaってのがあるがこれは俺は使ったことが無いので分からない。
0188デフォルトの名無しさん
2010/04/16(金) 18:56:09文字リテラル化する奴だな
#define foo(arg) #arg
foo(hogehoge) → "hogehoge"
0189デフォルトの名無しさん
2010/04/16(金) 19:01:34コード、コンパイラ、プリプロセッサ、ヘンダファイルってなんですか?
ディレクティブってエクスプローラーで見た時のフォルダのことですよね、それはわかります。
でもC言語との関係がわかりません。
gccでなくpcを使ってます、osはもちろんwindowsです。ですから試せません。
すみませんがよろしくお願いします。
0190デフォルトの名無しさん
2010/04/16(金) 19:03:21ありがとうございます。
0191デフォルトの名無しさん
2010/04/16(金) 19:35:28,.――――-、
ヽ / ̄ ̄ ̄`ヽ、 勇者トンファーパーマン惨状
| | (・)。(・)|
| |@_,.--、_,> 俺が着たからにはもう色々と駄目だ
ヽヽ___ノ
/:::::::::::::::::l /77
/::::::::::i:i:::::::i,../ / |
l:::/::::::::i:i:::、:::/ / |
l;;ノ:::::::::::::::l l;.,.,.! |
/::::::::::::::::l/ / 冂
/:::::::;へ:::::::l~ |ヌ|
/:::::/´ ヽ:::l .|ヌ|
.〔:::::l l:::l 凵
ヽ;;;> \;;>
0192デフォルトの名無しさん
2010/04/16(金) 20:06:080193デフォルトの名無しさん
2010/04/16(金) 20:29:35int main(void)
{
long i=0;
for (i=1;i>=0xFFFFFFFFFFFFFFF;i++){}
return 0;
}
(8) : error C2143: 構文エラー : ';' が '型' の前にありません。
(9) : error C2065: 'i' : 定義されていない識別子です。
(9) : error C2065: 'i' : 定義されていない識別子です。
(9) : error C2065: 'i' : 定義されていない識別子です。
どこがおかしいのか分かりません
たすけてくだしあ
0194193
2010/04/16(金) 20:33:11(8)は4行目です
0195デフォルトの名無しさん
2010/04/16(金) 20:55:01普通に動いたよ。
long int じゃないとだめとかかな?
0196デフォルトの名無しさん
2010/04/16(金) 20:59:20うちのGCCはWARNINGは出るがコンパイル自体は通ってる。
環境に何か問題あるんじゃまいか。
他にエラーとか、警告とか出てないのか?
0197デフォルトの名無しさん
2010/04/16(金) 21:17:41うちのコンパイラでもエラーはでないな。
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
06.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:06.exe
06.obj
0198デフォルトの名無しさん
2010/04/16(金) 21:19:18otherwise を「引数リストの型などについて」の意味と解釈した理由を教えていただけませんか?
0199デフォルトの名無しさん
2010/04/16(金) 21:27:17{
/* 行番号から、ここに何かあると予想 */
long i=0;
0200デフォルトの名無しさん
2010/04/16(金) 21:43:23(5) : error C2143: 構文エラー : ';' が '型' の前にありません。
(6) : error C2065: 'i' : 定義されていない識別子です。
(6) : error C2065: 'i' : 定義されていない識別子です。
(6) : error C2065: 'i' : 定義されていない識別子です。
こうならできたけどなぁ
0201デフォルトの名無しさん
2010/04/16(金) 21:48:36ほう、ディレクティブっていうのか。
10年C使ってて初めて知ったぜ
0202デフォルトの名無しさん
2010/04/16(金) 21:55:43何で最初に
(4) : error C3872: '0x3000': この文字を識別子で使用することはできません
これを書かなかったんだ……
何処かに全角文字使ってる。
多分long i=0;の辺り
0203デフォルトの名無しさん
2010/04/16(金) 22:03:404-7行目あたりに、他のコード(そこだけなら動く)があるんじゃないか?
で、今度は、それを消した時に、全角文字が残って、
違うエラーがでたんじゃないのか?
0204デフォルトの名無しさん
2010/04/16(金) 22:06:28まぎらわしくてすまん。
同じメッセージを出したくて、つい。
0205デフォルトの名無しさん
2010/04/16(金) 22:18:35全角文字がある可能性もあるし、人間には見えない文字が紛れ込んでいる可能性だってある。
或いはコンパイラが賢すぎてfor内の条件が1度も満たされない事に気付いてexeを生成するのを拒否してるのかもしれん。
0206デフォルトの名無しさん
2010/04/16(金) 22:22:09同じメッセージを出したいなら、こんな感じ。
#include <stdio.h>
int main(void)
{
char buf[] = "Hello, world!";
printf( "%s\n", buf );
long j=0;
for (i=1;i>=0xFFFFFFFFFFFFFFF;i++){}
return 0;
}
0207193
2010/04/16(金) 22:22:49再起動したら直りました
0208デフォルトの名無しさん
2010/04/16(金) 22:25:02long j=0; // ×
long i=0; // ○
0209デフォルトの名無しさん
2010/04/16(金) 22:29:16ああ、その手があったかw
0210デフォルトの名無しさん
2010/04/16(金) 22:30:27んなアホな…
0211デフォルトの名無しさん
2010/04/17(土) 13:17:06> 後他に#pragmaってのがあるがこれは俺は使ったことが無いので分からない。
これは何ですか?
0212デフォルトの名無しさん
2010/04/17(土) 13:19:250213デフォルトの名無しさん
2010/04/17(土) 23:47:08とりあえずここまで作ったのですが…
#include <stdio.h>
int main(void) {
int x[9][2] = {
{ 10000, 0 },{ 5000, 0 },{ 1000, 0 },{ 500, 0 },{ 50, 0 },{ 10, 0 },{ 5, 0 },{ 1, 0 }
} ;
int n,k ;
printf("6桁の数字を入力してください \n");
scanf("%d",&n);
printf("%d円は \n",n);
for( k=0 ; k<9 ; k++ ){
x[k][1] = n/x[k][0] ;
n = n%x[k][0] ;
}
for( k=0 ; k<3 ; k++ ){
printf("%d円札は%d枚 \n", x[k][0],x[k][1] );
}
for( k=3 ; k<9 ; k++ ){
printf("%d円玉は%d枚 \n", x[k][0],x[k][1] );
}
return 0;
}
0214デフォルトの名無しさん
2010/04/17(土) 23:50:540215デフォルトの名無しさん
2010/04/17(土) 23:57:42っ {100, 0},
0216デフォルトの名無しさん
2010/04/18(日) 00:02:44つ k<8
0217デフォルトの名無しさん
2010/04/18(日) 00:07:22その結果0で割ってるためにエラー。
0218デフォルトの名無しさん
2010/04/18(日) 00:12:54なんか中途半端なかんじなんだよね
0219デフォルトの名無しさん
2010/04/18(日) 00:14:15unsigned long num;
unsigned char a, b, c, d, e, f, g, h, i;
num = strtoul(argv[1], NULL, 0);
a = num / 10000;
num %= 10000;
b = num / 5000;
num %= 5000;
c = num / 2000;
num %= 2000;
d = num / 1000;
num %= 1000;
e = num / 500;
num %= 500;
f = num / 100;
num %= 100;
g = num / 50;
num %= 50;
h = num / 10;
num %= 10;
i = num / 5;
num %= 5;
fprintf(stdout, "%2u%2u%2u%2u%2u%2u%2u%2u%2u%2u", a, b, c, d, e, f, g, h, i, num);
return EXIT_SUCCESS;
}
0220デフォルトの名無しさん
2010/04/18(日) 00:14:24侮れんものがあるぞ?
0221デフォルトの名無しさん
2010/04/18(日) 00:14:38無理して使わなくてもいいのにw
0222デフォルトの名無しさん
2010/04/18(日) 00:14:490223デフォルトの名無しさん
2010/04/18(日) 00:16:290224デフォルトの名無しさん
2010/04/18(日) 00:19:580225デフォルトの名無しさん
2010/04/18(日) 00:20:31MASMなんかの繰り返し展開マクロ同等の機能がプリプロセッサに欲しいことがある
gcc はプリプロセッサ段で可変引数使えるんだっけ?
0226デフォルトの名無しさん
2010/04/18(日) 00:27:280227デフォルトの名無しさん
2010/04/18(日) 00:29:09CRC32 を C からアセンブリ言語に直しても 20% くらいしか速度は改善されなかった記憶が。
昨今のハードの進展を考えるとアセンブリのソースは保守性が悪すぎる。
マジレス失礼。
0228デフォルトの名無しさん
2010/04/18(日) 00:29:36それはCコンパイラに限ったこと?
他のコンパイラでも同じ事がいえるのなら特段Cのアドバンテージではないね
0229デフォルトの名無しさん
2010/04/18(日) 00:30:07確かに C で書く必然性はないわけで、お好きなように。
0230213
2010/04/18(日) 00:30:46まさか100円を忘れていたとは…
もっと注意して確認したいと思います
0231デフォルトの名無しさん
2010/04/18(日) 00:32:47べっべつにあんたの為なんかじゃないんだからねっ
0232デフォルトの名無しさん
2010/04/18(日) 00:42:23Cに限ったことじゃないが、Cは歴史が長いだけに最適化もすさまじい。
0233デフォルトの名無しさん
2010/04/18(日) 00:46:44一番すごいの?
それならちょっと嬉しい
0234デフォルトの名無しさん
2010/04/18(日) 00:58:010235デフォルトの名無しさん
2010/04/18(日) 01:30:000236デフォルトの名無しさん
2010/04/18(日) 01:39:28一番ってこたあないかもしれないけど、
現実をみて考えると相当なものがあるだろう。
C言語では微妙に不便を強いられる分、
ちゃんと見返りもあるんだねぇ
0237デフォルトの名無しさん
2010/04/18(日) 07:56:41ソートなどはC++に敵わない罠
0238デフォルトの名無しさん
2010/04/18(日) 07:59:270239デフォルトの名無しさん
2010/04/18(日) 11:04:46あの変態文法で涙出そうになったけど。
ただC言語でもコンパイラ拡張でinlineを受け付けるものも
あるらしいから、それなら何とか・・・。
0240デフォルトの名無しさん
2010/04/18(日) 13:20:010241デフォルトの名無しさん
2010/04/18(日) 13:26:10qsortがインライン化されていないこともあるが、基本的なデータ構造を扱う関数群がないとか欠陥が多すぎ。
俺queueとか、my_listとかどんだけ無駄に再生産されてるんだよ。
Cのコミュニティーは本当に無能しかいない。
0242デフォルトの名無しさん
2010/04/18(日) 13:41:47ないとコレクション関係はつかえねーな。
0243デフォルトの名無しさん
2010/04/18(日) 13:56:20まあ、普通は void* でなんとかするんだろうけど
0244デフォルトの名無しさん
2010/04/18(日) 15:40:04void * で書くのは間接呼び出しが発生して効率が落ちる。
0245デフォルトの名無しさん
2010/04/18(日) 18:08:460246デフォルトの名無しさん
2010/04/18(日) 18:23:10笑ってしまった
0247デフォルトの名無しさん
2010/04/18(日) 19:50:180248デフォルトの名無しさん
2010/04/18(日) 22:36:22> Cの仕様の範囲内でqsortの比較の最適化を期待するにはinlineしかないだろ
inlineはCの仕様じゃないって知らないのかお前はwwwwww
0249デフォルトの名無しさん
2010/04/18(日) 22:50:15これはなんですか?釣りでもなく本当にわかりません・・・。
0250デフォルトの名無しさん
2010/04/18(日) 23:05:09「C99 inline」でググるんだ。
0251デフォルトの名無しさん
2010/04/18(日) 23:08:24inlineってC++からの輸入じゃね?
0252デフォルトの名無しさん
2010/04/18(日) 23:11:41インライン関数。
インライン関数とは、凄く簡単に説明すると
void func(void){
printf("test\n");
}
int main(int argc,char** argv){
func();
return 0;
}
↑のようなフザケタコードをコンパイラが
スマートに書き換える機能で、↑の糞コードのような場合
int main(int argc,char** argv){
printf("test\n");
return 0;
}
みたいな感じに書き直してくれる。
0253デフォルトの名無しさん
2010/04/18(日) 23:12:240255デフォルトの名無しさん
2010/04/18(日) 23:21:55gccは特にinlineを無視する確率高いよね
0256デフォルトの名無しさん
2010/04/18(日) 23:26:240257デフォルトの名無しさん
2010/04/18(日) 23:28:44しかしそのコンパイラを作っているのは人間である。
0258デフォルトの名無しさん
2010/04/18(日) 23:30:350259デフォルトの名無しさん
2010/04/18(日) 23:30:47ゲームの人工知能と同じ
0260デフォルトの名無しさん
2010/04/18(日) 23:48:54こんな関数までインライン展開すんのかってびっくりした。
0261デフォルトの名無しさん
2010/04/19(月) 01:36:210262デフォルトの名無しさん
2010/04/19(月) 01:37:10ありがとうございます!
もうちょっと自分で調べて勉強してきます。
0263デフォルトの名無しさん
2010/04/19(月) 02:15:31同じ人間と思うなよ
コンパイラ作ってるやつは底辺プログラマーよりずっと優秀なんだから
0264デフォルトの名無しさん
2010/04/19(月) 02:43:42あいつらは宇宙人だから。
おっと、宇宙人と言ってもルーピーは第9地区行きだからな。
0265デフォルトの名無しさん
2010/04/19(月) 19:17:540266デフォルトの名無しさん
2010/04/19(月) 19:19:54inlineは同じ翻訳単位内に書かれないといけないので
inline書かずに同じ事しようと思うと
staticにしないといけなくなるぜ
0267デフォルトの名無しさん
2010/04/19(月) 22:23:520268デフォルトの名無しさん
2010/04/19(月) 22:51:57dataに格納するにはどうしたらいいですか
目的としてはhtmlのタグ取って特定のタグで囲まれてる文字列を抜き出したいんです
0269デフォルトの名無しさん
2010/04/19(月) 22:56:08sprintf(data, "%.*s", end-start, start);
0270デフォルトの名無しさん
2010/04/19(月) 23:37:48それっぽいのができました、どうも
fprintfでやったらポインタじゃダメだって怒られたのに、
sprintfだとできるのね
0271デフォルトの名無しさん
2010/04/19(月) 23:42:42俺だったら正規表現が使える言語に逃げちゃいそうw
0272デフォルトの名無しさん
2010/04/19(月) 23:46:050273デフォルトの名無しさん
2010/04/20(火) 00:41:09> fprintfでやったらポインタじゃダメだって怒られたのに、
ここら辺が特に理解できない
0274デフォルトの名無しさん
2010/04/20(火) 00:48:12な感じでやってみたら、
3番目のargumentはポインタじゃincompatibleだぜ
ってエラーが出た
0275デフォルトの名無しさん
2010/04/20(火) 01:47:172番目の引数ありえんワロス
ってエラーが出ないか?
0276デフォルトの名無しさん
2010/04/20(火) 02:42:10#include <string.h>
int main( void )
{
char source[256];
char value[256];
int i,j, k = 0;
strcpy( source, "<name>2ch C言語スレ</name>" );
/* ヌル文字まで走査を続ける */
for( i = 0; i < 256 || source[i] != '\0'; i++ ) {
/* 開始タグを検出 => 次の文字が「/」ではない */
if( source[i] == '<' && source[i+1] != '/' ) {
/* 「>」が検出されるまで1文字ずつ調べる */
for( j = ++i; source[j] != '>'; j++ );
i = j;
}
/* 終了タグ検出 => 「<」の次が「/」*/
else if( source[i] == '<' && source[i+1] == '/' ) {
/*それ以上操作する必要がないのでループを抜ける */
break;
} else {
/* 終了タグが検出されるまで、結果保存用配列へ1文字ずつ格納 */
value[k++] = source[i];
}
}
/* ヌル文字挿入(文字列として成立させる為) */
value[k] = '\0';
printf( "対象文字列:%s\n", source );
printf( "抽出文字列:%s\n", value );
return 0;
}
0277デフォルトの名無しさん
2010/04/20(火) 02:43:050278デフォルトの名無しさん
2010/04/20(火) 11:17:59#include<stdio.h>
#include<string.h>
int main(void)
{
char source[256];
char value[256]="";
char *p, *q;
strcpy(source, "<name>2ch C言語スレ</name>dummy string<br><br>");
strcpy(value, source);
for(p=value;(p=strchr(p, '<'));)
{
q=strchr(p+1, '>');
if(q==NULL) break;
memmove(p, q+1, strlen(q+1)+1);
}
printf( "対象文字列:%s\n", source );
printf( "抽出文字列:%s\n", value );
return 0;
}
0279デフォルトの名無しさん
2010/04/20(火) 11:32:01#include<stdio.h>
#include<string.h>
int main(void)
{
char source[256];
char value[256]="";
char *start, *end, *dest=value;
strcpy(source, "hello<name>2ch C言語スレ</name>dummy string<br><br>");
for(start=source;(end=strchr(start, '<'));)
{
dest+=sprintf(dest, "%.*s", end-start, start);
start=strchr(end+1, '>');
if(start==NULL) break;
start+=1;
}
if(start) sprintf(dest, "%s", start);
printf( "対象文字列:%s\n", source );
printf( "抽出文字列:%s\n", value );
return 0;
}
0280デフォルトの名無しさん
2010/04/20(火) 18:45:20ポインタを応用してヘッダファイルとソースファイル2つ使うらしい
簡単な足し算みたいなんだけどわからん
0281デフォルトの名無しさん
2010/04/20(火) 19:07:02わかるよ
0282デフォルトの名無しさん
2010/04/20(火) 19:43:260283デフォルトの名無しさん
2010/04/20(火) 20:24:07日本語でおk
0284デフォルトの名無しさん
2010/04/21(水) 00:31:15これの表示するフォントを変えたいと思うのですが僕にはレベルが高すぎでした ゲームの中文化ランチャーで少々いじると日本語化できるようになります。どこでフォントを指定しているのでしょうか。解析お願いします。
0285デフォルトの名無しさん
2010/04/21(水) 13:45:260286デフォルトの名無しさん
2010/04/21(水) 18:57:30標準関数とWinsckを使いプログラミングできるようになしました。
この次の段階としてはどのような学習をすればいいでしょうか?
ゲームなどは作るつもりありません。
私がやりたいことは画像処理(OCR系の画像解析)や
ネットワーク通信(自分パソコンと友達のパソコンで通信するよなの)を
作りたいと思ってます。
ネットワーク通信はWinsockをもっと勉強すればいいかな?と思いますが、
画像処理などはどうなんでしょう?
0287デフォルトの名無しさん
2010/04/21(水) 19:03:55パソコン通信()
0288デフォルトの名無しさん
2010/04/21(水) 19:11:25とりあえずぐぐってみた?
ある程度それで概要をつかむほうがいいと思う
0289デフォルトの名無しさん
2010/04/21(水) 19:11:43パソコン通信ですか・・・
それはWinsockとは違うのですか?
0290デフォルトの名無しさん
2010/04/21(水) 19:14:04>ネットワーク通信はWinsockをもっと勉強すればいいかな?
Winsockの基本さえわかれば、
(自分パソコンと友達のパソコンで通信)程度なら作れるはずだよ。
作ればいいだけ。
>画像処理などはどうなんでしょう?
特に何も必要でないよ。すぐに作ればいいんじゃない。
OCRなら大した知識などなくてもすぐに作れるよ。
少しぐらいは自分の頭で考えようよ。
0291デフォルトの名無しさん
2010/04/21(水) 19:16:00> OCRなら大した知識などなくてもすぐに作れるよ。
OCRがすぐ作れるって?
お前すごすぎだろ
> 少しぐらいは自分の頭で考えようよ。
それはまあごもっとも。
0292デフォルトの名無しさん
2010/04/21(水) 19:21:00ありがとうございます。
OCRって簡単なんですか・・・
頑張って作ってみます。
0293デフォルトの名無しさん
2010/04/21(水) 19:28:46OCRって言ってもピンきりだろ。そりゃ製品レベルは無理に決まってる。
けど、例えば数字に限定したものとか、
ベクターでなくビットマップベースにするとか、
そういう限定があればすぐに作れるだろ。
最初はそれでいいんだし、そこから改良を加えていけば幾らでも認識率は高くできる。
0294デフォルトの名無しさん
2010/04/21(水) 19:33:06jpgファイルとかで最初は英数字だけの解析をしたいのです・・・
なにを勉強すればいいですか?
ホントに入門書上がりで最近やっとWinsockでFTPやPOP、HTTP通信が
できるようになってきたひよっこです・・・
0295デフォルトの名無しさん
2010/04/21(水) 19:46:54高級なことをしたいならウェーブレット変換とかで特徴抽出できる
簡単にやりたいならOpenCVでできる、まぁ原理が知りたければSIFTとかSURFとかの論文読めばいいよ
SIFTとか特許があるから気を付けてね
ネットワーク関係は専門じゃないので詳しくは知らない
トランスポート層しか扱ったこと無いので、詳しくは他の人頼む
0296デフォルトの名無しさん
2010/04/21(水) 20:29:38ビットマップは単純だからビットマップからはじめると良い。
ビットマップ画像を読みこんで白黒化して出力するツールをつくれ
0297デフォルトの名無しさん
2010/04/21(水) 20:44:16ありがとうございます。
論文って苦手なんですけど、
やっぱり避けて通れないのですね・・・
>>296
わかりました。
ビットマップ画像から作成してみます。
ライブラリはDXでいいですよね?
0298デフォルトの名無しさん
2010/04/21(水) 21:08:040299デフォルトの名無しさん
2010/04/21(水) 21:15:200300デフォルトの名無しさん
2010/04/21(水) 21:17:00画像処理アルゴリズムとかそのものずばりの本もあるし。
学校行っていないのならデジタル画像処理とかの資格試験勉強すればいいんで内科医?
0301デフォルトの名無しさん
2010/04/21(水) 21:19:16自信あるなら2級当たりから始めるといいかもシレン
3級は基礎知識だから名
0302デフォルトの名無しさん
2010/04/21(水) 22:59:49基本情報技術者なら午後の選択C言語で取りました。
19年度の春試験。
0303デフォルトの名無しさん
2010/04/21(水) 23:07:25でもずばり jpg を説明した書籍となるといいのがみつからないなあ。
http://www.amazon.co.jp/dp/4797330457
これの第一版はもっている、もっているだけやけど。
0304デフォルトの名無しさん
2010/04/21(水) 23:43:40俺はその本でJPEGのエンコード・デコードは実装できたなー。
DCTとか概念的なところは「これならわかる!応用数学教室」(だっけ?)が分かりやすかった。
0305デフォルトの名無しさん
2010/04/22(木) 00:10:14#include <string.h>
#include <locale.h>
#include <stdlib.h>
#include <wchar.h>
main(){
wchar_t kana[] = L"あいうえおかきくけこ";//---1
setlocale(LC_ALL, "");
printf("kana::%ls\n", kana);
printf("kana[2]::%lc\n", kana[2]);
wchar_t wbuf[81], *p1;//----------------------2
printf("enter wide_byte character::\n");
fgetws(wbuf, sizeof wbuf, stdin);
if((p1 = wcschr(wbuf, '\n')) != NULL)
*p1 = L'\0';
setlocale(LC_ALL, "");
printf("wbuf_no_naiyou::\n");
printf("%ls\n", wbuf);
printf("wbuf[2]::%lc\n", wbuf[2]);
return 0;
}
0306305
2010/04/22(木) 00:12:581既存のワイド文字列へのアクセス
ができたので、
2ワイド文字列の入力を受けてその要素へのアクセス
をしようとしたのですが、fgetwsに1byte文字を入力したときはうまくいくのに、
ワイド文字を入力するとfgetwsのエコーバックが見えるところで止まってしまいます。
どうしたらいいでしょう?みかか変換プログラムを書いてみようと思ったのです。
0307デフォルトの名無しさん
2010/04/22(木) 00:23:25CG-ARTS協会|2010CG検定
http://www.cgarts.or.jp/kentei/about/img_engineer/index.html
これを3級から始めれば高校生程度の学力から初めても大丈夫
0308デフォルトの名無しさん
2010/04/22(木) 00:28:06cじゃなくてrubyでやったら?
Cじゃなきゃいけない理由って何?
0309デフォルトの名無しさん
2010/04/22(木) 00:28:360310デフォルトの名無しさん
2010/04/22(木) 00:29:17ライブラリ使うんなら別にどの形式からでもいいよ
ファイルフォーマットを知る必要もたいしてなかろ
0311デフォルトの名無しさん
2010/04/22(木) 00:37:410312デフォルトの名無しさん
2010/04/22(木) 01:06:510313デフォルトの名無しさん
2010/04/23(金) 08:37:56Microsoftでやったら?
bccじゃなきゃいけない理由って何?
0314デフォルトの名無しさん
2010/04/23(金) 14:25:37charならバイト数だと思うのですが、intはバイト数が決まってたと思うのですが
作りたい数までの各番号に対応したintを取り出したいのです
0315デフォルトの名無しさん
2010/04/23(金) 15:03:35お前がいうところの2次元配列ってなんだ?
世間では要素が n 個の配列(1次元配列)は hoge[n] であり、
要素が n x m 個の配列(2次元配列)を hoge[n][m] で表す。
1次元で足りるなら1次元配列を使え。
0316デフォルトの名無しさん
2010/04/23(金) 15:03:440317デフォルトの名無しさん
2010/04/23(金) 15:05:53そういう使い方を全然知りませんでした。ありがとうございました
0318デフォルトの名無しさん
2010/04/23(金) 15:06:33int hoge[3]; はintが3個並んでる。
int hoge[3][4]; はintが4個並んだものが3個並んでる。
hoge[0][0], hoge[0][1], hoge[0][2], hoge[0][3], hoge[1][0], hoge[1][1], ... の順で。
intのバイト数は規格で固定されてはいない。
実際にコンパイルする時にその環境で何バイトになるのかはそりゃ決まってるけど。
今はPCの環境だとほとんど4バイト。
0319デフォルトの名無しさん
2010/04/23(金) 15:16:51それはたぶん文字列の配列を作ろうとしていたんじゃないかな。
0320デフォルトの名無しさん
2010/04/23(金) 18:05:22手順としては、暗号化された文字列を入力して1つずつ文字列をずらして
26通りの文字列を出力するプログラムです。
#include<stdio.h>
int main(void)
{
char ang[8]; //今回は最大8文字の文字列
int i,j;
for(i=0;i<26;i++){
for(j=0;j<8;j++){
printf("%c",ang[j]+i);
}
}
初めはASCIIコードのZとaが繋がっているものと思いこう組んだら
Zの後には記号が入っていて詰まってしまいました。
A-Zまでの配列を作ってその中で回す、とかASCIIコードでもZの次をAにする
とか色々考えましたが、どうしていいのかが分からないです…。
ご指導お願いします。
0321デフォルトの名無しさん
2010/04/23(金) 18:10:440322デフォルトの名無しさん
2010/04/23(金) 18:28:17isalpha()
0323デフォルトの名無しさん
2010/04/23(金) 18:37:27本題とは関係ないが、
>char ang[8]; //今回は最大8文字の文字列
ang[8]だと最大7文字の文字列な
0324デフォルトの名無しさん
2010/04/23(金) 18:41:29それにprintf("%c",ang[j]+i);だから、NULは必要としていないと読める
0325デフォルトの名無しさん
2010/04/23(金) 18:50:38C言語の入門書とかに書いてるような小さいサンプルコードだと
全然難しくなくて何が難しいのかわからなかった。
ポインタってなんかむずかしい部分あるの?
0326デフォルトの名無しさん
2010/04/23(金) 18:51:260327デフォルトの名無しさん
2010/04/23(金) 18:53:34慣れればどうってことはない。
0328デフォルトの名無しさん
2010/04/23(金) 19:00:50入門編が難しいはずない。
0329デフォルトの名無しさん
2010/04/23(金) 19:04:05自分がポインタを理解していないことに気づくもの。
0330デフォルトの名無しさん
2010/04/23(金) 19:07:33人によるんじゃない?
俺は関数ポインタの理解が遅かったけど、いざ理解したらなにが難しかったのか分からなくなったな
0331デフォルトの名無しさん
2010/04/23(金) 19:11:030332デフォルトの名無しさん
2010/04/23(金) 19:12:480333デフォルトの名無しさん
2010/04/23(金) 19:13:210334デフォルトの名無しさん
2010/04/23(金) 19:20:08ある配列の実要素が ポインタである(ポインタ配列)場合 配列である(2次元配列)場合
各それぞれで、記憶領域の配置が本質的に違うのに理解できるまでの敷居が高い。
既に書かれている記述を読むのは可能でも
やりたいことを実装するのに、どちらが適切かを選択できるか がキーポイント
0335デフォルトの名無しさん
2010/04/23(金) 19:21:540336デフォルトの名無しさん
2010/04/23(金) 19:24:36□□□□□□□□□
□□□□□□□□□
□□□□□□□□□
□□□□□□□□□
□□□□□□□□□
こんな感じで
配列の実要素がポインタってのは
□→□□□□□□□□□
□→□□□□□□□□□
□→□□□□□□□□□
□→□□□□□□□□□
□→□□□□□□□□□
こういうこと?
0337デフォルトの名無しさん
2010/04/23(金) 19:30:14おおよそ yes
指している先がどれだけの大きさの器があるか未確定 & ほとんど知る術は無い
(さらに、不正な場所を指している可能性もあるん)
□→□□□□
□→□□□□□□□
□→□
□→ぬるぽ!
□→鼻から悪魔
こういうことがあり得る
0338デフォルトの名無しさん
2010/04/23(金) 19:34:43割った余りで考えるという思考がありませんでした…。
ありがとうございました!
>>322
真偽でif文作るってのがあるのを知りませんでした。
勉強になりました!
0339デフォルトの名無しさん
2010/04/23(金) 21:27:13これ関数ポインタ?
DLLの関数を動的に呼ぶときに、
GetProcAdress()で関数ポインタ取ってくるくらいしか使い道が分からん。
0340デフォルトの名無しさん
2010/04/23(金) 21:38:280341デフォルトの名無しさん
2010/04/23(金) 22:14:53引数を取らず引数を取らずintを返す関数へのポインタを返す関数へのポインタを取り、
引数を取らずintを返す関数へのポインタを取りintを返す関数へのポインタを返す関数
へのポインタだね。
0342デフォルトの名無しさん
2010/04/23(金) 22:27:420343デフォルトの名無しさん
2010/04/23(金) 22:35:090344デフォルトの名無しさん
2010/04/23(金) 23:21:31番号と名前がランダムに記入されたテキストを読み込んで、数字と名前に分けて配列に格納し、番号昇り順で並べかえてテキストファイルで出力したいのですが
並べかえがうまくいきません
とりあえず作ってみたのですが…
アドバイスください
0345デフォルトの名無しさん
2010/04/23(金) 23:26:57tmp はいらない
ソートができていない
ソートが終わってから出力すればいい
誰かに写させてもらったの?
0346344
2010/04/23(金) 23:33:000347デフォルトの名無しさん
2010/04/23(金) 23:33:07番号、名前、テキストの定義をすると話が早いと思う。
例:
番号は、'0'から'9'の文字からなる文字列
名前は、ひらがな、かたかな、漢字からなる文字列
テキストは、番号と名前をスペースからなる文字列で、最後以外の番号および名前の後には必ずスペースが来る。
11113 3333 5892739 山田 12128384 高橋 32939 8883 細川 32932399
とか。
0348デフォルトの名無しさん
2010/04/23(金) 23:37:36ヒント
for
fscanf
for
for
if
for
fprintf
0349デフォルトの名無しさん
2010/04/23(金) 23:41:59まず
1.ファイルを全部読む
2.並び替えを行う
3.並び替えたデータをファイルに書く
っていう流れに書き換えて
2.の部分をじっくり考えてみてください。
0351デフォルトの名無しさん
2010/04/24(土) 00:47:16こういう時にはこうすれば良いという指針があれば知りたいです。
//構造体の例
struct my_struct {
int size;
void *ptr;
int data[];
};
//(1)create関数の中で構造体をmallocして、delete関数の中でfreeする。
struct my_struct* create_my_struct(int param);
void delete_my_struct(struct my_struct* md);
//(2)呼び出し元で構造体を確保して、init関数の中でメンバーをmallocして、release関数の中でメンバーをfreeする。
// 構造体そのものは呼び出し元でどうにかする。
int init_my_struct(struct my_struct* md, int param);
void release_my_struct(struct my_struct* md);
それぞれ下記のデメリットがあると思います。
(1)のデメリットは呼び出し元で入れたいメモリー領域がある場合、createした構造体をコピーする必要がある。
(2)のデメリットは呼び出し元でinitを呼ぶ前に構造体の大きさを知っていなければいけない。
0352344
2010/04/24(土) 00:55:12ありがとうございました。
0353デフォルトの名無しさん
2010/04/24(土) 01:20:37(1)のデメリットがよくわからんな
そのメモリ領域ってのは create で確保するんじゃないの?
あとコピーうんぬんはコピー用の関数でOK?
0354デフォルトの名無しさん
2010/04/24(土) 01:51:37実装はこんな感じです。
struct my_struct* create_my_struct(int param)
{
struct my_struct* md = (struct my_struct*)malloc(sizeof(struct my_struct) + sizeof(int)*param);
md->size = param;
md->ptr = malloc(param);
return md;
}
void delete_my_struct(struct my_struct* md)
{
free(md->ptr);
free(md);
}
デメリットは、下記のような場合、memcpyが必要なことです。
int get_data(char* buf, int size)
{
struct my_struct* md = create_my_struct(size); //←ここでbufを渡せたら
int ret = memcpy(buf, md->ptr, size); //←ここでコピーしなくていい
delete_my_struct(md);
return ret;
}
0355デフォルトの名無しさん
2010/04/24(土) 02:02:090356デフォルトの名無しさん
2010/04/24(土) 02:49:32*ptrの使い道はなんだろ。つーか、メンテしやすさ重視ならこうじゃね?
typedef struct {
int size;
int chinko;
int unko;
int data[];
} unko_t ;
unko_t *create_unko( unko_t *md, char *buf, size_t size )
{
md = malloc( sizeof(unko_t) + sizeof(int)*size );
if(md){
md->size=size;
memcpy(md->data,buf,size);
}
return md;
}
int get_data(char *buf, int size)
{
unko_t *md;
if( create_unko( md, buf, size )==NULL ) perror("unko");
0357デフォルトの名無しさん
2010/04/24(土) 02:50:300358デフォルトの名無しさん
2010/04/24(土) 02:58:38まぁよくわからないんだけど、こんな感じにすればOK?
struct my_struct* create_my_struct(int param, char *buf)
{
struct my_struct* md = (struct my_struct*)malloc(sizeof(struct my_struct) + sizeof(int)*param);
md->size = param;
md->ptr = malloc(param);
if (buf)
memcpy(md->ptr, buf, size);
return md;
}
なんにせよ、構造体のサイズが不定って段階で create/delete 方式だね。
後でもっとよい実装を思いついたときにも直しやすそうだ。
0359デフォルトの名無しさん
2010/04/24(土) 02:59:04create_unko()の第一引数が冗長だし、リソース開放できなくなってるし
どうでもいいけど、いまどきvoid *の代わりにchar *使わなくても
あと、変更しない変数にはconstを明示的に付けた方が幸せになれる
0360デフォルトの名無しさん
2010/04/24(土) 03:00:370361351
2010/04/24(土) 03:04:33int do_some_process_to_my_struct(struct my_struct* md, int param)
{
for(int i = 0; i < md->size; i++){
((int*)md->ptr)[i] = param+i;
}
return param+i;
}
int get_data2(char* buf, int size)
{
struct my_struct* md = create_my_struct(size); //←ここでbufを渡せたら
do_some_process_to_my_struct(md, 12345);
int ret = memcpy(buf, md->ptr, size); //←ここでコピーしなくていい
delete_my_struct(md);
return ret;
}
0362351
2010/04/24(土) 03:12:28いいえ。OKではないです。
memcpyするのはあくまでも例ですので、createの中にmemcpyを入れてしまうのは話が違ってしまいます。
知りたいことは、>>351に書いたとおり、関数から構造体を返す場合に
(1)と(2)あるいはその他の方法で良いやり方があるのか、ということです。
0363351
2010/04/24(土) 03:19:32int do_some_process_to_my_struct(struct my_struct* md, int param)
{
int i;
for(i = 0; i < md->size; i++){
((char*)md->ptr)[i] = (char)(param+i);
}
return param+i;
}
あくまでも例ですが、間違っていたので訂正します。
0364デフォルトの名無しさん
2010/04/24(土) 03:23:36もう少し簡潔にわかりやすく実例込みで説明頼む
0365デフォルトの名無しさん
2010/04/24(土) 04:35:09#define substitute_ptr(a) ??
#define fn_typedef(a,b) typedef a(*fn##substitute_ptr(a)##substitute_ptr(b))(b);
fn_typedef(ANYSTRUCT*const,int); → typedef ANYSTRUCT*const (*fnANYSTRUCTconstint)(int);
0366デフォルトの名無しさん
2010/04/24(土) 06:47:19sinπが0にならないんだけど?
0367デフォルトの名無しさん
2010/04/24(土) 07:04:500368デフォルトの名無しさん
2010/04/24(土) 07:47:45struct my_struct {
int size;
struct {
char param; /* malloc からchar型を想定 */
int data;
} elem[];
};
こういうふうにペアにしたらダメ?
型の異なる(しかし要素数の等しい)可変長サイズを持つ構造体を取り扱いたいようだが…
0369デフォルトの名無しさん
2010/04/24(土) 09:17:20元々の質問は、一般的にはその2通りのやりかただろう、と答える。
しかし(1)のデメリットが理解できない。
(1)のデメリットは呼び出し元で「入れたいメモリー領域がある場合」、createした構造体をコピーする必要がある。
とくに「入れたいメモリ領域がある場合」という部分が不明。
ポインタがメンバになっているときに、その実体が欲しいってこと?
>354 >361を見てると、あってんだか違うんだか。creat関数の中でメンバを取得しようとしているのかワケワカ。
もしメンバがの実体が欲しいなら、そういう機能を実現した関数を作ればよい。
こんな感じじゃないか。
void get_data(struct my_struct* pMyData, void *pData)
{
pData = malloc(pMyData->size);
memmove(pData, pMyData->ptr);
}
0370デフォルトの名無しさん
2010/04/24(土) 09:55:27void func1( );
void func2( );
void main()
{
int i;
void (*func_ptr[2])( )= { func1, func2};
for(i=0; i<2; ++i)
{
(*func_ptr[i])( ); /* ★★★★ */
}
}
void func1( )
{
printf("func1\n");
}
void func2( )
{
printf("func2\n");
}
上記のプログラムでfunc1とfunc2が実行できたんですが、
★★★★のところを(func_ptr[i])( ); としても、func1とfunc2が実行できました。
関数ポインタの配列に*を付けた場合と付けない場合は何が違うのでしょうか?
0371デフォルトの名無しさん
2010/04/24(土) 10:00:40関数ポインタって代入時の&と実行時の*ってなくても動作変わらないよね?
もともとはどっちが正しいの?
282 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/08(木) 01:06:42
元々必要だったらしいが、gccがなんか理論武装して独自拡張として省略しても良くしたら、
世間に受け入れられたなんて話を聞いたことがある。
0372デフォルトの名無しさん
2010/04/24(土) 10:10:25ってきくようなもの
書き方が違うだけでまったく同じ
0373351
2010/04/24(土) 10:42:37struct my_struct はあくまでも構造体の一例です。
今回の質問ではstruct my_struct の中身を工夫することはあまり重要ではありません。
一般的な話として、関数から構造体を返す場合の、関数プロトタイプの設計に定石があるかどうかを知りたいのです。
こういう時にはこうすれば良いという指針があれば知りたいです。
>>369
>ポインタがメンバになっているときに、その実体が欲しいってこと?
いいえ。今、具体的な構造体あって、その構造体を扱う関数の作り方を知りたいということではありません。
質問の意図は、
構造体を初期化あるいは生成する関数を設計するときの一般論として、
例えば
「ポインタがメンバーになっている構造体の場合は(1)が良くて、そうでない構造体は(2)が良い」(←これは例です。)
というような定石があれば知りたい、ということです。
ですので、get_dataの作り方は質問の対象ではありません。
質問の対象は>>351の(1)(2)の関数プロトタイプについてです。
0374デフォルトの名無しさん
2010/04/24(土) 11:43:19趣旨が良く分からんのだが、要するに、
構造体の中身を動的にメモリを確保しなくちゃならん時に、
構造体自身も動的に確保したい場合、
一緒に確保した方が良いのか、別々に確保した方が良いのかって話?
0375370
2010/04/24(土) 11:43:48回答ありがとうございます。
*を付けると、func1という関数名になり最終的には、
関数名だけ書いた場合はアドレスになるというルールでアドレスになる。
*を付けないと、func1のアドレスになる
どちらでも同じようにfunc1が実行されるということで合ってますでしょうか?
0376351
2010/04/24(土) 11:46:36そうですね。
どういう場合には一緒に確保したほうが良くて、どういう場合には別々に確保したほうが良いという指針があれば知りたいです。
他にもっと良いやり方があればそれも知りたいです。
0377デフォルトの名無しさん
2010/04/24(土) 12:59:50その構造体の隠蔽具合や生命期間との相談かな
FILE ぐらい がちがちに隠蔽する
関数利用側は基本的にメンバアクセスしない: 操作関数(群) とセットになる
気なのか (この場合は create/delete で完結すべき)
リスト的用途に近く、親struct の生命期間とは生きている必要がある時間が
違う場合は、メンバは alloc せず NULL のまま
0378デフォルトの名無しさん
2010/04/24(土) 13:23:31あぁ〜、やっぱり、趣旨がいまいち良く分からんな…。
>>354のget_data()の使い方を見るとcreate_my_struct()した時に、
領域の確保だけでなく、実際に必要なデータが作成されて、
その内容をget_data()で引っ張るって仕組みって認識したんだが、
ってことは、(1)でのcreate_my_struct()は、
メモリの確保だけでなく、データまで作成するって認識であってる?
で、(2)ではinit_my_struct()でデータだけ作成するってこと?
※ここでのデータ作成は、メモリの動的確保を含む
と言う事であれば、そのinit_my_struct()で作成すべきデータは
それだけで、一つの構造ってことになるから、
それぞれ用のcreateを作るが正しいと思うのだが?
仮にinit_my_struct()をcreate_my_struct2()とすると
create_my_struct()の中でcreate_my_struct2()を呼び出すイメージ。
で、その時々で必要なcreate()を呼ぶ。
0379デフォルトの名無しさん
2010/04/24(土) 14:04:10俺も概ね>>377と同意見。
他のやり方としては、構造体なら関数の戻り値として
構造体の実体を返す方法もあるよ。
エラーを返しづらかったり、癖の強いやり方だけど。
0380デフォルトの名無しさん
2010/04/24(土) 14:34:29C言語(WinAPIを含む)でグローバルIPアドレスを無理やり変えることはできますか?
0381デフォルトの名無しさん
2010/04/24(土) 14:42:440382デフォルトの名無しさん
2010/04/24(土) 14:47:21C言語(WinAPIを含む)を使って、何の機器のグローバルIPを
どんな意味で変えたいのによるな
何もしても、このスレないことは確か。
0383351
2010/04/24(土) 14:59:48>その構造体の隠蔽具合や生命期間との相談かな
なるほど。この指標は考える上での参考になりそうです。
ただちょっと初めの質問の意図と違ってきたので、ちょっと考え直します。
0384デフォルトの名無しさん
2010/04/24(土) 15:06:31無理ってことでしょうか?
たとえば掲示板などに書き込むと管理者には
グローバルIPがわかる($_SERVER["REMOTE_ADDR"])と思うのですが、
それをルータ、パソコンをシャットダウンしなくても
ソフトで簡単に変えられたら便利かな?って思ったので・・・
もっと深く突っ込むと
IP斬られてしまったりした場合にすぐに変更できれば
またレスできるぢゃないですかw
それをしたいんです・・・
0385デフォルトの名無しさん
2010/04/24(土) 15:09:030386デフォルトの名無しさん
2010/04/24(土) 15:10:44板違いですか?
WinAPIだと思ったので・・・
0387デフォルトの名無しさん
2010/04/24(土) 15:11:55IP変えるとか、それ以前の問題だな
ネットワークの知識とか、モラルとか、1からやり直せ
0388デフォルトの名無しさん
2010/04/24(土) 15:12:270389351
2010/04/24(土) 15:36:11char *strdup(const char *s);
char* str = strdup("hogehoge"); //←確保するメモリー領域のサイズはstrdupのおまかせ!○
printf("%s\n", str); //処理の例
free(str); //freeが必要×
同等のことを行うmy_strdupを作ることもできます。my_strdupは内部でmallocしません。(>>351の(2)に相当)
void my_strdup(const char* src, char* dst, int size);
char str[100]; //←コピーする文字列より大きなサイズのメモリーが必要×
my_strdup("hogehoge", str, sizeof(str));
printf("%s\n", str); //処理の例
//freeは必要ない!○
(次に続く)
0390351
2010/04/24(土) 15:37:17【my_strdupのメリット】
strdupは、内部でmallocをするため、呼び出した後、必ずfreeが必要になります。
一方、my_strdupなら、自動変数を引数に渡せるので、必ずしもfreeは必要ありません。
この点では、my_strdupの方が便利です。これがmy_strdupのメリットです。
【strdupのメリット】
しかし、my_strdupでは、文字列全体をコピーしたい場合、
元の文字列よりも大きなサイズのメモリー領域を渡さなければ、文字列全体をコピーすることが出来ません。
このため、my_srtdupを呼び出す前に、strlenを使うなどして元の文字列のサイズを知る必要があります。
一方、strdupは内部で必要なサイズの領域をmallocするので呼び出す前に元の文字列のサイズを知る必要はありません。
この点では、strdupの方が便利です。これがstrdupのメリットです。
以上は文字列での例でしたが、
構造体や他のデータ領域を扱う関数を考えるときにも
呼び出し元でメモリーを確保して渡すか、あるいは関数の内部でmallocするか、
についてどういう時にどうしたらいいのか、を考えることができるかと思います。
一般的な指針があれば知りたいです。
0391デフォルトの名無しさん
2010/04/24(土) 16:12:35オブジェクトを生成したら破棄するのは当然のことである(create/destroyの対が大切)
my_strdup()のメリットが自動変数を引数に渡せるとかなんとか言っているが
自動変数の領域が足りない場合や書き換えが必要な場合、結局メモリ確保が必要となり自動変数が渡せることはデメリットでしかない
たとえば、標準ライブラリのf*()について考えてみよう
FILEがクラスでfopen()がコンストラクタ、fclose()がデストラクタ、その他のf*()関数がFILEインスタンスに対するメッセージと考えれば、f*()群は低級なオブジェクト指向をしているとか意釈できる
ここで、一つの指針を示そう
あるオブジェクトを生成しメッセージを送り破棄せよ
foo_t *foo;
foo = create_foo();
do_something_foo(foo);
destroy_foo(foo);
呼出元が生成と破棄を対にして行うのが良い
この関係は、strupでもmy_strdupでも同じことになる
char *s = strdup(foo); /* create */
(void)s; /* do something */
free(s); /* destory */
char *t = malloc(bar); /* create */
my_strdup(foo, t, bar); /* do something */
free(t); /* destory */
my_strdup()がソースとデストが逆のmemcpy()みたいで気持ちが悪いと言っておくテスト
0392351
2010/04/24(土) 16:38:53> strdup()のデメリットがfree()を必要とすることでは無い
> オブジェクトを生成したら破棄するのは当然のことである(create/destroyの対が大切)
確かに当然のことです。当然のことですので、その当然のことを忘れた場合、深刻なバグになるという大きなデメリットがあります。
> my_strdup()のメリットが自動変数を引数に渡せるとかなんとか言っているが
> 自動変数の領域が足りない場合や書き換えが必要な場合、結局メモリ確保が必要となり自動変数が渡せることはデメリットでしかない
自動変数で問題がいない場面では、上記の深刻なバグを避けられるという点で十分メリットがあります。
仰りたいことはわかりますが、一概に決められるものではないと思います。
例えば、>>391の主張では、memcpyはデメリットしか無いことになってしまいますよね?
> 呼出元が生成と破棄を対にして行うのが良い
良いのはわかります。つまり、それがstrdupや、>>351の(1)の場合ですよね。
my_strdupにmallocで確保したメモリー領域を与え、使用後freeするのも良いと思います。
ですが、my_strdupに自動変数を渡してはいけないということにはならないですよね?下記のようなコードは普通に書かれると思います。
void func(const char* str) //strは99文字以下の文字列
{
char buf[100];
strncpy(buf, str, sizeof(buf));
/*strに対する処理*/
printf("%s\n", str);
}
これは、若干恣意的な例ですが、これに限らず、自動変数の構造体や配列へのポインターを関数に渡すことは一般的に行われることですよね。
0393351
2010/04/24(土) 16:43:53void func(const char* str) //strは99文字以下の文字列
{
char buf[100];
strncpy(buf, str, sizeof(buf));
/*bufに対する処理*/
printf("%s\n", buf);
}
0394デフォルトの名無しさん
2010/04/24(土) 17:20:21バグ(メモリリーク)になるから自動変数使うとかどれだけ舐めてるんだよ
C言語はプログラマ任せだからそんなこと言うようになったら、もうC言語に触れない方が幸せになれるよ
別にmemcpy()がデメリットしかないダメダメ関数とは言っていない
一般化したいと言っているのに自動変数マンセーとか言っているからだよ
自動変数(オブジェクト)に対してmempcy()(メッセージ)を送っているが、領域不足やコピーが必要になったときに結局メモリ(新しいオブジェクト)が必要になるのなら最初からメモリ使っておけばいいだろ
つまり、一般的にあるオブジェクトに対するメッセージの引数に自動変数が渡せるからって嬉しいことは無いだろと
memcpy()は抽象し過ぎているから混乱しているんだろう
別に、my_strdup()に自動変数を渡してはいけないとは言っていない
少なくとも自動変数が渡せることがメリットにはならないし、一般的に考えれば自動変数を使うことはデメリットになると言及しただけのこと
確かに、自動変数で領域や生存期間が足りるのであれば自動変数でも構わない
しかし、一般化してオブジェクトがN個必要なときに困ったことになる
ある場面ではi個必要で、自動変数をi個用意しなければならない、またある場面ではj個必要で、自動変数をj個用意しなければならない
じゃあ、i <= jだから、j個用意しとけばいいやとするのか、iが遥かにjより小さい場合無駄が多いからすべきでは無い
そんなことしないで、必要な時に必要なだけ用意してやれば済むこと
一般化したいのか具体化したいのかどちらかにしてもらえないだろうか
0395351
2010/04/24(土) 17:40:07構造体や配列を返す関数を設計する場合の一般的な指針を求めています。
>C言語はプログラマ任せだからそんなこと言うようになったら、もうC言語に触れない方が幸せになれるよ
C言語はプログラマ任せだからこそ、プログラマーが、その時々に適切に、自動変数を渡すか、mallocで確保したメモリーを渡すかを選べるようにしておく方が幸せでしょう。
ですので、自動変数をマンセーしているわけではありませんが、自動変数を一切渡せないよりは、渡せた方がメリットがあると考えます。
つまり、自動変数を一切渡せなければ、自動変数を使いたいプログラマーには使えませんが
自動変数を一切渡せれば、自動変数を使いたいプログラマーにも、使いたくないプログラマーにも使えるからです。
これは十分メリットです。
ともかく、自動変数を渡せるかどうかは、今回の質問の本質ではなく、
構造体や配列を返す関数を設計する場合の一般的な指針として、
(1)関数内部でmallocするのと、(2)呼び出し側で確保したメモリー領域を受け取るのと、(3)それ以外の方法(があれば)と、で
どういう時にどうするのが良いのかという指針があれば知りたいと思っています。
0396デフォルトの名無しさん
2010/04/24(土) 17:56:48ないよ。問題が無い限り好きにしてよしヽ( ´ー`)ノ
0397351
2010/04/24(土) 18:05:31そういう方針の方もいるということはわかりました。ありがとうございます。
それでは引き続き、>>389-390について何か方針をお持ちの方がいましたら、ぜひ教えてください。お願いします。
0398デフォルトの名無しさん
2010/04/24(土) 18:24:44渡すインタフェースが多いね
で、Windows系のプログラマはそういう関数をつくることが多いね
無難だけど美しくないよね
パラメタは少ない方がいい
0399デフォルトの名無しさん
2010/04/24(土) 18:38:23とりあえず、strdupは例として適当じゃないわな。目的が違うから。
単に(最大の)長さが分かっている文字列のコピーは
strcpyなりstrncpyなりを使う。
一般論で言って、必然性がない場合、mallocはしない。
する場合は、旧来では
・確保すべきサイズがかわる
・スコープを越える必要がある
他のケースはプログラマの腕次第で
コードをシンプルにするために使う。
・引数を減らす
・必要な変数を減らす
・インターフェイスの一般化
などなど。
メモリ管理に自信がないならやめとき。
ただイマドキ、そこに自信が持てないなら
Cなんて使わない。
逆に言えば、その程度は必須なわけで、
だから「好きにすれば良い」って意見が出てくる。
0400デフォルトの名無しさん
2010/04/24(土) 19:25:00生成と解放を対にしろってのは、基本方針としてもよいと思う。
よって、strdupのような関数は、できれば使いたくない派。
strdupは生成と解放の数が合わなくなる。
>392
>> 呼出元が生成と破棄を対にして行うのが良い
>良いのはわかります。つまり、それがstrdupや、>>351の(1)の場合ですよね。
これ逆だよね。strdupを使うとmallocが見えないのにfreeしなくちゃならない。
strdupは標準関数だからましだけど、func0, func2, func4が返すポインタは
freeしてね、とかだとやってられない。
やけにstrdupが「サイズを気にしなくてよい」ことがお気に入りのようだが、あくまでも実引数がCstringである場合だけ。
これは自動変数か、ヒープ領域か、静的変数かには無関係。
str系関数は、終端文字がある前提という制限がある。
呼び出し側が領域を用意する場合は、当然呼び出し側でサイズがわかっているはずなので、
そのときに無駄に領域を用意しなければよいだけでしょ。
0401デフォルトの名無しさん
2010/04/24(土) 19:32:160402351
2010/04/24(土) 19:32:36> 一般論で言って、必然性がない場合、mallocはしない。
> する場合は、旧来では
> ・確保すべきサイズがかわる
> ・スコープを越える必要がある
これには同意です。
個人的には自動変数で済む場合はmallocは使わないようにしています。
> コードをシンプルにするために使う。
> ・引数を減らす
> ・必要な変数を減らす
> ・インターフェイスの一般化
これは、シンプルになるのであれば、シンプルにしたほうがいいということですね。
つまり、>>351の(1)が可能であれば、常に(1)にしろということですね。
方針の一つとして参考にさせていただきます。
0403デフォルトの名無しさん
2010/04/24(土) 19:34:03が抜けてるな
0404351
2010/04/24(土) 19:45:44>生成と解放を対にしろってのは、基本方針としてもよいと思う。
>よって、strdupのような関数は、できれば使いたくない派。
個人的にはstrdupは使いませんが、
strdupもstrdup-freeで生成と解放の対になっているので問題ないと思います。
(n対1の対応なので若干違和感はありますが。)
>これ逆だよね。strdupを使うとmallocが見えないのにfreeしなくちゃならない。
いいえ、関数の中でmallocを行うという点で、strdupと>>351の(1)は同じです。
create_my_struct()に対するdelete_my_struct()は、strdup()に対するfree()です。
0405デフォルトの名無しさん
2010/04/24(土) 19:52:13"alloc" を含んでないから
俺は別にどうでもいいと思うけど
0406デフォルトの名無しさん
2010/04/24(土) 20:00:010407デフォルトの名無しさん
2010/04/24(土) 21:35:25上位互換を維持しつつ ver 違いを吸収する苦肉の策な面もあるね
APIを実装する際「渡されたサイズからどのver なのか類推・分岐できる」
0408デフォルトの名無しさん
2010/04/24(土) 21:57:07VC2008です。
0409デフォルトの名無しさん
2010/04/24(土) 21:57:40元の関数から変化が変化がないということは、元の関数もアドレスとサイズを持っていたということであって
つまり元々あるのだから苦肉の策では無いんじゃないの。
0410デフォルトの名無しさん
2010/04/24(土) 22:07:16#include <gdiplus.h>
#pragma comment(lib, "gdiplus")
0411デフォルトの名無しさん
2010/04/24(土) 22:10:20VC++の他に特に何もいらないということですね。
質問にこたえていただきありがとうございます。
0412デフォルトの名無しさん
2010/04/24(土) 22:11:410413デフォルトの名無しさん
2010/04/24(土) 22:14:01話を戻すと、allocとfreeは同じレイヤーにあるのが分かりやすいと思うよ。
0414351
2010/04/24(土) 22:26:58> 話を戻すと、allocとfreeは同じレイヤーにあるのが分かりやすいと思うよ。
それはそのとおりだと思います。
>>351の(1)(2)ともにその方針に基づいています。
(1)の場合は自前でalloc-freeを行い、(2)の場合は前処理・後処理として必要な場合のみalloc-freeを行います。
今回の質問の趣旨はそこではなく、
構造体や配列を返す関数を設計する場合の一般的な指針を知りたいのです。
0415デフォルトの名無しさん
2010/04/24(土) 22:42:53俺は、is-aと考えた方が自然なのかhas-aと考えた方が自然なのかで分ける。
分かるとは思うが(1)はis-aの場合で、(2)はhas-aの場合。
あと、自動変数を使用するか、アロケートするかは、
プログラマが使いたいか使いたくないかで考えるのではなく、使用用途で考えるべき。
0416デフォルトの名無しさん
2010/04/24(土) 22:45:55入れたいメモリ領域がある場合はinitのパラメータにもたせれば良いのでは?
> (2)のデメリットは呼び出し元でinitを呼ぶ前に構造体の大きさを知っていなければいけない。
my_struct *p = (my_struct *)malloc(sizeof(my_struct));
ではだめだということ?
常に呼ばなければならないreleaseを作成するのであれば、常にinitの中でallocすればいいと思う。
そうでないのなら、構造体本体は利用者がalloc-freeすればいいと思う。というか、そうしてる。
0417351
2010/04/24(土) 23:00:41なるほど。その指針は明快ですね。納得です。
ありがとうございます。
>>416
>> (1)のデメリットは呼び出し元で入れたいメモリー領域がある場合、createした構造体をコピーする必要がある。
>入れたいメモリ領域がある場合はinitのパラメータにもたせれば良いのでは?
つまり、常に>>351の(2)にするのが良いということでしょうか?
>> (2)のデメリットは呼び出し元でinitを呼ぶ前に構造体の大きさを知っていなければいけない。
>my_struct *p = (my_struct *)malloc(sizeof(my_struct));
>ではだめだということ?
はい、ダメです。
struct my_structは可変長配列のメンバーdataを持っているのでそのサイズ分多めにメモリーを確保しなくてはいけません。
0418デフォルトの名無しさん
2010/04/24(土) 23:19:22(2)のinitのパラメータに持たせてもいいし、(1)のcreateのパラメータに持たせてもいい。
可変部のサイズを常にパラメータで渡すのであれば、呼び元でそのサイズを確保することは
十分可能なんじゃないの?
0419デフォルトの名無しさん
2010/04/24(土) 23:28:12いや パラメータが一括で纏まった構造体 ってパターンがほとんどさね
ListView とか IEのVER違いで、パラメータ構造体のサイズが違う
だが API(要素の追加とか)のインターフェースは不変
(さらに、APIの実装体は外部リンケージなDLL内)
こういうこと
この例でない話だったらスマン
0420351
2010/04/24(土) 23:42:33入れたいメモリ領域を渡すのが(2)で、入れたいメモリ領域を渡さず関数内部でメモリ領域を確保するのが(1)です。これが定義です。
ですので、入れたいメモリ領域を渡すのであれば、(2)になります。
また、(1)の場合は、可変部の情報を含めサイズ情報を渡しません。
ですので、(1)の場合、呼び出し元は可変部の情報を含めサイズ情報を呼び出す前に知る必要はありませんし、
前述のとおり関数内部でメモリー領域を確保するので、そのサイズを知ることが出来なくても問題ありません。
0421デフォルトの名無しさん
2010/04/24(土) 23:58:42入れたいメモリ領域云々を別で考えることはできないの?
そうなればそれは一般的に構造体を扱う時の指針とかそういうのとは別で、特殊化された話になってこないか?
0422351
2010/04/25(日) 00:14:29> 入れたいメモリ領域云々を別で考えることはできないの?
これはどう言うことでしょうか?
少なくともどこか(関数内あるいは関数外)で、malloc(sizeof(struct my_struct)+data_size)のように構造体のメモリーを確保しなければならないと考えていました。
もしこれを別で考える方法があるならば、ぜひご教示ください。
0423デフォルトの名無しさん
2010/04/25(日) 00:33:19サイズを可変にするためのものとは別だよね。
このptrを同じ関数で確保すべきか、外から渡せるようにするかという話が混ざっているように見える。
0425400
2010/04/25(日) 00:42:10あなたの言う1)と2)の違いを、把握できていなかったから、議論がぐるぐる回っていたぞ。
議論の焦点は
>入れたいメモリ領域を渡すのが(2)で、入れたいメモリ領域を渡さず関数内部でメモリ領域を確保するのが(1)です。これが定義です。
ということだね。
そうでであるならば
>(1)の場合は、可変部の情報を含めサイズ情報を渡しません。
これは無理。
1)の実現例としてstrdupを挙げているのなら、str系は終端文字列付きという制限を与えることで、
間接的にサイズ情報を与えている。
>404
>いいえ、関数の中でmallocを行うという点で、strdupと>>351の(1)は同じです。
私には同じには見えないな。
malloc-free, new-delete, new[]-delete, create_my_struct-delete_my_struct
は対に見える。
だけど関数内部でmallocするhogeがあるとしてhoge-freeは対には見えない。
そういうことに注意してコーディングしたくない。
だからstrdup使うくらいなら、mallocしてstrcpyして、freeする。
0426351
2010/04/25(日) 00:56:57> >(1)の場合は、可変部の情報を含めサイズ情報を渡しません。
> これは無理。
いいえ。無理ではありません。
例えば、関数内でrecv()を使ってネットワークからデータを受信する場合など、処理を完了して初めてデータのサイズが確定することがあります。
そのような場合、関数を呼び出す前にはそのサイズは分かりませんが、関数内ではreallocするなりして適切なサイズのメモリーを確保することができます。
したがって、可能です。
>私には同じには見えないな。
これは関数名が適切ではないとうことでしょうか?
そうであれば特に異論はありません。人の感覚なのでそう見えない人がいることは仕方が無いと思います。
そういう点では、私も、new-deleteという組み合わせが名称としてあまり適切でないと思っています。
私が同じだといったのは、機能としての対応からです。
0427デフォルトの名無しさん
2010/04/25(日) 01:52:31> 例えば、関数内でrecv()を使ってネットワークからデータを受信する場合など、
> 処理を完了して初めてデータのサイズが確定することがあります。
>そのような場合、関数を呼び出す前にはそのサイズは分かりませんが、
>関数内ではreallocするなりして適切なサイズのメモリーを確保することができます。
なぜ recv() がそういう造りになっていないのか? を想像してくれ
上記の構造だと、生成/消滅の入れ子構造が維持し難いんだよね
0428351
2010/04/25(日) 01:59:41> なぜ recv() がそういう造りになっていないのか? を想像してくれ
何のためにその想像をする必要があるのでしょうか?
目的がよくわかりません。
0429デフォルトの名無しさん
2010/04/25(日) 03:25:24ならぬるぽのときだけ確保するようにしたらいいんでないかな。
0430デフォルトの名無しさん
2010/04/25(日) 03:27:29うーん、strdup-freeも対に見えないよ
その論調ならstrdupの存在を否定していいと思うんだ。そしてそれはアリだと俺は思う。
0431デフォルトの名無しさん
2010/04/25(日) 03:33:04ちなみにnew[]-deleteはnew[]-delete[]の間違いだよな?
>>426
> 人の感覚なのでそう見えない人がいることは仕方が無いと思います。
なんか多分読み違えているけれど、
create_my_structのような関数を見た場合、同ライブラリにdelete_my_structのような関数があれば
プログラマは注意を払うが、なければ特に何もしなくて良い(freeを使う必要がない)と思ってしまうクセがある。
そういう意味で、hoge-freeが対に見えないという話だよ
0432>425
2010/04/25(日) 08:44:44>ちなみにnew[]-deleteはnew[]-delete[]の間違いだよな?
すみません。タイプミス。注意したつもりだったのに、日頃C++使わない物で、ご容赦ください。
>426
他の人とは、同じ感覚みたいだけど、strdup-freeはリソースの確保と解放のレベルがあっていない、
イヤなコーディングスタイルだってこと。mallocしているレベルが、一段低いから。
名前の問題ではない。
ただ、標準関数という意味でギリギリの許容範囲。
コーディングスタイルを操作できる立場なら、ANSIに含まれないから禁止としたいくらい。
拒否する。
もちろんそういう構造が取れない場合は、あり得る。
だけど「一般的には」リソースの確保と解放の対は、そろっている方がよい。
0433デフォルトの名無しさん
2010/04/25(日) 09:22:07横からだけど、レベル合わせるのって必要か?
どちらかと言うと、アロケートとリリースが組み合わせになってないことの方が問題じゃないか?
strdupに対して、strdup_free()があれば良いだけで、
使う方は、その中身の実装は問わないってのが正解な気がするが…?
要するに、あるオブジェクトに対してのnewがあるなら、
そのオブジェクトに対するdeleteを用意して、それを使えってだけで、
組み合わせを間違えなければ、内部がどうなってようが、問題にならないと思うが…
0434デフォルトの名無しさん
2010/04/25(日) 09:41:31デストラクタが無い影響はスコープだけじゃなく構造体・共用体の中にまで影響する訳で
入れ物の階層毎に都度専用alloc/freeを用意するのが注意深いcデータ取り扱い方だとおもうよ
0435デフォルトの名無しさん
2010/04/25(日) 10:05:18確保するメモリのサイズを事前に取得できない場合はどうすんのって話だな
0436デフォルトの名無しさん
2010/04/25(日) 10:14:030437デフォルトの名無しさん
2010/04/25(日) 10:23:15関数内で realloc してもらうとか?
0438デフォルトの名無しさん
2010/04/25(日) 10:30:07分けも分からずmalloc()する位なら、NULL使ってrealloc()の方がまし
0439デフォルトの名無しさん
2010/04/25(日) 10:35:230440デフォルトの名無しさん
2010/04/25(日) 10:43:30必要なのはC++で言うnewとdeleteに対応するものであって
mallocとfreeではないと思うのだが?
0441432
2010/04/25(日) 10:45:57>strdupに対して、strdup_free()があれば良いだけで、
それがレベルを合わせるってこと。
strdupの中でmallocしていれば、strdup_freeで責任もってそれを解放する方が、コード上で
リソースバランスの確認ができる。
>組み合わせを間違えなければ、内部がどうなってようが、問題にならないと思うが…
内部を気にしたくないから、リソース管理の責任レベルを合わせたいってこと。
>435
>確保するメモリのサイズを事前に取得できない場合はどうすんのって話だな
必ずしも、同じレベルでそろえられないかもしれない。でも、大抵は設計が行けてないだけ。
少し話を戻して>432で
「名前の問題ではない」と書いたけど、リソース管理レベルの話題であって、名前の話ではないといういみであり、
人間がコードを書いている以上、リソース管理レベルは識別子で認識している。
従って、リソース管理レベルを意識していれば、名前もそうなるはず。
コード上で名前のバランスが取れていない場合、設計を疑った方がよい。
0442441
2010/04/25(日) 11:00:58>> >(1)の場合は、可変部の情報を含めサイズ情報を渡しません。
>> これは無理。
>いいえ。無理ではありません。
>例えば、関数内でrecv()を使ってネットワークからデータを受信する場合など、処理を完了して初めてデータのサイズが確定することがあります。
OK.あなたと私では、視点のレベルが違っていた。
私の視点は事前にサイズがわからない場合も、とりあえずバッファを用意しておいて、
読んでみないことには知りようがない、という意味だったのです。recvそのものの
レイヤーです。読んでみたあとはサイズがわかる、というのはそうですね。
議論はあくまでも一般論です。個別では理想的な実装ができないかもしれません。
余談ですが、メッセージループの処理ならば一般的には、下記のように書くと思います。
擬似コードです。
for (;;) {
recvMsg(pMsg);
/* メッセージに応じた処理 */
freeMsg(pMsg);
}
これはメッセージを受けるところと、最後に解放するところでリソース管理レベルを
そろえています。
0443デフォルトの名無しさん
2010/04/25(日) 11:07:19まあその主張は分からんでも無い
0444デフォルトの名無しさん
2010/04/25(日) 11:10:13>>strdupに対して、strdup_free()があれば良いだけで、
>それがレベルを合わせるってこと。
何か意図が違う気がする。
strdup()内でmalloc()を呼んでようが、さらに、strdup()で別の関数を呼んで
その中で、malloc()を呼んでようが、俺は気にしないって話だが合ってる?
strdup_free()に関しても、冗長になると分かってても実装して欲しと思うが、
最悪(本当に最悪だが)はdefineの定義するだけでも構わないと思ってるけど同じ?
0445351
2010/04/25(日) 12:24:26>議論はあくまでも一般論です。個別では理想的な実装ができないかもしれません。
はい。そのとおりです。
ですが、その下の擬似コードは>>351の質問の意図を表していません。
>>351の質問の意図は、
recvMsg(), freeMsg()を使う関数を作るような場合を含めて、
一般的に
・関数から構造体を返す必要がある場合、何か基準や定石があるのかを知りたい。
・こういう時にはこうすれば良いという指針があれば知りたい。
ということです。
recv()とrecvMsg()-freeMsg()のどちらが一般的かという議論は今回の質問の中ではしていません。
0446デフォルトの名無しさん
2010/04/25(日) 12:29:35構造体自体を返すだけなら free() はいらない。
でも >>351 のお題にあがっている構造体は、メンバに malloc() で得たポインタがはいっているので、
当然 そのポインタを free() する必要がある。
一般化というが、上記のことだけ注意すれば OK なのでは。
0447デフォルトの名無しさん
2010/04/25(日) 12:30:02さらに、(オーバーロードできるなら、C++なら同名で)
void delete_my_struct(struct my_struct **md) {
delete_my_struct(*md);
*md = 0;
}
とすらする。
0448デフォルトの名無しさん
2010/04/25(日) 12:32:34Cでオーバーロードできる環境なんてあるのか?
0449351
2010/04/25(日) 12:36:38つまり、構造体内部の後処理だけを関数で行えということなので、常に>>351の(2)が良いということですね。
>>447
どういう場合、>>351の(1)が良いですか?
基準があれば教えてください。
それとも、常に>>351の(1)が良いでしょうか?
0450デフォルトの名無しさん
2010/04/25(日) 12:51:51いっけね。Cスレだった。C/C++かと思ってた。
>>449
基準も何も、(2)は俺にとって煩雑。
呼び出し元でmallocなりして、init_my_struct呼んで、
要らなくなったらrelease_my_struct呼んで、free呼ぶ。
呼び出し回数が多い。呼び忘れるのも怖い。
(1)ならcreate_my_structで生成と初期化を同時に行い、
delete_my_structで後片付けと削除を同時に行う。
呼び出し回数が少ない。余計な気を使わなくて良い。
create - deleteの対を分かって使えば良いだけ。
C++にしたってコンストラクタ以外に、
new後にinit()呼び出しを要する設計もあるが、
同じ理由で俺はそういうの嫌い。
メソッド間、関数間に呼び出し順の依存関係があると使いにくい。
0451デフォルトの名無しさん
2010/04/25(日) 13:33:210452デフォルトの名無しさん
2010/04/25(日) 13:54:52ただし構造体のメンバにアクセスできないようにカプセル化したほうがいい。
ヘッダに
struct my_struct* create_my_struct(int param);
void delete_my_struct(struct my_struct* md);
その他my_structを操作する関数のプロトタイプ宣言
を書いて、ソースのほうに
struct my_struct {
int size;
void *ptr;
int data[];
};
関数の定義
を書く。
0453351
2010/04/25(日) 18:27:17> 基準も何も、(2)は俺にとって煩雑。
>>452
> >>351は常に(1)でいいよ。
ありがとうございます。基本は(1)ということですね。
では、呼び出し元で構造体を格納したい場所が決まっている場合はどうすればいいと思われますか。
>>351の(1)の場合は、
呼び出し元で構造体のcretateを実行し、呼び出し元でその結果を構造体を格納したい場所にコピーしなければなりません。
>>351の(2)の場合は、
呼び出し元で構造体のinitに格納したい場所を指定して実行すれば、結果として格納したい場所に構造体が格納されるので、呼び出し元では改めてコピーする必要はありません。
この点で、やはり(2)は捨て切れません。
上位でどう使われるかわからない関数を設計する場合は、やはり(1)(2)の両方を用意したほうがいいでしょうか。
(1)(2)以外にうまい方法があれば知りたいところです。
0454デフォルトの名無しさん
2010/04/25(日) 18:51:27自分で答え出してるじゃないか。まだ何か困ってるの?
0456デフォルトの名無しさん
2010/04/25(日) 19:30:23へぇ。そこ読んでも俺には何に困ってるのかわかんないや。
0457デフォルトの名無しさん
2010/04/25(日) 19:34:52何のために格納したい場所ってのが必要なのかわからんが、変な書き方するよりは
おとなしくコピーしたほうがいいかもね。
0458351
2010/04/25(日) 19:43:23格納したい場所が決まっている状況というのは、
例えば、下記のようなコールバックハンドラーを実装する場合に、引数に格納するメモリー領域を渡されるような場合です。
int (*some_callback_handler)(char* buf, int buf_size);
パフォーマンスがそれほど要求されない場面では確かにコピーすれば解決なのですが、
そうではない場合もあるので、コピーの回数は減らせられるようにもしたいのです。
0459デフォルトの名無しさん
2010/04/25(日) 19:56:46reallocみたいな感じといえばいいかな
0460デフォルトの名無しさん
2010/04/25(日) 21:13:28get_my_struct関数を作ってポインタを返して、そのポインタを使えばいいのでは。
0462デフォルトの名無しさん
2010/04/25(日) 23:54:00こういうどうでもいい質問はOKウェブみたいな初心者向けQ&Aサイトでやればいいのに
0463デフォルトの名無しさん
2010/04/26(月) 00:03:24それがこのスレさ
0464デフォルトの名無しさん
2010/04/26(月) 11:01:21いっそ小心者スレ辺りでやってほしい。
0465デフォルトの名無しさん
2010/04/26(月) 13:02:05お前が童貞専用自慰スレに行けばいい
0466デフォルトの名無しさん
2010/04/26(月) 22:05:24変数の宣言というのがこういうので、この時に使う?↓
int nurupo;
これは「処理」でいいよね?↓
int nurupo = 1
0467デフォルトの名無しさん
2010/04/26(月) 22:14:54が準備だな
処理に備えて初期化という準備をしているわけだし
変数宣言はフローチャートの中では書かないことが多い
0468デフォルトの名無しさん
2010/04/26(月) 22:52:29「こんな書き方見たことない、直せ!」と言われた。
0469デフォルトの名無しさん
2010/04/26(月) 23:02:070470デフォルトの名無しさん
2010/04/26(月) 23:02:55int j = i = 0;
こういうやつか
まあキモいな
0471デフォルトの名無しさん
2010/04/26(月) 23:03:11語弊があって申し訳ないが、>>467みたいなやつ。
0472デフォルトの名無しさん
2010/04/26(月) 23:06:20つーか見たことない、って
0473デフォルトの名無しさん
2010/04/26(月) 23:08:350474デフォルトの名無しさん
2010/04/26(月) 23:10:00ソース読めば瞬間わかることを書いてはいけない
よく読まなければわからないことをアシストしてこそ意味がある
0475デフォルトの名無しさん
2010/04/26(月) 23:11:39それを初期化と言う
まあ、初期化は代入ではないがな
0476デフォルトの名無しさん
2010/04/26(月) 23:26:20int main(void) {int x = 5; return 0; }
なんかだと代入じゃない?
0477デフォルトの名無しさん
2010/04/26(月) 23:34:340478デフォルトの名無しさん
2010/04/26(月) 23:41:51もう少しグーグル先生で探してくる。プログラムって難しそうね。。
>>474
そういうものなのね。
じゃあ殆どつかわねーよ!という記号もあるとか?
0479デフォルトの名無しさん
2010/04/26(月) 23:46:14それとも俺の頭が古いのか?
0480デフォルトの名無しさん
2010/04/26(月) 23:58:19古いんじゃなくて、最初からちゃんとした文法を覚えていないだけ。
0481デフォルトの名無しさん
2010/04/27(火) 00:01:05static な変数に対する初期化は理解できるが、auto な変数に初期化という動作はあるのか
main() {
int x; /* 宣言 */
x = 1; /* 代入 */
}
をひとつにまとめものが
main()
0482デフォルトの名無しさん
2010/04/27(火) 00:01:46int x = 1; /* 宣言&初期化 */
}
と思っていたのだが。
0483デフォルトの名無しさん
2010/04/27(火) 00:03:31main()
{
int x; /* 宣言 */
x = 1 /* 代入 */
}
をひとつにまとめたものが
main()
{
int x = 1 /* 宣言+代入 */
}
だと思っていたのだが、規格はこれを初期化と呼んでいるのか?
0484デフォルトの名無しさん
2010/04/27(火) 00:11:39それは、初期化子付きの宣言。あくまでも宣言で、宣言+代入ではない。
式と宣言では文法が区別されている。
int a[] = {1, 2, 3,};
と書けるが
int a[10];
a[] = {1, 2, 3,};
とは書けないのは別物だから。
0485デフォルトの名無しさん
2010/04/27(火) 00:16:06JIS X3010 6.7.8 初期化
0486デフォルトの名無しさん
2010/04/27(火) 01:11:59途中で送信したとは思ったがシュール過ぎて笑った。
0487デフォルトの名無しさん
2010/04/27(火) 11:47:43unsigned char型の変数を、二進数でバラして8個の0/1フラグとして使うための一番効率のよいやり方って何ですか?
一般的に使われるロジックとしては以下のメソッドのような感じでOKですか?
//引数srcのnビット目を0か1かで取り出す
unsigned char getNbit(unsigned char src,unsigned char n)
{
//srcと2のn乗(nビット目だけ1の値)と論理乗算して、0になったら0を返す。そうでなければ1。
if( src & (1<<n) == 0 )
{
return 0;
}
else
{
return 1;
}
}
//引数srcのnビット目に指定の値param(0/1)をセットした値を返す
unsigned char setNbit(unsigned char src,unsigned char n,unsigned char param)
{
//0をセットする場合、srcと2のn乗の値を反転した値(255-1<<n)とを、論理乗算する
if(param == 0)
{
return src & (255-1<<n);
}
//1をセットする場合、srcと2のn乗(1<<n)の値とを、論理加算する
else
{
return src | (1<<n);
}
}
0488デフォルトの名無しさん
2010/04/27(火) 11:54:370489デフォルトの名無しさん
2010/04/27(火) 11:58:100490デフォルトの名無しさん
2010/04/27(火) 12:00:410491デフォルトの名無しさん
2010/04/27(火) 12:15:090492デフォルトの名無しさん
2010/04/27(火) 12:34:18return src & (1 << n);
}
__inline unsigned char setNbit(unsigned char src, unsigned char n, unsigned char param) {
return src & ~(1 << n) | (!!param << n);
}
0493デフォルトの名無しさん
2010/04/27(火) 12:39:450494487
2010/04/27(火) 13:33:20>>490
まさにIO制御の学習です。
基盤にランプが8個乗っていて、指定のIOポート1つ(1バイト)に値をセットすることで点灯/消灯を制御するといった課題です。
ビットフィールドというのを調べてみます。
>>492
前者は、指定したビットが0のときは0が返るけれど、1のときは1<<nが返りますね。
それでも、このメソッドを使う際に、「0かそうでないか」という運用をすれば良いということですか?
JavaのbooleanやC#のbool型に慣れているゆえ、0か1かの戻り値にこだわらないといけないと思っていましたが、
Cの常識だとそうでもないという認識で良いですか?
後者は、「src & ~(1 << n) | (!!param << n);」の記述の意味を詳しく教えていただけると助かります。
「src & ~(1 << n)」の部分までは、「とりあえず指定ビットを0にする」というのは分かりますが、
その後、 !!とはどういう意味の記述なのでしょうか。
こういう短く基本的な処理を書くにはinlineにしたほうが高速なのですね。とても参考になります。
0495デフォルトの名無しさん
2010/04/27(火) 13:38:56パディングとか順番入れ替わるとかで
0496デフォルトの名無しさん
2010/04/27(火) 13:46:15>>492の get の方は指摘の通りで、0, 1 に固定するなら(した方がいいだろうけど)、
return !!(src & (1 << n));
としてもいいが、それなら >>493 の方がいいね。
!! は ! を2回やってるだけ。 0なら0、0以外なら1にしたいときにやる常套手段。
0497デフォルトの名無しさん
2010/04/27(火) 14:15:090498デフォルトの名無しさん
2010/04/27(火) 14:28:54JavaでもC#でも0が偽というところは変わらんよ。
if (3)とかかけるでしょ
0499デフォルトの名無しさん
2010/04/27(火) 15:34:560500デフォルトの名無しさん
2010/04/27(火) 15:42:120501デフォルトの名無しさん
2010/04/27(火) 18:54:10好みの問題だろうけど
ちゃんと最適化されるかどうかは気になる
0502デフォルトの名無しさん
2010/04/27(火) 19:14:220503デフォルトの名無しさん
2010/04/27(火) 19:20:04なるほど、「静的記憶域区間」のみならず「自動記憶域区間」の場合であっても、初期化という言葉が適用されるのですね。
インプリメント上では単なる代入にすぎないものであっても。
0504デフォルトの名無しさん
2010/04/27(火) 19:53:57たぶんメモ帳とか作る場合GUIとか使わないとならないんですよね?できたらヒント付きで教えてくれませんか?
0505デフォルトの名無しさん
2010/04/27(火) 19:54:16俺は基本そうしてる
if文に直接書く時はそれすら書かないけど
0506デフォルトの名無しさん
2010/04/27(火) 19:55:02CUIで作れるような簡単なゲームでも作るといいよ
俺はいつもヒットアンドブローを作るようにしている
0507デフォルトの名無しさん
2010/04/27(火) 22:01:56ナイスな方法ってある?
0508デフォルトの名無しさん
2010/04/27(火) 22:10:360509デフォルトの名無しさん
2010/04/27(火) 22:14:11それでループでアクセス
まあ普通そんなことやるなでFAだが
0510デフォルトの名無しさん
2010/04/28(水) 15:43:35unionを使うのが一番楽で上品
0511デフォルトの名無しさん
2010/04/28(水) 16:33:51順次アクセスという言葉の意味がわかってないだろ
馬鹿は黙ってればいいのに
0512デフォルトの名無しさん
2010/04/28(水) 17:14:460513デフォルトの名無しさん
2010/04/28(水) 19:37:37こういう感じでいけるっしょ。
typedef struct {
int a;
int b;
int c;
int d;
} hoge_t;
typedef union {
hoge_t u;
int l[4];
} chinko_t;
0514デフォルトの名無しさん
2010/04/28(水) 19:38:410515デフォルトの名無しさん
2010/04/28(水) 20:07:29同じ型ならまず問題は無いだろうが、万が一があるしな
0516デフォルトの名無しさん
2010/04/28(水) 20:14:520517デフォルトの名無しさん
2010/04/28(水) 20:16:54それを言い出したらそもそもunionの存在そのものが怖いよな。
>>516
誰もメリットの話なんかしてねーだろ
0518デフォルトの名無しさん
2010/04/28(水) 20:26:35#define STFX(N,V) switch(N){case 0:struct.a=V;break;case 1:〜}
で十分だし。
0519デフォルトの名無しさん
2010/04/28(水) 21:01:430520デフォルトの名無しさん
2010/04/28(水) 21:10:53だよな、時代はD言語だろうに老頭児なC厨はオナニーでもしてろってのw
0521デフォルトの名無しさん
2010/04/28(水) 21:12:260522デフォルトの名無しさん
2010/04/28(水) 21:12:590523デフォルトの名無しさん
2010/04/28(水) 21:14:180524デフォルトの名無しさん
2010/04/28(水) 21:14:280525デフォルトの名無しさん
2010/04/28(水) 21:18:30ん?
0526デフォルトの名無しさん
2010/04/28(水) 21:24:39すまん、俺まだ20代だが両方とも会社で使ってるw
0527デフォルトの名無しさん
2010/04/28(水) 21:32:21でもプログラムはWindowsアプリだけじゃないし、つーかDって誰が普及させるんだよw
世界中で使われてるCの牙城を崩す気ねーだろ
あとWebプログラミングのLLはこれからも生き残る
0528デフォルトの名無しさん
2010/04/28(水) 21:35:21FORTRANを使う場面はまったく思い浮かばん
昔大学で実験に使って以来やってないから、もう文法もわがんね
0529デフォルトの名無しさん
2010/04/28(水) 21:49:200530デフォルトの名無しさん
2010/04/28(水) 22:02:10Lispってemacsのマクロくらいしかないよ
って書こうとしてリロードして>>528を読んだ
たぶんほとんど同じものを見たのに出した答えが真逆で面白いなと思った
0531デフォルトの名無しさん
2010/04/28(水) 22:25:400532デフォルトの名無しさん
2010/04/28(水) 22:27:570533ノラ
2010/04/28(水) 23:55:51do-while文を使って
1+2+3・・・というように数値を加算して表示し、
加算結果が300を超えたら表示して
処理を終了するというプログラムを組みたいのですが、
普段から授業ついていけなくて、よくわかりません
どなたか教えてください。お願いします
0534デフォルトの名無しさん
2010/04/28(水) 23:57:45ここは入門スレなのであまり高度なことはお答えできません。
0535ノラ
2010/04/29(木) 00:00:38どうしたらいいですか?
0536デフォルトの名無しさん
2010/04/29(木) 00:02:050537ノラ
2010/04/29(木) 00:03:53いえ専門なんですが
全く授業についていけなくてですね・・・
0538デフォルトの名無しさん
2010/04/29(木) 00:03:56http://pc12.2ch.net/test/read.cgi/tech/1246115922/
こちらへどうぞ
0539デフォルトの名無しさん
2010/04/29(木) 00:04:27int
main(void)
{
int i = 1;
int sum = 0;
do {
sum += i++;
} while (sum < 300);
printf("%d\n", sum);
return 0;
}
0540デフォルトの名無しさん
2010/04/29(木) 00:04:290541ノラ
2010/04/29(木) 00:12:06参考にしてがんばってみます
0542ノラ
2010/04/29(木) 00:14:24sum入れないでもできますか?
0543デフォルトの名無しさん
2010/04/29(木) 00:16:160544デフォルトの名無しさん
2010/04/29(木) 00:24:110545デフォルトの名無しさん
2010/04/29(木) 00:52:38#include <stdio.h>
int
main(void)
{
int i = 1;
do {
printf("%d\n", i * (i + 1) / 2);
i++;
} while (i * (i + 1) <= 600);
return 0;
}
0546デフォルトの名無しさん
2010/04/29(木) 00:55:13結果を格納しておく変数が必要なわけ。
加算していって、それをどこに保持しておくの?って話になるでしょ?
だから、この場合は「sum」っていうy変数に入れてる。
別にgoukeiでもsでも、C言語の規則に従ってればなんでもいい。
0547デフォルトの名無しさん
2010/04/29(木) 00:55:55綺麗だけど初心者には分かりづらいソースだなwwwwwwwwww
0548デフォルトの名無しさん
2010/04/29(木) 01:03:480549デフォルトの名無しさん
2010/04/29(木) 01:16:39宿題スレじゃないんだからさ
0550デフォルトの名無しさん
2010/04/29(木) 02:39:15Raw Socketってあるぢゃないですか?
私の開発環境はWindowsでVC++ 2008なので
Winsock2を使ってws2_32.libをリンクし、
socket(AF_INET,SOCK_RAW,IPPROTO_IP);
こうやって書くんだと思うんですが(違ったらまた勉強してきます)、
IPヘッダを作成するときにIPを偽装できるという記事を
拝見したことがあります。
その場合、IPというのは何のIPなのでしょうか?
プライベートIPですか?
グローバルIPですか?
仮にグローバルIPを返られるとした場合、
例えば携帯IPに変更することは可能なのですか?
もし可能なら大変なことになるのでそれは出来ないと思うのですが、
出来たとしたら掲示板などはどのような対策を施すのでしょうか?
■以下、板違い発言すみません。
私はC言語のほかにPerlやPHPなどCGIで掲示板などを作成してます。
もし上記に書いたようなグローバルIPを偽装するような行為があったとしたら
どのように防げばいいかわかりません・・・
できればそんなこと出来ないものだと願いたいものです。。。
0551デフォルトの名無しさん
2010/04/29(木) 06:42:02スレチとか死ねよゴミ野郎
IPの偽装は現在は無理
一言でいうとヘッダに書いてあったIPに本当にそいつが送ってきたのか確認するから
それとグローバルIPですかプライベートIPですか?って質問も相当アホ
0552デフォルトの名無しさん
2010/04/29(木) 09:19:03携帯のふりもできるよ 掲示板は対策要らないよ
あんたの掲示板はTCPだろうから>>551が言うようにそのIPに対して問い合わせするわけだから
偽装された他人に問い合わせしても返事来ないでしょ
UDPで動く(昔のネットゲームとか?)ものなら がんばって通信内容もまねれば
他人がゲームやってるときにちょっかい出せるかもしれんけど
0553デフォルトの名無しさん
2010/04/29(木) 15:12:39誰かお願いします。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char fi[50];
float buff[128*128];
int nx = 128, ny = 128;
int i, j;
FILE *fp;
// 画像の初期化
for (i = 0 ; i < nx*ny ; i++)
buff[i] = 0;
0554デフォルトの名無しさん
2010/04/29(木) 15:14:47for (i = 32 ; i <= 96 ; i++) {
for(j = 32 ; j <= 96 ; j++) {
buff[i*nx+j] = 100;
}
}
// 画像の書き出し
printf( "Input new file name: " );
scanf( "%s", fi );
if ((fp = fopen ( fi, "wb")) == NULL) {
printf("Error: file open [%s].\n", fi);
exit (1);
}
fwrite(buff, sizeof(float), 128*128, fp);
fclose (fp);
}
0555デフォルトの名無しさん
2010/04/29(木) 15:22:34お前それ本とかみてやってそうなのか?
0556デフォルトの名無しさん
2010/04/29(木) 15:28:34画像ヘッダをつけるかフォーマット指定してビューワに読み込ませれば表示できるかもしれない
ACDSEE とかそういうの
float 型の画像ってことはCTスキャンデータかな?
後輩だったりしてw
0557デフォルトの名無しさん
2010/04/29(木) 15:29:11前者ならまずウィンドウを作成しないと。
後者なら出力したい画像フォーマットに従ってデータを出力しないとダメだよ。
0558デフォルトの名無しさん
2010/04/29(木) 15:46:14とりあえず raw形式でいいんじゃない?
0559デフォルトの名無しさん
2010/04/29(木) 16:11:290560デフォルトの名無しさん
2010/04/29(木) 16:37:32先輩、今時CTのデータが128ってことはないでしょ
ネマコードもないし DICOM形式でもない
0561デフォルトの名無しさん
2010/04/30(金) 09:51:52つーか、float生データでも適切なツールを使えば表示はできるだろうけどね。
いずれにしても、Cの話じゃなく画像フォーマットの話というか仕様の解釈の話だ。
0562デフォルトの名無しさん
2010/04/30(金) 10:53:29型はshortだな
0563デフォルトの名無しさん
2010/04/30(金) 11:15:48あいつら技術的なこと分からないから技術持ってるベテランにいてもらうと邪魔なんだよ。
そいうやつらが外注管理とか客先交渉とかの技術的なこと分からなくてもできる仕事を創出してこの業界で生き残れるシステムを作ったんじゃないだろうか。
技術のない正社員はすぐ首にできるシステムになってないのがいけないんだと思うんだ。
だいたい技術職なのに技術にこだわってるやつを軽蔑する空気があるのはおかしいと思う。
0564デフォルトの名無しさん
2010/04/30(金) 11:18:530565デフォルトの名無しさん
2010/04/30(金) 12:00:27たとえばintelの技術者が「もっとすごいCPUを作りたい」といって、独立して作った会社がAMD
ただし営業力がなくて負ける
0566デフォルトの名無しさん
2010/04/30(金) 13:33:12技術が高くてもメシは食えないんだよね
でも営業が小ざかしいくらい上手いと技術がクソでも売れる
メインな部分どっかに丸投げでもOK
宣伝の上手い声の大きいやつが勝つ
あと、技術持ってないやつが上にいたりすると楽だよね
「あ、それ2週間はかかります」とかどう考えても5分で終わる仕事でも平気でそんな事いってみたり
ある程度技術があるようならバレバレでもさ
(「そんなことしてるお前がクソなんだよ」って言われちゃうだろうな)
0567デフォルトの名無しさん
2010/04/30(金) 13:35:190568デフォルトの名無しさん
2010/04/30(金) 13:39:55上が技術だとある意味もっと楽だぞ。
こっちの話がちゃんと伝わるから、更に上にリソースの確保をきちんと交渉してくれる。
尤も、弊社の場合No.2まで技術系だから突っ込まれたときはやばいw
0569デフォルトの名無しさん
2010/04/30(金) 13:40:350570デフォルトの名無しさん
2010/04/30(金) 13:41:26スレ違いの雑談と言う意味ではあんたも同罪。
で、Cの初歩的な質問未だ?w
0571デフォルトの名無しさん
2010/04/30(金) 13:43:10そのあたりがよくわかりません
0572デフォルトの名無しさん
2010/04/30(金) 14:07:53お前にわかる必要など無い
0573デフォルトの名無しさん
2010/04/30(金) 14:09:40宇宙の法則がみだれるからな・・・
0574デフォルトの名無しさん
2010/04/30(金) 14:54:33大丈夫。realloc()はメモリ確保に成功しない限り元の領域は解放しない。
つまり、使う側が間抜けでない限りどこにも消えはしない。
0575デフォルトの名無しさん
2010/04/30(金) 15:10:13回答ありがとうございます
reallocに与えるアドレスをとっておいて、reallocがNULLを返したらそっちを取り扱えばいいってことですね
とはいえ今まで一度もmalloc系が失敗するとこをみたことないんですけどね
0576デフォルトの名無しさん
2010/04/30(金) 15:57:46いつ失敗するんだろうと思って延々mallocをしてみるのが普通のマ。
0577デフォルトの名無しさん
2010/04/30(金) 15:59:32以上に大きな値を指定しない限り、メモリが足りようと足りなかろうとNULLは返さないからね。
で、実際に使おうとしたときに足りなくなるとプロセス落として知らん顔w
0578デフォルトの名無しさん
2010/04/30(金) 16:09:090579デフォルトの名無しさん
2010/04/30(金) 16:12:070580デフォルトの名無しさん
2010/04/30(金) 16:17:500581デフォルトの名無しさん
2010/04/30(金) 16:20:170582デフォルトの名無しさん
2010/04/30(金) 16:24:21まぁ、Linux板向けの話だね。
0583デフォルトの名無しさん
2010/04/30(金) 18:39:330584側近中の側近 ◆0351148456
2010/04/30(金) 19:19:45(っ´▽`)っ いや、異常終了にしたほうがいいんじゃね?
alloc系がエラー返すって相当やばいから、処理続行するのは危険だね。
0585デフォルトの名無しさん
2010/04/30(金) 20:19:21続行できるのなら続行してもいいと思うよ。
ほんとに必要な場面で失敗したなら異常終了で。
0586デフォルトの名無しさん
2010/04/30(金) 20:23:220587デフォルトの名無しさん
2010/04/30(金) 21:20:56固まっちゃって動かなくて、引き続き他の動作もクソもないよな
0588デフォルトの名無しさん
2010/04/30(金) 21:44:01の出力を21byteで思いつける天才いる・・・?
code golfです。
http://golf.shinh.org/p.rb?hello+world
0589デフォルトの名無しさん
2010/04/30(金) 21:48:520590588
2010/04/30(金) 21:53:43C言語ね・・・
0591デフォルトの名無しさん
2010/04/30(金) 22:04:09#include使ったチート技じゃないかい?
0592側近中の側近 ◆0351148456
2010/04/30(金) 22:05:45(っ´▽`)っ
#error Hello, world!
0593デフォルトの名無しさん
2010/04/30(金) 22:16:04今日のアキバにしか存在できないと思ってた
0594デフォルトの名無しさん
2010/04/30(金) 22:16:23側近死ね
0595デフォルトの名無しさん
2010/04/30(金) 22:17:240596デフォルトの名無しさん
2010/04/30(金) 22:30:570597デフォルトの名無しさん
2010/05/01(土) 01:29:47int *p[5][10];
for(int i = 0; i < 5; i++){
for(int j = 0; j < 10; j++){
p[i][j] = cp++;
}
}
*cpのデータは外部モジュールから受け取る2次元の情報で縦、横のサイズは決まっている。
ここではとりあえずcallocで代入。
2次元として加工したいのでポインタの二次元配列を宣言して「それぞれの要素にポインタを代入していく」。
「それぞれの要素にポインタを代入していく」操作が結構まどろっこしいように思えるのですが、もう少しスマートな方法はありますか?
0598デフォルトの名無しさん
2010/05/01(土) 01:44:25まったく思いつかない。
どうやったんだ?
0599デフォルトの名無しさん
2010/05/01(土) 01:55:46問題の箇所以外ははしょってますが
#define LINE_BUF 1024
main(){
int i;
int num;
char rf[LINE_BUF];
scanf("%d", &num);
fflush(stdin);
fgets(rf, LINE_BUF, stdin);
}
-------
残っている改行文字をfflushして、
次のfgetsにいきたいのですが、fgetsがそのまま飛んでしまいます
改行文字が入力ストリームに残っている、という状態なのかと思いますが
まずいと思われる箇所を指摘していただけると幸いです
0600デフォルトの名無しさん
2010/05/01(土) 01:59:41コンパイラによっては使えることもあるけど
fflush(stdin);
は未定義動作
0601デフォルトの名無しさん
2010/05/01(土) 02:01:25scanf("%d", &num);
fflush(stdin);
↓
fgets(rf, LINE_BUF, stdin);
sscanf(rf, "%d", &num);
0602デフォルトの名無しさん
2010/05/01(土) 02:03:13fflush関係のページをいろいろ見てみます
夜分遅くに、早いレス大変助かりました
0603デフォルトの名無しさん
2010/05/01(土) 02:04:140604デフォルトの名無しさん
2010/05/01(土) 02:06:58これまた申し訳ございません
なるほど、こちらは一旦文字列をクッションに使う感じですね
こちらも後で試してみます
ありがとうございました
0605デフォルトの名無しさん
2010/05/01(土) 02:21:37fflush(stdin)
を
setbuf(stdin, NULL)
と変更することでちゃんと動いてくれました
>>601
こちらの方法でも無事確認出来ました
お二人ともどうもありがとうございました
0606デフォルトの名無しさん
2010/05/01(土) 02:37:00http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10583.c
上のテキストファイル(年別の平均気温などのデータ)の2列目のデータの小さいほうから順番に並べかえて、ファイルに出力するプログラムを作りたいのですがうまくいきません。
コンパイルは通るのですが、うまく作動しません
どこが違うんでしょうか?
なんかソートの部分がうまくいってない気がするのですが、よくわかりません
よろしくお願いします
0607デフォルトの名無しさん
2010/05/01(土) 03:48:20for( n=0 ; n < number ; n++ ){
for( j=n+1 ; n < number ; j++ ){
の2行目はj < numberかと
0608デフォルトの名無しさん
2010/05/01(土) 03:54:48// for( j=n+1 ; n < number ; j++ ){
for( j=n+1 ; j < number ; j++ ){
// for( n=0 ; n < number ; n++ ){
for( j=0 ; j < number ; j++ ){
0609607
2010/05/01(土) 04:01:49整形せずに見たらごらんの有様だよ
0610デフォルトの名無しさん
2010/05/01(土) 04:21:210611側近中の側近 ◆0351148456
2010/05/01(土) 07:30:02(っ´▽`)っ
for(int i = 0; i < 5; i++){
for(int j = 0; j < 10; j++){
p[i][j] = cp++;
}
}
の部分が、
memcpy(p, cp, sizeof(p));
でいけそうだが。どうだろう?
0612側近中の側近 ◆0351148456
2010/05/01(土) 07:35:27メモリ上の表現がpとcpで同じってところがポイントな。
どちらも、sizeof(int *)*50 バイト分、連続した領域が確保されている。
0613デフォルトの名無しさん
2010/05/01(土) 07:40:540614側近中の側近 ◆0351148456
2010/05/01(土) 07:42:16cpとcを同じ共用体で定義すれば、コピーが不要になる。
union U
{
int *cp;
int *c[5][10];
};
0615側近中の側近 ◆0351148456
2010/05/01(土) 07:46:23(っ´▽`)っ cpは実体の配列、cは各々のポインタの配列だったか・・・。
しにたい
0616側近中の側近 ◆0351148456
2010/05/01(土) 07:55:51(っ´▽`)っ ダブルポインターにしないとね☆
union U
{
int **cp;
int *c[5][10];
};
0617デフォルトの名無しさん
2010/05/01(土) 10:18:190618デフォルトの名無しさん
2010/05/01(土) 10:20:220619梓川水乃 ◆0351148456
2010/05/01(土) 12:57:35(っ´▽`)っ そうだね☆
0620デフォルトの名無しさん
2010/05/01(土) 13:18:54http://codepad.org/JhFT5Ged
http://codepad.org/KW2MGMGe
単純過ぎるくらい単純にしないと当方バカなので3日後に読めないのです
0621606
2010/05/01(土) 15:07:0700000000000000000000000000000000000000みたいな感じになっちゃってます
0622デフォルトの名無しさん
2010/05/01(土) 15:20:23後半のはfprintfのループのところだぞ?
0623597
2010/05/01(土) 15:28:27それだと2重ポインタの方が0x00000000のままなので、
渡されるデータの位置アドレスと、配列の先頭アドレスとで共用してくれません。
私の例ではポインタの2次元配列にしていますが、2次元配列(ポインタではない)の先頭アドレス=渡されるデータの位置アドレス
となればそれが一番いいのですけど…
int hairetu[5][10];
int **p = hairetu;
これの逆バージョン…
int *p = (int *)0x********;
int a;
&a = p;
無茶ぶりですが配列無しでいえばこんな動作…やっぱり無理な気がしてきました。
0625デフォルトの名無しさん
2010/05/01(土) 15:50:06やりたいことがいまいちわからない
こういうことかな?
union tag_hoge_t
{
int cp[50];
int c[5][10];
}hoge_t;
int *p=(int*)0x********;
hoge_t *q=(hoge_t*)p;
q->cp[10]==q->c[1][0];
============================================================
それともこうかな?
int *cp=(int*)0x********;
int (*c)[10]=(int*[10])cp;
c[1][1]==cp[11];
0626デフォルトの名無しさん
2010/05/01(土) 16:03:45訂正
int (*c)[10]=(int(*)[10])cp;
0627597
2010/05/01(土) 16:20:26ズバリそれです!!どちらでも理想の動作でした!
共用体のポインタもできるんですね。
後者は仕組みがよくわからないのでもう少し考えてみます。
後者の方がスマートで見た目がわかりやすいのでそちらを利用したいと思います。
以下に自分のやりたいことの完成形を載せておきます。
ありがとうございました!
union tag_hoge_t
{
int c[5][10];
};
int *p=(int*)0x********;
tag_hoge_t *q=(tag_hoge_t*)p;
if(q->c[1][0] == 10)…
============================================================
int *p=(int*)0x********;
int (*c)[5][10]=(int (*)[5][10])p;
if((*c)[1][0] == 10)…
0628597
2010/05/01(土) 16:25:34後者はポインタの配列ではなく、配列のポインタになっているんですね
勉強になりました!
0629デフォルトの名無しさん
2010/05/01(土) 20:30:06http://www.seikei.or.jp/kakubu/rehabili/IMG_02691.JPG
私たちが当院の言語聴覚士です 宜しくお願いします
http://www.yushinkai.jp/hakodate/design/image/come/reha/Ststh.jpg
言語聴覚士を目指す高梨さん
http://www19.atpages.jp/imagelinkget/get.php?t=v&u=www.tokai-med.ac.jp/kagaku/gakka_st/images/real_photo1.jpg
理学療法士 作業療法士 言語聴覚士
http://www.ims.gr.jp/ohtafukushima/images/section/photo_section_05.jpg
0630デフォルトの名無しさん
2010/05/02(日) 11:54:320631デフォルトの名無しさん
2010/05/02(日) 12:22:150632デフォルトの名無しさん
2010/05/02(日) 13:13:26int main(void)
{
int a, b;
printf("キーボードから数値を入力してください");
printf("数値1を入力してください:"); scanf("%d", &a);
printf("数値2を入力してください:"); scanf("%d", &b);
printf("10割る3は、%d余り%dです。\n", a / b, a % b);
return (0);
}
8行目が違うっぽいんだけど、なんで?
0633デフォルトの名無しさん
2010/05/02(日) 13:14:390634デフォルトの名無しさん
2010/05/02(日) 13:15:19scanfの前が全角スペースになってる
0635デフォルトの名無しさん
2010/05/02(日) 13:16:13printf("%d割る%dは、%d余り%dです。\n", a, b, a / b, a % b);
0636デフォルトの名無しさん
2010/05/02(日) 13:20:22ありがとう!
0637デフォルトの名無しさん
2010/05/02(日) 14:23:17char ch = '\0'
って書いてあるんだけど、この\0ってエスケープシーケンスの「\xxx:8進数でxxxの文字コードを持つ文字」って解釈で良いんですかね?
xxxだから数字が3文字(例えばnullを表す場合は\000のように)じゃなきゃいけないと思ってたんだけど、
上の例みたいに数字1文字で表せる場合は省略しちゃっても良いんですか?
0638デフォルトの名無しさん
2010/05/02(日) 14:51:100639637
2010/05/02(日) 14:52:170640デフォルトの名無しさん
2010/05/02(日) 15:04:430641637
2010/05/02(日) 15:06:31xxxっていうのは要するに一般化された時の便宜で3文字表記になってただけなんですね。
0642デフォルトの名無しさん
2010/05/02(日) 15:07:380643デフォルトの名無しさん
2010/05/02(日) 15:12:58厳密には\0とNULLはちげーよって言うエライ方のお話はとりあえず置いておいて
0644637
2010/05/02(日) 15:15:50このような表記のされ方で、既に読んだ部分に書いてある知識がエスケープシーケンスしかなかったのです・・・
本は結構親切な部類に入るんですけど、文字型変数を初期化する時の'\0'っていきなり出てきたので混乱してますorz
エスケープシーケンスじゃないんですか?
0645デフォルトの名無しさん
2010/05/02(日) 15:19:470646デフォルトの名無しさん
2010/05/02(日) 17:58:39\で始まる表記なので、エスケープシーケンスという解釈であってるよ。
0647デフォルトの名無しさん
2010/05/02(日) 20:13:31だね
0648デフォルトの名無しさん
2010/05/02(日) 22:53:36printf(""""); こんなことやっても出てこないので泣きそうです・・・
0649デフォルトの名無しさん
2010/05/02(日) 22:55:06"\"\""
0650デフォルトの名無しさん
2010/05/02(日) 22:55:210651デフォルトの名無しさん
2010/05/02(日) 22:57:00ありがとうございます!!
0652デフォルトの名無しさん
2010/05/02(日) 23:49:47いきなりprintfでダブルコーテションどうやんの?とか釣りだろ
0653デフォルトの名無しさん
2010/05/02(日) 23:54:14頭の悪い奴だよなw
0654デフォルトの名無しさん
2010/05/03(月) 00:05:58行が長いときの行末に置く¥あるじゃないですか
行末は良いんだけど、数行になると、そこ数行だけ行頭から始まるのが嫌なんだけど
あれをインデントしても良い方法ってないすか?先生方よろしくお願いします
0655デフォルトの名無しさん
2010/05/03(月) 00:07:310656デフォルトの名無しさん
2010/05/03(月) 00:11:45一旦ダブルクォートを閉じればいい
char foo[]="ABC"
"DEFG"
"H";
0657デフォルトの名無しさん
2010/05/03(月) 00:44:220658デフォルトの名無しさん
2010/05/03(月) 02:10:090659デフォルトの名無しさん
2010/05/03(月) 16:19:16画面に1個の文字Aを書く手続きであるとする。
int f(int x){
display();
if(x==0)return 1;
if(x==1)return 3;
if(x==2)return 5;
return(f(x-1)+f(x-2)+f(x-3));
}
いま、f(x)を呼び出したとき、値105が返された。このf(x)が呼び出されてから
値を返すまでの間に、文字Aは画面にいくつ書かれたか。
1.43 2.44 3.45 4.46 5.47
すみませんが、このプログラムを文章に言い換えてもらえないでしょうか?
0660デフォルトの名無しさん
2010/05/03(月) 17:05:340661デフォルトの名無しさん
2010/05/03(月) 17:10:58下記の二式 f(x) および g(x) が与えられている
f(x)=f(x-1)+f(x-2)+f(x-3)
f(0)=1
f(1)=3
f(2)=5
g(x)=1+g(x-1)+g(x-2)+g(x-3)
g(0)=g(1)=g(2)=1
f(x)=105 であるとき g(x) はいくらになるか?
0662デフォルトの名無しさん
2010/05/03(月) 17:15:21x<=3の時、
f(0)=1
f(1)=3
f(2)=5
だな
0663デフォルトの名無しさん
2010/05/03(月) 17:27:36x≧3とx<3
0664デフォルトの名無しさん
2010/05/03(月) 18:08:570665デフォルトの名無しさん
2010/05/03(月) 19:51:510666デフォルトの名無しさん
2010/05/03(月) 19:54:470667デフォルトの名無しさん
2010/05/03(月) 19:55:470668デフォルトの名無しさん
2010/05/03(月) 19:58:060669デフォルトの名無しさん
2010/05/03(月) 19:58:320670デフォルトの名無しさん
2010/05/03(月) 20:08:580671デフォルトの名無しさん
2010/05/03(月) 20:10:25ありがとうございます
ところで
>g(x)=1+g(x-1)+g(x-2)+g(x-3)
>g(0)=g(1)=g(2)=1
はどこから出てきたんでしょうか?
0672デフォルトの名無しさん
2010/05/03(月) 20:13:120673デフォルトの名無しさん
2010/05/03(月) 21:25:43x=0,1,2 の時は 1回書いて 抜ける: g(0)=g(1)=g(2)=1
それ以外では 1回書いた後、
0674デフォルトの名無しさん
2010/05/03(月) 21:26:58あとはわかるな
0675デフォルトの名無しさん
2010/05/03(月) 23:19:1664bitの場合でも同じですか?
0676デフォルトの名無しさん
2010/05/03(月) 23:21:170677デフォルトの名無しさん
2010/05/03(月) 23:22:280678デフォルトの名無しさん
2010/05/03(月) 23:51:340679デフォルトの名無しさん
2010/05/04(火) 00:05:48それはそれで忘れちゃダメだろ
0680デフォルトの名無しさん
2010/05/04(火) 00:14:200681デフォルトの名無しさん
2010/05/04(火) 00:15:458バイトだよ
main() {
printf("%u", sizeof(void*));
}
0682デフォルトの名無しさん
2010/05/04(火) 00:25:49int 型は、おおよそデータバスのビット数にあわすことが多いが
ポインタは、おおよそアドレスバスのビット数にあわすことが多い
アドレスレジスタが単純に並ばない 変態的な環境もあったのさ:
16ビットレジスタx2 を使って 24ビット物理アドレス を指す。
0683デフォルトの名無しさん
2010/05/04(火) 00:28:10環境書かなきゃ全く意味無いよ
0684デフォルトの名無しさん
2010/05/04(火) 00:33:360685デフォルトの名無しさん
2010/05/04(火) 04:44:08結局はいまだ1バイト8ビットじゃん。
そろそろ進化させないのか?
C言語の生まれたPDP-11でさえ10ビットあったのに。
俺に言わせりゃi7もPhenomも8ビットCPUだよ。
進歩してない。
0687デフォルトの名無しさん
2010/05/04(火) 09:09:35確かに1バイトは8ビットだけど、いまどきワード以外のデータを
使うなんて貧乏人だけだよ
C言語のcharとかshortとか互換性のためだけに残ってるけど
富豪は常にintですよ。0か1のフラグ変数にもint使いますよ
しかもILP64ですよ
0688デフォルトの名無しさん
2010/05/04(火) 10:11:45○キャッシュ効率のことが頭にないバカだけ
0689デフォルトの名無しさん
2010/05/04(火) 11:11:280690デフォルトの名無しさん
2010/05/04(火) 11:33:45すげぇな
0691デフォルトの名無しさん
2010/05/04(火) 12:54:318086でMS-DOSの頃
16ビット(64KB)の範囲しか扱わないモードと1MBアクセスできるモードがあって
使い分けていた。今でもfarとかnearという残骸を見ることあるでしょ?
0692デフォルトの名無しさん
2010/05/04(火) 14:19:06WIndows95の頃Morland-C++5.0を買ったんだが、えらくぶ厚い
マニュアルが数冊入っていて、今では考えられない位に8086のアーキテクチャ
を詳しく解説してあった
Windows3.1もまだまだ現役だった頃なので、STRICTを使ったプログラミング
も非常に克明に書いてあって、今読み返すと「ああこの頃はまだコンパイラ
メーカはやる気があったんだなあ」と思わせる
0693デフォルトの名無しさん
2010/05/04(火) 14:20:17×Morland-C++
○Borland-C++
昼間から酒飲めるのは今日までか・・・orz
0694デフォルトの名無しさん
2010/05/04(火) 15:35:54unsigned short Value;
Value = ((unsigned short)('AB'));
コンパイルされたアセンブリソースを見ると期待通りの結果になっているのですが、
移植等を考慮した場合、この書き方は避けるべきなのでしょうか?
movw ax,#04142H
分野は組込で、コンパイラはNECのものですが、エラーも警告もなしで通ります。
ググってみたものの、'A'については記述があるものの、期待する記述には出会えませんでした。
どうか、よろしくお願い申し上げます。
0695デフォルトの名無しさん
2010/05/04(火) 16:02:520696デフォルトの名無しさん
2010/05/04(火) 16:05:452文字以上を含む(例えば 'ab')又は1バイトの実行文字で表現できない文字若しくは逆斜線表記を含む単純文字定数の値は, 処理系定義とする。
0697デフォルトの名無しさん
2010/05/04(火) 16:23:260698デフォルトの名無しさん
2010/05/04(火) 16:24:34ありがとうございました。
時間があるときにJIS X3010:2003をよく読んでみます。
0699デフォルトの名無しさん
2010/05/04(火) 19:08:56志村、エンディアン!エンディアン!
0700デフォルトの名無しさん
2010/05/04(火) 19:11:45この関数はEOFに達するとNULLを返すとのことですが、
FILE *fp;
char str[8];
while(fgets(str, 8, fp)){
printf("%s",str);
}
とやってファイルの内容を出力していった場合、最後はEOFが来てNULLが
返るので、最後のprintf1回が実行されないような気がするのですが、
そうではないようです・・・。それとも1文字ずつ判定してそのたびにprintfを
実行しているのでしょうか?
0701デフォルトの名無しさん
2010/05/04(火) 19:16:50書き込んだ状況でEOFが来てもフラグを設定するだけで
NULLは返さず次回の同じFILE*にたいする呼び出し時に
NULLを返す設計が取られるんじゃないかと...
(標準仕様でもそれが期待されているようだし)
0702デフォルトの名無しさん
2010/05/04(火) 19:21:52ファイルの終端に達している状態でfgets()を呼ぶとEOFを返す
0703デフォルトの名無しさん
2010/05/04(火) 19:22:50意味を勘違いしてる
最後の文字までとりこむfgetsではNULLを返さず
その次のfgetsでNULLを返すの
0704デフォルトの名無しさん
2010/05/04(火) 19:25:39ありがとうございます!
なるほど理解できました。
0705デフォルトの名無しさん
2010/05/04(火) 22:42:34質問です。
#include <stdio.h>
#include <string.h>
void main(void)
{
char name[5];
int len;
do{
printf("お名前を入力して下さい\t");
scanf("%s",name);
len = strlen(name);
} while(len>5);
printf("\nあなたのお名前は %s です。\n", name);
}
これでname[5]の配列に30文字くらい打ち込んで終了させると、
OSのほうから終了時にエラーが出されます。
メモリに打ち込んだ文字が残ってるからだと聞いたことがあるのですが、
これらの記録を消去して、エラーを出さないようにするにはどういうことをすればよいのでしょうか。
0706デフォルトの名無しさん
2010/05/04(火) 22:50:24200以上入力しようとするやつは知らん
0707デフォルトの名無しさん
2010/05/04(火) 22:56:160708デフォルトの名無しさん
2010/05/04(火) 23:14:08エラーがでるのはスタックに積んであるリターンアドレスをぶっこわしてるから
scanf("%4s",name);
とかやって、そもそも配列外にアクセスしないことが大事
0709デフォルトの名無しさん
2010/05/06(木) 12:16:27その考えは身を滅ぼす。gets()を使うくらい、下策。
どうせscanf()を使っているのだから>708が妥当。
0710デフォルトの名無しさん
2010/05/06(木) 17:44:360711デフォルトの名無しさん
2010/05/06(木) 17:51:47だからなんだってんだよ・・・・・・・・・・・・・
0712デフォルトの名無しさん
2010/05/06(木) 19:16:58お前は何を言っているんだ
0713デフォルトの名無しさん
2010/05/06(木) 19:21:550714デフォルトの名無しさん
2010/05/06(木) 19:25:490715デフォルトの名無しさん
2010/05/06(木) 19:28:230716デフォルトの名無しさん
2010/05/06(木) 19:31:22携帯開発部隊の方ですか?
0717デフォルトの名無しさん
2010/05/06(木) 19:31:350718705
2010/05/06(木) 21:19:16バグ取れました。
次からはsscanfにすればいいのですね、ありがとうございました。
0719デフォルトの名無しさん
2010/05/06(木) 22:04:51printfの戻り値を毎回確認してからしゃべれ、クソが
0720デフォルトの名無しさん
2010/05/07(金) 11:07:13なにも考えずにつかっていたが、printfって戻り値があったのかw
0721デフォルトの名無しさん
2010/05/07(金) 11:48:440722デフォルトの名無しさん
2010/05/07(金) 11:51:020723デフォルトの名無しさん
2010/05/08(土) 00:42:00#include <stdio.h>
#include <stdlib.h>
char *input(void){
int i; char aaa[8]; int count =0; char *bb="";
printf("番号入力する");
scanf("%07s",aaa);
fflush(stdin);
while (aaa[count]){
count++;
}
for (i=0;i<count;i++){
*(bb+i)=aaa[i];
}
return(bb);
}
int main (void){
int i; char *p;
i=atoi(input()); printf("%d\n",i);
p=input(); printf("%s\n",p);
return(0);
}
これで実行してみると、printf("%s\n",p);で表示される文字の5桁目だけ、数字が入力時から+1された状態になります。
何故このようなことが起きるのでしょうか。
正しい表示にするにはどうすればよいのでしょうか?
0724デフォルトの名無しさん
2010/05/08(土) 01:17:34とんでもないことしてくれてるな
0725デフォルトの名無しさん
2010/05/08(土) 01:20:100726デフォルトの名無しさん
2010/05/08(土) 01:21:040727デフォルトの名無しさん
2010/05/08(土) 01:44:32何をしたいプログラムなのかわからないが、差し当たりの問題点を指摘する。
char *bb=""; は、コンパイラによっては書き込み不可領域に配置される場合があり、
実行時に落ちる気場合がある。
また、"" のみで初期化した場合、確保される領域は 2 バイトであるため、バッファ
オーバーフローを起こす可能性がある。
これらを防ぐには、malloc() でメモリ領域を動的に確保するか、main() 側でバッファ
を用意して input() に渡し、そこに入力結果を書き込むようにする。
なお、malloc() を使用する場合は必ず呼び出し側 (こごては main()) で戻り値を
記憶し、入力結果が不要になった時点で free() すべき。
0728デフォルトの名無しさん
2010/05/08(土) 02:52:30・fflush(stdin)は環境依存なので避けた方がいい。
・数値入力用関数を作る積もりなら戻り値は整数の方が使い易くないか?
・scanf()の書式指定で'0'なんてあったか? printf()系の書式指定とは互換性がないと思った方がいい。
・returnは関数じゃないから括弧はつけない方がいい。まぁ、どうしても括弧つけたいなら止めないが。
・ポインタに対する単項の*演算子は厳格なコーディング規約では禁止される。意味的に等価なbb[i]を使うべき。
・演習目的なら止めないが、文字列のコピーは専用の標準関数を使うべき。
0729デフォルトの名無しさん
2010/05/08(土) 03:30:52えっ
ってのが二つ三つ……
0730デフォルトの名無しさん
2010/05/08(土) 03:34:22kwsk
0731デフォルトの名無しさん
2010/05/08(土) 04:18:26ってのが全部なんだが……
>・fflush(stdin)
意図が分からないので書くべきコードでは無い
>・数値入力用関数
はてな
>・scanf()の書式指定で'0'なんてあったか?
あるといえばある
>書式指定とは互換性がない
何を今さら
>・returnは関数じゃない
何を今さら
>・ポインタに対する単項の*演算子は厳格なコーディング規約では禁止される
大変なところに迷い込んでしまいましたね、読みやすさを重視して時には間接参照しましょう
スワップ関数はマクロですか、memcpy()ですか、汎用ポインタですか
>文字列のコピーは専用の標準関数を使うべき
文字列のコピーをしようとしたわけでは無いかもしれない
といってみるテスト
0732デフォルトの名無しさん
2010/05/08(土) 04:27:54何か勘違いしているようだから一言。
>>・ポインタに対する単項の*演算子は厳格なコーディング規約では禁止される
これは文字通り、*(p+i)と書かずにp[i]と書けということ。
厳格なコーディング規約ではこのほか、ポインタ演算も禁止される場合がある。
そうそう、scanf()の書式指定では'0'は特別な意味を持たないようだね。
単純に幅指定の一部と見做されるのかな。この辺りは仕様を読み直さないとなんとも言えない。
その他は趣旨が不明なので割愛。
0733デフォルトの名無しさん
2010/05/08(土) 09:28:17実行するとSegmentation faltでこけるよ。
色々おかしいところがありすぎて、何がしたいのかよくわかりません。
入力文字列を数値に変換したいように見えるが、atoi使ってイイなら
文字列をそのままつっこめばいいし、scanf使ってイイなら%d使えよ
という気がする。
ま、一番の問題は>724の指摘通り;
*(bb+i)=aaa[i];
だね。
bbは書き換え可能な有効な領域を指していない。
0734デフォルトの名無しさん
2010/05/08(土) 09:40:37「厳格なコーディング規約」ってのは何?
いずれにしても
・ポインタに対する単項の*演算子禁止
・ポインタ演算も禁止
っていうコーディング規約は賛同できない。
>これは文字通り、*(p+i)と書かずにp[i]と書けということ。
何が文字通りなのかわからんが、p[0]ではなく
*pと書くべきケースは、少なからずありますよ。
>ポインタ演算も禁止される場合がある。
揚げ足とるようですまないが、文法を厳格に解釈すれば、
p[i]は*(p + i)のシンタックスシュガーでしか無いので、これも禁止されるように
読めてしまう。こうなるとまともなコーディングは無理。
「厳格なコーディング規約」というからには、しょうもないつっこみを
受けないような、「厳格な」表現を使ってください。
0735デフォルトの名無しさん
2010/05/08(土) 09:42:36知識不足は恥じゃないけどねぇ。
今出掛けるんで、あとで資料を提示するよ。
0736デフォルトの名無しさん
2010/05/08(土) 10:02:06ご指摘のとおり、数値文字のみを文字列型で入力させて
その文字列をメインで受け取る入力用関数を作れという演習目的の課題でした。
質問の仕方が悪くて混乱させてしまい、すみません。
ご指摘ありがとうございました。
0737デフォルトの名無しさん
2010/05/08(土) 10:12:450738デフォルトの名無しさん
2010/05/08(土) 12:43:57(仮引数で拾った文字列).cに置換する方法をご教授願えないでしょうか。
以下がソースです。
色々突っ込みどころがあると思いますが宜しくお願いします
#define LEN_MAX 256
int FileRewrite(char *proj_name)
{
FILE *fp;
char *search_p;
char replace_p;
char line_buff[LEN_MAX];
char tar_buff[LEN_MAX];
char rep_buff[LEN_MAX];
char source_name[LEN_MAX];
sprintf(source_name, "./%s/Source/%s.c", proj_name, proj_name);
if ((fp = fopen(source_name, "r+")) == NULL){
fprintf(stderr, "file open error...¥nexit status(-100)¥n");
exit(EXIT_FAILURE);
}
strcpy(tar_buff, "*.c");
while (fgets(line_buff, LEN_MAX, fp) != NULL) {
search_p = strstr(line_buff, tar_buff);
if (search_p != NULL) {
sprintf(rep_buff, "// %s.c¥n", proj_name);
rtn = fputs(rep_buff, search_p);
}
}
fclose(fp);
return (0);
}
0739デフォルトの名無しさん
2010/05/08(土) 12:57:08ソースファイル内の *.c という文字列を全て置換するの?
ソースファイルのコメント中の *.c という文字列を全て置換するの?
0740デフォルトの名無しさん
2010/05/08(土) 13:02:17ソースファイルのコメント中の *.c という文字列です。
紛らわしくて申し訳ないです。
*.cという文字列は読み込みファイルの中に1つしかないので全てでもアリだと思います。
0741デフォルトの名無しさん
2010/05/08(土) 15:16:52ほい、一例を。
ttp://sec.ipa.go.jp/reports/20050523/coding_guide.pdf
こいつの14ページ目辺りにポインタ演算について書かれているよ。
但しこいつは、逆参照自体はNGとはしていないけれど。
まぁ少なくとも、糖衣構文を理由に双方を適合とはしないということは判ると思う。
0742デフォルトの名無しさん
2010/05/08(土) 15:29:10Cでやるよりsedやawkでやった方が楽な気がするけど。
sed -e 's/\*\.c/proj.c/' source > destination
該当ファイルを検索する辺りから含めてシェルスクリプトで書けば管理も楽だろうし。
Cでやりたいなら、以下に注意。
--
・読み込みバッファと書き出しバッファの共有は無茶
仮令"r+"でオープンしても、読み込みと書き出しは混在できない。
1行読んだら読む前の場所まで巻き戻してから書けば書けなくはないが、
行の長さが長くなるので次の行(の先頭)を潰してしまう。
あれこれ気を遣うくらいなら、一旦別のファイルに書いた方がいい。
・「*.c」が含まれる行は本当にそのコメント形式だけなのか
例えば「// *.c (ここに重要なコメント)」のようになっていたら、
そのコメントを潰してしまうことになる。
そこに気を遣うくらいなら、「*.c」を置換するに留めるべき。
尚、置換処理自体はsprintf()で%*.*sを駆使すれば数行で書ける。
0743デフォルトの名無しさん
2010/05/08(土) 15:29:43int main(void){printf("%[d]"[2+3-1])}
の計算cygwinでやったんですが、でてきません。
どこが間違ってるでしょう?
一〇進の計算です。4とでてきません
基礎すぎてすいません・・・
0744デフォルトの名無しさん
2010/05/08(土) 15:34:12・コンパイルエラーが出る場合はエラーメッセージを貼りましょう。
・何か参考にした資料があるなら明記しましょう。
まぁ、突っ込みどころは山ほどあるけど正解を以下に。
--
#include <stdio.h>
int main()
{
printf("%d\n", 2 + 3 - 1);
return 0;
}
--
尚、空白・改行は適宜変更してもいいが、記号類は省略も追加もしないこと。
0745デフォルトの名無しさん
2010/05/08(土) 15:43:40レスありがとうございます。
ですが
それでやってみたところ
chmod:missing operand after `755'
Try `chmod--help'' for more inormation.c
とでてきたんですが??
755ってなんですか?ずっと755がでるんですが
0746デフォルトの名無しさん
2010/05/08(土) 15:52:35「ポインタに対する単項の*演算子禁止」なんて規約が存在する、
というのは嘘でしたってことでいいのね?
0747デフォルトの名無しさん
2010/05/08(土) 15:54:31コマンドラインパラメータの不足
C言語関係なし
コンパイル方法(打ち込む文字)が間違ってる
0748デフォルトの名無しさん
2010/05/08(土) 15:56:260749デフォルトの名無しさん
2010/05/08(土) 15:59:58エラーメッセージを貼るときはきちんと貼りましょう。
また、自分が何をやったらそうなったのか、必要ならコマンドラインのコピーも交えて説明しましょう。
まぁ、最早Cの問題じゃないことは>747の言う通り。
このまま続けたいならエスパースレへ。
0750デフォルトの名無しさん
2010/05/08(土) 16:00:40gcc(ファイル名>>744のソース)をするとerrorがでました。
コンパイルエラーというのはプログラムの中身にエラーがあるとき
出るのですよね?
0751デフォルトの名無しさん
2010/05/08(土) 16:02:28取り敢えず、コマンドラインを貼れないならソースファイル名を晒してみようか。
0752デフォルトの名無しさん
2010/05/08(土) 16:23:32missing operandだからソースファイル名がちゃんと入力されていないか、
コンパイルエラーでオブジェクトが生成されなくてリンカの手前でエラーが出てるかだと思う
0753デフォルトの名無しさん
2010/05/08(土) 16:47:51コンソールを全部引用しろよ
お前クラスの素人の場合、普通の人が想像もしないことを
やってるから、抜粋すると解決しない
だいたい勝手にchmodが動くわけないし、誰かの作ったMakefileを
流用してるとかで、どっかで起動してるんじゃねーの
0754734
2010/05/08(土) 18:37:34参照資料を見たけどさ、
「ポインタへの整数の加減算は使用せず、確保した領域への参照・代入は[]を用いる
配列形式で行う。」
としか書かれていないよ。
ポインタ演算禁止とは書かれておらず、丁寧に
「ポインタの演算を行う場合には、ポインタの指す範囲に気を付ける。」
と書いてある。
技術用語には「厳格な」定義があるので、勝手にねじ曲げないように。
>728で挙げている、あなたの感覚はおおむね間違っていないが、
理由付けからは、根本的な理解の甘さがかいま見える。
そのせいで、色々つっこまれている。
今回引っかかった表現は
×「ポインタに対する単項の*演算子は厳格なコーディング規約では禁止される。」
×「ポインタ演算も禁止される場合がある」
0755デフォルトの名無しさん
2010/05/08(土) 18:45:08すでにつっこみが入っているが、何をやっているのかさっぱりわからない。
>やってみたとは、プログラムの実行です。
>gcc(ファイル名>>744のソース)をするとerrorがでました。
2行目でやっていることはコンパイルであって、プログラムの実行では無いぞ。
コンパイル中にchmodが勝手に走るなんてことは無いと思うけど。
>コンパイルエラーというのはプログラムの中身にエラーがあるとき
>出るのですよね?
chmod:missing operand after `755'
Try `chmod--help'' for more inormation.c
これはコンパイルエラーではない。chmodのエラーで、引数が無い
という意味。なんでchmodが出てくるのか、想像できない。
コンソールをそのままコピペして貼り付けてみたら?
もっともCの問題ではないと思えるが。
0756デフォルトの名無しさん
2010/05/08(土) 19:42:10すまん、弟に聞いたらできたよ。
gcc OOO.c
a.exe
で実行でできた、あなたが間違ってるとかじゃなかったから
ごめん。
また来るよ。
0757デフォルトの名無しさん
2010/05/08(土) 19:44:13char型の'1'をint型の1にしたいんですけど、テストしたら49になってしまう
どうやったらいいです?
0758デフォルトの名無しさん
2010/05/08(土) 19:45:170759デフォルトの名無しさん
2010/05/08(土) 19:47:08今VBでやってるんだが、
ほかのコンパイルでもそれで結果同じになるならいいんだがどうなんです?
0760デフォルトの名無しさん
2010/05/08(土) 19:47:490761>>757
2010/05/08(土) 19:57:04while文で、ひとつずつchar型の数字をint型にしたいんだがどうすればいいんだorz
0762デフォルトの名無しさん
2010/05/08(土) 20:07:34VBの質問ならVBスレへどうぞ。
0763デフォルトの名無しさん
2010/05/08(土) 20:08:23誤解させてすまぬ
0764デフォルトの名無しさん
2010/05/08(土) 20:20:39int i, n[ 5 ];
char s[] = "12345";
for( i = 0; i < 5; ++i )
n[ i ] = s[ i ] - '0';
0765デフォルトの名無しさん
2010/05/08(土) 20:22:44ありがとうございます!
あとでやってみます
0766デフォルトの名無しさん
2010/05/08(土) 20:25:44char型の数字をint型に
int intsuji = charsuji - 48;
while文で、ひとつずつひとつずつ
何をしたいの?
0767デフォルトの名無しさん
2010/05/08(土) 20:29:30char型に入ってる数字を一文字ずつint型にいれるっていうことを
配列でやってるんでなんか簡単にまとめられないものかとおもって;
0768デフォルトの名無しさん
2010/05/08(土) 21:05:44やりたいことを具体的に書いた方がいいよ。
0769デフォルトの名無しさん
2010/05/08(土) 21:34:22そうですね、あんまつたわらないしよくなかったとおもいます
こんどからそうします;
>>764
そのやり方でできました。ありがとうございます。
0770デフォルトの名無しさん
2010/05/08(土) 22:39:41int main(void)
{
printf( "%d - %X + %o = %d\n", 398, 1FB , 327 ,398-1FB+37 );
return 0;
}
これどこが間違ってますか?cygwinでこれを実行したら前のプログラミングがでました。
間違えたプログラミングだと実行したら前やった実行がそのまま出るっぽいです。
0771デフォルトの名無しさん
2010/05/08(土) 22:41:391FB じゃなくて 0x1FB じゃないの?
0772デフォルトの名無しさん
2010/05/08(土) 22:47:54なぜ0xをつけるんですか??!??!
あと質問ですが何故int main()っているんですか?
printfだけじゃだめなんですか?ただの数値計算なんですが・・・
0773デフォルトの名無しさん
2010/05/08(土) 22:48:45できたwww0xつけたらできた。涙出てきたわ。ほんまありがとう
また来るよ。
0774デフォルトの名無しさん
2010/05/08(土) 22:50:010775デフォルトの名無しさん
2010/05/08(土) 23:23:231FBって16進だろ
16進ってことを表すのが0x
c言語はint main()っていれなきゃいけない
これは関数だからc言語は関数型言語
0776デフォルトの名無しさん
2010/05/08(土) 23:24:37手続き型言語じゃないの
0777デフォルトの名無しさん
2010/05/08(土) 23:42:42わかるとなんでわからなかったのかわからなくなる
0778デフォルトの名無しさん
2010/05/08(土) 23:51:21えっ
0779デフォルトの名無しさん
2010/05/09(日) 00:09:040780デフォルトの名無しさん
2010/05/09(日) 00:10:49C言語を発明した人がそう決めた。
ほかの言語だとファイルの先頭からいきなり始まるやつもあるし、そういうわけわかんないルールを
覚えるのも含めてプログラミングの勉強だから。
0781デフォルトの名無しさん
2010/05/09(日) 00:50:350782デフォルトの名無しさん
2010/05/09(日) 07:49:110783デフォルトの名無しさん
2010/05/09(日) 12:11:220784デフォルトの名無しさん
2010/05/09(日) 12:21:320785デフォルトの名無しさん
2010/05/09(日) 12:38:36じゃぁWinMain使うときはどういう扱いなの?
0786デフォルトの名無しさん
2010/05/09(日) 12:43:570787デフォルトの名無しさん
2010/05/09(日) 12:56:59規格ではフリースタンディング環境に分類される
OS はないことになっているので、あくまで利用者定義ライブラリという位置づけ
0788デフォルトの名無しさん
2010/05/09(日) 13:00:50ありがとうございました
0789デフォルトの名無しさん
2010/05/09(日) 15:54:38#include <iostream>
using namespace std;
static char *plus(char *fp_c, char *fp_c2);
int main()
{ char buf[]="ab,cde,fghi",buf2[100];
char *fp_c,*fp_c2;
fp_c=buf;
fp_c2=buf;
fp_c2=fp_c2+2;
*fp_c2=0x00;
strcpy(buf2,fp_c);
cout << buf2 << '\n';
fp_c,fp_c2= plus(fp_c,fp_c2);
fp_c2=fp_c2+3;
*fp_c2=0x00;
strcpy(buf2,fp_c);
cout << buf2 << '\n';
return 0;}
char *plus(char *fp_c, char *fp_c2){
return fp_c2++; //1進める
return fp_c=fp_c2;}
関数plusの中でポインタを1進める物を作ろうとしたのですが
実行すると、関数の中に入ってないのか、先頭のポインタに戻っているのか
上手くいきません。上手く関数を使いポインタを進めるにはどうしたらよいのでしょう?
0790デフォルトの名無しさん
2010/05/09(日) 16:33:21っていうかスレチ
0791デフォルトの名無しさん
2010/05/09(日) 21:45:19今度学校の授業でモジュラス10ウェイト3のC言語のソースを書くことになったのですが、どのように入力した
数値を使ってチェックコードを導くのか苦戦しています。
どのような方法で考えればいいか教えてください。
0792デフォルトの名無しさん
2010/05/09(日) 21:46:150793デフォルトの名無しさん
2010/05/09(日) 22:31:020794デフォルトの名無しさん
2010/05/09(日) 22:36:40scanfで数値を取得して、後は粛々と計算で終了では?
何を苦戦しているのか全くわからない。
0795デフォルトの名無しさん
2010/05/09(日) 23:24:40すでに入力されている文字列"12345678"があるとして、 "1234"だけを表示させて後は表示させないにはどうすればよいのでしょうか。
%cで一つずつ表示しか思いつかなかったのですが、よい方法はありますか?
0796デフォルトの名無しさん
2010/05/09(日) 23:34:49#include<stdio.h>
int main(void)
{
char buf[256]="12345678";
printf("%.4s", buf);
return 0;
}
0797デフォルトの名無しさん
2010/05/09(日) 23:34:540798デフォルトの名無しさん
2010/05/09(日) 23:35:080799795
2010/05/10(月) 01:51:590800デフォルトの名無しさん
2010/05/10(月) 02:29:34#include<stdio.h>
main(){
char a,b;
scanf("%c",&a);
printf("%c",a);
scanf("%c",&b);
printf("%c",b);
return 0;
}
これを実効すると
一つ目の文字を入力した時点で終了してしまうのですが何故でしょうか?
0801デフォルトの名無しさん
2010/05/10(月) 02:35:400802デフォルトの名無しさん
2010/05/10(月) 02:44:29例えば、プログラムを実行して
1[改行]
と入力した場合、入力内容は
'1\n'
となる。
よって、2つめのscanf()が実行された時点で、未読込の文字'\n'があるので、
2つめのscanf()は、更なる入力を待たず b に '\n' を代入してすぐ返る。
よって一つ目の文字を入力した時点で終了してしまうように見える。
0803デフォルトの名無しさん
2010/05/10(月) 02:48:42なるほど
納得しました
ありがとうございました
0804795
2010/05/10(月) 02:57:130805デフォルトの名無しさん
2010/05/10(月) 12:01:15その点だけはGUIの方が初心者には判り易いと思うんだが。
# 尤も、そこに辿り着くまでの長い道程がGUIの最大の欠点なわけで……
入門書ではscanf()やgetchar()を使わず、全部コマンドラインオプションでやる方がシンプルに説明できるんじゃないか?
# そうすると、今度はコマンドインタプリタの余計なお世話を回避することを学ばないとならなくはなるけれど。
0806デフォルトの名無しさん
2010/05/10(月) 14:07:23コマンドラインオプション?
コマンドインタプリタ?
意味が通じてない。えらそうなこという前に正しい用語ぐらい覚えておけ。
0807デフォルトの名無しさん
2010/05/10(月) 14:47:07コマンドライン引き数、コマンドラインインタプリタと言えばご満足?
0808デフォルトの名無しさん
2010/05/10(月) 14:48:530809デフォルトの名無しさん
2010/05/10(月) 15:01:200810デフォルトの名無しさん
2010/05/10(月) 15:02:27それ無しでどうやって入門するんだよ
0811デフォルトの名無しさん
2010/05/10(月) 15:24:390812デフォルトの名無しさん
2010/05/10(月) 17:09:08>>805 の発言こそ「えっ」なんだが。
0813JaneDoeの抽出って便利だな
2010/05/10(月) 17:15:50余程自信がないんだろうか。
0814デフォルトの名無しさん
2010/05/10(月) 17:40:16書かなくても普通にわかるだろwwww
お前が書いた本人なの?添削して欲しいの?
0815デフォルトの名無しさん
2010/05/10(月) 18:05:54まじで何が言いたいのかさっぱりわからん。
>>807
それならますます意味が通じなくなる。
国語の成績が最低だったことだけはわかる。
0816デフォルトの名無しさん
2010/05/10(月) 18:26:16getchar()やscanf()ってコマンドラインから入力とかに素直に使えないよな
だから初心者はGUIのほうがいいんだろうけど、GUIはやりたいことやるまでのおまじないの解説とかが多いしな
いっそコマンドラインのやつはパラメータを全部引数にしちゃって渡すとかが入門にはいいかな
でも、それだと引数の解釈のところがめんどくなるだけか
みたいな話だと思う、要は、えらそうにアレにもこれにも文句つけてるけど特に建設的な意見はない人だ
国語の成績はよかったと思うよ、大した事言ってないのにえらそうにするやりかたとかさ
でも、人に説明とかは苦手(で、通じなくて相手を馬鹿にして非難)な人だろうな
0817デフォルトの名無しさん
2010/05/10(月) 18:49:06翻訳ありがとー
彼の言ってる内容はわかったが、その内容に意味がないこともよくわかったわw
0818デフォルトの名無しさん
2010/05/10(月) 18:50:430819デフォルトの名無しさん
2010/05/10(月) 19:08:53例
はい
はいはい
0820デフォルトの名無しさん
2010/05/10(月) 19:19:05それはお前が低脳だからだよ
高脳なら低脳の書いたよくわからん文でも理解できるが、
低脳はさっぱりわからんで終わり。
俺も低脳だから>>805はよく分らんがな
>>817
周りは普通脳以上は、やれやれ低脳にはこんなことまでしてやらないと理解できないのか
低脳は大変だな、これじゃ仕事でも手間かかるなだろな。
0821デフォルトの名無しさん
2010/05/10(月) 19:38:52「相性が悪い」という点に同意できないんだよ。
0822デフォルトの名無しさん
2010/05/10(月) 19:50:03それはお前が低脳だからだよ
0823デフォルトの名無しさん
2010/05/10(月) 23:12:00--
>>getchar()やscanf()のような文字単位処理関数と端末エミュレータの一行編集とが相性悪いんだよな。
getchar()とかscanf()のような標準入力からデータを受け取る関数は、
echo offにしてないと出力と入力のechoが混ざって相性悪いんだよな。
>>その点だけはGUIの方が初心者には判り易いと思うんだが。
>># 尤も、そこに辿り着くまでの長い道程がGUIの最大の欠点なわけで……
その点GUIはそういうToLoveるが無いので初心者も安心。
もっともGUIアプリを作るなんて、初心者には果てしなき道のりなわけで……
0824デフォルトの名無しさん
2010/05/10(月) 23:41:00素直にストリームの動作のイメージを反映してるし。
0825デフォルトの名無しさん
2010/05/11(火) 00:05:25getchar()で一文字入力しようとして「なぜか先に進む」類の罠に嵌まる質問が後を絶たないからね。
0826デフォルトの名無しさん
2010/05/11(火) 01:35:25ついでに言うと、1行編集は端末エミュレーターの機能じゃねえよ。
無知をさらしてるってことに早く気付けよ。
0827デフォルトの名無しさん
2010/05/11(火) 02:08:52質問させていただきます
fseek(fp, 0, SEEK_END)
ftell(fp)
としてサイズを取得した場合
今の自分の目的としているものが 195768 バイトのファイルなので
値としても 195768 とでてきます
しかし、
fseek(fp, 0, SEEK_SET)
ftell(fp)
として見てみると、この値は 0 とでてきます
ファイルポインタを先頭に置いているときは、
ftellの結果は 1 と出てくるのが妥当ではないかと感じるのですが
(fseek(fp, 195768, SEEK_SET) と
fseek(fp, 0, SEEK_END)
が一致するなら、データが 195769 個あるように思うため)
先頭、あるいは末尾がopenしたファイルのデータとは異なる
特殊なものになっているのでしょうか?
分かりにくいかと思いますが、上手く説明できず申し訳ないです
0828デフォルトの名無しさん
2010/05/11(火) 02:12:160829デフォルトの名無しさん
2010/05/11(火) 02:13:340バイトのファイルで考えてみて
0830デフォルトの名無しさん
2010/05/11(火) 02:14:18char file[195768] に対する添え字と同じ。
fseek(fp, 0, SEEK_END) は &file[195768] ってこと。
0831デフォルトの名無しさん
2010/05/11(火) 02:15:19付けてもらったレスみて考えてみます
感謝
0832デフォルトの名無しさん
2010/05/11(火) 02:28:37ありがとうございます
0833デフォルトの名無しさん
2010/05/11(火) 02:39:06> ファイルポインタを先頭に置いているときは、
> ftellの結果は 1 と出てくるのが妥当ではないかと感じるのですが
ファイルアドレスは 0 から始まるので、ファイルポインタが先頭、つまり
0 バイト目にある時は ftell() の結果は 0 と出るのが妥当です。
ファイルサイズ 0 の場合に fseek(fp, 0, SEEK_END) した時、ftell() が 1 を
返すのは妥当ではないと感じませんか?
ファイルサイズ 1 の場合に fseek(fp, 0, SEEK_END) した時、ftell() が 2 を
返すのは妥当ではないと感じませんか?
> fseek(fp, 195768, SEEK_SET) と
> fseek(fp, 0, SEEK_END)
> が一致するなら、データが 195769 個あるように思うため)
いきなり 195768 のように大きなアドレスを扱うから混乱します。
まずファイルサイズ 0 の場合を考えてみてください。
fseek(fp, 0, SEEK_SET) ないし fseek(fp, 0, SEEK_END) をしてもファイル
ポインタは先頭、つまり 0 バイト目を指したままですが、そこに 1 個目の
データが存在すると思いますか?
いいえ、存在しません。
同様に、ファイルサイズ 195768 の場合、fseek(fp, 195768, SEEK_SET)
ないし fseek(fp, 0, SEEK_END) をしてもファイルポインタは 195768 バイト
目を指しますが、そこに 195769 個目のデータが存在すると思いますか?
ファイルサイズ 195768 なのに、最後の 1 バイトのデータはどこから来る
のでしょう?
いいえ、どこからも来ません。データは 195768 個しかありません。
ファイルポインタが指している場所に必ずしもデータが存在するとは限り
ません。
0834デフォルトの名無しさん
2010/05/11(火) 03:45:02作ってみたのですが、足し算しかうまくいきません。
どこが違ってるのかよくわからないのでアドバイスください。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10592.c
0835デフォルトの名無しさん
2010/05/11(火) 04:07:50if(p!=NULL){
b = atoi(p + 1);
printf("%d + %d = %d\n", a,b,a+b);
} else if(q!=NULL) {
c = atoi(q + 1);
printf("%d - %d = %d\n", a,c,a-c);
} else if(r!=NULL){
d = atoi(r + 1);
printf("%d * %d = %d\n", a,d,a*d);
} else if(s!=NULL){
e = atoi(s + 1);
printf("%d / %d = %d\n", a,e,a/e);
}
0836デフォルトの名無しさん
2010/05/11(火) 04:38:18ch1, ch2, ch3, ch4は何の意味があるの?
0837デフォルトの名無しさん
2010/05/11(火) 12:15:32それ以前に
文字列の初期化なし
入力妥当性チェックなし
0838デフォルトの名無しさん
2010/05/11(火) 12:29:04ってなんの話?
0839デフォルトの名無しさん
2010/05/11(火) 12:30:49何にも入ってない不定の状態での格納は危険じゃないかと。
あと、ch1〜ch4に入れるときのキャストがなんか気持ち悪い。
0840デフォルトの名無しさん
2010/05/11(火) 12:37:33>何にも入ってない不定の状態での格納は危険じゃないかと。
どんな危険があるのですか?
0841デフォルトの名無しさん
2010/05/11(火) 13:12:060842デフォルトの名無しさん
2010/05/11(火) 14:29:03任意個数の整数を標準入力(キーボード)から入力し、
入力された整数の個数
平均値(小数点以下 1 桁まで表示)
最大値
最小値
を標準出力(ディスプレイ)に表示するプログラムがわかりません。
0843デフォルトの名無しさん
2010/05/11(火) 14:29:52大値、最小値には含めない。
また、最初に9999が入力された場合には、入力個数=0、平均値=0.0、最大値=0、
最小値=0が出力されるようにする。
0844デフォルトの名無しさん
2010/05/11(火) 14:37:52わかりました!!!!
0845デフォルトの名無しさん
2010/05/11(火) 14:55:29NULLだろうけど変数が多いね。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10593.txt
やりたいのはこういうこと?
0846デフォルトの名無しさん
2010/05/11(火) 15:01:03まず、入力がなくなるまでループ
最初の1個目を最大値、最小値とみなす
2個目以降は最大、最小を調べる
合計値に順次足していってループ回数もメモっておく
ループ抜けたら最大値、最小値、平均値を出力しておわり
0847デフォルトの名無しさん
2010/05/11(火) 15:03:300848デフォルトの名無しさん
2010/05/11(火) 15:04:59それができないから聞いてるんですけど・・・
0849デフォルトの名無しさん
2010/05/11(火) 15:27:07なぜ出来ないか詳しく。
制限のためか、それともC言語を書けない為か?
0850デフォルトの名無しさん
2010/05/11(火) 15:35:03プログラムを自分で書く気はない。
宿題スレへ。
0851デフォルトの名無しさん
2010/05/11(火) 15:36:270852デフォルトの名無しさん
2010/05/11(火) 15:48:340853デフォルトの名無しさん
2010/05/11(火) 16:44:46アルファベット1文字と整数型の数値 n を読み込んで,その文字の n 文字後の文字を表示するプログラムを書きなさい
とはどういうことでしょうか?アルファベットとは数値のことですか?全体的に問題の意味が
わからないんですが・・・
0854デフォルトの名無しさん
2010/05/11(火) 16:53:55アルファベット1文字・・・A-Z a-z
整数型の数値n・・・0-99999999...
A + 0 = A
A + 1 = B
A + 2 = C ...
0855デフォルトの名無しさん
2010/05/11(火) 16:56:56つかCの話でもなんでもないじゃん
たとえば
a5 なら a から5番目→g
f3なら fから3番目→i
D1なら E ってことだろ
もらった文字に数字足して、zをこえるならAに残ったぶんを足すんじゃね?
0856デフォルトの名無しさん
2010/05/11(火) 16:59:21zまで行ったらAにもどるのめんどいなら
「そこに文字はないです」って言って再入力させるとか
0857デフォルトの名無しさん
2010/05/11(火) 17:40:08どういう数え方ですか?アルファベットにアルファベットを足したら?
このプログラムの方法もよくわかりません。頭悪くてすいません・・・一応
今日も徹夜・・
0858デフォルトの名無しさん
2010/05/11(火) 17:49:22アルファベットの文字コードのことなんだけどね。
char c = 'A';
という構文はわかる?
そして
c = c +1;
putchar(c);
とすると画面には B と表示されるんだけど・・・
0859デフォルトの名無しさん
2010/05/11(火) 18:03:43アスキーコードでググれ
どのアルファベットがどの数字に割り当たってるのかわかるし
順番に並んでるのを見れば理解も早い
0860デフォルトの名無しさん
2010/05/11(火) 18:08:33空にする(宣言直後の状態に戻す)方法はありますか?
例えばループ中で代入しようとするとエラーを吐いてしまいます。
まだかなり初心者だと思いますが、よろしくお願いします。
0861デフォルトの名無しさん
2010/05/11(火) 18:13:04とりあえず、君が書いたコードを貼れよ
あと宣言直後は空でなく、デタラメな文字が入ってるよ。
0862デフォルトの名無しさん
2010/05/11(火) 18:28:58memset( Z, 0x00, sizeof( Z ) );
0863デフォルトの名無しさん
2010/05/11(火) 18:29:58for(i=0;i<=5;i++)としてないかな?
添え字は0から始まるので要素数5の場合は
for(i=0;i<5;i++)として0〜4の範囲を指定せねばいかんよ。
初期化の方法は
Cならmemset
WinAPIならZeroMemory
C++ならstd::fill
使い回さずにその都度宣言した方がいいと思う
0864デフォルトの名無しさん
2010/05/11(火) 18:31:350865デフォルトの名無しさん
2010/05/11(火) 18:39:44*z = '\0';
0866デフォルトの名無しさん
2010/05/11(火) 20:21:33君は C プログラマには向いてないから
BASIC 等をやったほうが良いんじゃないかな。
0867デフォルトの名無しさん
2010/05/11(火) 20:57:13なんだって
0868デフォルトの名無しさん
2010/05/11(火) 22:16:02どちらのほうが計算速度が速いですか?
0869デフォルトの名無しさん
2010/05/11(火) 22:17:230870デフォルトの名無しさん
2010/05/11(火) 22:21:20ありがとう!
0871デフォルトの名無しさん
2010/05/11(火) 22:22:400872デフォルトの名無しさん
2010/05/11(火) 23:03:440873デフォルトの名無しさん
2010/05/11(火) 23:16:39intからdoubleとかdoubleからintへの変換が多くあると急激に遅くなる
がんばって、固定小数にしてもそれほど早くもならなかったので、浮動小数でいいやとなった
これ以上速くしようと思ったらアルゴリズム改良するかGPUに支援してもらうか、はぁ
0874デフォルトの名無しさん
2010/05/11(火) 23:44:150875デフォルトの名無しさん
2010/05/11(火) 23:48:05リプレイ機能と相性が悪い聞く事がある
同じIntel系同士でもそうなるのかは俺は知らない
0876デフォルトの名無しさん
2010/05/11(火) 23:49:500877デフォルトの名無しさん
2010/05/11(火) 23:56:580878デフォルトの名無しさん
2010/05/12(水) 00:11:57sprintfを使いました。
そこからWINAPIのTextOut等で、ウィンドウに文字を表示したいのですが、
char *型からLPCWSTRへの変換が出来ないのでエラーになります。
何かいい方法ありませんか?
0879デフォルトの名無しさん
2010/05/12(水) 00:22:210880デフォルトの名無しさん
2010/05/12(水) 00:41:05char型って整数の範囲決まってませんでした?じゃぁnが大きいと
計算できないんじゃ?Aは65ってこと?
プログラムにはアルファベットとnを入力させるように作るのですか?・・
初心者に見せかけて相当理解力が弱いんで優しくしてください・・
まじわからんww
0881デフォルトの名無しさん
2010/05/12(水) 00:47:53コンピューターは01しか理解できないから文字も01に変換して処理させてるわけ。
0882デフォルトの名無しさん
2010/05/12(水) 00:54:44tchar.hをインクルードして_stprintf使え。
これでcharではなく、Windows APIのTCHARが使える(正確には、ちと違うが)。
0883デフォルトの名無しさん
2010/05/12(水) 00:55:21TextOutA()
0884デフォルトの名無しさん
2010/05/12(水) 00:56:040885デフォルトの名無しさん
2010/05/12(水) 00:56:55文字コードは01じゃないけどな。
0886デフォルトの名無しさん
2010/05/12(水) 01:00:070887デフォルトの名無しさん
2010/05/12(水) 01:00:510888デフォルトの名無しさん
2010/05/12(水) 01:01:49山手線符号化したら、全部駅名だろwwアホww
0889デフォルトの名無しさん
2010/05/12(水) 01:32:15もしよろしければどこへの誤爆かおしえていただきたいのですがいかがですかね
0890デフォルトの名無しさん
2010/05/12(水) 01:41:51TCHAR の意味解ってないだろ。
>>884
ASCII とは限らないだろ。
0891デフォルトの名無しさん
2010/05/12(水) 01:49:13ティーチャーって先生って意味ですよね。
0892デフォルトの名無しさん
2010/05/12(水) 07:40:39文字コードの文字のところ一部抜粋。
#include <stdio.h>
int main(void)
{
int i;
for (i=61;i<123;i++)
{
printf("%c(%3d) ",i,i);
if((!(i%10))||(i==122))printf("\n");
}
return 0;
}
0893デフォルトの名無しさん
2010/05/12(水) 08:03:20_stprintfから、swprintfの存在を知り、問題なく実数でも扱えて
処理できました。
ありがとう!
0894デフォルトの名無しさん
2010/05/12(水) 08:31:06アルファベットにアルファベットを足すとか言ってるし、「整数 n」←このnをアルファベットだと思ってるんじゃないの?
入力されたアルファベットにnというアルファベットを足すってどういう意味って聞いてるんじゃないの?
0895デフォルトの名無しさん
2010/05/12(水) 08:58:140896デフォルトの名無しさん
2010/05/12(水) 09:02:100897デフォルトの名無しさん
2010/05/12(水) 09:51:53どうぞ。
>>894
>「整数 n」←このnをアルファベットだと思ってるんじゃないの?
その発想はなかったw
0898デフォルトの名無しさん
2010/05/12(水) 12:11:13変数 a に 文字の '1' を与える
→ 整数演算の時 値として 1 に評価される
という思考から抜け出せないでいるようだ
0899デフォルトの名無しさん
2010/05/12(水) 13:46:270900デフォルトの名無しさん
2010/05/12(水) 15:29:520901デフォルトの名無しさん
2010/05/12(水) 18:57:08画像を入れる配列を3つに増やそうとすると
'System.StackOverflowException' のハンドルされていない例外が ○○.exe で発生しました。
とエラーがでてしまいます.少し調べたところ,unsigned charしすぎて回帰の回数が増えたためなのかと思ったんですが,どうしても配列を3つ以上使いたいのですがあきらめるしかないのでしょうか?
以下エラーの原因と思われるソースの一部です.(main.cpp)
FILE *fp;
unsigned char header[54];
unsigned char screen[400][300][3];//読み込み用
unsigned char screenB[400][300][3];//保存用
unsigned char screenG[400][300][3];//保存用 //ここをコメントアウトしたらエラー消える
//unsigned char screenR[400][300][3];//保存用
/* 画像サイズ */
int yl=400;//y_long //呼び出し履歴によるとここでデバッグが止まる
int xl=300;//x_long
/* ファイルから読む */
fp=fopen("test.bmp","rb"); /* Windowsビットマップ形式 400*300ピクセル,24ビットカラー */
fread(header,1,54,fp); /* ヘッダ(54バイト)を飛ばす */
fread(screen,1,yl*xl*3,fp); /* 残りはデータ(最下行から順に入る) */
//fread(screenB,1,yl*xl*3,fp);
fclose(fp);
0902デフォルトの名無しさん
2010/05/12(水) 19:01:11mallocとか使って動的にメモリを確保するんです。
多分その段階だとポインタになれてないだろうから、がんばれ、とエールを。
0903デフォルトの名無しさん
2010/05/12(水) 19:05:580904デフォルトの名無しさん
2010/05/12(水) 19:09:290906デフォルトの名無しさん
2010/05/12(水) 20:06:33>editbin /stack:1000000
とかやっとけば OK
0907デフォルトの名無しさん
2010/05/12(水) 20:38:04なんでそんなひどいこというの?
0908デフォルトの名無しさん
2010/05/12(水) 21:43:28質問したものですが
さすがにそれはないです。このスレでも意見分かれてませんか?
nをたくさんたすとzまでいってまたaに戻るとか。
アルファベトに数値をたすって意味が分からないんですよ。
たとえばAに1000足したら?
Aとはそもそも何か、16進数の10番目のやつか、何ちゃら
規格とかのコードなのか。それが分かりません
0909デフォルトの名無しさん
2010/05/12(水) 21:50:490910デフォルトの名無しさん
2010/05/12(水) 21:55:19> アルファベトに数値をたすって意味が分からないんですよ。
'A' は0x41や65の別表現でしかない。('A'==0x41==65)
全て内部的にはただの数値。
'A'+1==0x42==66=='B'
0911デフォルトの名無しさん
2010/05/12(水) 21:55:20クラスの友達に聞いて解決しました。
ここの人たちは理解力がなさすぎだと思います
0912デフォルトの名無しさん
2010/05/12(水) 21:56:26'a'+1='b'
これならわかる?
0913デフォルトの名無しさん
2010/05/12(水) 21:57:59http://ja.wikipedia.org/wiki/ASCII
ここを読めば文字「A」が65に対応してることがわかるとおもうよ。
0914デフォルトの名無しさん
2010/05/12(水) 22:01:280915デフォルトの名無しさん
2010/05/12(水) 22:58:04エラー続きです。どこをどう直せばいいか教えて下さい。
#include <stdio.h>
int f(int);
int main(void)
{
int no;
printf("整数を入力:");
scanf("%d",&no);
return 0;
}
void(int n)
{
while (n-->0)
putchar('*');
putchar('\n');
}
0916デフォルトの名無しさん
2010/05/12(水) 23:01:23int f(int);
int main(void)
{
int no;
printf("整数を入力:");
scanf("%d",&no);
func(no); //☆
return 0;
}
void func(int n) //☆
{
while (n-->0)
putchar('*');
putchar('\n');
}
0917デフォルトの名無しさん
2010/05/12(水) 23:02:57○f
0918デフォルトの名無しさん
2010/05/12(水) 23:37:560919デフォルトの名無しさん
2010/05/13(木) 01:18:41#include <stdio.h>
#include <ctype.h>
/* function prototype */
void disp_char( int );
int main( void )
{
char no;
printf( "整数を入力してください:" );
scanf( "%c", &no );
if( isdigit( no ) == 0 ) {
printf( "Error:数値以外の文字が入力されました\n" );
} else {
disp_char( no - '0' );
}
return 0;
}
void disp_char( int t )
{
int i;
char c = '*';
for( i = 1; i <= t; i++ ) {
printf( "%c", c );
}
printf( "\n" );
}
0920デフォルトの名無しさん
2010/05/13(木) 02:30:42もっと単純に考えたら?
Aの次のアルファベットって何?って聞かれたら困るのかな。そういうレベルよ。
Hの3つ前のアルファベットは?
で、zの次は何?って聞かれた時に、
・ないわー
・最初に戻ってa
・小文字終わったからA
とするか、そこは問題に明記されてないから、あなたが決めなきゃならないという話
0921デフォルトの名無しさん
2010/05/13(木) 02:31:230922デフォルトの名無しさん
2010/05/13(木) 03:55:380923デフォルトの名無しさん
2010/05/13(木) 09:44:49ファイルの扱い方で質問があります。
fopen、fread、fwrite、fseek、fclose
でファイルの読み込みや書き込みを行っているのですが
あるファイルを読み書き可能状態でfopenして
10バイトfwiteしたあと、fcloseせずに
書いたデータをファイルの最後から1バイトずつfseekして
freadして、その1バイトが特定の条件に一致した場合に
そこまで読み込んだデータを破棄して
10-fseekしたバイト数だけのファイルを作りたいのですが
そんなこと可能なのでしょうか?
fwiteする前に書き込みデータをチェックしたかったのですが
その部分には手を入れられないため、
1度書き込んだファイルの途中をぶった切れるのかが知りたいです。
■■■■■■■□□□
□を破棄して、■だけのデータを作りたいというようなイメージです。
0924デフォルトの名無しさん
2010/05/13(木) 09:55:290925デフォルトの名無しさん
2010/05/13(木) 09:56:49ftruncate()が使えればできなくはないが、事情が許すなら別ファイルに書き出すのが無難。
0926デフォルトの名無しさん
2010/05/13(木) 10:00:44fclose()した後に切り詰めたいなら>924かtruncate()、開いたまま切り詰めたいならftruncate()。
但し、後者はファイルハンドルをfileno()で取得する必要あり。
0927デフォルトの名無しさん
2010/05/13(木) 17:53:32どうもうまく動きません
どうすればいいでしょうか
#include<stdio.h>
#include<stdlib.h>
#define TERM 30
int main(void){
int fivo=0,n=0,temp;
FILE *fp;
fp=fopen("fivo.txt","wt");
if(fp==NULL){
fprintf(stderr,"ファイルオープンエラー");
exit(1);
}
while(fivo<=TERM){
if(fivo==1||fivo==2)n=1;
fprintf(fp,"F(%2d)=%10d\n",fivo,n);
fivo++;
temp=n;
n+=temp;
}
fclose(fp);
printf("正常に終了しました\nfivo.txtに保存しました");
return 0;
}
0928( ○ ´ ー ` ○ )
2010/05/13(木) 17:56:120929デフォルトの名無しさん
2010/05/13(木) 18:02:420930デフォルトの名無しさん
2010/05/13(木) 22:20:15台形則の分割数はnとし、a,b,nは入力できるようにする
助けてくださいwww
0931デフォルトの名無しさん
2010/05/13(木) 22:24:420932デフォルトの名無しさん
2010/05/13(木) 22:29:27ほとんど何でもできない状態で。。。w
0933デフォルトの名無しさん
2010/05/13(木) 22:34:11分割数から刻み幅を計算する
ループを回して台形公式で足していく
0934デフォルトの名無しさん
2010/05/13(木) 22:34:22#define f(x) x^2
double integral(double a, double b, int n)
{
double d = (b-a)/n;
double sum = 0;
for(int i = 0; i < n-1; i++) sum += (f(d*i)+f(d+(i+1)))*d/2;
return sum;
}
0935934
2010/05/13(木) 22:36:580936デフォルトの名無しさん
2010/05/13(木) 22:44:32>>934
の方ありがとうございました
実は前後はこういう状態で、中身の数値積分の部分だけは分からないですww
前のコードをどうすればうまくその中にはめるのでしょうか
#include <stdio.h>
int main(void)
{
double a,b,sekibun,exact;
int n;
printf("x^2をaからbまで台形則を用いて数値積分します。\n");
printf("aとbを入力してください。\n");
scanf("%lf %lf",&a,&b);
printf("分割数nを入力してください\n");
scanf("%d",&n);
??????????????
exact=(b*b*b-a*a*a)/3.0;
printf("数値積分値は%20.15lfです。\n",sekibun);
printf("厳密値は%20.15lfです。\n",exact);
printf("誤差は%20.15lfです。\n",exact-sekibun);
return 0;
}
0937デフォルトの名無しさん
2010/05/13(木) 22:47:53#define f(x) ((x)*(x))
int main(void)
{
double a,b,sekibun,exact;
int n;
printf("x^2をaからbまで台形則を用いて数値積分します。\n");
printf("aとbを入力してください。\n");
scanf("%lf %lf",&a,&b);
printf("分割数nを入力してください\n");
scanf("%d",&n);
double d = (b-a)/n;
sekibun = 0;
for(int i = 0; i < n-1; i++) sekibun += (f(d*i)+f(d+(i+1)))*d/2;
exact=(b*b*b-a*a*a)/3.0;
printf("数値積分値は%20.15lfです。\n",sekibun);
printf("厳密値は%20.15lfです。\n",exact);
printf("誤差は%20.15lfです。\n",exact-sekibun);
return 0;
}
0938デフォルトの名無しさん
2010/05/13(木) 22:50:24それって何の冗談?
0939937
2010/05/13(木) 22:50:280940デフォルトの名無しさん
2010/05/13(木) 22:50:37何故かコンパイル失敗ですorz...
0941デフォルトの名無しさん
2010/05/13(木) 22:51:03その前後は誰に書いてもらったんですかwww
0942デフォルトの名無しさん
2010/05/13(木) 22:53:04それは。。。www
0943デフォルトの名無しさん
2010/05/13(木) 22:53:31gcc -std=c99 -o hoge hoge.c
0944デフォルトの名無しさん
2010/05/13(木) 22:56:15#include <stdio.h>
int main(void)
{
double a,b,d,sekibun,exact;
int i, n;
printf("x^2をaからbまで台形則を用いて数値積分します。\n");
printf("aとbを入力してください。\n");
scanf("%lf %lf",&a,&b);
printf("分割数nを入力してください\n");
scanf("%d",&n);
d = (b - a) / n;
sekibun = a * a + b * b;
for(i=1; i<n; i++) sekibun += (a + d * i) * (a + d * i) * 2;
sekibun *= d / 2;
exact=(b*b*b-a*a*a)/3.0;
printf("数値積分値は%20.15lfです。\n",sekibun);
printf("厳密値は%20.15lfです。\n",exact);
printf("誤差は%20.15lfです。\n",exact-sekibun);
return 0;
}
0945デフォルトの名無しさん
2010/05/13(木) 22:58:31それって何の冗談?
0946デフォルトの名無しさん
2010/05/13(木) 22:58:41ありがとうございました!これで一発成功!
やっぱり2ちゃん最強ww
0947デフォルトの名無しさん
2010/05/13(木) 23:01:05いいんだよ
0949デフォルトの名無しさん
2010/05/13(木) 23:06:37バレタ><
0950937
2010/05/13(木) 23:06:45('(゚∀゚∩ イインダヨー!
ヽ 〈
ヽヽ_)
0951デフォルトの名無しさん
2010/05/13(木) 23:10:360952937
2010/05/13(木) 23:13:58for(int i = 0; i < n-1; i++) sekibun += (f(a+d*i)+f(a+d*(i+1)))*d/2;
0953デフォルトの名無しさん
2010/05/13(木) 23:29:38現在、3次元空間座標(x,y,z)の数値を与えると、
ロボットの関節の角度(A,B,C)を計算するプログラムを作成しています。
L1,L2はロボットの腕の長さでL1:69.8/L2:77.35が与えられています。
また、それぞれの変換公式は
C= ±(プラスマイナス) arccos(((x^2+y^2+x^2)-(L1^2+L2^2))/(2*L1*L2))
B= arcsin(y/(L1+L2*cos(C)))
A= arctan(x/(-z)) ±(マイナスプラス) arccos(((L1+L2*cos(C))*cos(B))/root(x^2+y^2))
で、ABCは動作幅が制限されています。
Cの動作幅は-30<= C <=127 [deg]
Bの動作幅は-15<= B <=93 [deg]
Aの動作幅は-120<= A <=135 [deg]
最初にCを出すと値が-Cと+Cの2種類が出るため、
条件(上の制限幅)に当てはまる値を選んで、radに変換した上でBに代入して計算、
Bの値をAに代入した上で、プラスの時とマイナスの時のそれぞれの値から条件に一致する値を選んで
結果を出力するのだと思うのですが、条件に一致する値を選ぶ操作に難儀しています。
最適値の選び出し方の動作アルゴリズムだけで結構ですので、ご教示願います。
0954デフォルトの名無しさん
2010/05/13(木) 23:42:41高々数通りから条件に合うものを選ぶだけじゃないの?
0955デフォルトの名無しさん
2010/05/14(金) 00:22:05それは下限が0, 上限が b - a の f(x) の定積分
下限が a, 上限が b の定積分ではない。
http://pc12.2ch.net/test/read.cgi/tech/1269438098/612 を参照せよ。
0957デフォルトの名無しさん
2010/05/14(金) 00:49:15区分求積法と台形公式の区別もつかないアホは引っ込んでろw
0958デフォルトの名無しさん
2010/05/14(金) 01:03:33ん、失礼しました。
>>957
ん、たしかに例にすべきじゃなかった。
0959デフォルトの名無しさん
2010/05/14(金) 01:21:07この配列(number)の配列番号に対応する配列(order_number)に、number配列に格納された数字の順位(小さい順)を格納したいのです。
説明が分かりにくくてすみません。
例えば下の例ではnumber[0]に格納されている3は3番目に小さい数ですので、order_number[0]には3を代入したいのです。
number[0]=3
number[1]=2
number[2]=5
number[3]=5
number[4]=0
order_number[0]=3
order_number[1]=2
order_number[2]=4
order_number[3]=5
order_number[4]=1
0960デフォルトの名無しさん
2010/05/14(金) 01:57:03#include<stdio.h>
#define NITEM(arr) (sizeof(arr)/sizeof(arr[0]))
void swap_int(int *a, int *b){
int c;
c=*a;
*a=*b;
*b=c;
}
int main(void){
int number[]={3, 2, 5, 5, 0};
int index[NITEM(number)];
int order_number[NITEM(number)];
int i, j;
for(i=0;i<NITEM(number);i++) index[i]=i;
for(i=0;i<NITEM(number);i++){
for(j=0;j+1<NITEM(number)-i;j++){
if(number[index[j]]>number[index[j+1]]) swap_int(&index[j], &index[j+1]);
}
}
for(i=0;i<NITEM(number);i++) order_number[index[i]]=i+1;
for(i=0;i<NITEM(number);i++) printf("%d\n", order_number[i]);
return 0;
}
0961959
2010/05/14(金) 02:47:55ありがとうございます。
0962デフォルトの名無しさん
2010/05/14(金) 17:31:46いやそれは数値とコードの対応表を出せっていうプログラムですよね?
僕がわからんのは、アルファベット1文字と整数型のnを読み込んで
nも事後の文字を表示するプログラムなんです・・・
どういう意味ですか?a,b,c,d・・・・zまでいったらaってことですか?
でもいっぱい足して残った分をまたaから足すっていうのは高度で、まだ
大学入ったばっかでありえないんですがw
誰か教えてくれたら・頼みます・・・
0963デフォルトの名無しさん
2010/05/14(金) 17:33:450964デフォルトの名無しさん
2010/05/14(金) 17:34:04小学生の私の甥っ子でさえ判るレベルだ。
まぁ、zの後をどう定義するのかって議論なら別だが。
0965デフォルトの名無しさん
2010/05/14(金) 18:25:41やりたくないなら、「存在しません」って表示すりゃいいだけじゃん
むしろ、「そこまで気を使いました」って方がよくね?
0966デフォルトの名無しさん
2010/05/14(金) 19:07:13いや、難しいと思うぞww
どんな数値を足そうが、常にアルファベットなんだから。
でも授業ってのは段階的だから、今までやってきたことで
できるってことだから、特殊な記号とか使わなくてもいいん
じゃないかな?それかzまでいったらaっていうのが問題の意味的
に間違ってるかだなwだとしたら問題はどういう意味なんだよww
ってことになるが・・wでどうなのよ・・・
0967デフォルトの名無しさん
2010/05/14(金) 19:17:350968デフォルトの名無しさん
2010/05/14(金) 19:29:41EBCDICとその派生。
0969デフォルトの名無しさん
2010/05/14(金) 19:41:43おっww光が見えてきたぞw
存在しませんって表示することのほうが高度だろw
どういうこと存在しませんって。どういうプログラムするの?
範囲を制限するってこと?
うん、なんかそんな気が。
A+3のときは
A+{(3+26)÷26の余)=D
A+27のときは
かw?
A+{(27+26)÷26の余}=E
でこの余りをあらわすプログラムならってねぇ
まじアホすぎてごめん。本当大学何て受かったことが
奇跡だったから・・
0970デフォルトの名無しさん
2010/05/14(金) 19:45:220971デフォルトの名無しさん
2010/05/14(金) 19:47:18C言語には四則演算の他にビット演算や剰余(割り算のあまり)を求める演算子があるよ
0972705
2010/05/14(金) 21:18:06char型の足し算をしたいんですが上手くいきません、どこが間違ってます?
#include <stdio.h>
int main(void)
{
char i,input;
printf("アルファベットを代入\n");
scanf("%c",&i);
printf("数値を代入してください\n");
scanf("%c",&input);
printf( "%c + %c = %c\n", i, input, i+input);
return 0;
}
実行したら
アルファベット代入という表示→アルファベットを入れる→数値代入という表示→数値を入れる
→計算結果となるのが理想なんですが・・・・
0973デフォルトの名無しさん
2010/05/14(金) 21:18:420974デフォルトの名無しさん
2010/05/14(金) 21:21:210975デフォルトの名無しさん
2010/05/14(金) 21:48:34>>802
0976デフォルトの名無しさん
2010/05/14(金) 22:21:06#include <stdio.h>
int main(void)
{
char i;
int input;
printf("アルファベットを代入\n");
scanf("%c%*c",&i);
printf("数値を代入してください\n");
scanf("%d",&input);
printf( "%c + %d = %d\n", i, input, i+input);
return 0;
}
0977デフォルトの名無しさん
2010/05/14(金) 22:46:45int main(void)
{
char i,input;
printf("アルファベットを代入\n");
scanf("%c",&i);
printf("数値を代入してください\n");
scanf("%c",&input);
printf( "%c + %d = %c\n", i, input, i+input);
return 0;
}
#include <stdio.h>
int main(void)
{
char i
int input;
printf("アルファベットを代入\n");
scanf("%c",&i);
printf("数値を代入してください\n");
scanf("%d",&input);
printf( "'%c' + %d = '%c'\n", i, input, i+input);
return 0;
}
0978デフォルトの名無しさん
2010/05/14(金) 22:54:16>どういうこと存在しませんって。どういうプログラムするの?
入力されたアルファベット(のコード番号) + 入力された数字 > z(のコード番号)
なら存在しないじゃん
0979デフォルトの名無しさん
2010/05/14(金) 23:05:310980デフォルトの名無しさん
2010/05/14(金) 23:07:13C言語なら俺に聞け(入門編)Part 64
http://pc12.2ch.net/test/read.cgi/tech/1273846013/
0981デフォルトの名無しさん
2010/05/14(金) 23:16:590982デフォルトの名無しさん
2010/05/15(土) 00:56:08しょうがねえ、連投ではじかれるまで俺が埋めてやるか。
0983デフォルトの名無しさん
2010/05/15(土) 00:59:260984デフォルトの名無しさん
2010/05/15(土) 01:20:510985デフォルトの名無しさん
2010/05/15(土) 01:21:59じゃできるけど
>>977
じゃできない・・・・・
何故だ・・・
違いは*cなんだろうけど
この*c初めて見た、てかプログラミング初めて1週間だが・・・
*cってなんですか?
0986デフォルトの名無しさん
2010/05/15(土) 01:27:07> *cってなんですか?
manpageより抜粋:
代入抑制文字 ’*’ (省略可能)。 scanf() は変換指定に指示された通り
入力を読み込むが、その入力は捨てられる。対応する pointer 引き数
は 必要なく、 scanf() が返す代入が成功した数にこの指定は含まれない。
0987デフォルトの名無しさん
2010/05/15(土) 02:32:51ちゃんとみんなのレス読めよ
0988デフォルトの名無しさん
2010/05/15(土) 12:29:07マニュアル見る癖つけろよ。man printf
0989デフォルトの名無しさん
2010/05/15(土) 12:31:380990デフォルトの名無しさん
2010/05/15(土) 12:59:27俺は趣味だけど
0991デフォルトの名無しさん
2010/05/15(土) 13:00:390992デフォルトの名無しさん
2010/05/15(土) 13:13:000993デフォルトの名無しさん
2010/05/15(土) 13:16:330994デフォルトの名無しさん
2010/05/15(土) 13:50:430995デフォルトの名無しさん
2010/05/15(土) 13:52:180996デフォルトの名無しさん
2010/05/15(土) 14:01:090997デフォルトの名無しさん
2010/05/15(土) 15:24:14おかげでプロジェクト自体が危機的状態に陥る結果となりました。
デバッグは危険なので、極力避けるように勧告したほうがいい。
0998デフォルトの名無しさん
2010/05/15(土) 15:42:530999デフォルトの名無しさん
2010/05/15(土) 16:01:40なぜPython??
そこはつまらなくてもお約束の
A,B,Cを使うんじゃないの?
AとBはやりました、いま「はじめてのC」で勉強中です 見たいな感じで
1000デフォルトの名無しさん
2010/05/15(土) 16:15:51int main(){
int a;
a=10;
int b;
b=a;
return 0;
}
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。