C言語なら俺に聞け! Part 115
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/09/26(月) 21:23:57質問する前には最低限検索を。
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレッド
C言語なら俺に聞け! Part 114
http://pc8.2ch.net/test/read.cgi/tech/1126884418/
0002デフォルトの名無しさん
2005/09/26(月) 21:24:420003デフォルトの名無しさん
2005/09/26(月) 21:29:110004デフォルトの名無しさん
2005/09/26(月) 21:45:360005デフォルトの名無しさん
2005/09/26(月) 22:25:280006デフォルトの名無しさん
2005/09/26(月) 22:39:300007デフォルトの名無しさん
2005/09/26(月) 23:21:520008デフォルトの名無しさん
2005/09/26(月) 23:57:260009セェンロン ◆89nOjCFiLI
2005/09/27(火) 10:40:34http://kuroneko-upload.no-ip.info/uploader/upbd/updir/aaa.jpg
この真中のリストビューみたいなのを作りたいんですが、どうやったらいいんでしょうか?
リストビューのフラグいじったら出来ると思ってたんだけど、出来ずに困ってます。
教えてクダサイませませ。お願いしますです。
0010デフォルトの名無しさん
2005/09/27(火) 11:15:53この程度ならオーナー描画とサブクラス化で間に合うと思うが、osが不明だ。
たぶんwin32スレがよいとおもわれ。
http://pc8.2ch.net/test/read.cgi/tech/1125850096/
つーか、チート臭いな。
フライングボディシザースドロップ食らわせるよ?
0011デフォルトの名無しさん
2005/09/27(火) 14:19:340012デフォルトの名無しさん
2005/09/27(火) 14:21:07スレ違い
0013デフォルトの名無しさん
2005/09/27(火) 14:31:06#define ABC 10
void main(void){
printf("%"ABC"s\n", "hoge");
}
上記が安易に printf("%10s\n", "hoge"); になるのかと思いきや
違うんですね。
#define ABC 10
#define to_str(s) #s
void main(void){
printf("%"to_str(ABC)"s\n", "hoge");
}
などとしても printf("%10s\n", "hoge"); にはならないんですね。
どうしたら良いのでしょうか。どなたか良い案を教えていただければさいわいでございます。
0014デフォルトの名無しさん
2005/09/27(火) 14:33:54#define ABC "10"
こうする。
0015デフォルトの名無しさん
2005/09/27(火) 14:35:20ありがとうございます。
すみません、それじゃ駄目なんです。別に数値としても使いたいので。
atoi()すればいいじゃんとかそういうのは無しで、あくまでも
#define ABC 10
というマクロでやりたいです。
0016デフォルトの名無しさん
2005/09/27(火) 14:39:41こうすればいい。
#include <stdio.h>
#define ABC 10
#define to_str(s) to_str_main(s)
#define to_str_main(s) #s
int main(void) {
printf("%"to_str(ABC)"s\n", "hoge");
return 0;
}
0017デフォルトの名無しさん
2005/09/27(火) 14:44:12おお、すばらしい。めちゃくちゃ感謝です。ありがとうございます。
一旦マクロに渡して展開させてから処理するということですね。
ありがとうございました。
0018デフォルトの名無しさん
2005/09/27(火) 14:46:22"to_str(ABC)"を " to_str (ABC) "に変えてもダメ?
0019デフォルトの名無しさん
2005/09/27(火) 14:48:00>>1嫁
ttp://www.kouno.jp/home/c_faq/c11.html#17
0021デフォルトの名無しさん
2005/09/27(火) 15:15:12#define MAX 3
printf("%-*.*s\n", MAX, MAX, "hoge");
printf("%*s\n", MAX, "hoge");
という方法もあったりする。上と下の違いは実行してみればわかる
0022セェンロン ◆89nOjCFiLI
2005/09/27(火) 15:30:24誘導ありがとうございます。
オーナー描画とサブクラス化で検索してみます。
チートぢゃないですw
0023デフォルトの名無しさん
2005/09/27(火) 16:26:54便利な方法があるんだな
0024デフォルトの名無しさん
2005/09/27(火) 17:01:00上の方は冗長じゃないか?
printf("%-.*s\n", MAX, "hoge");でいい希ガス
0025ハム ◆S.PtdgMO6E
2005/09/27(火) 17:26:32int a=0;
int b=1;
printf("%d\n",a=b++);
b=1; //初期化
a=0; //初期化
printf("%d\n",a=++b);
b=1;
a=0;
printf("%d\n",a=(b++));
上記のプログラムを実行すると、
1
2
1 ←ここがおかしい?
ここで、a=(b++) の a は 2 になると思うのですが、なぜ、()よ
り=が優先されて出力結果が1になるのでしょうか?
()が最優先じゃないのでしょうか?
a=(b++)は、bをインクリメントしたその値をaに格納するのでは?
なぜそうではないのでしょうか? おねがいします。
0026デフォルトの名無しさん
2005/09/27(火) 17:37:450027デフォルトの名無しさん
2005/09/27(火) 17:37:470028デフォルトの名無しさん
2005/09/27(火) 17:39:090029デフォルトの名無しさん
2005/09/27(火) 17:39:340030デフォルトの名無しさん
2005/09/27(火) 17:42:21a=b++
も
a=(b++)
も同じ
インクリメント/デクリメント演算子は代入演算子より優先順位が高い
0031デフォルトの名無しさん
2005/09/27(火) 17:50:150032ハム ◆S.PtdgMO6E
2005/09/27(火) 17:53:50ということは、
*p++
*++p
*(p++)
(*p)++
これもそれに該当しますか?
0033デフォルトの名無しさん
2005/09/27(火) 17:54:43副作用じゃないだろ。まぁそれでいいはず
0034デフォルトの名無しさん
2005/09/27(火) 18:08:13p にアドレス X が入ってるとする。
*p++ X にある値を返し、p を1つ進める
*++p p を1つ進め、X + 1 にある値を返す
*(p++) *p++ に同じ
(*p)++ X にある値を返し、X にある値を1つ進める
>>33
副作用 = 式の値を求める以外の処理。
即ち、出力、再代入等、状態の変化を伴う処理。
0035デフォルトの名無しさん
2005/09/27(火) 20:28:110printf("%d%d%d", a++, a++, a++);
こういうのが210って出力されるのはなんで?
0036デフォルトの名無しさん
2005/09/27(火) 20:29:250それは偶然後ろから評価されたから。
この場合の動作は未定義。処理系によるから
やっちゃだめ。
003735
2005/09/27(火) 20:31:130しかし、C言語って未定義とか不定とか多いのなんとかならんのか。
0038デフォルトの名無しさん
2005/09/27(火) 20:33:110俺は012だった
0039デフォルトの名無しさん
2005/09/27(火) 20:36:210・不必要な制限は最適化に不利に働く
0040デフォルトの名無しさん
2005/09/27(火) 20:36:480参考
ttp://www.kouno.jp/home/c_faq/c3.html#8
ttp://www.kouno.jp/home/c_faq/c11.html#33
0041デフォルトの名無しさん
2005/09/27(火) 20:37:220BCCでは210
GCCでは210
VC++ Toolkitでは000
でした
0042デフォルトの名無しさん
2005/09/27(火) 20:37:280別に未定義なことをしなければいいので無問題。
未定義や不定なことをやるコードにろくなコードはない。
0043デフォルトの名無しさん
2005/09/27(火) 20:43:2800044デフォルトの名無しさん
2005/09/27(火) 20:46:5800045sage
2005/09/27(火) 22:51:03(2つの数字で演算する際、0が使えるかどうかの違い)
グループ名をそれぞれつけろと言われました。
決まったようなグループ名があるように言われたのですが、本やサイトで調べても分かりませんでした。
分かる方おりましたらよろしくお願いします。
0046デフォルトの名無しさん
2005/09/27(火) 22:53:59言 っ た 奴 に 聞 け
0047デフォルトの名無しさん
2005/09/27(火) 22:55:080048デフォルトの名無しさん
2005/09/27(火) 22:57:050049デフォルトの名無しさん
2005/09/27(火) 22:57:090050デフォルトの名無しさん
2005/09/27(火) 23:01:49もう放置しとけ、俺定義を持ち出すような奴にろくな奴いない
0051デフォルトの名無しさん
2005/09/27(火) 23:03:06マルチ乙
0052デフォルトの名無しさん
2005/09/27(火) 23:05:53俺定義なんですね・・・
0053デフォルトの名無しさん
2005/09/27(火) 23:12:58int **angleBmp(int **iArr2,, unsigned long int y, unsigned long int x){
for(int i=0; i<y; i++){
for(int j=0; j<x; j++){
iArr2[i][j] = iArr2[j][y-i-1];
}
}
return iArr2;
}
過去ログもみて試しているのですが、90度で表示するため二次元配列を並べ替えるのだと思うのですが、
うまくいきません。新しく配列を作ってコピーした方がいいのでしょうか?
的はずれなソースかも知れませんがご教授ください。
0054デフォルトの名無しさん
2005/09/27(火) 23:18:16そもそも、回転後の画像は高さと幅が変わるし。
0055デフォルトの名無しさん
2005/09/27(火) 23:36:36ポストインクリメント演算子は、式の評価が全部終了した時点で適用される。
副作用完了点でぐぐるとよい。
0056デフォルトの名無しさん
2005/09/28(水) 00:24:48外部関数をfuncを作成しておきます。
このfuncにa[10][10]の先頭アドレス(a)を渡したいのですが、
引数設定を func( char * arr)として、mainから func(a) と渡そうとすると、
'char ( *)[10]' 型は 'char' 型に変換できない(関数 main() )
パラメータ 'arr' は char 型として定義されているので char ( *)[10] は渡せない(関数 main() )
などとエラーを吐きます。
無論char a[10]などの文字列用変数の場合、func(a)と渡しても問題ないのですが。
配列の配列として宣言し、その先頭アドレスを渡そうとするとエラーが出てしまいます。
どうすればよろしいでしょうか
005753
2005/09/28(水) 00:29:12二次元配列は画像のサイズを利用してmallocで作ったのですが、この二次元配列をコピーするための同じ要素数の
二次元配列はどう作ったらよいのでしょうか。コピー元と同じやり方で作るしかないのかと悩んでいます。
0058デフォルトの名無しさん
2005/09/28(水) 00:29:27void func( char (*param)[10] );
0059デフォルトの名無しさん
2005/09/28(水) 00:31:04func(char **arr);
a[10][10]の場合、aは要素数10の配列先頭へのポインタが10個並んだ配列の先頭へのポインタ
0060デフォルトの名無しさん
2005/09/28(水) 00:31:11スレ違い。
後、処理を考える前に画像フォーマットの調査位しろ。
0061デフォルトの名無しさん
2005/09/28(水) 00:32:46それはポインタへのポインタ型を渡すときだろ。
0062デフォルトの名無しさん
2005/09/28(水) 00:35:45すまん、思いっきり間違った・・・
寝てくる('A`)
0063デフォルトの名無しさん
2005/09/28(水) 00:36:46ttp://www.google.co.jp/search?hl=ja&q=%E7%94%BB%E5%83%8F%E3%80%80%E5%9B%9E%E8%BB%A2%E3%80%80%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0&lr=
0064デフォルトの名無しさん
2005/09/28(水) 00:39:25ありがとうございます。
mainからfunc(param); (param[10][10])と渡した場合funcは、
char型配列へのポインタを渡さなければいけないのですね。。
0065デフォルトの名無しさん
2005/09/28(水) 00:46:12同じやり方で作ったらなにか問題があるのか?
006657
2005/09/28(水) 00:54:17どうもです。
特に問題があるというわけでなく、無駄な処理が増えると思ったもので。
いつも冗長なソースになりがちなんで少しでもスマートにしなくてはと気をつけながらやっているのですが。
0067デフォルトの名無しさん
2005/09/28(水) 07:00:330068デフォルトの名無しさん
2005/09/28(水) 17:00:09ファイルに出力するPROG1と、その100MBのデータファイルを読み込んで、
1.8GBくらいの作業領域をmallocで確保して、別のデータを作成するPROG2を
合体して一つのPROG3にしました。合体の理由は、100MBのファイル読み書きで
時間が掛かるからです。
合体の方法は、具体的には、1.5GBをmallocして作業して100MBのデータが出来たら、
1.5GBの領域はFreeして、次に、1.8GBをmallocして、その領域を新たな作業領域として
使いながら、先ほどの100MBのデータを処理します。
ところが、PROG3を実行していると、1.8GBのmallocで失敗します。
一回目に1.5GB確保して100MBの計算が終わったら、Freeしていますが、
Windowsタスクマネージャでメモリ使用量を見ていてもFreeしているにもかかわらず、
この時点で、このプロセスは1.5GBくらいメモリを使っています。
Free実行した直後に、メモリ使用量は、急には減らないものなんでしょうか?
0069デフォルトの名無しさん
2005/09/28(水) 17:01:540070デフォルトの名無しさん
2005/09/28(水) 17:04:140071デフォルトの名無しさん
2005/09/28(水) 17:06:36>1.8G を malloc するのに 100M はファイル経由なのね・・
メモリ経由です。ファイルの入出力は止めましたので。
0072デフォルトの名無しさん
2005/09/28(水) 17:17:53だからメモリクリーナーのようなジョークソフトがあるんだよ
0073デフォルトの名無しさん
2005/09/28(水) 17:31:53何Gメモリを積んでるか知らないが、プログラムを纏めたことにより
連続した1.8GBのメモリ確保が出来なくなったんだろう。
最初の1.5Gのmallocを次の1.8GBと統一してみれば上手くいくかもしれない。
あと、freeしたメモリはOSに返されるとは限らない。
ま、どっちにしろまともなOSならプロセスが終了したらメモリは解放されるな。
0074デフォルトの名無しさん
2005/09/28(水) 17:42:450075デフォルトの名無しさん
2005/09/28(水) 17:54:400076デフォルトの名無しさん
2005/09/28(水) 18:04:39こ こ で エ ス パ ー 登 場
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
0077デフォルトの名無しさん
2005/09/28(水) 18:08:270078デフォルトの名無しさん
2005/09/28(水) 18:19:12Win32ならHeapAlloc(), VirtualAlloc()またはファイルマッピングを使え
0079デフォルトの名無しさん
2005/09/28(水) 18:19:32VirtualAllocだろ。
0080デフォルトの名無しさん
2005/09/28(水) 18:20:450081デフォルトの名無しさん
2005/09/28(水) 18:21:000082デフォルトの名無しさん
2005/09/28(水) 18:22:37なぜ?
0083デフォルトの名無しさん
2005/09/28(水) 18:46:55電源切るまで開放されない
0084デフォルトの名無しさん
2005/09/28(水) 18:47:100085デフォルトの名無しさん
2005/09/28(水) 18:48:31(;´Д`)
0086デフォルトの名無しさん
2005/09/28(水) 18:54:39いつの時代だよ。
0087デフォルトの名無しさん
2005/09/28(水) 19:04:300088デフォルトの名無しさん
2005/09/28(水) 19:08:49qsort
0089デフォルトの名無しさん
2005/09/28(水) 19:33:38配列の要素(数字)を比較して、自分で昇順になるように並べ替えてください。
あと、学校の課題なら宿題スレに行け。
0090デフォルトの名無しさん
2005/09/28(水) 19:58:09Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
source.cpp:
致命的エラー F1004 source.cpp 8: コンパイラ内部のエラー(関数 main(int,char * *) )
致命的エラー F1004 source.cpp 8: コンパイラ内部のエラー(関数 main(int,char * *) )
とか出たんだけどなにこれ?
0091デフォルトの名無しさん
2005/09/28(水) 20:15:08スレ違い。
BCCスレにでもどうぞ。
0092デフォルトの名無しさん
2005/09/28(水) 20:15:28コンパイラ内部のエラー
0093デフォルトの名無しさん
2005/09/28(水) 20:24:00#include<stdio.h>
int main{
int a[]={1,2,3,4,5,6,7,8,9,10};
printf("既に昇順です\n");
return 0;
}
0094デフォルトの名無しさん
2005/09/28(水) 20:25:34新言語ですか?
0095デフォルトの名無しさん
2005/09/28(水) 20:37:18#include <stdio.h>
#include <stdlib.h>
/* 比較用 */
int compare_int_ascending(const int *a, const int *b)
{
return *a - *b;
}
int main()
{
int array[] = { ... }; /* データ */
int count = sizeof(data)/sizeof(int);/* 要素数 */
int i;
/* ソート */
qsort(array, count, sizeof(int), (int (*)(const void*, const void*))compare_int_ascending);
for (i = 0; i < 10; i++) {
printf("%3d", array[i]);
}
printf("\n");
return 0;
}
0096デフォルトの名無しさん
2005/09/28(水) 22:33:22地道〜に鈍足ソートするしかないんでしょうか?
0097デフォルトの名無しさん
2005/09/28(水) 22:39:04要素数がわかっているなら、配列につめ直してソートする手もある
後は、ヒープソートを使うと良いかな
0098デフォルトの名無しさん
2005/09/28(水) 23:33:47C言語を学んでいるのですがPHPを使って掲示板を作ろうと考えています、
でもC言語でそのようなものを作れるのであれば、勉強がてらC言語でつくろうかなとも考えているので。
宜しくお願いします。
0099デフォルトの名無しさん
2005/09/28(水) 23:36:36自宅サーバなど自分で管理しているサーバなら確実にできる。
そうでなくともサーバでCのコンパイルができればCで書けなくもないが、
そんなことができるサーバなんて普通ありえない。
0100デフォルトの名無しさん
2005/09/28(水) 23:39:440101デフォルトの名無しさん
2005/09/28(水) 23:41:27phpの勉強にもなるから、そっちでやったらどうか?
■ このスレッドは過去ログ倉庫に格納されています