C言語なら俺に聞け( ..
[2ch|▼Menu]
511:デフォルトの名無しさん
08/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
08/05/09 18:36:04
>>511
その場合u[i]は変化しません。
擬似乱数間の扱いが違ってましたか、勉強になります

513:508
08/05/09 18:38:06
あ、変化しないんだから
u[i] = v [i] ;
ですね。なんという初歩的なミス、ありがとうございました。

514:デフォルトの名無しさん
08/05/09 18:47:04
久々に突っ込みどころ満載なコードを見た気がする

515:デフォルトの名無しさん
08/05/09 19:57:02
>>502
スレリンク(tech板)
で手伝っていただけるとありがたいのですが、いかが?

516:デフォルトの名無しさん
08/05/09 21:39:27
皆さんに伺いたいのですけど、

URLリンク(www.amazon.co.jp)

C言語の決定版と言われるこの本、どうお考えでしょうか。

あと、これのC++版ありますが、ページ数が思いっきり増えてますよね。
こちらもできたら評価をお願いできればと思います。

517:デフォルトの名無しさん
08/05/09 22:54:01
本はいらないよ ネットのほうがいい それに基礎いくらやってもWindows(UNIX)アプリは作れない。
標準Cの数倍以上の分量はこなさないと無理。標準は共通部分だけの勉強だけ

518:デフォルトの名無しさん
08/05/09 23:06:49
>>516
それ買っておきなさい。
ネットのは怪しいのが多い。
しかし洋書はたけえな。

519:デフォルトの名無しさん
08/05/09 23:09:36
>>516
お前がどうしたいのかによる、まぁその本は教養というか理解が深まるとかそういうのだ

520:デフォルトの名無しさん
08/05/09 23:43:44
>>516
スレチだけど、洋書は輸出費を考慮しても.comの方が安い場合があるぜ。
時間と多少の手間を気にしないんならこっちもチェックしておくといい。
URLリンク(www.amazon.com)

521:デフォルトの名無しさん
08/05/10 00:04:24
C言語そのものはとてもシンプルだと言うこと
#include によってもたらされる先輩方の資産と情報に振り回されない
目的をもってプログラムに取り組む
・・・
例えて、辞書を丸暗記するのか、あるいは目的を持って辞書を引くのか・・というのに通じると。
ライブラリ群の知識や使い方に重点を置くより「こうしたい関数は無いか?」とする切り口の方がいいのではないかなと。
どちらにしても有る程度は知識得ないといけない訳だけど。

522:デフォルトの名無しさん
08/05/10 00:05:42
自分見やすい(辞書)サイトを保存しておいて、AND OR NEARなどで全文検索しようぜ

523:デフォルトの名無しさん
08/05/10 00:06:11
>>516
それは初心者向けでも玄人向けでもない微妙な本なんであんまりすすめない
推薦図書スレ>スレリンク(tech板)l50
感想スレ>スレリンク(tech板)l50

524:デフォルトの名無しさん
08/05/10 00:10:00
たとえば、空き実メモリの容量を知りたければ、 メモリ 容量 などで検索する。

525:デフォルトの名無しさん
08/05/10 00:14:21
シンプルに見えて実はぐちゃぐちゃ それがC

526:デフォルトの名無しさん
08/05/10 00:16:21
Cをちゃんと理解したかったら、コンパイルした先のアセンブラと対比させるのが一番だと思う。
それが可能なのがCの最大の利点であり最大の欠点だから。

527:デフォルトの名無しさん
08/05/10 00:20:16
まず独習かダイテルあたりのしっかりした入門書で基礎仕様の理解を押さえる
その上でひたすら「目的意識を持って」コードを書きつつCFAQを流し読めば十分

528:516
08/05/10 08:23:53
レス色々ありがとう。

自分はプログラミングはちょっとやったことありますが、C言語に
ついてはさっぱりです。プログラミング言語Cがあれば何もいらない、
って話を聞いたんですけど、ちょっと古い本だしどうなんだろうなぁと。

だけど、薄い本なんで、これでC言語が概観できるというなら欲しいと
思ってます。

>>523
こういうスレがあったんですね。ありがとうございます。

529:デフォルトの名無しさん
08/05/10 11:02:19
ただの趣味だからって、効率悪くてもなるべく自作するようにしてる俺エドモンド本田

530:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/10 16:07:53
 printf("黒い0服\n"
     "お茶を1杯\n");
でいいよ

532:デフォルトの名無しさん
08/05/10 16:08:31
別のテキストファイルにして読み込む
マジおすすめ

533:デフォルトの名無しさん
08/05/10 16:09:19
あぁでもprintfに直接文字列は推奨されないよ
%入ってるとまずいからだけど

534:デフォルトの名無しさん
08/05/10 16:12:28
putsでいいだろ

535:デフォルトの名無しさん
08/05/10 16:26:36
そこでfputsですよ

536:デフォルトの名無しさん
08/05/10 16:37:01
ABC &
上記の様にバックグラウンドプロセスABC に、パラメータを与えて実行させるのは
どの様にすればいいのですか?

537:デフォルトの名無しさん
08/05/10 16:43:21
それはシェルの役目

538:デフォルトの名無しさん
08/05/10 16:45:35
>>531
あぁ , 無しで繋げられるのだっけか。
でも , をつけてしまいやすいので使い方だけ覚えとく。
>>532,533
メモっとく。
>>534
 puts("青6し");
 puts("むらさき7ぶ");

 puts(
  "むらさき7ぶ\n"
  "灰ヤー"
 );
のような感じか。

もう少し考えてみるわ、サンクス。

539:デフォルトの名無しさん
08/05/10 16:50:35
本題より例文が気になって仕方がない。むらさきしちぶ?

540:デフォルトの名無しさん
08/05/10 16:54:17
抵抗のカラーコードの語呂合わせだろ。
俺は「青二才のろくでなし」って覚えているんだけど。

541:デフォルトの名無しさん
08/05/10 18:44:45
失礼しms。

URLリンク(www.uploda.org)

上記のようなコードを書いたのですが、
bの領域を解放するときに
”Windows によって aaaaa.exe でブレークポイントが発生しました。ヒープが壊れていることが原因として考えられます。aaaaa.exe または読み込まれた DLL にバグがあります。”
のようなエラーが出てしまいます・・・。。。

確保していない領域にアクセスし、それをフリーしようとしたときにおこるエラーみたいなことがググったら書いてあったのですが、
double** b; が確保されている領域と、callocで追加確保された領域が連続でないということでしょうか?
またそのせいでこのエラーがおこっているのでしょうか?

ご教授願います。よろしくお願いします。。。

542:デフォルトの名無しさん
08/05/10 18:50:19
>>541
> memmove(b, a, sizeof(a[0])*sizeof(a[0][0]));
これのせいで同じ領域を二回 free している

543:541
08/05/10 20:38:45
>>542
memmoveだとだめなのでしょうか?

544:デフォルトの名無しさん
08/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
08/05/10 20:45:19
やりたいことはその通りなのですが、今の状態だとポインタをコピーしてる状態ということでしょうか?

546:デフォルトの名無しさん
08/05/10 20:47:01
>>545
  V /  / _,, ァ=ニニ:}       _
   .V  /,.ィ"f= <r'ニ三{        |_    ┐   _l_ l
    'vf^<''"  弋z.ミ'テtフ       |_ Х □_ 匚 L | У
    〉!ト _ i{ ´ ̄r' =|'
   ./ェ゙‐ェi.    、__`_ヤ     ( その通りでございます )
   ./iュ.Hヽ.、   ゙,ニ/
  -^ ー'-.、,i._`ヽ,.仁リ
  ー - .、     /、

547:デフォルトの名無しさん
08/05/10 20:50:49
>>542,544,546
なるほどです。つながりました。ありがとうございました><


548:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/11 01:52:50
typedef して考えてみよう。

typedef char CharArray3[3];
CharArray3* pacX = new CharArray3[iNum];

550:デフォルトの名無しさん
08/05/11 01:56:23
newてC++やん

551:デフォルトの名無しさん
08/05/11 02:13:33
>newてC++やん
すみません、確かにそうですね。

>>549
なるほど。。。元の質問で言えば後者の「それらが指す3要素のchar配列2つ分のメモリまで確保される」ということなのですね?
イメージ的には 「char aacX[2][3]」と同じ分のメモリが確保されて、さらにいえば
delete [] pacX;
とすることで開放されるということよろしいでしょうか?


552:デフォルトの名無しさん
08/05/11 02:24:13
>>551
そういうこと。

553:デフォルトの名無しさん
08/05/11 02:28:42
>>552
ありがとうございました。

554:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/11 04:06:45
>>554
内容が理解できない人は黙っておいた方がいいよ。

556:デフォルトの名無しさん
08/05/11 06:00:32
char *a[3] ポインタの配列
char (*a)[3] 配列のポインタ

557:デフォルトの名無しさん
08/05/11 10:22:40
CGIにC使ってる人ってあまり見かけないんだけど、CでCGIってダメダメなの?

558:デフォルトの名無しさん
08/05/11 10:33:06
実行速度的には悪くないけど、LLに比べるとテキスト処理が面倒なのと、非セキュアになりやすい(バッファオーバーフローとか)からじゃないかねぇ。

559:デフォルトの名無しさん
08/05/11 10:40:20
単にcコンパイラ使わせてくれる鯖が少ないからじゃないの?

560:デフォルトの名無しさん
08/05/11 10:43:33
>>559
どの言語が用意されているかというのは、Web制作板的な視点じゃないか
プログラム板的には、どの言語で実装するのが適切かという話題だと思ってたが。

561:デフォルトの名無しさん
08/05/11 10:47:22
>あまり見かけないんだけど
とあったからそれに沿うように答えただけなのだが。
性能的には何ら問題ないと思う、とつけたほうがよかったかな?

562:デフォルトの名無しさん
08/05/11 11:06:01
なぜCコンパイラ使わせてくれる鯖が少ないか、
というところまで考え出すと、
結局 >>558 に行き着くんじゃないかと思う。

563:デフォルトの名無しさん
08/05/11 11:41:06
数列の最大値を計算するアルゴリズム 数列:0、3、1、4、7、2、8

お願いします。

564:デフォルトの名無しさん
08/05/11 11:45:28
>>563
わかりました
消えてください

565:デフォルトの名無しさん
08/05/11 11:48:20
宿題丸投げは宿題スレへ

566:デフォルトの名無しさん
08/05/11 12:00:34
><

567:デフォルトの名無しさん
08/05/11 12:22:18
>>563
max(0, max(3, max(1, max(4, max(7, max(2, max(8)))))));
><

568:デフォルトの名無しさん
08/05/11 14:42:42
適当に数字を入力して
その数字をまたある数で割って割り切れたらその値を出力して
割り切れなかったら余りだけをまた別の小さい値で割りきれるか
って繰り返して最終的には割り切れるプログラムを作りたいんですが・・・
例えば1020を500で割ると2余り20で2が出力され
余り20を10で割って2が出力されるみたいな
ヒントでもいいんでお願いしますm(_ _)m


569:デフォルトの名無しさん
08/05/11 15:23:44
その日本語を1行ずつCに翻訳していけばいいと思うよ

570:デフォルトの名無しさん
08/05/11 15:24:56
ってある数で割るって何で割るんだよ
1020を1020で割って余り0で終了、じゃだめなの

571:デフォルトの名無しさん
08/05/11 15:25:52
意味が分からん

ある数って何だよ
入力した値か?

572:デフォルトの名無しさん
08/05/11 15:28:12
>>558
速度的にはアレなんじゃね?
スクリプト系のmod_*みたいな仕組みってCでは一般的でないし。
2chは、やってるみたいだけど。

573:デフォルトの名無しさん
08/05/11 16:10:07
>>568
ユークリッドの互除法?


574:デフォルトの名無しさん
08/05/11 16:12:50
568です
説明が下手ですいません
レジのおつりを渡す要領で
適当な値を入力して500、100、10、1で各々割って何が何枚必要か求めたいんです


575:デフォルトの名無しさん
08/05/11 16:14:36
どこが分からないのかわからない。
それをそのままコードに落とせばいいだけだろ

576:デフォルトの名無しさん
08/05/11 16:19:33
つりの硬貨の枚数が最小になるようにとか、なにがしかの条件がついてるけど、それが説明できてないんだろ?

577:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/11 16:19:57
ちょっと自分でやってみます
迷惑かけてすいませんでした

579:デフォルトの名無しさん
08/05/11 16:20:39
自己解決しました

580:デフォルトの名無しさん
08/05/11 16:31:40
エロイ人教えてください!

エクセルで作成したファイルをスターファックスで
VBAなどで自動送信出来ませんか?
キーボードマクロなるフリーソフトを見つけましたが
自分ではうまく設定できません

イメージは以下の感じです
@送信ファイルをエクセルで作成
AVBAでスターファックスを起動
Bキーボードマクロ等で送信先を自動入力
Cエクセル画面に戻る

初心者丸出しですいませんが宜しくお願いします

581:デフォルトの名無しさん
08/05/11 16:31:49
どうでもいいが、とってもありがちな課題だな。

582:デフォルトの名無しさん
08/05/11 16:58:37
>>580
こんなソフト作ってくださいスレに行きやがれですぅ

583:580
08/05/11 18:05:44
>>582
そんなスレあるんですか?
移動します スンマセン


584:デフォルトの名無しさん
08/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
08/05/11 18:28:17
>>584
(っ´▽`)っ
char shohinCode[256];
char shohinName[256];
int tanka;
fscanf(fp, "%s,%s,%s", shohinCode, shohinName, &tanka);

586:側近中の側近 ◆0351148456
08/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
08/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
08/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
08/05/11 19:35:31
(っ´▽`)っ
さあ感謝しなさい☆
(っ´▽`)っの足を舐めなさい☆

590:デフォルトの名無しさん
08/05/11 20:03:04
変なコテだけど、いいやつだな。

591:デフォルトの名無しさん
08/05/11 20:16:41
無意味にコテつけてる時点で・・・

592:側近中の側近 ◆0351148456
08/05/11 20:46:21
(っ´▽`)っ
>>586-589には
リソース解放漏れがたくさんあるから注意してね☆

関数existInMasterのEND:の直後に
fclose(fp);
if(sm != NULL){
  free(sm);
}
を加えるんだ☆

593:側近中の側近 ◆0351148456
08/05/11 20:48:10
>>591
(っ´▽`)っ
無意味にコテ!?
(っ´▽`)っはコテつけるのが当たり前なの!
URLリンク(www.google.co.jp)

594:584
08/05/11 21:03:04
ご親切にありがとうございます。
ちなみにこのままコピペしてとりあえず実行してみようと思ったら
100個を超えるエラーが出たのですが、そのままではいけないのですかね?

とりあえず、解読動くかどうかより
解読して、流れを理解することをがんばります

595:側近中の側近 ◆0351148456
08/05/11 21:05:25
>>594
(っ´▽`)っ
インデントに全角スペース使ってるからね。
半角スペース、タブ文字は、2chでは表示されないの。
コピーしたら全角スペースを全て半角スペースに置換してね。

596:584
08/05/11 21:13:39
>>595
了解しました。
なにからなにまでありがとうございます。

597:584
08/05/11 21:24:18
>>595
すみません、もうひとつ。

今解読中なのですが、理解の手助けに
・処理の流れ
・このプログラムの入力と、出力値
など、簡単に教えていただけませんか?
本当の初心者ですみません。

598:デフォルトの名無しさん
08/05/11 21:26:57
HTMLの使用も理解できない馬鹿がいる。

599:デフォルトの名無しさん
08/05/11 21:31:20
>>598
それを言うならHTMLの仕様だろ、と。
まぁ、変数宣言の変数名を揃えようとする辺りでお察しだから。

600:デフォルトの名無しさん
08/05/11 21:34:46
灯台や鏡台の先生からは sed の使い方とかは習わなかったんでしょうかね?

601:デフォルトの名無しさん
08/05/11 21:50:09
>>597
自分がどういうプログラム要求したか覚えてる・・?
見ていくと何となく流れがつかめるでしょ
どこまで理解したか言わないと答え丸写しで理解した気になる子になるよ

初心者≠免罪符

602:側近中の側近 ◆0351148456
08/05/11 22:39:49
(っ´▽`)っ
/*
*戻り値:
*エラーなし:0
*エラーあり:エラーがある行番号(見出し行を除く)
*/
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);


603:側近中の側近 ◆0351148456
08/05/11 22:40:30
  /*商品マスタ配列を商品コードの昇順に並べる*/
  qsort(sm, count, sizeof(sm[0]), cmp);
  /*売上ファイルを1行ずつ読み込み、商品コードを商品マスタ配列と照合する*/
  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);
}


604:側近中の側近 ◆0351148456
08/05/11 22:44:43
>>597
(っ´▽`)っ>>602-603
これで満足か?

605:側近中の側近 ◆0351148456
08/05/11 22:52:56
(っ´▽`)っ
売上ファイルも商品コードの昇順に並べると
もっといい感じになるかもね。

606:デフォルトの名無しさん
08/05/11 23:32:17
次の様に、単語毎に空白で区切られた文字列があり、一単語ずつ取ってくる処理を
行いたいと考えてます。文字列の中に入っている単語数は不定とします。

char str_str[] = "str1 str2 ・・・・ strN";


今現在、次に書き込むソースの様な処理で、一つずつ単語を読み込んでいます。
ここで、質問なのですが、sscanf等を使用してもっと上手に処理することはできないでしょうか?
以下の様にダミー変数を利用する方法は考えたのですが、入っている単語数が不定
なため、どうも不恰好なソースになってしまいます。

sscanf(str_str,"%s %s %s %s %s",str1, str2, str3, dummy, dummy);

すいませんが、アドバイスよろしくお願いします。


607:606
08/05/11 23:33:02
現在使っているソースコードは以下になります。
int main(void)
{
char src_str[]="str1 str2 str3 str4 str5";
char *next;
char *buff=src_str;

while((next=strsplit(buff, " "))!=NULL){
// 空白文字が2個以上続いた場合はbuffにはナル文字が入っている
if(buff[0] != '\0')
fprintf(stderr, "buff=%s, next=%s\n",buff, next);

buff=next;
}
return 0;
}

// 文字列をdelimstrを区切り文字列として分割し、区切後の文字列へのポインタを返す
char *strsplit(char* str,const char* delim_str)
{
char* delim_point = strstr(str,delim_str);
const size_t delim_len = strlen(delim_str);
size_t i;

if(delim_point == NULL) return NULL;
else {
*delim_point = '\0';
for(i=0;i<delim_len;i++) delim_point++;
}
return delim_point;
}


608:606
08/05/11 23:35:17
すいません、書き込んだ後、インデントがされてないのに気がついつきました。同じソースですが
int main(void)
{
  char src_str[]="str1 str2 str3 str4 str5";
  char *next;
  char *buff=src_str;

  while((next=strsplit(buff, " "))!=NULL){
  // 空白文字が2個以上続いた場合はbuffにはナル文字が入っている
    if(buff[0] != '\0')
      fprintf(stderr, "buff=%s, next=%s\n",buff, next);

    buff=next;
  }

  return 0;
}

// 文字列をdelimstrを区切り文字列として分割し、区切後の文字列へのポインタを返す
char *strsplit(char* str,const char* delim_str)
{
  char* delim_point = strstr(str,delim_str);
  const size_t delim_len = strlen(delim_str);
  size_t i;

  if(delim_point == NULL) return NULL;
  else {
    *delim_point = '\0';
    for(i=0;i<delim_len;i++) delim_point++;
  }
  return delim_point;
}

609:デフォルトの名無しさん
08/05/11 23:38:06
なんというstrtok

610:デフォルトの名無しさん
08/05/11 23:38:19
>>608
sscanf(str, "%s%n", ...)

611:606
08/05/11 23:40:42
 実際に処理をしている部分は冗長になってしまうため、以下のコードが
入っている部分で、処理を実施していると考えてください。

fprintf(stderr, "buff=%s, next=%s\n",buff, next);


 また、src_strの内容が変わってしまう点は仕様として、その様にしてます。
よろしくお願いします。

612:606
08/05/11 23:59:40
>609
 確かに、この処理内容だと、strtokで十分ですね・・・。文字列群で区切るstrでは
不便な事が多く、strsplitという文字列パターンで区切る関数を作成しており、何も考えず
そのまま使用していました。ご指摘ありがとうございます。

>610
 すいません、その処理はダミー変数を利用する方法とは異なる方法なのでしょうか?
つまり、下記の様な処理とは別の処理ということなのでしょうか?

sscanf(str_str,"%s %s %s %s %s",str1, str2, str3, dummy, dummy);




613:デフォルトの名無しさん
08/05/12 00:39:57
rand関数は合同乗算法ですか?

614:デフォルトの名無しさん
08/05/12 00:42:50
仕様上特に決まってない。

最近は lagged Fibonacci なこともあるようだ。

615:デフォルトの名無しさん
08/05/12 00:45:03
>>613
どういう方法でなければならないという規定はない。
現実には線形合同法がよく使われている。

616:デフォルトの名無しさん
08/05/12 00:48:45
>>613
大概そうですよ

617:デフォルトの名無しさん
08/05/12 00:50:38
>>614-615
レスありがとうございます。

c言語で書くと
a[i+1]=a[i]*j%10*10*10*10
で良いのですか?(a[i+1]=j*a[i] (mod10^4))

618:デフォルトの名無しさん
08/05/12 00:54:19
数学板から飛んできたか
a[i+1]=a[i]*j%(10*10*10*10)
というか
a[i+1]=a[i]*j%10000
でいいんじゃないのか

619:デフォルトの名無しさん
08/05/12 00:55:54
すみません質問を変えます。
0から1の範囲の乱数を合同乗算法で書くにはどのように書けばいいですか?

>>618 ばれたか・・・正直kingはウザイと思っています。

620:デフォルトの名無しさん
08/05/12 00:58:13
数学板でも思ったんだが、前の質問に答えてもらってるのに、
それに何の反応もせずに「質問を変えます」はないだろ。社会常識的な意味で。

621:デフォルトの名無しさん
08/05/12 00:59:29
>>620
すみません・・・

622:デフォルトの名無しさん
08/05/12 01:00:11
整数の 0〜(n-1) の乱数を発生させて
double にキャストして n で割ればいいんじゃない

623:デフォルトの名無しさん
08/05/12 01:02:03
>>622
レスありがとうございます
a=rand()/(RAND_MAX+1.0);
としてもいいのですが>>618さんの方法で書くことはできませんか?

624:デフォルトの名無しさん
08/05/12 01:04:35
a[i+1]=a[i]*j%10000;
b[i+1]=a[i+1]/(10000.0);

625:デフォルトの名無しさん
08/05/12 01:32:58
>>624 ありがとうございます
一応書いてみたのですがエラーが出てしまいます
どこがおかしいですか?ちなみに円周率を求めるプログラムです
#include <stdio.h>
int main(void)
{
double i,max;
double x,y,pi;
int a[1000],j;
double b;
double c=0,d=0;
max=100;
a[0]=9454;
j=9456;
for(i=0;i<=max;i++) {
a[i+1]=a[i]*j%10000;/*ここでエラーが出ます。*/
b[i+1]=a[i+1]/(10000.0);
if((b[i+1]*b[i+1]+b[i]*b[i])<=1.0) {
c+=1.0;

}
else{
d+=1;
}

}
pi=4*c/(c+d);

printf("%f\n",pi);

return 0;
}

626:デフォルトの名無しさん
08/05/12 01:36:24
数字を渡したら曜日を表示する関数を作ったのですが、関数内に
char youbi[7][] = {"日曜日", "月曜日",....}
と書きました。
これだと関数が呼ばれるたびに変数を作って文字列を入れてることになりますよね?
頻繁に呼ぶ関数にこういうことすると速度などに悪い影響ありますか?

627:デフォルトの名無しさん
08/05/12 01:36:32
double i

628:626
08/05/12 01:37:21
すみません訂正します。
char youbi[][7] です。

629:デフォルトの名無しさん
08/05/12 01:38:28
>625
iをintで宣言すること。

>626
ある場合もあるし、無い場合もあるが、大抵の場合気にするほどの差ではない。

630:デフォルトの名無しさん
08/05/12 01:38:30
&はアンパサンドだけど
|はなんていうんだっけ?
なかなか検索ひっかからないんだよね

631:デフォルトの名無しさん
08/05/12 01:39:40
>>627
そうですね・・・すみません
でも、 配列または、ポインタでない変数に添字が使われました。とエラーがでます・・・
どこを直せばよいですか?


632:デフォルトの名無しさん
08/05/12 01:39:53
パイプ

633:626
08/05/12 01:41:06
>>629
ありがとうございます
気にしないことにします

634:デフォルトの名無しさん
08/05/12 01:41:24
>>631
そこまでエラーメッセージ読んでてわからないほうがどうかしてる

635:デフォルトの名無しさん
08/05/12 01:42:22
>>631
それくらいコンパイラが懇切丁寧に教えてくれてるだろうに無視すんなよ
頼むからエラーをこぴぺしてくれ

636:デフォルトの名無しさん
08/05/12 01:42:39
>631
配列でもポインタでもないものに添え字が使われたから。あとは行番号を見ること。

念のために言っておくが添え字とは[?]の部分のこと。

637:デフォルトの名無しさん
08/05/12 01:43:07
>631
double b;


638:デフォルトの名無しさん
08/05/12 01:44:55
せめてエラーメッセージの意味を考えることくらいはしてほしいよまったく
ただのcharの配列にしか過ぎないのかっての

639:デフォルトの名無しさん
08/05/12 01:45:36
>>634
あ、bを配列で宣言するのを忘れてました・・・
ありがとうございます
やっぱりプログラムは苦手だなあ

数学板の回答者に戻ります

640:デフォルトの名無しさん
08/05/12 01:46:40
オーバーフロー・・・

641:デフォルトの名無しさん
08/05/12 02:46:41
数学板ってあんなんでも回答側になれんの?

642:デフォルトの名無しさん
08/05/12 05:18:50
わざわざ自称している時点で…

643:デフォルトの名無しさん
08/05/12 06:01:05
↓聖徳太子知ってる?知らない?

644:デフォルトの名無しさん
08/05/12 06:28:38
乗算合同法や線形合同法の利点ってメモリ使わないことなのに、
配列に保存してどうすんだよw

645:↑
08/05/12 06:56:00
URLリンク(jp.youtube.com)

646:デフォルトの名無しさん
08/05/12 07:36:33
>>626
staticを付けるといい。
ついでにconstも付けるとさらにいい。

647:デフォルトの名無しさん
08/05/12 07:49:12
>>612
%nの仕様は調べた?

>>626
static const char * const youbi[] = {"sunday", "monday", ...}

648:デフォルトの名無しさん
08/05/12 09:15:06
リテラル参照はこっちのほうがいいかも?
char *youbi[7] = {"日曜日", "月曜日",....}

好みの問題ですかねぇ・・・

649:デフォルトの名無しさん
08/05/12 11:15:18
>>648
それだと毎回youbiを更新するコストが発生するし、constによる保護ができない。
ついでに言えば、態々7という定数を埋め込む意義が全くない。

650:デフォルトの名無しさん
08/05/12 12:37:55
確かにスタックに積む場合にはその分の手間がかかるけど、staticのほうがデータ参照は遅くなるんじゃないかったっけ?

651:デフォルトの名無しさん
08/05/12 12:44:16
const だけつけとけばコンパイラが何とかしてくれそうな気がするんですがどうなんですか?

652:デフォルトの名無しさん
08/05/12 12:50:33
抽象的な質問しないで、具体的に質問してくれ。
つーか、入門者がパフォーマンスを気にするな。

653:デフォルトの名無しさん
08/05/12 13:07:40
曜日文字列を使うような関数が、パフォーマンス気にするほど頻繁に呼ばれてるとは思えないねぇ
そうだとしても実測してみなきゃわかんないしね

654:デフォルトの名無しさん
08/05/12 13:11:25
>>653
もし頻繁に呼んでるとしたら、いっそ廃止して
その上の(おそらくループの本体がある)関数で文字列をautoに積んで
インラインで処理させたほうが速いだろうね

655:デフォルトの名無しさん
08/05/12 13:19:00
>>629で終わった話をいつまでグダグダやってるんだ

656:デフォルトの名無しさん
08/05/12 13:22:59
TEST.Cをコマンドプロンプトで指名してコンパイルする時、拡張子が.Cだとコンパイルできなくて.cだとコンパイルできたんだけど、.Cと.cって違うの?

657:デフォルトの名無しさん
08/05/12 13:26:35
>>656
少なくともそのコンパイラにとっては違うからコンパイルできなかったのだろう。

658:デフォルトの名無しさん
08/05/12 15:05:58
ファイル名の指定を間違ってたんじゃないの
ファイル名の大文字小文字を区別する環境としない環境があるから、それも書いてくれ

659:デフォルトの名無しさん
08/05/12 15:16:09
Sun辺りは.CはC++の拡張子だった希ガス。

660:デフォルトの名無しさん
08/05/12 15:24:22
上の
static const char * const youbi[]
って何でconst2つも付けるのかが分からないんですが
static const char * youbi[] じゃあダメなんですか?

あと、普通の変数でも
static const int const とかやる必要はあるんですか?

661:デフォルトの名無しさん
08/05/12 15:30:52
static const char *youbi[]
youbiの先の文字列が書き換え不可能

static char * const youbi[]
youbiが書き換え不可能

static const char * const youbi[]
両方

662:デフォルトの名無しさん
08/05/12 15:36:31
static const char *youbi[]
 は "火曜日" って文字列を "火曜"

663:デフォルトの名無しさん
08/05/12 15:38:16
途中で書いてしまった

static const char *youbi[]
 は "火曜日" って文字列を "火曜" に変えたりするのが不可能で
static char * const youbi[]
 は youbi[1] に別の文字列のポインタを渡すのが不可能になる

って事なんですか?

664:デフォルトの名無しさん
08/05/12 15:54:23
const char *youbi[] は
const char 型のポインタ(文字列定数)を入れる youbi配列で、新たに文字列定数のポインタを入れることは出来て、
char * const youbi[] は
youbiの中のポインタ変数固定だから、文字列そのものは書き変えられてもポインタの指す先は変えられないって事なんですね

やっと理解出来ました
ありがとうございます

665:デフォルトの名無しさん
08/05/12 16:40:42
#include<stdio.h>
double f(double x)
{
double y;
y=(((3.1*x-1.8)*x+5.7)*x+1.0)*x-6.2;
return (y);
}
main()
{
double x,y;
int i;
for(i=-20;i<=20;i++){
x=0.5*i;
y=f(x);
printf("x=%7.3f y=%12.3f\n",x,y);
}
}
このプログラムのyの値の総和を計算するプログラムを作れ。
これをだれかお願いします。


666:デフォルトの名無しさん
08/05/12 16:42:08
>>665
わかりましたちょっとまっててください

667:デフォルトの名無しさん
08/05/12 16:46:32
>>657  なるほど〜 コンパイラの仕様か〜
>>658  指定の仕方は大丈夫なはず コンパイラはMinGW これでいいのかな?
>>659  Sunってコンパイラ名・・? コンパイラによって違うってこと?

668:デフォルトの名無しさん
08/05/12 16:55:13
宿題丸投げは宿題スレへ

669:デフォルトの名無しさん
08/05/12 17:15:43
>>667
>>659  Sunってコンパイラ名・・? コンパイラによって違うってこと?
Javaを開発し、OpenOfficeを提供している世界最大級のコンピュータソフト・ハード兼業企業。
古くから、SunOSというUnix系のOSを作っている。

670:デフォルトの名無しさん
08/05/12 17:55:41
あ〜 なるほど OSによって違うってことか〜
勉強になりました

671:デフォルトの名無しさん
08/05/12 19:47:16
配列に配列を足すことってできないの?
a += b; みたいな

672:デフォルトの名無しさん
08/05/12 19:58:27
Linux上では問題なく動作したのですが、
windows(BCC Developer)だと、ファイルをオープンする事ができなくなりました
ファイルパスを絶対パスにしたりと、試行錯誤しましたが解決しません
どうか、解決法をお願いします

ソース
void read_area(struct prefecture *are)
{
   int i;
   FILE  *fpa;  
   if(( fpa = fopen("menseki.txt" , "rw")) == NULL)  
   {
      printf("ファイルが見つかりませんでした\n");
      exit(1);                                      
   }
   for(i=0;i<47;i++)
   {
     fscanf(fpa,"%s %d",are->name,&are->area);
     are++;
   }
}

txtファイルは、Debugフォルダとその上のファルダに置いています

673:デフォルトの名無しさん
08/05/12 20:00:38
>>672
ソースファイルと同じ場所に置けばいけるはずだけど

674:デフォルトの名無しさん
08/05/12 20:01:55
exeと同じ場所

675:デフォルトの名無しさん
08/05/12 20:05:20
>>673
日本語読めますか?

>>672
それが原因かどうかは判らんが、"rw"は間違い。
実装によってはファイルが空になってもおかしくない。

>>671
できません。配列の要素ごとの足し算ならループから書くことになります。
配列の連結と言うことなら、malloc(), realloc()を使うことになるのでその辺りを先ず勉強する必要あり。

676:デフォルトの名無しさん
08/05/12 20:06:59
>>671
それだけの日本語ではさっぱりですよ。
たぶんこういうこと?
for ( int i = 0; i < SIZE; i++ ) {
a[ i ] += b[ i ];
}

677:デフォルトの名無しさん
08/05/12 20:07:58
>>673-674
ファイルの置き場所に問題があるのかと思い、ソースがある場所を含め、
プログラムに関係ありそうなフォルダ全てに置いたのですが、解決しませんでした…

これは、BCCの環境設定?を変更・追加する必要があるのでしょうか?

>>675
Linuxで動いたのは運が良かったからかもしれません…
指摘していただいた点について、もう一度解決法を探してみます


678:677
08/05/12 20:16:39
"rw"を"r"にした所、正常に動作しました!
よく考えてみれば、書き込みする必要がないので、"w"は不要ですね…

>>673-675
つまらない質問にも関わらず、素早い対応して頂き、
本当にありがとうございます

679:デフォルトの名無しさん
08/05/12 20:27:05
>>676
そうだけど

構造体のときは不便だなって思った

680:デフォルトの名無しさん
08/05/12 20:28:31
そう思ったんならC++へ旅立ってしまえ

681:デフォルトの名無しさん
08/05/12 20:54:06
>>679
そんなのラッパー関数かいときゃ次からは楽じゃないか。

682:デフォルトの名無しさん
08/05/12 21:25:44
>>641
なれるよ
数学なんて実に簡単なことだ

683:デフォルトの名無しさん
08/05/12 22:34:04
C言語勉強したいのですがフリーソフトはないんでしょうか?

684:デフォルトの名無しさん
08/05/12 22:34:47
>>683
ぐぐれ

685:デフォルトの名無しさん
08/05/12 22:39:47
>>683
マイクロソフトが無料で配布してるよ

686:デフォルトの名無しさん
08/05/12 22:52:43
URLリンク(www.microsoft.com)
これですか?どれをダウンロードすればいいんでしょうか

687:デフォルトの名無しさん
08/05/12 22:53:37
>>686
visualC++だ
そしてとっととうせろ

688:デフォルトの名無しさん
08/05/12 22:54:42
>>686
登録とかめんどくさいからBCC使うといいよ
俺はvisual C++使ってるけど

689:デフォルトの名無しさん
08/05/12 23:01:50
BCC もメルアド登録必要じゃね?

690:デフォルトの名無しさん
08/05/12 23:02:36
デバッガは登録必要だったような気がするけど
コンパイラは要らなかったような…

691:デフォルトの名無しさん
08/05/12 23:03:17
>>689
いらない

692:デフォルトの名無しさん
08/05/12 23:06:20
あれ? メルアド変わるまでスパムのように来てたんだが。

693:デフォルトの名無しさん
08/05/12 23:12:22
VC++も登録いらんだろ
isoを落とせば

694:デフォルトの名無しさん
08/05/12 23:13:13
それめんどい

695:デフォルトの名無しさん
08/05/13 08:04:28
C++のプログラム作ろうと思ったらVBの作成画面みたいなんですけど
単純にC言語のプログラムを作りたい時はどうしたらいいんですか?

696:デフォルトの名無しさん
08/05/13 08:08:04
>>695
お使いのソフトウェアのスレへどうぞ。

697:デフォルトの名無しさん
08/05/13 08:14:19
>>695
誤 C++のプログラム作ろうと思ったらVBの作成画面みたいなんですけど
正 VisualC++でC++プログラム作ろうと思ったらVBの作成画面みたいなんですけど

Win32コンソールアプリケーションを選べ

698:デフォルトの名無しさん
08/05/13 08:19:27
>>697
それだとスレ違い。ここはCスレ。

699:デフォルトの名無しさん
08/05/13 13:56:55
実行時に与えられる条件により異なる値で初期化して、
以後はconstに扱われるような変数を宣言することはできますか?

700:699
08/05/13 13:59:49
追記 環境変数のような働きをするグローバル変数です

701:デフォルトの名無しさん
08/05/13 14:34:04
>>699
実装によっては可能かもしれないが、直接に行うことは一般的にはできない。
constな変数はそれが作成されたときに(関数の外で宣言される変数ならプログラムの開始時、あらゆる関数の外で)初期化されて
以後のコード中では変更できなくなるため、実質的にコンパイル時に解決可能な式でしか初期化できない。

ポインタを間にはさめば、以下のような方法で似たようなものを間接的に宣言することができる。

value.c)
 static int value;
 const int * const vp=&value;

value.h)
 extern const int * const vp;
 #define VALUE (*vp)

このようにしておけば、グローバル変数(のふりをしているマクロ)VALUEの実体であるvalueは、少なくともvalue.c以外で変更されることはない。

702:デフォルトの名無しさん
08/05/13 15:17:07
あとは、取得用の関数を公開する形にして
当該の変数をstaticにしてほかのファイルからは見えないようにするとか、
const変数を動的初期化できるC++へ移ってしまうとかが考え付く。

703:デフォルトの名無しさん
08/05/13 15:32:16
int GetValue()
{
  static int value=-1;

  if(value < 0){ /* 最初に呼び出されたときに初期化される */
    :
    :
  }

  return value;
}

#define VALUE GetValue()

な手か


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5373日前に更新/213 KB
担当:undef