C言語なら俺に聞け! Part 115

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレッド
C言語なら俺に聞け! Part 114
http://pc8.2ch.net/test/read.cgi/tech/1126884418/
2デフォルトの名無しさん:2005/09/26(月) 21:24:42
2 get
3デフォルトの名無しさん:2005/09/26(月) 21:29:11
3getsなら漏れは神
4デフォルトの名無しさん:2005/09/26(月) 21:45:36
4ならscanfに%d指定で文字列を読み込ませる
5デフォルトの名無しさん:2005/09/26(月) 22:25:28
5ならビットシフトのコピペもう貼らない
6デフォルトの名無しさん:2005/09/26(月) 22:39:30
6なら屁こいてもAA貼っちゃう
7デフォルトの名無しさん:2005/09/26(月) 23:21:52
7なら斉藤またんきがこのスレを征服
8デフォルトの名無しさん:2005/09/26(月) 23:57:26
8なら漏れは斎藤またんき
9セェンロン ◆89nOjCFiLI :2005/09/27(火) 10:40:34
質問です。
http://kuroneko-upload.no-ip.info/uploader/upbd/updir/aaa.jpg
この真中のリストビューみたいなのを作りたいんですが、どうやったらいいんでしょうか?

リストビューのフラグいじったら出来ると思ってたんだけど、出来ずに困ってます。
教えてクダサイませませ。お願いしますです。
10デフォルトの名無しさん:2005/09/27(火) 11:15:53
>>9
この程度ならオーナー描画とサブクラス化で間に合うと思うが、osが不明だ。
たぶんwin32スレがよいとおもわれ。
http://pc8.2ch.net/test/read.cgi/tech/1125850096/

つーか、チート臭いな。
フライングボディシザースドロップ食らわせるよ?
11デフォルトの名無しさん:2005/09/27(火) 14:19:34
ageとく
12デフォルトの名無しさん:2005/09/27(火) 14:21:07
>>9-10
スレ違い
13デフォルトの名無しさん:2005/09/27(火) 14:31:06
プリプロセッサで質問です。
#define ABC 10
void main(void){
printf("%"ABC"s\n", "hoge");
}

上記が安易に printf("%10s\n", "hoge"); になるのかと思いきや
違うんですね。

#define ABC 10
#define to_str(s) #s
void main(void){
printf("%"to_str(ABC)"s\n", "hoge");
}

などとしても printf("%10s\n", "hoge"); にはならないんですね。

どうしたら良いのでしょうか。どなたか良い案を教えていただければさいわいでございます。
14デフォルトの名無しさん:2005/09/27(火) 14:33:54
>>13
#define ABC "10"
こうする。
15デフォルトの名無しさん:2005/09/27(火) 14:35:20
>>14
ありがとうございます。
すみません、それじゃ駄目なんです。別に数値としても使いたいので。
atoi()すればいいじゃんとかそういうのは無しで、あくまでも
#define ABC 10
というマクロでやりたいです。
16デフォルトの名無しさん:2005/09/27(火) 14:39:41
>>13
こうすればいい。
#include <stdio.h>
#define ABC 10
#define to_str(s) to_str_main(s)
#define to_str_main(s) #s

int main(void) {
    printf("%"to_str(ABC)"s\n", "hoge");
    return 0;
}
17デフォルトの名無しさん:2005/09/27(火) 14:44:12
>>16
おお、すばらしい。めちゃくちゃ感謝です。ありがとうございます。
一旦マクロに渡して展開させてから処理するということですね。
ありがとうございました。
18デフォルトの名無しさん:2005/09/27(火) 14:46:22
>>15
"to_str(ABC)"を " to_str (ABC) "に変えてもダメ?
19デフォルトの名無しさん:2005/09/27(火) 14:48:00
2017:2005/09/27(火) 14:54:29
>>19
ありがとうございます。
11.17 にあったのですね。すみませんでした。
21デフォルトの名無しさん:2005/09/27(火) 15:15:12
ちなみにprintfの桁数を揃えたいだけなら

#define MAX 3
printf("%-*.*s\n", MAX, MAX, "hoge");
printf("%*s\n", MAX, "hoge");

という方法もあったりする。上と下の違いは実行してみればわかる
22セェンロン ◆89nOjCFiLI :2005/09/27(火) 15:30:24
>>10
誘導ありがとうございます。
オーナー描画とサブクラス化で検索してみます。
チートぢゃないですw
23デフォルトの名無しさん:2005/09/27(火) 16:26:54
今までsprintf使ってやってたよ
便利な方法があるんだな
24デフォルトの名無しさん:2005/09/27(火) 17:01:00
>>21
上の方は冗長じゃないか?
printf("%-.*s\n", MAX, "hoge");でいい希ガス
25ハム ◆S.PtdgMO6E :2005/09/27(火) 17:26:32
C言語の演算子の優先度とその解釈について教えてください。

int a=0;
int b=1;

printf("%d\n",a=b++);
b=1; //初期化
a=0; //初期化
printf("%d\n",a=++b);
b=1;
a=0;
printf("%d\n",a=(b++));


上記のプログラムを実行すると、

1
2
1  ←ここがおかしい?

ここで、a=(b++) の a は 2 になると思うのですが、なぜ、()よ
り=が優先されて出力結果が1になるのでしょうか?
()が最優先じゃないのでしょうか? 
a=(b++)は、bをインクリメントしたその値をaに格納するのでは?
なぜそうではないのでしょうか? おねがいします。
26デフォルトの名無しさん:2005/09/27(火) 17:37:45
bの値を返し、そのあと1増加
27デフォルトの名無しさん:2005/09/27(火) 17:37:47
C-FAQの3.2辺り?
28デフォルトの名無しさん:2005/09/27(火) 17:39:09
b++ と ++b の違いくらい、本に載ってないの?
29デフォルトの名無しさん:2005/09/27(火) 17:39:34
後置インクリメント演算子は増加する前の値を返し、そのあと値を増加させます。
30デフォルトの名無しさん:2005/09/27(火) 17:42:21
ちなみに優先順位という考えでは
a=b++

a=(b++)
も同じ
インクリメント/デクリメント演算子は代入演算子より優先順位が高い
31デフォルトの名無しさん:2005/09/27(火) 17:50:15
後置++の副作用は式の実行後って解釈でOK?
32ハム ◆S.PtdgMO6E :2005/09/27(火) 17:53:50
皆さんありがとうございます。

ということは、

*p++
*++p
*(p++)
(*p)++

これもそれに該当しますか?
33デフォルトの名無しさん:2005/09/27(火) 17:54:43
>>31
副作用じゃないだろ。まぁそれでいいはず
34デフォルトの名無しさん:2005/09/27(火) 18:08:13
>>32
p にアドレス X が入ってるとする。

*p++    X にある値を返し、p を1つ進める
*++p    p を1つ進め、X + 1 にある値を返す
*(p++)   *p++ に同じ
(*p)++   X にある値を返し、X にある値を1つ進める

>>33
副作用 = 式の値を求める以外の処理。
       即ち、出力、再代入等、状態の変化を伴う処理。
35デフォルトの名無しさん:2005/09/27(火) 20:28:11 0
int a = 0;
printf("%d%d%d", a++, a++, a++);

こういうのが210って出力されるのはなんで?
36デフォルトの名無しさん:2005/09/27(火) 20:29:25 0
>>35
それは偶然後ろから評価されたから。
この場合の動作は未定義。処理系によるから
やっちゃだめ。
3735:2005/09/27(火) 20:31:13 0
そうだったのか。
しかし、C言語って未定義とか不定とか多いのなんとかならんのか。
38デフォルトの名無しさん:2005/09/27(火) 20:33:11 0
>>35
俺は012だった
39デフォルトの名無しさん:2005/09/27(火) 20:36:21 0
・コンパイラの作成に制限がかかりすぎて面倒
・不必要な制限は最適化に不利に働く
40デフォルトの名無しさん:2005/09/27(火) 20:36:48 0
41デフォルトの名無しさん:2005/09/27(火) 20:37:22 0
>>35
BCCでは210
GCCでは210
VC++ Toolkitでは000
でした
42デフォルトの名無しさん:2005/09/27(火) 20:37:28 0
>>37
別に未定義なことをしなければいいので無問題。
未定義や不定なことをやるコードにろくなコードはない。
43デフォルトの名無しさん:2005/09/27(火) 20:43:28 0
Java未定義や不定を排除したから遅いとか、デマを流してみるテスト
44デフォルトの名無しさん:2005/09/27(火) 20:46:58 0
Dならちゃんと定義してそうだがな
45sage:2005/09/27(火) 22:51:03
C言語で、 + - * と / % とで分類する際、
(2つの数字で演算する際、0が使えるかどうかの違い)
グループ名をそれぞれつけろと言われました。
決まったようなグループ名があるように言われたのですが、本やサイトで調べても分かりませんでした。
分かる方おりましたらよろしくお願いします。
46デフォルトの名無しさん:2005/09/27(火) 22:53:59
>>45
言 っ た 奴 に 聞 け
47デフォルトの名無しさん:2005/09/27(火) 22:55:08
教えてくれませんでした・・・
48デフォルトの名無しさん:2005/09/27(火) 22:57:05
たぶん、まじめに講義に出てる奴だけわかる俺定義。
49デフォルトの名無しさん:2005/09/27(火) 22:57:09
何かオナニー先生が悦に入るために出した問題っぽいなぁ。
50デフォルトの名無しさん:2005/09/27(火) 23:01:49
そんな分類名聞いたこと無いな
もう放置しとけ、俺定義を持ち出すような奴にろくな奴いない
51デフォルトの名無しさん:2005/09/27(火) 23:03:06
>>45
マルチ乙
52デフォルトの名無しさん:2005/09/27(火) 23:05:53
そうっすね、ありがとうございます。
俺定義なんですね・・・
53デフォルトの名無しさん:2005/09/27(火) 23:12:58
ビットマップの画像データを入れた二次元配列を90度、180度、270度に傾けて表示するにはどうしたらいいのでしょうか。
int **angleBmp(int **iArr2,, unsigned long int y, unsigned long int x){

 for(int i=0; i<y; i++){
  for(int j=0; j<x; j++){
   iArr2[i][j] = iArr2[j][y-i-1];
  }
 }
  return iArr2;
}

過去ログもみて試しているのですが、90度で表示するため二次元配列を並べ替えるのだと思うのですが、
うまくいきません。新しく配列を作ってコピーした方がいいのでしょうか?
的はずれなソースかも知れませんがご教授ください。
54デフォルトの名無しさん:2005/09/27(火) 23:18:16
新しく画像を確保した方が早い。
そもそも、回転後の画像は高さと幅が変わるし。
55デフォルトの名無しさん:2005/09/27(火) 23:36:36
>>25
ポストインクリメント演算子は、式の評価が全部終了した時点で適用される。
副作用完了点でぐぐるとよい。
56デフォルトの名無しさん:2005/09/28(水) 00:24:48
main内に char a[10][10]; を作成し
外部関数をfuncを作成しておきます。
このfuncにa[10][10]の先頭アドレス(a)を渡したいのですが、
引数設定を func( char * arr)として、mainから func(a) と渡そうとすると、

'char ( *)[10]' 型は 'char' 型に変換できない(関数 main() )
パラメータ 'arr' は char 型として定義されているので char ( *)[10] は渡せない(関数 main() )
などとエラーを吐きます。

無論char a[10]などの文字列用変数の場合、func(a)と渡しても問題ないのですが。
配列の配列として宣言し、その先頭アドレスを渡そうとするとエラーが出てしまいます。
どうすればよろしいでしょうか
5753:2005/09/28(水) 00:29:12
ビットマップを読み込んで加工せよという課題なんで、画像データを入れた配列を使わなくてはいけないんです。
二次元配列は画像のサイズを利用してmallocで作ったのですが、この二次元配列をコピーするための同じ要素数の
二次元配列はどう作ったらよいのでしょうか。コピー元と同じやり方で作るしかないのかと悩んでいます。
58デフォルトの名無しさん:2005/09/28(水) 00:29:27
>>56
void func( char (*param)[10] );
59デフォルトの名無しさん:2005/09/28(水) 00:31:04
>>56
func(char **arr);

a[10][10]の場合、aは要素数10の配列先頭へのポインタが10個並んだ配列の先頭へのポインタ
60デフォルトの名無しさん:2005/09/28(水) 00:31:11
>>57
スレ違い。
後、処理を考える前に画像フォーマットの調査位しろ。
61デフォルトの名無しさん:2005/09/28(水) 00:32:46
>>59
それはポインタへのポインタ型を渡すときだろ。
62デフォルトの名無しさん:2005/09/28(水) 00:35:45
>>61
すまん、思いっきり間違った・・・
寝てくる('A`)
63デフォルトの名無しさん:2005/09/28(水) 00:36:46
64デフォルトの名無しさん:2005/09/28(水) 00:39:25
>>58
ありがとうございます。
mainからfunc(param); (param[10][10])と渡した場合funcは、

char型配列へのポインタを渡さなければいけないのですね。。
65デフォルトの名無しさん:2005/09/28(水) 00:46:12
>>57
同じやり方で作ったらなにか問題があるのか?
6657:2005/09/28(水) 00:54:17
>>63 >>64
どうもです。
特に問題があるというわけでなく、無駄な処理が増えると思ったもので。
いつも冗長なソースになりがちなんで少しでもスマートにしなくてはと気をつけながらやっているのですが。
67デフォルトの名無しさん:2005/09/28(水) 07:00:33
test
68デフォルトの名無しさん:2005/09/28(水) 17:00:09
mallocで1.5GBくらいを作業領域として確保して、100MBくらいの計算結果を
ファイルに出力するPROG1と、その100MBのデータファイルを読み込んで、
1.8GBくらいの作業領域をmallocで確保して、別のデータを作成するPROG2を
合体して一つのPROG3にしました。合体の理由は、100MBのファイル読み書きで
時間が掛かるからです。
合体の方法は、具体的には、1.5GBをmallocして作業して100MBのデータが出来たら、
1.5GBの領域はFreeして、次に、1.8GBをmallocして、その領域を新たな作業領域として
使いながら、先ほどの100MBのデータを処理します。
ところが、PROG3を実行していると、1.8GBのmallocで失敗します。
一回目に1.5GB確保して100MBの計算が終わったら、Freeしていますが、
Windowsタスクマネージャでメモリ使用量を見ていてもFreeしているにもかかわらず、
この時点で、このプロセスは1.5GBくらいメモリを使っています。
Free実行した直後に、メモリ使用量は、急には減らないものなんでしょうか?
69デフォルトの名無しさん:2005/09/28(水) 17:01:54
ヒント:ページング
70デフォルトの名無しさん:2005/09/28(水) 17:04:14
1.8G を malloc するのに 100M はファイル経由なのね・・
71デフォルトの名無しさん:2005/09/28(水) 17:06:36
>70
>1.8G を malloc するのに 100M はファイル経由なのね・・
メモリ経由です。ファイルの入出力は止めましたので。
72デフォルトの名無しさん:2005/09/28(水) 17:17:53
>>68
だからメモリクリーナーのようなジョークソフトがあるんだよ
73デフォルトの名無しさん:2005/09/28(水) 17:31:53
>>68
何Gメモリを積んでるか知らないが、プログラムを纏めたことにより
連続した1.8GBのメモリ確保が出来なくなったんだろう。
最初の1.5Gのmallocを次の1.8GBと統一してみれば上手くいくかもしれない。

あと、freeしたメモリはOSに返されるとは限らない。
ま、どっちにしろまともなOSならプロセスが終了したらメモリは解放されるな。
74デフォルトの名無しさん:2005/09/28(水) 17:42:45
まあ、GlobalAllocの出番だな
75デフォルトの名無しさん:2005/09/28(水) 17:54:40
scanfで関数を取得できますか?
76デフォルトの名無しさん:2005/09/28(水) 18:04:39

 こ こ で エ ス パ ー 登 場
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
77デフォルトの名無しさん:2005/09/28(水) 18:08:27
78デフォルトの名無しさん:2005/09/28(水) 18:19:12
>>68
Win32ならHeapAlloc(), VirtualAlloc()またはファイルマッピングを使え
79デフォルトの名無しさん:2005/09/28(水) 18:19:32
>>74
VirtualAllocだろ。
80デフォルトの名無しさん:2005/09/28(水) 18:20:45
GlobalAlloc使って解放し忘れたら悲惨だなw
81デフォルトの名無しさん:2005/09/28(水) 18:21:00
sbrk
82デフォルトの名無しさん:2005/09/28(水) 18:22:37
>>80
なぜ?
83デフォルトの名無しさん:2005/09/28(水) 18:46:55
>>82
電源切るまで開放されない
84デフォルトの名無しさん:2005/09/28(水) 18:47:10
配列に格納した数字を昇順に並べ替えるにはどうしたらいいんですか?
85デフォルトの名無しさん:2005/09/28(水) 18:48:31
>>84
(;´Д`)
86デフォルトの名無しさん:2005/09/28(水) 18:54:39
>>83
いつの時代だよ。
87デフォルトの名無しさん:2005/09/28(水) 19:04:30
そもそもwin32はスレ違いだろ。
88デフォルトの名無しさん:2005/09/28(水) 19:08:49
>>84
qsort
89デフォルトの名無しさん:2005/09/28(水) 19:33:38
>>84
配列の要素(数字)を比較して、自分で昇順になるように並べ替えてください。
あと、学校の課題なら宿題スレに行け。
90デフォルトの名無しさん:2005/09/28(水) 19:58:09
なんかBCCでコンパイルしようとしたら

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
source.cpp:
致命的エラー F1004 source.cpp 8: コンパイラ内部のエラー(関数 main(int,char * *) )
致命的エラー F1004 source.cpp 8: コンパイラ内部のエラー(関数 main(int,char * *) )

とか出たんだけどなにこれ?
91デフォルトの名無しさん:2005/09/28(水) 20:15:08
>>90
スレ違い。
BCCスレにでもどうぞ。
92デフォルトの名無しさん:2005/09/28(水) 20:15:28
>>90
コンパイラ内部のエラー
93デフォルトの名無しさん:2005/09/28(水) 20:24:00
>>84

#include<stdio.h>

int main{
  int a[]={1,2,3,4,5,6,7,8,9,10};
  printf("既に昇順です\n");

  return 0;
}
94デフォルトの名無しさん:2005/09/28(水) 20:25:34
>>93
新言語ですか?
95デフォルトの名無しさん:2005/09/28(水) 20:37:18
>>84
#include <stdio.h>
#include <stdlib.h>

/* 比較用 */
int compare_int_ascending(const int *a, const int *b)
{
  return *a - *b;
}

int main()
{
  int array[] = { ... }; /* データ */
  int count = sizeof(data)/sizeof(int);/* 要素数 */
  int i;
  /* ソート */
  qsort(array, count, sizeof(int), (int (*)(const void*, const void*))compare_int_ascending);
  for (i = 0; i < 10; i++) {
    printf("%3d", array[i]);
  }
  printf("\n");
  return 0;
}
96デフォルトの名無しさん:2005/09/28(水) 22:33:22
(多重)連結リストに格納されているデータをソートする場合、
地道〜に鈍足ソートするしかないんでしょうか?
97デフォルトの名無しさん:2005/09/28(水) 22:39:04
>>96
要素数がわかっているなら、配列につめ直してソートする手もある
後は、ヒープソートを使うと良いかな
98デフォルトの名無しさん:2005/09/28(水) 23:33:47
cgiやphpにみられるような掲示板やアプロダってC言語で作れるのでしょうか。
C言語を学んでいるのですがPHPを使って掲示板を作ろうと考えています、
でもC言語でそのようなものを作れるのであれば、勉強がてらC言語でつくろうかなとも考えているので。
宜しくお願いします。
99デフォルトの名無しさん:2005/09/28(水) 23:36:36
>>98
自宅サーバなど自分で管理しているサーバなら確実にできる。

そうでなくともサーバでCのコンパイルができればCで書けなくもないが、
そんなことができるサーバなんて普通ありえない。
100デフォルトの名無しさん:2005/09/28(水) 23:39:44
いちおうCGIをCで書けない事もないがな
101デフォルトの名無しさん:2005/09/28(水) 23:41:27
できるけど敢えてやるほどの事でもないような気がしないでもない
phpの勉強にもなるから、そっちでやったらどうか?
102デフォルトの名無しさん:2005/09/28(水) 23:41:43
>>99
普通ありえないって、なぜ?
103デフォルトの名無しさん:2005/09/28(水) 23:43:25
>>102
インターネットに繋がっていて外部に公開するサーバに得体の知れない外部から実行可能なバイナリを放置するなど
通常の思考が出来る管理者では絶対に許さない
104デフォルトの名無しさん:2005/09/28(水) 23:45:27
>>103
それは冗談で言ってるの?
105デフォルトの名無しさん:2005/09/28(水) 23:45:54
>>104
もちろん
106デフォルトの名無しさん:2005/09/28(水) 23:46:46
そこでコンパイルできなくても外部からバイナリもってくれば同じなのにな
107デフォルトの名無しさん:2005/09/28(水) 23:52:19
>>99
もしかして: AAA! CAFE
108デフォルトの名無しさん:2005/09/28(水) 23:53:23
>>103
今まで使ってきたいくつかのプロバイダは
Cが使えたけど、通常の思考じゃ無いと?
109デフォルトの名無しさん:2005/09/29(木) 00:00:15
>>97
ありがとうございます。
早速やってみます。
110デフォルトの名無しさん:2005/09/29(木) 00:32:45
>>108
通常の思考じゃないね
111デフォルトの名無しさん:2005/09/29(木) 00:52:38
xreaなんかはコンパイル用のシェルまで提供してくれてるけどな
第一、権限をちゃんと設定してればバイナリ置かれても支障無いだろ
置かれて困るようなのは、その辺の設定ができないヘタレ管理者
112デフォルトの名無しさん:2005/09/29(木) 00:53:44
前にビットマップのことで質問した者ですが、画像の角度を変えあるなどは出来たのですが、
ヘッダー情報を構造体で宣言しビットマップを読み込む関数で使って値をいれ、
ビットマップを作成する関数に引数として構造体を参照渡しで使いたい時はどう記述すればいいのでしょうか。
bmpHead bmpHead1;

readBmp(bmpName, &bmpHead1);  //BMP読み込み

writeBmp(bmpName2, bmpHead1.biHeight, bmpHead1.biWidth, iArr);  //BMP作成

のように引数として構造体のメンバを記入しなくてはいけないのでしょうか。
これでうまく渡せなかったものでして。
113デフォルトの名無しさん:2005/09/29(木) 00:55:46
>>9
ファイプロじゃねーか!!
114デフォルトの名無しさん:2005/09/29(木) 01:02:46
>>113
チートツール作りたいんだってさ
115セェンロン ◆89nOjCFiLI :2005/09/29(木) 01:31:29
現状

ファイプロのhtml化ツール(チートじゃねぇってw)
※某所のがなかなかリターンズにバージョンアップしないので、自分で作ることにした。

●リストビューみたいなのは、Microsoft FlexGrid Control 5.0ってやつらしい
 ActiveXコントロールを挿入してClassWizardでやるみたい。
 しかし、ヘッダーが無いって言われたり、基本クラスのCDialogが無いって入れたり、全てのソースをクラス化しなくちゃいけないくさいので挫折。

●リストビューで我慢することにした
 http://www.kumei.ne.jp/c_lang/sdk/sdk_69.htm
 しかし、猫のを見てやるとタブコントロールが表示されないし、フォントが馬鹿デカクなるし、バグだらけなので挫折。

●タブコントロールでググって出た別の方法でやってみることにした
 http://home.a03.itscom.net/tsuzu/programing/tips28.htm
 ここの方法でやると、タブコントロールの下にリストビューが行っちゃって、マウスで触れなくなるので挫折。
 何故か表示だけはリストビューが上。意味分からん。

●現在、DirectXで製作中。
 他に手段があるなら、そっちがいい。
 タブコントロールの上にリストビューってのは、不可能なんですかねぇ。。
116デフォルトの名無しさん:2005/09/29(木) 01:35:37
>>115
そんなのHTML生成してIEコンポーネントで表示で良いじゃねえか
117デフォルトの名無しさん:2005/09/29(木) 01:44:07
>>112
> 引数として構造体のメンバを記入しなくてはいけないのでしょうか。
そういう仕様の関数なら、そういうふうに書けばいいんじゃないか?

> これでうまく渡せなかったものでして。
うまく渡せないっていう意味がわからない。
118デフォルトの名無しさん:2005/09/29(木) 01:50:29
おそらく受け取りの関数が間違っているのかエラーはでないのですが、各メンバの値を調べると空で、
参照渡しで受け取ったものではなく、初期の構造体として値が無い状態になっていると思われるのですが、
きちんと説明が出来なくて推定になってしまいます。

メンバをひとつひとつ記述して渡すとソースが長くなってしまうので、簡略化する方法が無いかと思いましたので。
119デフォルトの名無しさん:2005/09/29(木) 02:08:06
>>118
ソースが長くなるから簡略化するとか、そんなこと考える前に
まずは構造体や関数の引数についてちゃんと勉強した方がいいんじゃないの?
120118:2005/09/29(木) 02:16:16
>>119
そうですね。本やネットで調べても解りずらいところがあり、実際にいろんな人に聞いたほうが
いろんなやり方があるのかと思い相談しました。
レスありがとうです。
121デフォルトの名無しさん:2005/09/29(木) 02:18:12
>>118
?何を言ってるのか全然意味がわからんので、脳内補完でレスしとく。

自作関数で参照渡しなら、どちらも構造体のポインタを引数にすればいいだけの話でしょ?
 bmpHead bmpHead1;
 readBmp(bmpName1, &bmpHead1);
 writeBmp(bmpName2, &bmpHead1);

もし、readBmpでうまく読み込めていないという話なら、
単にその関数の処理が失敗してるor間違ってるだけかと。
ファイル読み込みに失敗したとか、ヘッダ構成が実ファイルと合ってないとか、ね・・・。
12298:2005/09/29(木) 10:41:19
>>99>>100>>101
レスどうも。
phpで作ってみることにします、そのほうがもし仮に行き詰ったときにサポートがきくし、他者に聞ける気がするんで。
123デフォルトの名無しさん:2005/09/29(木) 10:51:11
long a, b, c;

a = 0xf9384d42;
b = a / 0x18;
c = a % 0x18;

なぜかこの計算結果が、b = 0xffb7ade3, c = 0xfffffffa になってしまいます。どこがまずいのでしょうか?
124デフォルトの名無しさん:2005/09/29(木) 10:53:55
自己解決。
unsignedにしたら出来ました。
スレ汚し失礼しました。
125デフォルトの名無しさん:2005/09/29(木) 12:52:24
>>95
ドア法
126デフォルトの名無しさん:2005/09/29(木) 13:50:43
>>95
×:for (i = 0; i < 10; i++) {
○:for (i = 0; i < count; i++) {

あと、何で"%3d"なんだ?2桁の数値しか考慮してないとか...
1, 23, 45, 67, 89 と 12, 345 , 567890の区別が付かないぞ

# 関数名がダサイのは一応目をつむっておこう
127デフォルトの名無しさん:2005/09/29(木) 14:20:00
それは降順だとか未定義動作が含まれてるとか
128デフォルトの名無しさん:2005/09/29(木) 15:14:22
># 関数名がダサイのは一応目をつむっておこう

と書きつつも、スルー出来なかったんだなw
129デフォルトの名無しさん:2005/09/29(木) 15:59:16
>>126
その2つなら「区別」はつくだろう。
3桁以上だと前の数字とくっついてしまうから、そういった区別以前の問題。
130デフォルトの名無しさん:2005/09/29(木) 17:40:06
>>129
違うだろ、データを書き換えた時にデータ数を変更してもforの終了条件を変えなくてすむ事が重要なんだろ
区別がつくつかないの問題じゃない
131デフォルトの名無しさん:2005/09/29(木) 17:51:44
ああああああああああああああああああああああああああああああああああああああああああああああああああ

もうプログラム氏ね
132デフォルトの名無しさん:2005/09/29(木) 17:55:55
とりあえず課題がどーしてもわからないから相談したい

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[]){
int getYYYY=atoi(argv[1]);
int yy;
int getYYYY(char *s){
if(strlen(s)==4){
else return -1;
}
if(isdigit(s[0])&&
isdigit(s[1])&&
isdigit(s[2])&&
isdigit(s[3])&&){
yy=atoi(s);
if(yy>=1970 && yy<=2005)
return yy;
else return -1;
}else return -1;
}
printf("%d\n",getYYYY(argv[1]));
}
まぁ明らかに違うのがわかるんだけども、直せない・・・。
どなたか教えていただきたい
133デフォルトの名無しさん:2005/09/29(木) 18:01:59
(゚Д゚;)
134デフォルトの名無しさん:2005/09/29(木) 18:09:55
>132
それまずコンパイルできないだろ
135デフォルトの名無しさん:2005/09/29(木) 18:13:26
>>132
ここはC言語のスレだ。
136デフォルトの名無しさん:2005/09/29(木) 18:15:49
>>132
君のその非常に柔軟な考え方はLispでは実現できるかも知れないが、
糞仕様のCでは(C++/Javaにも当てはまるが)関数内で関数の定義はできないんだ

あと、何がしたいのかを言わずに不完全なソースを出されても
何もアドバイスが出来ない。
137デフォルトの名無しさん:2005/09/29(木) 18:23:54
>>132
まず、どんな課題かわからない訳だが…(w
それと、丸投げなら宿題スレでやってね。
138デフォルトの名無しさん:2005/09/29(木) 18:45:06
C言語で、ある値の非整数乗、要はx^y (yは非整数)の計算ってどうしたらいいんですか?
ググっところ、complex.hを導入すればできるってのは分かったのですが、導入の仕方がきれいさっぱり分かりません。

なお、今のコンパイラはborland c++ 5.5.1です。
139138:2005/09/29(木) 18:56:22
質問が変でした。
#include <complex.h>とし、
doubleの値でcpowd(x,y)としてもエラーがでます
140デフォルトの名無しさん:2005/09/29(木) 18:59:37
そうなんですか
141デフォルトの名無しさん:2005/09/29(木) 19:04:58
powでいいんじゃないの?
142138:2005/09/29(木) 19:12:44
事故解決しました。
どう見ても精子です。
本当にありがとうございました
143デフォルトの名無しさん:2005/09/29(木) 19:37:28
皆さんコンパイルするときのコマンドは何使ってます?
cl cc gcc bcc
144デフォルトの名無しさん:2005/09/29(木) 19:44:22

for (i=0; str[i] != '\0'; i++);

この文をぬけた後str[i]の中の値は?
145デフォルトの名無しさん:2005/09/29(木) 19:47:33
>>144
0じゃまいか?つーかそれぐらい後ろにprintf追加すりゃ分かるだろ
146デフォルトの名無しさん:2005/09/29(木) 19:48:05
>>144
5です
147デフォルトの名無しさん:2005/09/29(木) 19:49:29
なぜ0になるのじゃ?おしえてくれー
よくわからん
148デフォルトの名無しさん:2005/09/29(木) 19:52:29
str[i]!='\0'が偽の場やいあとのi++は評価されるのれすか?
149デフォルトの名無しさん:2005/09/29(木) 20:07:30
>>145
'\0' == 0 と決め打ちしていいんだろうか?
150デフォルトの名無しさん:2005/09/29(木) 20:09:40
そうだす'\0'==0ではないのですが
なぜ中身が\0になるのかがわからないのです
for文のしくみがよくわからんのです
151デフォルトの名無しさん:2005/09/29(木) 20:12:43
>>149-150
K&R第二版p47
>'\0'はある式が文字型であることを強調するのに0の代わりに使われることが多いが、その数値は単に0である
152デフォルトの名無しさん:2005/09/29(木) 20:14:03
bcc
153デフォルトの名無しさん:2005/09/29(木) 20:14:08
for文の動きを詳しくおしえてもらえませんか?
154デフォルトの名無しさん:2005/09/29(木) 20:18:32
>>149-150
'\0'は8進法で文字コードを指定するエスケープシーケンス。
これが0と等しくなるのは当然だろう。
155デフォルトの名無しさん:2005/09/29(木) 20:22:14
>>153
for (e1_opt; e2_opt; e3_opt) {
    ...1
    continue;
    ...2
}

e1_opt;
while (e2_opt) {
    ...1
    e3_opt;
    continue;
    ...2
}
と同じ
156デフォルトの名無しさん:2005/09/29(木) 20:24:41
じゃないや
e1_opt;
while (e2_opt) {
  ...1
  {e3_opt;
   continue;}
  ...2
  e3_opt;
}
と同じ
forのe2_optが空のときは1を入れれば同じになる
157149:2005/09/29(木) 20:26:22
>>151
>>154
レスありがと。
そっか、今まで3回も無駄にキーボード叩いてたのか・・・
158デフォルトの名無しさん:2005/09/29(木) 20:27:24
>>157
まぁ俺は'\0'って打ってるけどな
こっちの方がより直感的に分かるから
159デフォルトの名無しさん:2005/09/29(木) 21:01:40
何が入っているか分からない文字列変数から
ある文字または文字列を削除する方法を教えてください。
お願いします。
160159:2005/09/29(木) 21:11:55
だめだ。全然具体的じゃなかった。。。
何が入っているか分からない文字列というのは
ファイルから読み込んだ文字列で、
削除する文字とは例えば改行文字'\n'などの事でつ。
小出しすみません。
161デフォルトの名無しさん:2005/09/29(木) 21:12:28
>>159
黙れ糞餓鬼
162デフォルトの名無しさん:2005/09/29(木) 21:18:56
先頭から一文字ずつ見ていって、ある文字または文字列以外なら出力先文字列にコピー。
163デフォルトの名無しさん:2005/09/29(木) 21:19:34
>>159
strstrとmemmove辺りで削除は出来そうだな。
追加はいろいろ面倒だけど
164159:2005/09/29(木) 21:25:50
>162-163
ありがとうございます。
概ね分かりました
165デフォルトの名無しさん:2005/09/29(木) 21:53:18
だからそういう馬鹿なレスで乙に入りたけりゃ初心者系に逝ってろよ。
166デフォルトの名無しさん:2005/09/29(木) 22:20:34
#include<stdio.h>
#include<stdlib.h>
int yy;
int getYYYY(char *s){
if(strlen(s)==4){
else return -1;
}
if(isdigit(s[0])&&
isdigit(s[1])&&
isdigit(s[2])&&
isdigit(s[3])&&){
yy=atoi(s);
if(yy>=1970 && yy<=2005)
return yy;
else return -1;
}else return -1;
}
int main(int argc,char *argv[]){
int getYYYYValue=getYYYY((char*)atoi(argv[1]));

printf("%d\n",getYYYYValue);
}

132が意図した処理は上記のコードだと推定した。
もちろんまともに動かないが、文句は132に言ってくれ。
167デフォルトの名無しさん:2005/09/29(木) 22:36:24
>>165
前スレの自演馬鹿キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
168デフォルトの名無しさん:2005/09/29(木) 22:42:52
何だろうな
なんとなくやりたそうな事は解らなくも無いが何を出力にしたいかがわからん
169デフォルトの名無しさん:2005/09/29(木) 22:55:08
              ヤダ                                /;:;:;:;:;:;l ミ
                   ,. ヘ.                       i;:;:;:;:;:;:;l ミ
              ,  ´ ̄ ̄` <}                         |:;:;:;:;:;:;:| ミ
               /           K`!                    |;:;:;:;:;:;:;| ミ
.       ヤダ   /       \  \j |ハト、                  fく:;___;:;|_
           /,二≧  l.  |\ \  ヽ! Kノ    ___   ___ ノ: : : : : ::丁:ト、
.         /, イ   i. ト、 \\ ヽ  V j.〉_  ,ノ: : : ::レ_´:: ̄ ヽ: : :―−:、: ::/:./: : ヽ
        // /  ..| l  | \ ,> ヾミ「_ ∨\ ̄` <二ヽ: :  ̄: ヽ: \: : : : : :ヾー': : : : : i
  ヤダ    l/ | | i | ヽ._|_   ヽ ,.ィi;うiY]  |;:;:;:〉,. --、  ヽ\: : : : :ヽ: :\: : : : ::}: : : i: : : | ヽヽヽヽヽヽヽヽ
             | | | |,.イ N ,__   ゞー" |l. |IK - 、__.ヽ   } ト、: : : : }:_:}: : : : j: : ::ノ: : : |― --   .. _  
       _/N ヽ.l !;yfご}!  ,    /|. |:|;:;| \    ̄{  |:::|:. : : : : : : : : :.: :' :::/: : : :/;:;:;:;:;:;:;:;:;:;:;:;:;:;:; ̄
       ノー一'゙ ヽ. |ト、 ト、`'゙   <> // /j仁.r '  ̄`ヽ. ヽ. }:::|:.: :. : : : : : : : :/:::/: : ::イ;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;
     //二.ユ _ ∨ jノ r`ー -r''7 / /  ̄       ヽ.∨::/: : : : : : : : : : : イ: : : : :厂 ̄  ̄  ̄  ̄  ̄  ̄
.    〈     , -/ ,/ 仁.   { {  |. /   /       /` ー―――'´ ̄ヽ-'´ ̄´
.      \_{   | / ∠{   [.r冖-- L._ヽ j/  _,∠. ____r '´                 ジタバタ
         \__{ ∨  ` ー-、     ヽ- '´
           ̄\_ 、 ト、ヽ,ヾ>               〜
             }.|||| !」
             ヽ.!_| ヽ!
170デフォルトの名無しさん:2005/09/29(木) 22:58:03
>>165
「乙に入る」とか書いてるお前のレスが一番馬鹿な件
171デフォルトの名無しさん:2005/09/29(木) 23:38:27
下記のようなテキストファイルから
一行づつ、文字列データとして変数に取り込みたいと思います。
とりこみ変数は、2次元配列 char data[i][j]; で
iを行数jが一行の文字数みたいな感じを、格納したいです。

if ((fp = fopen("data.txt", "r")) == NULL) {
printf("file open error!!\n");
exit(1);
}

ファイルオープンすることまでは分かりましたが
以下の処理が分かりません。
よろしくお願いします。

data.txt
41 ,43 ,47 ,50 ,62 ,51 ,39 ,70 ,47 ,,,,,,,,,
42 ,49 ,49 ,53 ,70 ,61 ,49 ,34 ,55 ,36 ,53 ,49 ,,,,,,
59 ,41 ,46 ,70 ,64 ,51 ,42 ,46 ,49 ,49 ,,,,,,,
172デフォルトの名無しさん:2005/09/29(木) 23:40:27
>>171
スレ違い、宿題スレ池
173デフォルトの名無しさん:2005/09/30(金) 00:48:20
よろしくお願いしますって、あんた何様?
174デフォルトの名無しさん:2005/09/30(金) 00:53:02
スレ違い様か。
175デフォルトの名無しさん:2005/09/30(金) 00:58:07
>>167
マタカー━━━━━━(゚∀゚)━━━━━━ !!!!!
176デフォルトの名無しさん:2005/09/30(金) 01:52:04
>>171
まず最初に、日本語がおかしい上に説明が意味不明。

もう少し落ち着いてやりたいことをまとめてくれ。
あと、ついでに下の質問にも答えてくれ。

1) 読み込むファイルデータはCSV形式と考えてよい?

2) dataの各要素には何が入るの?文字?数値?
  a)文字: '4', '1', ',', '4', '3' ...  (data[i]は文字列"41, 43, ..."となる)
  b)数値: 41, 43, 47, ...    (data[i]は数値の配列となる)

3) dataのサイズ(行、文字数)は固定?
 →data[MAX_ROW][MAX_COLUMN]として、
  行がMAX_ROWを超えたり、行のデータの個数がMAX_COLUMNを超えた場合は
  残りを切り捨てていいのか?
177デフォルトの名無しさん:2005/09/30(金) 02:00:20
すれ違いだっつーに。
178171:2005/09/30(金) 06:40:14
>>172
宿題ではないのですが・・・。

>>176
レスありがとう御座います。
やりたいとこは、テキストファイルから一行づつの文字列を作りたいです。
作成された文字列を使って、後から行ごとに数値化したいと思っています。

1)CSVでOKです。ただ、文字列として取り込みたいです。

2)文字として取り込みたいです。

3)MAX_ROWをデータの行数より十分に大きくしてすべて取り込めるようにしたいです。
179デフォルトの名無しさん:2005/09/30(金) 07:31:04
>>178
宿題じゃなくても丸投げは宿題スレへ。
さもなくば初心者スレにでもどうぞ。
180デフォルトの名無しさん:2005/09/30(金) 10:56:01
>>178
文字のままやりたいのならCでなくPerlやawkでやった方が楽だぞ
まず、Cでなきゃいけない理由が知りたい
181デフォルトの名無しさん:2005/09/30(金) 11:08:55
javadocのC言語版ってありませんか?
182デフォルトの名無しさん:2005/09/30(金) 11:13:46
>181
doxygen
183デフォルトの名無しさん:2005/09/30(金) 11:19:51
>>181
つDoxygen
184デフォルトの名無しさん:2005/09/30(金) 12:42:44
>>>181
つ[DOXYGEN]
185セェンロン ◆89nOjCFiLI :2005/09/30(金) 14:20:12
仮に、
 TEST, ギコ, マ板, 1234
ってのがあったとしたら

char sz_fr[ 256 ], sz_fr2[ 256 ], sz_job[ 4 ][ 256 ];
char *token;
int tcnt;

while ( fgets(sz_fr, 256, fp) != NULL ) {
 strcpy(sz_fr2, sz_fr);
 token = strtok(sz_fr2, " ,\t\n");
 tcnt = 0;
 memset(sz_job, 0, sizeof(c8)*4*256);
 while ( token != NULL ) {
  sprintf(sz_job[ tcnt ], "%s", token);
  tcnt++;
  if ( tcnt >= 4 ) {
   printf("ERR\n");
   return 1;
  }
  token = strtok(NULL, " ,\t\n");
 }
}

で最終的に、sz_jobに入る。
この処理って頻繁に使うんだけど、もっと良い方法があったらわしも知りたい。
186デフォルトの名無しさん:2005/09/30(金) 16:04:13
>>185
strtok()を使うにしても汚いコードだな。
strtok()はスレッドセーフではないし、sscanf()推奨。
187デフォルトの名無しさん:2005/09/30(金) 16:10:11
>>185
汚いなあ。だけじゃなくて、ロジック的にも変だろう…
って、テストしてないだろ、ほんとに駄目じゃん。初心者スレ逝け。
188デフォルトの名無しさん:2005/09/30(金) 16:36:26
>>187
pfintf("頻繁に使うって書いてあるから、テストはしてると思うヨ。\n");
189デフォルトの名無しさん:2005/09/30(金) 16:46:55
pfintf pfintf pfintf pfintf pfintf pfintf pfintf pfintf
190デフォルトの名無しさん:2005/09/30(金) 16:47:42
↑pufs()使えよ
191デフォルトの名無しさん:2005/09/30(金) 16:57:51
>>185=188 自演乙
>>187=189 必死乙

192187!=189:2005/09/30(金) 17:10:35
>>188,191 大莫迦鬱
4つ目 sz_job[3] を格納した後どうなるかだけでも追ってみろ。
193187:2005/09/30(金) 17:17:50
念為。いちおう sz_job[n][0] == '\0' が sentinel って解釈はあるな。
ってひどい例と実装に違いはないと思うが。
194デフォルトの名無しさん:2005/09/30(金) 17:46:12
size_t型はint型とは違うらしいですが
str = (char *)malloc(GetFileSize(hFile , NULL) + 1);
NULL文字の確保に+1が必要なんですが、このコード間違ってます?
195デフォルトの名無しさん:2005/09/30(金) 17:52:57
>>194
OK
196セェンロン ◆89nOjCFiLI :2005/09/30(金) 18:07:05
sz_job[ 3 ]を格納した後、sz_jobを使って1行ごとの何かしら処理をします。
何かしらの部分が、例題ということで省略しました。

1行ごとに処理していくプログラムとして書いたのですが、見れば分かると思って省略した部分が失敗だったようで。
肝心なとこが抜けていて申し訳ないです。

どういう風に書いたら綺麗になりますか?

>>191
自演じゃねーし。
197デフォルトの名無しさん:2005/09/30(金) 18:17:54
>>195
d
198187:2005/09/30(金) 18:43:27
>>196
で、省略はともかく sz_job[3]を格納した後 ERRになると。
どのみち設問自体カスなんでおとなしく初心者スレで。糞コテ終了。
199171:2005/09/30(金) 18:46:37
>>179
すみません、スレ間違えたみたいですね。
誘導ありがとう御座いました。
200セェンロン2 ◆89nOjCFiLI :2005/09/30(金) 19:28:37
>>198
あぁなるほど、if文の場所がおかしかったんですね。
どうもありがとうございます。
201デフォルトの名無しさん:2005/09/30(金) 21:41:31
そこの頭の弱いお2人!そう貴方達ですよ!
もっと喧嘩してくれよ。おもんない。
202デフォルトの名無しさん:2005/09/30(金) 21:47:29
質問です。
浮動小数点の計算でGMPを使っているのですが、
浮動小数点データ型mpf_tの中に、
初期値としてdouble以上の値を代入するには
どうすればいいのでしょうか?
203デフォルトの名無しさん:2005/09/30(金) 21:52:40
もうこのスレいらなくね?
初心者には標準か非標準かという区別が付きっこないんだから。
204デフォルトの名無しさん:2005/09/30(金) 21:56:16
>>203
お前が去れば何の問題も無い
205デフォルトの名無しさん:2005/09/30(金) 22:00:07
それは書いてから俺も思った
206202:2005/09/30(金) 22:00:55
>>203
すみません、完璧に標準Cじゃなかったですね。
スレ違いでしたm(_ _)m
207デフォルトの名無しさん:2005/09/30(金) 23:31:00
itanium2の乗っているマシンでcのプログラムをつくっています。
gccでコンパイルしているのですが、
warningが出てコンパイルができません。
以下のようなエラーです。
warning: cast to pointer from integer of different size
引っかかっている場所は、
double *ini=(double *)malloc(sizeof(double)*1000000);
という場所です。配列iniのサイズが小さいうちは以下のように
double ini[10000]
とすれば、通るのですが、大きなメモリ領域を確保しようと
mallocを使うと上のようなエラーが出て、コンパイルできません。
調べてみると、64ビット系で起こるエラーであるということは
わかったのですが、回避の仕方がわかりません。
どなたかご存じの方がいらっしゃったらお教えください。
OSはレッドハット8でカーネルは2.4.24です。


208デフォルトの名無しさん:2005/09/30(金) 23:37:18
>>207
stdlib.hをインクルードしているか?
209デフォルトの名無しさん:2005/10/01(土) 00:47:44
e[N+2][2*N+2]

上記は1次元熱伝導問題を差分法で解くサンプルコードにあった配列なのですが、
どちらがx(位置)で、どちらがt(時間)を表しているのでしょうか?
何故両方ともN+2ではないのでしょうか? (Nは最大分割数)
210デフォルトの名無しさん:2005/10/01(土) 01:08:15
説明不十分過ぎ
差分法のソースならたぶん簡単だからよく読め
211デフォルトの名無しさん:2005/10/01(土) 01:08:28
212デフォルトの名無しさん:2005/10/01(土) 01:56:09
>>207
マルチ乙
213デフォルトの名無しさん:2005/10/01(土) 02:23:16
向こうで誘導されて来たんだろ。誘導した香具師もどうかと思うが。
214デフォルトの名無しさん:2005/10/01(土) 03:14:38
IPの後に数は不特定の文字列が入った1行の文字列lineが、スペースを区切りに数行あったとします。

line[NUM] = {
"192.168.1.1 abc def",
"192.168.1.2 efg",
"192.168.1.3 hij klm nopqrs tu"
};

こんな感じです。
これのIPと、最初の文字列、最後の文字列を効率的に変数に読み込むにはどのような方法がよいでしょうか?
IPと最初の文字列だったら

sscanf(line, "%d.%d.%d.%d %s",&IP[0],
&IP[1],
&IP[2],
&IP[3],
&name );

という感じでできたのですが、「数が決まってない複数ある文字列の中の最後の文字列」を読み込むいい方法が思いつきません。どなたかアドバイスおねがいします。
215デフォルトの名無しさん:2005/10/01(土) 03:16:16
>>214
すいません、みすりました。

line[NUM] = {
"192.168.1.1 abc def",
"192.168.1.2 efg",
"192.168.1.3 hij klm nopqrs tu"
};
これは気にしないでください・・・
line = "192.168.1.1 abc def";
だと思ってください。
216デフォルトの名無しさん:2005/10/01(土) 03:18:02
>>214
後ろから地道に探していけば?
217デフォルトの名無しさん:2005/10/01(土) 03:20:27
>>214
危険だがstrtok使うとか、後はstrlenで長さ出して後ろからスペースが出るまで
ポインタ動かしていって、strcpyで切り出し
218214:2005/10/01(土) 03:37:23
レスありがとうございます。
やっぱりそれしかないですかー。
それでいくことにします、ありがとうございましたー。
219デフォルトの名無しさん:2005/10/01(土) 03:41:08
strrchr で空白探せばいいんじゃない?
220デフォルトの名無しさん:2005/10/01(土) 04:49:44
>>214
sscanf(line, "%d.%d.%d.%d.%n",...)で変換完了点を取得、そこからstrrchr()して見つかればそこから。
221デフォルトの名無しさん:2005/10/01(土) 08:21:30
「猫でも分かる」のサイトのC言語編「第34章 リスト構造」
ttp://www.kumei.ne.jp/c_lang/intro/no_34.htm
これ見てたんですけど、
malloc した後、freeで開放しないでいいの?
それと2度目の while の直前で a = b してるけどこれってなんの為にしてるんですか?
222デフォルトの名無しさん:2005/10/01(土) 09:20:31
> malloc した後、freeで開放しないでいいの?
最近の PC の OS なら間違いなく main 終了時に自動的にメモリが開放される。
まあ、本当はちゃんと開放した方がいいとは思う。
ここでは、プログラムが長くなるから省略したと好意的に解釈しておく。
開放方法も説明しなくちゃいけないし。

> それと2度目の while の直前で a = b してるけどこれってなんの為にしてるんですか?
色々プログラムを書き換えた時に、消し忘れたんじゃないかな?
他にも色々と洗練されてない。
書き換えるならこんなところか。

int main() {
 struct list *a, *b;
 char str[16];

 for(b = NULL; ; b = a) {
  printf("整数を入力(Eで終了)-->");
  scanf("%s", str);
  if(strcmp(str, "E") == 0) break;

  a = malloc(sizeof(struct list));
  a->num_data = atoi(str);
  a->nextlist = b;
 }

 printf("入力された整数は");
 for( ; a != NULL; a = a->nextlist) {
  printf("%d, ", a->num_data);
 }

 return 0;
}
223221:2005/10/01(土) 09:50:41
むむ、for文のこの使い方初めて見ました。
最初のは b を NULL で初期化して b = a しつつ無限ループで
次のforは初期化は省略して a != NULL の間 a = a->nextlist しつつループですか!
慣れると面白そうですね。
224デフォルトの名無しさん:2005/10/01(土) 10:49:21
a を保存しておきたければ

 printf("入力された整数は");
 for(b = a ; b != NULL; b = b->nextlist) {
  printf("%d, ", b->num_data);
 }

で、開放は

 while(a != NULL) {
  b = a->nextlist;
  free(a);
  a = b;
 }

か。

 void list_free(struct list* a) {
  if(a == NULL) return;
  list_free(a->nextlist);
  free(a);
 }

と再帰してもいいんだが、末尾再帰じゃないからなあ。
物凄く長いリストでスタックオーバーフローするかもしれん。
(コンパイラが末尾再帰最適化(※)に対応してなければ、末尾再帰でも問題になるが)
木構造だと要素数に比して深さは大したことない事が多いけど、リストは一直線だしね。
まあ、あまり長いリストを扱わない前提ならいいと思う。

※)末尾再帰最適化
再帰をループに直す最適化。最後の最後で再帰(末尾再帰)しないと無理。
return foo() + 2; でも、関数終了後に 2 を足す作業があるので駄目。
225408:2005/10/01(土) 14:13:33
 void list_free(struct list* a) {
  struct list* n;
  if(a == NULL) return;
  n=a->nextlist;
  free(a);
  list_free(n);
 }
226デフォルトの名無しさん:2005/10/01(土) 14:15:18
どーでもいいけど全体を設計してから些末にこだわってくれ。
227デフォルトの名無しさん:2005/10/01(土) 14:16:02
>>226 は誤爆だ。すまぬ。
228デフォルトの名無しさん:2005/10/01(土) 17:12:27
>>226
そのとおりだね。小手先もボディーブローのように後で効くけど、全体の設計が杜撰だと後で苦労するね。

マジレスw
229デフォルトの名無しさん:2005/10/01(土) 23:50:11
#includes って知ってる??
230デフォルトの名無しさん:2005/10/02(日) 00:30:47
知らないなw
231デフォルトの名無しさん:2005/10/02(日) 00:36:04
C言語の出力にgnuplotを使おうと思っているのですが、
MS−DOSプロンプトなどからのコマンドラインで、
gunplot.exeなどのexeファイルを実行するコマンドを教えてください。
232デフォルトの名無しさん:2005/10/02(日) 00:36:49
system() ?
233デフォルトの名無しさん:2005/10/02(日) 00:37:18
>>231
system()
234デフォルトの名無しさん:2005/10/02(日) 00:38:09
system()
235231:2005/10/02(日) 00:38:59
>>233
exeファイルのあるディレクトリに移動して、system()と入力するのでしょうか?
()の中に何か入れるのでしょうか?
236デフォルトの名無しさん:2005/10/02(日) 00:40:09
少しは自分で調べたらどうか
237デフォルトの名無しさん:2005/10/02(日) 00:40:50
>>235
お好きなエディタに移動して system(""); と書く
238231:2005/10/02(日) 00:47:28
>>237
コマンドプロンプト上で実行する命令がしりたいのですが?
cd や ls などのような命令コマンドを教えてください
239デフォルトの名無しさん:2005/10/02(日) 00:48:36
240デフォルトの名無しさん:2005/10/02(日) 00:48:40
>>238
そんなものは無い
241デフォルトの名無しさん:2005/10/02(日) 00:58:45
>>238
system("ls || dir");
とか?
242デフォルトの名無しさん:2005/10/02(日) 01:01:37
もしかしてUnixのpopenの事を言ってるのか?
243デフォルトの名無しさん:2005/10/02(日) 01:04:10
>>221
>それと2度目の while の直前で a = b してるけどこれってなんの為にしてるんですか?

>>222
>色々プログラムを書き換えた時に、消し忘れたんじゃないかな?

まず、list型データは線形リストになっている。
aは新規データ操作、リスト全体へのアクセスに使われ、bがデータを保持する。
bは最初NULLを指し、常に最後に取得したデータを指す、
先入れ後出しなデータ構造になっている。

それは理解してるようだが、
a = b; は、aを無駄に初期化せずに次の処理に入る無駄のない処理だ。

その後のループの終了条件はNULLが来ること。
これは、データ件数が0の場合でも、すべてのデータを処理し終えた場合でも
同じ条件でループを抜けることができる効率的な方法だ。

ソースコードでは malloc()に失敗した場合のコードが省かれてるが、
普通はmalloc()に失敗した場合もデータ取得の終了条件になる。
するとaはデータを正しく指さなくなる。
だから確実にデータを保持しているbを代入しなければならない。

データをどの変数が管理するのかをきちんと決めてそれを維持するようにする事が、
錯誤のない、例外が発生しないプログラミングをするために必要だ。
244デフォルトの名無しさん:2005/10/02(日) 01:11:07
>>243
そんな細かい事考えるの面倒だからC++でtry構文使っちゃダメ?
245231:2005/10/02(日) 01:19:07
>>242
はい。すみません。UNIXでの実行コマンドを教えてください。
246デフォルトの名無しさん:2005/10/02(日) 01:20:32
>>243
NULL チェックしてないから不要ジャン。
それを言うなら、普通は malloc で確保する時に使う変数を一時変数にするぜ。
247デフォルトの名無しさん:2005/10/02(日) 01:21:39
>>245
スレ違い
248デフォルトの名無しさん:2005/10/02(日) 01:24:16
質問の意味がわからないのは俺だけ?
249デフォルトの名無しさん:2005/10/02(日) 01:28:57
>>222
 for(b = NULL; ; b = a) {

これは最初の判定で break; してしまった場合、
aが指すアドレスが不定になってしまう。
そのままで free() なんかするとメモリを壊してしまう。
メモリ破壊をしないためにあえてサンプルでは free() をしてなかったりして。

>>244
C++知らないけど、tryばっかりで深すぎて全体が流れとして見えなかった。
流れで見るのが間違ってるかもしれない。
小規模のしか作ったことないし。

>>246
while (1) {
if (a == NULL)

これは僕ならこう書く
while ( a ) {
250デフォルトの名無しさん:2005/10/02(日) 01:36:41
関数ポインタのポインタをtypedefを使わずにどのように定義したらいいんでしょうか?

typedef void(*Func)();
Func* f;

のFunc*をtypedefを使わずに定義したいんです。
251デフォルトの名無しさん:2005/10/02(日) 01:52:10
>>248
俺も分からん
このスレに来てる癖にUnixコマンド聞いてるしな

まぁUnixといってながらMSDOSプロンプトとか言ってる時点でお察しだが
252デフォルトの名無しさん:2005/10/02(日) 01:59:07
>>250
void (**f)();
253デフォルトの名無しさん:2005/10/02(日) 02:41:00
>>249
> これは最初の判定で break; してしまった場合、
> aが指すアドレスが不定になってしまう。
あぁ、そのための b = a; か、って、
a = b = NULL; にすればいいだけか。
254デフォルトの名無しさん:2005/10/02(日) 02:42:07
間違えた。a = b; だ。
255デフォルトの名無しさん:2005/10/02(日) 02:44:21
>>250
見た目優先で

 Func* f;

と書くのは構わないが、基本的には

 Func *f;

だということを頭に入れておく必要がある。
変数名の前に * を入れるとポインタになり、
* を増やすと深くなる。

それを踏まえれば、

 void (**f)();

になることは言うまでも無い。
256デフォルトの名無しさん:2005/10/02(日) 03:58:26
>>245
popenをコンソールアプリで使いたいのだと勝手に考えとくw

DOS環境のpopenならDJGPPのソースから持ってくれば早いんだがそれじゃWindows環境じゃ動か無いな
問題はコンソールをどうやって子プロセスの入出力に対応付けるかだが、
動きそうなのはcygwinのclibのソースから持ってくるって所か?
257デフォルトの名無しさん:2005/10/02(日) 04:10:33
つーか、コンソールアプリにしてパイプで繋げばいいだけだろ
敢えてCから制御する意味が分からん
258デフォルトの名無しさん:2005/10/02(日) 04:49:21
void foo(int n)
{
char s[n];
}

このコードがgcc 3.3.2で問題なく通るんですが、
なんで配列を定義するときの要素数に変数が使えるんですか?
bcc 5.5ではコンパイルエラーになりましたが。
259デフォルトの名無しさん:2005/10/02(日) 05:05:22
>>258
それはC99の仕様
260258:2005/10/02(日) 05:16:14
>>259
ttp://ja.wikipedia.org/wiki/C99

解決した。
gccから取り込まれたんだと。
261デフォルトの名無しさん:2005/10/02(日) 07:16:55
>>258
エッ、そんなことできたの!!?
262デフォルトの名無しさん:2005/10/02(日) 07:32:49
環境依存なことをしない限りは、安全のため -ansi -pedantic -Wall でコンパイル。
C99 使いたければ -ansi の代わりに -std=c99 だ。
263デフォルトの名無しさん:2005/10/02(日) 09:58:35
ポーカーのプログラムを作りたくて
以下のように役の名前を宣言するとクラスメンバーが初期化できないといわれます。
どういうことなんですか?

class Poker{
  private:const char *pairName[] = {
    "No Pairs",
    "One Pair",
    "Two Pairs",
    "Three of a Kind",
    "Straight",
    "Flush",
    "Full House",
    "Four of a Kind",
    "Straight Flush",
    "Royal Flush",
  };
    :
    :
264デフォルトの名無しさん:2005/10/02(日) 10:05:34
Cなのかそれは。
265デフォルトの名無しさん:2005/10/02(日) 10:06:10
C++はダメですか?
266デフォルトの名無しさん:2005/10/02(日) 10:09:43
>>265
【初心者歓迎】C/C++室 Ver.21【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1125743714/l50
267デフォルトの名無しさん:2005/10/02(日) 10:33:28
staticじゃないからだろ
268デフォルトの名無しさん:2005/10/02(日) 11:46:47
#include <stdio.h>
#include <conio.h>
int main(void)
{
int cnt;
char m,ch;
m='z';
for (cnt=1;cnt<11;cnt++){
ch = getche();
if (m>ch)m=ch;
printf("\n\n");
}
printf("一番前の文字は%c",m);
return 0;
}

アルファべット順で一番前に来る文字を最後に表示するプログラムを作っているんですが、
独習Cの回答とほとんど同じなのに最後に正しく表示されません。どこがおかしいか教えてください。
269デフォルトの名無しさん:2005/10/02(日) 11:50:26
>>268
質問の仕方。
実行結果の例くらい示せ
270デフォルトの名無しさん:2005/10/02(日) 11:59:23
「一番前の文字は」のあとに文字が出るはずなんですが、何もでないんです
271デフォルトの名無しさん:2005/10/02(日) 12:36:00
>>270
どんな文字を入力したか位のことは書くべきだとは思わないもんかねぇ。
まぁ、getche()使っているからスレ違いだな。
272デフォルトの名無しさん:2005/10/02(日) 12:49:40
>>270
「一番前の文字は」が出てるなら
printf("一番前の文字は%c(%x)です",m,m);
とでもしてやり直せ
273デフォルトの名無しさん:2005/10/02(日) 13:29:26
%xとは何型で表示するものなんですか?
>>271
アルファベットを入力してます
274デフォルトの名無しさん:2005/10/02(日) 13:39:57
>>273
man printf

もう来るな、帰れ
275デフォルトの名無しさん:2005/10/02(日) 13:45:12
>>273
%x は16進数で表示するよ。
私が使ってるOS、FreeBSD では、コマンドライン上で jman 3 printf と打つことで、
printf 関数の説明が見れるんだけど、Windows を使ってる人はどこを見ればいいんだろうね。
使っているコンパイラにもよるんだろうけど。
とりあえずこれでも読んでみて。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=printf&dir=jpman-3.1.0%2Fman§=3
276デフォルトの名無しさん:2005/10/02(日) 13:48:39
>>275
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html
printfでぐぐれば一番上にこの和訳されたManpageが出る
ついでにCygwinさえ入れてればmanコマンド使える
277デフォルトの名無しさん:2005/10/02(日) 13:50:37
できました、ありがとうございました。
文字のコードを表示するんですね。
278デフォルトの名無しさん:2005/10/02(日) 13:51:01
八ッキングおせーて
279デフォルトの名無しさん:2005/10/02(日) 14:00:25
やだよーん☆
280デフォルトの名無しさん:2005/10/02(日) 14:05:00
281デフォルトの名無しさん:2005/10/02(日) 14:20:43
>>242
何を見てそう思ったのかよくわからないけど飛躍しすぎだぞ
282デフォルトの名無しさん:2005/10/02(日) 14:33:39
VS.NETならコードエディタで関数名タイプした時点でMSDNのオフラインドキュメントが辞書引きされて
出てくる
283デフォルトの名無しさん:2005/10/02(日) 15:36:48
>>278
何でもいいからトリッキーなコードを書いてみる遊びに教えるもクソもない
クラックやボランティアと混同しているならそれらとの区別を調べて
自分が興味を持っている分野が世間で何と呼ばれているかを知るといい
そうすれば同好の士が見つけることの能率が上がるだろう
個人的には自己満足のコードを書くだけならいちいち徒党を組む必要はないと考えるが
284デフォルトの名無しさん:2005/10/02(日) 18:42:13
>>281
だって、出力用にgnuplot使いたいと言ったらcsvとか吐き出してそれをグラフ化したいのかな?って思うのが普通じゃん
popenつかえば中間ファイル作らなくてすむから楽かなと思っただけ
285デフォルトの名無しさん:2005/10/02(日) 20:36:05
>>278
まずは、ログインしているところを肩ごしに覗き見るところから始めてみたら。
286デフォルトの名無しさん:2005/10/02(日) 20:40:14
関数化してください。

http://briefcase.yahoo.co.jp/light_blue_8671
問題はいってます。


287デフォルトの名無しさん:2005/10/02(日) 20:48:34
>>286
スレ違い。
288デフォルトの名無しさん:2005/10/02(日) 20:52:28
ほかのスレに書いたんですが、こっちのほうがいいと思い質問です。
以下の問題を配列を必ず使ってプログラミングしてください。

正整数を入力し、それをローマ数字で表示するプログラムを配列を使って作りなさい。
1000がM, 100がC, 10がX, 1がIであるので、たとえば、123と入力するとCXXIII、1365はMCCCXXXXXXIIIIIと出力できればよい。
<入力例>
Input: 3247

<出力結果>
MMMCCXXXXIIIIIII

Cを始めて2週間ですがわかりません。お願いします。
289デフォルトの名無しさん:2005/10/02(日) 20:56:55
>>288
あほだな、ソースが欲しいならC言語始めるぞスレで課題にしちゃえばいいんだよ
ちなみに普通4→IVとか、9→IXってするけどそれは良いの?
290デフォルトの名無しさん:2005/10/02(日) 21:02:53
そんなスレあったのか・・・。
4とかはIIIIでいいはず。めんどくさいから5→Vってのすら無いし。
291デフォルトの名無しさん:2005/10/03(月) 00:33:00
stat でファイルのアクセス権を取得したんだがこれをRWX に変換する方法はありませんか?このために関数作るのもな
292デフォルトの名無しさん:2005/10/03(月) 01:27:50
>>291
>使用している開発環境のスレへGo! (←ここ注目)
293デフォルトの名無しさん:2005/10/03(月) 01:37:33
>>292
さんくす
環境はLinuxなんですがUNIXスレに移動した方がいいってことか。
294デフォルトの名無しさん:2005/10/03(月) 18:01:39
>494<---前スレです!
>scanfを暴走させるのはスキル不足
>getsを使うのは知識不足
>strtokでハマルのは理解力不足
>よって、馬鹿はscanf, gets, strtokは使わない方が良い。

9月の話に戻っちゃうけど…
scanfは分かります。改行がバッファに残って
悪戯しますよね。
getsやstrtokのどこに不具合があるのか?
教えて下さい。
295デフォルトの名無しさん:2005/10/03(月) 18:05:22
>>294
そんな質問は>>1を読んでからでもいいんじゃないか?
296デフォルトの名無しさん:2005/10/03(月) 18:14:45
297デフォルトの名無しさん:2005/10/03(月) 18:24:04
>295
少なくとも、K&Rには書いてない。
298デフォルトの名無しさん:2005/10/03(月) 18:31:38
少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。
少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。 少なくとも、K&Rには書いてない。
299デフォルトの名無しさん:2005/10/03(月) 18:38:07
最後に_sをつけたら解決
MS信者でよかったね、報われたね
300デフォルトの名無しさん:2005/10/03(月) 19:16:14
>>297はK&Rにダメと書かれてなければ全ていいと思ってる馬鹿
301デフォルトの名無しさん:2005/10/03(月) 19:43:19
>>297
http://www.kouno.jp/home/c_faq/c12.html#23

C FAQの12章23を200回読め
302デフォルトの名無しさん:2005/10/03(月) 20:15:31
strcpy((db[i+1]=(char*)malloc(128)),dv_key[2]);
これなにやってるかわかりますか?
おしえてください。
303デフォルトの名無しさん:2005/10/03(月) 20:17:09
>>302
dv_key[2]の内容を、新たに割り当てた128バイトの領域にコピーしている
304デフォルトの名無しさん:2005/10/03(月) 20:24:12
>>302
db[i+1] = (char*)malloc(128);
strcpy(db[i+1], dv_key[2]);
と分ければ分かるかね?
305デフォルトの名無しさん:2005/10/03(月) 20:27:14
>>302
malloc() に成功するかどうかも分からないのに馬鹿なことするなあ。
strcpy() にしても、何文字コピーするか指定できないのによく使うよなあ。
僕はstrcpyはバイト数も指定してコピーするけど、無駄ですか?
306デフォルトの名無しさん:2005/10/03(月) 20:40:11
>>305
strncpyならともかく、strcpyじゃコンパイル通らないでしょ。
307デフォルトの名無しさん:2005/10/03(月) 21:04:59
>>305
その「バイト数」とやらが簡単に変更可能ならOK
308デフォルトの名無しさん:2005/10/03(月) 21:43:43
おれは、D言語にする。
すばらしきD言語
309デフォルトの名無しさん:2005/10/03(月) 21:52:25
>>303
ありがとうございます!
何をやっているかはわかりました。
そこでもう1つ質問です。そうしてわざわざdb[i+1]=(char*)malloc(128)
としているのですか?db[i+1]だけではだめなのでしょうか?
理由を教えていただけませんか?
310デフォルトの名無しさん:2005/10/03(月) 21:53:19
>>296
strtokの方のバグには、区切り文字が連続する状況では使えないってのが書いてないな
311デフォルトの名無しさん:2005/10/03(月) 23:06:03
>>309
mallocはメモリ領域を確保する。
それを行っているということは元のdb[i + 1]は適切なメモリ領域を指しているものでないということだろう。
だからmallocを呼んで領域を割り当てておかないとメモリのどこかわけわからない場所へ書き込もうとすることになる。
312デフォルトの名無しさん:2005/10/03(月) 23:33:20
>>310
それはバグというよりも仕様では
もっとも連続する区切り文字を一つの区切りとみなしたいケースって
空白文字を区切りとして使う場合ぐらいだけどな
313デフォルトの名無しさん:2005/10/04(火) 00:17:54
電話に電話以上の機能を求める図々しさ・・・トホホ者の天才的資質
314デフォルトの名無しさん:2005/10/04(火) 00:19:39
ビットマップを拡大・縮小するにはどうしたらいいのでしょうか。
ヘッダーもいじらなきゃいけないのですが、ファイルに書き込むところで。
二次元配列に入れてピクセルデータを1/2縮小なら配列からひとつおきにファイルに書き込んで
2倍拡大なら配列のひとつの値を同じのを2つ連続でファイルに書き込んでいけばいいと思うのですが、
その書き方が解りません。お願いします。
for(i=0; i<biHeight; i++){
  for(j=0; j<biWidth; j++){
    fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2);
  }
}

315デフォルトの名無しさん:2005/10/04(火) 00:24:02
StretchBlt
これ以上はスレ違いなので
http://pc8.2ch.net/test/read.cgi/tech/1125850096/
で聞け
316デフォルトの名無しさん:2005/10/04(火) 00:24:39
>>314
XFORM
317デフォルトの名無しさん:2005/10/04(火) 00:35:48
>>315 >>314
どうもすいません。一応モジュールなどは使わないで配列などの工夫だけで出来るから
と言うことだったのでRGBなど気にしないで、配列の中身を一個おきに取り出す方法などをお聞きしたかったもので。
パズルみたいにひらめきと言われたのですが躓いてしまったもので。
318デフォルトの名無しさん:2005/10/04(火) 00:46:08
これで満足か?

1/2
for(i=0; i<biHeight; i+=2){
  for(j=0; j<biWidth; j+=2){
    fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2);
  }
}

2倍
for(i=0; i<biHeight; i++){
  for(j=0; j<biWidth; j++){
    fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2);
    fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2);
  }
  for(j=0; j<biWidth; j++){
    fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2);
    fwrite(&iArr[i][j], sizeof(unsigned char), 1, fp2);
  }
}
319デフォルトの名無しさん:2005/10/04(火) 00:57:53
>>318
どうもありがとうございます。
答えを見てやり方を考えるとこうすれば良かったんだと思うのですが、なかなか自分では
うまく形に出来ないんで。こうすればいいなどの方向は漠然と思いつくのですが、汎用性を持たないなどの
きれいなソースがかけないので、もっと試していくようにします。
ありがとうございました。
320デフォルトの名無しさん:2005/10/04(火) 06:38:09
biHeight ってことは BMP 形式か? 8bit形式は却って難しいぞ
^^
321デフォルトの名無しさん:2005/10/04(火) 10:33:15
プログラムがしたいんですけど、CとC++ならどちらを勉強した方がいいですか?
322デフォルトの名無しさん:2005/10/04(火) 10:41:40
>>314
どうして、まずビットマップのファイル形式から調査しないのか、理解に苦しむ。
323デフォルトの名無しさん:2005/10/04(火) 10:47:03
C++
324デフォルトの名無しさん:2005/10/04(火) 10:52:55
>>321
やりたい方
細かい長所短所よりやる気が最重要
ちなみに C と C++ は可能なことと不可能なことが同じだ
325デフォルトの名無しさん:2005/10/04(火) 12:11:50
>>324
それは流石に言いすぎだろ。

>>321
「プログラムがしたい」が具体的に何をさすのか知らんが、
単にプログラミングを齧ってみたいだけならVBAでもやっとけ。
326デフォルトの名無しさん:2005/10/04(火) 12:34:13
c++
327デフォルトの名無しさん:2005/10/04(火) 12:43:01
>>321, >>322-326
他所でやれ。
328デフォルトの名無しさん:2005/10/04(火) 12:45:03
>>321
コンパイラその他、準備だけはC++のものを用意して、
実際にはC(相当する部分のC++)の勉強をする。
329デフォルトの名無しさん:2005/10/04(火) 12:49:31
>単にプログラミングを齧ってみたいだけなら

アセンブラ
330デフォルトの名無しさん:2005/10/04(火) 20:52:32
質問です。
下のプログラムを書いたのですが、思った通りに動きませんでした。
普通にダブルクリックして起動すると、test.txt が作成されるのですが、
他のファイルをドラッグドロップして起動すると、test.txt は作成されませんでした。
何が原因なのでしょうか?

#include <stdio.h>

int main(int argc, char *argv[])
{
FILE *fp;

fp = fopen("test.txt", "w");
fputc('a', fp);
fclose(fp);

return 0;
}
331デフォルトの名無しさん:2005/10/04(火) 20:56:50
他のファイルと同じ所に作成されてるよ。
要はエクスプローラの仕様。
D&Dしたらその引っ張ってきたファイルの方がカレントになる。
332デフォルトの名無しさん:2005/10/04(火) 20:57:13
ちゃんと作成されてる。
強いて言うならお前がボケなのが原因
333デフォルトの名無しさん:2005/10/04(火) 21:04:59
>D&Dしたらその引っ張ってきたファイルの方がカレントになる。
>>331 みたいなの漏れのPCではユーザー名のフォルダになぜか作成されてたり
するんですが、それも仕様なのですか?
検索したら、たまに変のフォルダに出来てたりします。
334デフォルトの名無しさん:2005/10/04(火) 21:07:10
スレ違いは死ね
335330:2005/10/04(火) 21:07:39
プログラムと同じディレクトリのファイルだったのですが
何の音沙汰もなく・・・
336デフォルトの名無しさん:2005/10/04(火) 21:22:22
環境依存の質問をしているという自覚はないのか?
337デフォルトの名無しさん:2005/10/04(火) 21:45:38
>>330
ログインユーザー名が仮名だと(ry
338デフォルトの名無しさん:2005/10/05(水) 01:11:45
こうですか?
分かりません!
339デフォルトの名無しさん:2005/10/05(水) 02:03:23
どなたか いろんな数nについてn!を計算するプログラム
nCr=n!/r!(nーr)!を計算する関数のプログラム
2次方程式 ax2+bx+c=0の解を複素解まで求められるような関数のプログラム

作っていただけませんか??
340デフォルトの名無しさん:2005/10/05(水) 02:05:05
すまん、数学が分からない
341デフォルトの名無しさん:2005/10/05(水) 02:06:42
>>339
とりあえず、マルチやめろ
342デフォルトの名無しさん:2005/10/05(水) 02:07:49
C言語でチャットのように双方向で通信をしたい場合は送信用と受信用で二つのスレッド
かプロセスを作ったほうがイイのですか?
343デフォルトの名無しさん:2005/10/05(水) 02:12:03
>>342
スレ違いです
344デフォルトの名無しさん:2005/10/05(水) 02:16:02
>>342
そんなことすると、同期で失敗する。
345342:2005/10/05(水) 02:22:36
>>343
スマソ
>>344
ありがとうございます。


346デフォルトの名無しさん:2005/10/05(水) 03:04:44
>>330
俺も良く分かんないけど、コマンドライン引数を渡すと環境依存になるのね。
347デフォルトの名無しさん:2005/10/05(水) 03:17:40
アホかい。
348デフォルトの名無しさん:2005/10/05(水) 04:20:42
アホなのでうんちしてきます。
349デフォルトの名無しさん:2005/10/05(水) 05:54:10
あ、俺もうんちうんちしてくる
350デフォルトの名無しさん:2005/10/05(水) 06:19:45
OSはWindowsだろ?
ダブルクリックの場合は、その実行ファイルのあるディレクトリがカレントディレクトリになる。

D&Dのばあいはややこしくて、2000/XPの場合
C:\Document and Settings\ユーザー名\
になってたと思う。

ドラッグアンドドロップで直接起動したときのカレントディレクトリがどこになるかって、確かOSにもよると思われ。


実行時のカレントディレクトリを明示してやるには、ショートカットを作って「作業フォルダ」を指定してやる。
D&Dはそのショートカットに対して行う。
これでやってみたら?
351デフォルトの名無しさん:2005/10/05(水) 07:47:24
>>350
明らかにスレ違いな話題に一々レスすんなや。
352デフォルトの名無しさん:2005/10/05(水) 08:27:29
XPユーザーが一番なのでおkです
353デフォルトの名無しさん:2005/10/05(水) 12:36:18
御陰様で残尿感が無くなりました。
平穏な日々に戻れそうです。
354デフォルトの名無しさん:2005/10/05(水) 19:41:37
C/C++の宿題を片づけます 51代目
の誘導できました
改めてcの質問をさせていただきます。こぴぺですが許してください

char型の入力をするのに
scanf()とgetchar()
がありますが、それぞれの長所短所って何ですか?

追加です
入力された変数の内部のデータも上の二つでは違うのでしょうか?
355デフォルトの名無しさん:2005/10/05(水) 19:52:51
>>354
getcharが返すのはint
356デフォルトの名無しさん:2005/10/05(水) 20:53:07
>>354
char ひとつ入力するのに int だの浮動小数点だの使わない機能が満載の scanf が使いたければ使うがいい
357デフォルトの名無しさん:2005/10/05(水) 21:15:07
恥ずかしながら初心者です。
私の今使ってるエディタでコンパイルしようとしたら「追加コマンドライン」を入力
する欄があるのですが…コマンドラインで検索したところ「CUI環境で、コマンドを入力する行のこと」だそうで。。
これはいったいどういったものなのでしょうか?
お手数をおかけ致しますが教えて頂けませんか?
358デフォルトの名無しさん:2005/10/05(水) 21:20:00
>エディタでコンパイルしようとしたら
無茶するな。
359デフォルトの名無しさん:2005/10/05(水) 21:22:12
>>354
scanf
・文字を受け取る変数の型は char 固定
・ファイル終端で scanf の戻り値が 0 で、文字を受け取る変数は変化なし
・"%c" を解析する時間が余計にかかる

getchar
・ファイル終端で EOF が返ってくる
・文字を受け取る変数の型は int
 (0〜255 と EOF の 257 種類のデータを返すため)

何を長所や短所と感じるかは、状況次第か。


>>357
スレ違い。
そのエディタのスレ、もしくは環境依存 OK なスレで聞くこと。
360デフォルトの名無しさん:2005/10/05(水) 21:22:52
>>358
「StarEdit」というフリーソフトなのですが、エディタという分類だったものですから…
全くの初心者で、それ向けのページを見ながらやっているもので。すみません…
361デフォルトの名無しさん:2005/10/05(水) 21:25:23
>>359
申し訳御座いませんでした、アドバイスありがとうございます。
邪魔をしてしまってすみません、失礼します。
362デフォルトの名無しさん:2005/10/05(水) 21:35:04
>>359
間違えた。ファイル終端だと scanf は EOF を返すんだった。
363デフォルトの名無しさん:2005/10/06(木) 01:24:42
またひとつ、scanf の悪名が不当につり上げられた ・・・後を絶たない DQN の手によって
もっとややこしいオブジェが腐るほどある世界ではこの程度で蹴躓く間抜けが何とも面倒な足手まとい

ハマる前に調べるなり聞くなりする「初心者」さんの方がよっぽど筋がいい
ただし規格票と処理系のマニュアルはちゃんと手元に置けよ >初心者
364デフォルトの名無しさん:2005/10/06(木) 01:33:39
「不当に」とか言ってるけどscanfは普通に最低の仕様
365デフォルトの名無しさん:2005/10/06(木) 01:39:34
sscanfならOKだけどな。
366デフォルトの名無しさん:2005/10/06(木) 01:41:39
>普通に

説明なく使われる最狂のキーワード
367デフォルトの名無しさん:2005/10/06(木) 01:46:47
>不当に

説明なく使われる最狂のキーワード
368デフォルトの名無しさん:2005/10/06(木) 01:47:53
高だの低だの言う基準を伏せたまま言った者勝ちの論法は相手にしてられない
369デフォルトの名無しさん:2005/10/06(木) 01:48:16
初心者だからsscanfを連発するって言ってた人がいたんですけど、どういう意味でしょうか><
僕みたいなのはstrtokの方がお似合いですか><
わかりません><
370デフォルトの名無しさん:2005/10/06(木) 02:46:07
好きなほうを選べばいい
371デフォルトの名無しさん:2005/10/06(木) 02:55:03
>>370
自分を信じることにしました。
どうも有難う御座いました><
372デフォルトの名無しさん:2005/10/06(木) 06:54:50
"という文字を扱いたいのです。

例えば if(Buf[i]=='"')という感じです
しかし、"はC言語ではそのままでは使えないので、\"と、指定しましたが
私のIDEでは'\"'とすると、どうも\"から緑文字になってしまいます。
使用しているIDEはCpadでして、現状ではIDEの問題なのか本当に間違ってるのか分からない状態です。。

"という文字を単独で扱う場合どのように扱えばよろしいでしょうか・・
373デフォルトの名無しさん:2005/10/06(木) 06:59:57
\"なんだけど・・・
IDEの問題ぽいね
374デフォルトの名無しさん:2005/10/06(木) 07:02:18
そうですかorz
とりあえず0x22と数値を指定しちゃって様子見しますわ・・
375デフォルトの名無しさん:2005/10/06(木) 07:16:26
すまん、数学が分からない
376デフォルトの名無しさん:2005/10/06(木) 07:21:43
>>375
分からないなら勉強すれば良いのでは?
377デフォルトの名無しさん:2005/10/06(木) 07:51:54
数値分からないにみえた。
378デフォルトの名無しさん:2005/10/06(木) 08:12:24
>>374
せめて'\x22'使え
379デフォルトの名無しさん:2005/10/06(木) 08:17:43
'"' は有効だったと思うが・・・。
380デフォルトの名無しさん:2005/10/06(木) 10:07:23
あるよね、構文ハイライトのバグ。
381デフォルトの名無しさん:2005/10/06(木) 11:19:20
>>358
Emacsは無茶だというのか?
382デフォルトの名無しさん:2005/10/06(木) 11:20:34
エディタにコンパイルまでやらせんなって事だろ
383デフォルトの名無しさん:2005/10/06(木) 12:15:45
ってかこんなこと言われないと気づかない香具師はいないだろさすがに
ってことで>>357=>>381=釣り
384デフォルトの名無しさん:2005/10/06(木) 12:38:09
エディタからコンパイルは出来ても、エディタでコンパイルはなかなか出来ないよな
385デフォルトの名無しさん:2005/10/06(木) 13:21:42
まあな・・・リスプをバイトコンパイルする妙なエディタもあるけどな。
386デフォルトの名無しさん:2005/10/06(木) 13:44:06
わからないので教えてください。
2次元の座標の回転の変換のプログラムがわからないので教えて下さい。お願いします。
387デフォルトの名無しさん:2005/10/06(木) 13:49:01
回転行列
388デフォルトの名無しさん:2005/10/06(木) 14:08:00
「リスプ」って初めて見た
389デフォルトの名無しさん:2005/10/06(木) 14:56:43
>>387
詳しく
390デフォルトの名無しさん:2005/10/06(木) 15:10:53
(詳しい説明)ぐぐればトップにでてくる
391デフォルトの名無しさん:2005/10/06(木) 15:14:17
>>390
dクス
392デフォルトの名無しさん:2005/10/06(木) 16:59:41
豚 クスッ
393デフォルトの名無しさん:2005/10/06(木) 18:51:15
質問させて下さい。パイプ通信についてお尋ねしたいのですが。

Aというプログラムを作成し、今後作成するBのプログラムからAにアクセスし、
Aの内部変数を変えたりAに指示(ファイル作成命令)を与えたりしたいです。

このBを作成するに当たって何か参考になるサイト様などはありますでしょうか?
別プログラムにアクセスするのはこれが初めてなもので…宜しくお願いします。
394デフォルトの名無しさん:2005/10/06(木) 18:59:45
>>393
http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gdb-4.18/gdb_toc.html
これがあればAのプログラムを色々アクセスできる。ソースも転がってる
395デフォルトの名無しさん:2005/10/06(木) 19:07:48
>>393
プロセス間通信をまじめにやりたいならOSごとに手法が異なるから該当スレへ。
横着するならこんな感じ。
・プログラムAは、外部から操作したい内容を標準入力で指示できるように作っておく。
・プログラムBは、それをファイルに書き出せるように作っておく。
・その状態でそれぞれのデバッグがすんだら、プログラムBからプログラムAを起動してそのパイプをファイル出力部に適用。

まぁ、環境依存スレあたりでやりたいことをしっかり書くことだね。
396393:2005/10/06(木) 19:10:57
>>394 お返事と紹介、ありがとうございます。
私の見解が著しく間違っているかも知れないのですが、
こちらはデバッグフリーツールなのでは無いでしょうか?

GDBからAのプログラムへアクセス出来る様ですが、
「Bというプログラムを作成して、あくまでその中でAを操作する」
必要があるのです。読みが足りない場合大変失礼な物言いになるのですが、
Bというプログラムを作成する為の知識、は上記のURLを参考にするべきなのでしょうか?
397393:2005/10/06(木) 19:13:33
>>395 環境依存スレですね、了解しました。お手数掛けます。
上記の方法も検討させて頂きたいと思います。
398デフォルトの名無しさん:2005/10/06(木) 19:16:56
>>396
> Bというプログラムを作成する為の知識、は上記のURLを参考にするべきなのでしょうか?
Aの任意の変数を変更したいとか、任意の命令を与えたいと思うなら参考にするべき

特定の変数の変更や特定の命令を与えたいだけなら>>395 の手でいける
399デフォルトの名無しさん:2005/10/06(木) 20:22:19
>>372
あなたは間違っていない
エディタのバグだのコンパイラの警告だのに
威圧されて妙なクセを植え込まれるな

これを防ぐには色々な処理系をちゃんぽんするのがよい
400デフォルトの名無しさん:2005/10/06(木) 21:01:25
>>393の質問にたいして環境非依存のファイル経由の方法を
伝授するのがこのスレの醍醐味ではないのか
401デフォルトの名無しさん:2005/10/07(金) 07:27:12
AとBはクライアント・サーバじゃねーの
402デフォルトの名無しさん:2005/10/07(金) 21:32:14
質問お願いします。
授業で作ったtest.cをコンパイルしようとして
コマンドプロンプトをひらいたのですが
bcc32 test.cと打ったら
’bcc’は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
と出てきました。
XPなんですが調べてみてもXPでコンパイルするのはbcc32としか出ませんでした。
馬鹿な質問だとすいませんでした。
403デフォルトの名無しさん:2005/10/07(金) 21:44:26
>>402
先生に聞いて下さい。馬鹿。
すれ違いですよ。馬鹿。
404デフォルトの名無しさん:2005/10/07(金) 21:48:51
質問したいんですけど!!初心者です…
405デフォルトの名無しさん:2005/10/07(金) 21:59:52
UNIXの環境で、C言語でプログラムしようと考えています。
しかし、それにはGUIが必要なのですが、このUNIXにはないと
言われました。
インストールして、C言語でできるのでしょうか?
406デフォルトの名無しさん:2005/10/07(金) 22:02:26
関数がファンクションしてるよ
407デフォルトの名無しさん:2005/10/07(金) 22:03:05
>>403
スレ違いのレスにいちいち煽りつきでレスすんなカス
408デフォルトの名無しさん:2005/10/07(金) 22:06:02
>>406
ファンクションって何ですか??
409伝説の新人:2005/10/07(金) 22:13:22
>>408 医学用語
410デフォルトの名無しさん:2005/10/07(金) 22:59:31
>>405
スレ違い
411デフォルトの名無しさん:2005/10/07(金) 23:21:41
>>404
僕も質問したいんですけど!!初心者です・・・
412デフォルトの名無しさん:2005/10/07(金) 23:59:48
Undefined first referenced
symbol in file
sqrt review6.o
ld: fatal: Symbol referencing errors. No output written to review6.exe
って出たんですけど何が悪いんでしょうか?!
413デフォルトの名無しさん:2005/10/08(土) 00:19:29
>>412
あんたの頭。
あんたの使っている環境のスレを探してそっちに行ってくれ。
414デフォルトの名無しさん:2005/10/08(土) 00:23:54
C言語でフォーム作成ってできるの?
フォームはマウスとか操作できるもの。
415デフォルトの名無しさん:2005/10/08(土) 00:29:11
>>405
> しかし、それにはGUIが必要なのですが、
この前提条件が間違っている。
416デフォルトの名無しさん:2005/10/08(土) 00:31:38
>>414
ヒント:OSのAPI
417デフォルトの名無しさん:2005/10/08(土) 00:37:07
>>415
紛らわしい書き方してごめんなさい。
C言語でフォームなど(ボタンなど)を作成して、マウスで操作できる
ようにしたいのですが、無理ですか?
ちなみにWindowsではないんです;;
418デフォルトの名無しさん:2005/10/08(土) 00:38:13
>>417
1も読めないお前には無理だ
419デフォルトの名無しさん:2005/10/08(土) 00:40:14
>>417じゃあ何だ?
420デフォルトの名無しさん:2005/10/08(土) 00:41:59
>>418
専用スレってどこにあるのかわかんなかったから…
答えてくれてどうもありがとうございました。
>>419
FreeBSDです。
421デフォルトの名無しさん:2005/10/08(土) 00:42:17
>>417
可能か不可能かという質問に答えると、
手間さえかければソフトウェアで実現できるほぼすべてのことが可能。
422デフォルトの名無しさん:2005/10/08(土) 00:45:17
UNIX系なら対話式のコマンドラインアプリを作ってTcl/Perl/Ruby + Tkでラップするのが
簡単な気がする。
423デフォルトの名無しさん:2005/10/08(土) 00:48:37
>>421
でもそれには、専門的な知識が必要なんですよね?
つまりあたしには無理だ…
>>422
調べてみます。ありがとうございます。
424デフォルトの名無しさん:2005/10/08(土) 01:24:11
UNIXでGUIアプリを作るのは馬鹿
Windowsで作れWindowsで
425デフォルトの名無しさん:2005/10/08(土) 01:33:00
>>424
426デフォルトの名無しさん:2005/10/08(土) 07:43:46
バカを相手にするな。
427デフォルトの名無しさん:2005/10/08(土) 09:49:57
馬鹿を相手にするのは案外楽しいよ
428伝説の新人:2005/10/08(土) 10:14:26
あまりにアレなので言わせてもらうのだ。
WinとUNIXは使う人が違うのだ。UNIXはキーボードをメインに使うのだ。
キーボードでちゃちゃっとやっちゃうのだ。むしろGUIはかえって無駄なのだ。
UNIXが使いたいなら、そっちも急須と思うのだ。
以上、UNIX触れたことすらないおれちゃんの主張なのだ。
しかし、UNIXで何がしたいのか花々しく謎なのだ。
429デフォルトの名無しさん:2005/10/08(土) 10:17:29
>花々しく

不覚にもワロタ
430デフォルトの名無しさん:2005/10/08(土) 10:23:35
ttp://www.wakhok.ac.jp/~sumi/recent/2002/hellsing.txt
まあ、こういうことをしたいのではないかと
431デフォルトの名無しさん:2005/10/08(土) 10:40:07
すいません。昨日質問したものです。あたしもできれば、Windowsで
プログラムを作成したかったのですが、卒研室のパソコンが
先生の好みでUNIXしかないのです…
それに絶対Windowsを入れないと言われました。
432デフォルトの名無しさん:2005/10/08(土) 10:48:16
>>431
いいから、早く首吊ってくれ
433デフォルトの名無しさん:2005/10/08(土) 10:50:25
>>432
何でそんなこと言われないといけないわけ?
434デフォルトの名無しさん:2005/10/08(土) 11:15:27
>>433
それで全てが解決するから
435デフォルトの名無しさん:2005/10/08(土) 11:27:12
>>434
だからそれ言っていいと思ってんの?
まじありえない。
436デフォルトの名無しさん:2005/10/08(土) 12:16:16
>>431
なんの発展性も無いね。

貴方はこちらがよいかと
http://life7.2ch.net/yume/

437デフォルトの名無しさん:2005/10/08(土) 13:52:22
環境依存の質問はその環境のスレへ行け
日記は日記帳に書いとけ
438デフォルトの名無しさん:2005/10/08(土) 14:12:26
>>431
過去の事物にしがみついて新しいことを何ひとつ
学ぼうとしない典型的老害の教授だな。
そういう教授は税金の無駄だからさっさとクビに
するべきなんだが、この国ではできないんだよな。
439デフォルトの名無しさん:2005/10/08(土) 14:45:28
まあ、操作を統一するために、一つの環境にこだわるってのもアリだとは思うがな。
440デフォルトの名無しさん:2005/10/08(土) 15:21:08
単方向リストで、あるデータを、リストの好きなところに入れるように指定して挿入する関数
struct AddressList *insert(struct AddressList *root, struct Address ad, int n);
を作りたいのですがうまくいきません。
この関数の宣言はこのままで作りたいのですが・・・・
addr[10]にはデータが入っていることにしてください。

大体以下のような感じでつくったのですがうまくいきません。
リストの先頭にだけうまく入らないようです。
どなたかアドバイスお願いします・・・・
441デフォルトの名無しさん:2005/10/08(土) 15:22:28
int main()
{
  struct AddressList *root;/* rootをNULLに設定 */
struct Address addr[10];

insert( root , addr[1] , 1);
  insert( root , addr[2] , 0);
showList( root ); /* リストを表示する関数 */
return(0);
}

struct AddressList *insert(struct AddressList *root, struct Address ad, int n){
struct AddressList *current;/* 現在のポインタ位置 */
struct AddressList *new;/* 新ノード */
int i;/* ループカウンタ */

current = root;/* 現在地をルートに設定 */
new = (struct AddressList *)malloc(sizeof(struct AddressList));/* 新しいノードのメモリ確保 */
new->addr = ad;

new->next = root;
root = new;

return(NULL);
}
442デフォルトの名無しさん:2005/10/08(土) 15:24:05
すいません、うまく省略しようとして失敗しました・・・
insertの中身はこんなかんじです。


current = root;/* 現在地をルートに設定 */
new = (struct AddressList *)malloc(sizeof(struct AddressList));/* 新しいノードのメモリ確保 */
new->addr = ad;
if( n == 0 ){/* リストの先頭に挿入する場合 */
new->next = root;
root = new;
}
else{/* 挿入位置が先頭でない場合 */
for( i=0 ; i<n-1 ; i++){/* リストのn-1番目まで移動 */
if(current->next == NULL)/* 次がNULLならそこで終わり */
break;
current = current->next;
}

new->next = current->next;/* new の next をその時点でのn番目にする */
current->next = new;/* n-1番目のnextをnewに */
}
443伝説の新人:2005/10/08(土) 15:31:44
>>431
じゃあ進めておくのだ。GUIで作るのなら、1に
>GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
とあるので、移動するとよいのだ。
↓【初心者歓迎】C/C++室 Ver.21【環境依存OK】↓
http://pc8.2ch.net/test/read.cgi/tech/1125743714/l50
CUIなら、ここでもいいはずなのだ。
プログラムの実行結果を適時、表示したいなら、ファイルに出力するといいのだ。
444デフォルトの名無しさん:2005/10/08(土) 15:39:27
GUI、スレッド、グラフィック、マルチメディアかな・・・よくある機種依存ネタ。
ファイルフォーマットは、微妙。
445デフォルトの名無しさん:2005/10/08(土) 15:47:53
>>440
情報が少なくて良く分からんから、適当に作った。
脳内コンパイルなんでうまく動くかは知らん。

struct AddressList *insert(struct AddressList *root,struct Address ad, int n){
    struct AddressList**p;
    struct AddressList*New;
    int i;
    p = &root;
    New = (struct AddressList*)malloc(sizeof(struct AddressList));
    for(i=0;i<n && *p;++i)p = &(*p)->next;
    New->addr = ad;
    New->next = *p;
    *p = New;
    return root;
}
446デフォルトの名無しさん:2005/10/08(土) 15:54:46
447デフォルトの名無しさん:2005/10/08(土) 16:11:28
>>445
む・・・

mainのほうで insert( root , addr[1] , 1); のように、ポインタで宣言されたrootを渡し、
insertで*rootで受け、root = new のようにしてもつなぎかえれないんでしょうか?

insertの方でshowListするとうまくいくんですが、mainに戻ってからshowListするとだめみたいで・・・
ポインタのポインタ使うひつようありですか?
448デフォルトの名無しさん:2005/10/08(土) 16:17:29
>ポインタのポインタ使うひつようありです

確保したメモリのアドレスを保持させる必要があります。
単にポインタだと一時的に記憶しますが、呼び元で使おうと思うなら
元のポインタ変数に記憶させなければなりませんので...
449445:2005/10/08(土) 16:19:28
>>447
ポインタのポインタを使わなくても書けないことはないが、
nがゼロの場合に上のコードみたいに分岐するような醜いコードになるから、
普通はポインタのポインタを使う。

あと、insertした後ちゃんとrootの値を変えてるか?
root = insert( root , addr[1] , 1);
こういう風に書いたら多分大丈夫と思うが。
450445:2005/10/08(土) 16:30:28
もし関数のプロトタイプを変更しても良いのなら、こういう風に書ける。
この場合挿入した後は、適切に値を置き換えるから、
間違いも起こりにくいし、こっちの方が綺麗かな。

どちらにせよ無駄のないコードを書くのならポインタのポインタは必須になります。

void insert(struct AddressList **root,struct Address ad, int n){ 
    struct AddressList*New;
    int i;
    for(i = 0 ;i < n && *root; ++i )root = &(*root)->next;
    New = (struct AddressList*)malloc(sizeof(struct AddressList));
    New->addr = ad;
    New->next = *root;
    *root = New;
}
451デフォルトの名無しさん:2005/10/08(土) 16:33:45
root(head)は、
・ポインタだけって方法
・一個捨て要素を用いる方法
・付加情報(要素の数とか)をもったコントロールブロック+上記のうちのいずれか
っていうパターンに、
headだけでなく、tailも持つとかそんな手法もありだな・・・。
452デフォルトの名無しさん:2005/10/08(土) 17:04:14
色々レスありがとうございます!
自分のではなぜできてなかったはなんとか理解する事ができました!

しかしポインタのポインタを使って解決できるていうのがよくわかりません・・・
>>445さんのソースコードで、rootのnextをnewにするのに、 *p =New というのがよくわからないのですが・・・
*pというのは結局insert内のrootのアドレスで、insert内のrootがnewに書き換わるだけではないのでしょうか?
453440:2005/10/08(土) 17:13:19
あ、>>449の root = insert( root , addr[1] , 1); て言う風にしたらできました・・・
ありがとうございました!

で、問題は解決したのですが、結局ポインタのポインタは使わず n==0 の時で場合わけして完成しました。
というわけでポインタのポインタを使った方法は理解できてません・・・
結局ポインタのポインタ使う利点はなんだったんでしょうか?
n==0の場合わけが必要なくなるてことでしょうか?
454デフォルトの名無しさん:2005/10/08(土) 17:15:10
質問です

エスケープ文字の\tを機能させずに出力する場合にはどうすればいいのですか?
455デフォルトの名無しさん:2005/10/08(土) 17:15:43
>>454
\\t
456440:2005/10/08(土) 17:22:58
すいません、解決したと思ったのですが・・・

演習問題をやってたわけですが、問題の条件に、 insertの返り値は、リストの追加された位置を返す、 という条件付でした・・・
というわけで常にrootを返して root = insert というのはだめっぽいです・・・
関数のプロトタイプはさっきのまま、返り値はリストの追加された位置、という条件ではどのような方法がよいのでしょうか?
457デフォルトの名無しさん:2005/10/08(土) 17:26:33
printf("\\t");
は可能でしたが
printf("\\\");
は無理でした。どうしてですか?
458デフォルトの名無しさん:2005/10/08(土) 17:30:01
開発環境がARM SDTだったソースをgccでコンパイルしたいと思っています。
パッケを拾って、makefileを書いて、makeしました。
以下のエラーが出ました。

- エラーメッセージ -
error: stray '$' in program
error: stray '$' in program
error: syntax error before 'RW'
error: stray '$' in program
error: stray '$' in program

- 発生個所 -
extern u32 Image$$RW$$Limit;

この変数の$$RW$$の意味がわかりません。
マクロのような置き換えができるのでしょうか?
googleで'$'を探せないので調べられませんでした。
どなたか意味・対策など教えてください。
459デフォルトの名無しさん:2005/10/08(土) 17:30:50
>>456
return New;

>>457
\\\\
460デフォルトの名無しさん:2005/10/08(土) 17:32:54
>>458
シェル(sh)は何使ってるかわかる?
makefileくらいさらしちゃえば?
461デフォルトの名無しさん:2005/10/08(土) 17:34:13
>>455
>>459
ありがとうございました。
462デフォルトの名無しさん:2005/10/08(土) 17:36:55
>>459
return New;
にするとrootの手前に挿入するときに問題発生するんだよなぁ。
rootの手前が新しいrootになっても元のrootは書き換わらないから。

絶対になにか根本的に重要な事実が伏せられている気がする。
(たとえばrootはダミーで要素を入れるのはrootの次以降とか)
463デフォルトの名無しさん:2005/10/08(土) 17:44:07
よくわからんが、$も識別子として使えるコンパイラと使えないコンパイラの差じゃなかろーか。>458
464440:2005/10/08(土) 17:50:49
>>462
あ、すいません、誤解を招いたかもしれません・・・

実際に指定されているのは関数のプロトタイプだけで後は僕が勝手に書いたものです・・・
先頭からn番目に新たな要素adを追加して、追加された位置を返り値とする関数、てな感じです。
465458:2005/10/08(土) 18:03:04
>>460
cygwin+devkitARMを使用しています。cygwinはbashです。
ttp://sourceforge.net/projects/devkitpro
サマリにサンプルがあり、それのmakefileに置き換えてしまいました。
先にmakefileは、gcc -o file.cみたいな適当に書いたものだったので破棄してしまいました。
こんなに早くレスが着くとはorz

>>463
SDTの情報がなかなかないので調べにくいっす。もう少しがんばってみます。
466デフォルトの名無しさん:2005/10/08(土) 18:14:17
bash以外csh、tcsh、kshなどでやっても同じエラー出るのかな?
467デフォルトの名無しさん:2005/10/08(土) 18:26:02
>>458
識別子に $ が使われてるだけなんだが。
468デフォルトの名無しさん:2005/10/08(土) 18:26:12
>>458
環境依存だけど、その環境のスレってのはどこになるんだろ・・・。
それの分かる人がいなければ、ここで話すしかないのかね。

おそらくは、そのコンパイラ特有の拡張仕様かと思われ。
ARM SDT RW で検索したら、何か英語の質問フォーラムで
それを使ってるようなものがあったりするけど、
関係ないのも含まれてると思うけど、
それらをしらみつぶしに見ていくしかないのかね。
ざっと見た感じでは、RAM の終端アドレスを示す識別子のようだけど・・・。
469デフォルトの名無しさん:2005/10/08(土) 18:34:19
>>458 検索も能力のうちだぞ。

-fdollars-in-identifiers
470デフォルトの名無しさん:2005/10/08(土) 18:50:58
>>458
http://pc8.2ch.net/linux/
とりあえずLINUX板に行ってみたら?
471デフォルトの名無しさん:2005/10/08(土) 18:52:52
>>470
何言ってんの?

とりあえずたらいまわしですか?
472デフォルトの名無しさん:2005/10/08(土) 18:55:09
場違いな人間の逆切れ
473デフォルトの名無しさん:2005/10/08(土) 18:55:40
>>472
逆切れって何?
474デフォルトの名無しさん:2005/10/08(土) 18:57:15
場違いな人間の粘着
475デフォルトの名無しさん:2005/10/08(土) 18:57:36
>>470
また問題点も分からないで適当なことを
476デフォルトの名無しさん:2005/10/08(土) 18:58:30
477デフォルトの名無しさん:2005/10/08(土) 18:58:52
>>470
他人に頼るなよ
478デフォルトの名無しさん:2005/10/08(土) 19:00:19
479デフォルトの名無しさん:2005/10/08(土) 19:01:58
>>469
解決しました。

みなさんありがとうございます。
これからも精進します。
480デフォルトの名無しさん:2005/10/08(土) 19:03:29
>>470
分からないからって…市役所の方ですか?
481デフォルトの名無しさん:2005/10/08(土) 19:05:02
カルシウム足りてる?
482デフォルトの名無しさん:2005/10/08(土) 19:07:33
>>469に答えが出ていても気づかない>>470
馬の耳になんとやらw
483デフォルトの名無しさん:2005/10/08(土) 19:09:23
騙りにも気付いてない人が何を言ってるのかって、
もしかして自演?
484デフォルトの名無しさん:2005/10/08(土) 19:10:30
ここまで俺の自演
485デフォルトの名無しさん:2005/10/08(土) 19:10:36
>>481

キミの場合はカルシウムではなく学習能力がアレだね
486デフォルトの名無しさん:2005/10/08(土) 19:19:30
>>480
市役所に何かされた人?
487デフォルトの名無しさん:2005/10/08(土) 19:21:18
>>477
2ch質問版崩壊だね
488デフォルトの名無しさん:2005/10/08(土) 19:22:02
>>482
馬耳東風と書け
489デフォルトの名無しさん:2005/10/08(土) 19:23:31
>>485
アレってなんだ?
日本語話せるか?
490デフォルトの名無しさん:2005/10/08(土) 19:23:33
>>481
×カルシウム
○乳酸菌

正確には「乳酸菌とってるぅ?」だ
491デフォルトの名無しさん:2005/10/08(土) 19:25:08
>正確には「乳酸菌とってるぅ?」だ

日本語勉強して来いってw
492デフォルトの名無しさん:2005/10/08(土) 19:25:54
>>489
ヒント:欠如しているもの
493デフォルトの名無しさん:2005/10/08(土) 19:26:28
>>490
イエース!オフコース!


なのか?
494デフォルトの名無しさん:2005/10/08(土) 19:26:43
アレで済ませてるとボケるぞ
495デフォルトの名無しさん:2005/10/08(土) 19:26:54
>>492
会話ってものをもっと知りなさい。ボク
496デフォルトの名無しさん:2005/10/08(土) 19:27:29
>>495
すいやせん
497デフォルトの名無しさん:2005/10/08(土) 19:31:39
              _
             ,'´r==ミ、
       ,_ _ _   卯,iリノ)))〉 _ _ _  <乳酸菌とってるぅ?
     /   `."-|l〉l.゚ ー゚ノl/    ヽ
    '"'⌒`~"'" ''|!/'i)卯i |ゝ '''"ー"``
          ノ~U ̄Uヽ
          )__ _(
          | 乳酸菌|
          |  ̄ ̄ ̄|
498デフォルトの名無しさん:2005/10/08(土) 19:35:28
              _
             ,'´r==ミ、
       ,_ _ _   卯,iリノ)))〉 _ _ _  <聖徳太子知ってるぅ?
     /   `."-|l〉l.゚ ー゚ノl/    ヽ
    '"'⌒`~"'" ''|!/'i)卯i |ゝ '''"ー"``
          ノ~U ̄Uヽ
          )__ _(
          | 乳酸菌|
          |  ̄ ̄ ̄|
499デフォルトの名無しさん:2005/10/08(土) 19:48:18
乳酸菌のとこは一万円とすべきだったな
500デフォルトの名無しさん:2005/10/08(土) 20:03:09
>>498
当 た り 前 で し ょ そ ん な こ と !!!
501デフォルトの名無しさん:2005/10/08(土) 20:26:35
女は人生の勝ち組
http://pc8.2ch.net/test/read.cgi/prog/1127151360/72-

ここにも変な人が。

502デフォルトの名無しさん:2005/10/09(日) 00:23:29
はじめまして、突然ですが以下のプログラムが完成しません。
仕様は変更せずにこの関数を完成させたいのですが・・・行き詰まってしまいました。
問題点がどこにあるかどなたかご教授頂けないでしょうか?
よろしくお願いいたします。
503デフォルトの名無しさん:2005/10/09(日) 00:24:54
//////////////////////////////////////////////////////////////////////////////
//【関数名称】long xsb_change_jtob(char *jis,long keta)
//【処理名称】JISのデータをバイナリコードに変換する
//【機能】桁数回ループし、JISのデータをバイナリコードに変換する
//【引数】変換前のデータ(1byte)、変換後のデータ(2byte)
//【戻値】long型の値
//【備考】なし
//////////////////////////////////////////////////////////////////////////////
long xsb_change_jtob(char *jis,long keta)
{
long i,ans=0;
long return_bin;

for(i=0;i<keta;i++){
ans=jis[i]-0x30;

if(ans<0x40){
return_bin=ans;
}else if(ans>16){
return_bin=ans+16;
}
}
return(return_bin);
}
/*******************************************************************************
*問題点
*○現状では最後にreturn_binに格納された値しか返らない(格桁数毎に戻り値を返したい)
*○JISコード表の3,4,5の列のみを対象としている。
* 0〜9行の場合は正常に変換。A〜F行の場合は変換処理が異常値を返す(変換に失敗している)
*JISコード参照:http://www.fellow-ship.com/tech/jisebc.html
*******************************************************************************/
504デフォルトの名無しさん:2005/10/09(日) 00:27:34
宿題は宿題スレにて
505デフォルトの名無しさん:2005/10/09(日) 00:30:03
>>503
>格桁数毎に戻り値を返したい
戻り値ってのは関数から帰ってくるときに持ってくる値な訳で
それを返す=関数から抜ける。よって不可能
他は考えるのが面倒なのでパス
506デフォルトの名無しさん:2005/10/09(日) 06:22:26
>>503
>格桁数毎に戻り値を返したい
↑のコードは戻り値が単なるlong型の変数なので、返る値は1個だけ。

複数の値を取得したいなら、どうやっても関数の仕様変更が必要
1. 関数の引数に桁番号を追加して、「指定桁の値のみ」を返す関数を作る
2. 関数の引数に出力結果を格納する配列のアドレスを追加する(呼び元でメモリ確保)
3. 出力結果の配列を関数内で生成し、そのアドレスを返す(関数内でメモリ確保 ※後で解放が必要)

>A〜F行の場合は変換処理が異常値を返す
えーと、まず最初にループの中の処理と、期待している結果について説明してくれ。
俺の読解力が低いのか、寝ぼけてるだけなのかわからんが、
何やってるのかいまいち理解できん。
507デフォルトの名無しさん:2005/10/09(日) 06:39:37
>>502
無理。勘違いもはなはだしい。すでに 505,506の指摘があるが。
他にも、バイナリコードに変換する、ってなによ? まさか A->10, F->16 の
数値に変換したい? 通じにくい言い方だな、はともかく、
例ではそんなロジックにはまったくなってないからなあ……
余談だが、JISコードなどの用語とかも、もっとちゃんと理解しとこうね。
508デフォルトの名無しさん:2005/10/09(日) 10:05:56
初歩的なことだと思いますが、質問させてください。
10進の整数を、各桁ごとくり上がり無視で加算するにはどうすればよいのでしょう?

例としては、
456 + 789 = 139 となるような式です。

どなたか分かる方いましたら教えて下さい、お願いします。
509デフォルトの名無しさん:2005/10/09(日) 10:30:54
>>508
テケトーに書いてみた。
456 + 789 = 139 にならんので、もしかすると望んでいるのと違うかも
int add_r(int a,int b,int r,int sum){
    if(a|b)return add_r(a/10,b/10,r*10,sum + (a%10+b%10+20)%10u*r);
    else return sum;
}
int add(int a,int b){return add_r(a,b,1,0);}
// test
#include<stdio.h>
int main(){
    int sum = 0;
    int a = 456,b=789;
    printf("%d\n",add(a,b));
    return 0;
}
510デフォルトの名無しさん:2005/10/09(日) 10:33:05
>>508
各桁ごとに計算するしかないね。
値を普通の int で保存せずに、
int 配列で各桁ごとに分けて保存しとけば、
それもやりやすいのではないかと。
ただ、それが無理なら、こんな感じにせざるを得ないかと。

/* c = a + b */
for(c = 0, n = 1; a != 0 || b != 0; a /= 10, b /= 10, n *= 10) {
 c += (a % 10 + b % 10) % 10 * n;
}

16 進ならもうちょい高速なアルゴリズムも作れるけど。
511デフォルトの名無しさん:2005/10/09(日) 10:33:55
int xadd(int x, int y)
{
 int r=0,d=1;
 while (x || y) {
  r += (x+y)%10*d;
  x/=10; y/=10; d*=10;
 }
 return r;
}

printf("%d\n", xadd(456, 789));

俺もこの程度しか思いつかなかった
512デフォルトの名無しさん:2005/10/09(日) 10:43:35
あぁ、そうだ。a も b も % 10 する必要なかったな。
513デフォルトの名無しさん:2005/10/09(日) 10:48:05
>>512
a+bがオーバーフローする場合を考慮するなら必要あり。
514デフォルトの名無しさん:2005/10/09(日) 10:50:59
あー、そうか。
515デフォルトの名無しさん:2005/10/09(日) 11:20:56
509さん、510さん、511さん、ありがとうございます。
皆さんの答えはどれも非常に参考になりました。

509さんが仰っていた「456 + 789 = 139」とならないとのことですが、
私のレスでの例が間違っておりました;申し訳ないです…。
正しくは「456 + 789 = 135」となりますので、私の望んでいた通りのものです。
また、配列で各桁ごと分けて保存し計算する方法でも解決することができました。
仰る通りに未熟な私でもやりやすかったです。

皆さん、本当にありがとうございました。
516デフォルトの名無しさん:2005/10/09(日) 13:52:03
普通に加算して、1000で割った余りを出すだけじゃないのか?と…
517デフォルトの名無しさん:2005/10/09(日) 14:01:05
>>516
寝言は寝て言え。
518デフォルトの名無しさん:2005/10/09(日) 14:13:19
各桁ごとくり上がり無視

途中の桁の繰り上がりをしてないか>516
519デフォルトの名無しさん:2005/10/09(日) 14:21:56
ホントに寝ぼけてただけなんじゃないの?w
520440:2005/10/09(日) 20:29:52
昨日の問題解決することができました。

基本 >>441, >>442 のコードで、main の insert( root , addr[1] , 1); の部分を &(*root) として、 main の *root のアドレスを
渡すことによって、 insert の方で root を操作する事ができました。

結局ポインタのポインタ使わずじまいですが・・・
問題は解決したのですが、もしポインタのポインタ使う利点と使い方アドバイスしてもらえればありがたいです。
521440:2005/10/09(日) 20:32:09
すいません、うそでした・・・
root = insert() の記述がそのままで、結局返り値をnewにしたらだめでした・・・
522デフォルトの名無しさん:2005/10/09(日) 21:40:25
行の最後にCRLFを書きたいのですが

fprintf(fp,"%c,%c",'\r','\n');

のように書いてもうまく出力されないのです。
申し訳ないのですが、CRLFの記述方法を教えていただけないでしょうか。
523デフォルトの名無しさん:2005/10/09(日) 21:45:14
>>522
バイナリモードで開いているか?
やり方はそれでいいけど、単にfprintf(fp, "\r\n");やfputs("\r\n", fp);でいける。

あるいはWindowsならテキストモードで'\n'を出力すると大抵の処理系ではCRLFを出力する。
524デフォルトの名無しさん:2005/10/09(日) 21:46:46
>>522
%cと%cの間にある,が余計。外せ
525デフォルトの名無しさん:2005/10/09(日) 22:18:25
>>523,524
ありがとうございます!
表示もしっかり出ています。
本当にありがとうございました!
526デフォルトの名無しさん:2005/10/10(月) 03:41:37
標準入力から配列 line に、文字列(スペースを含む、改行は含まない)を入れる最も簡単な方法はなんでしょうか?
例えば This is a pen. のような文章を標準入力をするような場合です。

scanf じゃできませんよね・・・?
527デフォルトの名無しさん:2005/10/10(月) 03:46:08
>>526
"%s"?
528デフォルトの名無しさん:2005/10/10(月) 03:48:38
strtok
529デフォルトの名無しさん:2005/10/10(月) 03:56:41
>>527
scanf("%s",line);
とすると
This is a pen.
と入力した場合 This しか line に入らないのではないでしょうか・・・?

>>528
標準入力から文字列を得体のですがどのように使えばいいのでしょう?
530デフォルトの名無しさん:2005/10/10(月) 04:05:44
fgets
531デフォルトの名無しさん:2005/10/10(月) 04:06:01
何が疑問なんだ?
fgetsなり使えばいいじゃん
532526:2005/10/10(月) 04:23:53
あ、fgetsでファイルポインタのところを stdin とすると標準入力からになるんですね・・・
失礼しましたー
533デフォルトの名無しさん:2005/10/10(月) 09:47:45
stdin する。
534デフォルトの名無しさん:2005/10/10(月) 13:42:56
8進数って何がありがたいの?
2進と16進数だけで十分じゃない?
535デフォルトの名無しさん:2005/10/10(月) 13:45:29
パーミッション指定みたく、3個の要素を持つパラメータに使われてたりする。
536デフォルトの名無しさん:2005/10/10(月) 13:45:37
>>534
chmod 0x1a4 とかイヤだろw
537デフォルトの名無しさん:2005/10/10(月) 13:45:42
0777
538デフォルトの名無しさん:2005/10/10(月) 13:46:59
>>535-537
ナイス連携にちょっとワロタ
539デフォルトの名無しさん:2005/10/10(月) 13:47:33
そんなの0x777でいいと思うんだけど、
昔はそんな余裕がなかったのかな?w
540デフォルトの名無しさん:2005/10/10(月) 13:47:42
パーミッション指定以外で
8進数って使ってるの見たことない気がするけど
ほかにもあります?
541デフォルトの名無しさん:2005/10/10(月) 13:54:14
512色画像とか。
542デフォルトの名無しさん:2005/10/10(月) 13:55:57
>>539
資源の節約に躍起になってた頃からある概念だしなぁ。
あと、7以上の値を取ることがないのが基数で保証されてるわけだから、
0x787のような不正な値を即値で指定される心配がないってのも微少なメリットかも
543デフォルトの名無しさん:2005/10/10(月) 13:57:22
>>540
自分の周りにはあんまりないですねぇ。

RFCのドキュメントに8進数が使われてて、
それを10進か16進数と間違えてバグ出したことがあるね。
そのときくらいかな、8進数を見たのは。

octal ってなんだっけ、と2秒止まったよw
544デフォルトの名無しさん:2005/10/10(月) 14:04:03
2進数(1bit)と16進数(4bit)は区切りがいいけど、8進数(3bit)は区切りもよくないし、
何がありがたいのかよく分らなかった。逆に4進数(2bit)は区切りとしてはよさそう
なのにあんまり聞かないのも不思議というか。
とりあえず、そんなに意味はないってことで納得しました。
545デフォルトの名無しさん:2005/10/10(月) 15:36:50
8進数は全部数字で書けるってくらいかね。
546デフォルトの名無しさん:2005/10/10(月) 15:37:55
パーミッションぐらいしか使わない
547デフォルトの名無しさん:2005/10/10(月) 15:43:03
むしろ、パーミッション以外での利用法が知りたい。
548デフォルトの名無しさん:2005/10/10(月) 15:50:40
vi で使われてるな
549デフォルトの名無しさん:2005/10/10(月) 15:52:16
昔は一ワードが16bitのミニコンと呼ばれるコンピュータがあってのう。
先頭の1bitを符号bitとして使って8進5桁で15bit、
計16bit の一ワードの表記が一般的だったのだ
550デフォルトの名無しさん:2005/10/10(月) 15:53:38
オサーンGJ
551デフォルトの名無しさん:2005/10/10(月) 16:01:20
オナーニAF
552デフォルトの名無しさん:2005/10/10(月) 16:03:32
AFは16進数
553デフォルトの名無しさん:2005/10/10(月) 17:06:33
octal、まあC言語とunixにはゆかり深いからなと "PDP-11" "8" でぐぐった
554デフォルトの名無しさん:2005/10/10(月) 17:19:15
まあ、パーミッションが書きやすいだけでも、存在価値はあるけどね。
それを言うなら2進数もかけるようになってると嬉しいが。
555デフォルトの名無しさん:2005/10/10(月) 17:48:22
>>549
はつみみです。
556デフォルトの名無しさん:2005/10/10(月) 18:45:03
>>549
( ・∀・)つ〃∩ ヘェー ヘェー
557デフォルトの名無しさん:2005/10/10(月) 19:24:00
μプロセッサのニモニックも、3ビット単位に構成されているので8進で表記しやすい。
例えばz80のレジスタ間転送は

76543210
01sssddd

となるが、これは16進だと40h+s*8+dを計算するしかない。しかし8進なら1sdoとなる。
これならアセンブラの支援なしで簡単にコーディングができる。
#例えばaレジスタは7、bレジスタは0なので、47h=170o=ld b,aとすぐに判る。
558デフォルトの名無しさん:2005/10/10(月) 19:37:15
8進表現より2進表現の方がよっぽど有用だよなぁ。
何で標準でサポートしないんだろ。
2進表現をサポートしてるコンパイラなんて
CodeWarriorぐらいしか知らない。
559デフォルトの名無しさん:2005/10/10(月) 19:50:26
質問です。
\0 と NULL は同じ意味と考えてよいでしょうか?

また聞きなんですが、memcpy()の引数に \0 を渡した場合、
コケた?そうです。
560デフォルトの名無しさん:2005/10/10(月) 19:58:10
じゃぁ、違う意味ってことでFA?
561デフォルトの名無しさん:2005/10/10(月) 20:03:06
あー・・・

NULL:「何も指していないポインタ」をNULLと書く。
'\0':文字コードゼロ。もしくは、文字列の終端文字。
0:整数のゼロ

と使うべきで、memcpy()の引数に'\0'なんて使っちゃいけない。
562デフォルトの名無しさん:2005/10/10(月) 20:04:28
>>558
C++ではtemplateで無理矢理実装してるが、Cマクロでもできなくもないな。
563デフォルトの名無しさん:2005/10/10(月) 20:10:54
memcpy()の引数にNULLは使ってもいいんですか?
564デフォルトの名無しさん:2005/10/10(月) 20:11:04
>561
ありがとうございました。勉強になりました。
565デフォルトの名無しさん:2005/10/10(月) 20:12:47
#define HEX_DIGIT_0000 0
#define HEX_DIGIT_0001 1
...
#define HEX_DIGIT_1111 f

#define HEX_DIGIT(a) HEX_DIGIT_##a

#define BINARY8H(a, b, c, d, e, f, g, h) (0x##a##b##c##d##e##f##g##h)
#define BINARY8I(a, b, c, d, e, f, g, h) BINARY8H(a, b, c, d, e, f, g, h)
#define BINARY8(a, b, c, d, e, f, g, h) BINARY8I(HEX_DIGIT(a), HEX_DIGIT(b), HEX_DIGIT(c), HEX_DIGIT(d), HEX_DIGIT(e), HEX_DIGIT(f), HEX_DIGIT(g), HEX_DIGIT(h))

566デフォルトの名無しさん:2005/10/10(月) 20:13:48
>>562補足。俺の場合の話。C 0xあたりに入れて欲しいよね。
567初心者:2005/10/10(月) 22:50:44
 商品の金額と出した金額を入力し、おつりを算術するプログラムが出来ません。

#include <stdio.h>
#include <conio.h>
#include <stdio.h>


int main (void)
{
int kai,kane;
int oturi = kane - kai;

char buf[3];

printf("いくらの買い物ですか\n");
kai = atoi(gets(buf));
printf("お金はいくら出しますか\n");
kane = atoi(gets(buf));

printf("おつりは%d円です\n",oturi);
}

 こんな感じで打ったのですがエラーになります。初心者ゆえなにを如何したら改善するのか皆目検討つきません
 ちなみにコンパイラはborlandC++compilerです。
 
 どなたかご教授願えますか?
568デフォルトの名無しさん:2005/10/10(月) 22:51:47
>>567
宿題スレにでも行ってください
569デフォルトの名無しさん:2005/10/10(月) 22:52:09
>>567
エラーメッセージを貼れ。
つーか、初心者スレに行け。
570初心者:2005/10/10(月) 22:55:57
 わかりました 初心者スレに行ってみます・・・
571デフォルトの名無しさん:2005/10/10(月) 23:26:21
つか、エラーは読んだのかと激しく問い詰めたい。
572デフォルトの名無しさん:2005/10/10(月) 23:39:56
とりあえずウィンドウを作りたいんですがコレでやっても
1:宣言の構文エラー 5:宣言の構文エラー
と出るのですがどうすれば良いのでしょうか?

include "windows.h"

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wc;
wc.style = (CS_HREDRAW | CS_VREDRAW);
wc.lpfnWndProc = (WNDPROC) MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("Window Class 1");
if (RegisterClass(&wc) == NULL)
return -1;

HWND hWnd = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, wc.lpszClassName,
TEXT("ウィンドウsample"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
(HWND) NULL, (HMENU) NULL, hInstance, (LPVOID) NULL);

573デフォルトの名無しさん:2005/10/10(月) 23:40:44
f (hWnd == NULL)
return -1;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
574デフォルトの名無しさん:2005/10/10(月) 23:44:44
#includeディレクティブに#がねぇ
575デフォルトの名無しさん:2005/10/10(月) 23:45:37
>>572
>>1
>GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
Windows 系のところに移動した方がいいよ〜。
576デフォルトの名無しさん:2005/10/10(月) 23:46:35
>>572
ソース連貼りうざいので>>1みてね
577C言語始めたばかり:2005/10/11(火) 00:13:29
5個の文字列データを入力された順に配列を使って実現されたリンクドリストに記憶する。
リンクドリストのm番目に文字列を挿入する関数insert、リンクドリストのn番目の文字列データを削除する関数delete、
リンクドリストに記憶されているデータを記憶されている順に出力する関数plistを定義し、
その頭文字I、D、Pの入力によって、入力で指定されたデータをパラメータとして、
それぞれの関数が呼び出されて実行するプログラムを作りたいのですが、どのようにしていけばよいのか全くわかりません。
詳しい方 教えていただけないでしょうか。お願いします。
578デフォルトの名無しさん:2005/10/11(火) 00:17:48
>>577
まずするべきことはデータ構造に関するサイトを探すか本を買うかして勉強することだと思う
579デフォルトの名無しさん:2005/10/11(火) 00:21:32
同感。
その辺は理解してちゃんと作っておくと後々役に立つしね。
580デフォルトの名無しさん:2005/10/11(火) 00:25:32
オススメのサイトありますか?
581デフォルトの名無しさん:2005/10/11(火) 00:27:02
http://www.google.co.jp/
まじおすすめ
582デフォルトの名無しさん:2005/10/11(火) 00:27:47
分量があるので、本がいいかもねぇ・・・。
583デフォルトの名無しさん:2005/10/11(火) 00:28:34
googleしか使わない奴は信用できない
584デフォルトの名無しさん:2005/10/11(火) 00:28:53
h消し忘れた(´Д`;
585デフォルトの名無しさん:2005/10/11(火) 00:30:07
>>583
そんな奴はGoogleも使いこなせないと思う
586デフォルトの名無しさん:2005/10/11(火) 00:32:10
googleばかり薦めるのもスレのレベルが低く見られて
上級者が散っちゃう原因になるんだけどねぇ
587デフォルトの名無しさん:2005/10/11(火) 00:36:11
>>586
そうなのか。それは初めて聞いた。悪かったよ。
588デフォルトの名無しさん:2005/10/11(火) 01:41:54
そんなこと言っても、実際その辺の本よりGoogleの方が
役に立つ
589デフォルトの名無しさん:2005/10/11(火) 01:44:09
ある程度の知識があってこそGoogleは
役に立つ
590デフォルトの名無しさん:2005/10/11(火) 01:55:07
Googleでヒットするサイトは俺が書いたんだよ
591デフォルトの名無しさん:2005/10/11(火) 01:57:08
データ構造について書かれた本またはサイトでオススメはなんですか?
592デフォルトの名無しさん:2005/10/11(火) 03:18:02
>>591
つ Google
593デフォルトの名無しさん:2005/10/11(火) 03:23:14
>>591
The art of computer programmingでも読めと
594デフォルトの名無しさん:2005/10/11(火) 03:34:01
A+D=Pってpascalだったっけ?
595デフォルトの名無しさん:2005/10/11(火) 03:37:09
んだね。
596デフォルトの名無しさん:2005/10/11(火) 11:56:30
やっぱり、まず初心者はクヌース先生の本を一式読んだほうがいいな
597デフォルトの名無しさん:2005/10/11(火) 14:37:08
ある値aが非数(nan)やinfとなったとき、
if文で検出する方法を教えてください。

たとえば、
double a;
if(a==nan)
a=0;

としてもうまくいきません。
598デフォルトの名無しさん:2005/10/11(火) 14:42:08
599デフォルトの名無しさん:2005/10/11(火) 15:09:42
先日, 以下のようなコードを書いたら先輩に注意されてしまいました.

if ((pStruct != NULL) && (pStruct->param == VALUE)) {
   ...
}
else {
   ...
}

なんでも, コンパイラによっては前の判定で偽になっても後の判定を行ってしまうもの
があり, 結果として後の判定で NULL ポインタアクセスとなってしまうのだそうです.

なので, この場合は初めに NULL チェックだけの if を書き, メンバの判定に if を
もう一つネストして書かなければだめだとのことですが, それだとひどく冗長なコード
のような気がしますし, else の内容を 2 度書かなければならなくなってしまいます.

私は今まで (といっても 2, 3 年ですが) この書き方で問題になったことがないの
ですが, 実は論理式の評価の順番は規定されてはおらず, 今までたまたま助かって
いただけなのでしょうか.
600デフォルトの名無しさん:2005/10/11(火) 15:31:07
>>599
釣りなら適当なスレへ。
そうでないならマニュアルなり入門書をよく読みましょう。
601デフォルトの名無しさん:2005/10/11(火) 15:31:40
>>599
そんな標準に準拠してないコンパイラは窓から投げ捨てろ。
そのままでいいよ。
602デフォルトの名無しさん:2005/10/11(火) 15:44:42
>>599
&&や||に限っては評価順が決まっている。
603デフォルトの名無しさん:2005/10/11(火) 15:55:56
ハンドルされていない例外は・・・・・.exeにあります。0xC0000005: Access Violation
と表示されるのですがなんなんでしょうか?かなり悩んでます。
604デフォルトの名無しさん:2005/10/11(火) 15:57:41
範囲外のメモリにアクセスしてるんだろ。
配列のインデックスや無効なポインタをチェックしれ
605デフォルトの名無しさん:2005/10/11(火) 16:15:26
knuthの本に書いてあることぐらい、数学ちゃんとやっておけば
自分で思いつくようになる。あの本買うぐらいなら数学やるべし。
606デフォルトの名無しさん:2005/10/11(火) 16:37:20
数学とクヌースならクヌースのほうが安く済むよ
607デフォルトの名無しさん:2005/10/11(火) 16:40:46
C言語ってみんな何歳くらいからやり始めたん?
608デフォルトの名無しさん:2005/10/11(火) 16:43:24
>>607
スレの浪費にしかならないアンケートして何が楽しいんだ?
609デフォルトの名無しさん:2005/10/11(火) 16:44:09
17才
PC9801購入をきっかけに乗り換え
それまではMSXでBASIC
610デフォルトの名無しさん:2005/10/11(火) 17:04:25
27才
プラットフォーム(hp9000)の変更をきっかけに乗り換え
それまではpdp11でpascal
611デフォルトの名無しさん:2005/10/11(火) 17:27:54
>>607 >>609-610
他所でやれ。
612デフォルトの名無しさん:2005/10/11(火) 17:44:59
>>607 >>609-610

  こ  こ  で  や  れ  
613デフォルトの名無しさん:2005/10/11(火) 18:02:35
>>612

こ こ は マ 板 じ ゃ ね え
614デフォルトの名無しさん:2005/10/11(火) 18:04:27
>>613

   結   婚   し   よ   う   か   
615デフォルトの名無しさん:2005/10/11(火) 18:11:01
ここはしょせんム板の雑談スレだろw
616デフォルトの名無しさん:2005/10/11(火) 18:33:52
参考までにいいんじゃね?
他の話題が挙がってる訳でも無いし。

ーーーーーーーチラシーーーーーーー
いつの事だったか、ヒッキーの小学生プログラマを取り上げてた雑誌の広告を見たのを思い出した。
617デフォルトの名無しさん:2005/10/11(火) 20:24:29
ところでスレ主のビルジョブズってまだ生きてるの?
618デフォルトの名無しさん:2005/10/11(火) 20:41:26
callocのcって何の略ですか?
ゼロクリアするのだからzallocのほうが自然だと思ったので気になりました
619デフォルトの名無しさん:2005/10/11(火) 20:46:03
clearだろ
620デフォルトの名無しさん:2005/10/11(火) 20:48:26
>>619
なるほど!胸がスーっとしました
ありがとうございます
621デフォルトの名無しさん:2005/10/11(火) 21:26:24
C言語つったら本買った方が良いかな?みんなどうなの?
622デフォルトの名無しさん:2005/10/11(火) 21:33:41
>>621
スレ違い
623デフォルトの名無しさん:2005/10/11(火) 21:35:27
K&Rは神棚に奉ってる
624デフォルトの名無しさん:2005/10/11(火) 21:36:31
んじゃあそのスレに誘導してほしいお・・・
625デフォルトの名無しさん:2005/10/11(火) 21:40:36
>>624
誘導は誘導スレへ
626デフォルトの名無しさん:2005/10/11(火) 21:41:53
誘導スレに誘導してほしいお・・・
627デフォルトの名無しさん:2005/10/11(火) 21:46:21
>>626
>>625

アマエルナ
628デフォルトの名無しさん:2005/10/11(火) 21:49:12
甘えるなを並び替えるとエマニエルになるよ
629デフォルトの名無しさん:2005/10/11(火) 21:50:45
「ニ」は何処からでてきた?
630デフォルトの名無しさん:2005/10/11(火) 21:59:32
いいじゃん・・・教えてくれたって…みんなひどいよ、
僕、現実じゃ友達いないの、ネットでいっても「ヒキコモリか」とか言われて・・・
実際僕ヒキコモリなんだよ、親にも迷惑かけてるし、家にいてもすることないの。
今中学三年生なんだけど高校いかないことにした、だからC言語学んで
将来そういう仕事つきたいの

お願い、みんな本買ったりしてるの?オススメは?
631デフォルトの名無しさん:2005/10/11(火) 22:00:38
ネタはキモいなぁ・・・今度は人を楽しませるネタで頼むわ>630
632デフォルトの名無しさん:2005/10/11(火) 22:05:45
質問です。
double型の変数に数値を指定して、その小数点以下の値が入っている桁数を調べたいのですが、どのようにすれば出来ますか?
例としては 3.264000の変数は、3桁であると調べたいです。
目的は、電卓プログラムで計算した際に表示する計算値に使用したいです。
sprintfや、gvct等で実装しようとしましたが、手間がかかりすぎました。
633デフォルトの名無しさん:2005/10/11(火) 22:06:00
ネタじゃないよ!いい加減にしてよ!キモくていいよ、どうせ引き篭もりだし、学校いってもキモイって言われまくるし。
学校ではいじめいろいろうけてるんだよ!物置の中に一日中閉じ込められたりとかもあったりした。
ネットでもみんな僕いじめるの?
634デフォルトの名無しさん:2005/10/11(火) 22:10:52
>>633
少なくとも私はいじめるつもりはないけど。
引篭りをサポートするようなレスはしたくないな。
君の目指すべきは高卒検定試験ではないのか?
635デフォルトの名無しさん:2005/10/11(火) 22:14:28
家貧乏なんです、高校いけないほど貧乏な家なんてないだろ、とか言ってるけどあるんです、ウチです
だから本一冊買うのにも迷ってるんですよ・・・
636デフォルトの名無しさん:2005/10/11(火) 22:17:38
>>632 sprintでできるのならそれで十分。
てか、こういうときは、自分はこうやったけど、他の方法ありますか? とソースを出すのもいいかもしれん。
なお、有限の2進数の小数では10進数の小数をあらわせないので注意。
637デフォルトの名無しさん:2005/10/11(火) 22:18:19
>>635
ハイハイ、ワロスワロス(AA略
638デフォルトの名無しさん:2005/10/11(火) 22:23:51
>>632
その「3ケタ」と言うは、どう数えて「3ケタ」となったか考えたか?
考えたなら、その過程をそのままコードにすればいい。

考えてないなら、まずはそこを考えるべきだ。
639デフォルトの名無しさん:2005/10/11(火) 22:23:57
>>635
板違い。

借金生活
http://life7.2ch.net/debt/
640デフォルトの名無しさん:2005/10/11(火) 22:25:07
>>633 人を楽しませるネタを書こう。
他人にサービスをしないのに他人からサービスを受けようってのは、ちょっとな。
主従以外の関係もあるから、それを経験することだ。

>>635 バイトすれば?
地域にもよるが、新聞配達は中学校からやれる。(小学校からやってるって話も聞く)
進学については、通信制高校は授業料安いし、時間も確保できるぞ。
成績や出席がよければ学費免除ってところもあるし、がんばれ。

と、養護施設で育って、通信制高校を出た漏れが書いてみる。
641デフォルトの名無しさん:2005/10/11(火) 22:27:23
動的な多次元配列についての質問なのですが、

int array[16][16]に対し、int hoge = array[5][5]とアクセスするのと
int array[16*16]に対し、int hoge = array[5+(5*16)]とアクセスするのでは

どちらが速度的に有利なんでしょうか。

頑張ってアセンブラも学んでみたのですが、Releaseビルドでのアセンブラの吐き出し方が分からなくて…。
よろしくおねがいします。
642デフォルトの名無しさん:2005/10/11(火) 22:29:42
どーだろ・・・? 何億回もアクセスさせて、時間計測してみたら?
643デフォルトの名無しさん:2005/10/11(火) 22:29:49
>>641
実測汁。

ヒント:プロファイル
644デフォルトの名無しさん:2005/10/11(火) 22:31:13
予測:せんせーVC6でプロファイルできません!→当該の環境スレへ
645デフォルトの名無しさん:2005/10/11(火) 22:33:24
プロファイルはしてみたのですが、誤差の範囲でした。

後学のため、ここなら詳しい人がいて、何かはっきりしたところが伺えるかもなと。
コンパイラによるのかも知れませんが。
646デフォルトの名無しさん:2005/10/11(火) 22:38:33
>>645
VCでは実はReleaseでもデフォルトではデバッグできるようになっているよ。
だから混合モードを試してみたら?
647デフォルトの名無しさん:2005/10/11(火) 22:45:56
>>646
どちらにしろ、速度云々は環境依存のスレ違い。
648641=645:2005/10/11(火) 22:46:40
>>646
ありがとうございます
スレ違いになりますが、しかし私の実力だとシンボルがないと辛くて…
Release&シンボル付きで吐き出す方法があったはずなのですが…さっきから必死でヘルプ見てます

質問はその方法について、では無く、641ですのでひとつ
649632:2005/10/11(火) 22:48:30
>>636
了解しました、全体を写すと膨大になるので、その部分だけ書きますね

double d = 3.4560023;
int dec ,sign ,Len ,cnt;
char str[100];
char *pstr;
pstr = fcvt(d, 14, &dec, &sign);
Len = strlen(pstr);
pstr = pstr + Len - 1;
cnt = 0;
while ('0' == *pstr) {
pstr--;
cnt++;
}
pstr = pstr - Len + 1 + cnt;
Len = Len - (cnt + dec);
650632:2005/10/11(火) 22:49:58
switch (Len) {
case (0):
sprintf(str, "%14.0f", d);
break;
case (1):
sprintf(str, "%14.1f", d);
break;
case (2):
sprintf(str, "%14.2f", d);
break;
case (3):
sprintf(str, "%14.3f", d);
break;
case (4):
sprintf(str, "%14.4f", d);
break;
default:
sprintf(str, "%14.5f", d);
break;
}

これで画面に表示すると、0を取り除いた数が表示されますが
如何せん変数の宣言とソースの行数が多すぎて、もっと簡単な方法がないかと考えた次第です
良い知恵などあったらお願いします
651デフォルトの名無しさん:2005/10/11(火) 22:54:29
>>650
sprintf(str, "%14.*f", (Len < 0 || 4 < Len ? 5 : Len), d);
652デフォルトの名無しさん:2005/10/11(火) 22:54:42
ちょっと僕全課でスーパー行ってくるわ、近いし

653初心者:2005/10/11(火) 22:58:02
>>577のプログラムお願いできませんか?
654デフォルトの名無しさん:2005/10/11(火) 23:06:11
>>653
>>577に書いている順番に作っていけばいいだけ
655デフォルトの名無しさん:2005/10/11(火) 23:19:38
>>632
もとのdoubleの10進変換のときの精度はいくらー?
>636も言ってるけどそこ限界決めんといくらでも増えるよ
3.14をdoubleにいれてから小数点以下15桁まで表示すると
3.140000000000000 で桁数2だけど
無理やり16桁であらわそうとすると
3.1400000000000001 で桁数16になる
適度なところで抑えるが吉
656デフォルトの名無しさん:2005/10/11(火) 23:22:25
>>649-650
「%g」で変換すれば何も考えることなく、
後続の0を取り去ってくれるが?
657デフォルトの名無しさん:2005/10/11(火) 23:25:37
>>656
e付く可能性
658デフォルトの名無しさん:2005/10/11(火) 23:28:16
>>657
その時だけ「%f」で変換し直せばいいだけジャマイカ?
659デフォルトの名無しさん:2005/10/11(火) 23:34:39
MS-C導入したんですが実行すると「プログラムファイル名が無効です」とでます、
どうすればいいんでしょうか?
OSはXPです
660デフォルトの名無しさん:2005/10/11(火) 23:36:57
>>659
まず、コミニュケーション能力を身につけろ。

人間相手に正しく意志を伝えられないのに、
機械に正しく意志を伝えられるわけがない。
661デフォルトの名無しさん:2005/10/11(火) 23:39:28
そうですか、いきなり質問してすいませんでした。

で、どうすればいいんでしょうか?
662651:2005/10/11(火) 23:40:03
あぁ、>>650 だけ読んで脊髄反射で答えてた。スマン。

>>649
作ってみたけど、精度を定めた時に丸めによる繰り上がりがあるから、
自前で計算するよりは確かに sprintf 使うのが楽やね。

#define LIMIT_MIN 0 /* limit (以下参照)の最小値 */
#define LIMIT_MAX 16 /* limit (以下参照)の最大値 */

int frac(
 double d,
 int limit) /* 考慮する小数点以下の最大の桁数 */
{
int i, digits;
 char str[LIMIT_MAX + 2 + 1]; /* 2 は最初の 0. の分 */

 if(limit > LIMIT_MAX)
  { limit = LIMIT_MAX; }
 else if(limit < LIMIT_MIN)
  { limit = LIMIT_MIN; }

 d = fabs(d);
 d = fmod(d, 1); /* 整数部分を消去。これしないと整数部分が大きかった時に死ぬ */
 sprintf(str, "%.*f", limit, d);

 digits = 0;
 for(i = 1; i <= limit; ++i) {
  if((str + 1)[i] != '0') { digits = i; }
 }
 return digits;
}
663デフォルトの名無しさん:2005/10/11(火) 23:40:25
>>661
回線切って首(ry
664デフォルトの名無しさん:2005/10/11(火) 23:41:04
>>649
激しく脱力。もともと、何度も指摘されてるように精度の問題等もあるし、
switch文は "%14.*f" の指定でいいのだけれど…
そのソースだと単純に sprintf(str,"%80.14f", d) した結果の末尾の '0' を
'\0' で潰すだけでもかまわないように思えるが…
fcvtの変換結果の文字列を加工してもいいしどうにでも…
665デフォルトの名無しさん:2005/10/11(火) 23:44:59
sprintf( str, "%14g", val );

if( strchr(str,'e') || strchr(str,'E') )
{
  sprintf( str, "%14.f", val );
}

で、いいんジャマイカ?と思うのはオレだけか?
666デフォルトの名無しさん:2005/10/11(火) 23:47:58
わかりました、回線切って首吊って死にます、さようなら
667632:2005/10/11(火) 23:51:54
皆様ありがとうございました
改めて自分の愚かさを痛感している次第です。

お答えを見たところ、幾つか簡単に今のプログラムに組み込めそうなものがありましたので
そちらの方法で実装させて頂く事にします。
お手数をお掛けして、申し訳ありません。

追記:表記したソースを使用してはならないという方はお手数ですが書き込みをお願いします
使わないようにしますので。
668デフォルトの名無しさん:2005/10/12(水) 00:06:54
>>665
それ少なくともbccじゃアウト
669初心者:2005/10/12(水) 00:50:19
>>577はちょっと難しいです。
プログラムのせていただけませんか?
まだCをはじめたばかりなのでこの課題をひとりで作るのは困難です。
よろしくお願いします。
670デフォルトの名無しさん:2005/10/12(水) 00:55:34
>>669
まず、Cの勉強をしようとは思わないのか?
671デフォルトの名無しさん:2005/10/12(水) 01:00:32
>>669
17日の13:00までならまだまだ時間あるしね。
672デフォルトの名無しさん:2005/10/12(水) 01:00:32
>>669
スレ違い。

そもそも、学生ならわからない事はまず教員に聞け。
授業で教えていないことは課題として出さないだろうから、
きちんと授業を聞いて、わからない所はわかるまで質問する、
と言う普通の授業態度を取っていれば問題なくこなせるはずだろ?
673デフォルトの名無しさん:2005/10/12(水) 07:11:57
大学生以外で先生に聞きに行く奴なんて、よっぽどのガリ勉キャラくらいだろ
669擁護する気はないけど、長文便乗説教ウザス
674デフォルトの名無しさん:2005/10/12(水) 08:32:57
>>673
カワイソス(´;ω;`)
675デフォルトの名無しさん:2005/10/12(水) 09:15:10
確かにここ数スレみても中身のない説教ばかりだなw
質問スレなのに
676デフォルトの名無しさん:2005/10/12(水) 09:16:40
wwwwwwwwwwwwwwww
677デフォルトの名無しさん:2005/10/12(水) 09:25:57
説教とか、ググれ、スレ違い指定、勘違いレスなんかはさ、
そんなレス付けて流れ止めるくらいならスルーしてくれってのが良くあるな。

流れ止めたくなくて反論するんだけど、
それだとどうしてもこっちが厨房っぽく見えちゃうから、もう打つ手がない。
678デフォルトの名無しさん:2005/10/12(水) 09:33:00
まともに答える能力がないのを隠すためにやってるんだろな。
カワイソス
679デフォルトの名無しさん:2005/10/12(水) 09:35:51
>>677
おいらが嫌なのは、どう見てもミーより分かってなさそうなお方が見当違いの事書いてくるの
で、なんか質問の回答自体は絶対来ないの
お願い無理してまで参加しないでーって思う
680デフォルトの名無しさん:2005/10/12(水) 09:43:55
>それだとどうしてもこっちが厨房っぽく見えちゃう
うはwwwおkwwww
681デフォルトの名無しさん:2005/10/12(水) 09:45:42
取り合えず、解答貰ってる質問と貰えず煽られただけの質問を比べてみ
682デフォルトの名無しさん:2005/10/12(水) 09:51:07
解答出来ないんなら書き込むなっつー事でよろ > 無能回答者
683デフォルトの名無しさん:2005/10/12(水) 09:54:58
スレ違い
684デフォルトの名無しさん:2005/10/12(水) 09:55:28
例え下らないレスでも、上級者が上手いこと取り上げて建設的に賑わった昔の技術系掲示板
或いは、そんなレスは完全華麗にスルーされ、スレが汚れることはなかった

ネット人口が増え、能力差も顕著になった昨今、
誰でも優位に立てるキーワード「ググれ」、「本買え」、「スレ違い」、
…そして自己満足な「説教」だけが蔓延る、思考停止状態に


このコピペを思い出した
685デフォルトの名無しさん:2005/10/12(水) 10:00:39
アンチ説教厨ウザ杉。このスレでは答えてもらえないんだから他行けよ
686デフォルトの名無しさん:2005/10/12(水) 10:03:24
説教するなっていう説教が鬱陶しいです。
687デフォルトの名無しさん:2005/10/12(水) 10:12:31
アンチ説教厨ってwww
説教して欲しい奴がいるのかwwwww

あ、説教したい奴がいるんだwwwwwwwwww
688デフォルトの名無しさん:2005/10/12(水) 10:21:25
>>672みたいのは恥ずかしいな
>>672が特別あれなだけで、まぁ他はこんなもんかと
689デフォルトの名無しさん:2005/10/12(水) 13:08:20
>>672は生徒に無視されてる専門学校の講師。

でも、何が質問したいのかわからんやつと
何聞かれてるのかわからんやつの間には
壁があるのも事実かと。
690デフォルトの名無しさん:2005/10/12(水) 14:24:32
はい、では次のしつもんドゾ
691デフォルトの名無しさん:2005/10/12(水) 14:26:11
おまいら無理やりでもいいから、話はCに絡めてやってくれ
692デフォルトの名無しさん:2005/10/12(水) 14:35:48
「ハッシュ法の流れ図を書け」という宿題が出たのですが、どう書けばいいのかわたしにはよくわかりません。
流れ図の載っているサイト教えてください。
693デフォルトの名無しさん:2005/10/12(水) 15:05:50
はいはい。Googleで探せと言わせたいだけだろ。
694デフォルトの名無しさん:2005/10/12(水) 15:06:11
なかなか見つからないんです。
695デフォルトの名無しさん:2005/10/12(水) 15:09:49
★シュワルツネッガー知事の拒否で、カリフォルニア州の「反日教科書」法成立せず

・いわゆる「南京大虐殺」など、旧日本軍の残虐行為をカリフォルニア州の教科書に
 書き込むことを目的とした法案に、シュワルツェネッガー知事が署名を拒否しました。

 この法案は、州の中学高校で使用される教科書について、第二次大戦中にアジアで
 起きた出来事に、もっと分量を割くことを求めるもので、先月、州議会を賛成多数で
 通過していました。提案者の議員は教えるべき具体例として、いわゆる「南京大虐殺」を
 挙げていました。法案を後押ししたのは、日本の常任理事国入り反対の署名活動を
 展開した在米の中国人団体らで、「南京大虐殺」などの旧日本軍の残虐行為をアメリカ
 で歴史的事実として定着させることが、推進派の最大の目的でした。しかし、拒否権を
 持つシュワルツェネッガー知事は7日、「アジア諸国の役割について学習することは、
 すでに認められている」として署名を拒否し、法案は成立しませんでした。
 http://www.tv-asahi.co.jp/ann/news/web/inte_news8.html?now=20051009245834
 ※ニュースは既に削除されています。

696デフォルトの名無しさん:2005/10/12(水) 15:10:11
くだらん質問に回答もらえなかったら回答者を無能呼ばわり禿ワロスwww
697デフォルトの名無しさん:2005/10/12(水) 15:53:33
Googleで検索したらこのスレがヒットしました
698デフォルトの名無しさん:2005/10/12(水) 17:38:53
CでもC++でも結構です。
どなたか、エキスパートシステムのコードがある
サイトはご存知ないでしょうか?
GUI抜き、バリバリのロジックonlyで、かつ、
いや、だからこそ、再帰構造なんかを使った
スッキリしたプログラムを期待してます。

699デフォルトの名無しさん:2005/10/12(水) 21:40:33
Prologなら手元にあるよ
700デフォルトの名無しさん:2005/10/12(水) 23:21:25
超低級な質問で申し訳ない。
現在、Cにプログラムで、512×512の行列の積を計算するプログラムを設計
しているのだが、UNIX環境では動作するのだがWindowsだと
どうにも上手くいかない。
コイツは、Windowsだと仕方が無いことなのだろうか……
701デフォルトの名無しさん:2005/10/12(水) 23:24:27
たぶん、スタック不足なんだろうから、配列の前にstaticでも入れたら?
702デフォルトの名無しさん:2005/10/12(水) 23:26:31
>>700
うまくいかない状態の説明くらいしろボケ
703デフォルトの名無しさん:2005/10/12(水) 23:33:24
↓ここで説教厨が登場
704デフォルトの名無しさん:2005/10/12(水) 23:33:49
都合の悪い事はなんでもWindowsのせいにすれば済むんだから楽だよな。
705デフォルトの名無しさん:2005/10/12(水) 23:35:25
蒸し返して悪いのですが、>>599-602って明確に定義されているんでしたっけ?
この例でいうと、&&の左辺が真の場合、右辺は絶対評価されることはない、
って決まってるんでしたっけ?
706デフォルトの名無しさん:2005/10/12(水) 23:36:22
決まってる。
707デフォルトの名無しさん:2005/10/12(水) 23:37:02
>703-704
ワロッシュwww
708デフォルトの名無しさん:2005/10/12(水) 23:38:57
>>702
a[512][512];←と定義すると、この処理に入った瞬間に
プログラムが強制終了する。
UNIX(soraris 9.0)で動かすと、この不具合は生じない。
709デフォルトの名無しさん:2005/10/12(水) 23:42:40
>>708
スタックに取られるから、
配列が大きいと、スタックがオーバーする。
710デフォルトの名無しさん:2005/10/12(水) 23:42:50
>>708
肝心な部分を略すなボケ
711705:2005/10/12(水) 23:48:23
>>706
ありがと。もう一度規格書読み直してみます。
712デフォルトの名無しさん:2005/10/12(水) 23:49:29
短絡演算子。
713デフォルトの名無しさん:2005/10/12(水) 23:52:59
staticってことはつまり、
静的変数として領域を確保することなんですよね。
動きましたΣ(゚Д゚)
どうも、ありがとうございます。
714デフォルトの名無しさん:2005/10/12(水) 23:54:11
>>701でつ。てけとーでも言ってみるもんですな。
715デフォルトの名無しさん:2005/10/12(水) 23:55:42
>>705
そういうようには決まっていない。その例の場合、寧ろ必ず評価される。

勿論左辺が偽の場合は右辺は評価されることはない。
716デフォルトの名無しさん:2005/10/12(水) 23:57:45
>705
717デフォルトの名無しさん:2005/10/13(木) 00:56:59
>>705
ショートサーキットでググれ

と言いたかったのだが、ググってみるとノイズが多いな。

少なくとも規格では、
左項で条件式の結果が一意に決まる場合には
右項は評価されないとされている。
&& の場合は、左項が偽の場合には右項を評価するまでもなく偽になり、
|| の場合は、左項が真の場合には右項を評価するまでもなく真になる。
これをショートサーキットと言って、
その NULL チェックはショートサーキットの利用例としてポピュラー。

ただ、もしこの規格を無視したコンパイラがあって、
やむを得ずそのコンパイラを使わなければならない状況なのであれば、
ショートサーキットを使わないようにせざるを得ない。
ただ、そんなコンパイラの話は聞いたことないが。
718デフォルトの名無しさん:2005/10/13(木) 03:45:42
1)先輩が詳しくない
2)先輩がカンチガイした
3)先輩は先を見越して、他の2項演算では挙動がちがうことを伝えようとした
719デフォルトの名無しさん:2005/10/13(木) 04:29:47
4)先輩が知っているのはE.T.の外側の皮をベリベリ剥がしたら中身はこんなロボットだった、ってな感じの映画
720デフォルトの名無しさん:2005/10/13(木) 05:35:43
5) 先輩というのは実は自分で、後輩にえらそうに言ったことが間違ってたような気がして聞いてみた
721デフォルトの名無しさん:2005/10/13(木) 12:46:13
>>717
> ただ、もしこの規格を無視したコンパイラがあって、
それはCのコンパイラではない。
なんちゃってCコンパイラか何かだろ?

規格通りに動かなくて良いなら規格は何の為に存在するんだ?
722デフォルトの名無しさん:2005/10/13(木) 13:09:05
>>721
噛み付く相手が間違ってやしませんか。
723デフォルトの名無しさん:2005/10/13(木) 14:26:45
くだらない質問ですが・・・。

よく質問スレの回答者が引用する、
規格読め、K&R読め、**.**.** 読め(1.17.4 など、数字は適当です)などが出てきますが、
これらは全て >>1

Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

のことなのでしょうか?

また、例えば >>717 のような、Cの細かい正確な挙動が
この本には載ってるのでしょうか?

書籍スレと迷ったのですが、質問の内容的にこちらの方がふさわしいと思ったので
よろしくお願いします。
724デフォルトの名無しさん:2005/10/13(木) 14:58:30
>>723
CでK&Rといえばそれしかないだろ
言語の策定に携わった人間が書いた、もはや解説書というより仕様書といった方がいいような代物

入門書読み終えたらK&R読むことをお勧めする
725デフォルトの名無しさん:2005/10/13(木) 15:06:32
>>723
本来なら規格書(ISO/IEC 9899とかJIS X3010)を見ることをお勧めする
ちなみにJIS X3010は14,280円、下記のURLから購入できる。ISO/IEC 9899は32,130円
http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=JIS+X+3010%3A2003&dantaiCd=JIS&status=1&pageNo=0

だが、そんなの高すぎて買えないと言う人には
> Cプログラマ必読 ・プログラミング言語C(通称 K&R)
> http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
で十分と思われる

717の挙動はK&RではA7.14(論理的AND演算子) A7.15(論理的OR演算子)に記載されている

あと、FAQの場合、>>301のような言い方をされることがある
726723:2005/10/13(木) 15:19:37
>>724-725
ありがとうございます。さっそく本屋へ向かいます。
727デフォルトの名無しさん:2005/10/13(木) 15:20:11
まあK&Rは当然古くてC99には対応していないので
その辺は注意だ
728デフォルトの名無しさん:2005/10/13(木) 15:45:53
>>725
買わなくても読めるし、(事実上)拾える。
729デフォルトの名無しさん:2005/10/13(木) 15:58:15
>>728
確かに読めるし、持ってるけど...アレって字が汚くないか?
一応違法だし、その方法を初心者に勧めたくない。
730デフォルトの名無しさん:2005/10/13(木) 16:15:46
・・・せめて、検索できればな・・・JISC
731デフォルトの名無しさん:2005/10/13(木) 16:21:02
いつも思うが、規格書ぐらいPDFで無償配布しろと
732デフォルトの名無しさん:2005/10/13(木) 16:39:07
意見を聞きたいのですが、
設計環境をC言語とし、乱数の値を代入し、
n行の正方行列の積を計算するプログラムを設計しました。
積の計算の速度を高速化させるための手法としてなにか無いでしょうか?
(計算の始めから終わりまでをtimeよりストップウォッチで調査)
733デフォルトの名無しさん:2005/10/13(木) 16:40:35
先生!質問です。
C言語のソースでステップ数を尋ねられた場合、行数で返答すればよいのですか?
教えてください。
734デフォルトの名無しさん:2005/10/13(木) 16:42:39
>>733
セミコロンの数
735デフォルトの名無しさん:2005/10/13(木) 16:46:03
>>732
今どう書いてるかによるんじゃない? 現状タコなら速くなる
736デフォルトの名無しさん:2005/10/13(木) 16:47:00
コメント、空行を除いた行数だな・・・
while ((c = getchar) != EOF)
if (isdigit(c))
count++;
さすがにコレを1ステップと数えるのはいかがか・・・。
737デフォルトの名無しさん:2005/10/13(木) 16:48:34
ありがとうございます。
Doxygenでカウントできましたっけ?
738734:2005/10/13(木) 16:49:55
>>736
なるほど

まあステップ数問題にするのがあれだと思うけど
739デフォルトの名無しさん:2005/10/13(木) 16:51:48
>>738
そうなんすよ。10年以上Cで組んでるのにステップ数を聞かれたのって
初めてだったんで面食らった。
740734:2005/10/13(木) 16:56:23
>>793
なんだ、素人質問じゃなかったのか

だったら相手の意図を汲み取って洒落を混ぜて答えちゃえば?
741デフォルトの名無しさん:2005/10/13(木) 17:03:19
俺は空行もコメントもソースとして意味があって付与しているという自信があるので
ステップ数=行数としている

決してボッタクリの為ではない。一応Pro*Cの場合は変換前のステップ数で出すし...
742デフォルトの名無しさん:2005/10/13(木) 17:04:34
>>740
Cスレでポインタをミスるんじゃねぇ!!
743734:2005/10/13(木) 17:21:58
ごめん
744kogi:2005/10/13(木) 17:31:28
質問です。とある計算の計算結果がオーバーフローしないように
計算結果を表示するには、どうすればいいかわかりますか?
745デフォルトの名無しさん:2005/10/13(木) 17:32:37
オーバーフローしないように計算したいのか。

それとも計算結果を表示する時に桁を制限して、
その制限を越えたら最大値を表示するようにしたいのか。
746kogi:2005/10/13(木) 17:35:35
えっと、計算した結果が、オーバーフローしなければ
良いです。桁制限は特に使ってません
747デフォルトの名無しさん:2005/10/13(木) 17:37:26
ごめん、オーバーフローって、どういうことを言うの?
748デフォルトの名無しさん:2005/10/13(木) 17:37:38
多倍長計算ができるライブラリを探すんだな
さもなきゃbcのソースでもパクれ
749デフォルトの名無しさん:2005/10/13(木) 17:40:27
飽和加算のためだけに多倍長計算? あり得ない。
750デフォルトの名無しさん:2005/10/13(木) 17:41:36
オーバーフローしないように計算表示ってのが何を指しているのかわからん。
751デフォルトの名無しさん:2005/10/13(木) 17:42:15
signed? unsigned?
752kogi:2005/10/13(木) 17:43:02
>多倍長計算ができるライブラリを探すんだな
さもなきゃbcのソースでもパクれ

すいません、詳しくお願いします
753デフォルトの名無しさん:2005/10/13(木) 17:43:32
>>752
気にするな。
754デフォルトの名無しさん:2005/10/13(木) 17:44:54
>>747
4桁しか表示出来ない場合で5000+6000を計算すると5桁目の1が入らないので1000と出力されてしまう。要するに桁溢れ。
755デフォルトの名無しさん:2005/10/13(木) 17:45:30
一発、staticでやってみそ。
mallocで領域確保も手だな
756kogi:2005/10/13(木) 17:47:24
>751

今はsigned型で組んでます
757デフォルトの名無しさん:2005/10/13(木) 17:48:35
>>756
アンダーフローはどうするの?
758デフォルトの名無しさん:2005/10/13(木) 17:48:43
>>754
5000+6000をどうしたいのかイマイチ分からない

5000+6000を4桁に収めるのはそもそも無理だし

5桁にオーバーしたら9999にしろってことなのか?

759kogi:2005/10/13(木) 17:49:29
>757

アンダーフローは考えなくてもいいですw
760デフォルトの名無しさん:2005/10/13(木) 17:50:29
>>759
負の値が入ってくることは考えなくていいのか?
761kogi:2005/10/13(木) 17:52:21
>>760

忘れてますたm(_ _)m
やっぱりアンダーフローも考えます
762デフォルトの名無しさん:2005/10/13(木) 17:57:29
>>761
となると、少し面倒だな。
x も y も正の場合はオーバーフローの可能性がある。
x も y も負の場合はアンダーフローの可能性がある。
両方で符号が違う場合は、どちらの可能性もない(2値の間の値になるから)。

x も y も正の場合、オーバーフローを抑制する必要があるが、

x + y > 最大値 ? 最大値 : x + y

のようにすることはできない。
なぜなら、最大値を超えるとオーバーフローするから、
x + y > 最大値 という条件式はあり得ない。
なら、移項すればいい。

同じようにして、負の場合も

x + y < 最小値 ? 最小値 : x + y

とできないから、移項すればいい。
763kogi:2005/10/13(木) 18:06:07
>>762

えっと、C言語初心者なんでよくわからないのですが、
移項ってどういう意味ですか?
764デフォルトの名無しさん:2005/10/13(木) 18:11:22
( ゚д゚)カポーン
765デフォルトの名無しさん:2005/10/13(木) 18:12:31
cの言葉じゃないと思うが・・・
766デフォルトの名無しさん:2005/10/13(木) 18:27:40
小学生がカウンターストップを作ろうとしてるんじゃね?
767デフォルトの名無しさん:2005/10/13(木) 18:27:54
>>763
小学校の算数で習うことだよ>移項
768デフォルトの名無しさん:2005/10/13(木) 18:33:38
自分でも何がしたいのか解ってない奴が来ると
スレ進行が早いね。
769デフォルトの名無しさん:2005/10/13(木) 18:50:57
オーバーフロー、アンダーフローが発生したときにどういう振る舞いをさせたいんだね?
計算機は機械である以上、絶対にオーバフローすることがある。
多倍長計算ライブラリであってもメモリやディスク容量を超える桁数は扱えない
770デフォルトの名無しさん:2005/10/13(木) 18:54:15
>>758
数字を変えて説明するぞ。
4桁の電卓があったとしよう。それにまず7000を入力。さらに9000を足すと16000になるが、5桁目は用意されてないので1は切られてしまう。1(10000)が切れたからといって最大数(9999)になる訳ではない。
そもそもデジタルはそんな融通の利く奴じゃない。ちゃんとプログラムしてやらないと9999にはならんぞ。
771デフォルトの名無しさん:2005/10/13(木) 19:04:25
大変です!>>763の脳みそがオーバーフロー起こしてます。
772758:2005/10/13(木) 19:07:37
>>770
いやおれ質問者じゃないし
773デフォルトの名無しさん:2005/10/13(木) 19:31:40
>>744
もう一度、理解可能な日本語で表現してみてくれないか?
774デフォルトの名無しさん:2005/10/13(木) 19:33:08
「とある計算」が何か、またオーバーフローさせないというのは、どういうことを指すのか・・によって話がちがってくる。
775デフォルトの名無しさん:2005/10/13(木) 19:34:38
>>725
JIS X3010はPDFならタダで読める。
776デフォルトの名無しさん:2005/10/13(木) 19:48:45
>>763
・・・・・・・・。

x + y > MAX
y > MAX - x
x > MAX - y

こういうのならったべ?
不等号じゃなくて等号だったろうけど。
777デフォルトの名無しさん:2005/10/13(木) 19:55:40
中学かもしれないが、不等号も習う気が。
778デフォルトの名無しさん:2005/10/13(木) 21:03:18
% cat aaa.c
int main()
{
const char **cpp, *cp;
char **pp, *p;
cpp = pp;
cp = p;
return 0;
}
% gcc -Wall -c aaa.c
aaa.c: In function `main':
aaa.c:5: warning: assignment from incompatible pointer type

どうして片方だけ警告が出るんでしょう??
どっちもnon-constな変数からconstな変数に代入しているのに
779デフォルトの名無しさん:2005/10/13(木) 21:33:54
>>778
const は char を修飾しているから。
780デフォルトの名無しさん:2005/10/13(木) 21:52:38
>>778
ttp://www.kouno.jp/home/c_faq/c11.html#9
ttp://www.kouno.jp/home/c_faq/c11.html#10
関数に渡すのも初期化もこの場合の事情は同じ
781デフォルトの名無しさん:2005/10/13(木) 22:00:43
>>778
こうならいける。
typedef char *pchar;
const pchar *ppp;
pcp = pp;
782デフォルトの名無しさん:2005/10/13(木) 22:25:48
>>781
それじゃ、意味変わってるじゃん
783デフォルトの名無しさん:2005/10/14(金) 01:05:09
>>778
低能スレはここではないですよ。
784デフォルトの名無しさん:2005/10/14(金) 15:24:29
C言語でBerkeleyDBを扱う方法を教えてください。。。
785デフォルトの名無しさん:2005/10/14(金) 16:28:09
>>784
環境依存だろ。
786デフォルトの名無しさん:2005/10/14(金) 16:30:54
man dbで出てくるやつ?
787784:2005/10/14(金) 16:51:40
>>786
ありがとうございます。
これかもしれません。今から詳しく見てみます。
788デフォルトの名無しさん:2005/10/14(金) 17:22:04
たとえば、sigaction()でSIGSEGVを捕捉したい時に、そのハンドラを
sigaction構造体のsa_handlerで設定しますよね。
でも、これを設定してしまうと、今度はSEGVした時にcoreを吐かなく
なってしまうと思います。
coreを吐かせるようにする(捕捉した関数の動作+元の動作も行いたい)
にはどうしたらいいのでしょうか?
789デフォルトの名無しさん:2005/10/14(金) 18:27:04
該当スレで聞くといいよ。
790デフォルトの名無しさん:2005/10/15(土) 00:20:08
struct a {
 int m1;
 int m2;
}

void func()
{
 int a = {0};
 ...
}

このローカル変数aは全メンバがゼロ(NULL)に初期化されると
思いますが、構造体のメンバに構造体が含まれる場合でも
= {0} で再帰的にゼロに初期化されるのでしょうか?
791デフォルトの名無しさん:2005/10/15(土) 00:21:21
その前に、2重定義じゃなくて?
792デフォルトの名無しさん:2005/10/15(土) 00:24:55
>>790

struct a b = {0};

ならば全メンバがクリアされる。構造体の定義を再帰的に行なうことはできないから、
再帰的に初期化されることはないが。
793デフォルトの名無しさん:2005/10/15(土) 00:28:59
>>791-792
すみません、書き間違えました。

struct b {
 int b1;
};

struct a {
 int a1;
 struct b a2;
};

void func()
{
 struct a var = {0};
 ...
}

こう書いた場合に var.a2.b1 が 0 になることが
保証されているかどうか、でした。
794デフォルトの名無しさん:2005/10/15(土) 00:30:18
C言語初心者(というかプログラミング全部)なんですけど、わかりやすくて
いい参考書ないですか?
795デフォルトの名無しさん:2005/10/15(土) 00:32:01
>>793
問題ない。
796デフォルトの名無しさん:2005/10/15(土) 00:32:59
797デフォルトの名無しさん:2005/10/15(土) 11:11:30
unistd.h このヘッダ名はなんと呼べばよいでしょうか?
標準へッダ?なのかな?拡張標準ヘッダ?

798デフォルトの名無しさん:2005/10/15(土) 11:26:33
アンインストールスタンダードデーモンヘッダと読んだ、ってかシラネーヨ
799デフォルトの名無しさん:2005/10/15(土) 11:35:19
ゆにえすてーでー
800デフォルトの名無しさん:2005/10/15(土) 11:54:45
うにすてでぃ
801デフォルトの名無しさん:2005/10/15(土) 11:58:02
ゆにっくすすたんだーど。えっち
802デフォルトの名無しさん:2005/10/15(土) 12:05:03
>>801 ありがとうございました。
803デフォルトの名無しさん:2005/10/15(土) 12:05:31
ゆにっくすすたんだーどへっだ
804デフォルトの名無しさん:2005/10/15(土) 12:40:27
ユニファイドスタンダード じゃないのか?
805デフォルトの名無しさん:2005/10/15(土) 15:17:17
#include <stdio.h>

void chomp(char *p);

int main(void) {
 char str[10];

 fgets(str, sizeof str, stdin);
 chomp(str);
/*
   :
   :
   :
*/
 return 0;
}

void chomp(char *p) {
 for(;*p!='\0';p++)
  if(*p=='\n') {
   *p = '\0';
   return;
  }
 while(getchar()!='\n');
}

これでバッファあふれ防ぐ&バッファクリア、できてますか?
過不足、改善などあればご教授下さい
806デフォルトの名無しさん:2005/10/15(土) 15:26:44
strchrじゃダメ?
807デフォルトの名無しさん:2005/10/15(土) 15:27:55
あ。それ以前に10文字以上の文字列があったらどうすんだ、ってとこか。
stdio.hがincludeされてるならBUFSIZで確保した方がいいじゃね?

static char str[BUFSIZ];
みたいに。
808デフォルトの名無しさん:2005/10/15(土) 15:40:12
>>805
fgetsの改行取り除きは、strrchrしてNULL以外なら'\0'代入で。
バッファクリアはscanf("%*c")で。
809808:2005/10/15(土) 16:00:23
ごめんscanf("%*s")に訂正
810デフォルトの名無しさん:2005/10/15(土) 16:03:18
ちなみにscanf("%*[^\n]%*c");とすると改行文字までのバッファを削除できる。
811デフォルトの名無しさん:2005/10/15(土) 16:08:35
改行も削りたかったので
scanf("%*[^\n]%*c");がいい感じです。
ありがとうございました<(_ _ )>
812デフォルトの名無しさん:2005/10/15(土) 17:21:01
ソースの中にある<config.h>ヘッダが見当たらないのですがこれは、<_G_config.h>と同義ですか?
813デフォルトの名無しさん:2005/10/15(土) 17:31:01
config.h.inから自動生成されていることが多い
814812:2005/10/15(土) 18:03:22
>>813さん
レス有難うございます。autoconfの勉強をしてみようと思います。
815デフォルトの名無しさん:2005/10/15(土) 19:14:39
>>810
空白文字は大丈夫だっけ?
816デフォルトの名無しさん:2005/10/15(土) 20:34:50
>>815
%*[^\n]で取り除けるね。
817デフォルトの名無しさん:2005/10/15(土) 20:38:14
共用体について質問があります
union{
     char ch[2];
818デフォルトの名無しさん:2005/10/15(土) 20:45:51
失礼、途中で書き込んでしまいました

union{
     char c[2];
     short i;
}
としたときのメモリについての質問です
独習Cには

|------c[0]------||------c[1]------|
□□□□□□□□□□□□□□□□
|-----------   i   ------------|

こんな感じに割り当てられる、と図解してあったのですが、
c[0] とc[1] の順序はあっているのでしょうか?
ビットシフトの例題で、ピンとこないものがあったのですから……
819デフォルトの名無しさん:2005/10/15(土) 20:48:05
あってると思う。
820デフォルトの名無しさん:2005/10/15(土) 20:48:29
>>818
c[0]がより低位のアドレスに置かれることは保証されている。
それがiの上位バイトになるか下位バイトになるかは実装依存。
#所謂エンディアンの問題。
821デフォルトの名無しさん:2005/10/15(土) 20:49:22
そこまでは正しい。
どっちが上位桁・下位桁になるかはCPU依存。
822デフォルトの名無しさん:2005/10/15(土) 21:11:13
>>819-821
ご返答ありがとうございます。
環境により異なるものなんですね。

エンディアンの問題、非常に勉強になりました。
勉強不足が身にしみます。
823デフォルトの名無しさん:2005/10/15(土) 21:27:21
C標準の関数で標準入力がリダイレクトされているかどうかチェックすることは
できるでしょうか?

C言語でコンソールアプリを作る勉強のために、リダイレクトされていればEOF
まで入力を取得し、されていなければキーボードから入力(改行まで)を取得
するプログラムを作りたいのですが。

EOFが来るまで入力を取得し続けるコードだけだと、リダイレクトされていない
時にユーザがキーボードから改行を入力しても入力の取得を終了できない
ので、上記のチェックをしたいと思いました。

環境は
OS: WindowsXP
IDE: WideStudio
です。

コンソールアプリの作り方やWin32 APIで上記のチェックを行う方法は分かって
います。Cの標準ライブラリでできるかどうかが知りたいです。よろしくお願いします。
824デフォルトの名無しさん:2005/10/15(土) 22:09:54
>>823
そもそも、リダイレクトと言う概念がない環境もある訳で。
と言うか、リダイレクトされたデータに改行が含まれている場合はどうするのかと(ry


# DOS系だとCtrl+ZでEOFが入力できたはず。
825デフォルトの名無しさん:2005/10/15(土) 22:34:37
UNIXはCtrl+D
826デフォルトの名無しさん:2005/10/15(土) 23:16:36
827デフォルトの名無しさん:2005/10/15(土) 23:28:14
JAVAではたとえば

int i;
println(i+".bmp");
i++;

みたいにできますが,これをC言語でやるにはどうすれば良いでしょうか?

100個くらいのファイルを出力するときに,0.bmp,1.bmp..
のようにファイルが出力されるにようにしていのですが...

よろしくお願いいたします.
828デフォルトの名無しさん:2005/10/15(土) 23:40:20
>>827
sprintf
829デフォルトの名無しさん:2005/10/15(土) 23:42:57
>>823
標準関数ではないが、isatty()が使えるかどうか試してみ。
ま、端末からEOFを食わせる方法が欲しいだけなら>>824 >>825でいいんだが。
830デフォルトの名無しさん:2005/10/15(土) 23:46:25
int c;
printf("%d.bmp\n", i++);
831デフォルトの名無しさん:2005/10/15(土) 23:47:08
>>830
int i;
i = 0;
printf("%d.bmp\n", i++);
832デフォルトの名無しさん:2005/10/15(土) 23:54:08
>>828
>>831

おみそれしました,本当に勉強不足ですorg
833デフォルトの名無しさん:2005/10/16(日) 02:04:10
~ を使った簡単な暗号化です

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
FILE *from, *to;
char ch1, ch2;

if(argc != 2){
 puts("command error");
 exit(1);
}

if((from=fopen(argv[1], "rb"))==NULL){
 puts("open error -- argv[1] --");
 exit(1);
}

if((to=fopen("ango", "wb"))==NULL){
 puts("open error -- ango --");
 exit(1);
}
834デフォルトの名無しさん:2005/10/16(日) 02:05:21
while(!feof(from)){

 if(fread(&ch1, sizeof ch1, 1, from) != 1){
  puts("read error -- argv[1] --");
  exit(1);
 }
 
 ch2 = ~ch1;

 if(!feof(from)){
  if(fwrite(&ch2, sizeof ch2, 1, to) != 1){
   puts("write error -- ango --");
   exit(1);
  }
 }
}

fclose(from);
fclose(to);

return 0;
}

ファイル名を指定して実行すると、 read error がでてしまいます
色々考えたのですが、理由がわかりません
わかる方おられましたら、教えてくださらないでしょうか
835デフォルトの名無しさん:2005/10/16(日) 02:12:32
feofについて詳しく調べるといい
836デフォルトの名無しさん:2005/10/16(日) 02:34:15
リードエラーがeofの所為なのかどうかを調べるのがfeof()
837デフォルトの名無しさん:2005/10/16(日) 02:43:35
>>836
零点
838デフォルトの名無しさん:2005/10/16(日) 02:46:38
30点くらいはあげてやれよw
839デフォルトの名無しさん:2005/10/16(日) 02:59:53
#include <stdio.h>
int feof( FILE *stream );
概要
feof() 関数は、stream が指すストリームのファイル終端インディケータをテストします。
パラメータ
stream
ファイル終端インディケータをテストするストリームへのポインタです。
戻り値
feof() 関数は、次の値を返します。
0
stream には、ファイル終端インディケータが設定されていません。
0 以外の値
stream には、ファイル終端インディケータが設定されています。


eofかどうかを調べるのはエラーになってからだろうから
あながち嘘とは言えないな >836
840デフォルトの名無しさん:2005/10/16(日) 03:04:53
>>839
「ストリームの終端に達すること」はエラーでも何でもない。
エラーが発生したかどうかはferror()でテストする。

だから、零点。
841デフォルトの名無しさん:2005/10/16(日) 03:08:47
>エラーが発生したかどうかは
fread()とかの戻り値じゃね?
842デフォルトの名無しさん:2005/10/16(日) 03:13:28
>>841
fread()の仕様を100回嫁。
fread()の戻り値だけではEOFとエラーを識別できない。
だから、fread()を使う場合は、ferror()でテストする必要がある。

ホント、fread()のインタフェースって糞だよな。元になってる
システムコールのread()の方が100倍マシだ。
843デフォルトの名無しさん:2005/10/16(日) 03:27:21
fread() 関数は、次の値を返します。
読み取られたメンバ数
正常終了。戻り値は、正常に読み取られたメンバの数を示します。
この値が 指定したメンバの数 より小さくなるのは、読み取りエラーまたはファイルの終端が発生した場合だけです。


844833:2005/10/16(日) 03:48:09
「終端」がどこなのかとか調べるために、色々と実験してみました
なんとなく、本当になんとなくですが、感覚的にわかりました
終端とか、ファイルの始まりとか、そういうことをしっかりとやらなくてはならないようです

使用している書籍には、このことが曖昧にかかれているので、詳しく調べてみます
(ただ単に、私の読解力がないだけかもしれませんが)

みなさん、どうもありがとうございました
845デフォルトの名無しさん:2005/10/16(日) 04:02:30
>>844
・実際に読んでみなければ読めるかどうかは分からない。
・読んでみて読めなかった場合、
  1. それがファイルの終端だった場合はEOFフラグが立ち、以降
    feof()が非0の値を返すようになる
  2. それがエラーのせいだった場合はエラーフラグが立ち、以降
    ferror()が非0の値を返すようになる
と理解しなされ。

つまり、「今」feofが0を返したからといって、次のfread()が
正常に実行できるかどうかは全く分からないのだ。
846デフォルトの名無しさん:2005/10/16(日) 04:03:26
>>843
そうなのよ。
read()の場合はエラーなら-1、EOFなら0を返すから識別できるんだけどね。
ホントにマヌケな仕様。
847デフォルトの名無しさん:2005/10/16(日) 04:35:30
間抜け同士がののしりあうスレ
848833:2005/10/16(日) 04:38:52
>>845
ネットで検索しても、あまりシックリと来るものがありません
>>845さんのは、私が知りたいことの要点を得ているので、
C言語に関する知識がしっかりとつくまではそれで覚えておこうかと思います

ご丁寧にありがとうございます
849デフォルトの名無しさん:2005/10/16(日) 07:50:17
まぁ、普通はエラーなのかファイル終端なのか区別する必要もないがな。
教条主義的には区別したくなるものなのかも知らん。
850823:2005/10/16(日) 09:52:43
>>824 >>825 >>829
レスありがとうございました。

Windowsでisatty()が使えました。リダイレクトに対応しつつ、キーボードからの
入力時にはユーザが改行だけで入力を終わらせられるようにしたかったので、
isatty()で希望が満たせそうです。

isatty()はとりあえずWindowsとUNIX系OSでは使えるようなので、パソコン向けに
フリーウェアを作る場合などには十分使えるかなと思いました。
851デフォルトの名無しさん:2005/10/16(日) 13:21:46
質問です。下の n! を求めるプログラムを作ってみたのですが,
float型をdouble型にしたいのですがうまくいきません。
どうすればいいのでしょう?

#include <stdio.h>

int main()
{
float a, i, n;

printf("n = ");
scanf("%f", &n);
a = n;
for ( i = 1.0 ; i < n ; i++ ) {
a *= ( n - i );
}
printf("n! = %.0f\n", a);
return 0;
}
852デフォルトの名無しさん:2005/10/16(日) 13:26:28
>>851
>うまくいきません

期待しているのは何ですか?
でも実際には何がどうなってしまうのですか?
853デフォルトの名無しさん:2005/10/16(日) 13:36:57
>>851
ループ制御変数は整数型で充分かと。
つーか、nとiを使い分ける意味がない。
854デフォルトの名無しさん:2005/10/16(日) 13:38:28
問題点の切り分けくらい(略
855851:2005/10/16(日) 13:42:48
>>852さま
レスありがとうございます。
4行目の
float a, i, n;

double a, i, n;
としてもコンパイルできるのですが,
n = 5 として 5! を計算しても
正しく120と出ません。
856デフォルトの名無しさん:2005/10/16(日) 13:53:36
>>851
doubleにするならまずscanf("%lf", &n)に変えてくれ。話はそれからだ。
(念のためだけど、printfは変更せずに)
857デフォルトの名無しさん:2005/10/16(日) 13:55:57
%f -> %lf
858851:2005/10/16(日) 13:58:45
>>856さま
ありがとうございました。
解決しました。
859デフォルトの名無しさん:2005/10/16(日) 14:08:30
1/2が0.5になりませんってもの良くある質問だな。
860デフォルトの名無しさん:2005/10/16(日) 14:17:24
話はそれから、はスルーされますたw
861851:2005/10/16(日) 14:29:18
>>853さま
>>ループ制御変数は整数型で充分かと。 
>>つーか、nとiを使い分ける意味がない。

ということでしたので,書き直しました。


#include <stdio.h> 

int main() 

    double a;
    int n;

    printf("n = "); 
    scanf("%d", &n); 
    a = n;
    while(n > 1) {
        a *= ( n - 1 ); 
        n--;
    } 
    printf("n! = %.0f\n", a); 
    return 0; 
862デフォルトの名無しさん:2005/10/16(日) 14:30:21
お、また出たな!
863デフォルトの名無しさん:2005/10/16(日) 14:59:27
a = n;
while (n > 1) {
a *= n--;
}
とでもしたほうがすっきりするんで内科医?
864851:2005/10/16(日) 15:09:22
>>863さま

    a = n;
    while(n > 1) {
        a *= --n; 
    } 

でうまくいきました。
865デフォルトの名無しさん:2005/10/16(日) 15:11:26
そこで一句

C言語 教えた奴が 教えられ
866デフォルトの名無しさん:2005/10/16(日) 15:25:28
>>864

ワロタ。864明らかに別人だろ。
867デフォルトの名無しさん:2005/10/16(日) 15:29:05
基本的なことを教えて下さい。
ご承知の通り:
A)int (*f[3])(int);
これは関数ポインタの配列です。
B)int (*f(int))(int);
これは関数ポインタを返す関数です。
では、
関数ポインタの配列(又はその配列を
指すポインタ)を返す関数は
どう宣言したら良いのでしょうか?
引数はintで戻り値がA)のような。
868デフォルトの名無しさん:2005/10/16(日) 15:41:42
これ教えてください
0以上100以下の整数データをキーボードから複数入力し@それらのデータ数
A平均値B10刻みのヒストグラムを画面表示するプログラムを作成しなさい
負の数が入力されるまで入力を続け、*を並べて表現すること。

入力データ数:26
平均値:50.9
0−9:***
10−19:*



90−100:**
869デフォルトの名無しさん:2005/10/16(日) 15:54:32
>>867
int (**f(int))(int);
だけど、ここまで書くとぐちゃぐちゃするから素直にtypedefを使って
typedef int (*PFUNC)(int);
PFUNC *f(int);
と書いた方が素直な気がする。
870デフォルトの名無しさん:2005/10/16(日) 16:16:14
int (*(*aaa(int a))[3])(int)
{
static int (*f[3])(int);
return &f;
}

これでコンパイル通った
871デフォルトの名無しさん:2005/10/16(日) 16:46:04
>>870
あなたやってること理解出来てる?
872デフォルトの名無しさん:2005/10/16(日) 16:50:03
typedef int (*p)(int);
typedef p a[3];
typedef a *pa;

最初これでやったのをひとつずつ戻していった
873デフォルトの名無しさん:2005/10/16(日) 16:54:39
先生,諸兄姉、アドヴァイス有難う御座います。
早速試してみました。VC++6.0です。
でも、warningが出るようですが?
#include <stdio.h>

void (*koe)();
void (*koe2[2])();

void tigersfun(){

printf("タイガーズが勝ったら,金なんかどうでもエエんや!\n");
}
void murakami(){

printf("世の中金やで、タイガーズで一儲けせんかい!\n");
}

void (*koe3())(){

return &murakami;
}

void (*(*koe4())[2])(){

static void (*koe2[2])();
return &koe2;
}
874デフォルトの名無しさん:2005/10/16(日) 16:55:15
int main(void){

int i;

//*koe関数ポインタを使う。
koe=tigersfun;
koe();
koe =murakami;
koe();
//*koe2関数ポインタ配列を使う。
koe2[0]=tigersfun;
koe2[1]=murakami;
for(i=0;i<2;i++)
koe2[i]();
//*koe3関数ポインタを返す関数を使う。
koe = koe3();
koe();
//*koe4関数ポインタ配列を返す関数を使う。
*koe2=koe4();/* warning C4047: '=' : 間接参照のレベルが
'void (__cdecl *)()' と
'void (__cdecl *(*)[2])()' で異なっています。*/
koe2[0]=tigersfun;
koe2[1]=murakami;
for(i=0;i<2;i++)
koe2[i]();

return 0;
}
875デフォルトの名無しさん:2005/10/16(日) 17:13:57
void (*((*koe22)[2])) ();

koe22 = koe4 ();
(*koe22)[0] = tigersfun;
(*koe22)[1] = murakami;
for (i = 0; i < 2; i++)
(*koe22)[i] ();

これで動いた
876デフォルトの名無しさん:2005/10/16(日) 17:39:30
質問です。

コンパイルしてできたオブジェクトファイルのサイズを小さくしたいんです。
どうやら.mdebugというセクションが大きくなっている原因のようなんですが、
これには何が入っているのですか?
基本が無い為、的外れな質問をしてしまっているかもしれませんが宜しくお願いします。
877名無し:2005/10/16(日) 17:41:25
<<577期限が近いのでよろしくお願いします。
878デフォルトの名無しさん:2005/10/16(日) 17:48:11
>>876
環境依存なので該当OSのスレへどうぞ
879デフォルトの名無しさん:2005/10/16(日) 17:50:08
>875
先生有難う御座いました。
確かに動きました。私もうっかりしてましたが若干本来の目的から
ずれてしまったような?
//*koe4関数ポインタ配列を返す関数を使う。
koe22=koe4();
//でいきなり
for(i=0;i<2;i++)
(*koe22)[i]();
//と使用出来ないと意味がないですよね?
880デフォルトの名無しさん:2005/10/16(日) 17:50:17
>>878

ありがとうございます。行ってみます。
881デフォルトの名無しさん:2005/10/16(日) 17:56:05
>>879
こういうことがやりたいんと違うの?

void tigersfun() { printf("タイガーズが勝ったら,金なんかどうでもエエんや!\n"); }
void murakami() { printf("世の中金やで、タイガーズで一儲けせんかい!\n"); }
void (**koe4())()
{
 static void (*koe2[2])();
 koe2[0] = tigersfun;
 koe2[1] = murakami;
 return koe2;
}

int main()
{
 void (**koe)();
 koe = koe4();
 for (int i=0; i<2; i++)
  koe[i]();
}
882デフォルトの名無しさん:2005/10/16(日) 17:58:23
>>879
そうしたいならこうでもしとけばいいんじゃないの

void (*(*koe4 ())[2]) ()
{
static void (*koe2[2]) () = {tigersfun, murakami};
883デフォルトの名無しさん:2005/10/16(日) 17:59:47
うわぁ、スレ移動と言うよりレスも検討せずマルチで、またマルチで催促かよ、、、、
884デフォルトの名無しさん:2005/10/16(日) 18:36:30
先生方有難うございました。koe5案が一番スッキリしていますので
これを採用することにします。
#include <stdio.h>

void (*koe)();
void (*koe2[2])();

void tigersfun(){

printf("タイガーズが勝ったら,金なんかどうでもエエんや!\n");
}
void murakami(){

printf("世の中金やで、タイガーズで一儲けせんかい!\n");
}

void (*koe3())(){

return &murakami;
}

void (*(*koe4())[2])(){
static void (*koe2[2])();
koe2[0]=tigersfun;
koe2[1]=murakami;
return &koe2;
}

void (**koe5())(){
static void (*koe2[2])()={tigersfun,murakami};
return koe2;
}
885デフォルトの名無しさん:2005/10/16(日) 18:37:19
int main(void){

int i;
void (*((*koe22)[2])) ();
void (**koe6)();
//*koe関数ポインタを使う。
koe=tigersfun;
koe();
koe =murakami;
koe();
//*koe2関数ポインタ配列を使う。
koe2[0]=tigersfun;
koe2[1]=murakami;
for(i=0;i<2;i++)
koe2[i]();
//*koe3関数ポインタを返す関数を使う。
koe = koe3();
koe();
//*koe4関数ポインタ配列を返す関数を使う。
koe22=koe4();
for(i=0;i<2;i++)
(*koe22)[i]();
//*koe5関数ポインタ配列を返す関数を使う。
koe6=koe5();
for(i=0;i<2;i++)
koe6[i]();
return 0;
}
886デフォルトの名無しさん:2005/10/16(日) 18:38:28
>>885
どうでもいいけど、テスト用だからといって後で見てわけわからなくなるような名前をつける癖は治した方がいいかと
887デフォルトの名無しさん:2005/10/16(日) 19:32:15
今晩はよろしくお願いします。
数字にコンマを入れたいのですが、
下記のようにしましたが、
char * konma(char a[]){
char *henkan;
int strl= strlen(a)-1;
int amari = strl % 3;
int c =0;
int count=0;
if(amari!=0){
for(c =0;c<amari;c++){
*(henkan++) = a[count++];
}
}
*(henkan++)=',';//ここで、エラーが出ます。
while(c<strlen(a)){
for(int cc=0;cc<3;cc++){
*(henkan++)=a[count++];
}
*(henkan++)=',';
}
return henkan;
}
実行時にhenkan(不適切な・・)ハンドルされていないエラー
がでます。ちなみにあまり0なので、最初のエラー場所が、
そこです。
どうすればよいのでしょう。教えてください。
888デフォルトの名無しさん:2005/10/16(日) 19:46:58
>>887
初心者スレにでもどうぞ。
あー、エラーメッセージを書くことも忘れずに。
889デフォルトの名無しさん:2005/10/16(日) 19:53:07
char *commanize(const char *string)
{
 char *result;
 int i, j, len, ncomma;

 len = strlen(string);
 ncomma = (len - 1) / 3;
 result = malloc(len + ncomma + 1);
 if (!result) return NULL;

 for (i=1,j=1; i<=len; i++,j++) {
  result[len + ncomma - j] = string[len - i];
  if (i % 3 == 0) {
   j++;
   result[len + ncomma - j] = ',';
  }
 }

 result[len + ncomma] = '\0';
 return result;
}
890デフォルトの名無しさん:2005/10/16(日) 19:56:49
char * addStringFromIntWithComma(char * buf, int val)
{
char * p;

if (val < 0) {
p = strchr(buf, '\0');
p[0] = '-';
p[1] = '\0';
return addStringFromIntWithComma(buf, -val);
}
if (val >= 1000) {
p = addStringFromIntWithComma(buf, val / 1000);
return p + sprintf(p, ",%03d", val % 1000);
}
p = strchr(buf, '\0');
return p + sprintf(p, "%d", val);
}
891デフォルトの名無しさん:2005/10/16(日) 21:32:23
man(オンラインマニュアル)の記述は、初心者にはむずかしいように思いますが、
それは、英文を訳しているからしょうがないのでしょうか?
もと理解できるようにスキルをアップしろと言われればそれまでですが。
892デフォルトの名無しさん:2005/10/16(日) 21:37:08
manとか読んでると意味が分からなくて日本語に訳されてるの探して読んだら
自分が元のを読んだのと全く同じように訳されていて
結局なんだか分からなかったってことが何度かあった

日本語でも英語でも意味が理解できないという
893デフォルトの名無しさん:2005/10/16(日) 21:53:12
>>891
詳細に書かれているだけで、難しくは無いだろう。
プログラムの書き方がわからないとか、C言語そのものがわからない
というようなレベルなら、教科書などで勉強するべき。
manは勉強のための資料じゃないから。
894デフォルトの名無しさん:2005/10/16(日) 21:55:48
本に喩えれば丁度オライリーの1000円のデスクトップリファレンスシリーズみたいな感じだな
895デフォルトの名無しさん:2005/10/16(日) 22:00:27
英語のほうをそのまま読めば良い
ヘボ翻訳を読んでいるからますます理解できなくなるのだ
896デフォルトの名無しさん:2005/10/16(日) 22:02:13
manだけじゃない
MSDNとかもそう
日本語読んでると逆に混乱する
897デフォルトの名無しさん:2005/10/16(日) 22:02:48
>>893
なるほど、man は仕様書と思うベきが正しいですね。
アドバイスありがとうございました。
898デフォルトの名無しさん:2005/10/16(日) 22:19:39
>>887です
>>889さん
>>890さん
ありがとうございます。
最初に、ためさせていただいたのが、
889さんのほうで、成功いたしました。
malloc関数で、メモリーの割り当てしてからするのですね。
890さんのほうは、ちょっと難しくて、
strchrとか再起とかもう少し理解するのにかかりそうです。
でもがんばって理解します。
本当にありがとうございました。
899デフォルトの名無しさん:2005/10/16(日) 23:22:49
>>898
>>889 の方使ったら、後でちゃんとメモリ開放しろよ
900デフォルトの名無しさん:2005/10/17(月) 00:13:29
無理に malloc しなくてもいいんなら↓

#include <stdio.h>
#include <string.h>
#include <math.h>

void foo(char *buf, int i) {
  int u = i;
  int n = sprintf(buf, "%d", i);
  char *p = buf;
  if (i < 0) {n--; p++; u *= -1;}
  p += (n - 1) % 3 + 1;
  n = (n - 1) / 3;
  while (n--) {
    sprintf(p, ",%3d", (u / (int)pow(1000, n)) % 1000);
    p += 4;
  }
}
int main(void) {
  char buf[80], s[80];
  int i;
  while (fgets(buf, sizeof(buf), stdin)) {
    sscanf(buf, "%d", &i);
    for (; i; i /= 10) {
      foo(s, i);
      printf("%s\n", s);
    }
  }
  return 0;
}
901デフォルトの名無しさん:2005/10/17(月) 00:16:55
ごめん、上のは<string.h>いらない。

#include <stdio.h>
#include <string.h>

int bar(char *buf, int i) {
  int n;
  if (i < 0) {
    sprintf(buf, "%c", '-');
    return bar(buf + 1, -i);
  } else if (i < 1000) {
    sprintf(buf, "%d", i);
    return strlen(buf);
  } else {
    n = bar(buf, i / 1000);
    sprintf(buf + n, ",%3d", i % 1000);
    return n + 4;
  }
}
int main(void) {
  char buf[80], s[80];
  int i;
  while (fgets(buf, sizeof(buf), stdin)) {
    sscanf(buf, "%d", &i);
    for (; i; i /= 10) {
      bar(s, i);
      printf("%s\n", s);
    }
  }
  return 0;
}
902デフォルトの名無しさん:2005/10/17(月) 11:20:31
C言語でperlのhashの関数existsに当たるものはないのでしょうか?
903デフォルトの名無しさん:2005/10/17(月) 12:02:55
>>902
C言語にはそもそもperlのhashに相当する機能が無いはずだが
904デフォルトの名無しさん:2005/10/17(月) 12:16:21
dbopen で オープンして get で得たり put で置いたり。
ttp://www.geocities.jp/takusato1974/article/bdb_oboegaki.html#id4692731
ここに書いてある通りやったら出来たのですが(ちょっとだけ修正して)
キーの存在を確認するときどうしたらいいのか。。。
905デフォルトの名無しさん:2005/10/17(月) 13:18:54
906デフォルトの名無しさん:2005/10/17(月) 13:28:59
>>904
>>1読め。というか、それは "Berkeley DB" ライブラリのドキュメントを
ちゃと読めばいいだけなのは、ある程度の知性があれば自明のはずだが、
なんで C標準の話だと思ってるのか激しく問い返したい。
907デフォルトの名無しさん:2005/10/17(月) 13:42:03
あー、最近仕事で分からないことは
2chで聞いてるけど、ついに2ch風レスがきたか。
分かったよ。もう自分で調べる。
908デフォルトの名無しさん:2005/10/17(月) 13:48:25
はい。さようなら。
909デフォルトの名無しさん:2005/10/17(月) 13:49:47
fj Newsgroup ならもっと叩かれるだろうしな。
冗談じゃなくほんとうに分かってなかったのが(仕事のくせに)すごいな。
910デフォルトの名無しさん:2005/10/17(月) 14:12:05
感心感心。
911デフォルトの名無しさん:2005/10/17(月) 14:21:52
qsort関数がイマイチわかりません
比較する関数は自分で作らなければなりませんが、
なぜ、 >, =, - などで昇格順が決まるのでしょうか
正数、負数、0 の値を返すことで、どのようなことが起きているのですか?
912デフォルトの名無しさん:2005/10/17(月) 14:34:25
大小を比較することで並べ替えをしている・・・。
じゃ答えになってないの?
913デフォルトの名無しさん:2005/10/17(月) 14:34:59
a < b の時、a - b < 0
a > b の時、a - b > 0
a = b の時、a - b = 0

OK?
914デフォルトの名無しさん:2005/10/17(月) 14:40:09
a < b の場合、 順序は( a b ) と( b a )のどちらになるのでしょうか
質問の内容が明確でなくて申し訳ありませんでした
915デフォルトの名無しさん:2005/10/17(月) 14:44:20
>>914
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/qsort.3.html
> ふたつの要素の比較結果が等しいとき、並べ変えた後の配列では、ふたつの順序は定義されていない。

よって、安定(stable)したソートを行いたいときは、自分でソート関数を書く必要がある。
916デフォルトの名無しさん:2005/10/17(月) 14:46:40
>>912
>>913
>>915
しっかりと理解できました
これで先に進めます
どうもありがとうございました
917デフォルトの名無しさん
>>915
こういうのは駄目なの?<stable
int cmp(const void * lhs, const void * rhs) {
  const T        *l = lhs, *r = rhs;
  /* ... 要素の値を比較して異なれば正または負を返す ... */
  if (l < r) return -1;
  if (l > r) return 1;
  return 0;
}