トップページ⇒tech
1001コメント302KB

C言語なら俺に聞け! Part 115

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/09/26(月) 21:23:57
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

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:42
2 get
0003デフォルトの名無しさん2005/09/26(月) 21:29:11
3getsなら漏れは神
0004デフォルトの名無しさん2005/09/26(月) 21:45:36
4ならscanfに%d指定で文字列を読み込ませる
0005デフォルトの名無しさん2005/09/26(月) 22:25:28
5ならビットシフトのコピペもう貼らない
0006デフォルトの名無しさん2005/09/26(月) 22:39:30
6なら屁こいてもAA貼っちゃう
0007デフォルトの名無しさん2005/09/26(月) 23:21:52
7なら斉藤またんきがこのスレを征服
0008デフォルトの名無しさん2005/09/26(月) 23:57:26
8なら漏れは斎藤またんき
0009セェンロン ◆89nOjCFiLI 2005/09/27(火) 10:40:34
質問です。
http://kuroneko-upload.no-ip.info/uploader/upbd/updir/aaa.jpg
この真中のリストビューみたいなのを作りたいんですが、どうやったらいいんでしょうか?

リストビューのフラグいじったら出来ると思ってたんだけど、出来ずに困ってます。
教えてクダサイませませ。お願いしますです。
0010デフォルトの名無しさん2005/09/27(火) 11:15:53
>>9
この程度ならオーナー描画とサブクラス化で間に合うと思うが、osが不明だ。
たぶんwin32スレがよいとおもわれ。
http://pc8.2ch.net/test/read.cgi/tech/1125850096/

つーか、チート臭いな。
フライングボディシザースドロップ食らわせるよ?
0011デフォルトの名無しさん2005/09/27(火) 14:19:34
ageとく
0012デフォルトの名無しさん2005/09/27(火) 14:21:07
>>9-10
スレ違い
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
>>13
#define ABC "10"
こうする。
0015デフォルトの名無しさん2005/09/27(火) 14:35:20
>>14
ありがとうございます。
すみません、それじゃ駄目なんです。別に数値としても使いたいので。
atoi()すればいいじゃんとかそういうのは無しで、あくまでも
#define ABC 10
というマクロでやりたいです。
0016デフォルトの名無しさん2005/09/27(火) 14:39:41
>>13
こうすればいい。
#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
>>16
おお、すばらしい。めちゃくちゃ感謝です。ありがとうございます。
一旦マクロに渡して展開させてから処理するということですね。
ありがとうございました。
0018デフォルトの名無しさん2005/09/27(火) 14:46:22
>>15
"to_str(ABC)"を " to_str (ABC) "に変えてもダメ?
0019デフォルトの名無しさん2005/09/27(火) 14:48:00
>>17
>>1嫁
ttp://www.kouno.jp/home/c_faq/c11.html#17
0020172005/09/27(火) 14:54:29
>>19
ありがとうございます。
11.17 にあったのですね。すみませんでした。
0021デフォルトの名無しさん2005/09/27(火) 15:15:12
ちなみにprintfの桁数を揃えたいだけなら

#define MAX 3
printf("%-*.*s\n", MAX, MAX, "hoge");
printf("%*s\n", MAX, "hoge");

という方法もあったりする。上と下の違いは実行してみればわかる
0022セェンロン ◆89nOjCFiLI 2005/09/27(火) 15:30:24
>>10
誘導ありがとうございます。
オーナー描画とサブクラス化で検索してみます。
チートぢゃないですw
0023デフォルトの名無しさん2005/09/27(火) 16:26:54
今までsprintf使ってやってたよ
便利な方法があるんだな
0024デフォルトの名無しさん2005/09/27(火) 17:01:00
>>21
上の方は冗長じゃないか?
printf("%-.*s\n", MAX, "hoge");でいい希ガス
0025ハム ◆S.PtdgMO6E 2005/09/27(火) 17:26:32
C言語の演算子の優先度とその解釈について教えてください。

int 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:45
bの値を返し、そのあと1増加
0027デフォルトの名無しさん2005/09/27(火) 17:37:47
C-FAQの3.2辺り?
0028デフォルトの名無しさん2005/09/27(火) 17:39:09
b++ と ++b の違いくらい、本に載ってないの?
0029デフォルトの名無しさん2005/09/27(火) 17:39:34
後置インクリメント演算子は増加する前の値を返し、そのあと値を増加させます。
0030デフォルトの名無しさん2005/09/27(火) 17:42:21
ちなみに優先順位という考えでは
a=b++
も
a=(b++)
も同じ
インクリメント/デクリメント演算子は代入演算子より優先順位が高い
0031デフォルトの名無しさん2005/09/27(火) 17:50:15
後置++の副作用は式の実行後って解釈でOK?
0032ハム ◆S.PtdgMO6E 2005/09/27(火) 17:53:50
皆さんありがとうございます。

ということは、

*p++
*++p
*(p++)
(*p)++

これもそれに該当しますか?
0033デフォルトの名無しさん2005/09/27(火) 17:54:43
>>31
副作用じゃないだろ。まぁそれでいいはず
0034デフォルトの名無しさん2005/09/27(火) 18:08:13
>>32
p にアドレス X が入ってるとする。

*p++    X にある値を返し、p を1つ進める
*++p    p を1つ進め、X + 1 にある値を返す
*(p++)   *p++ に同じ
(*p)++   X にある値を返し、X にある値を1つ進める

>>33
副作用 = 式の値を求める以外の処理。
       即ち、出力、再代入等、状態の変化を伴う処理。
0035デフォルトの名無しさん2005/09/27(火) 20:28:110
int a = 0;
printf("%d%d%d", a++, a++, a++);

こういうのが210って出力されるのはなんで?
0036デフォルトの名無しさん2005/09/27(火) 20:29:250
>>35
それは偶然後ろから評価されたから。
この場合の動作は未定義。処理系によるから
やっちゃだめ。
0037352005/09/27(火) 20:31:130
そうだったのか。
しかし、C言語って未定義とか不定とか多いのなんとかならんのか。
0038デフォルトの名無しさん2005/09/27(火) 20:33:110
>>35
俺は012だった
0039デフォルトの名無しさん2005/09/27(火) 20:36:210
・コンパイラの作成に制限がかかりすぎて面倒
・不必要な制限は最適化に不利に働く
0040デフォルトの名無しさん2005/09/27(火) 20:36:480
>>35
参考
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:220
>>35
BCCでは210
GCCでは210
VC++ Toolkitでは000
でした
0042デフォルトの名無しさん2005/09/27(火) 20:37:280
>>37
別に未定義なことをしなければいいので無問題。
未定義や不定なことをやるコードにろくなコードはない。
0043デフォルトの名無しさん2005/09/27(火) 20:43:280
Java未定義や不定を排除したから遅いとか、デマを流してみるテスト
0044デフォルトの名無しさん2005/09/27(火) 20:46:580
Dならちゃんと定義してそうだがな
0045sage2005/09/27(火) 22:51:03
C言語で、 + - * と / % とで分類する際、
(2つの数字で演算する際、0が使えるかどうかの違い)
グループ名をそれぞれつけろと言われました。
決まったようなグループ名があるように言われたのですが、本やサイトで調べても分かりませんでした。
分かる方おりましたらよろしくお願いします。
0046デフォルトの名無しさん2005/09/27(火) 22:53:59
>>45
言 っ た 奴 に 聞 け
0047デフォルトの名無しさん2005/09/27(火) 22:55:08
教えてくれませんでした・・・
0048デフォルトの名無しさん2005/09/27(火) 22:57:05
たぶん、まじめに講義に出てる奴だけわかる俺定義。
0049デフォルトの名無しさん2005/09/27(火) 22:57:09
何かオナニー先生が悦に入るために出した問題っぽいなぁ。
0050デフォルトの名無しさん2005/09/27(火) 23:01:49
そんな分類名聞いたこと無いな
もう放置しとけ、俺定義を持ち出すような奴にろくな奴いない
0051デフォルトの名無しさん2005/09/27(火) 23:03:06
>>45
マルチ乙
0052デフォルトの名無しさん2005/09/27(火) 23:05:53
そうっすね、ありがとうございます。
俺定義なんですね・・・
0053デフォルトの名無しさん2005/09/27(火) 23:12:58
ビットマップの画像データを入れた二次元配列を90度、180度、270度に傾けて表示するにはどうしたらいいのでしょうか。
int **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
>>25
ポストインクリメント演算子は、式の評価が全部終了した時点で適用される。
副作用完了点でぐぐるとよい。
0056デフォルトの名無しさん2005/09/28(水) 00:24:48
main内に char a[10][10]; を作成し
外部関数を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)と渡しても問題ないのですが。
配列の配列として宣言し、その先頭アドレスを渡そうとするとエラーが出てしまいます。
どうすればよろしいでしょうか
0057532005/09/28(水) 00:29:12
ビットマップを読み込んで加工せよという課題なんで、画像データを入れた配列を使わなくてはいけないんです。
二次元配列は画像のサイズを利用してmallocで作ったのですが、この二次元配列をコピーするための同じ要素数の
二次元配列はどう作ったらよいのでしょうか。コピー元と同じやり方で作るしかないのかと悩んでいます。
0058デフォルトの名無しさん2005/09/28(水) 00:29:27
>>56
void func( char (*param)[10] );
0059デフォルトの名無しさん2005/09/28(水) 00:31:04
>>56
func(char **arr);

a[10][10]の場合、aは要素数10の配列先頭へのポインタが10個並んだ配列の先頭へのポインタ
0060デフォルトの名無しさん2005/09/28(水) 00:31:11
>>57
スレ違い。
後、処理を考える前に画像フォーマットの調査位しろ。
0061デフォルトの名無しさん2005/09/28(水) 00:32:46
>>59
それはポインタへのポインタ型を渡すときだろ。
0062デフォルトの名無しさん2005/09/28(水) 00:35:45
>>61
すまん、思いっきり間違った・・・
寝てくる('A`)
0063デフォルトの名無しさん2005/09/28(水) 00:36:46
>>57
ttp://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
>>58
ありがとうございます。
mainからfunc(param); (param[10][10])と渡した場合funcは、

char型配列へのポインタを渡さなければいけないのですね。。
0065デフォルトの名無しさん2005/09/28(水) 00:46:12
>>57
同じやり方で作ったらなにか問題があるのか?
0066572005/09/28(水) 00:54:17
>>63 >>64
どうもです。
特に問題があるというわけでなく、無駄な処理が増えると思ったもので。
いつも冗長なソースになりがちなんで少しでもスマートにしなくてはと気をつけながらやっているのですが。
0067デフォルトの名無しさん2005/09/28(水) 07:00:33
test
0068デフォルトの名無しさん2005/09/28(水) 17:00:09
mallocで1.5GBくらいを作業領域として確保して、100MBくらいの計算結果を
ファイルに出力する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:54
ヒント:ページング
0070デフォルトの名無しさん2005/09/28(水) 17:04:14
1.8G を malloc するのに 100M はファイル経由なのね・・
0071デフォルトの名無しさん2005/09/28(水) 17:06:36
>70
>1.8G を malloc するのに 100M はファイル経由なのね・・
メモリ経由です。ファイルの入出力は止めましたので。
0072デフォルトの名無しさん2005/09/28(水) 17:17:53
>>68
だからメモリクリーナーのようなジョークソフトがあるんだよ
0073デフォルトの名無しさん2005/09/28(水) 17:31:53
>>68
何Gメモリを積んでるか知らないが、プログラムを纏めたことにより
連続した1.8GBのメモリ確保が出来なくなったんだろう。
最初の1.5Gのmallocを次の1.8GBと統一してみれば上手くいくかもしれない。

あと、freeしたメモリはOSに返されるとは限らない。
ま、どっちにしろまともなOSならプロセスが終了したらメモリは解放されるな。
0074デフォルトの名無しさん2005/09/28(水) 17:42:45
まあ、GlobalAllocの出番だな
0075デフォルトの名無しさん2005/09/28(水) 17:54:40
scanfで関数を取得できますか?
0076デフォルトの名無しさん2005/09/28(水) 18:04:39

 こ こ で エ ス パ ー 登 場
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
0077デフォルトの名無しさん2005/09/28(水) 18:08:27
http://pc8.2ch.net/test/read.cgi/tech/1126357741/l50
0078デフォルトの名無しさん2005/09/28(水) 18:19:12
>>68
Win32ならHeapAlloc(), VirtualAlloc()またはファイルマッピングを使え
0079デフォルトの名無しさん2005/09/28(水) 18:19:32
>>74
VirtualAllocだろ。
0080デフォルトの名無しさん2005/09/28(水) 18:20:45
GlobalAlloc使って解放し忘れたら悲惨だなw
0081デフォルトの名無しさん2005/09/28(水) 18:21:00
sbrk
0082デフォルトの名無しさん2005/09/28(水) 18:22:37
>>80
なぜ?
0083デフォルトの名無しさん2005/09/28(水) 18:46:55
>>82
電源切るまで開放されない
0084デフォルトの名無しさん2005/09/28(水) 18:47:10
配列に格納した数字を昇順に並べ替えるにはどうしたらいいんですか?
0085デフォルトの名無しさん2005/09/28(水) 18:48:31
>>84
(;´Д`)
0086デフォルトの名無しさん2005/09/28(水) 18:54:39
>>83
いつの時代だよ。
0087デフォルトの名無しさん2005/09/28(水) 19:04:30
そもそもwin32はスレ違いだろ。
0088デフォルトの名無しさん2005/09/28(水) 19:08:49
>>84
qsort
0089デフォルトの名無しさん2005/09/28(水) 19:33:38
>>84
配列の要素(数字)を比較して、自分で昇順になるように並べ替えてください。
あと、学校の課題なら宿題スレに行け。
0090デフォルトの名無しさん2005/09/28(水) 19:58:09
なんかBCCでコンパイルしようとしたら

Borland 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
>>90
スレ違い。
BCCスレにでもどうぞ。
0092デフォルトの名無しさん2005/09/28(水) 20:15:28
>>90
コンパイラ内部のエラー
0093デフォルトの名無しさん2005/09/28(水) 20:24:00
>>84

#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
>>93
新言語ですか?
0095デフォルトの名無しさん2005/09/28(水) 20:37:18
>>84
#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
>>96
要素数がわかっているなら、配列につめ直してソートする手もある
後は、ヒープソートを使うと良いかな
0098デフォルトの名無しさん2005/09/28(水) 23:33:47
cgiやphpにみられるような掲示板やアプロダってC言語で作れるのでしょうか。
C言語を学んでいるのですがPHPを使って掲示板を作ろうと考えています、
でもC言語でそのようなものを作れるのであれば、勉強がてらC言語でつくろうかなとも考えているので。
宜しくお願いします。
0099デフォルトの名無しさん2005/09/28(水) 23:36:36
>>98
自宅サーバなど自分で管理しているサーバなら確実にできる。

そうでなくともサーバでCのコンパイルができればCで書けなくもないが、
そんなことができるサーバなんて普通ありえない。
0100デフォルトの名無しさん2005/09/28(水) 23:39:44
いちおうCGIをCで書けない事もないがな
0101デフォルトの名無しさん2005/09/28(水) 23:41:27
できるけど敢えてやるほどの事でもないような気がしないでもない
phpの勉強にもなるから、そっちでやったらどうか?
■ このスレッドは過去ログ倉庫に格納されています