C言語なら俺に聞け(入門篇) Part 26at TECH
C言語なら俺に聞け(入門篇) Part 26 - 暇つぶし2ch577:デフォルトの名無しさん
08/04/21 17:48:22
>>573
コンパイルエラーならエラーメッセージを貼るべし

578:573
08/04/21 17:52:47
>>575
そういう事をしたいです。

>>576
実際はforループの中に入ってるんですが、
プログラムがゴッチャゴチャになっているのでかなり抜粋しています。
多重間接参照の方法が知りたいと思いまして…

>>577
コンパイルは通ります。でも値が上手く入っていないようで常に0を返してきます。。
多重間接参照の部分は合っていますか?変に回りくどく聞いて申し訳ございません。。

579:デフォルトの名無しさん
08/04/21 18:01:07
とりあえずmainの中でsetA[0].rangeとsetA[1].rangeの値を確認してみるべきだと思う

580:デフォルトの名無しさん
08/04/21 18:14:54
(setA+bool型)だけどそういうプログラムなのかな?

581:573
08/04/21 18:27:07
>>579
表示させてみた所、値がおかしいです。・・・常にfalse。。

>>580
はい。そこも伝わりづらくすみません。

質問投げっぱなしで申し訳ないのですが、
>>579さんの感じでやってみた所、原因は(計算略)の部分にありそうです。
ここに数百行詰まっていて助けを借りるのも憚られるので、自力でなんとかしてみます。
気にかけて頂きありがとうございました。。

582:デフォルトの名無しさん
08/04/21 18:55:44
プロトタイプ宣言についての質問です。

/* 1つめのソース */
void init(int *a, int **p);   // ここに書く
int main() {
  int a = 0, *p = NULL;
  init(&a, &p);
  printf("%d\n", *p);
  return 0;
}
void init(int *a, int **p) {
  *p = a;
}

/* 2つめのソース */
int main() {
  void init(int *a, int **p);   // ここに書く
  int a = 0, *p = NULL;
  init(&a, &p);
  printf("%d\n", *p);
  return 0;
}
void init(int *a, int **p) {
  *p = a;
}

この2つはどちらも実行可能なのですが、どのように違うのでしょうか。
プロトタイプ宣言にローカルとかグローバルとかあるものなんでしょうか。
ちなみにコンパイラはgcc4.1.1です。

583:デフォルトの名無しさん
08/04/21 19:45:20
ぶっちゃけ、どこにあろうと原則として、上にあればおk。それに関しては
  init(&a, &p);
の上にあればおkってことね。

584:初心者
08/04/21 19:46:27
バブルソートの高速化手法について以下の用語を調べ説明せよって
問題があるんだけどう答えていいかわからない…教えてください

使う用語
亀(turtle)
コムソート(comb sort)

585:デフォルトの名無しさん
08/04/21 19:50:40
>>584
URLリンク(www.google.co.jp)

586:デフォルトの名無しさん
08/04/21 21:47:01
バブルソートを高速化ってアホだな。

587:デフォルトの名無しさん
08/04/21 22:02:13
結局、ポインタを理解できなかった。

588:デフォルトの名無しさん
08/04/21 22:07:10
俺はボインタッチが(y

589:デフォルトの名無しさん
08/04/21 22:08:54
Main関数で5つの整数を読み込み,
その5つの値の平均(double)を
だすプログラムを作成
せよ.
その時、5つの引数を受け取り,平
均を返す関数を呼び出し,返された平均値をmain関数
で画面出力すること


590:デフォルトの名無しさん
08/04/21 22:25:23
宿題スレ行け

591:デフォルトの名無しさん
08/04/21 22:35:58
>>589
どこからどうやって読み込むのかが不明なのでなんとも言えない

592:デフォルトの名無しさん
08/04/21 22:50:00

double average(double a, double b, double c, double d, double e)
{
  return (a+b+c+d+e)/5.0;
}

int main()
{
 printf("%g¥n", average( 2, 3, 4, 5, 6));
 return 0;
}


593:デフォルトの名無しさん
08/04/21 22:53:37
コマンドライン引数に指定したファイルのデータ長を取得するような
処理を作りたいのですが、上手くいきません

お手数かと思いますが、どなたか教えて下さい


594:デフォルトの名無しさん
08/04/21 22:57:43
Cではファイルのサイズを取得する汎用なライブラリは存在しないので
環境依存の技を使う必要がある
実際にstdioライブラリで読み取ることのできるデータ数が問題なら
実際に読んでその数を数えるしかない

595:デフォルトの名無しさん
08/04/21 22:59:38
つ ファイルを開いたらEOFまでポインタを進めて、ファイルの先頭からの
オフセット値で調べる

596:さなぎさん
08/04/21 23:02:30
カレンダー表示プログラムがうまくできません。
日付データを生成するプログラムは完成しました。そして
次のステップを目指していましたらとある問題に出会いました。
2009
000000000102030405060708091011121314151617181920212223242526272829303100000000000000
010203040506070809101112131415161718192021222324252627280000000000000000000000000000
010203040506070809101112131415161718192021222324252627282930310000000000000000000000
000000010203040506070809101112131415161718192021222324252627282930000000000000000000
000000000001020304050607080910111213141516171819202122232425262728293031000000000000
000102030405060708091011121314151617181920212223242526272829300000000000000000000000
000000010203040506070809101112131415161718192021222324252627282930310000000000000000
000000000000010203040506070809101112131415161718192021222324252627282930310000000000
000001020304050607080910111213141516171819202122232425262728293000000000000000000000
000000000102030405060708091011121314151617181920212223242526272829303100000000000000
010203040506070809101112131415161718192021222324252627282930000000000000000000000000
000001020304050607080910111213141516171819202122232425262728293031000000000000000000
2文字づつ読み込みまして
"00"の時は全角スペースを入れます。
完成イメージとしましては
2009年カレンダー

1月   2月    3月

4月   5月    6月

7月   8月    9月

10月  11月   12月

というように表示させたいのですが、fgetsコマンドがうまく使えません。
どなたかご教授くださいな

597:デフォルトの名無しさん
08/04/21 23:03:22
>>593
1. stat(filename, &stat);
2. fp=fopen(filename,"wb");fseek(fp,0L,SEEK_END);ftell(fp);fclose(fp);

598:デフォルトの名無しさん
08/04/21 23:06:24
>>593

#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char* argv[])
{
 struct stat buf;
 for(int i = 1; i < argc; i++)
 {
  stat(argv[i], &buf);
  printf("%5ld bytes <%s>¥n", buf.st_size, argv[i]);
 }
 return 0;
}

599:デフォルトの名無しさん
08/04/21 23:08:08
>>596
sscanf(p, "%2d", &num);
p+=2;
printf("%3.0d", num);

600:デフォルトの名無しさん
08/04/21 23:14:55
>>596

{
 char rdbuf[256];
 char numb[4];

 fgets(rdbuf, 256, stdin);
 int year = atoi(rdbuf);

 numb[2] = 0;
 for(int i = 1; i < 12; i++)
 {
  fgets(rdbuf, 256, stdin);
  for(int j = 0; j < 31; j++)
  {
   numb[0] = rdbuf[j*2];
   numb[1] = rdbuf[j*2+1];
   printf("%s", atoi(numb) ? numb : " ");
  }
//... 月の表示とかは適当にどそ

601:デフォルトの名無しさん
08/04/21 23:40:23
>>594-595>>597-598
レスありがとうございます
>>598さんのソースを使って実行してみたところ、取得できました
が、ファイルサイズの取得でした
無知で申し訳ありませんがファイルサイズ=データ長という認識でいいのでしょうか?



602:デフォルトの名無しさん
08/04/21 23:42:41
自分で書いたんだろ
どういうつもりでデータ長と書いたんだよ

603:デフォルトの名無しさん
08/04/21 23:47:10
>>602
すみません、気分を損ねるようなつもりは全くありませんでした
例えばstrlenを使うようなイメージでした
ファイルサイズを取得する処理はできていたのですが、データ長を取得する処理だと言われ
こちらにお邪魔した次第です。ファイルサイズとデータ長の違いがわからないのです

教えて頂いたのに本当にすみません




604:デフォルトの名無しさん
08/04/21 23:52:33
いや別に怒ってはいなくてさ

データ長てのはファイルに何かしらの形式でデータが入ってて、
その長さとかそういう事なの?

605:デフォルトの名無しさん
08/04/22 00:03:49
>>604
実際にやりたかったのは指定したファイル(形式は一定でない)のデータ長を取得して
既に出来上がっている関数に飛ばすと言った処理をやりたかったのです
データ長と書いたのは恥ずかしい話なのですが関数の引数コメントに
「ファイルデータ長」と書いてあったからで、何故データ長を使用するのかわかりません

自分なりに調べてファイルサイズを取得、関数に引き渡す処理を作成したのですが
口頭で説明したところ「ファイルサイズじゃなくてデータ長」と言われ、違いがわからなかったのです
1バイト文字、2バイト文字を混ぜたようなテキストファイルを作成した時のバイト数(目算)と
単純なファイルサイズに違いがないので、何がどう違うのかすらわからなくて・・・

それでここにお邪魔したのですが、調べ方が足りなかったように思えます
自分が甘かったです。本当にすみませんでした


606:デフォルトの名無しさん
08/04/22 00:05:44
そいつに違いを聞けよ

607:582
08/04/22 00:14:48
>>583
スタイルの違いってことなんですね。
はじめて見た形だったので
関数のスコープが変わるのかな、なんて勘違いしそうでした。

どうもありがとうございました。

608:デフォルトの名無しさん
08/04/22 00:16:03
あーエスパーで答えると
1レコード固定長で可変長文字列データを複数レコード格納する場合、
ファイルサイズ != データ長 となるかもしれんね

609:デフォルトの名無しさん
08/04/22 00:18:44
>>605
本人に聞け
わかるまで聞け
要件を徹底的に具体化するのはプログラマの基本だ

610:デフォルトの名無しさん
08/04/22 00:24:05
>>605
メモリに展開しろって意味だ、多分

611:デフォルトの名無しさん
08/04/22 00:26:12
>>607
プロトタイプ宣言以前の時代から使っているロートルに多い。
あいつらは放っておくとこんなソースを書きかねない。
main()
{
double sqrt();
printf("%g\n", sqrt(.1));
}

612:デフォルトの名無しさん
08/04/22 00:28:19
>>611
まっとうなロートルは
sqrt(1.0);
または
sqrt((double)1);
と書く

613:デフォルトの名無しさん
08/04/22 00:30:21
>>611
それも立派なプロトタイプ宣言なのだが

614:デフォルトの名無しさん
08/04/22 00:34:22
>>612
0.1であることに注意。

>>613
一般的に、引き数リストがないものはそう呼ばないのでは?
いずれにしても「その頃からやってるロートル」なので、一応C99も「知っている」らしいよ。

615:デフォルトの名無しさん
08/04/22 00:46:50
>>614
引数リストのないプロトタイプ宣言はAnsi-C以前のもの
いわゆるK&RのC

そのころからやっている超ロートル


616:デフォルトの名無しさん
08/04/22 01:51:12
スレ違いだったらスマソ
今からC言語を勉強しようと思ってるんだが
windowsとLinuxどっちでやったほうがいいの?

617:デフォルトの名無しさん
08/04/22 01:54:53
windows

618:デフォルトの名無しさん
08/04/22 01:58:58
>>617
理由は?

619:デフォルトの名無しさん
08/04/22 01:59:08
今使ってるパソコンでやればいいだろ。

620:デフォルトの名無しさん
08/04/22 02:02:15
なんのためにCを勉強したいかによる
趣味なら自分のマシンに合わせればいい
職業にしようと思ってるんならまずWindowsをやり余裕があればUnix/Linux

621:デフォルトの名無しさん
08/04/22 02:04:05
windowsのほうが普及しているし統一されているから
UNIXは派生が多いし普及がいまいち

622:デフォルトの名無しさん
08/04/22 02:05:46
いずれにしても標準のC/C++を勉強するなら変わりない

623:デフォルトの名無しさん
08/04/22 07:02:18
>>622

だよな。コンソールアプリしか作れんが。
標準を覚えたいならVCなんかは却って邪魔かも知れん。
ただし、将来Windowsアプリの仕事をしたい、
と思うなら「Cを覚える」というより「VC++を覚える」、という感覚のほうがいい。


624:デフォルトの名無しさん
08/04/22 14:14:29
C言語、全くわからないのでこれから勉強しようと思うのだが参考になる書物とかある?
スレチだったらスマソ

625:デフォルトの名無しさん
08/04/22 14:15:39
K&R
独習C
ダイテルのC言語プログラミング
CFAQ

626:デフォルトの名無しさん
08/04/22 15:08:04
>LYSOZYME
MKRLIKKSAIGMFAFFVVAASGPVFAAVGDQGVDWSKYNGTYGNFGYAHDKFAFSQIGGT
YGGTFVDQATYETQVASAIAQGKRAHTYIWYQVGGSQEVAKAALDRYLPKIQTPKNSIVA
LDYEGGASGNKQANTDAILYGMRRVKAAGYTPMYYSYKPYTLANVNYKQIIKEFPKSLWI
AAYPNYEVTPVPNYSFFPSMDGISVFQFTSTYVAGGLDGNVDLTGITGNGYGKQKGQEVK
PNTATPAIENGKEANEVKGNDVEVGMTVKVNFGAKNYATGETIPQWVKGQPHKIIQKNGD
TVLLDGIMSWLSVHDVETIDASTSQPTTPAKSYIVKQGDTLSGIASNLGTNWQELARQNS
LSNPNMIYSGQVISLTGGQSGATARTYTVQSGDNLSSIARRLGTTVQSLVSMNGISNPNL
IYAGQTLNY


が格納されているファイルを読み込み各文字が何%あるかを出力ファイルに書き出すプログラムをつくって

627:デフォルトの名無しさん
08/04/22 15:31:42
作って・・・からどうすればいいんだろう?
とりあえず、作って・・・
捨てちゃった。

total 437
A : 8.92448513% ( 39)
B : 0.00000000% ( 0)
(中略)
Y : 6.63615561% ( 29)
Z : 0.22883295% ( 1)


628:デフォルトの名無しさん
08/04/22 15:38:57
>>626
#include <stdio.h>
#include <string.h>

char* hoge = "LYSOZYMEMKRLIKKSAIG・・・ ~(省略)

void main(void)
{
    int slen = strlen(hoge), count[26] = {0}, ic = 0;
    for (ic = 0; ic < slen; ic++){
        if (hoge[ic] >= 'A' && hoge[ic] <= 'Z')
            count[hoge[ic] - 'A']++;
    }
    for (ic = 0; ic < 26; ic++)
        printf("[%c] = %.1f%%\n", 'A' + ic, count[ic] * 100.0 / slen);  
}

629:デフォルトの名無しさん
08/04/22 17:43:36
>>628
おぬしもワルよのう( ̄ー ̄)

630:デフォルトの名無しさん
08/04/22 17:46:43
>ファイルを読み込み
日本語が理解できない人かw

631:デフォルトの名無しさん
08/04/22 18:22:54
標準入力からEOFが入力出来ないって本当ですか!?

632:デフォルトの名無しさん
08/04/22 18:24:53
うそです

633:デフォルトの名無しさん
08/04/22 18:38:31
>>586
安定なソートですから、それなりに有用な場合があるのかもしれません。<バブルソートの高速化

634:デフォルトの名無しさん
08/04/22 18:38:46
宿題スレの隔離から出てこないで下さい><

635:デフォルトの名無しさん
08/04/22 18:48:22
バブルソートをどうにかしようって考えるよりも、ソートを高速化する過程に
効率の悪いバブルソートが用いられるのはよくあることだ。
そうやって、アルゴリズムを改良すると、処理時間、計算量が減って
効率が良くなるという勉強をするのさ、そういった分野の学校では。

636:582
08/04/22 18:55:24
このスレ結構にぎわってるんですね。
Cしかできない俺が最近はやりのJavaScriptに劣等感を抱いているんだが、
バカにしたもんじゃないなって嬉しくなった

637:デフォルトの名無しさん
08/04/22 19:10:25
うわー、名前でちゃった...
...ついでに質問なんですが、
/* src1.c */
int a;              // グローバル変数
int main() {
 int x;
  x = sub(a);
  printf("x: %d\n", x);
  printf("a: %p\n", &a);
  return 0;
}
/* src2.c */
int a;              // グローバル変数
int sub(int n) {
  printf(" sub::a: %d\n", a);
  printf(" sub::a: %p\n", &a);
  return n+1;
}

2つソースファイルで定義してるグローバル変数aは
それぞれでメモリの割付が行われると思うのですが、
同じアドレスのもののようなんです。
ということは、extern記述子は冗長な表現ってことになってしまうんでしょうか?
# externって他のソースファイルで定義してるからここでは宣言のみ、
# ですよってことだったと認識していたのですが

638:デフォルトの名無しさん
08/04/22 19:11:55
おいっ、ナンバーサインを全角で書くな・・・NG登録してんのにw

639:デフォルトの名無しさん
08/04/22 19:36:46
>>637
リンカがエラー出してない?
シンボルが重複してますよって

640:デフォルトの名無しさん
08/04/22 19:55:48
>>639
出ていません。
コンパイラはgccで、文法チェックが一番厳しいオプションをつけてコンパイルしても次の警告が出るだけです。
src1.c: In function 'main':
src1.c:6: 警告: implicit declaration of function 'sub'

# >>637のソースはちょっと編集していますので、6行目ではなくて実際は4行目ですが。(重要なことではありませんでしたね)
いかがでしょうか。

641:デフォルトの名無しさん
08/04/22 20:05:16
GCCのバージョンは?
古いとそういう挙動を示す。
ANSIではエラーにならなければならないが。

642:デフォルトの名無しさん
08/04/22 20:10:11
gcc-4.1.1です。
2007年1月5日にリリースされているみたいなので、古くはないとは思うのですが
何かバグでもあるのでしょうか...

643:デフォルトの名無しさん
08/04/22 20:12:08
gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-51)
が詳細です。連レスすみません。

644:デフォルトの名無しさん
08/04/22 20:20:26
シンボルの重複はリンカの担当だから、ldの問題。
--allow-multiple-definitionあたりが渡ってないか?

645:デフォルトの名無しさん
08/04/22 20:41:56
int* TEST(int size)
{
int *retest = malloc(sizeof(int)*size);

return retest;
}

int main()
{

int *test;

test = TEST(5);

.....

free(test);

return 0;
}

こういうことをするつもりなのですが、関数TEST内でmallocしたものはfree(test)で開放できてるのでしょうか?

646:デフォルトの名無しさん
08/04/22 21:11:37
できるよ

647:645
08/04/22 21:22:44
ありがとう

648:デフォルトの名無しさん
08/04/22 21:37:15
>>645
それにしても、なにか怖い構造だね。

649:デフォルトの名無しさん
08/04/22 22:06:29
二つの整数値を読み込んでその差が10以下なら「差は10以下です。」、
差が11以上なら「差は11以上です。」と表示するプログラムを作りました。
論理OR演算子を使うとするとどのようにすればよいのでしょうか?

#include <stdio.h>
int main (void)
{
int n1, n2, sa;

puts("二つの整数を入力してください。");
printf("整数1:"); scanf("%d", &n1);
printf("整数2:"); scanf("%d", &n2);

sa = (n1 > n2) ? n1 - n2 : n2 - n1;

if( sa >= 11)
puts("それらの差は11以上です。");
else
puts("それらの差は10以下です。");

return 0;
}

650:デフォルトの名無しさん
08/04/22 22:07:28
至って普通だと思うけど何で?

651:デフォルトの名無しさん
08/04/22 22:08:12
>>650
>>648


652:デフォルトの名無しさん
08/04/22 22:15:30
>>649

if(n1<n2-10 || n2+10<n1){
  ;
else
  ;

まあどのみちオーバーフロー対策してないがね

653:デフォルトの名無しさん
08/04/22 22:19:22
>>649

こうかな?

#include <stdio.h>
int main (void)
{
int n1, n2, sa;

puts("二つの整数を入力してください。");
printf("整数1:");
scanf("%d", &n1);
printf("整数2:");
scanf("%d", &n2);

sa = n1 - n2;

if ((sa >= 11) || (sa <= -11)) {
  puts("それらの差は11以上です。");
} else {
  puts("それらの差は10以下です。");
}

return 0;
}

654:デフォルトの名無しさん
08/04/22 22:19:39
>>649
sa = n1 - n2;
 if(sa < -10 || sa > 10)
  puts("...以上です。");
 else
  puts("...以下です。");
何かの宿題?

>>651 気を悪くしたら許してくれ。
malloc() free() の関係はできるだけ見通しがいいようにという余計な話をした。
作り手の趣向だから非難してるんではないよ。

655:デフォルトの名無しさん
08/04/22 22:21:17
>>653
ども。リロードしてなくて私も送ってしまった。。

656:649
08/04/22 22:27:01
皆様ありがとうございます。
大変参考になりました。

現在C言語の入門書を買って独習している段階でして、
本の中の演習問題が>>649で論理OR演算子を使えという指示でした。
ちょっと解答が思いつかなかったので自分で作れる範囲で作ってみたのですが、
やはり問題文を無視しては解答にはならんだろうw、と質問させて頂きました。

657:デフォルトの名無しさん
08/04/22 22:33:12
>>656
独学・・なるほど。ま、がんがんソース書きまくれ。

658:デフォルトの名無しさん
08/04/22 23:01:56
まさかとは思うけど
( sa = n1 - n2 ) >= 0 || ( sa = n2 - n1 );
だったりしてw

659:デフォルトの名無しさん
08/04/22 23:26:35
>>654

> >>651 気を悪くしたら許してくれ。
> malloc() free() の関係はできるだけ見通しがいいようにという余計な話をした。
> 作り手の趣向だから非難してるんではないよ。

確かにあまりいい設計ではないね。
やむを得ずそうなっちゃうこともあるけど。


660:デフォルトの名無しさん
08/04/22 23:38:16
メモリアロケートを関数で行なわなければならないなら、こんな戦略かな。
・関数名にallocなどのキーワードを含めるようにして確保も行なっていることを明示する。
・(freeするだけになってしまうかもしれないが)解放用の関数も用意し、使ってもらう。

661:デフォルトの名無しさん
08/04/23 00:21:58
ついでにログを仕込んだり、アロケート回数を管理したりとかね

662:デフォルトの名無しさん
08/04/23 11:44:35
>>644
わたしはldについて理解が浅いので、調べていたらレスに時間が掛かってしまいました。
ごめんなさい。

$ gcc -c src?.c
でコンパイル直前まで終わらせて、-vオプションをつけて何をしているか調べてみました。
$ gcc -v src?.o -o a.out
Using built-in specs.
Target: i386-redhat-linux
コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared
 --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
 --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi
 --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux
スレッドモデル: posix
gcc バージョン 4.1.1 20070105 (Red Hat 4.1.1-51)
/usr/libexec/gcc/i386-redhat-linux/4.1.1/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2
 -o a.out /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crt1.o /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crti.o
 /usr/lib/gcc/i386-redhat-linux/4.1.1/crtbegin.o -L/usr/lib/gcc/i386-redhat-linux/4.1.1
 -L/usr/lib/gcc/i386-redhat-linux/4.1.1 -L/usr/lib/gcc/i386-redhat-linux/4.1.1/../../.. src1.o src2.o -lgcc --as-needed
 -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i386-redhat-linux/4.1.1/crtend.o
 /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crtn.o

どうやら--allow-multiple-definitionオプションは入っていないようです。
これをコピペして、敢えて--allow-multiple-definitionをつけてリンクしてみましたが、
どちらにしても、>>637で言ったようにグローバル変数aは同じアドレスのようです。

あとどこを調べてみたらいいでしょう...よろしくお願いします。
長文失礼しました。

663:デフォルトの名無しさん
08/04/23 12:57:13
>>662
-fno-common オプションをつけるといいらしい

664:デフォルトの名無しさん
08/04/23 13:02:31
コンパイラの動作なんか気にする前に素直に
他のソースに実体があることを示したいならexternをつけなさい
そのファイル内でしか使わないことを確実にしたいならstaticをつけなさい

665:デフォルトの名無しさん
08/04/23 14:39:16
>>663
$ gcc -fno-common src?.c
/tmp/ccuJF0uA.o:(.bss+0x0): multiple definition of `a'
/tmp/ccU9yxgD.o:(.bss+0x0): first defined here

でました。
このフラグが通常で立ってないということは、
bss領域に割り当てられる変数は、コンパイラ任せにしないでね、
ってことなんでしょうね。
プログラマが管理できてない部分にエラーメッセージもなしっていうのはちょっと怖いですね。

面白かったです。
ldで多重定義をチェックするやりかたも調べてみたいと思います。

ありがとうございました。

666:デフォルトの名無しさん
08/04/23 16:04:05
おまえらはよ作れや!!!!!!!!!!!!!!

このオタク野郎

ぼけ

あほ

かす

ニート

日本の恥



667:デフォルトの名無しさん
08/04/23 16:09:28
>>666 自己紹介乙。

668:デフォルトの名無しさん
08/04/23 16:19:22
まあ>664でFAだがな

669:デフォルトの名無しさん
08/04/23 22:32:13
char cRet[512];

printf("ファイルパス:\n");
fgets(cRet, 512, stdin);

こんな感じで画面上に入力された文字(ファイルパスを想定)を取得した後に
fopenでファイルを開こうと思っているのですが、何度やっても開けずにエラーになります
ファイル自体はちゃんと存在しているファイルなのですが、何が悪いのでしょうか?


670:デフォルトの名無しさん
08/04/23 22:35:03
>>669
馬鹿か?それだけだされてわかるわけねーだろwwww

671:デフォルトの名無しさん
08/04/23 22:38:48
>>669
errnoを調べる

672:デフォルトの名無しさん
08/04/23 22:42:24
>>669
受け付けたcRetには入力したファイル名+改行コードが入ってんじゃね?

673:デフォルトの名無しさん
08/04/23 22:43:49
>>669
URLリンク(oshiete1.goo.ne.jp)

この辺だろ、多分

674:デフォルトの名無しさん
08/04/23 22:46:22
ゲッツと言えば、今日放送されたクイズヘキサゴン2に出演してたなぁ。

675:デフォルトの名無しさん
08/04/23 22:47:52
>>669
末尾の \n を削除しれ

676:デフォルトの名無しさん
08/04/23 22:49:32
すいません\nを削除するにはどうしたらいいんでしょうか

677:デフォルトの名無しさん
08/04/23 22:50:10
ちょっとは頭使え

678:デフォルトの名無しさん
08/04/23 22:50:59
>>672>>673>>675
ありがとうございます
ググったらやり方が載ってたので試してみます


679:デフォルトの名無しさん
08/04/23 22:51:15
嫌なら環境にもよるが、EOFを入力しちゃいな。Ctrl+Zとか+Dとか。
むりぽなら別のライブラリで入力を受付ちゃいな。

680:デフォルトの名無しさん
08/04/23 22:54:28
二度と入力できなくなるじゃないか・・・

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