- 1 名前:デフォルトの名無しさん [2008/04/29(火) 09:44:57 ]
- 言語の入門者向け解説スレです。
・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 26 pc11.2ch.net/test/read.cgi/tech/1206196600/ 過去スレ 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++の宿題を片付けます 105代目 pc11.2ch.net/test/read.cgi/tech/1208268461/
- 496 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:40:41 ]
- >>492
ちなみに確保した前の番地に文字数があるのでは?と仮定してそれを確認するなら int* ip = (int*)c; long* lp = (long*)c; こうしておいて printf("%d : ", *(ip - 1)); // c 先頭から int 分戻った場所から数値として表示 printf("%ld : ", *(lp - 1)); // c 先頭から long 分戻った場所から数値として表示 こんな風に確認するというのもあるよ(どちらにしても結果は外してるけど)
- 497 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:50:03 ]
- >>493
> ポインタの前ではなくほかのところにあったんですね。 それは処理系依存。 ポインタの前にある場合もあるだらう。
- 498 名前:デフォルトの名無しさん [2008/05/08(木) 23:11:55 ]
- じゃああんま頻繁にmallocすると、逆に管理テーブルのぶんムダ使いになるんですかね??
- 499 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:13:38 ]
- 管理テーブルを保持することよりも、
空きメモリを探す処理とfreeの分、 CPU時間の無駄遣いになることを気にしたほうがいい気がする。
- 500 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:22:31 ]
- ということはlinked listとかすごい効率悪いんだな・・・
ところでポインタのサイズ管理テーブルへのアクセスってどうやるの?
- 501 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:23:16 ]
- 実装によるとしか
mallocのソースでも眺めてみれ
- 502 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:25:09 ]
- 入門書クリアしたら次は何がいいかな?
アルゴリズム辞典とか眺めるの?
- 503 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:29:09 ]
- linked list はスタック上にメモリをプールしておけばいいぜ。
- 504 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 23:29:32 ]
- ×スタック上
○スタック状
- 505 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 01:50:05 ]
- >>502
良いソースを読むことだと思う どの言語でも同じだと思うが
- 506 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 01:55:07 ]
- 何か作りたいものがあるから学んでいるのでは?
それを作るのにまだ足りないものがあるならそれを学べばOK 足りてるなら作ろう
- 507 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 13:06:55 ]
- 実際に自分の目的とするものを作ること
その過程で、どのようにすれば目的を達成できるのかを考える能力を身に着けること 言語仕様がわかってても要求を実現できない新人多すぎ コーダーじゃねぇんだからさ
- 508 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 17:58:14 ]
- 0か1を要素にもつN次元のベクトルv(Nビットの情報ベクトルv)を入力した時
N個の要素はそれぞれ、確率pで0は1に、1は0に変わってしまい、また確率eで情報が消失する。 (消失した情報は2を代入すればよい) 上記の手続きを行い、画面にベクトルv'を出力(消失した要素はXを出力) というプログラムを整数の配列と擬似乱数で作りたいんですが、↓では数字がおかしくなってしまいます。 環境はunixのgcc 4.0.2です、初心者ですがご指導よろしくお願いします。 なお、ここではN=5、e=0.05、p=0.1としています。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 ; int main(void) { int v[N], u[N] ; int i ; float e, p, x ; for (i = 0; i <= N-1 ; i++ ) { printf("v[%d]=",i) ; scanf("%d",&v[i]) ; while (v[i] && v[i]!=1) { printf("v[%d]=",i) ; scanf("%d",&v[i]) ; } }
- 509 名前:508続き mailto:sage [2008/05/09(金) 17:58:40 ]
-
p = 0.1 ; e =0.05 ; for(i = 0 ; i <= N-1 ; i++) { srand(time(NULL)); x = (float)rand()/ 32768.0 ; /* xは0以上1未満の乱数 */ if( x < p ) { u[i] = (v[i]+1) % 2 ;} /* xが0以上p未満の時、受信に誤りが生じる */ else if( x >= p && x < p+e ) { u[i] = 2 ;} /* xがp以上p+e未満の時、情報は消失(2を代入) */ } printf("(") ; for(i = 1 ; i <= 7 ; i++) { if (u[i] == 2) printf("X ") ; else printf("%d ",u[i]) ; } printf(")\n") ; return 0 ; }
- 510 名前:509訂正。失礼しました mailto:sage [2008/05/09(金) 18:01:25 ]
- p = 0.1 ; e =0.05 ;
for(i = 0 ; i <= N-1 ; i++) { srand(time(NULL)); x = (float)rand()/ 32768.0 ; /* xは0以上1未満の乱数 */ if( x < p ) { u[i] = (v[i]+1) % 2 ;} /* xが0以上p未満の時、受信に誤りが生じる */ else if( x >= p && x < p+e ) { u[i] = 2 ;} /* xがp以上p+e未満の時、情報は消失(2を代入) */ } printf("(") ; for(i = 0 ; i <= N-1 ; i++) { if (u[i] == 2) printf("X ") ; else printf("%d ",u[i]) ; } printf(")\n") ; return 0 ; }
- 511 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:31:39 ]
- >>508
srand をループで毎回実行しない。最初の1回だけで良い。 32768.0 などという数字を直に書かず、(RAND_MAX+1.0) と書く方が良い。コンパイラによって rand() の最大値は異なる。 x<p でもなく x>=p && x<p+e でもない場合、u[i] の値は?
- 512 名前:508 mailto:sage [2008/05/09(金) 18:36:04 ]
- >>511
その場合u[i]は変化しません。 擬似乱数間の扱いが違ってましたか、勉強になります
- 513 名前:508 mailto:sage [2008/05/09(金) 18:38:06 ]
- あ、変化しないんだから
u[i] = v [i] ; ですね。なんという初歩的なミス、ありがとうございました。
- 514 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:47:04 ]
- 久々に突っ込みどころ満載なコードを見た気がする
- 515 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 19:57:02 ]
- >>502
pc11.2ch.net/test/read.cgi/tech/1209810861/ で手伝っていただけるとありがたいのですが、いかが?
- 516 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 21:39:27 ]
- 皆さんに伺いたいのですけど、
www.amazon.co.jp/Programming-Language-Version-Prentice-Software/dp/0131103628 C言語の決定版と言われるこの本、どうお考えでしょうか。 あと、これのC++版ありますが、ページ数が思いっきり増えてますよね。 こちらもできたら評価をお願いできればと思います。
- 517 名前:デフォルトの名無しさん [2008/05/09(金) 22:54:01 ]
- 本はいらないよ ネットのほうがいい それに基礎いくらやってもWindows(UNIX)アプリは作れない。
標準Cの数倍以上の分量はこなさないと無理。標準は共通部分だけの勉強だけ
- 518 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 23:06:49 ]
- >>516
それ買っておきなさい。 ネットのは怪しいのが多い。 しかし洋書はたけえな。
- 519 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 23:09:36 ]
- >>516
お前がどうしたいのかによる、まぁその本は教養というか理解が深まるとかそういうのだ
- 520 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 23:43:44 ]
- >>516
スレチだけど、洋書は輸出費を考慮しても.comの方が安い場合があるぜ。 時間と多少の手間を気にしないんならこっちもチェックしておくといい。 ttp://www.amazon.com/Programming-Language-Prentice-Hall-Software/dp/0131103628/ref=sr_1_1?ie=UTF8&s=books&qid=1210344092&sr=8-1
- 521 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:04:24 ]
- C言語そのものはとてもシンプルだと言うこと
#include によってもたらされる先輩方の資産と情報に振り回されない 目的をもってプログラムに取り組む ・・・ 例えて、辞書を丸暗記するのか、あるいは目的を持って辞書を引くのか・・というのに通じると。 ライブラリ群の知識や使い方に重点を置くより「こうしたい関数は無いか?」とする切り口の方がいいのではないかなと。 どちらにしても有る程度は知識得ないといけない訳だけど。
- 522 名前:デフォルトの名無しさん [2008/05/10(土) 00:05:42 ]
- 自分見やすい(辞書)サイトを保存しておいて、AND OR NEARなどで全文検索しようぜ
- 523 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:06:11 ]
- >>516
それは初心者向けでも玄人向けでもない微妙な本なんであんまりすすめない 推薦図書スレ>ttp://pc11.2ch.net/test/read.cgi/tech/1209441159/l50 感想スレ>ttp://pc11.2ch.net/test/read.cgi/tech/1064681919/l50
- 524 名前:デフォルトの名無しさん [2008/05/10(土) 00:10:00 ]
- たとえば、空き実メモリの容量を知りたければ、 メモリ 容量 などで検索する。
- 525 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:14:21 ]
- シンプルに見えて実はぐちゃぐちゃ それがC
- 526 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:16:21 ]
- Cをちゃんと理解したかったら、コンパイルした先のアセンブラと対比させるのが一番だと思う。
それが可能なのがCの最大の利点であり最大の欠点だから。
- 527 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 00:20:16 ]
- まず独習かダイテルあたりのしっかりした入門書で基礎仕様の理解を押さえる
その上でひたすら「目的意識を持って」コードを書きつつCFAQを流し読めば十分
- 528 名前:516 mailto:sage [2008/05/10(土) 08:23:53 ]
- レス色々ありがとう。
自分はプログラミングはちょっとやったことありますが、C言語に ついてはさっぱりです。プログラミング言語Cがあれば何もいらない、 って話を聞いたんですけど、ちょっと古い本だしどうなんだろうなぁと。 だけど、薄い本なんで、これでC言語が概観できるというなら欲しいと 思ってます。 >>523 こういうスレがあったんですね。ありがとうございます。
- 529 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 11:02:19 ]
- ただの趣味だからって、効率悪くてもなるべく自作するようにしてる俺エドモンド本田
- 530 名前:デフォルトの名無しさん [2008/05/10(土) 16:04:28 ]
- 複数行文字列(100行以上)を標準出力に書き出す際、
\ で複数行まとめて書くとインデントが使えず見辛い。 別の方法を考えたところ 1) printfで一行ずつ printf("黒い0服\n"); printf("お茶を1杯\n"); 2) fputsで一行ずつ fputs("赤い2んじん\n", stdout); fputs("橙色の3かん\n", stdout); 3) 配列に格納してwhile puts char *memo[] = { "黄色い4んごう", "五月みどり", "" }; char **memop = memo; while(**memop) puts(*memop++); (1) や (2) は解かりやすいが、(3) の方が見やすい。 ただ (3) のままだと宣言初期化時しか格納できない。 ・分岐後に文字列を格納したい。 ・strcpy は使用を控えたい。 悔しいのでスマートな書き方教えてくれ。
- 531 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:07:53 ]
- printf("黒い0服\n"
"お茶を1杯\n"); でいいよ
- 532 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:08:31 ]
- 別のテキストファイルにして読み込む
マジおすすめ
- 533 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:09:19 ]
- あぁでもprintfに直接文字列は推奨されないよ
%入ってるとまずいからだけど
- 534 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:12:28 ]
- putsでいいだろ
- 535 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:26:36 ]
- そこでfputsですよ
- 536 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:37:01 ]
- ABC &
上記の様にバックグラウンドプロセスABC に、パラメータを与えて実行させるのは どの様にすればいいのですか?
- 537 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:43:21 ]
- それはシェルの役目
- 538 名前:デフォルトの名無しさん [2008/05/10(土) 16:45:35 ]
- >>531
あぁ , 無しで繋げられるのだっけか。 でも , をつけてしまいやすいので使い方だけ覚えとく。 >>532,533 メモっとく。 >>534 puts("青6し"); puts("むらさき7ぶ"); か puts( "むらさき7ぶ\n" "灰ヤー" ); のような感じか。 もう少し考えてみるわ、サンクス。
- 539 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:50:35 ]
- 本題より例文が気になって仕方がない。むらさきしちぶ?
- 540 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 16:54:17 ]
- 抵抗のカラーコードの語呂合わせだろ。
俺は「青二才のろくでなし」って覚えているんだけど。
- 541 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 18:44:45 ]
- 失礼しms。
ttp://www.uploda.org/uporg1415339.c.html 上記のようなコードを書いたのですが、 bの領域を解放するときに ”Windows によって aaaaa.exe でブレークポイントが発生しました。ヒープが壊れていることが原因として考えられます。aaaaa.exe または読み込まれた DLL にバグがあります。” のようなエラーが出てしまいます・・・。。。 確保していない領域にアクセスし、それをフリーしようとしたときにおこるエラーみたいなことがググったら書いてあったのですが、 double** b; が確保されている領域と、callocで追加確保された領域が連続でないということでしょうか? またそのせいでこのエラーがおこっているのでしょうか? ご教授願います。よろしくお願いします。。。
- 542 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 18:50:19 ]
- >>541
> memmove(b, a, sizeof(a[0])*sizeof(a[0][0])); これのせいで同じ領域を二回 free している
- 543 名前:541 mailto:sage [2008/05/10(土) 20:38:45 ]
- >>542
memmoveだとだめなのでしょうか?
- 544 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:42:06 ]
- >>543
何がやりたいかによる a[y][x] に格納されている double の値をコピーしたいのであれば for(y=0;y<N;y++) memmove(b[y], a[y], N*sizeof(a[0][0]));
- 545 名前:541 mailto:sage [2008/05/10(土) 20:45:19 ]
- やりたいことはその通りなのですが、今の状態だとポインタをコピーしてる状態ということでしょうか?
- 546 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:47:01 ]
- >>545
V / / _,, ァ=ニニ:} _ .V /,.ィ"f= <r'ニ三{ |_ ┐ _l_ l 'vf^<''" 弋z.ミ'テtフ |_ Х □_ 匚 L | У 〉!ト _ i{ ´ ̄r' =|' ./ェ゙‐ェi. 、__`_ヤ ( その通りでございます ) ./iュ.Hヽ.、 ゙,ニ/ -^ ー'-.、,i._`ヽ,.仁リ ー - .、 /、
- 547 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:50:49 ]
- >>542,544,546
なるほどです。つながりました。ありがとうございました><
- 548 名前:デフォルトの名無しさん [2008/05/11(日) 01:50:19 ]
- 初心者です。すみませんがアドバイスお願いします。
char (*pacX)[3]; とした場合、pacXは3要素のchar配列へのポインタになると思いますが、 このような変数「の配列」を以下のように動的に確保するとします。 int iNum = 2; char (*pacX)[3] = new (char)[iNum][3]; この場合、ポインタ変数が2つ(iNum分)確保されるのでしょうか。それとも、それらが指す3要素のchar配列2つ分のメモリまで確保されるのでしょうか?
- 549 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 01:52:50 ]
- typedef して考えてみよう。
typedef char CharArray3[3]; CharArray3* pacX = new CharArray3[iNum];
- 550 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 01:56:23 ]
- newてC++やん
- 551 名前:デフォルトの名無しさん [2008/05/11(日) 02:13:33 ]
- >newてC++やん
すみません、確かにそうですね。 >>549 なるほど。。。元の質問で言えば後者の「それらが指す3要素のchar配列2つ分のメモリまで確保される」ということなのですね? イメージ的には 「char aacX[2][3]」と同じ分のメモリが確保されて、さらにいえば delete [] pacX; とすることで開放されるということよろしいでしょうか? で
- 552 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 02:24:13 ]
- >>551
そういうこと。
- 553 名前:デフォルトの名無しさん [2008/05/11(日) 02:28:42 ]
- >>552
ありがとうございました。
- 554 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 04:05:19 ]
- >>548
その記述ちょっと気色悪い。一歩間違うと関数へのポインターと見間違えちゃうし。 int (*func)(int k); // 関数へのポインター int a1(int k) { printf("%d¥n", k * 5); return k; } int a2(int k) { printf("%d¥n", k / 5); return k; } int main() { func = &a1; func(k); func = &a2; func(k); } みたいな・・・ 普通に char *a[3]; でいいと思うけど。
- 555 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 04:06:45 ]
- >>554
内容が理解できない人は黙っておいた方がいいよ。
- 556 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 06:00:32 ]
- char *a[3] ポインタの配列
char (*a)[3] 配列のポインタ
- 557 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:22:40 ]
- CGIにC使ってる人ってあまり見かけないんだけど、CでCGIってダメダメなの?
- 558 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:33:06 ]
- 実行速度的には悪くないけど、LLに比べるとテキスト処理が面倒なのと、非セキュアになりやすい(バッファオーバーフローとか)からじゃないかねぇ。
- 559 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:40:20 ]
- 単にcコンパイラ使わせてくれる鯖が少ないからじゃないの?
- 560 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:43:33 ]
- >>559
どの言語が用意されているかというのは、Web制作板的な視点じゃないか プログラム板的には、どの言語で実装するのが適切かという話題だと思ってたが。
- 561 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 10:47:22 ]
- >あまり見かけないんだけど
とあったからそれに沿うように答えただけなのだが。 性能的には何ら問題ないと思う、とつけたほうがよかったかな?
- 562 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:06:01 ]
- なぜCコンパイラ使わせてくれる鯖が少ないか、
というところまで考え出すと、 結局 >>558 に行き着くんじゃないかと思う。
- 563 名前:デフォルトの名無しさん [2008/05/11(日) 11:41:06 ]
- 数列の最大値を計算するアルゴリズム 数列:0、3、1、4、7、2、8
お願いします。
- 564 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:45:28 ]
- >>563
わかりました 消えてください
- 565 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:48:20 ]
- 宿題丸投げは宿題スレへ
- 566 名前:デフォルトの名無しさん [2008/05/11(日) 12:00:34 ]
- ><
- 567 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 12:22:18 ]
- >>563
max(0, max(3, max(1, max(4, max(7, max(2, max(8))))))); ><
- 568 名前:デフォルトの名無しさん [2008/05/11(日) 14:42:42 ]
- 適当に数字を入力して
その数字をまたある数で割って割り切れたらその値を出力して 割り切れなかったら余りだけをまた別の小さい値で割りきれるか って繰り返して最終的には割り切れるプログラムを作りたいんですが・・・ 例えば1020を500で割ると2余り20で2が出力され 余り20を10で割って2が出力されるみたいな ヒントでもいいんでお願いしますm(_ _)m
- 569 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:23:44 ]
- その日本語を1行ずつCに翻訳していけばいいと思うよ
- 570 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:24:56 ]
- ってある数で割るって何で割るんだよ
1020を1020で割って余り0で終了、じゃだめなの
- 571 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:25:52 ]
- 意味が分からん
ある数って何だよ 入力した値か?
- 572 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:28:12 ]
- >>558
速度的にはアレなんじゃね? スクリプト系のmod_*みたいな仕組みってCでは一般的でないし。 2chは、やってるみたいだけど。
- 573 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:10:07 ]
- >>568
ユークリッドの互除法?
- 574 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:12:50 ]
- 568です
説明が下手ですいません レジのおつりを渡す要領で 適当な値を入力して500、100、10、1で各々割って何が何枚必要か求めたいんです
- 575 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:14:36 ]
- どこが分からないのかわからない。
それをそのままコードに落とせばいいだけだろ
- 576 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:19:33 ]
- つりの硬貨の枚数が最小になるようにとか、なにがしかの条件がついてるけど、それが説明できてないんだろ?
- 577 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:19:49 ]
- こうだろ
#include<stdio.h> int main() { static const int coin[] = {500,100,50,10,5,1,0}; int price, i; printf("金額は?"); scanf("%d", &price); for(i = 0; coin[i]; i ++) { printf("%d円玉が%d枚\n", coin[i], price / coin[i]); price %= coin[i]; } }
- 578 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:19:57 ]
- ちょっと自分でやってみます
迷惑かけてすいませんでした
- 579 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:20:39 ]
- 自己解決しました
- 580 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:31:40 ]
- エロイ人教えてください!
エクセルで作成したファイルをスターファックスで VBAなどで自動送信出来ませんか? キーボードマクロなるフリーソフトを見つけましたが 自分ではうまく設定できません イメージは以下の感じです @送信ファイルをエクセルで作成 AVBAでスターファックスを起動 Bキーボードマクロ等で送信先を自動入力 Cエクセル画面に戻る 初心者丸出しですいませんが宜しくお願いします
- 581 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:31:49 ]
- どうでもいいが、とってもありがちな課題だな。
- 582 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 16:58:37 ]
- >>580
こんなソフト作ってくださいスレに行きやがれですぅ
- 583 名前:580 mailto:sage [2008/05/11(日) 18:05:44 ]
- >>582
そんなスレあるんですか? 移動します スンマセン
- 584 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 18:17:49 ]
- ある下記のような2つのcsvファイルの「商品コード」という項目を比較して
実績ファイルにある「商品コード」が、商品コードマスタに存在するかどうか をチェックし、あったらその後の処理へ、なかったらエラーを出すといったプログラムを作りたいと考えてます。 (売上ファイル.csv) 顧客コード,商品コード,数量 10000,2544,2 12111,2566,5 12546,2354,8 (商品コードマスタ.csv) 商品コード,商品名,単価 2544,aaaaa,1000 2354,bbbbb,1500 このとき、c言語ではどういった関数を使って どういった流れで考えるとよいでしょうか? 例えば下名はアクセスを使ったことあるので アクセス(VB)でのテーブル同士の比較だったら、 if 商品コード(売上ファイルTBL)=商品コード (商品コードマスタTBL) をレコードのEOFまで繰り返す、という処理でいいと思うのですが、 c言語の場合、しかもカンマ区切りcsvファイルの処理の場合、 どういった方向で考えたらいいのかということを知りたいです。 参考書を見たところ、ファイルポインタをつかう、fopen関数をつかうfgets関数で1行読み込む といった機能を使うのかなと思いましたが、商品コード部分のみを取り出して比較するやりかたがわかりません。 (また、全てのデータの桁数は変わる可能性があります) あつかましいですが、よろしければサンプルコードも提示して いただけたらありがたいです。
- 585 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 18:28:17 ]
- >>584
(っ´▽`)っ char shohinCode[256]; char shohinName[256]; int tanka; fscanf(fp, "%s,%s,%s", shohinCode, shohinName, &tanka);
- 586 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 19:25:26 ]
- >>584
(っ´▽`)っ #include <stdio.h> #include <stdlib.h> #include <string.h> int cmp(const void *elem1, const void *elem2); int existInMaster(void); typedef struct shohinM{ char shohinCode[256]; char shohinName[256]; int tanka; } shohinMaster; int main(void) { int line; line = existInMaster(); if(line == 0){ printf("エラーはありません\n"); } else{ printf("%d行目にエラーがあります\n", line); } return 0; } (続く)
- 587 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 19:26:07 ]
- >>586の続き
int existInMaster(void) { int returnCode = -1; FILE *fp = NULL; char line[1024]; int lineCount = 0; shohinMaster *sm = NULL; char shohinCode[256]; char kokyakuCode[256]; int suryo; int count = 0; int i; fp = fopen("./商品コードマスタ.csv", "r"); fgets(line, sizeof(line), fp); /*1行目は見出し*/ while(fgets(line, sizeof(line), fp) != NULL){ sm = (shohinMaster *)realloc(sm, sizeof(sm[0]) * (count + 1)); sscanf(line, "%[^,],%[^,],%d", sm[count].shohinCode, sm[count].shohinName, &(sm[count].tanka)); count++; } fclose(fp); qsort(sm, count, sizeof(sm[0]), cmp); (続く)
- 588 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 19:26:48 ]
- >>587の続き
fp = fopen("./売上ファイル.csv", "r"); fgets(line, sizeof(line), fp); /*1行目は見出し*/ while(fgets(line, sizeof(line), fp) != NULL){ lineCount++; sscanf(line, "%[^,],%[^,],%d", kokyakuCode, shohinCode, &suryo); for(i = 0; i < count; i++){ if(strcmp(sm[i].shohinCode, shohinCode) == 0){ break; } if(strcmp(sm[i].shohinCode, shohinCode) > 0){ returnCode = lineCount; goto END; } } if(i == count){ returnCode = lineCount; goto END; } } END: return returnCode; } int cmp(const void *elem1, const void *elem2){ return strcmp(((shohinMaster *)elem1)->shohinCode, ((shohinMaster *)elem2)->shohinCode); }
- 589 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 19:35:31 ]
- (っ´▽`)っ
さあ感謝しなさい☆ (っ´▽`)っの足を舐めなさい☆
- 590 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 20:03:04 ]
- 変なコテだけど、いいやつだな。
- 591 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 20:16:41 ]
- 無意味にコテつけてる時点で・・・
- 592 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 20:46:21 ]
- (っ´▽`)っ
>>586-589には リソース解放漏れがたくさんあるから注意してね☆ 関数existInMasterのEND:の直後に fclose(fp); if(sm != NULL){ free(sm); } を加えるんだ☆
- 593 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 20:48:10 ]
- >>591
(っ´▽`)っ 無意味にコテ!? (っ´▽`)っはコテつけるのが当たり前なの! www.google.co.jp/search?lr=lang_ja&num=50&ie=utf-8&oe=utf-8&q=%22%E2%97%860351148456%22
- 594 名前:584 mailto:sage [2008/05/11(日) 21:03:04 ]
- ご親切にありがとうございます。
ちなみにこのままコピペしてとりあえず実行してみようと思ったら 100個を超えるエラーが出たのですが、そのままではいけないのですかね? とりあえず、解読動くかどうかより 解読して、流れを理解することをがんばります
- 595 名前:側近中の側近 ◆0351148456 [2008/05/11(日) 21:05:25 ]
- >>594
(っ´▽`)っ インデントに全角スペース使ってるからね。 半角スペース、タブ文字は、2chでは表示されないの。 コピーしたら全角スペースを全て半角スペースに置換してね。
- 596 名前:584 mailto:sage [2008/05/11(日) 21:13:39 ]
- >>595
了解しました。 なにからなにまでありがとうございます。
|

|