2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2005/11/06(日) 22:11:19 ?
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は専門の別スレッドがあるのでそこへさようなら。

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

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 116
http://pc8.2ch.net/test/read.cgi/tech/1129589500/

2 :デフォルトの名無しさん:2005/11/06(日) 22:12:07
2gets

3 :デフォルトの名無しさん:2005/11/06(日) 22:32:29
char gets3;
gets(gets3);
puts(gets3);
3gets
3gets

4 :デフォルトの名無しさん:2005/11/06(日) 22:46:29
>>1


5 :デフォルトの名無しさん:2005/11/07(月) 00:18:49
printf("乙");

6 :デフォルトの名無しさん:2005/11/07(月) 00:33:13
puts("乙");

7 :デフォルトの名無しさん:2005/11/07(月) 00:35:32
echo 乙

8 :デフォルトの名無しさん:2005/11/07(月) 00:53:06
System.out.println("乙");

9 :デフォルトの名無しさん:2005/11/07(月) 00:57:47
fputs("乙",stdout);

10 :デフォルトの名無しさん:2005/11/07(月) 01:18:45
stdotu

11 :デフォルトの名無しさん:2005/11/07(月) 01:22:38
int (*p1)[3]=a;
int *p2=a[0];

としたとき、型は別としてアドレスとしては*p1=a=a[0]=p2ということですよね?

12 :デフォルトの名無しさん:2005/11/07(月) 01:28:48
変数を全部表示させてみれ。

13 :デフォルトの名無しさん:2005/11/07(月) 01:29:18
>>10
ワロタ

14 :デフォルトの名無しさん:2005/11/07(月) 01:34:20
>>11
すいませんaの宣言を忘れてました・・・。
int a[2][3];
です。

15 :デフォルトの名無しさん:2005/11/07(月) 01:47:21
っ【printf("%d %d %d %d",*p1,a,a[0],p2)】

16 :デフォルトの名無しさん:2005/11/07(月) 02:05:43
わかってんのか?
*p1の中身は配列だぞ?

つーかさ、
int a;
int *p = &a;
printf("%d\n", *p);
で、何が表示されるか、わかってるの?(俺はわからないけど)
それと同じ事をやろうとしてるんだけど、わかってる?

17 :デフォルトの名無しさん:2005/11/07(月) 02:11:30
ゴミ値が表示されるな

18 :デフォルトの名無しさん:2005/11/07(月) 02:15:11
>>16
それじゃ
int a[2][3]={{1,2,3},{4,5,6}};
とでも初期化してください。

19 :デフォルトの名無しさん:2005/11/07(月) 02:23:35
つーか、アドレス値表示したところで根本的なことは分からないぞ。
>>11
int a[2][3];の意味を理解してますか?

20 :デフォルトの名無しさん:2005/11/07(月) 02:25:55
>>19
そう書かれると不安になるんですが、aは配列の配列(配列を要素にもつ配列)ですよね?

21 :デフォルトの名無しさん:2005/11/07(月) 02:56:58
二重配列の返り値ってできますか?
float[10][10] hoge(float in[10][10])
とかやっても出来ないんですけど…

22 :デフォルトの名無しさん:2005/11/07(月) 03:17:45
char[10] strcpy(char *, const char *)
みたいな書き方って出来たっけ?
返せるのは配列じゃなくてポインタだけだった気がするが。
つまり、返り値の型をfloat (*)[10]にするしかない。

面倒くさいのはtypedefして使え。
typedef float (*fl10_t)[10];
fl10_t hoge(fl10_t in)
みたいな。
↑が通るかは確認してないが。

23 :デフォルトの名無しさん:2005/11/07(月) 04:56:53
>11
printf("%d %d %d\n",&a,a,a[0]);
printf("%d %d %d\n",&a + 1,a + 1,a[0] + 1);

24 :デフォルトの名無しさん:2005/11/07(月) 08:53:39
つ%p

25 :デフォルトの名無しさん:2005/11/07(月) 08:55:37
>>24
乙、親切だな。

26 :デフォルトの名無しさん:2005/11/07(月) 10:43:43
つttp://f4.aaa.livedoor.jp/~pointc/No.3032.html

27 :デフォルトの名無しさん:2005/11/07(月) 11:49:37
>>26
乙、面倒見よすぎ。

28 :デフォルトの名無しさん:2005/11/07(月) 15:09:17
>>21
配列を戻り値を通して直接返すのは無理。
対処法は2通りある。

1. 引数を通して返す。
つまり、

hoge(const float in[10][10], float result[10][10]);

として、result に結果を書き込む。

2. 戻り値を構造体にする。
つまり、

typedef struct hoge_result {
 float data[10][10];
} hoge_result;

hoge_result hoge(const float in[10][10]);

とする。

普通は 1. の方法を使う。

29 :デフォルトの名無しさん:2005/11/07(月) 15:36:11
テンテー! 関数へのポインタを返す関数の定義方法があれば、教えてください。

30 :デフォルトの名無しさん:2005/11/07(月) 15:41:50
>>29
typedefを使えばいい。そうしなくともできるけど大変面倒なことになる。
typedef void (*pfunc_t)();
pfunc_t f();

void hello()
{
  puts("hello, world");
}

pfunc_t f()
{
  return hello;
}

int main(void)
{
  f()();
  return 0;
}

31 :デフォルトの名無しさん:2005/11/07(月) 16:23:42
void (*f())();

32 :デフォルトの名無しさん:2005/11/07(月) 16:50:12
別にこの程度ならtypedefなんぞイラネ

33 :デフォルトの名無しさん:2005/11/07(月) 17:43:47
関数ポインタで typedef が必要なわけ。


・見やすい
・タイプしやすい
・あとで引数変えたくなった場合に一括して変えられる

34 :デフォルトの名無しさん:2005/11/07(月) 17:45:01
>>33
その論拠じゃ「必要」じゃなくて「便利」のレベルでしかないな。

35 :デフォルトの名無しさん:2005/11/07(月) 18:12:56
これを「必要」じゃなくて「便利」と捉えてるうちは
まともなプログラムは書けない。

36 :デフォルトの名無しさん:2005/11/07(月) 18:30:39
>>33 の説明だと必要性があるようには見えないってだけだろ

37 :デフォルトの名無しさん:2005/11/07(月) 18:41:32
これで必要性があるように見えないうちは
まともなプログラムは書けない。

38 :デフォルトの名無しさん:2005/11/07(月) 18:43:34
俺はまともなプログラムが書きたい。(´・ω・`)

39 :デフォルトの名無しさん:2005/11/07(月) 18:45:20
まともなプログラムって何よ?wwwww







と言ってるうちは
まともなプログラムは書けない。

40 :デフォルトの名無しさん:2005/11/07(月) 19:11:44
>>33 は、「可読性&保守性は必要」って言いたいの?

41 :デフォルトの名無しさん:2005/11/07(月) 19:55:47
これからはプログラマを選ぶコードの時代です

42 :デフォルトの名無しさん:2005/11/07(月) 20:00:47
part40辺りから居る俺に楯突くつもりか?

43 :デフォルトの名無しさん:2005/11/07(月) 20:28:22
>>42
いいかげん卒業しろよ…

44 :デフォルトの名無しさん:2005/11/07(月) 20:38:53
>>32
同意だね
配列ポインタと違って関数ポインタは typedef する意味うすいし

45 :デフォルトの名無しさん:2005/11/07(月) 20:45:37
お前ら初心者だったときにtypedefなしのsignalの宣言を見て一発で理解できたのか?

46 :デフォルトの名無しさん:2005/11/07(月) 20:46:38
>>45
K&Rのおかげで。

47 :デフォルトの名無しさん:2005/11/07(月) 20:53:11
>>45
うん (きっぱり)

48 :デフォルトの名無しさん:2005/11/07(月) 21:21:19
signalて何?

49 :デフォルトの名無しさん:2005/11/07(月) 21:22:58
>>45
Cの宣言まわりのsyntaxは醜いけど、別にルールが複雑怪奇な訳じゃないから
読み方さえ分かってりゃ誰でも読める。
それにCのsyntaxも理解できないようじゃ、C++にはとても手がだせんだろ。

50 :デフォルトの名無しさん:2005/11/07(月) 21:30:55
そんなことが言えるのはもはや初心者脱出の証。

複雑な宣言
初心者:わからない。作れない(作らない)。
中級者:わかる。自分でも使う。
上級者:わかる。自分が作るときにはtypedefを使う。

51 :デフォルトの名無しさん:2005/11/07(月) 21:33:18
>>50
>上級者:わかる。自分が作るときにはtypedefを使う。
                             ↑
                             も

52 :デフォルトの名無しさん:2005/11/07(月) 21:39:59
上級者:わかる。自分が作るときにはtypedefをもう。

53 :デフォルトの名無しさん:2005/11/07(月) 21:45:26
なるほど、signal()やqsort()の宣言にtypedefを用いないCの標準委員会の連中は
上級者ではないというワケだw

54 :デフォルトの名無しさん:2005/11/07(月) 21:46:36
複雑な宣言が使えたら上級者だと(プ
複雑な宣言という概念がまだ残ってるのにね

55 :デフォルトの名無しさん:2005/11/07(月) 21:48:01
>>53
処理系の実装時にtypedefを使ってはいけないとはどこにも書いていない。

56 :デフォルトの名無しさん:2005/11/07(月) 21:51:19
>>55
で、typedef使ってる実装系の具体例は?w

57 :デフォルトの名無しさん:2005/11/07(月) 22:00:36
WNDPROC

別にどーでもいーけど
ふつーに邪魔

58 :zako:2005/11/07(月) 22:10:19
こんにちは。JAVAプログラミングのプロジェクトなのですが
最初に「Please insert the # of IQ scores」と表示させ、
その後一つのintの値をコマンドラインから入力し、
次に「Please insert -入力した数値- scores」と受け取った数を表示させて、
その数だけのIQスコアをさらにコマンドラインから入力して、
そのIQスコアの値で100以上が幾つ、100以下が幾つと表示させるプログラムです。

メインとともに二つのメソッド、
readdataとaboveandbelowというメソッドが必要です。
readdataメソッドはIQスコアをゲットして、配列を使って受け取り、
aboveandbelowを使って100以下か以上かを調べるようです。

皆さんの助けを必要としています。
よろしくお願いいたします!
ここまではできています。
どなたか、アドバイスお願いします。


import java.io.*;
import java.util.*;


public class Getscores{


public static int readdata(String[] args){
int noIq, s;


System.out.println("please insert the # of IQ scores:");


59 :デフォルトの名無しさん:2005/11/07(月) 22:29:43
>>58
釣りか誤爆か、どちらにしても

  ス レ 違 い で す よ。

60 :デフォルトの名無しさん:2005/11/07(月) 22:49:21
>>56
意味の無い切り替えし乙

61 :デフォルトの名無しさん:2005/11/07(月) 23:58:33
このコードは、C++でつか?

struct sockaddr_in sadd;

sadd.sin_family = AF_INET;



62 :デフォルトの名無しさん:2005/11/08(火) 00:02:33
いきなりmainに現れたこの構造体みたいなの

構造体風なのに、中身が何処にも書かれていません!

63 :デフォルトの名無しさん:2005/11/08(火) 00:03:12
socket

64 :デフォルトの名無しさん:2005/11/08(火) 00:04:31
ライブラリの構造体やクラスがでてくるたびに一々そんな風に驚くのか?

65 :デフォルトの名無しさん:2005/11/08(火) 00:04:44
socket.h

つーか、スレ違い。

66 :デフォルトの名無しさん:2005/11/08(火) 00:04:49
>>61
Cでも通りそうですね。ソケットライブラリ関連でしょうか。

67 :デフォルトの名無しさん:2005/11/08(火) 00:07:10
>>64
C++のクラスのように思えたンでつよ

68 :デフォルトの名無しさん:2005/11/08(火) 00:15:13
えらいねー (ぱちぱち

69 :デフォルトの名無しさん:2005/11/08(火) 00:15:48
ブリブリブリブリィィィ

70 :デフォルトの名無しさん:2005/11/08(火) 00:18:49
今日も大漁です

71 :デフォルトの名無しさん:2005/11/08(火) 01:47:48
bisonでの構文解析器にプログラム内から文字列を渡すには
どうすればいいんでしょうか

72 :デフォルトの名無しさん:2005/11/08(火) 02:00:42
ちなみに字句解析器をflexで作ってます
どちらかというとこっちのyylexに文字列で渡せればいいんですが
FILE*型yyinに文字列を与える方法がよくわかりません

fprintf(yyin,"hello");

としたら実行時エラーになりました

73 :デフォルトの名無しさん:2005/11/08(火) 02:11:14
>>72
プログラム内からパーサに渡す、の意味がわからないが、字句解析側からパーサに渡すという意味ならyylval。
yyinは入力ですぞ(デフォルトでstdinが入ってる)。

つーかむしろ標準Cでないのでスレ違いかな

「コンパイラ・スクリプトエンジン」相談室8
http://pc8.2ch.net/test/read.cgi/tech/1131273918/

Bison、Flexについて語ろう
http://pc8.2ch.net/test/read.cgi/tech/1131293088/
(↑このスレどうなん?)

74 :デフォルトの名無しさん:2005/11/08(火) 02:22:28
>>73
どうもありがとうございます
そんなスレがあるとは知りませんでした、と思ったら最近たったようですね

すいませんプログラム内からパーサに渡すというのは間違いですね
レクサに渡したいのです
つまり標準入力からではなく、たとえば
char* w = "hello"としてこれを対象に
字句・構文解析させたいわけです

yylvalというのはパーサ側のレセプタですよね


75 :デフォルトの名無しさん:2005/11/08(火) 02:27:59
すいません、質問です。
区間[-0.01,0.01]の一様乱数を発生させるにはどうすればいいでしょうか。
既出だったらごめんなさい。

76 :デフォルトの名無しさん:2005/11/08(火) 02:36:19
どの程度一様か精度を要求してるの?
じゃないんだったら
(double)rand()/(double)RAND_MAX*2.0-1.0

とか?

77 :デフォルトの名無しさん:2005/11/08(火) 02:46:50
>>76
それだと最大でも-0.5じゃね?

78 :デフォルトの名無しさん:2005/11/08(火) 02:48:04
いや[-1.0:1.0]だな

79 :デフォルトの名無しさん:2005/11/08(火) 02:50:20
>>74
いや、上の方のスレは前々からあるんだが。

ちなみに文字列をflexのyyinに渡すってのはちと難しいんで内科医?
文字列をファイルに書き出すか、自分でyylex書く(もしくはflexの出力を細工する)か、自分でFILE構造体を用意してバッファの末尾にEOFくっつけてyyinに渡すという変態的な方法を使うか。

80 :デフォルトの名無しさん:2005/11/08(火) 02:52:17
>>78
すまん、寝ぼけてるのか演算子の優先度を取り違えてた

81 :デフォルトの名無しさん:2005/11/08(火) 02:55:46
>>79
そうでつか・・・
flexも万能ではないですね・・・
吐き出すコードはおおよそ人外のものですし

でもいったん文字列をファイルに書き出して、というのは
作成するプログラムの性格に沿うものでもあるので
その線で言ってみます

助言、ありがとうございました

82 :デフォルトの名無しさん:2005/11/08(火) 03:02:09
以前yylexをC++モードで生成すると
ストリームを使えるから自在にディレクティブできるが
bison側がC++に対応してないのであぼーん

というのを見た気がする

83 :79:2005/11/08(火) 03:14:31
>>82
たしかに、C++のストリーム使えたならstringstreamとかで文字列→ストリームの変換が楽にできたのにね。
つーかCで文字列からストリームに変換みたいなのって何かうまいやり方あったりするのかな。
74みたいに文字列を入出力バッファとみなしてFILE*で渡したい、みたいな場合。
もしそういうの誰か知ってたら参考までに聞いておきたい。

84 :デフォルトの名無しさん:2005/11/08(火) 03:31:29
flex は C++ 用のコードも吐けるが、それじゃダメなのか?
C++ を知らんでも、それ以外の部分をほとんど C 風に書けば問題ないと思うが。

85 :デフォルトの名無しさん:2005/11/08(火) 04:10:33
BisonがC++に対応してないからな。
・・・と思ったら、yylexのラッパでうまくいくみたいね。
http://kentn.at.infoseek.co.jp/cpp/parser.html

まあ移植性なんかの問題でCしか使えないとか、個人的な趣味でC++使いたくないとか色々事情もあるんでない?

86 :デフォルトの名無しさん:2005/11/08(火) 15:36:03
メモリ上のバイト列や文字列をファイルストリームに見立てるって関数あった気がするが。
fmemopen()とか。

87 :デフォルトの名無しさん:2005/11/08(火) 19:31:24
>>86
BSDだとfunopen()のような関数がある。が、移植性は全く無い。

とりあえず、lexの変種によって文字列から読ませるためのやり方は全く違うようだ。
flexの場合は、YY_INPUTマクロの再定義でいけるらしい(今でもそれでいいかどうか
は知らない)。
いずれにせよPOSIXでは入力元を変更するための方法が定義されていないので、
完全に処理系依存の話になるな。


88 :デフォルトの名無しさん:2005/11/09(水) 22:07:04
CSVファイルを読み込んで処理するプログラムを組むことに
なったのですが、1バイトづつカンマを探しながら項目を取得するのと
strtokのような関数を使って項目を取得するのではどっちが一般的
なんですか?また、動作環境はUNIXサーバ(Solaris)でかつCSVデータも
住所録などの2バイト文字を扱うことになるので、文字コードで
注意すべきことはあるでしょうか?


89 :デフォルトの名無しさん:2005/11/09(水) 22:12:41
>>88
やるべきことを机上でまとめてみる
見つかった論理のうち標準関数で置き換えられるものを置き換える
ただし、信頼性にはレベルがあるので、もちろん基準を満たさないものは使わない

90 :デフォルトの名無しさん:2005/11/09(水) 22:38:59
カンマを含むデータをどうするかによるな。

91 :デフォルトの名無しさん:2005/11/09(水) 22:44:50
クォートとカラム内改行の両方を扱うとなると結構面倒だな
まあがんがれ


92 :デフォルトの名無しさん:2005/11/09(水) 22:48:57
処理は単純に住所録テーブルに項目ごとに格納するだけの予定です。
データ項目数は固定で、項目には必ずなんらかの値が入っていることが
前提です。最低限のチェックとしては項目長のチェックはやるつもりです。

93 :デフォルトの名無しさん:2005/11/09(水) 23:37:02
既出だと思うが、CSVのライブラリはある。
プログラミング書法だったかプログラミング作法だったかに載っている。
ソース内の著作権表示をきちんとのこしておけば商用、非商用問わず無料でつかえる。

94 :デフォルトの名無しさん:2005/11/09(水) 23:48:10
ようするに、一般に言うCSV形式をちゃんと扱おうには、それなりに
手間が必要で、カンマを探したりstrtok程度の関数では力不足、
発想(質問)自体が一般的でない… (制限を明確にした準(?)CSVなら
ともかく。だからライブラリ探せと)
文字コードに関しては、まずは特にはCSVに限らない話そのままで…


95 :デフォルトの名無しさん:2005/11/10(木) 03:11:05
住所録のデータは実はCSVにしづらかったりする
データ中に","が出てくる可能性があるからね

96 :デフォルトの名無しさん:2005/11/10(木) 03:22:30
>>95
何か問題でも?

97 :デフォルトの名無しさん:2005/11/10(木) 04:46:01
パソコンの部品データもCSVにすると泣けるんだよね。
なんでこう、'"'のエスケープの仕方が複数あるんだろ。

98 :デフォルトの名無しさん:2005/11/10(木) 05:17:22
CSVの書式を標準化しる……と思ったけどそれはXMLなのか?


99 :デフォルトの名無しさん:2005/11/10(木) 05:32:15
CSVのクォーティングのハンドリングが面倒なだけなら、通常はTSVで十分
まータブだの改行だのには対応しとらんがな

100 :デフォルトの名無しさん:2005/11/10(木) 10:30:16
http://www.rfc-editor.org/rfc/rfc4180.txt
標準化されてますが

212 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)