C言語なら俺に聞け( ..
681:デフォルトの名無しさん
08/04/24 00:02:20
突然すまん
#include <stdio.h>
main(){
int *A, n, i;
printf("数字を入力してください\n");
for(i=0; i<n; i++)
scanf("%d", &A[i]);
printf("ヒープソートの結果\n");
for(i=0; i<n; i++)
printf("%d", heapsort(A[i]));
}
void heapsort(int *A, int n){
int i;
heapify(A, n);
for(i=n-1; i>0; i--)
A[i] = deletemax(A, i+1);
}
void heapify(int *A, int n){
int i;
for(i=n/2-1; i>=0; i--) downmax(i, A, n);
}
つづく
682:デフォルトの名無しさん
08/04/24 00:05:05
void downmax(int i, int *A, int n){
int j;
j = 2*1+1;
if(j >= n) return;
if(j+1<n && A[j]<A[j+1])
j = j+1;
if(A[j] > A[i])
{
swap (i, j, A);
ownmax(j, A, n);
}
return;
}
int deletemax(int *A, int n){
int max;
max = A[0]; A[0] = A[n-1];
downmax(0, A, n-1);
return(max);
}
void swap(int i, int j, int *A){
int temp;
temp = A[i]; A[i] = A[j]; A[j] = temp;
return;
}
コンパイル使用とすると
error C2371 heapsort が再定義されています
同様にheapify downmax swap が再定義されてるといわれる。
Microsoft.NET Framework SDK で C です。
683:デフォルトの名無しさん
08/04/24 00:10:14
関数プロトタイプ書け。
684:デフォルトの名無しさん
08/04/24 00:12:34
>>682
関数は使用(呼び出し)に先立って宣言する必要があります。
685:682
08/04/24 00:21:49
>>683,684
ググってみたので、
void heapsort(int *A, int n);
void heapify(int *A, int n);
void downmax(int i, int *A, int n);
void deletemax(int *A, int n);
void swap(int i, int j, int *A);
を追記したのですが
heapsort.c(17) : warning C4047: '関数' : 間接参照のレベルが 'int *' と 'int' で
異なっています。
heapsort.c(17) : error C2198: 'heapsort' : 実引数が少なすぎます。
heapsort.c(17) : error C2095: 'printf' : void 型引数を関数に渡そうとしました。2
番目の引数にエラーがあります。
heapsort.c(26) : error C2120: void 型がほかの型と同時に使われました。
heapsort.c(51) : error C2371: 'deletemax' : 再定義されています。異なる基本型です
。
heapsort.c(6) : 'deletemax' の宣言を確認してください。
orz・・・ とりあえずエラーナンバーでググってきます
686:デフォルトの名無しさん
08/04/24 00:22:11
>>637
規格スレで聞いたところ
スレリンク(tech板:133-139番)
ということだそうです
687:デフォルトの名無しさん
08/04/24 00:28:45
>>685
使っている処理系の標準ライブラリーにheapsort関数etcがあるんじゃないですか?
名前を変えてみるとか
688:デフォルトの名無しさん
08/04/24 00:35:18
>printf("%d", heapsort(A[i]));
これはheapsortの使い方がよろしくないし。
>int deletemax(int *A, int n){
>void deletemax(int *A, int n);
プロトタイプと実体は一致してないし。
コンパイラが文句言うのも当然というか。
689:682かつ685
08/04/24 00:37:28
>>687
heapsortをheapsortsに変えてやってみたのですが、
変化なし・・・
一応凡ミス :→;、 void→intとかを修正したところ
以下のエラーが。
heapsort.c(17) : warning C4047: '関数' : 間接参照のレベルが 'int *' と 'int' で
異なっています。
heapsort.c(17) : error C2198: 'heapsorts' : 実引数が少なすぎます。
heapsort.c(17) : error C2095: 'printf' : void 型引数を関数に渡そうとしました。2
番目の引数にエラーがあります。
17行目周辺は
scanf("%d", &A[i]);
printf("ヒープソートの結果\n");
for(i=0; i<n; i++)
printf("%d", heapsorts(A[i])); //17行目
}
void heapsorts(int *A, int n)
{
int i;
heapify(A, n);
for(i=n-1; i>0; i--)
A[i] = deletemax(A, i+1);
}
です。
690:682
08/04/24 00:39:51
>>682
後者は修正しました。
タイミングずれたけど689のように。
heapsortの使い方・・・調べてみます。
691:デフォルトの名無しさん
08/04/24 00:42:46
>>689
> heapsort.c(17) : warning C4047: '関数' : 間接参照のレベルが 'int *' と 'int' で
heapsortsの第一引数(int *A)がアドレス参照してない。
17行目でheapsorts(&A[i])とする
> heapsort.c(17) : error C2198: 'heapsorts' : 実引数が少なすぎます。
関数の引数は2個あるのに渡してるのは1個だけ。
これiでも渡すの?
> heapsort.c(17) : error C2095: 'printf' : void 型引数を関数に渡そうとしました。2
heapsortsの戻り値がvoid型だから。
戻り値をint型にして値を戻すように修正する。
692:デフォルトの名無しさん
08/04/24 00:44:31
まあ、Aが未確保というオチはあるし。
たぶん結果って言っているわけだから、heapsortはfor文の前段で仕掛けて、
for分の中はA[i]の表示だけで良いような気がするわけ。
693:691
08/04/24 00:44:54
あーごめん。配列渡してるのか
渡すのは
heapsorts(A, i)
とかでよろしく
694:682
08/04/24 00:52:37
>>691 どうもです。
1番目と3番目を修正ました。
ただその2番目、
692,693の言ってる部分がまだ理解できてないす・・・
現状
for(i=0; i<n; i++)
printf("%d", heapsort(&A[i]));
}
int heapsort(int *A, int n)
{
int i;
heapify(A, n);
エラー
heapsort.c(17) : error C2198: 'heapsort' : 実引数が少なすぎます。
printf("%d", heapsort(&A[i]));を
printf("%d", heapsort(A, i));??
無知fで申し訳ない・・・
695:デフォルトの名無しさん
08/04/24 01:21:14
無知と言うよりも、基礎を学ばずにいきなりヒープソートだなんて、一体全体何考えているんだか。
696:デフォルトの名無しさん
08/04/24 02:04:17
引数の意味すらわかってないようにも見えるしな
697:デフォルトの名無しさん
08/04/24 08:08:30
>>680
いえ、fclose() されるわけではないので、大丈夫です。
698:デフォルトの名無しさん
08/04/24 08:28:26
>>697
行の途中では^zや^dは利かないんじゃないか?
逆に、利いたとしたらストリームが閉じられているわけだから
二度と入力できなくなるぞ。
699:デフォルトの名無しさん
08/04/24 09:19:29
URLリンク(www.bohyoh.com)
> 改行文字を読み取ったとき、またはファイルの終わりを検出したときに、
> 文字の読取りは終了し、
改行コードまで取り込む性質があるわけだから、入力>改行で終わらせたら
当然改行コードは含まれてしまう。そこで、それを排除して取り込めばおk。
まぁ、やはり手段としてはEOFを入力するのもありだが、別のライブラリを用いては?
700:デフォルトの名無しさん
08/04/24 09:24:27
そこで、gets関数
701:デフォルトの名無しさん
08/04/24 09:43:19
っツーか、面倒くせぇ〜からmainへの引数として、実行する際にパラメーターに
ファイル名を渡して処理しチャイナと。
702:デフォルトの名無しさん
08/04/24 13:32:34
>>686
わざわざ質問してくださってありがとうございます。
スレリンク(tech板:139番)
の後半で述べられてることについて、こちらでも確認しました。
片方のみ初期化すると、その初期値で定義され、両方初期化すると
$ gcc src?.c
/tmp/cc4a7Yre.o:(.data+0x0): multiple definition of `a'
/tmp/ccwrP69I.o:(.bss+0x0): first defined here
collect2: ld はステータス 1 で終了しました
と望むエラーメッセージが表示されました。
ちなみにわたしはグローバル変数について勘違いしていたようです。
グローバル変数の宣言は、0での初期化が同時に行われると思っていたのですが、
実際は実行時に0で初期化される.bss領域ということを失念しておりました。
一応nmでシンボルのフラグをチェックしてみたところ、>>637は.bss領域にあり、
片方だけ明示的に初期化してもう片方にexternを使用すると.data領域に確保されることを確認しました。
グローバル変数は普通、明示的に初期化して使うものなんでしょうね。
グローバル変数を使う機会が多くないもので知りませんでした。
ありがとうございました。
703:デフォルトの名無しさん
08/04/24 17:25:19
CreateProcessで起動したプログラムをSendMessageで終了させるにはどうしたらいい?
検索してたらこんなん見つけたんだけど
引用元:URLリンク(homepage2.nifty.com)
BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
DWORD dwThreadId, dwProcessId;
dwThreadId = GetWindowThreadProcessId(hwnd, &dwProcessId);
if (dwProcessId == (DWORD)lParam) {
PostMessage(hwnd, WM_CLOSE, 0, 0);
}
return TRUE;
}
// pi は CreateProcess() したときの PROCESS_INFORMATION
EnumWindows(EnumProc, (LPARAM)pi.dwProcessId);
この使い方解説誰かお願い
CreateProcess
→FindWindow
→SendMessage
これだとFindWindowがおかしくてできなかった
704:デフォルトの名無しさん
08/04/24 17:40:45
FindWindowが駄目なら
FindWindowExを使えば良いじゃない。
705:デフォルトの名無しさん
08/04/24 17:44:48
Exは子ウィンドウのときだろ。
「FindWindowがおかしい」
キャプションかクラス名の指定がウンコなんじゃねーの。
706:デフォルトの名無しさん
08/04/24 18:00:48
>>703
使い方解説もなにも、
そのEnumProc関数をどこかに作っておいて
>EnumWindows(EnumProc, (LPARAM)pi.dwProcessId);
を実行するだけじゃない?
707:703
08/04/24 18:08:43
CreateProcess(NULL, "sample.exe", NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
hWnd = FindWindow("sample", NULL);
sample.exeはSleep(1000)で無限ループさせてる
hWndが0になってしまうorz
708:デフォルトの名無しさん
08/04/24 18:21:16
>>707
プロセスを作ってすぐにFindWindowしても、sample.exeの方はまだCreateWindowを呼ぶ前かもしれないし
WaitForInputIdleとか試してみたらどう
709:デフォルトの名無しさん
08/04/24 18:24:41
sleepで無限ループさせてるなら、なぁ。
sample.exeのキャプションに"sample"が無いんじゃねーの。
Spy++でも使って調べてクラス名でやってみれ。
710:デフォルトの名無しさん
08/04/24 18:26:59
いつまでスレチにかまってんだよ
711:デフォルトの名無しさん
08/04/24 18:41:57
>>681
int *A;
scanf("%d", A[0]); // この時点ば終わっている
貴方はポインターの使い方を全く理解していない。
int iValueBody[256];
int* A = iValueBody;
A の実体が無いのに、そこに値を放り込むなんてダメだよ。
なのでそれ以降はナンセンス。
712:デフォルトの名無しさん
08/04/24 18:55:13
nに値が入ってないのにループ回してるほうが先だろw
713:デフォルトの名無しさん
08/04/24 19:09:51
>>706,>>709
ありがとう、後でやってみる
>>708
sampleはコンソールアプリなんだ
714:デフォルトの名無しさん
08/04/24 19:28:00
>>713
Win32API質問箱 Build65
スレリンク(tech板)
715:デフォルトの名無しさん
08/04/24 19:36:39
>>714
そっち行ってみます
716:デフォルトの名無しさん
08/04/24 19:51:36
>>712
むむむ。彼の書き込みをみると、n には程よい値が入っていてくれて A はどこかちゃんとしたメモリー空間を示していてくれる・・という、とてつもない期待をしてるんだろうなぁ。(遠い目)
人工知能の C++MiKu とかだったら、希望通りにしてくれるのかもしれない(今は無くとも将来はまんざらでないかも)
717:デフォルトの名無しさん
08/04/24 19:59:59
少なくともソートとかに手を出すレベルじゃないのは確かだな
718:デフォルトの名無しさん
08/04/24 20:50:32
>>716同感です。
引数の渡し方がわからなくてあれだけ書いてるんだから
なんかサンプルみながらやってるんじゃない?
719:デフォルトの名無しさん
08/04/24 21:58:27
自分で入力したデータの件数分の平均身長、平均体重を出したいです。
(人数は一番最初に入力)
この場合、変数は、int型のweight height の他何が必要でしょうか?
720:デフォルトの名無しさん
08/04/24 21:59:46
10人に聞けば10通りの答えが返ってくる。
プログラムの書き方次第でどうにでもなるから答えようがない。
721:デフォルトの名無しさん
08/04/24 22:01:41
>>719
がんばればint型一個でできるよ
722:デフォルトの名無しさん
08/04/24 22:06:10
人数受け取ってmalloc
723:デフォルトの名無しさん
08/04/24 22:06:54
C言語におけるリテラル文字列の取り扱いですが、
置かれるメモリプールとかライフタイムとか
どうであるのが正しいんでしょうか?
例えば以下のコードはありですか?
const char * func()
{
return "AAA";
}
724:デフォルトの名無しさん
08/04/24 22:08:07
リテラル文字列は静的な領域に置かれる。
725:デフォルトの名無しさん
08/04/24 22:08:28
>>723
普通にありです。
726:デフォルトの名無しさん
08/04/24 22:25:05
>>724-725
回答ありがとうございました。
実装依存とかだと困るなーと思ってたんですが
そうじゃないんですね。
727:デフォルトの名無しさん
08/04/24 22:59:24
ファイルパス文字列(という言い方をしますが)の左右のダブルクォーテーションを削りたいです
ファイルパスの途中にスペース(C:\Program Filesみたいな)があるとダブルクォーテーションで
括られると思うのですが、これを削る方法はあるのでしょうか?
728:側近中の側近 ◆0351148456
08/04/24 23:05:22
>>727
(っ´▽`)っ こういう感じ。
void deleteDoubleQuotation(
char *c1,
char *c2
){
if(c1[0] = '"'){
strcpy(c2, &c1[1]);
}
else{
strcpy(c2, c1);
}
if(c2[strlen(c2) - 1] = '"'){
c2[strlen(c2) - 1] = '\0';
}
return;
}
729:719
08/04/24 23:09:08
質問変えます。
件数分の身長、体重を集計・・・するんですが、
どういう計算処理をすればいいんでしょうか?
730:デフォルトの名無しさん
08/04/24 23:12:11
合計して人数で割る
731:デフォルトの名無しさん
08/04/24 23:15:54
>>728
VB厨の私ですが感動しました
探して早速明日組んでみます(゚▽゚)
732:デフォルトの名無しさん
08/04/24 23:15:58
>>729 つか, 算術的にはどういう計算をするかを考えないのか?
733:デフォルトの名無しさん
08/04/24 23:20:08
もしダブルクォーテーションならスキップ
734:デフォルトの名無しさん
08/04/24 23:30:11
>>729
そういうのを考える事が初めの段階だと思うけど・・
アルゴリズムの本でも買ったらどうだろう
>>730のとおり算数と同じ処理をしてあげればいい
735:デフォルトの名無しさん
08/04/24 23:33:49
単純に考えた場合
[入力用]
int型 人数、1人の身長、1人の体重
[ほか]
int型 身長の合計、体重の合計、ループ用変数
こんなもん
736:デフォルトの名無しさん
08/04/24 23:39:02
〜略〜
ループ{
身長体重入力
ついでに人数カウント
}
合計・平均計算
〜略〜
737:デフォルトの名無しさん
08/04/24 23:46:08
>>713
そのEnumWindows()を使う手法はもちろんウィンドウを持つプロセスに対
してしか使えない。
コンソールアプリだとふつうはメッセージを受けとらないから、
TerminateProcess() するしかないんじゃないかな。
738:デフォルトの名無しさん
08/04/24 23:53:50
>>728
家にある環境でやってみたらできました(゚▽゚)
if(c2[strlen(c2) - 1] = '"')
c2[strlen(c2) - 1] = '\0';
↓
if(c2[strlen(c2) - 2] = '"')
c2[strlen(c2) - 2] = '\0';
改行コード?分があるようだったので-2にしてみたら綺麗に取れました
ありがとうございますー
739:737
08/04/24 23:55:49
>>737
他のスレで話が進んでいた。とても虚しい気分になった…
740:デフォルトの名無しさん
08/04/25 00:26:19
〜略〜
int 人数、1人の身長、1人の体重
int 身長の合計、体重の合計、ループ用変数
人数 = 入力()
ループ {
1人の身長 = 入力()
1人の体重 = 入力()
身長の合計 += 1人の身長
体重の合計 += 1人の体重
} (ループ用変数が人数になるまで)
結局平均が欲しいのかよくしらないけど、とにかく集計の計算
〜略〜
まとめてみた。できそうじゃないか!
741:デフォルトの名無しさん
08/04/25 00:51:03
char *c, data[200];
c = fgets(data, 200, stdin);
if(c != NULL && data[0] != '\n')
というのを、
char data[200];
if((fgets(data, 200, stdin) != NULL) && data[0] != '\n')
と書いても大丈夫でしょうか。
742:デフォルトの名無しさん
08/04/25 00:53:37
>>741 おk
743:デフォルトの名無しさん
08/04/25 00:55:19
大丈夫なのと書いた方がいいのとの間には
大きな壁があるけどな
744:TT
08/04/25 01:37:26
「Continue文」を使った宿題が出ました
内容が「60点以上を合格とし、合格者の平均点を出力する」です
誰かソースを教えて下さいm(_ _)m
745:デフォルトの名無しさん
08/04/25 01:39:31
>>744
宿題スレへどうぞ。
いや、どちらかと言えば半年ROMってから出直すことをお勧めしますが。
746:デフォルトの名無しさん
08/04/25 01:40:48
>>744
ソースを教えろといわれても、個人の成績のデータの入力仕様がわからないから教えられないだろ。
747:TT
08/04/25 02:03:32
「個人の成績のデータの入力仕様」は適当な数値で・・・
748:デフォルトの名無しさん
08/04/25 02:04:54
宿題スレ行け
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5391日前に更新/199 KB
担当:undef