- 1 名前:処理系定義の名無しさん mailto:sage [2008/07/09(水) 11:00:48 ]
- 言語の入門者向け解説スレです。
教えて欲しいのではなく宿題を丸投げしたいだけなら宿題スレへ行ってください。 C/C++の宿題を片付けます 110代目 pc11.2ch.net/test/read.cgi/tech/1213796455/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 31 pc11.2ch.net/test/read.cgi/tech/1214569903/ 過去スレ 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
- 4 名前:全スレ 924 mailto:sage [2008/07/09(水) 13:27:58 ]
- kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7308.c
ソースをアップしました。
- 5 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:28:53 ]
- thread_new=otu>>1;
- 6 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:34:09 ]
- typedef struct
{ unsigned short HOGE_COUNT; char Reserve[14]; char data[2]; } HOGE_HED; HOGE_HED* fpHOGE; HOGEHOGE* fpHOGEDATA; fpHOGEDATA = (HOGEHOGE *)fpHOGE->data; ざけんな
- 7 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:35:58 ]
- ワロタ
- 8 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:37:33 ]
- アハハハハハ …ハァ
- 9 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:39:45 ]
- 長さが決まってない構造体を扱う場合はこうするとネットで見たのでそれをまねしたんですけど・・・
- 10 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:41:47 ]
- >9
たぶん、それは可変長の文字列を扱うための、 あまり行儀がよくないがよく使われている方法だろう まあここだけじゃなさそうだから少し待て
- 11 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:43:02 ]
- void HogeFree(HOGEHOGE* wfp)
{ free(wfp); return; } これはねーよ・・・
- 12 名前:924 mailto:sage [2008/07/09(水) 13:47:13 ]
- >>11
機能を分割してて、他から呼ばれる予定で作ったのでまだ未使用 ですしフェールセーフもいれてません。
- 13 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:47:33 ]
- 流し読みした感じ
一応手前の確保は sizeof(HOGEHOGE) * ret 増加分は見込んでるのか しかし -2 ってマジックワードは何よ? あと malloc() の戻りでないアドレスに対する free() は保証外じゃなかったっけ? そこらへんの落とし穴は大丈夫なのか?
- 14 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:49:42 ]
- >>4
wfp = fpEntTy[i]; case -2 : if (wfp->prevdata == NULL) { wfp2 = fpEntTy[i]; } free(wfp); wfp = wfp2; if ( wfp != NULL ) wfp = (HOGEHOGE *)wfp->nextdata; この流れがあやしい wfpとwfp2は同じもの(fpEntTy[i])を指してるよな? wfpはfreeしてしまったんだから、同じ場所を指してるwfp2も触ってはだめなんじゃないか?
- 15 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:49:50 ]
- >あと malloc() の戻りでないアドレスに対する free() は保証外じゃなかったっけ?
>そこらへんの落とし穴は大丈夫なのか? 今それが一番くさいです。 なのでリストから切り離したあとfreeする部分をコメントにしたらフリーズしませんので
- 16 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:50:03 ]
- -2はヘッダのchar[2] 分でしょ。
- 17 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 13:54:26 ]
- LineCount()とChkIndexの仕様は
- 18 名前:デフォルトの名無しさん [2008/07/09(水) 13:59:14 ]
- if ((fp = fopen(fname, "r")) == NULL) {
printf("%s が見つかりません\n",fname); } 読み込むファイル名の入力処理なんですが、VSだと古い形式と警告されます。 より安全にするにはどう書いたらいいんですか?
- 19 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:00:03 ]
- LineCount() は リストに登録する対象となるデータの数字を返すだけです。
ChkIndex() はリストの元となるデータnコのうち現在どこまで処理したかを返すだけです。 呼ばれると数字を返したあと内部で持ってるカウンターをインクリメントします。
- 20 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:02:29 ]
- あっちこっちに不要なキャストがあるな
んでとりあえず if (wfp->prevdata == NULL) { wfp2 = fpEntTy[i]; } else { wfp2 = wfp->prevdata; } HogeDel(i,wfp); wfp = wfp2; break; これは HogeDel(i,wfp); wfp = fpEntTy[i]; break; の間違いじゃないのか? その下も同様に HogeDel(i,wfp); //free(wfp); wfp = fpEntTy[i]; break;
- 21 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:04:52 ]
- 実は、を連発するあたりでだいぶなえてしもうた
有志ガンガレ
- 22 名前:924 mailto:sage [2008/07/09(水) 14:05:09 ]
- >>20
やってることはリストをたどりながら処理をし(ChkSwitch)不要になった ら戻り値によって途中で削除ということなので wfpがリストの中ほどなのかリストの一番先頭なのか を判断してます。
- 23 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:05:37 ]
- >>19
int index = ChkIndex(); -(1) if (index < fpHOGE->HOGE_COUNT) { ... wfp = (HOGEHOGE *)(fpHOGEDATA + ChkIndex()); -(2) (1) の戻りが HOGE_COUNT-1 の場合 fpHOGEDATA は 0〜HOGE_COUNT-1 の HOGE_COUNT個確保しているにもかかわらず (2) で HOGE_COUNT を返すことになり 確保外のアドレスを指示することになっている
- 24 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:08:34 ]
- >>18
if(fopen_s(&fp, fname, "r")){ printf("%s が見つかりません\n",fname); }
- 25 名前:デフォルトの名無しさん [2008/07/09(水) 14:09:52 ]
- >>24
どうも! この辺の解説サイトありますか?
- 26 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:12:03 ]
- >>25
msdn.microsoft.com/ja-jp/library/z5hh6ee9
- 27 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:12:14 ]
- >>22
じゃあこうだろう wfp2 = wfp->nextdata; HogeDel(i,wfp); if(ChkSwitch[wfp->Hoge06](i,wfp) == -2) { free(wfp); break; } wfp = wfp2;
- 28 名前:27 mailto:sage [2008/07/09(水) 14:15:38 ]
- あ、break消し忘れた
まあとにかく、元のソースだとwfp2に入れてる値がおかしい wfp2 = fpEntTy[i]; としても、その後HogeDel()で fpEntTy[i] が変化してもwfp2は変わんないだろ
- 29 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:17:07 ]
- >>27
それだと常に削除の対象です・・・ ChkSwitchの戻り値が-1と-2は削除それ以外の場合、リストはそのままなんです。
- 30 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:18:28 ]
- つーか、下手に技巧かまして初期に配列確保して動かないコード書くぐらいなら
単品 malloc() を n回呼び出し+途中の追加も単品 malloc() のほうがマシじゃね?
- 31 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:21:29 ]
- >>29
switch(ChkSwitch[wfp->Hoge06](i,wfp)) { case -1: wfp2 = wfp->nextdata; HogeDel(i,wfp); wfp = wfp2; break; case -2: wfp2 = wfp->nextdata; HogeDel(i,wfp); free(wfp); wfp = wfp2; break; default: break; }
- 32 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:23:59 ]
- 宿題スレだな
- 33 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:25:34 ]
- ついでにこっちも直しとく
// // 領域確保部分抜粋 // int size = sizeof(HOGE_HED) + sizeof(HOGEHOGE) * ret; fpHOGE = malloc(size); if (fpHOGE == NULL ) return -18; memset(fpHOGE,0x00,size); fpHOGE->HOGE_COUNT = ret; fpHOGEDATA = (HOGEHOGE *)(fpHOGE+1);
- 34 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:29:23 ]
- >>33
>fpHOGEDATA = (HOGEHOGE *)(fpHOGE+1); あーなるほど。こうすればいいんですね。 これでchar data[2];が不要になりますね。
- 35 名前:924 mailto:sage [2008/07/09(水) 14:35:13 ]
- >>30
まー近い挙動のものにシューティングゲームなんかがありますけど ゲームを構成する素材(背景や敵本体)は固定になりますが、自機や敵が吐き出す弾 は事前に・・というわけにはいきませんよね? それでこういった2種類の領域の確保の仕方になってます。 >>31 ありがとうございます。 これでうまくいきました。 最近大改造してようやく今のスタイルにこぎつけたので混乱してました。
- 36 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 14:53:37 ]
- >>35
は? 全て固定にしろと言っているのではなく、 全て動的にしといて たまたま固定分は先にやっちゃったね って構造のことを指しているのだが? 全て敵が吐き出す弾扱い。 背景や敵本体は初期化の時に1個1個追加してくだけじゃん
- 37 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:00:19 ]
- まーいいじゃないですか
あの変なポインタ操作みてるとヘッダ+データになったバイナリファイルをまとめて 読み込んだりしてるんでしょ? >>31で動いたってことは領域の確保の問題じゃなく単にリスト操作の間違いだったんだし。
- 38 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:04:54 ]
- >>37
リストをバイナリファイル保存するのは… テラオソロシス ちゃんと繋ぎ替え作業しないといけないしね。 そこだけ違うコード書くってことは、そこで間違う可能性もあるわけだし… >>31 の修正で動く >>31 のせずに、構造体のメンバ入れ替えで挙動変化する のは、どういう副作用かなぁ free後次の alloc する何か次第なんだろうけど…
- 39 名前:デフォルトの名無しさん [2008/07/09(水) 15:21:54 ]
- 学校の課題なんですが、どうやればいいかいまいちわかりません。
なので、全体の流れだけでもいいので教えてくれませんか? 以下、課題の内容です。 200x200ピクセルの画像の中に三角形、四角形、円、楕 円を用いて絵を作成しよう。その際、関数を用いて作成し ましょう。 図形の作成、移動、回転などには関数を用いること。 効率よく関数を使って、絵を作成しましょう。 main関数は画像配列の確保と関数の呼び出しで作成する。 出力ファイル名(art.bmp)
- 40 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:23:17 ]
- 要するにfreeした後の領域を使おうとしてたわけで、
おそらくアロケート情報が入っていた領域先頭付近のメモリの書き換えが発生したんだろう だからポインタを先頭に置いてたらおかしくなった 後ろに配置してたときはたまたま情報が壊れずに残ってたと
- 41 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:26:40 ]
- >>38
別人28号、余談だが俺いま、双方向ツリーデータのべた書き保存してるよ。 元々はテキストで保存読込みしていたが、あまりにも遅いので、いろいろ考えた据え メモリーイメージべた書きにした。もちろんアドレス変換つきで。 数十Mぐらいのデータ読込みに分かかってたのが一瞬で読み込めるようになった。 いや〜あまりの速さに、TPOを考慮しないプログラムもいいなと思った。(チラシの裏
- 42 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:29:42 ]
- そういうことやね
- 43 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:30:30 ]
- >39
1)各画像をビットマップ描画する関数を作る。 このとき、関数の引数で図形の基準座標や大きさ、角度などを指定できるようにする。 指定の方法はいろいろあるが、かなり引数が多くなることもある。 その場合には必要な変数を構造体に詰めこんでそのポインタを渡すと楽。 対象のビットマップは、引数で渡してもいいし、どうせ1個しか書かないなら、 グローバル変数で確保してもいいだろう。 2)mainで、1)で作った関数に適当に数値を与えて呼び出し、ビットマップに描画する。 3)作ったビットマップをファイルに書き出す(何かメソッドがあるはず)。
- 44 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:30:53 ]
- >>40ね
- 45 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:31:00 ]
- >>40
なるほど。 ある意味先頭に持ってきたためにバグが発覚してよかったのかもなw >>41 まあリストを保存するっていったって、保存ルールさえ決めちゃえば 問題ないしな。
- 46 名前:デフォルトの名無しさん [2008/07/09(水) 15:32:28 ]
- char func(char *hoge){
char hoge2[256]; 処理 return *hoge2; } とする関数を定義しました。 main関数で char test[256]; *test= func("文字列"); って書いたんですが、testにゴミしか入りません・・・ 正しいやり方を教えてください
- 47 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:36:00 ]
- char *func(char *test, char *hoge){
char hoge2[256]; 処理 return strcpy(test, hoge2); } main() { char test[256]; func(test, "文字列");
- 48 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:37:28 ]
- int func(const char *hoge1,char *hoge2){
} char test[256]; func("文字列",test); でfuncの中でtestに書き込みできるよ
- 49 名前:39 mailto:sage [2008/07/09(水) 15:37:49 ]
- >>43
ありがとうございます! 関数を作るってところが授業でもよくわかっていないのですが、どんな感じかソースを少し書いてみてくれませんか? 質問ばかりですいません。
- 50 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:40:37 ]
- 宿題スレに行けよ
- 51 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 15:50:52 ]
- >>49
細かい部分は処理系の用意しているグラフィック機能の詳細による たぶん実際にはC++なんだろうから、ビットマップオブジェクトクラスのメソッドを調べて使うこと void square(BITMAP bitmap, POINT *points) { bitmap->pen->color=BLACK; bitmap->pen->move(points[0].x, points[0].y); bitmap->pen->line(points[1].x, points[1].y); bitmap->pen->line(points[2].x, points[2].y); bitmap->pen->line(points[3].x, points[3].y); bitmap->pen->line(points[0].x, points[0].y); } あくまで感じ
- 52 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:02:20 ]
- 引っ越したときは引越し通知くらいほしいよね
- 53 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:08:05 ]
- マルチかと思ったら別人だったようだ
- 54 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:09:20 ]
- < 39 >
======================================== 引っ越しました! 近くにお越しの際は、是非お立ち寄り下さい ======================================== C/C++の宿題を片付けます 112代目 pc11.2ch.net/test/read.cgi/tech/1215439445/260
- 55 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:10:40 ]
- 本とかによく出てるプログラムをそのまま打ち込んでうまくコンパイルしてくれるコンパイラって無いの?
- 56 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:11:46 ]
- それができりゃあプログラマの仕事がなくなるな
- 57 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:19:51 ]
- 換字式暗号について聞きたいんですが、c言語で[a,b,c]を[g,C,f]に変換するようなプログラムってどう作ればいいですか?
ちなみに文字列に規則性はないです。
- 58 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:19:52 ]
- それはタイパーの仕事じゃ?
コンパイルできないといっているコードはコード片だったりしないのかな
- 59 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:20:52 ]
- 微妙に違う内容でマルチすんなw
- 60 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:21:36 ]
- >>57
rand関数で適当にASCIIコードを進める
- 61 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:24:29 ]
- >>55
本と同じ環境、同じコンパイラーならそのまま動く。 しかし、半年や1年で、OSもコンパイラーも仕様さえも変わってしまう時が有る。 一つの変化は数年だが、環境は多くのソフトで成り立つので。どれかがすぐに変わるのはザラ。
- 62 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:27:25 ]
- qあwせdrftgyふじこ
- 63 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:34:29 ]
- 標準関数かAPIに文字列の置き換え関数ってないの?
自分で作ったけどいまいち信用できない(速度的に)
- 64 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:36:52 ]
- >>63
cならそれこそマクロで皮だけ作ったら? #define hogehoge(A,B,C,D) { API_hoge(A,B,C,D) };
- 65 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:37:41 ]
- あーーーーーーすまんぼけてましたorz
文字列置き換えって言われてもどう置き換えるの?
- 66 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:42:28 ]
- 文字列の配列データーを作って、適当に文字列入れて、
文字のコードで配列を引く、これが単純。
- 67 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 16:59:29 ]
- >>57
char *stra = "abcdefghijklmeo....."; char *strb = "gCfEjBm....."; で文字が一致したところで置き換える
- 68 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 17:48:01 ]
- >>67
strb[data - 'a'] の何が不満なの?
- 69 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 17:58:07 ]
- >>65 こんな感じなんだけど非効率かどうか自分にはわからない
//szSrcの中からszKeyを探してszRepで置き換える //置き換えた数を返す int strrpl(char *szSrc, char *szKey, char *szRep) { int nRepTime = 0; size_t nSrcSize = strlen(szSrc); size_t nKeySize = strlen(szKey); size_t nRepSize = strlen(szRep); char *szCpySrc = new char[nSrcSize + 1]; strcpy(szCpySrc, szSrc); *szSrc = 0; char *cp = szCpySrc; char *_cp = szCpySrc; while (cp = strstr(cp, szKey)) { *cp = 0; strcat(szSrc, _cp); strcat(szSrc, szRep); cp += nKeySize; _cp = cp; nRepTime++; } strcat(szSrc, _cp); delete [] szCpySrc; return nRepTime; }
- 70 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 18:34:03 ]
- >>68
文字コードが順番じゃなくても使える ASCII限定でも問題ないんだろうけど
- 71 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 18:38:43 ]
- EBCDIC でやったときは"ABCDE・・・だったなー
- 72 名前:sage [2008/07/09(水) 21:06:35 ]
- 学校の課題でC言語が出てしまったのですが、さっぱり分かりません…
あつかましいかもしれないですが、どなたか教えてください… @「キーボードから10個の数値を入力して、10個の数値の最大値と最小値を表示するコードを 記述せよ」 A「キーボードから数値を入力し、その数が素数か否かを判断するコードを記述せよ」 よろしくお願いします。
- 73 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 21:07:57 ]
- ごめんなさい、1を見てませんでした。宿題スレに行ってきます。
- 74 名前:デフォルトの名無しさん [2008/07/09(水) 22:15:00 ]
- リスト構造がよく分かりません。
構造体は理解できるのですが、なぜそれが繋がっていくのか(繋げれるのか)がどうにも・・・。 抽象的な質問ですみませんが、どなたかお願いします。 例となるようなソースなどもあると助かります。
- 75 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:16:41 ]
- >>74
ポインターはわかります?
- 76 名前:74 mailto:sage [2008/07/09(水) 22:21:33 ]
- >>75
大まかには理解している、と思うんですが・・・。 intやcharなどの関数のメモリの先頭の場所で、 その関数を指すのと、その関数の場所を指すのは同じこと。 というくらいの理解なんですが・・・。
- 77 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:26:45 ]
- >>76
構造体の中に自分自身と同じ構造体をさせるポインターを持たせてあって それでつないでるのがリストです。
- 78 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:30:49 ]
- 宝箱の中に
「宝」と「次の宝箱の場所」が入ってるようなもんだ
- 79 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:31:44 ]
- www9.plala.or.jp/sgwr-t/c/sec15-5.html
ここなんてどうかな?
- 80 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:44:29 ]
- >>77
どう繋ぐかが分からず・・・。 >>78 その「次の宝の場所」は、どういう処理になっているのでしょうか? その「次」が無数に増える場合、最初から指定しておくのは不可能だと思うんですが、 どうやってその「次の場所」を指定すれば良いのか分からないのです。 >>79 struct list { char name[20]; struct list *next; /* 自己参照構造体 */ }; で、構造体のポインタ *nextを作成しているのは分かるんです。 でも、それがどういう働きをして「次の構造体」に行っているのかがよく分からず……。
- 81 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:51:14 ]
- たとえばこんな感じ
struct list { char name[20]; struct list *next; /* 自己参照構造体 */ }; int main() { list *listptr; listptr = (list *)malloc(sizeof(list); listptr->next = (list *)malloc(sizeof(list); listptr->next-next = NULL; return 0; }
- 82 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:52:05 ]
- 一部ミス
struct list { char name[20]; struct list *next; /* 自己参照構造体 */ }; int main() { list *listptr; listptr = (list *)malloc(sizeof(list); listptr->next = (list *)malloc(sizeof(list); listptr->next->next = NULL; return 0; }
- 83 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:53:07 ]
- あふーんorz
またまたミス。ヘッダとかは自分でいれてね。 struct list { char name[20]; struct list *next; /* 自己参照構造体 */ }; int main() { list *listptr; listptr = (list *)malloc(sizeof(list)); listptr->next = (list *)malloc(sizeof(list)); listptr->next->next = NULL; return 0; }
- 84 名前:74 mailto:sage [2008/07/09(水) 23:05:58 ]
- >>83
struct list { char name[20]; struct list *next; /* 自己参照構造体 */ }; int main() { list *listptr; listptr = (list *)malloc(sizeof(list)); /* mallocで確保したメモリの場所をlist型のlistptrに代入 */ listptr->next = (list *)malloc(sizeof(list)); /* listprtの中の*nextにmallocで確保したメモリの場所を代入 */ listptr->next->next = NULL; /* listprtの中の*nextで指定されたlistptrの中の*nextにNULLを代入*/ return 0; } って理解でいいんでしょうか?
- 85 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:11:21 ]
- >>84
です。 リストを管理するポインターは例のような単純なリストでも2つは欲しいですかねえ・・・ listptrはリストをつないで置くだけのポインタ。 リストの入り口ですかね。 で、リストの最後を判別するために最後の構造体のnextにはNULLを入れます。 これはリストの決まりごとみたいな感じですね。
- 86 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:14:22 ]
- struct list {
char name[20]; struct list *next; /* 自己参照構造体 */ }; int main() { list *listptr; //管理用 list *listwptr; //リストをたどる用 listptr = (list *)malloc(sizeof(list)); /* mallocで確保したメモリの場所をlist型のlistptrに代入 */ listptr->next = (list *)malloc(sizeof(list)); /* listprtの中の*nextにmallocで確保したメモリの場所を代入 */ listwptr = listptr->next; listwptr->next = NULL; /* listprtの中の*nextで指定されたlistptrの中の*nextにNULLを代入*/ return 0; }
- 87 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:29:30 ]
- 初心者です。
Visual C++ 2008 Express EditionをDLし、プログラミングしてみたところ なぜかコンパイルできません。なぜでしょう・・・? ---------------------------------------------------------- プログラム 'c:\work\sample_console1\Debug\sample_console1.exe'を開始 できません。 アクセスが拒否されました。 ---------------------------------------------------------- OSはVistaで管理者権限で実行しています。
- 88 名前:74 mailto:sage [2008/07/09(水) 23:44:41 ]
- >>86
むむむ、分からないorz listptr = (list *)malloc(sizeof(list)); /* mallocで確保したメモリの場所をlist型のlistptrに代入 */ でlist型の関数にメモリの場所を渡してますよね? このとき、struct listのchar name[20];は(今は説明のため省いてある部分だと思うのですが)どういう扱いになるんでしょうか?
- 89 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:46:41 ]
- >>88
一緒に確保されてる 構造体の定義が目次で、中身が本文で、本ごと手に入れるというか。
- 90 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:47:28 ]
- listptr->name
とか listptr->name[0] とか
- 91 名前:74 mailto:sage [2008/07/09(水) 23:59:05 ]
-
int main() { list *listptr; //管理用 list *listwptr; //リストをたどる用 listptr = (list *)malloc(sizeof(list)); /* mallocで確保したメモリの場所をlist型のlistptrに代入 */ scanf("%c",&listptr->name); listptr->next = (list *)malloc(sizeof(list)); /* listprtの中の*nextにmallocで確保したメモリの場所を代入 */ listwptr = listptr->next; listwptr->next = NULL; /* listprtの中の*nextで指定されたlistptrの中の*nextにNULLを代入*/ return 0; } のような事をすれば、入力できると考えて大丈夫でしょうか?
- 92 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:01:24 ]
- >>91
領域をオーバーしないように十分な注意を払える環境であればそれでも。
- 93 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:02:31 ]
- そんなことないわ。
scanf("%s",listptr->name); だね
- 94 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:03:05 ]
- >>91
そういう使い方をするならとりあえず入力の情報を受けるだけのでっかい器 を別に用意して文字数の確認なんかをした上でmemcpyとかで 入れてあげたほうが良いかもしれないですね。
- 95 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:07:39 ]
- まず構造体をおさらいしてからの方がいいのかも?
入力処理に自信がもてず、構造体に自信がもてない状態でリストに進むと、 何か問題があったときにどこが問題なのかが分からなくなるかもよ
- 96 名前:74 mailto:sage [2008/07/10(木) 00:18:47 ]
- 了解です。
構造体あたりから復習してみます。 ありがとうございました!
- 97 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:36:23 ]
- int hoge[10000];
と言う配列を以下のように操作したいのですがいまひとつ効率のよい方法が思いつきません。 1.hogeには0以上の整数がランダムで入っている 2.0は空きと考え、hogeを添字0から順に走査して1以上の数であれば添字の小さい順に詰める (301200960890なら312968900000としたい) 出来る限り効率の良い方法はどのようになるのでしょうか?
- 98 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:41:06 ]
- >>97
メモリ効率 or 時間効率?
- 99 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:41:52 ]
- それはCっていうより、アルゴリズムの話だからスレ違い
- 100 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:44:59 ]
- 時間効率なんですが、すれ違いみたいなので去ります
スレ汚し失礼しました
- 101 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:50:57 ]
- for(i=j=0; i<10000; i++) if(hoge[i]) hoge[j++] = hoge[i];
for(;j<10000; j++) hoge[j] = 0;
- 102 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 00:54:32 ]
- これでメモリ効率持ち出す奴ってどんなアルゴリズム考えたの?
- 103 名前:デフォルトの名無しさん [2008/07/10(木) 01:25:10 ]
- それはCっていうより、アルゴリズムの話だからスレ違い
warota
- 104 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 01:46:44 ]
- あげんなカス
|

|