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

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

C言語なら俺に聞け(入門篇) Part 47

1 :デフォルトの名無しさん:2009/03/27(金) 02:16:57
C言語の*入門者*向け解説スレッドです。
初心者、初級者の方は他の質問スレのほうが良いかもしれません。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
 C/C++の宿題片付けます 124代目
http://pc12.2ch.net/test/read.cgi/tech/1235927586/
もしくは
 C/C++の宿題片付けます 125代目
(現時点でまだ立っていません)

・C++言語はスレ違いですが、ある程度なら対応です。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 46
http://pc12.2ch.net/test/read.cgi/tech/1235918203/

過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

2 :デフォルトの名無しさん:2009/03/27(金) 02:24:39
1 >> otu;

3 :デフォルトの名無しさん:2009/03/27(金) 02:39:24
ttp://ja.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD
ttp://ja.wikipedia.org/wiki/%E3%83%AD%E3%82%B7%E3%82%A2
ユーラシア大陸の広範囲を領土とする国の人口をご覧頂こう。
それでも中国は建前でも10億以上。もっとも、正確な調査のもとで得られた報告かは知らんが。
地球上に60億人はいるとされる人間。6人に1人は中国人?母国語以外に
英語をマトモに話せる人がどれだけいると?今やネットでは英語は普通に見かけるが
日常会話でマトモに使える人がどれほどいるか?しかし、全く知らない人は少ないだろう。

ttp://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%8A%E3%83%80
ttp://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%A1%E3%83%AA%E3%82%AB
ttp://ja.wikipedia.org/wiki/%E3%82%A4%E3%82%AE%E3%83%AA%E3%82%B9
ttp://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%82%B9%E3%83%88%E3%83%A9%E3%83%AA%E3%82%A2
これらの国々の人口を合わせても・・・一部は、移住してきた民族が多くを占める州もある。

これらをもとに、果たして英語が一番使われている言語と言えるのだろうか?

4 :デフォルトの名無しさん:2009/03/27(金) 02:52:00
>>3
まずお前の日本語をなんとかしてくれ。

5 :デフォルトの名無しさん:2009/03/27(金) 02:54:05
そもそも自然言語の使用頻度とプログラミング言語には直接の関係は何も無いし
ましてCに関係のある話ではありえない

6 :デフォルトの名無しさん:2009/03/27(金) 02:56:13
localeが"C"ってことで。

7 :デフォルトの名無しさん:2009/03/27(金) 02:56:21
ttp://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%89
そして、何かと数学では話題になるインドも10億以上。
確かに英語は日常的に使われる。しかし、用いている人が
日常会話で使っているだろうか?Can you make yourself understood in English?

8 :デフォルトの名無しさん:2009/03/27(金) 03:00:26
ttp://ja.wikipedia.org/wiki/%E5%9B%BD%E3%81%AE%E4%BA%BA%E5%8F%A3%E9%A0%86%E3%83%AA%E3%82%B9%E3%83%88
こちらを先に出しておくべきだった。まぁ、そういうことで、プログラム言語で
英語を使っているからって視野が狭くなってはいかんよ、ワトソン君。
プログラミングに於いても柔軟な考え方は必要だよ?思い込みや一方向から
物事を見るだけでは不十分なのですね、ポワロ殿。そうさ、ミス・レモン。

9 :デフォルトの名無しさん:2009/03/27(金) 07:16:06
>>8


10 :デフォルトの名無しさん:2009/03/27(金) 10:13:03
先にだすべきは「ネイティブスピーカーの数が多い言語一覧」じゃないだろうか
つか使ってる人の数の多さよりも
使ってる文字の少なさの方が重要だと思うけど

11 :デフォルトの名無しさん:2009/03/27(金) 12:09:58
C作文、C文解釈の授業ですか?

12 :デフォルトの名無しさん:2009/03/27(金) 14:19:37
wiki貼り付けるだけのアホは日本語すらまともに使えてないがw

13 :デフォルトの名無しさん:2009/03/27(金) 18:47:05
コンテナってないのけ?
自作しかない?

14 :デフォルトの名無しさん:2009/03/27(金) 20:18:38
アク禁で遅レスだが前スレ>>921

srand(5000)のとき黒が(5,6)に打ったあと発生。
白手番だが、次々手番で打つ場所がなくなるため評価値がINT_MINになる。
次のifが(cur>max)と">"なので、その座標がmainに帰されず、前回の黒手番と同じ座標に打とうとする。

cur>=maxにすればとりあえず回避はできる。(ただしmin-max法としては間違っている。)
 1)min-max計算中にもパス判定が必要
 2)相手が打てなくなってもそれが最良手とは限らない

15 :デフォルトの名無しさん:2009/03/27(金) 23:49:17
なんか難しい方のスレで聞いちゃったみたいだからこっちで聞きなおしますね。
それにしても初心者スレって沢山あってどこで聞けばいいか良く解らないけどここにする。

C言語は上から順番に処理されるんだよね。
そうすると、割り込むみたいなことは許されないんだよね?
例えばfor文のループ中にキーを押したらそのときのtimeを取れるみたいなのは無理?
for( )
・・・・・・・・・
if(getchar

見たいなのじゃなくて、for文でゲームみたいなの動かしたいんだけど、
その途中でどんな途中でもtimeが取れるみたいなことは出来ないですか?


16 :デフォルトの名無しさん:2009/03/27(金) 23:51:31
>>15
うるせえよ
3つものスレにマルチしてんじゃねーよ

17 :デフォルトの名無しさん:2009/03/27(金) 23:51:45
>>15
_beginthreadex

18 :デフォルトの名無しさん:2009/03/27(金) 23:57:16
馬鹿の一つ覚えのスレ立てだけはやめようなw

19 :デフォルトの名無しさん:2009/03/28(土) 00:11:47
>>15
_kbhit()


20 :デフォルトの名無しさん:2009/03/28(土) 01:00:08
>>4
あぁ、日本語が通じない馬鹿か、失せろ。お前の知能をどうにかしろw
お前が理解できないのは日本語もそうだが、内容もだろ?
そう、言葉は意味を理解してこそ理解に繋がる。
意味も知らずに子供が罵詈雑言や下品な言葉を使うのは、相手の反応で
楽しんでいることもあるが、大人になろうがそうでなかろうが、意味が理解できる人で
まともな知性の人は、まずお前みたいな稚拙な反応はしない。

21 :デフォルトの名無しさん:2009/03/28(土) 01:04:30
スレ違い
失せろゴミ

22 :デフォルトの名無しさん:2009/03/28(土) 01:05:31
12 名前:デフォルトの名無しさん 投稿日:2009/03/27(金) 14:19:37
wiki貼り付けるだけのアホは日本語すらまともに使えてないがw

↑こいつはwikiの内容が事実無根と言いたいんだろうけど、中には
主観的なことを書いている奴もいるからな。あくまでも参考までにだ。
事実無根、反することがあれば、どうぞそれに対して指摘をどうぞ。
とにかく、この世の人口なんて統治されていない国、紛争地帯では
実態が把握し辛いのが現状。自分が知った、思ったことが真実だと思うなってことだ。

で、英語が一番?だと思いたいんでしょ。母国語としてという話ではなくても
自分も英語圏以外の人と話すときは、何かと英語が用いられるけどな。
もう10年以上、大学の専攻分野の関係上、インターネットを使い続けているが
アクセス制限をしていないのであれば、国境のない世界に、今こうして我々が
日本人が多く集まるコミュニティーで日本語を当たり前に見かけるとは言え
表示できる文字もPCの環境で違うとはいえ、PCの基本部分は何かと英語が
使われているからね・・・

23 :デフォルトの名無しさん:2009/03/28(土) 01:10:17
では、日本語”すら”まともに使えていないというその理由は?
ご自分はどうなの?間違った言葉は一度も使ったことがない?
結局、思想にまで話が及ぶから、それ以上言いたくないんだろ?
そう、言葉には人間性が露呈していますからね。お前みたいに
まともに使えないと相手を見下す言動を平気でする。
そもそも、こんな場所に畏まった、出版するような文章の記述をしろと?

24 :デフォルトの名無しさん:2009/03/28(土) 01:13:49
マジキチw

25 :デフォルトの名無しさん:2009/03/28(土) 01:13:53
話し言葉と書き言葉の違いも知らないとは・・・余程日頃、話し言葉を
使っていないんだな。孤立しちゃったタイプ?そういうのは必ずと言って良いほど
情報弱者とも言える発言をするよね。独りよがり。別に自分に対して直接
話を掛けてこられたわけでもないのに、何かと気に入らないものを見ては
それに対して反発したり、物申したりする。あんたがどこの誰かなんて俺は知らない。
逆に、あんたも俺のことは知らないだろう。もしかすると、たまたま過去の知り合いだったら
それはそれで面白いが、2ちゃんねるなんて不特定多数の人が来る場所だしね。
オフで会う人もいるしね。けど、俺はお前を知らない。戸籍があり特定できる個人だろうと
世間一般では知られていない人は多い。お前、どこに誰が住んでいるか事細かに知っているの?
それはそれで、ある意味ストーカーよりすごいだろうね。

26 :デフォルトの名無しさん:2009/03/28(土) 01:21:45
こいつがキチガイなのは昔っから
スレ違いだというまっとうな指摘には一切反応しないのも昔っから


27 :デフォルトの名無しさん:2009/03/28(土) 01:22:08
長文を書かない人がほとんどだから、長文ウザってなるんでしょ?別にこちらは
あんた個人を特定して読めとも指図、強要はしていない。しかし、こちらも
間違っていない事実を述べているのに、それに対して反論されたらどうにもならん。
資料を提示しても、その資料が捏造だって言い出すんだろう?
では、捏造だという証拠を提示し賜え。自分がそう思わない=捏造とは限らんよ。
また、捏造した場合、事実無根の内容として後で判明するだろう。

そもそも、ここはワープロソフトに記述している正式な文章でもない。
形式ばったものしかこの世には存在しないとでも?

28 :デフォルトの名無しさん:2009/03/28(土) 01:36:22
間違い、不適切な箇所があるなら指摘し賜え。しかし、それをした時、間違いでも
不適切でもない部分を指摘してしまった時、自分の立場が悪くなるんだよね。
ありがち。前に句読点について指摘されたことがあるが、ではどこが?と訊ねたら
間違いではない箇所を指摘して墓穴を掘った人がいて、その後そいつは
何も言い返してこなくなった。自分が気に入らないだけでしょ?
間違いがあるなら、それは基準があってこそ。その基準が自分では曖昧。
客観性のある基準を提示すべき。要は目立つ奴が気に入らないんだろ?
こちらは名無しで別にコテハンを名乗ってないんだから、目立たない無名だよ?w

高学歴だろうと全知全能で森羅万象を知り尽くした人などいない。限りある命、己も
この世の一部のみを知り、そして後世に受け継ぐ。しかし、知らなくても良いことはある。
そう思うのもまた自分だ。知らないくせに知ったような口を聞いていると分かるのは、
真実を知っている人。資料を提示しても、それすら信用しないなら、もう何も信じるな。
己のみを信じろ。最後は孤立するだろう。

29 :デフォルトの名無しさん:2009/03/28(土) 01:42:01
レスの行数による読まれる確率
1行=100%、2行=100%、 5行=30%、 10行=0.1%


30 :デフォルトの名無しさん:2009/03/28(土) 01:47:48
これは!!!!!!!

31 :デフォルトの名無しさん:2009/03/28(土) 01:55:12
>こちらは名無しで別にコテハンを名乗ってないんだから、目立たない無名だよ?w
ここは笑うところ?

32 :デフォルトの名無しさん:2009/03/28(土) 02:35:33
ポストスクリプトプリンタ以外は全て偽物のプリンタである。
よくありがちなWindows用のプリンタは偽物である。
それらは全て偽物である。

本物のプリンタとは *Linux* で使えるポストスクリプトプリンタの
ことである。

33 :デフォルトの名無しさん:2009/03/28(土) 03:26:44
Macじゃねーのかよw

34 :デフォルトの名無しさん:2009/03/28(土) 03:30:58
Linux用のデバイスドライバを書くのがそんなに難しいのか?

例えばCANON PIXUS iPシリーズはMac用のドライバも出てる

35 :デフォルトの名無しさん:2009/03/28(土) 04:02:18
最近ポストスクリプトプリンタの存在を知って大喜びで自慢してるつもりの低脳相手にすんなよw

36 :デフォルトの名無しさん:2009/03/28(土) 04:14:25
992 名前:デフォルトの名無しさん 投稿日:2009/03/26(木) 23:10:42
世界的には日本語を使う人よりも英語を使う人の方が多い

前スレのこいつが必死なんだろ。日本語よりと比較したら間違いでもないんだが。

37 :デフォルトの名無しさん:2009/03/28(土) 07:22:59
>>28
>間違い、不適切な箇所があるなら指摘し賜え。
http://mira.fc2web.com/n-manner_2.html

38 :デフォルトの名無しさん:2009/03/28(土) 08:00:03
>>29
1行、2行でも長文に挟まれたレスはとばしてしまう

39 :デフォルトの名無しさん:2009/03/28(土) 12:40:42
なんでスレタイも読めないゴミクズが、長々書き込んでるの?

40 :デフォルトの名無しさん:2009/03/28(土) 12:43:02
うん、なんか悔しかったみたいよ。

41 :デフォルトの名無しさん:2009/03/28(土) 13:52:18
int a
printf("%p",&a)

結果↓
0Xbfff30ca

こんなかんじで
1Gのメモリ積んでるPCでも
2Gのメモリ積んでるPCでも
アドレス番地が4バイト分で表示されるのは
なぜなんでしょう?
実際はそんなにないはずですよね?

42 :デフォルトの名無しさん:2009/03/28(土) 13:58:43
4バイト > 2G
だから問題ないと思うが

43 :デフォルトの名無しさん:2009/03/28(土) 14:03:45
>>41
>0xbfff30ca

2Gしか積んでいないのだから0xbfff30caなんてアドレスは存在しないと言いたいのでしょう。

簡単に言うと仮想アドレスだからです。

44 :41:2009/03/28(土) 14:14:37
ありがとうございます
物理メモリとか仮想メモリとか
HDDへスワップさせるとかこういうことだったんですね。
理解が深まりました。

45 :デフォルトの名無しさん:2009/03/28(土) 14:16:08
理解できたのなら、具体的に書いてみよう。

46 :デフォルトの名無しさん:2009/03/28(土) 16:31:09
できれば他所でね。

47 :デフォルトの名無しさん:2009/03/28(土) 19:22:04
自分一人なんてこの世の、今では70億人に迫る人口の中の一人に過ぎず
生活スタイルから何まで、集団の中に似た人はいても全員に共通しているわけでもない。
ましてや世界レベルとなれば、同じ国でも地域によってかなり異なることも。
英語が一番?やはりメリケンに洗脳されたか?
あちらは今や、黒人初の大統領。しかし、島国日本に近いのはユーラシア大陸だぞ?
南米のブラジルは言うまでもなく公用語は英語ではないよ?
ただ、どこの国でもPCの基本部分は何かと英語が用いられているようでw
しかし、それはあくまでも日常生活、会話での話ではないんだよ、ホームズ殿。
知らない人からしてみれば、もはや文字、言葉とかではなく記号のようなもの。

48 :デフォルトの名無しさん:2009/03/28(土) 19:49:26
あいかわらす長文なのに中身がなくて、当人のバカさ加減だけが際立つな

49 :デフォルトの名無しさん:2009/03/28(土) 19:56:14
何を言いたいのか当人が分かってないから仕方が無い

50 :デフォルトの名無しさん:2009/03/28(土) 20:03:44
>48-49
そんなこと言ったって、またうざいレスが返ってくるだけだからスルーしろ。

51 :デフォルトの名無しさん:2009/03/28(土) 22:36:43
//相異なる四つの数字の並びを生成して配列xに格納
void make4digits(int x[])
{
int i, j;

for (i = 0; i < 4; i++) {
do {
x[i] = rand() % 10;
for (j = 0; j < i; j++)
if (x[i] == x[j]);
break;
}while (j < i);
}
}

4つの異なる数字を並べる関数なのに開始すると同じ数字が
出てきて困る。一体何なんだろう?

52 :デフォルトの名無しさん:2009/03/28(土) 22:40:19
>>51
< -> <=
< -> <=

53 :デフォルトの名無しさん:2009/03/28(土) 22:41:28
>>52 は忘れてくれ

54 :デフォルトの名無しさん:2009/03/28(土) 22:42:45
>>51
; がいらない

55 :デフォルトの名無しさん:2009/03/28(土) 22:43:41
キーワード:
疑似乱数
srand

56 :デフォルトの名無しさん:2009/03/28(土) 23:02:32
だから単文でも{}で括れと
バグの発生を抑えたいなら

57 :デフォルトの名無しさん:2009/03/28(土) 23:17:15
>>54
>>56
ありがとうございますた。集中力がなさすぎだな

58 :デフォルトの名無しさん:2009/03/28(土) 23:28:16
前スレで&(アドレス演算子)は配列名に付けられないと書き込んだが
付けられると訂正する
※検証結果は後述

ただMSDNでは以下のように記述されている

ttp://msdn.microsoft.com/ja-jp/library/caaw7h5s.aspx
The address-of operator can only be applied to variables with fundamental, structure,
or union types that are declared at the file-scope level, or to subscripted array references.

MSDN ライブラリ Visual Studio 6.0
アドレス演算子を使えるのは、ファイル スコープ レベルで宣言されている基本型、構造体型、
共用体型の変数、または添字付きの配列参照に限られます。

59 :デフォルトの名無しさん:2009/03/28(土) 23:31:58
// VC++6.0 SP6
#include <stdio.h>

void main()
{
char ac[10];
char *pc1;
char (*pc2)[10];

pc1 = ac;
pc2 = ∾
printf("%p %p\n", pc1, pc2);
}

・実行例
0012FF78 0012FF78

&無しと&付きは共に配列の先頭アドレスを指すのだが
何が違うかといえば「データ型」が違う

60 :デフォルトの名無しさん:2009/03/28(土) 23:41:10
// VC++6.0 SP6
#include <stdio.h>

void main()
{
char ac[16];
char *pc1;
char (*pc2)[16];

pc1 = ac; pc2 = ∾
printf("%p %p\n", pc1, pc2);
pc1++; pc2++;
printf("%p %p\n", pc1, pc2);
}

・実行例2
0012FF74 0012FF74
0012FF75 0012FF84

ポインタをインクリメントしてみるとデータ型の違いが明らか

61 :デフォルトの名無しさん:2009/03/29(日) 00:08:35
char (*pc2)[32];
pc1 = ∾ pc2 = ∾

warning C4047: '=' : 間接参照のレベルが 'char *' と 'char (*)[16]' で異なっています。
warning C4048: 'char (*)[32]' と 'char (*)[16]' で配列の添字が異なります。

・実行結果
0012FF74 0012FF74
0012FF75 0012FF94

ソースを少しいじってみたが警告は出るもののコンパイル可能
特にchar*への代入は&無しでも&付きでもアドレス自体は同一で
挙動にも異常はないため「&あってもなくても同じじゃん」と認識されるやもしれぬ

62 :デフォルトの名無しさん:2009/03/29(日) 00:32:50
MSDNが間違ってるだけじゃないか

63 :デフォルトの名無しさん:2009/03/29(日) 00:51:10
マニュアルが間違ってるのはよくあること(そしてそれが放置されるのも)

pc1 = (char*)∾

は厳密に言えば正しくないのだが、警告も出ず正しく見えてしまう罠

64 :デフォルトの名無しさん:2009/03/29(日) 02:38:16
ttp://kmaebashi.com/programmer/pointer.html

配列→ポインタの読み換え
式の中では、配列は「先頭要素へのポインタ」に読み換えられる。

int a[10];
の時、式の中では、a と &a[0]は同じ意味となる。
ただし、以下の個所は例外である。

1.sizeof演算子のオペランド
sizeof演算子は、ポインタのサイズではなく、配列自体のサイズを返す。

2.& 演算子のオペランド
& 演算子は、配列全体のアドレスを返す。
配列から読み換えられたポインタは左辺値を持たないため、 & 演算子のオペランドにはならないはずであるが、
この例外規則のため、 & でアドレス(配列の先頭要素のアドレスではなく、配列全体のアドレス)が 取得できる。
この規則は初心者を混乱させることがある (例えば scanf("%s", buf) でなく、scanf("%s", &buf)と書いても
正常に動いてしまう(正常に動いたように見えてしまう)が、 メリットは今ひとつわからない。

3.初期化時の文字列リテラル
char の「配列」を初期化する場合の文字列リテラルは、 中括弧内に文字を区切って書く初期化子の省略形である。
char の「ポインタ」を初期化する場合の文字列リテラルとの 違いに注意すること。

65 :デフォルトの名無しさん:2009/03/30(月) 16:10:36
SDLでゲームを作るにあたり参考になるサイト、書籍などオススメのものはありますか?


66 :デフォルトの名無しさん:2009/03/30(月) 18:38:35
>>65
参考になるサイト:http://pc11.2ch.net/test/read.cgi/gamedev/1141126812/
要は板違い。

67 :デフォルトの名無しさん:2009/03/30(月) 19:59:37
test

68 :デフォルトの名無しさん:2009/03/30(月) 21:18:12
SDLって何だ?

Service Description Language
Microsoft社が提唱していた、Webサービスの機能を記述する言語。
引数・戻り値・処理内容などを記述する、XMLベースの言語である。現在はSCLに吸収され、さらにSCLはWSDLに吸収されている。

…初めて聞いたけど、XMLベースならとにかくC系言語ですらなさそうだな。

69 :デフォルトの名無しさん:2009/03/30(月) 21:19:48
>>68
SDLでググって一番上みれ

70 :デフォルトの名無しさん:2009/03/31(火) 01:10:13
Simple DirectMedia Layer
じゃあSDMLじゃないのかという突っ込みは無し。

71 :68:2009/03/31(火) 21:15:17
>>69-70
素で間違ってた。
よーするにライブラリの1つなのか。

72 :デフォルトの名無しさん:2009/04/01(水) 01:07:27
typedefについて教えて下さい。
解析をしていまいちピンとこなかったので。

SIGNALKIND Kind;
PROCESS PId;
unit16 Chcnt;

上記の三つの変数はtypedefで作成した型です。
実際はSIGNALKIND=unsigned long、PROCESS=unsigned long、
unit16=unsigned shortです。なぜ、わざわざこのようなことをするのでしょうか?

実際ソースではシグナルの構造体のメンバの一つとしてに使われております。

typedef struct Request_Signal
{
SIGNALKIND Kind;
PROCESS PId;
unit16 Chcnt;
}Request_Signal;

よろしくお願いします。

73 :デフォルトの名無しさん:2009/04/01(水) 01:11:49
>>72
組み込み型にtypedef する理由は
分かりやすくする、後で実際の型を変更できる
というのがあります

74 :デフォルトの名無しさん:2009/04/01(水) 01:20:25
>>72
>>73の説明で良いだろうが、要は#define MAX_NUM (100)とかするのと同じ発想。


75 :72:2009/04/01(水) 01:24:18
>>73
早速のレスありがとうございます。
今度、自分も型を作成し構造体を定義しなければならないのですが、
どのようなことを考慮して定義すべきでしょうか?
実際、定義すべき構造体は、

用途:文字データ送信のシグナル構造体
メンバ:データの種類・データ文字数・文字データ


76 :デフォルトの名無しさん:2009/04/01(水) 01:30:32
>>75
実際のデータ型を隠蔽するのが目的だから、メンバの意味を表現する型名として、
またそこに入れる値もなるべくならenumか#defineでシンボル化する
あとは名前空間を汚染しないようにすること

77 :72:2009/04/01(水) 01:38:56
>>76
ありがとうございます。

>実際のデータ型を隠蔽するのが目的だから
ということは、構造体定義ヘッダと型定義ヘッダは分けたほうがよいのでしょうか?
そういう話ではない?

78 :デフォルトの名無しさん:2009/04/01(水) 07:43:11
unsigned 〜をtypedefするのはタイプがめんどいからだと思う

79 :デフォルトの名無しさん:2009/04/01(水) 09:15:32
すいません。
forを使って%cで一つずつhenkan[5]の中身を出力すると上手くいくのに、
それ以外だと " ollehフフフフフフフフフフフhello "と出力されてしまい上手くいきません。
何が原因なんでしょうか?

#include <stdio.h>

main () {
int i,j=4;
char mojiretu[] = "hello";
char henkan[5];

printf("mojiretu = %s\n",mojiretu);
printf("文字を変換します\n");
for( i=0; i<=4;i++,j--) {
henkan[j] = mojiretu[i];
}
for( i=0;i<5;i++){
printf("%c",henkan[i]);
}
printf("\n\n");
puts(henkan);


return 0;

}

80 :デフォルトの名無しさん:2009/04/01(水) 09:28:36
mojiretu[0]='h';
mojiretu[1]='e';
mojiretu[2]='l';
mojiretu[3]='l';
mojiretu[4]='o';
mojiretu[5]='\0';

henkan[0]='o';
henkan[1]='l';
henkan[2]='l';
henkan[3]='e';
henkan[4]='h';

char henkan[6]; と宣言し
henkan[5]='\0'; が必要

81 :デフォルトの名無しさん:2009/04/01(水) 09:29:08
>>79
henkanが '\0' 終端していない。


82 :デフォルトの名無しさん:2009/04/01(水) 09:30:47
>>79
変換先の文字配列のhenkanが終端文字でターミネイトされていないから。
henkanの5番目の要素はそのプログラムでは未初期化。

83 :デフォルトの名無しさん:2009/04/01(水) 09:32:52
あーすまん。helloで5文字か。
>>80の言う通りhenkanは6要素必要だ。

84 :デフォルトの名無しさん:2009/04/01(水) 09:39:34
// 見本
#include <stdio.h>
#include <string.h>

int main()
{
char mojiretu[] = "hello";
char henkan[256];
int len;
int i;

printf("mojiretu = %s\n", mojiretu);
len = strlen(mojiretu);
for (i = 0; i < len; i++) {
henkan[len - 1 - i] = mojiretu[i];
}
henkan[len] = '\0';
printf("henkan = %s\n", henkan);
return 0;
}

85 :79:2009/04/01(水) 09:43:37
\0 が入っていなかったのが原因ですね。
ありがとうございました。

86 :デフォルトの名無しさん:2009/04/01(水) 12:44:45
すいません。
文字列の中から特定の単語を検索するようなものを作ったんですが、上手くいかないんです。
検索する文字列と単語を日本語でなくって英数字にすると上手くいくんですけど
どうしたらいいのでしょうか?

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

main () {
int i,j=0;
char mojiretu[] = "あいうえおかきくけこ"; //検索される文字列です
char kensaku[] = "おか"; //検索する単語です

printf("文字列の中から、「おか」という単語を検索します\n");

for( i=0; i < strlen(mojiretu); i++) { //文字列の長さの分だけ繰り返します
while ( mojiretu[i] == kensaku[j]) {
j++; //jの値に+1します
}
}
if ( strlen(kensaku) == j ) printf("検索成功\n");
return 0;
}

87 :デフォルトの名無しさん:2009/04/01(水) 12:47:44
2バイト文字だからどうたらじゃね

88 :デフォルトの名無しさん:2009/04/01(水) 12:50:35
strstr 使っちゃダメなの?
(日本語対応というか マルチバイト文字列対応は別においといて)

89 :デフォルトの名無しさん:2009/04/01(水) 13:03:00
英数字だろうと上手くいくような気がしないんだが・・・
whileでjだけ進んでくのはおかしかないか?

90 :デフォルトの名無しさん:2009/04/01(水) 13:09:01
>>89
処理としてはおかしいが
結果としてはif条件を満たす

91 :デフォルトの名無しさん:2009/04/01(水) 13:20:53
char mojiretu[] = "abcdefghijkl";
char kensaku[] = "afl";
でも成功になるような。
char mojiretu[] = "abcdefghijkl";
char kensaku[] = "aaa";
でも成功になるような。

92 :デフォルトの名無しさん:2009/04/01(水) 13:33:54
なんで2回書くの?
なんで2回書くの?


93 :デフォルトの名無しさん:2009/04/01(水) 13:39:00
大事なことは2回書くものだ

94 :デフォルトの名無しさん:2009/04/01(水) 13:48:00
while(mojiretu[i+j] == kensaku[j]) j++;
じゃねーの?

95 :デフォルトの名無しさん:2009/04/01(水) 13:53:23
>>92
別々のことを書いてるのに2回とかw

96 :デフォルトの名無しさん:2009/04/01(水) 13:58:14
>>94
ヒント:釣り餌

97 :86:2009/04/01(水) 14:23:10
>>87
やっぱりそうですよね・・・

>>88
strstrって何だって思ってググってみたんですけどこれ便利そうですね
ありがとうございます

>>89
確かにifでやった方が良かったかもです。

>>91
あ、確かにそうみたいです。直さないと・・・・

98 :デフォルトの名無しさん:2009/04/04(土) 17:16:28
sinとcosなんですけど。
0・90・180・270を渡しても
-1と1が返ってこないです。
バグですか?

99 :デフォルトの名無しさん:2009/04/04(土) 17:20:04
でも、ほぼ1と-1だろ、0.99999...のような。
実数演算は近似計算だから、どうしても誤差からは逃れられない。

100 :デフォルトの名無しさん:2009/04/04(土) 17:22:13


101 :デフォルトの名無しさん:2009/04/04(土) 17:35:19
cos(0)は1だろ

102 :デフォルトの名無しさん:2009/04/04(土) 17:55:16
らじあんでOK

103 :デフォルトの名無しさん:2009/04/04(土) 17:58:27
#include <math.h>しとけって落ちだったりしてw

104 :デフォルトの名無しさん:2009/04/04(土) 18:13:50
>>98
0.0 を渡したらどうなる?

105 :デフォルトの名無しさん:2009/04/04(土) 19:05:20
>>98
初心者のうちはコンパイラのバグという高尚な敵と戦えるような高度なコードは書けないから
自分が間違っていると決めつけた方がいいよ。

g++で
const double PI =3.1415926535;
std::cout << std::sin(0.0) << std::endl;
std::cout << std::sin(90.0) << std::endl;
std::cout << std::sin(180.0) << std::endl;
std::cout << std::sin(270.0) << std::endl;
std::cout << std::sin(0.0 /180*PI) << std::endl;
std::cout << std::sin(90.0 /180*PI) << std::endl;
std::cout << std::sin(180.0/180*PI) << std::endl;
std::cout << std::sin(270.0/180*PI) << std::endl;
としてみたら
0
0.893997
-0.801153
-0.176046
0
1
8.97932e-011(つまり0)
-1
となった。
C言語でも同じだろうな。
要するに技術屋なら 度数法°でなく弧度法radでやれ、ということだ。


106 :デフォルトの名無しさん:2009/04/04(土) 19:08:48
>要するに技術屋なら 度数法°でなく弧度法radでやれ、ということだ。

WWWWW

107 :デフォルトの名無しさん:2009/04/04(土) 19:10:03
>>106
アタマ沸いた?

108 :デフォルトの名無しさん:2009/04/04(土) 19:33:18
windowsの電卓だと度だったよ

109 :デフォルトの名無しさん:2009/04/04(土) 19:35:55
>>108
windowsの電卓は一般ユーザー向けだからだろ。
いやしくも理数系人間を対象にしていたらradだろ。

110 :デフォルトの名無しさん:2009/04/04(土) 19:40:40
>>105,108
「Cライブラリの三角関数系は弧度法を使ってるものが多い」
まではおk。
だが「技術屋なら弧度法を使え」というのはNG
技術屋じゃないことがすぐわかる表現だなw

111 :デフォルトの名無しさん:2009/04/04(土) 20:27:18
>>109
Windowsの電卓にも関数電卓モードがあるだろ

112 :デフォルトの名無しさん:2009/04/04(土) 21:13:32
そもそも関数電卓モードにしか三角関数はないと思われ

113 :デフォルトの名無しさん:2009/04/04(土) 21:14:13
>>110
単位radってとこまでC標準の仕様じゃないの?

114 :デフォルトの名無しさん:2009/04/04(土) 21:15:33
所詮一般ユーザー用の関数電卓なんだろ。

115 :デフォルトの名無しさん:2009/04/04(土) 21:25:43
>>113
ルール違反をした場合はC処理系の仲間はずれにするかも
といった程度の協定事項に過ぎないと思われ

116 :デフォルトの名無しさん:2009/04/04(土) 22:34:36
>>98-115
もうどうでもいいな。議論は出尽くした。終了。


117 :デフォルトの名無しさん:2009/04/04(土) 22:40:21
#include <stdio.h>
main()
{
char *p;
char a = 'A';
char b = 'B';
char c = 'C';
p = &b;
printf("%x : %c\n", p, *p);
p++;
printf("%x : %c\n", p, *p);
}

上は「基礎からのC言語」(内田保雄)という本のプログラムですが
私のPCでコンパイルすると
'c'に代入した値は使われていない(関数main)
'a'に代入した値は使われていない(関数main)
という警告文が出てしまうんですが。



118 :デフォルトの名無しさん:2009/04/04(土) 22:50:00
字面通りの意味だけど。

というか、その本については全然知らないけど「基礎」でそんなことやってしまっていいんだろうか。

119 :デフォルトの名無しさん:2009/04/04(土) 22:55:25
>>115
そのように解釈してくれるユーザーばかりではないから
警告過多なコンパイラが多くなってしまった。
警告が出ないようにコードを修正することはバグを
防ぐという意味では良い結果につながることが多いが
セキュリティーの観点からいろいろと細かいコーディング
ルールを設定している開発現場は多い。
そういった場合に警告が邪魔で仕方が無いので
警告を抑止した結果重大なバグが発生してしまった事例
が少なからずある。

120 :デフォルトの名無しさん:2009/04/04(土) 23:03:18
>>117
警告をどう判断するかは人間しだい
「それは判ってる。コードはそのままで構わない」
「おっとこれはまずい。コードを修正しよう」
お好きなように

121 :デフォルトの名無しさん:2009/04/04(土) 23:08:05
>>117
>>118の言う通り、字面通りの意味だな。
コンパイラが警告文を出してくれるのは親切の意味であり、別に必ずしも従う必要はない。
分かっててやってるならね。
…と思ったら既に>>120が似たような返事してくれてたか。


122 :デフォルトの名無しさん:2009/04/04(土) 23:09:42
度数が許されるのは小中学生までだろwww

123 :デフォルトの名無しさん:2009/04/04(土) 23:10:04
>>119
2chビューアみたいな、
警告あぼーん機能
があったら便利そうでないか?


124 :デフォルトの名無しさん:2009/04/04(土) 23:22:29
あるだろ?

125 :デフォルトの名無しさん:2009/04/04(土) 23:48:06
#pragma warning(disable: 4996)

126 :デフォルトの名無しさん:2009/04/04(土) 23:49:32
>>124
あれ?あるっけ?
個別のプロジェクト毎に好きな種類の警告を簡単に一つずつあぼんしていくのを想定している。
よー分からんが、IDE次第ではあるのかな。


127 :デフォルトの名無しさん:2009/04/04(土) 23:50:33
>>125
個人的にはIDEの設定として欲しいなぁ。
マクロはいやぁん。

128 :デフォルトの名無しさん:2009/04/04(土) 23:56:36
>>119
☆コンパイラの出す警告はそれなりに的をついており
その原因をfixすることはコードの確実性には寄与することが多い。

☆しかし実際の開発現場ではローカルコーディング規約などの
制限から、コンパイラに完全に警告を出さないコードを書くことが
出来ない場合がある。

☆警告は煩いのでオプションで抑止するケースが多いが
このことが本来警告を真面目に受けて対応していれば
回避出来たバグの発生の原因になっているかも

ってこと?

129 :デフォルトの名無しさん:2009/04/04(土) 23:57:31
なるほど,とうとうC/C++もIDEと合体販売しかしなくなったのですね?

130 :デフォルトの名無しさん:2009/04/04(土) 23:59:01
>>129
別にそんなこと言ってないが、そう読めた?

131 :デフォルトの名無しさん:2009/04/05(日) 00:00:17
>>122
技術、特に土木建設関係では度数法が厳然と主流

132 :デフォルトの名無しさん:2009/04/05(日) 00:10:58
>>127
オプションに/wd4996って入れればいいよ

133 :デフォルトの名無しさん:2009/04/05(日) 00:11:00
μm以下の精度が要求される、精密機器の検査装置のステージも、許容θ精度はμ°単位だったり。

134 :デフォルトの名無しさん:2009/04/05(日) 02:35:36
彼女作るにはどうしたらいいんだ


135 :デフォルトの名無しさん:2009/04/05(日) 02:49:21
作るんじゃない
出来るんだ

136 :デフォルトの名無しさん:2009/04/05(日) 04:20:18
#include <stdio.h>
【  1  】      /* 文字列の標準ヘッダーファイルの取り込み */
#define TRUE 1
#define FALSE 0

int passCheck(char *p); /* ユーザー作成関数のプロトタイプ宣言 */

void main()
{
char buff[256];
int cnt, flg = FALSE;

for (cnt=1; 【  2  】 ; cnt++)
{
printf("パスワードは?=> ");
scanf("%s",buff);

flg = 【  3  】 ;

if (flg == TRUE)
printf("パスワードは合致しました。\n");
else
printf("%d回目 入力ワード %s は間違っています。\n",cnt,buff);
}
}


137 :デフォルトの名無しさん:2009/04/05(日) 04:21:42
int passCheck(char *p)
{
static char *pass = "MissionC";
int flg;

flg = strcmp(pass,p);

if (【  4  】 )
return TRUE;
else
return FALSE;
}

138 :デフォルトの名無しさん:2009/04/05(日) 04:22:57
1,2,3,4に入る解答を教えてくださいな。

139 :デフォルトの名無しさん:2009/04/05(日) 04:44:27
宿題スレへ
http://pc12.2ch.net/test/read.cgi/tech/1235927586/

140 :デフォルトの名無しさん:2009/04/05(日) 05:13:42
いいから教えてくださいな

141 :デフォルトの名無しさん:2009/04/05(日) 05:20:51
こういう奴が出世遅れるんだよな

142 :デフォルトの名無しさん:2009/04/05(日) 05:26:33
>>141
どっちが出世が遅れる?教わるほう?それとも教えるほう?

143 :デフォルトの名無しさん:2009/04/05(日) 05:28:33
早く教えて


144 :デフォルトの名無しさん:2009/04/05(日) 05:30:10
わかんねーのか?


145 :デフォルトの名無しさん:2009/04/05(日) 06:00:45
ここにいる奴ら全員にきまってるだろ

146 :デフォルトの名無しさん:2009/04/05(日) 06:12:10
>>145 なっとくw

147 :デフォルトの名無しさん:2009/04/05(日) 08:50:00
TRUEとFALSEってどのヘッダーに入ってるのが普通というか
取り込んでれば無難ですかね?

gcc環境下で組んでるんですが、ネットで調べたstdio.hを取り込んでも
使えません・・・

148 :デフォルトの名無しさん:2009/04/05(日) 09:16:53
ないものはないと割り切れ

149 :デフォルトの名無しさん:2009/04/05(日) 09:20:56
ないものはないで割り切ろうとしたら
0 除算エラーになりました

150 :デフォルトの名無しさん:2009/04/05(日) 09:22:41
>>149
そうそう
調べてると環境によって0&1でよくないケースもあるようで
なるべくは自前で入れたくないんですよね・・・

151 :デフォルトの名無しさん:2009/04/05(日) 12:24:10
gccなら<stdboo.h>でbool型のtrue/falseでいいじゃない。

152 :デフォルトの名無しさん:2009/04/05(日) 12:43:43
出来るだけ静的関数にしたほうがいいのけ?
友達に言われたんだが…

153 :136:2009/04/05(日) 12:52:42
いやマジで答えろよ
質問してんだろうが。

154 :デフォルトの名無しさん:2009/04/05(日) 12:54:08
>>153
だからそういうのは宿題スレでお願いしなさい

155 :デフォルトの名無しさん:2009/04/05(日) 12:54:18
>>153
暴言吐くなら鼬害。

156 :デフォルトの名無しさん:2009/04/05(日) 12:55:23
>>152
そうですね。

157 :150:2009/04/05(日) 13:07:14
>>151
わかりました
ありがとうございます

158 :デフォルトの名無しさん:2009/04/05(日) 13:14:35
>>138
【1】以外全部0でおk
【1】は空

べ,べつにあんたの単位なんてどうでもいいんだからね・・・///

159 :デフォルトの名無しさん:2009/04/05(日) 16:49:24
stdboo.h

見苦しくしてまで一文字省略する意味がわからない

160 :デフォルトの名無しさん:2009/04/05(日) 17:04:24
ごめんただのtypo

161 :デフォルトの名無しさん:2009/04/05(日) 17:30:03
標準ブーイング

162 :デフォルトの名無しさん:2009/04/05(日) 17:54:59
スタンド・ブーイング

163 :デフォルトの名無しさん:2009/04/05(日) 20:02:18
ブーイングするためにだけ存在するのか。

164 :デフォルトの名無しさん:2009/04/06(月) 17:57:44
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9016.txt

1000×1000の行列ベクトル積の計算プログラムが課題として出たのですが、デバッグするとよくわからないエラーが出て困っています。

'行列ベクトル積.exe': 'C:\Documents and Settings\管理者\My Documents\Visual Studio 2005\Projects\行列ベクトル積\debug\行列ベクトル積.exe' を読み込みました。シンボルが読み込まれました。
'行列ベクトル積.exe': 'C:\WINDOWS\system32\ntdll.dll' を読み込みました。シンボルが読み込まれていません。
'行列ベクトル積.exe': 'C:\WINDOWS\system32\kernel32.dll' を読み込みました。シンボルが読み込まれていません。
'行列ベクトル積.exe': 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f\msvcr80d.dll' を読み込みました。シンボルが読み込まれました。
'行列ベクトル積.exe': 'C:\WINDOWS\system32\msvcrt.dll' を読み込みました。シンボルが読み込まれていません。
行列ベクトル積.exe の 0x00411ab7 で初回の例外が発生しました: 0xC00000FD: Stack overflow
行列ベクトル積.exe の 0x00411ab7 でハンドルされていない例外が発生しました: 0xC00000FD: Stack overflow
プログラム '[10012] 行列ベクトル積.exe: ネイティブ' はコード 0 (0x0) で終了しました。

;が無いとかで怒られたことはありますけどこういう形のエラーは初めてです。
プログラムを組むのが1年ぶりくらいなので、もしかしたら基本的な見落としをしているのかもしれませんがさっぱり原因がわかりません。
どうかよろしくお願いします。

165 :デフォルトの名無しさん:2009/04/06(月) 18:00:18
>>164
原因は書いてあるそのまま。
Stack overflow

166 :150:2009/04/06(月) 18:04:53
>>164
問題はこれ
int a[1000][1000];
int x[1000];
int b[1000] = {0};

前にもスタックにdoubleの配列を大量に確保しようとしてたやついたな
メモリの確保については教えてくれないのか?>ちぇんちぇえ

167 :デフォルトの名無しさん:2009/04/06(月) 18:07:03
うわw
なんか名前書き込んでもた

168 :デフォルトの名無しさん:2009/04/06(月) 18:34:19
int a[1000][1000]; はintが4バイトだから4x1000x1000で約4メガバイト
exeってなってるからVisualC++あたりと想定して、
デフォルトのスタックサイズは1MBだから、スタックオーバーフローですな。

スタックに置かないか、スタックサイズを大きくするかだな。
自動変数はスタックに置かれる。

169 :デフォルトの名無しさん:2009/04/06(月) 18:35:42
stack size を大きくするか
stack を使わないように static にしたり
動的確保でヒープ領域を使ったり

170 :デフォルトの名無しさん:2009/04/06(月) 18:36:01
static int a[1000][1000];
static int x[1000];
static int b[1000] = {0};

とりあえずはこれでOK?

171 :デフォルトの名無しさん:2009/04/06(月) 18:36:51
staticつけると0クリアしてくれるんだっけ?
static int b[1000];
これでいいか

172 :デフォルトの名無しさん:2009/04/06(月) 19:07:59
static と auto は使い分けだな

auto は関数内でしか使わない変数向き
関数内 static は関数内で静的に確保したいとき
グローバル static はプログラムが動いてる間確保したいとき

本来 auto で確保したいけど stack を無駄に大きくしたくないのであれば
緊急避難的に関数内 static を使うのがいいんジャマイカ

173 :デフォルトの名無しさん:2009/04/06(月) 19:16:01
>>172
で、マルチスレッド対応時に あー ってなると

174 :164:2009/04/06(月) 19:45:33
皆さんどうもありがとうございました。
>>170さんの通りにしたらきちんと動くようになりました。

ところで結果表示の時に701〜999、までしか表示されないのは単に表示行数の問題でしょうか。

175 :デフォルトの名無しさん:2009/04/06(月) 19:57:07
>>174
コンソールアプリだとウインドウが管理できる行数がデフォルトで
決まってるので最後の方の結果だけが残ってる可能性が

コンソールウインドウの設定を変えてログ行数増やすとかしないとだめかな?

176 :デフォルトの名無しさん:2009/04/06(月) 20:11:14
> 本来 auto で確保したいけど stack を無駄に大きくしたくないのであれば

無駄??

177 :デフォルトの名無しさん:2009/04/06(月) 20:38:12
>>175
わかりました。ありがとうございます。
結果の表示はしなくてもいいのでとりあえず無くすことにします。

178 :デフォルトの名無しさん:2009/04/06(月) 20:47:42
MSCの頃はスタック最大で64KBしか取れなかったけどさw

179 :デフォルトの名無しさん:2009/04/06(月) 22:44:42
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9017.txt
身長の入力をするとループして先に進めないです
どこが間違っているのか指摘をお願いします

180 :デフォルトの名無しさん:2009/04/06(月) 22:46:43
>>179
1(one)でなくてl(ell)

181 :デフォルトの名無しさん:2009/04/06(月) 22:50:02
>>180
!!
ありがとうございます。目が疲れていたようですw

182 :デフォルトの名無しさん:2009/04/06(月) 22:59:33
scanfでdouble型を受け取るときは%lf
これ常識

183 :デフォルトの名無しさん:2009/04/07(火) 00:44:25
>>182
%le とかもあるがな

184 :デフォルトの名無しさん:2009/04/07(火) 10:24:37
>>178
デフォルトだと2KBだったよねえ

185 :デフォルトの名無しさん:2009/04/07(火) 12:26:03
手元にあるQuickC Ver.2.0の入門書で確認したらデフォルト2KBだった
スタックオーバーフローしたら無闇に増やすより
真っ先にスタックから静的変数領域に追い出したな

186 :デフォルトの名無しさん:2009/04/07(火) 13:39:02
for(;;){
printf(":");
if((command = getchar()) == 'a')
addlist();
else if(command == 'b')
delete();
else if(command == 'c')
showlist();
else if(command == 'q')
exit(0);
else
puts("Illegal command");

puts("");
};

上記はmain関数内の繰り返しで、結果が以下のように出力されます。

******************************************************** <---ここから
:a <---for(;;){}内のプロンプトが表示されaddlist()を実行した
>34 <---addlist()のプロンプトが表示され34を入力した

:Illegal command <---ここが原因のわからない表示

: <---addlist()実行後に復帰してfor(;;){}内のプロンプトが再び表示される
******************************************************** <---ここまで
実行環境:cygwin gcc versin 3.4.4

どうやら実行後に復帰したプロンプトが表示される前に、一回多く繰り返しを行っているようなのですが、
なぜ繰り返しが起こるのか、原因の見当がつきません。
このようなことが起こる原因がわかる方がいたらどうぞ教えてください。

187 :デフォルトの名無しさん:2009/04/07(火) 13:51:15
ttp://ja.wikipedia.org/wiki/Scanf
scanfの問題点と回避方法
改行文字の取り扱い

188 :デフォルトの名無しさん:2009/04/07(火) 15:05:36
>>187
ありがとうございます。
解決しました:-)


189 :デフォルトの名無しさん:2009/04/09(木) 01:35:45
俺の上司、コーディングとデバッグを分けているらしく、コーディング工程の間は一切プログラムの動作確認をしない。
プログラム全体を一気に書き換えた後に、デバッグ工程の俺にプログラムが送られてくるわけだが動作どころかコンパイルすら通らない。
このやり方では確実に見つけにくいバグが紛れ込むと思うんだがこういう手法って一般的なんだろうか。

190 :デフォルトの名無しさん:2009/04/09(木) 01:37:16
>>189
日本はそうやってゼネコンが作ったシステムのまねをして分業化する。
だからIT土方と言われる

191 :デフォルトの名無しさん:2009/04/09(木) 02:32:32
>>189
上司の名前を使って、バグだらけのコードをわざと書いて
デバッグ工程に回すのが吉

それで上司が文句を言ってきたら、「責任を人になすり付ける会社」
としてさっさとその会社に見切りをつけることが吉。

192 :デフォルトの名無しさん:2009/04/09(木) 02:43:42
>191は何をしたいのか判らんが、会社に見切りをつけると言う点では同意。

193 :デフォルトの名無しさん:2009/04/09(木) 03:01:17
>>189
たとえデバッグを他人に押し付けても
自分が一番作った気になれる部分じゃん
本人はそれで満足したいんだよ

194 :デフォルトの名無しさん:2009/04/09(木) 03:57:28
>>189
そもそもコンパイルが通っていないなら、コーディングが済んだとは言えんだろ。

195 :デフォルトの名無しさん:2009/04/09(木) 09:33:48
そもそも普通の会社なら、単体デバッグはコーダーの仕事だ。

196 :デフォルトの名無しさん:2009/04/09(木) 09:34:26
コーダーどころか入力だけならパンチャーレベル

197 :デフォルトの名無しさん:2009/04/09(木) 13:19:52
他所でやれ

198 :デフォルトの名無しさん:2009/04/09(木) 22:46:43
>>189
それで仕事になっているということは、
君がすごいんじゃないか?
普通に考えて、デバッグのがしんどいだろ。
他人のデバッグなんてホントに難しいってか…(ry

199 :デフォルトの名無しさん:2009/04/09(木) 23:00:01
やっぱりうちの会社って普通じゃないんだな…転職考えるか。

200 :デフォルトの名無しさん:2009/04/09(木) 23:23:49
是非弊社に。適職フェアでお待ちしてます。

201 :デフォルトの名無しさん:2009/04/10(金) 02:39:44
御社はプロのデバッガをお望みという事ですね
とても関心いたします

202 :デフォルトの名無しさん:2009/04/10(金) 03:08:25
他人が動作確認もしないで適当に書いたコードを修正できるなら、
最初からその人が書いたほうが早いんじゃねーか?

203 :デフォルトの名無しさん:2009/04/10(金) 03:13:56
>>202
そう思わない駄目上司がいるからIT業界は概ねブラックで
そういうシステムだからこそIT土方と言われるんだし・・・

204 :198:2009/04/10(金) 07:02:09
>>202
俺のレスの
>他人のデバッグなんてホントに難しいってか…(ry
この
…(ry
の部分がまさに君の
>最初からその人が書いたほうが早いんじゃねーか?
だ。同意。

205 :デフォルトの名無しさん:2009/04/10(金) 09:15:37
つまり、そんな阿呆な上司のコードをデバッグできる>189は意外に使えるかもしれないってことか。

206 :198:2009/04/10(金) 17:28:26
>>205
そうそう。
優秀なプログラマだ。

207 :デフォルトの名無しさん:2009/04/10(金) 20:27:13
プロジェクトとして考えたら、他人のプログラムをテストしデバッグすることはよくあること。
コードはプロジェクトの共有物なんだから

208 :デフォルトの名無しさん:2009/04/10(金) 21:26:48
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int sum;
int table[10]={1,2,3,4,5,6,7,8,9,10};
int i;
double ave;
i=0;
ave=0;
sum=0;
for(i=0;i<10;i++)
{
sum+=table[i];
}
ave=sum/10;

printf("%d",ave);


system("PAUSE");
return 0;
}
これをコンパイルして実行しても結果が0にしかなりません。
どこがおかしいのでしょうか?
教えてください

209 :デフォルトの名無しさん:2009/04/10(金) 21:28:48
%dだから?
書式を調べたほうが

210 :デフォルトの名無しさん:2009/04/10(金) 21:29:51
http://www9.plala.or.jp/sgwr-t/c/sec05.html
この辺なんか



211 :デフォルトの名無しさん:2009/04/10(金) 21:32:03
>>208
あと、aveをdoubleにしても、ave=sum/10.0; とかにしないと、少数が切り捨てられる。

212 :デフォルトの名無しさん:2009/04/10(金) 21:38:09
答えてくださった方ありがとうございましたpwq
無事に実行できました。わからなく、モヤモヤしてたので助かりました。
ホントにありがとでした><

213 :デフォルトの名無しさん:2009/04/10(金) 23:08:11
>>210
そこはなかなか読んでダメになるサイトですね。前にも他のページで指摘しているけど、今回はこれを見つけた。
>\' 文字としての ' 2C
asciiの0x2cはいつからシングルクォートになったんだかw

214 :デフォルトの名無しさん:2009/04/11(土) 03:33:18
>>207
こんな理解力の無い奴もプログラマやってんのかな

215 :デフォルトの名無しさん:2009/04/11(土) 11:34:47
>>207 = >>189の上司

216 :デフォルトの名無しさん:2009/04/11(土) 11:36:26
#include <stdio.h>

main(){
int a,b;
scanf("%d",&a);
scanf("%d",&b);

printf("%d + %d = %d",a,b,a+b);
return 0;
}
を実行したとき、数字以外を入力すると
1 + 256 = 257
となります。

数字以外が入力された際、エラーメッセージを表示して再入力を促すようにしたい場合
どうしたらよいでしょうか?

217 :デフォルトの名無しさん:2009/04/11(土) 11:41:43
#include <stdio.h>

main(){
int a,b;
do{
scanf("%d",&a);
scanf("%d",&b);
}while(a<'0'||'9'<a||b<'0'||'9'<b);
printf("%d + %d = %d",a,b,a+b);
return 0;
}

218 :デフォルトの名無しさん:2009/04/11(土) 12:00:50
if (scanf("%d", &a) != 1) {
printf("error\n");
continue;
}


219 :デフォルトの名無しさん:2009/04/11(土) 12:05:09
2chでタブってどうやって入力するの

220 :デフォルトの名無しさん:2009/04/11(土) 12:08:41
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

221 :デフォルトの名無しさん:2009/04/11(土) 15:30:28
scanfで値を受け取って、その値を配列の要素数にしたいときはどうすればいいんでしょうか?
要素数には定数しか使えないと解説書にあったのですが・・・

222 :デフォルトの名無しさん:2009/04/11(土) 15:33:18
malloc

223 :デフォルトの名無しさん:2009/04/11(土) 15:40:34
std::vector

224 :デフォルトの名無しさん:2009/04/11(土) 15:43:59
>>223
スレ違い

225 :デフォルトの名無しさん:2009/04/11(土) 16:01:32
>要素数には定数
あれ?いまどきのCは変数で配列のサイズ確保できたんじゃね?
ttp://seclan.dll.jp/c99d/c99d04.htm#dt19990719

226 :デフォルトの名無しさん:2009/04/11(土) 16:05:15
>>225
C99なら

227 :デフォルトの名無しさん:2009/04/11(土) 16:06:27
>>225
それが使えない環境が広く普及してる

228 :デフォルトの名無しさん:2009/04/11(土) 16:11:21
>それが使えない環境
って何?古い環境で保守、ってこと?

229 :デフォルトの名無しさん:2009/04/11(土) 16:11:44
>>222
ぐぐり方が足りないようでした
DOOMすいませんでした

230 :デフォルトの名無しさん:2009/04/11(土) 16:21:59
>>228
VCが対応していないしな。
いまだに新規開発でもC90を使っているところが多いんじゃないかな。

231 :デフォルトの名無しさん:2009/04/11(土) 16:23:12
VC++2008は古くないと思うな

232 :デフォルトの名無しさん:2009/04/11(土) 16:29:35
というかC自体が・・・

233 :デフォルトの名無しさん:2009/04/11(土) 16:38:45
C++がCの拡張とは言え、C言語はまだ根強く残って使われる。
それだけ使いやすい言語だという事だよ、ワトソン君。

234 :デフォルトの名無しさん:2009/04/11(土) 16:51:01
C99はC++とも相性が悪い。

235 :デフォルトの名無しさん:2009/04/11(土) 20:22:42
>>218
それやったら無限ループだな。

236 :デフォルトの名無しさん:2009/04/11(土) 20:28:31
読み飛ばさないと駄目だな。

それと>>217もひどすぎるw

237 :デフォルトの名無しさん:2009/04/11(土) 20:36:27
scanf()は使うなってアドバイスするのが正解。

238 :デフォルトの名無しさん:2009/04/11(土) 20:38:45
>>216
Cは使うな

239 :デフォルトの名無しさん:2009/04/11(土) 20:44:01
初心者はCを使うべき

240 :デフォルトの名無しさん:2009/04/12(日) 15:14:43
scanfが完全にだめだと思う奴は素人。使い方次第。

241 :デフォルトの名無しさん:2009/04/12(日) 15:23:48
>>240
そりゃまあ使い方次第だが。。。
そんな言い方したらgoto文も同じだよね。

242 :デフォルトの名無しさん:2009/04/12(日) 15:27:39
全然違う

243 :デフォルトの名無しさん:2009/04/12(日) 15:29:13
>>242
どう違う?

244 :デフォルトの名無しさん:2009/04/12(日) 15:49:16
scanfは全く使うべきでないがgotoはそうではない。

245 :241:2009/04/12(日) 15:52:08
>>244
ああ、つまり
君は>>240とは別人だったのか。


246 :デフォルトの名無しさん:2009/04/12(日) 15:55:29
scanf()で悩んでる初心者に、それは使わないほうがいいよって
アドバイスするときに添える理由。

・他の入力関数にくらべて挙動に癖があって初心者には使いにくい。
・がんばって挙動に精通しても実践の場で使うことはほとんどない。

247 :デフォルトの名無しさん:2009/04/12(日) 16:01:07
scanfが使い方次第だと思う奴は素人。完全にだめ。

248 :デフォルトの名無しさん:2009/04/12(日) 16:09:10
scanf()はパンチカード時代の遺物
キーボードとは相性が悪い

249 :デフォルトの名無しさん:2009/04/12(日) 16:12:57
でも入門書にはscanfしか載ってないけど・・・

250 :デフォルトの名無しさん:2009/04/12(日) 16:16:18
>>249
入力と数値の変換を同時にやるから、説明が簡単だっておもっちゃうのかね。
教わる側からすると、エラーリカバリとかやろうとするととたんに難しくなるな。

251 :デフォルトの名無しさん:2009/04/12(日) 16:19:58
>>247
素人乙。お前みたいな固定概念しかない奴は応用力がない。
一生あれもこれも欠点を持ち出して駄目だといい続けてな。
現に、お前が使っている言語もOSさえも、完璧なものはない。

252 :デフォルトの名無しさん:2009/04/12(日) 16:21:21
そもそも、どういった場面でscanfは駄目か?について
まったく説明ができないくせに、駄目だとされるものがあれば
もうそれは駄目。自動車で悲惨な事故が起こる、航空機は墜落したら
大惨事、人間は生きているだけで老化してやがて死ぬから駄目
といっているようなもの。進歩のない奴はいつまでも発展しないまま
情報弱者のくせして知ったかぶりでこの世を去るんだろう。

253 :デフォルトの名無しさん:2009/04/12(日) 16:23:34
完全に駄目なら、それを使っている教本も駄目だな。
リストアップして出版社にクレームをしておけよ>知ったかぶりのscanf駄目厨

254 :デフォルトの名無しさん:2009/04/12(日) 16:23:53
どーでもいいよ
お前ら全員うるせーな

俺はC++大好きっ子だからもうC言語なんてどうでもいい環境なんだよ。
・・・は言い過ぎだけど、scanfが便利だろうが便利じゃなかろうが関係ない環境であることは確か。

255 :デフォルトの名無しさん:2009/04/12(日) 16:28:13
・エラーリカバリがすっきりしない
・バッファの消費が書式文字列に依存して、ほかの入力関数とまぜて使いにくい
・数値のオーバーフローに対応できない
・文字列のバッファーオーバーフローの対応が
書式文字列に定数でバッファ長を埋め来なくてはいけなくて
ださい。(もしくは書式文字列を実行時作成するとか)

256 :デフォルトの名無しさん:2009/04/12(日) 16:32:26
この世に完璧なものはない。strcpyだって危険だが、その説明はできるか?>scanf駄目ぽ情弱素人

257 :デフォルトの名無しさん:2009/04/12(日) 16:35:56
strncpy使えw

258 :デフォルトの名無しさん:2009/04/12(日) 16:39:52
>>256
scanf()がだめな理由を言えって言うのに、それが述べられても反論はしないんだな。

259 :デフォルトの名無しさん:2009/04/12(日) 16:42:30
完璧なものはないかも知れないが、70点と30点には明確な違いがある

260 :デフォルトの名無しさん:2009/04/12(日) 16:45:20
使い方次第って言ってる奴が使い方を全く提示しないのが笑える

261 :デフォルトの名無しさん:2009/04/12(日) 16:46:49
int a[10];
としても添え字でa[10]とかそれ以上の番号を指定できるから
これも駄目ね。使った奴は素人w

262 :デフォルトの名無しさん:2009/04/12(日) 16:50:26
>>261
配列は配列を使う以外の簡単な改善案がない。
scanf()はほかの関数を使えば簡単に解決できる。

263 :デフォルトの名無しさん:2009/04/12(日) 16:52:45
皮肉で言ったつもりなんだろうが例が悪い

264 :デフォルトの名無しさん:2009/04/12(日) 16:53:00
入門書のサンプルでしか使わないような関数だから、がんばって
問題点を克服するより使わないってのが一番簡単な解決策。

265 :デフォルトの名無しさん:2009/04/12(日) 16:56:31
こりゃもうscanfをあぼんするしかないな。
きっとすっきりするぞ。


266 :デフォルトの名無しさん:2009/04/12(日) 17:41:25
scanfは使わないけど、sscanf は使うぞ
初心者は、文字列扱うときにstr系関数を組み合わせて苦労して
複雑なプログラム作るけど、慣れた人なら sscanf ひとつで
済ませられたりする

scanfは使わないけどscanfの書式(とくにスキャン集合)は
知っておくべき

267 :デフォルトの名無しさん:2009/04/12(日) 18:31:40
融通の利かなさはscanf()譲りだがな。

268 :デフォルトの名無しさん:2009/04/12(日) 18:52:07
scanf系が無かったらと思うとゾッとする

269 :デフォルトの名無しさん:2009/04/12(日) 18:53:58
scanf()系で使うのはsscanf()くらいだな。

270 :デフォルトの名無しさん:2009/04/12(日) 18:59:35
scanf厨のキチガイっぷりは凄いな。

271 :デフォルトの名無しさん:2009/04/12(日) 19:33:02
scanfを使うより
fgetsとsscanfをセットで使え

272 :デフォルトの名無しさん:2009/04/12(日) 20:30:06
#include<stdio.h>
2
3 int main(void){
4 struct tag{
5 char str[6];
6 }aa;
7 aa = *(struct tag *)"HELLO";
8 printf("%s\n",aa.str);
9 return 0;
10 }

/*実行結果*/
HELLO

aa = *(struct tag *)"HELLO";の部分が説明を読んでも
何をやっているのかわかりません。
だれか教えてください。

273 :デフォルトの名無しさん:2009/04/12(日) 20:33:51
>>272
そんなしょうもないコード、誰がどこでどんな説明を書いているの?

274 :デフォルトの名無しさん:2009/04/12(日) 20:34:51
>>272
"HELLO" のある領域を構造体だと思って読み出す感じ

275 :デフォルトの名無しさん:2009/04/12(日) 20:34:54
やろうとしてることはわかるけど教材用としてこんなソースよこしたのかな?

276 :デフォルトの名無しさん:2009/04/12(日) 20:44:46
説明できんこともないけど面倒くさいんでパス

memcpy(&aa, "HELLO", 6);
と同等

277 :デフォルトの名無しさん:2009/04/12(日) 20:47:30
>>275
教材のソースです。
文字列は配列なので代入できないが、構造体をつかうとできるということを
説明してあるようなんですが、よくわからないのです。

278 :デフォルトの名無しさん:2009/04/12(日) 20:49:49
カスだな、その教材。そして無視される>273w

279 :デフォルトの名無しさん:2009/04/12(日) 20:53:52
>>277
まあ理解しつつも、心の中ではこんなカス教材よこしやがってと思ったほうがいいねw
いつの時代のPGやねんと

280 :デフォルトの名無しさん:2009/04/12(日) 20:54:18
>>274
>>276
回答ありがとうございました。
ちょっと考えてみます。

281 :デフォルトの名無しさん:2009/04/12(日) 20:56:14
あと宿題スレとかでたまに見るBMPの読み込み関連とかも糞教材だよな
普通つかわねーだろと

282 :デフォルトの名無しさん:2009/04/12(日) 21:01:31
真面目に答えてみるか

aa = *(struct tag *)"HELLO";

「(struct tag *)"HELLO"」はchar*をstruct tag*にポインタ型を変換してる
「*(struct tag *)"HELLO"」はstruct tag構造体として扱われる
「aa = *(struct tag *)"HELLO"」でaaに*(struct tag *)"HELLO"を構造体コピーする

283 :デフォルトの名無しさん:2009/04/12(日) 21:15:51
>>282
丁寧な回答ありがとうございます。
考えてみます。
ところでみなさんとても詳しいですね。専門の方ですか?
あと、こんなにすぐに返答を頂けてとてもびっくりしています。
一週間後にまたここのサイト見れば答えて頂けるかもしれないと思っていました。

284 :デフォルトの名無しさん:2009/04/12(日) 21:22:33
やった事ないので適当なんだけど

typedef char tag_aa[6];
tag_aa aa = *(tagaa*)"HALLO";

は不可?

285 :デフォルトの名無しさん:2009/04/12(日) 21:23:28
>>284
ちょっとやってみます。

286 :デフォルトの名無しさん:2009/04/12(日) 21:23:52
>>284
不可

287 :デフォルトの名無しさん:2009/04/12(日) 22:00:25
>>284
すみません。やるといっておきながら
>>284さんの言っていることがよくわかりません。
本当に申し訳ありません。
答えてくださった方達にはとても感謝しています。
ありがとうございました。

288 :デフォルトの名無しさん:2009/04/12(日) 22:13:23
>>287
あまり2chに慣れていないようだから言っておきましょう。

別にこのスレの事を言いたい訳じゃないけど・・・
あくまで2chは2chです。
嘘ついてくる意地の悪いやつも多い情報危険地帯です。
信じるか信じないかはあなた次第です。


289 :デフォルトの名無しさん:2009/04/13(月) 02:02:27
>>288
そんなこと書いたら、お前自身もなかなか意地悪なレスに思えてくるぞw

290 :デフォルトの名無しさん:2009/04/13(月) 08:52:19
2ちゃんに慣れるってどういうこと?そもそも2ちゃんねるって
確かにこの世の全員が閲覧、書き込みをしているわけでもなく
最近では企業や関係者が一般人に紛れ込んでいることもあるが
この世が自分中心に回っていると勘違いしているのか、主観で
他社を否定する基地外が増えている。お前こそこの世の一人に過ぎないと
気づくべき。たとえ大企業の社員でも。GKとか朝日とか思い上がりすぎ。
基地外社員は不祥事がバレて懲戒免職w

291 :デフォルトの名無しさん:2009/04/13(月) 10:39:56
さてと今日も不況かどーか、仕事は一日分この時間で終わって
しまった。時間つぶしにscanf(不毛)論争に油を注ぐとするか...
個人的にはscanf,printf系は消極的に使いたい派
純正UNIX育ちならば積極派だったんだろうな
DOSでCを覚えた世代は消極系だと思う。消極的である理由は
ライブラリの規格に過ぎないこと。つまりライブラリが統一
出来ない環境ではトラブルの種。出力利用の場合は文字列と
して得られるのでまだ調整可能であるかもしれんが、
入力系利用の場合は問題がすぐに発覚しない場合もあり得て
その時は怖いから。だから文字列として受け取って頭から
一文字ずつ読んで解釈していくコードを書きたいと本能的
に思う

292 :デフォルトの名無しさん:2009/04/13(月) 12:25:32
unix系でもふつーに使ってない。

293 :デフォルトの名無しさん:2009/04/13(月) 12:41:21
scanf()つかうなってのはすごい昔からDOS以外のコミュニティーでも言われてたんで、
DOSどうこうとか、規格が統一されてないからとかって考察は外れてるだろうな。

294 :デフォルトの名無しさん:2009/04/13(月) 12:43:53
スキャンティのほうが好きです。

295 :デフォルトの名無しさん:2009/04/13(月) 12:51:45
double d,dd;
char s[256];
sprintf(s,"%lf",d);
sscanf(s,"%lf",&dd);
としてd==ddが保証されると思ってる?

296 :デフォルトの名無しさん:2009/04/13(月) 12:54:14
誰にきいてる?

297 :デフォルトの名無しさん:2009/04/13(月) 12:56:58
壁と話してるんだろ
そっとしておこう

298 :デフォルトの名無しさん:2009/04/13(月) 14:02:29
>>295
そんなことより
sprintf(s,"%lf",d);

sprintf(s,"%f",d);
でいいよ

299 :デフォルトの名無しさん:2009/04/13(月) 17:23:29
>>298 (・∀・)


300 :デフォルトの名無しさん:2009/04/13(月) 17:31:04
>>298
間違える人が多いのでどちらでもよくなったんだよ

301 :デフォルトの名無しさん:2009/04/13(月) 18:24:47
scanf_s

302 :デフォルトの名無しさん:2009/04/13(月) 19:49:34
printfにも%lf使え!って暴れて大恥かいたバカもいたな、そういや。

303 :デフォルトの名無しさん:2009/04/13(月) 20:10:27
今はfの前にl付けても無視されるけど
DOSの頃はlfでdouble指定だったようだ
じゃあなぜfloatとdoubleの指定を分けなくていいのかというと
floatはスタックに積む際doubleに変換されるからである

304 :デフォルトの名無しさん:2009/04/13(月) 20:17:47
お前の言ってるDOSってなんのこと?

305 :デフォルトの名無しさん:2009/04/13(月) 20:18:45
もしかしてKABちゃんが昔所属してた・・・!!

306 :デフォルトの名無しさん:2009/04/13(月) 21:11:06
PC-98引っ張り出してきてQuickC Ver.2.0をインストールして試してみた
ヘルプにはlはdouble型を指定とか書いてるが嘘だった

float f = 1.0;
double d = 1.0;
printf("%f %lf\n", f, d);
printf("%f %lf\n", d, f);

出力結果は同じだった
そりゃ明示的にfloatを宣言しない限りdoubleに変換されるもんな

307 :デフォルトの名無しさん:2009/04/13(月) 21:58:41
いいえ、明示的にfloatにキャストしたとしても、スタックにはdoubleで積まれます。

308 :デフォルトの名無しさん:2009/04/13(月) 22:05:10
プロトタイプ宣言で引数の型をfloatと指定しない限りfloatはdoubleで積まれる
printfの第2引数以降、floatはdoubleとして積まれる(大昔から)
つまりprintfで%lfを指定するのは間違い
エラーにはならないがコンパイラによっては指摘するものもあるみたい

309 :288:2009/04/13(月) 22:59:48
>>289
もちろんメタ的な意味を込めて言ってみてます。

>>290
ごめんよ、
君にはメタ視点は難しすぎたか。
今度から君のような低脳にも分かるように
書くようにつとめるのでご勘弁を。


310 :デフォルトの名無しさん:2009/04/13(月) 23:17:27
メタだからって何か意味があるのか。
メタへのレスも「メタ的な意味」だから。

311 :デフォルトの名無しさん:2009/04/14(火) 00:17:11
まあ、C99でprintf系にlfを認めたことは、規格のほうが屈した形であると言えるだろうな。

312 :デフォルトの名無しさん:2009/04/14(火) 00:58:13
よし、メタの目眩く世界に旅立とうぜ

313 :デフォルトの名無しさん:2009/04/14(火) 01:00:30
格上げされることを知っていればどうということはないんだけど
非対称なのが気持ち悪いのも事実

314 :デフォルトの名無しさん:2009/04/14(火) 01:15:31
片や値渡し、片や参照渡しなんで非対称になるのは止むを得ない
scanf("%f", &dbl)とかうっかりやってしまうことも稀によくある

315 :デフォルトの名無しさん:2009/04/14(火) 03:21:52
対称かのごとく説明するくだらない入門書が多いのも事実。

だから、printf()には"%g"を使う方がいいんだよ。

316 :デフォルトの名無しさん:2009/04/14(火) 09:24:44
fはfloatだけどgは何だろう

317 :デフォルトの名無しさん:2009/04/14(火) 09:43:20
gはeとf表示のうち表示精度が高い方を自動的に選択

318 :デフォルトの名無しさん:2009/04/14(火) 10:21:41
eはexponentialだけどgは何だろう

319 :デフォルトの名無しさん:2009/04/14(火) 10:57:39
gはfと同様の形式のときにも小数点以下の0はサプレスしてくれる。

320 :デフォルトの名無しさん:2009/04/14(火) 11:08:05
サプレスってなに?

321 :デフォルトの名無しさん:2009/04/14(火) 11:16:06
サプレス 【suppress】
抑圧。抑制。禁止。

322 :デフォルトの名無しさん:2009/04/14(火) 11:31:12
>>316
gはe, fの次だろ

323 :デフォルトの名無しさん:2009/04/14(火) 11:59:42
G13型トラクター求む

324 :taguti:2009/04/14(火) 16:10:58
6個のreal型変数x1、y1、x2、y2、x3、y3を定義しそれぞれに実数つを読み込んで、xy平面上の3点
(x1、y1)(x2、y2)(x3、y3)を頂点に持つ三角形の面積を計算して、その値を表示するプログラムを作成してください。
・公式:底辺x高さ÷2を使って計算してください。
お願いします!!

325 :tuguti:2009/04/14(火) 16:30:26
すいませんスレ間違えました

326 :デフォルトの名無しさん:2009/04/14(火) 22:34:34
>>324-325
間違えましたじゃねーよ
そう言うのは意図的なマルチポストって言うんだろ。

帰れ。うざいから。


327 :デフォルトの名無しさん:2009/04/14(火) 22:38:36
>>324
とおもったら
http://pc12.2ch.net/test/read.cgi/tech/1237091698/493
http://pc12.2ch.net/test/read.cgi/tech/1232055225/770
http://pc12.2ch.net/test/read.cgi/tech/1217575832/499
http://pc12.2ch.net/test/read.cgi/tech/1235927586/774
http://pc12.2ch.net/test/read.cgi/tech/1212498448/876
http://pc12.2ch.net/test/read.cgi/tech/1212409946/66
http://pc12.2ch.net/test/read.cgi/tech/1217575832/499
http://pc12.2ch.net/test/read.cgi/tech/1192201659/808
http://pc12.2ch.net/test/read.cgi/tech/1205156417/821
http://pc12.2ch.net/test/read.cgi/tech/1238032584/16
http://pc12.2ch.net/test/read.cgi/tech/1224719784/934
これはひどいwww
ここまで来ると逆に尊敬するマルチ野郎だな。

良識を疑う。


328 :デフォルトの名無しさん:2009/04/14(火) 23:32:52
>>326-327
てなことを、10スレ以上で言って回ってるのかおまえらは? おヒマですね
マルチポストがどーたらを言ってる奴自身、ろくな回答してねえのが多いんだよな

# 加えてクロスポストを知らなかったりするし

329 :デフォルトの名無しさん:2009/04/14(火) 23:34:37
マルチにろくな回答をしてあげる必要があるのかとか、この件で
クロスポストがなんの関係があるのかとかいろいろ疑問のわく書き込みだな。

330 :デフォルトの名無しさん:2009/04/14(火) 23:57:24
>>328
いんやこれはマルチポスト
しかもIDも無い板で”奴自信”とかイッちゃうアンタはe視野狭窄の発症者
だれも相手に出来ない

331 :デフォルトの名無しさん:2009/04/15(水) 00:58:12
実行結果を正しく予測できますか?

#include <stdio.h>

int main(void)
{
> int n = 0, *p;
> p = &n;

> fprintf(stdout, "n, p = %d, %p\n", n, p);
> (*p)++;
> fprintf(stdout, "n, p = %d, %p\n", n, p);
> ++*p;
> fprintf(stdout, "n, p = %d, %p\n", n, p);
> *p++;
> fprintf(stdout, "n, p = %d, %p\n", n, p);

> return 0;
}


332 :デフォルトの名無しさん:2009/04/15(水) 01:07:55
>331
未定義動作が含まれているぞ

333 :デフォルトの名無しさん:2009/04/15(水) 01:19:46
'>'のせいでコンパイルが通らない

334 :331:2009/04/15(水) 02:02:58
/*
再挑戦

実行結果を正しく予測できますか?
*/

#include <stdio.h>

int main(void)
{
int n = 0, *p;
p = &n;

fprintf(stdout, "n, p = %d, %p\n", n, p);
(*p)++;
fprintf(stdout, "n, p = %d, %p\n", n, p);
++*p;
fprintf(stdout, "n, p = %d, %p\n", n, p);
*p++;
fprintf(stdout, "n, p = %d, %p\n", n, p);

return 0;
}


335 :デフォルトの名無しさん:2009/04/15(水) 03:31:19
どっちにしろ副作用完了点前に同じオブジェクトに代入と参照を行ってる気がするので
実行結果は鼻から悪魔が出るなりなんなりOK

336 :デフォルトの名無しさん:2009/04/15(水) 03:35:20
>>334
見てるかもしれないけど一応リンク張っておく
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html

337 :デフォルトの名無しさん:2009/04/15(水) 06:44:11
>>335
気のせいじゃないの

338 :デフォルトの名無しさん:2009/04/15(水) 06:54:48
気の所為だね。

339 :デフォルトの名無しさん:2009/04/15(水) 09:26:02
*p++; の評価について勉強になった。

あんがと

340 :デフォルトの名無しさん:2009/04/15(水) 12:52:51
グローバル変数をいっぱい作れば、ポインタ使わなくて済みますか?

341 :デフォルトの名無しさん:2009/04/15(水) 13:01:57
>>340
小さいプログラムならいいかもしれないけどシステム固有のAPIとか
使うようになった際ポインタわからなければアドレス渡しとかでてきたら
どうするの?

342 :デフォルトの名無しさん:2009/04/15(水) 13:30:02
そういうAPIが使える程には成長しないので大丈夫

343 :デフォルトの名無しさん :2009/04/15(水) 13:32:09
>>340
ポインタを使うときは、使うなりの理由がある。
別にグローバル変数をいっぱい作っても仕様によっては
ポインタを使う可能性が出てくるかもしれない。

344 :デフォルトの名無しさん:2009/04/15(水) 20:29:47
シングルトンだろ

345 :デフォルトの名無しさん:2009/04/15(水) 21:05:22
warning LNK4099: PDB 'vc90.pdb' が '.\libjpeg.lib' で、または〜
となります。ぐぐりましたが、大概は無視してOKとかいてあるんですが
根本的な原因がわかりません。どうしたらこの警告がでなくなりますか?



346 :デフォルトの名無しさん:2009/04/16(木) 01:54:20
ライブラリをコンパイルするときにpdbを出力しなければよかったような
もしくはlibだけじゃなくてpdbファイルも一緒にコピーすればおk
「pdb 設定」あたりでググってみれば参考になるかも

347 :デフォルトの名無しさん:2009/04/16(木) 22:25:38
.txtファイルに書いてある数字を入力として配列に格納するにはどーすればいいのか
分からん 

348 :デフォルトの名無しさん:2009/04/16(木) 22:27:50
fopen と fscanf

349 :デフォルトの名無しさん:2009/04/16(木) 23:18:00
#include <stdio.h>

int main()
{
int tbl[100];
int i;
FILE* fp = fopen("a.txt", "r");
i = 0;
while (fscanf("%d", &tbl[i++]) != EOF)
;
return 0;
}


350 :デフォルトの名無しさん:2009/04/17(金) 07:41:18
>>349
ありがとう 参考になりました

351 :デフォルトの名無しさん:2009/04/17(金) 21:27:18
すいません。
ttp://xn--n9q36mh1hnxuksz7wt.jp/FE16b-pm/t06.html
の「プログラム」部分で、

if ( replaceChar( □□□ ) ) {
   なんたらかんたら〜
}
って部分があるじゃないですか。
この□□□には " *input "が入るらしいんですが、
なぜこうなるのかイマイチよくわからないのです。

この "*input "の内容によっては 0 か 1 が帰ってくるみたいなんですが、
このifってのは( )の中の内容が当たっているか当たってないかだけでなくて
0か1でもいいってことなんでしょうか?

352 :デフォルトの名無しさん:2009/04/17(金) 21:37:00
if( expression )
statement1
[else
statement2]

expression が真 (0 以外) であると、if キーワードによって statement1 が実行されます。
else があり、expression が偽 (0) であると、statement2 が実行されます。
statement1 または statement2 の実行後は、制御が次のステートメントに移ります。

353 :デフォルトの名無しさん:2009/04/17(金) 21:43:55
>>352
ifの内容が0だと内容が偽と同じだってことですか。
ありがとうございました。

354 :デフォルトの名無しさん:2009/04/17(金) 22:15:26
>>350
>349の条件判断は、 != EOFではなく== 1にすべきだな。

355 :デフォルトの名無しさん:2009/04/17(金) 22:18:13
>>354
そこだけ突っ込むのは釣りか?

356 :デフォルトの名無しさん:2009/04/17(金) 22:23:17
目に付いたところだけ書いたんだが。
あー、fopen()の戻り値はチェックすべきだし、fclose()位してもばちは当たらんね。

357 :デフォルトの名無しさん:2009/04/17(金) 22:30:42
そんな細かいこと言うなら == 1もダメだろ。

358 :デフォルトの名無しさん:2009/04/17(金) 22:32:14
>>357
なんで?

359 :デフォルトの名無しさん:2009/04/17(金) 22:33:30
すいません。
ttp://xn--n9q36mh1hnxuksz7wt.jp/FE16b-pm/t06.html
で、 *inputの中身を4ビットだけ右にずらす作業があるみたいなんですけども、
なぜ、4ビットずらすと " ! "が " 2 "になるのか全くわかりません。
4ビットだけずらすと0x21が0x32になるらしいんですけども・・・・

360 :デフォルトの名無しさん:2009/04/17(金) 22:35:00
>>358
オープンはエラーチェック必要でリードは必要なし?

361 :デフォルトの名無しさん:2009/04/17(金) 22:36:24
>>360
エラーチェックしているじゃん。

362 :デフォルトの名無しさん:2009/04/17(金) 22:37:37
>>359
4ビット抽出した後、chars配列を参照するので文字になる。

363 :デフォルトの名無しさん:2009/04/17(金) 22:41:48
>>359
パッと見でなんですが、
! -> 0x21 -> 0x32,0x31 ではないかな。

364 :デフォルトの名無しさん:2009/04/17(金) 22:53:25
>>362
あ、なるほど。
0x21の場合 0011 0001 → 0000 0011で、10の位にあったものが一の位になり、
chars[ 0011 (つまりは2)] = 2 で表されるってことですか。

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

365 :デフォルトの名無しさん:2009/04/17(金) 22:53:28
なんだ、答え載ってるじゃん。

366 :デフォルトの名無しさん:2009/04/17(金) 23:16:49
>>364
0011じゃなくて0010だけどね。

367 :デフォルトの名無しさん:2009/04/17(金) 23:21:57
スレに書いてあること8割分からないレベルなんだが最初は何から入ればいいか教えてくれないか

368 :デフォルトの名無しさん:2009/04/17(金) 23:27:56
>>367
カーネルのコンパイル。マジで

369 :デフォルトの名無しさん:2009/04/17(金) 23:33:49
だめだググっても意味が分からない

370 :デフォルトの名無しさん:2009/04/17(金) 23:39:30
>>369
初心者向けのC入門とか言ってもプログラムやりたい奴が
目にする環境だとすぐにどうでもいい感じになるので
ここでもみて開発環境とか含めて勉強しろ

http://homepage2.nifty.com/natupaji/DxLib/
http://dixq.net/rp/

371 :デフォルトの名無しさん:2009/04/17(金) 23:48:28
すいません。
ttp://xn--n9q36mh1hnxuksz7wt.jp/FE14a-pm/t06.html

if ( ( Len1 >= Len2 ) && ( Len1 >= Len3 ) ) {
   点を描画〜
}
ってところがあるんですけれども、

問題によると3点が隣接していれば点を打つっていうことになっているらしいんです。
三辺の長さを比べて、Len1が一番長かっただけでどうして隣接しているとわかるんでしょうか?

372 :371:2009/04/17(金) 23:51:15
すいません。問題よく読んでいませんでした。

373 :デフォルトの名無しさん:2009/04/18(土) 00:44:01
>>370
thxxxx

374 :デフォルトの名無しさん:2009/04/18(土) 00:44:33
教えてください

operation on 'hoge' may be undefined
というワーニングがでて

hoge=(++hoge)%3;

問題の箇所はという処理になってます。
元はVC++でコンパイルしてたものをgcc上でコンパイルしています
どう対処すればいいでしょうか?


375 :デフォルトの名無しさん:2009/04/18(土) 00:45:45
>>374
hoge = (hoge + 1) % 3;でいいと思う。

376 :デフォルトの名無しさん:2009/04/18(土) 00:46:05
>>374
hoge=(hoge+1)%3;
にするとか。

377 :デフォルトの名無しさん:2009/04/18(土) 00:47:00
>>374
hoge=(hoge + 1) %3;

おまえのやってることは未定義動作だからおこられてる


378 :374:2009/04/18(土) 00:49:51
>>375>>376>>377
なるほど

わかりました

379 :デフォルトの名無しさん:2009/04/18(土) 01:17:37
てst

380 :デフォルトの名無しさん:2009/04/18(土) 06:03:54
ワーニング(笑)

381 :374:2009/04/18(土) 06:48:48
ワーニングでもいいんじゃない

なんかこれも読み方でひと悶着ありそうだな

382 :デフォルトの名無しさん:2009/04/18(土) 07:20:47
http://pc12.2ch.net/test/read.cgi/tech/1056173956/
ここ埋めてやれよ

383 :デフォルトの名無しさん:2009/04/18(土) 20:49:44
>>381
プログラムを書く人って、変に細かいことにこだわる人が多いからね。

384 :デフォルトの名無しさん:2009/04/18(土) 20:55:45
細かけぇ事はいいんだよ

385 :デフォルトの名無しさん:2009/04/18(土) 20:58:14
>>384
いやよくないだろ

386 :デフォルトの名無しさん:2009/04/18(土) 21:08:45
errorはエラーだけどwarningは警告って言う人が多いイメージ

387 :デフォルトの名無しさん:2009/04/18(土) 21:15:28
>>386
警告かあ。ウォーニングってくるのかとオモタ。

388 :デフォルトの名無しさん:2009/04/18(土) 21:24:32
StarWars
スターワーズ

389 :デフォルトの名無しさん:2009/04/18(土) 22:03:09
MicrosoftWord
マイクロソフトウォード

390 :デフォルトの名無しさん:2009/04/18(土) 22:05:22
その程度を許容できないからキモイ認定されるんだろうな

391 :デフォルトの名無しさん:2009/04/18(土) 22:08:57
スィー言語

392 :デフォルトの名無しさん:2009/04/18(土) 22:36:37
iterator

393 :デフォルトの名無しさん:2009/04/18(土) 22:43:58
イテラトール

394 :デフォルトの名無しさん:2009/04/18(土) 22:48:03
スペイン訛りっぽいな。

395 :デフォルトの名無しさん:2009/04/18(土) 22:51:35
ローマ人なら分かってくれる

396 :デフォルトの名無しさん:2009/04/20(月) 18:39:40
質問です。
授業でteratermを使って、emacsでプログラミングをしているのですが
とりあえず、先生の用意したプログラムをコピペして起動してみろとのことで
普通にコピペして、コンパイルしようとしたのですが

警告: null 文字は無視されました

という文章が何十行にも渡ってでて、コンパイルできません。
調べてもなかなか対処がわからず、過去ログでの質問は自己解決していたりでわかりません。
断片的な情報から、文字コードの問題かと設定をUFT-8からEUCなどに変えてみましたが
UFT-8以外では文字化けしてしまいます。
とりあえず、インデントをしっかりTabに書き換えたりもしましたが、解決しませんでした。

どなたか、解決法を教えてください。

397 :デフォルトの名無しさん:2009/04/20(月) 18:47:45
C言語の問題じゃないから先生に聞け。そうでないならLinux板にでも逝け。

398 :デフォルトの名無しさん:2009/04/20(月) 19:02:50
>>397
ありがとうございました。
やっぱりCじゃ無かったですか・・・。

399 :デフォルトの名無しさん:2009/04/20(月) 19:06:11
環境依存可のC/C++スレに池




400 :デフォルトの名無しさん:2009/04/20(月) 22:44:18
とりあえずemacsは糞だからviを使え

401 :デフォルトの名無しさん:2009/04/20(月) 23:03:47
また論争の種を…

402 :デフォルトの名無しさん:2009/04/20(月) 23:26:41
aファイルとlibファイルの具体的な差異を教えていただけますか?

バイナリ見るとヘッダー情報も同じように見えるのですが…

403 :デフォルトの名無しさん:2009/04/21(火) 09:16:33
libは知らんが、.aなら単なるarというアーカイバーのアーカイブファイルだ。
例えば、tar cf foo.tar *.oするのと本質的に変わらない。
tar tvf foo.tarするのと同様にar tvf foo.aできる。

404 :デフォルトの名無しさん:2009/04/21(火) 11:51:27
>>402
.aがLinux用で.libがWindows用
知らんけど

405 :デフォルトの名無しさん:2009/04/22(水) 22:07:53
C言語で実用的なアプリってもう書かれる事はないの?

406 :デフォルトの名無しさん:2009/04/22(水) 22:11:21
>>405
Winアプリって意味なら最近は殆ど無い。
流石にこんな古臭いのでWinアプリは書いてられない。

407 :デフォルトの名無しさん:2009/04/22(水) 22:15:14
まあせめてC++だなあ

でも.netもじわじわと進出してるからc#とかで書かれてるのも結構あるし
まあVBのおかげもあるんだろうけど

408 :デフォルトの名無しさん:2009/04/22(水) 22:15:57
>>405
組み込み系ならあるでしょ。

409 :デフォルトの名無しさん:2009/04/22(水) 22:22:29
int a[3][3]={{1,2,3}{2,5,3,}{3,2,7}}
と定義したaの値の中から、bとcの値をキーボードから入力して、
例えば、bが3でcも3なら7といったような結果を出すには
どうすればいいのか教えてください。

410 :デフォルトの名無しさん:2009/04/22(水) 22:28:18
>>409
ごめん日本語が意味不明なのは俺だけじゃないはず。
>aの値の中から、bとcの値をキーボードから入力して、
???

411 :デフォルトの名無しさん:2009/04/22(水) 22:29:58
>>409
こういう事かな?
printf("%d\n", a[b-1][c-1]);

412 :デフォルトの名無しさん:2009/04/22(水) 22:29:59
printf("%d\n", a[b - 1][c - 1]);

413 :デフォルトの名無しさん:2009/04/22(水) 22:32:28
ヒントを言うとこれだ
printf("%d",a[foo][bar]);

414 :デフォルトの名無しさん:2009/04/22(水) 22:33:39
すみません…。初心者なので説明するのが難しいです。
えっと、3×3の表があって、縦の一列目、横の二列目という風に
それぞれ1から3までの数字をキーボードから入力するということです。
3×3の表をa、縦をb、横をcとしてしまいました…。

415 :デフォルトの名無しさん:2009/04/22(水) 22:33:42
そうかそうか0から始まるな

416 :410:2009/04/22(水) 22:35:48
お前らesper何級持ち?
すげーな

これだけesperがいればもう大丈夫だな。後はまかせた。

417 :デフォルトの名無しさん:2009/04/22(水) 22:37:23
すみませんもう一ついいですか?
int b,c;
これって初期化したことになりませんか?

418 :デフォルトの名無しさん:2009/04/22(水) 22:38:17
なりません。

419 :デフォルトの名無しさん:2009/04/22(水) 22:38:22
初期化っつーか宣言だなそれは

420 :デフォルトの名無しさん:2009/04/22(水) 22:38:50
ならないですね
あくまで確保しただけ
int b = 0;
int c = 0;
とか書いたら初期化

421 :デフォルトの名無しさん:2009/04/22(水) 22:50:06
C言語難しいですね…。
きちんと縦の一列目、横の二列目にある数字が最後にでてきません…。

422 :デフォルトの名無しさん:2009/04/22(水) 22:51:11
C言語の前に日本語勉強しなさい

423 :デフォルトの名無しさん:2009/04/22(水) 22:51:38
申し訳ない。
国語は得意だったんですが。

424 :デフォルトの名無しさん:2009/04/22(水) 23:01:10
これなんですが…。
%dのところに変な数字がでてきてしまいます。
scanfのところが間違っているのでしょうか。

int a[3][3]={{7,5,8},{6,5,7},{9,6,6}};
int b=0,c=0;
printf("好きな番号を入力してください。\n",b);
scanf("%d",&b);
printf("好きな番号を入力してください。\n",c);
scanf("%d",&c);
printf("\n表の文字は、%dです。\n",a[b-1][c-1]);

425 :デフォルトの名無しさん:2009/04/22(水) 23:03:55
printfの第二引数いらないよね

426 :デフォルトの名無しさん:2009/04/22(水) 23:09:19
,bのところですか?
これ、つけなくてもよかったんですね。

427 :デフォルトの名無しさん:2009/04/22(水) 23:10:18
static int b,c;
なら初期化

428 :デフォルトの名無しさん:2009/04/22(水) 23:17:22
staticですか。まだ習っていないのでよくわかりませんが今度から
初期化はstaticを使わせてもらいます!

適当にちょこちょこ直してたらなぜかきちんとできました!
いまいちどこがだめだったのかはわかりませんが…。
答えてくださった方々、ありがとうございました!

429 :デフォルトの名無しさん:2009/04/22(水) 23:17:52
staticは静的変数だかんな

430 :デフォルトの名無しさん:2009/04/22(水) 23:48:47
>>428
まてまてまて!
staticってなんだか分からないのに使うとたぶんとても困ったことになる。

頼むから適当な書籍で勉強してくれ。


431 :デフォルトの名無しさん:2009/04/23(木) 00:08:30
staticなんて使わない方がいい

使うケースなんてレアだ

432 :430:2009/04/23(木) 00:12:37
>>431
> staticなんて使わない方がいい
> 使うケースなんてレアだ
俺は使いまくるけど・・・。
(C++だからか?staticメンバ関数とかとても便利。)


433 :デフォルトの名無しさん:2009/04/23(木) 00:35:14
俺も使いまくり。ある関数が実行された最初の一回だけ特定の処理をしたいときとか。
void func(void)
{
static int flag;
if(flag==0){
flag = 1;
init_fuck();
}
(処理)
}


434 :デフォルトの名無しさん:2009/04/23(木) 02:41:05
そのパターンだとコード中の毎回のif分岐とマシン語のstaticチェックがあまりにも邪魔くさい。

typedef void(*func)(void) = func_1st;
void func_1st(void){
init_funk(); func=func_ord; func();
}

void func_ord(void){
//処理
}
だな

435 :デフォルトの名無しさん:2009/04/23(木) 02:57:47
>>434が分からない…。

436 :デフォルトの名無しさん:2009/04/23(木) 03:04:26
>>435
変数funcの初期値がfunc_1st()なので、初回のfunc()はfunc_1st()を呼ぶ。
そのfunc_1st()の中でfuncを書き換えておくから、二回目以降のfunc()はfunc_ord()を呼ぶ。

437 :デフォルトの名無しさん:2009/04/23(木) 03:07:27
なるほど。天才ですね。

438 :デフォルトの名無しさん:2009/04/23(木) 03:08:16
よく言われる。

439 :デフォルトの名無しさん:2009/04/23(木) 03:57:02
お世辞も通じない馬鹿か

440 :デフォルトの名無しさん:2009/04/23(木) 04:05:07
訳:うらやましいな

441 :デフォルトの名無しさん:2009/04/23(木) 08:26:54
>>434
関数アドレスをコールの度にメモリ間接参照するのと
コールの度にフラグをメモリアクセスするのは、あまり変わらない
ブランチはブランチヒストリで予測されるだろうということで

442 :デフォルトの名無しさん:2009/04/23(木) 10:27:08
もし頻繁に呼ばれる関数なら、分岐予測が分岐履歴から予測されるのでオーバーヘッドはほぼない。
もし頻繁に呼ばれない関数なら、分岐予測のオーバーヘッドとかどうでもいい。

443 :デフォルトの名無しさん:2009/04/23(木) 14:49:51
はじめまして。
今C言語の勉強中で
構造体配列をソートしたいのですが
どうしたらいいのかわかりません。
テキストに載ってるソート方法はみんなint型で
実際int型でソートしようとしても
要領の大きさが足らないとかでてきて…
で、かわりにintのところをstructにしてもエラーになっちゃって…

私の実行したいことは
構造体の中のint型の数だけを判断してソートして出力させたいんです。

よろしくお願いします(>_<)

444 :デフォルトの名無しさん:2009/04/23(木) 14:51:21
(>_<)←この顔文字使う奴は例外なく糞

445 :デフォルトの名無しさん:2009/04/23(木) 14:54:36
つまり>>444も……

446 :デフォルトの名無しさん:2009/04/23(木) 15:03:09
エラーになったコードを貼るとどこを直せばいいのかアドバイスしやすい

447 :デフォルトの名無しさん:2009/04/23(木) 15:08:25
ソートアルゴリズムの比較のところを構造体のintにして、
入れ替えのところを構造体の入れ替えにすればいいだけだろ。

448 :デフォルトの名無しさん:2009/04/23(木) 16:28:36
//遅くなりました。分けて載せます//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void swap(struct data *, struct data *);
void printData(struct data *);

main()
{

struct data{
int no;
char food[12];
char eto[8];
char aisatsu[16];
};

struct data e[5] ={ {1, "すし", "ねずみ", "おはよう"},
{3, "たまごやき", "とら", "こんばんは"},
{4, "ステーキ", "うさぎ", "おかえりなさい"},
{5, "秋刀魚", "たつ", "おやすみなさい"},
{2, "やきうどん", "うし", "こんにちは"}
};


449 :デフォルトの名無しさん:2009/04/23(木) 16:31:37

int i;
int j, k;
int n = 5;
struct data swap;

for(i = 0; i < 5; i++){
printf("%2d %12s %8s %16s \n",e[i].no, e[i].food, e[i].eto, e[i].aisatsu);
printf("------------------------------------------\n");
}

for(j = 0; j < n-2; j++);{
for(i = j+1; i < n-1; i++);{
if(e[j].no > e[i].no){
swap("e+i, e+j");
}
}
}
printData(e);
}


450 :デフォルトの名無しさん:2009/04/23(木) 16:35:04

void swap(struct data *y, struct data *z)
{
int t;
t = *y;
*y = *z;
*z = t;
}

void printData(struct data *e)
{
int i;
for(i = 0; i < 5; i++)
printf("%d",e[i]);
printf("\n");
}
//これで終わりです//

451 :デフォルトの名無しさん:2009/04/23(木) 16:37:23
int t; じゃなくて struct data t だろ

452 :デフォルトの名無しさん:2009/04/23(木) 16:49:40
それでもだめでした・・・

453 :デフォルトの名無しさん:2009/04/23(木) 16:59:01
struct dataの定義を main()の外に出す。
struct data swap;を消す
swap("e+i, e+j"); じゃなくてswap(e+i, e+j);

454 :デフォルトの名無しさん:2009/04/23(木) 17:03:04
↑のとおりにしたらエラーが出なくなって
出力されました!!!
だけど番号が昇順にならない…昇順にしたいんですけど
何が間違っているのでしょうか???

455 :デフォルトの名無しさん:2009/04/23(木) 17:08:01
ソートのループがおかしい

456 :デフォルトの名無しさん:2009/04/23(木) 17:14:08
ソートのループはまあ、やればわかるけど
それよりもfor文の後ろのセミコロンだ、これに騙されて時間かかっちまったw

457 :デフォルトの名無しさん:2009/04/23(木) 17:14:55
for(j = 0; j < n - 1; j++){
for(i = j+1; i < n; i++){
if(e[j].no > e[i].no){
swap(e+i, e+j);
}
}
}
こうだな

458 :デフォルトの名無しさん:2009/04/23(木) 17:14:58
すいません、今いじってたら解決しました!!!


ご迷惑をおかけしました
ありがとうございました!!!


459 :デフォルトの名無しさん:2009/04/23(木) 17:18:15
結局参考にはなりませんでしたが
本当にありがとうございました!!!!

460 :デフォルトの名無しさん:2009/04/23(木) 17:20:24
全く参考にはなりませんでしたしここに来た甲斐も全くありませんでしたが
自己解決しました
ありがとうございました!!

461 :デフォルトの名無しさん:2009/04/23(木) 17:23:13
下らない成りすましの何が面白いんだか

462 :デフォルトの名無しさん:2009/04/23(木) 17:54:06
(>_<)

463 :デフォルトの名無しさん:2009/04/23(木) 19:06:49
園児が部屋の隅で会議して大人には理解できない論理で結論に達し
「そうだよねー!!」と合唱してる感じだ

464 :デフォルトの名無しさん:2009/04/23(木) 19:23:32
さーて、全員あぼんするか。

465 :デフォルトの名無しさん:2009/04/23(木) 19:26:14
>>463
園児が大人達の会話にまざれなくて、かまって欲しくて奇行に走ってるのほうがふさわしいだろw

466 :デフォルトの名無しさん:2009/04/23(木) 23:30:48
【神】
深夜の公園で全裸になり「裸で何が悪い!」と叫び続けたアイドル



【横綱】
磐田市内の県立高に侵入、女子生徒のスク水着て脱糞

【大関】
女子高生の上履きを盗み、コンビニでコピーしたものを見て楽しむ
19〜71歳女性に一瞬で精液をかける18歳少年「早撃ちマック」
「セーラームーン」のコスプレで女性に近づき網タイツ越しに下半身を露出
改造した釣竿を使い、足掛け30年で500枚もの女性下着を盗み続けた

【関脇】
ブルマー持参で小学校侵入、「学校ではくと快感」
女性宅に侵入し何も盗らずPCのスクリーンセーバーをエロ画像に変えた男
京阪電鉄の特急電車内で男が幼虫200匹バラまく。「驚く女性客見たかった」

【破門】
10年以上に渡り女児パンツを履いては近隣の家に投げ込んでた男。
ストッキングと女児用パンツを組み合わせる独特の手法にこだわりを見せ、
取り調べに対しても悪びれることなく「女性の下着は密着感が気持ちいい。」という名言を吐き一気に番付を駆け登る。
しかし過去に殺人事件や巨額の横領事件を起こしていたことが発覚。
再逮捕され、「変態道から外れた外道」と非難され破門。
2008年9月27日、大阪拘置所にて自殺。

【外国人力士】
深夜にオムツだけを着て女性に「このへんにオムツ交換室はありませんか?」と尋ねる男(イギリス)

467 :デフォルトの名無しさん:2009/04/24(金) 07:04:43
リストの先頭から検索するロジックがいたるところにあるんですが
ほぼ定型なのでマクロ化しようと思ってるんですが下記のような
場合はどうすればいいでしょうか?

HOGE* ptr = HOGELIST();
while(ptr)
{
   何かの処理
   ptr = HOGELIST();
}

マクロ化したいのは「何かの処理」の前後になります。
複数行かけるマクロで書いてみたのですが暴走してるようなので
本来のロジックのように展開されてないようです。
{}をマクロ内部できっちり閉じない場合は何かおまじない?をする必要があるんでしょうか?

468 :デフォルトの名無しさん:2009/04/24(金) 07:22:46
>>467
マクロはすべて一行に収めないといけない
複数行になる場合は行末に \ を書けば
次の行は前の行の続きとして扱われる

でも、マクロに変更しても処理速度UP効果はほとんど無い
そんなことよりもアルゴリズムを見直したほうが有意義だ

469 :デフォルトの名無しさん:2009/04/24(金) 07:28:15
>>468
処理速度の向上といよりは手間ですね
関数の引数をはしょってますがこの関数で複数管理してるリストのリードが
できるようになってまして、その手間を省くために作成しようとおもってます。
一応実際というか理想は

#define HOGE_MAE (a) {\
 HOGE* ptr = HOGELIST(a);\
 while(ptr)\
 {\
}
#define HOGE_ATO (a) {\
    ptr = HOGELIST(a);\
 }\
}

という感じで定義しておいて

HOGE_MAE(A_LIST)
何かの処理
HOGE_ATO(A_LIST)
としてます。


470 :デフォルトの名無しさん:2009/04/24(金) 07:29:18
補足
A_LISTもdefineで定数が設定されてます。
リスト識別子とでも言えばいいんでしょうか

471 :デフォルトの名無しさん:2009/04/24(金) 07:37:10
>>469
引数付マクロにしたければ丸括弧の前にスペースをいれては駄目

472 :デフォルトの名無しさん:2009/04/24(金) 07:44:14
>>471
すみません
ここに記述する際に手打ちでやったのでいれてしまいましたが
実際は入ってません

473 :デフォルトの名無しさん:2009/04/24(金) 07:55:44
>>472
中括弧の位置を間違ってるんじゃないの?
「手打ちだから間違えたけど実際は入ってない」とか
エスパーじゃないからわかんね

マクロでできるのは間違いないとしかいえないな

474 :デフォルトの名無しさん:2009/04/24(金) 08:56:22
同じような処理を何度も書くよりはマクロにした方がいいね

475 :デフォルトの名無しさん:2009/04/24(金) 09:07:53
マクロを関数のように使うのはよくないとコードコンプリート様は言っておられる。

476 :デフォルトの名無しさん:2009/04/24(金) 09:12:36
何でそこまでしてマクロにしたいのか判らんが、可読性は確実に落ちるね。
それに、マクロの使い方を間違えたら泣けないバグが発生しそうだ。

477 :デフォルトの名無しさん:2009/04/24(金) 10:53:46
>>469
それをやるんだったら、「何かの処理」を関数化して、
リスト検索の関数の引数として渡したほうがいい。

478 :デフォルトの名無しさん:2009/04/24(金) 15:10:52
C言語のソースを文字列として処理するプログラムで
「*」(アスタリスク)が出てきた時にそれが
乗算演算子か間接参照演算子かポインタ変数宣言の記号かを判別する手順を教えてください。

479 :デフォルトの名無しさん:2009/04/24(金) 15:23:50
>>478
状況設定がなさ過ぎで無理な気がするけど。
誰かエスパー頼む。

480 :デフォルトの名無しさん:2009/04/24(金) 15:34:05
事前に型情報がわかってないと無理じゃないかな

int* a;
int INT;
int b;
INT* c;

481 :デフォルトの名無しさん:2009/04/24(金) 15:34:48
ちがった

int* a;
int INT;
int b;
INT* b;


482 :デフォルトの名無しさん:2009/04/24(金) 16:06:08
>>478
本気でやるなら、コメントやリテラル内での出現の場合も考慮する必要があるから
コンパイラ並のトークン解析処理を実装することになる。

483 :デフォルトの名無しさん:2009/04/24(金) 16:07:34
そこは簡単

484 :デフォルトの名無しさん:2009/04/24(金) 16:33:45
質問よろしいですか?
リンクリストについて今勉強中なんですけど
リンクリストのことを簡単に言うとどんな役割なんですか?
頭弱いんでほんとに簡単にお願いします。
どのテキスト読んでもよくわかんなくて…
よろしくお願いします。


485 :デフォルトの名無しさん:2009/04/24(金) 16:36:23
頭(あたま)悪(わる)いのはよくわかったから、先(さき)に日本語(にほんご)の勉強(べんきょう)をしてくれ

486 :デフォルトの名無しさん:2009/04/24(金) 16:54:54
■質問です■

ひとつの関数内に2つ以上のreturn文があるのはよくないですか?
もしそうならその理由もお教えください。

自分としては問題ないと考えてますが・・・

487 :デフォルトの名無しさん:2009/04/24(金) 16:56:59
>>486
良いだろ別に、その人が制御出来ていれば。
変にフラグ変数とかgotoとかを乱発されるよか、returnが複数ある方がよっぽど良いと思うがね。

488 :デフォルトの名無しさん:2009/04/24(金) 16:59:06
>>487
ありがとう。もっともですよね?
gotoで関数のケツにある一括エラー処理に落とすのも無問題ですよね?

489 :デフォルトの名無しさん:2009/04/24(金) 17:24:27
質問してよろしいでしょうか。
Numerical Recipesを使って数値計算(runge kutta)のプログラムを組んだのですが、コンパイルは通ってもexeファイルが動きません。
どこかおかしいところがないか見ていただけないでしょうか。

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#define NRANSI
#include "nrutil.h"
#define N 2
#define dist 0.01
#define M 100

void derivs(float x,float y[],float dydx[])
{
dydx[1] = y[1];
}

void main(void)
{
double t;
float y[N],dydx[N],x=1.0,yout[N];
int j,i;
derivs(x,y,dydx);
scanf("%f",&y[1]);

for(j=0;j*dist<M;j++){
t=j*dist;
rk4(y,dydx,1,x,t,yout,derivs);
printf("%f\n",yout[1]);
}
}

490 :デフォルトの名無しさん:2009/04/24(金) 17:27:55
>>489
nrutil.hは?

491 :デフォルトの名無しさん:2009/04/24(金) 17:30:18
>>490
Numerical Recipesのインクルードファイルです。分割コンパイルしてあるのでわかりづらくてすみません。
もうひとつのファイルを貼り付けているので少しお待ちいただければと思います。

492 :デフォルトの名無しさん:2009/04/24(金) 17:32:07
>>490
Numerical Recipes って製品みたいだな。 ttp://www.nr.com/

>>489
言語・文法の問題より、(仕様を含めての)ラブラリ利用法の話っぽいので
ここでは回答得られないかも? 適切な場所はワカラン

493 :デフォルトの名無しさん:2009/04/24(金) 17:34:20
一緒にコンパイルしたものです。
#define NRANSI
#include "nrutil.h"

void rk4(float y[], float dydx[], int n, float x, float h, float yout[],
void (*derivs)(float, float [], float []))
{
int i;
float xh,hh,h6,*dym,*dyt,*yt;
dym=vector(1,n);
dyt=vector(1,n);
yt=vector(1,n);
hh=h*0.5;
h6=h/6.0;
xh=x+hh;
for (i=1;i<=n;i++) yt[i]=y[i]+hh*dydx[i];
(*derivs)(xh,yt,dyt);
for (i=1;i<=n;i++) yt[i]=y[i]+hh*dyt[i];
(*derivs)(xh,yt,dym);
for (i=1;i<=n;i++) {
yt[i]=y[i]+h*dym[i];
dym[i] += dyt[i];
}
(*derivs)(x+h,yt,dyt);
for (i=1;i<=n;i++)
yout[i]=y[i]+h6*(dydx[i]+dyt[i]+2.0*dym[i]);
free_vector(yt,1,n);
free_vector(dyt,1,n);
free_vector(dym,1,n);
}
#undef NRANSI
nrutil.hはこちらのプログラム中にある、〜vectorを定義しています。中身は単純に配列取ってるだけだと思います。

494 :デフォルトの名無しさん:2009/04/24(金) 17:40:23
>>492
やはりライブラリの利用法になるのでしょうか・・・。
解説書を見てもやっている数式の説明ばかりで具体的な使用法が載っておらず困っていたのです。
アドバイスありがとうございました。

あと、スレ違いでしたら申し訳ありません。

495 :デフォルトの名無しさん:2009/04/25(土) 09:36:24
>>494
「exeファイルが動きません。 」って何かエラーメッセージが出てない?
DLLや共有ライブラリにパスが通ってないとかでは

496 :デフォルトの名無しさん:2009/04/25(土) 10:52:49
とあるプログラムの速度を向上させるためにCPUの仕様上doubleをfloatに変えると
有効ということになり変換作業していたのですが特定の箇所でフリーズするため
調査したところ0で割っていたことがわかりました。

doubleのときは問題なかったのですがfloatにしたことで起きるというのは
やはり桁の問題なのでしょうか?

double = 0;

は実は0.000000000000000・・・・1とかなんでしょうか?

497 :496:2009/04/25(土) 10:54:01
>double = 0;
double HOGE = 0;

とした際のHOGEの中は・・・

ですね失礼しました

498 :デフォルトの名無しさん:2009/04/25(土) 11:15:44
>>496
0を入れたら0だよ。
誤差で0以外が入るってなさそう。

499 :デフォルトの名無しさん:2009/04/25(土) 11:46:22
>>496
元(doubleのとき)からのバグか、変換作業中のミスじゃないの。
いずれにしても、生半可な知識でfloatにしても速くなるとは限らないけどね。

一つだけヒント。floatにすると、doubleへの暗黙の型変換が発生するかもしれない点に注意。
例えばfloat foo = bar + 0.1;なんて書くと、とっても遅い型変換が二回も発生してしまう。

500 :496:2009/04/25(土) 12:02:02
>>498>>499
うーん・・・
ソース全体のdoubleをfloatに置換して問題が発生してるところの
変数だけdoubleにするとフリーズ無しで、floatにするとフリーズ
という不可解な・・・

物理演算のちょっとしたソースなんですが元はwindows上で動いてた物を
どちらかといえば組み込み系のCPUに持ってきてるんですがやはりdoubleの
ほうが計算速い構造なんですかね?

501 :デフォルトの名無しさん:2009/04/25(土) 12:07:15
ゲームプログラマになる前に覚えて起きたい技術を読め

502 :496:2009/04/25(土) 12:17:34
>>501
そうします

503 :デフォルトの名無しさん:2009/04/25(土) 12:29:26
>>500
doubleとfloatとどっちが速いかは環境による。
(PCでやるときは、サイズが問題になるとき意外はdoubleをつかっとけば
いいと思うけど)
実測するか確かな資料にあたるかしたほうがいい。

504 :489:2009/04/25(土) 12:46:28
>>495
遅レスですみませんorz
共有ライブラリborlandC++/Cはcw32.libとimport32.libを加えています。
これでいいのかどうかいまいち自信はもてませんが大丈夫だと思っています。
DLLについてはコンパイラが勝手にやってくれるものだと・・・。ちょっとググってきます。

505 :489:2009/04/25(土) 12:55:45
何度もすみません。よく考えたらmakefileをさらせばすむ話なのでは・・・。
runge4-2.exe:runge4-2.obj rk4.obj nrutil.obj
ILINK32 /ap /w- /x /C runge4-2.obj rk4.obj nrutil.obj cw32.lib import32.lib
runge4-2.obj:runge4-2.c
bcc32 -c -w- -Od runge4-2.c
rk4.obj:rk4.c
bcc32 -c -w- -Od rk4.c
nrutil.obj:nrutil.c
bcc32 -c -w- -Od nrutil.c
と、こんなかんじで作りました。DLLと共有ライブラリどちらも問題ないと思っています。

506 :デフォルトの名無しさん:2009/04/25(土) 13:04:18
>>500
フリーズするのは組み込み系のCPUでの話?
それだと使っているコンパイラにも拠るのでなんとも判らん。
そもそも実数なら0割り算で一一フリーズしないから、その変数のサイズに依存したコードでもあるかもね。
いずれにしても、どうしても高速化したいならアセンブリ出力を読めるくらいの知識が欲しいところだ。

507 :デフォルトの名無しさん:2009/04/25(土) 16:12:29
>>505
えーとですね、"exeが動きません"ていうのが何を指してるのか分からないのですよ
runge4-2.exe を実行すると、何もメッセージが出ずにプロンプトに戻るとか
エラーダイアログが出るとか。

そうじゃなくて、実行結果(printfの出力)が期待と違うというのなら、
>>492 のいうように言語・環境の問題じゃないので、専門家を召還するしかない


508 :デフォルトの名無しさん:2009/04/25(土) 17:08:57
静的ハフマン符号ってのを見てるんですが
1バイトのデータごとに出現回数を見て、頻度の高いものから2進数の符号を
割りあてるようにしようと思っています。
置換後の符号をそれぞれ
0, 10, 110, 1110, 11110, 111110, 1111110, 11111110, 11111111
とすると1バイトでは上記の9通りのデータしか置換できませんが
残りのデータはどうするんでしょうか。


509 :デフォルトの名無しさん:2009/04/25(土) 17:22:22
>>508
2バイト以上使えばよい

510 :デフォルトの名無しさん:2009/04/25(土) 18:11:51
ハフマン符号の説明は糞ばかりだからな

511 :デフォルトの名無しさん:2009/04/25(土) 19:14:11
9通りの内の一つを次の符号参照にしてそれを繰り返す。
byte* return_buf={次符号参照の記号,頻度最大の値,頻度最大の値-1,・・頻度最大-7の値,{入力の符号化},次符号参照の記号,頻度最大-8の値,・・頻度最大-15の値,{入力の符号化}次符号参照の記号,頻度最大-16の値,・・};

殆どの場合酷いことになるが。

512 :デフォルトの名無しさん:2009/04/25(土) 20:24:00
byteって何ですか?
組み込み型ですか?

513 :デフォルトの名無しさん:2009/04/25(土) 20:25:55
企業というか社会に巣食う大人が都合よく使い捨てる労働力です

514 :デフォルトの名無しさん:2009/04/26(日) 02:36:30
L'Arc〜en〜CielのVOCALです

515 :デフォルトの名無しさん:2009/04/26(日) 09:42:46
>>513  そうアルね

516 :489:2009/04/26(日) 12:46:48
>>507
なるほど。肝心な部分が抜けていたようですみませんでした。
runge4-2.exeを実行するとscanfすら実行せずにエラーで強制終了します。
出力先を指定してもなにも返さない(値が入っていない)のでプログラム自体がまったく動いていないのだと思います。
エラー報告の詳細にはAppver:0.0.0.0 Modver:0.0.0.0 Offset:00001017と出ていました。
要領を得ない説明で申し訳ないです。これでどうでしょうか。


517 :デフォルトの名無しさん:2009/04/26(日) 23:53:39
すみません、C#しかやったことのない初心者なんですが、
C言語はじめてみて、日付の演算がもの凄く面倒に感じました。
(1ヶ月先の日付等を取得する場合などに、
 年越しでの年+1や閏年なんかはデフォルトでは判定してくれないようなので)
みなさんはやはりラッパ書かれて対処されているのでしょうか?

518 :デフォルトの名無しさん:2009/04/27(月) 00:04:04
A: そんなことが必要になったらCを使わない。
C#とかC++とかでいいじゃない。

というのはあんまりだけど、とりあえずmktimeはある程度考慮してくれたはず。

519 :デフォルトの名無しさん:2009/04/27(月) 01:13:06
教えてください。
小学生の問題みながら作ってみたんですが、うまく作動しません。

もしかしたら根本的に間違えてるかもです。
指摘おねがいします。

main(){
int a,n,y,x;
scanf("%d%d%d",&a,&n,&y);
x=y-a*n;
printf("%d\n",x);
}

520 :デフォルトの名無しさん:2009/04/27(月) 01:14:29
どう作動したらよくて、現状はどうなってるからダメなのか書け

521 :デフォルトの名無しさん:2009/04/27(月) 01:32:00
小学生の問題はちょっと背伸びしすぎじゃないかい君


522 :デフォルトの名無しさん:2009/04/27(月) 01:40:18
さすがもっとも小学生に近い男、言うことが違うなw

523 :デフォルトの名無しさん:2009/04/27(月) 03:48:49
>>520


えと、X=Y-A×N

の計算をやらせたいのですが、なにも表示されません。エラーの表示もでません。
空白です。

つかってるのはめじろってやつです。

524 :デフォルトの名無しさん:2009/04/27(月) 03:51:02
>.521


えっと、

A円のものをN個買いました。
Y円で支払いをしました。
おつりはX円になるか求めよ。

ってのを作ったつもりなんです。

525 :デフォルトの名無しさん:2009/04/27(月) 03:54:06
>>523
キーボードで入力はしたのか?


526 :デフォルトの名無しさん:2009/04/27(月) 04:14:48
>>525

といいますと・・・?

メモ帳で作成したのを、メジロで実行しております。
文字列やその他は間違えていませんか?

527 :デフォルトの名無しさん:2009/04/27(月) 04:36:55
scanfの意味がわかってないのに使ってるのか?

528 :デフォルトの名無しさん:2009/04/27(月) 09:11:34
xが全角の文字な気がするのは気のせいか?

529 :デフォルトの名無しさん:2009/04/27(月) 09:33:36
エラーメッセージも書けないような奴を相手にするだけ無駄ってことだな。

530 :デフォルトの名無しさん:2009/04/27(月) 09:44:01
小学生に厳しいですね

531 :デフォルトの名無しさん:2009/04/27(月) 09:46:08
大丈夫、今時の小学生だってコピペくらいできる。

532 :デフォルトの名無しさん:2009/04/27(月) 09:58:03
メジロってC言語インタプリタか
ググったけどよく分からんかった

533 :デフォルトの名無しさん:2009/04/27(月) 10:36:57
入れて見たがVista64だとうまく動かんな、、、VMWareのほうに入れてみるか

534 :デフォルトの名無しさん:2009/04/27(月) 10:48:19
#define <stdio.h>

int main(void) {



}

535 :デフォルトの名無しさん:2009/04/27(月) 10:49:16
XPだと何とか動いた。
>>519そのまま実行して、

14 5 1000(リターン)

930
と表示されたが

536 :デフォルトの名無しさん:2009/04/27(月) 12:36:01
>>519
何も表示されないのがいやなら
printf("1個の値段を入力:");
scanf("%d", &a);
printf("個数を入力:");
scanf("%d", &n);
printf("所持金を入力:");
scanf("%d", &y);
とかしろ


537 :デフォルトの名無しさん:2009/04/27(月) 19:48:23
すみません。どうも求められている答えがわかりません。

6桁の16進数で入力されたカラーをRGBに分解して表示するプログラムを作成しましょう。

int color, r, g, b;

scanf("%6X", &color);
r=[空欄] ([空欄]);
g=[空欄] ([空欄]);
b=[空欄] ([空欄]);

printf("RGB(%d,%d,%d)\n", r, g, b);

return 0;


538 :デフォルトの名無しさん:2009/04/27(月) 20:04:32
r=RGB_GETRED( color );
g=RGB_GETGREEN( color );
b=RGB_GETBLUE( color );

RGB_GETRED(rgb) (((rgb) >> 16) & 0xff)
RGB_GETGREEN(rgb) (((rgb) >> 8) & 0xff)
RGB_GETBLUE(rgb) ((rgb) & 0xff)

539 :デフォルトの名無しさん:2009/04/27(月) 20:09:28
>>537
俺なら
r = (color >> 16) & 0xFF;
g = (color >> 8) & 0xFF;
b = (color >> 0) & 0xFF;
にする


540 :デフォルトの名無しさん:2009/04/27(月) 21:32:51
空欄にあってないがな


541 :デフォルトの名無しさん:2009/04/27(月) 22:23:57
>>516
scanf()の前で死ぬというのは不可解だけど、
rk4()の5番目の引数が >>489>>493 で違っている。
いずれにせよ >>489 のソースに rk4のプロトタイプ宣言を入れたほうがいい。

あと、>>489 の scanf と derivs の呼び出しは順番が逆じゃないかね
これじゃ不定値を dydx[1] にコピーしちゃう。

542 :デフォルトの名無しさん:2009/04/27(月) 22:26:04
下みたいな2つのコードを書いた場合

int a = INT_MAX;
a += 1;

unsigned int b = UINT_MAX;
b += 1;

aの方は0にならないというか未定義だと思うんだけど、
bの方も未定義になる?
bは0になるんじゃないかと思ってるんだけど実は処理系依存とかだったりする?

543 :デフォルトの名無しさん:2009/04/27(月) 22:29:05
すまん、上の例だとaが0になることなんて殆どないな。
まあこちらに関しては未定義だと思うからあんまり意味は無いけども。

544 :ごすけ:2009/04/27(月) 22:30:40
教えてください。
/*引数n(<=1000)の入力に対して1~nの間の素数をすべて求めて、
コンソールに表示するプログラムを作成せよ。(ちなみに1は素数ではない)*/
を、for文を使ってお願いします。

545 :デフォルトの名無しさん:2009/04/27(月) 22:31:17
>>542
符号付き整数がオーバーフローした場合は未定義動作だが、
符号なし整数が範囲外にでたときは、
(MAX+1)を何回か足したり引いたりして範囲内になるようにした値になることになってる。

546 :デフォルトの名無しさん:2009/04/27(月) 22:31:33
>>544
ググれ

547 :デフォルトの名無しさん:2009/04/27(月) 22:31:53
>>544
宿題スレいけ

548 :デフォルトの名無しさん:2009/04/27(月) 22:36:49
>>544
だいたいそれぐらい出来なくて将来どうする気だ
働く先がないぞ。

549 :デフォルトの名無しさん:2009/04/27(月) 22:36:53
>>544
エ***ふるい

550 :ごすけ:2009/04/27(月) 22:41:37
初心者だったんで、教えてほしかったんです。
ググりました。引数は見つからなかったんです。

私の将来、これからなんで。

ご丁寧にありがとう。

551 :デフォルトの名無しさん:2009/04/27(月) 22:42:04
>>545
レスありがとうございます。
一つよくわからないんですがこの場合は必ずある特定値になるんでしょうか?
それとも単に範囲内に収まるって事だけが決められていて、
0〜UINT_MAXの値ならどれでも取りうるってことでしょうか?
例えばintが32ビット長なら計算結果の下位の32ビットがbに入ってるとは限らないのでしょうか?

552 :デフォルトの名無しさん:2009/04/27(月) 22:46:08
特定の値だろ。MAXと-1はかなり関係がある。MAXで1足したら0だろ。

553 :デフォルトの名無しさん:2009/04/27(月) 22:47:11
2の補数、1の補数とかCPUの依存はあるかも知れないが、通常だと0のはずだ。試してないが。

554 :デフォルトの名無しさん:2009/04/27(月) 22:48:51
>>551
unsigned intの取り得る値は(UINT_MAX+1)個しかないから、
ある範囲外の値に(UINT_MAX+1)の整数倍を足して得られる
範囲内の値はただ一つに定まる。

ただし、(UINT_MAX+1)が2の冪乗である保証はどこにもないので、
下位ビットにそのままなるとは限らない。

555 :542:2009/04/27(月) 22:57:01
なるほどよくわかりました。
上司からこれは未定義といわれてしまって納得がいかなかったので質問させていただきました。

>ただし、(UINT_MAX+1)が2の冪乗である保証はどこにもないので、
>下位ビットにそのままなるとは限らない。
たしかにこれはそうですね。
ただ今の環境だとUINT_MAX+1は2のべき乗なのでこれに関しては大丈夫そうです。

556 :デフォルトの名無しさん:2009/04/27(月) 22:59:16
stringで、
str.find("hoge") == -1
という比較が出来る。
左辺は、unsignedだが。

557 :デフォルトの名無しさん:2009/04/27(月) 23:01:18
>>555
変なスレタイだけど、次からこっちいくといいよ

【初心者お断り】ガチ規格準拠C専用スレ Part133
http://pc12.2ch.net/test/read.cgi/tech/1201153965/

558 :デフォルトの名無しさん:2009/04/27(月) 23:08:08
>>556
それは厳密には環境依存なので、正しくはnposと比較すべきです。

559 :489:2009/04/27(月) 23:20:46
>>541
レスありがとうございます。
たしかにプロトタイプ宣言が抜けていました。基本的なミスとはorz
関数宣言での変数は関数の型宣言だけで中身は何でもいいのかと思っていました。こちらも改善します。
また、derivesの値もたしかに不定のままになっていました。
なぜかまだ動かないままなのでなんともいえませんが、プログラムがかなり改善できたと感じます。
ご助言ありがとうございました。

560 :デフォルトの名無しさん:2009/04/28(火) 01:28:12
ツェー言語

561 :デフォルトの名無しさん :2009/04/28(火) 01:55:55
>>345
エスパーで
ファイルの先頭に
#pragma comment(lib,"libjpeg.lib")
を置いてみたら?

562 :デフォルトの名無しさん:2009/04/28(火) 23:26:14
>>508でハフマン符号について質問した者です。
0には割り当てず、8通り以外のデータは0の次に持ってくる方法にしました
(勉強のため圧縮率は考えていません)。
時間をかけて何度もデバッガを使いながら実装してみたのですが、
多くの文字については復号できているのです
(zip内のdata.txtがオリジナル、huffman.txtが復号したものです)が
バイナリエディタかvim等で見て頂ければわかる通り、
一部の文字が0x00になってしまい、正しく復号できません。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9110.zip
ご教示お願いします。

563 :デフォルトの名無しさん:2009/04/29(水) 00:13:00
point[5]=

564 :デフォルトの名無しさん:2009/04/29(水) 00:19:16
point[5]={10,50,20,40,30}という配列があります。
これを大きいものから順に並べてjyuni[5]の配列に入れたいと思っています。

jyuni[5]={50,40,30,20,10}となるように格納するのではなく、pointの何番目が一番大きいという形で格納したいのですが。

今回の場合で言うと、jyuni={1,3,4,2,0}となって欲しいのですが、このような処理はどうやったら良いでしょうか?

わかりにくいかと思うのですが、よろしくお願いします

565 :デフォルトの名無しさん:2009/04/29(水) 01:23:21
>>564
{ {10,0},{50,1},{20,2},{40,3},{30,4}}
をソートして
{{50,1},{40,3},{30,4},{20,2},{10,0}}
とするとお望みのことが出来るのでは?

566 :デフォルトの名無しさん:2009/04/29(水) 01:42:02
//ソート前
point[5]={10,50,20,40,30}
...
//ソート関数中のスワップ部分
tmp = point[i];
point[i] = point[j];
point[j] = tmp;
...
//ソート後
point[5]={50,40,30,20,10}



//ソート前
point[5]={10,50,20,40,30}
index[5]={0,1,2,3,4}
...
//ソート関数中のスワップ部分
tmp = point[i];
point[i] = point[j];
point[j] = tmp;
tmp = index[i];
index[i] = index[j];
index[j] = tmp;
...
//ソート後
point[5]={50,40,30,20,10}
index[5]={1,3,4,2,0}

567 :デフォルトの名無しさん:2009/04/29(水) 01:59:22
>>566
pointの中身は動かしたくないのですが・・・・できませんか?

568 :デフォルトの名無しさん:2009/04/29(水) 02:09:18
pointをコピーした配列を用意してそっちをソートすれば

569 :デフォルトの名無しさん:2009/04/29(水) 02:12:15
>>564
#include <stdio.h>

int main(void)
{
int i, j, point[5] = {10,50,20,40,30}, jyuni[5];

for(i=0; i<5; i++) {
for(j=i; j> 0; j--) {
if(point[i] < point[jyuni[j-1]]) break;
jyuni[j] = jyuni[j-1];
}
jyuni[j] = i;
}

for(i=0; i<5; i++) printf("%d ", jyuni[i]);

return 0;
}

570 :デフォルトの名無しさん:2009/04/29(水) 02:24:03
ソートしてみたり
#include <stdio.h>

int main(void)
{
int i, j, point[5] = { 10, 50, 20, 40, 30}, jyuni[5] = { 0, 1, 2, 3, 4};

for(i=4; i> 0; i--) {
for(j=0; j<i; j++) {
if(point[jyuni[j]] < point[jyuni[j+1]]) {
int temp = jyuni[j];
jyuni[j] = jyuni[j+1];
jyuni[j+1] = temp;
}}}

for(i=0; i<5; i++) printf("%d ", jyuni[i]);

return 0;
}

571 :デフォルトの名無しさん:2009/04/29(水) 02:34:01
かた〜いw

572 :デフォルトの名無しさん:2009/04/29(水) 05:09:47
おまえらqsortを使え

#include <stdlib.h>

int point[5] = {10, 50, 20, 40, 30};
int jyuni[5] = { 0, 1, 2, 3, 4};

int cmp(const void *s1,const void *s2)
{
int *p1 = (int *)s1;
int *p2 = (int *)s2;

if(point[*p1] == point[*p2])return 0;
else if(point[*p1] < point[*p2])return 1;
else return (-1);
}

main()
{
qsort(jyuni,5,sizeof(int),cmp);
}


573 :デフォルトの名無しさん:2009/04/29(水) 05:20:16
>>572
>>567

574 :デフォルトの名無しさん:2009/04/29(水) 05:29:03
>>573
バカ発見

575 :デフォルトの名無しさん:2009/04/29(水) 05:45:08
debtさん

コントローラーの状態正しく取得するには
・ProcessMessage()もしくはRenewInput()を一定サイクルで呼び出す。
・上記処理の後でGetJoypadInputState()もしくはGetInputState()でボタン別の情報を取得
としないとだめです。

ProcessMessage()の中でRenewInput()を呼び出していますので
下記部分を崩してなければ取得はできるはずなんですが・・・・

//ループで必ず行う3大処理
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll_2();//現在のキー入力処理を行う
return 0;
}

int main()
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

while(ProcessLoop()==0)
{//メインループ    



576 :デフォルトの名無しさん:2009/04/29(水) 05:45:49
みすwww

577 :デフォルトの名無しさん:2009/04/29(水) 09:07:16
>>567
pointの中身を動かしたくなければpointの配列へのポインタを
作ってそちらをソートすればよかろう

578 :デフォルトの名無しさん:2009/04/29(水) 09:25:34
ソートするのはjyuniなんだからpointなんて最初からコピー作る必要がない
と思うよ。


579 :デフォルトの名無しさん:2009/04/29(水) 09:47:02
>>564
#include<stdio.h>
#include<stdlib.h>

int cmp(const void *x, const void *y)
{
int * const *a, * const *b;

a=x;
b=y;
if(**a>**b) return -1;
return **a<**b;
}

int main(void)
{
int point[5] = {10, 50, 20, 40, 30};
int *p_point[5], jyuni[5], i;

for(i=0;i<5;i++) p_point[i]=&point[i];
qsort(p_point, 5, sizeof(int*), cmp);
for(i=0;i<5;i++) jyuni[i]=p_point[i]-point;
for(i=0;i<5;i++) printf(" %d", jyuni[i]);

return 0;
}

580 :デフォルトの名無しさん:2009/04/29(水) 10:02:05
>>572
int cmp(const void *s1,const void *s2)
{
 return point[*(int *)s1] - point[*(int *)s2];
}

581 :デフォルトの名無しさん:2009/04/29(水) 14:45:45
mallocで確保したメモリーは必ず""で埋められているものなのでしょうか?
不定な値が入っていることはないんでしょうか?

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

int main()
{
char *str;
str = malloc(8);
printf("'http://pc12.2ch.net/test/read.cgi/tech/1238087817/l50'", str);

return 0;
}

以上ソースをcompileして1万回実行してみたんですが、変な文字列が出力されることはありませんでした。
しかし、man malloc を読むと"The memory is not cleared"と書かれており、
環境によっては不定な値が出力されたりするのか心配です…


* 環境
コンパイラ: gcc-4.3.2 ($ gcc -Wall hoge.c -o hoge とcompileしました)
OS: Linux (Debian-Lenny)

582 :デフォルトの名無しさん:2009/04/29(水) 14:48:32
>>581
たとえば、どこかでメモリ使ったあとfreeして
その場所がまたmallocで割り当てられたら?

583 :581:2009/04/29(水) 14:49:40
誤植が多くすみません。再投稿いたします。
---
mallocで確保したメモリーは必ずNULLで埋められているものなのでしょうか?
不定な値が入っていることはないんでしょうか?

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

int main()
{
char *str;
str = malloc(8);
printf("%s", str);

return 0;
}

※以下581に同

584 :デフォルトの名無しさん:2009/04/29(水) 14:53:38
>>581
検証プログラムがワルワルだな。
もっとしっかり検証汁


585 :デフォルトの名無しさん:2009/04/29(水) 14:54:29
>>583
確保したメモリが'\0'でクリアされている保証があるのはcalloc()のみ
malloc()はローカル変数と同じで不定値

586 :デフォルトの名無しさん:2009/04/29(水) 14:55:29
>>583
たまたま埋まってる場合もあるけど、ほとんどは埋まってないはず。

mallocで確保したエリアはmemsetなどでクリアするのが普通です。


587 :デフォルトの名無しさん:2009/04/29(水) 15:02:29
>>586
わざわざbcopy() するのですかねえ。

588 :デフォルトの名無しさん:2009/04/29(水) 15:05:36
4.3BSD. この関数は廃止予定である (POSIX.1-2001 では過去の名残 (LEGACY) とされている)。
新しいプログラムでは memcpy() や memmove() を使用すべきである。
memcpy() や memmove() では、最初の 2 つの引数の順序が入れ替わっていることに注意すること。
POSIX.1-2008 では、 bcopy() の仕様が削除されている。

589 :デフォルトの名無しさん:2009/04/29(水) 15:16:52
一発でエラーがでますた。

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

#define TEST_SIZE 100000

main()
{
unsigned char *test;
int i;

test = (unsigned char *)malloc(TEST_SIZE);

for(i = 0;i < TEST_SIZE;i++){
test[i] = i % 0x100;
}

free(test);

test = (unsigned char *)malloc(TEST_SIZE);

for(i = 0;i < TEST_SIZE;i++){
if(test[i]){
printf("%7d %2x\n",i,test[i]);
}
}
}


590 :デフォルトの名無しさん:2009/04/29(水) 15:37:36
>最初の 2 つの引数の順序が入れ替わっていること
なんでこんな余計なことするんだろw

591 :デフォルトの名無しさん:2009/04/29(水) 15:38:13
とりあえず calloc を使え


592 :581:2009/04/29(水) 15:43:27
>>589
私の環境でもコンパイルして実行してみたんですが、エラーとかセグメンテーションフォールトが
でませんでした…たまたまかな…… gccでワーニングでないように以下のソースで実行してみました。

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

#define TEST_SIZE 100000

int main()
{
unsigned char *test;
int i;

test = (unsigned char *)malloc(TEST_SIZE);

for(i = 0;i < TEST_SIZE;i++){
test[i] = i % 0x100;
}

free(test);

test = (unsigned char *)malloc(TEST_SIZE);

for(i = 0;i < TEST_SIZE;i++){
if(test[i]){
printf("%7d %2x\n",i,test[i]);
}
}

return 0;
}

593 :581 (1/2):2009/04/29(水) 15:44:23
レスありがとう!やっぱり不定なんですね…参考になります。

実は今、標準出力から文字列を読み込んで処理させるようとしています。
読み込む文字列の長さに応じて1KBづつreallocで文字列格納領域を拡張しながら
strncatで文字列をつなげようとしてるんですが、格納領域を最初にNULLで埋める
必要があるのかないのかどうか?迷っています。

realloc(NULL, n)はmalloc(n)と同等だと思うのですが、
reallocしてstrncatする前に、文字列格納領域の最初に'\0'を書き込んで置くべきでしょうか?
mallocの結果が不定だとすると初期化が必要なのかな?

以下は、検証用に標準出力から文字列を読み込んでそのまま表示させるソースです。
文字列格納領域(str)に、最初に'\0'を書き込んでおかなくても今のところ問題はないのだけど、
場合によっては不定な値になって問題出てくるのかな?


標準入力からの入力をつなげるときって、みなさんどうされてますか?

594 :581 (2/2):2009/04/29(水) 15:45:29
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BLOCK 1024

int main(int argc, char *argv[])
{
char buf[BLOCK + 1];
char *str = NULL;
int n;
int size_str = 1;

/* str = malloc(1); */ ←この部分がいるのかいらないのか?
/* *str = '\0'; */
while (1) {
n = fread(buf ,1 , BLOCK, stdin);
if (n == 0) {
break;
} else if (n < 0) {
perror("fread");
return -1;
}
*(buf + n) = '\0';
size_str = size_str + n;
str = realloc(str, size_str);
strncat(str, buf, n);
}
printf("%s", str);
free(str);

return 0;
}

595 :デフォルトの名無しさん:2009/04/29(水) 15:48:36
realloc()もmalloc()と同じくもし領域を拡大した場合は
その領域の値は不定値
要注意

596 :581:2009/04/29(水) 15:51:13
標準出力じゃなくて入力でした。何度も誤記申し訳ない…

$ gcc -Wall test.c -o test
$ echo 'hoge...fuga' | ./test
hoge...
...
...fuga

のように検証しています。パイプで渡したデータを処理するプログラムが書きたい…

597 :デフォルトの名無しさん:2009/04/29(水) 15:53:56
strcatでつないでいくのであれば
最初の1バイト目に0を書き込んでおけばあとは何もいらんだろ。

598 :デフォルトの名無しさん:2009/04/29(水) 16:10:36
低レベルな質問で申し訳ないですが
メイン関数から受け取った文字列の領域の長さを求める方法を教えてください
サブ関数の仮引数で(char* str)で受け取った場合とかsizeofでやると4の値が返ってきてしまいます

599 :デフォルトの名無しさん:2009/04/29(水) 16:12:24
int len = 0;
while(*str++) len++;

600 :デフォルトの名無しさん:2009/04/29(水) 16:12:54
>>598
そりゃchar*であろうがポインタのサイズだからだよ
4バイトってことは32bitCPUかな?

strlenでいけると思うけど、関数を呼ぶ側がちゃんとstrlenが暴走しないような
文字列を送ってくれるならそれでいいけどそれ以外は長さをもらうとかしないと
検知はできないね

601 :デフォルトの名無しさん:2009/04/29(水) 16:16:56
stringつかえよ。 

602 :デフォルトの名無しさん:2009/04/29(水) 16:20:03
>>600
ふむふむなるほどですね
でも例えばstr[10] = "abc";でstrlenを使うと3の値で返ってきてしまうんですよね
そうするとstrの変数の全領域の長さがわからなくなってしまう
サブ関数内でポインタ変数の指す領域の長さってどうやれば良いのかな?
やっぱり上位関数から長さも引数として与えなければいけないんですかね?

603 :デフォルトの名無しさん:2009/04/29(水) 16:22:13
>>602
>上位関数から長さも引数として与えなければいけないんですかね?
その通りです

そういうのが保証されるのが望ましいならCは無理ですね


604 :デフォルトの名無しさん:2009/04/29(水) 16:25:53
>>603
ありがとうございました!
大人しく引数を増やします

605 :デフォルトの名無しさん:2009/04/29(水) 16:48:24
小手先でどうにかなるほどCの歴史は浅くないけど
struct simple_str {
  int len;
  char *str;
};
みたいなのを昔使ってたことはヒミツ
いまじゃStringです

606 :デフォルトの名無しさん:2009/04/29(水) 16:57:50
pascalの文字列だな

607 :デフォルトの名無しさん:2009/04/29(水) 17:03:37
しかし直近のmallocの初期化といい、文字列といい
マネージド開発から流れてきてるのがいるのかね?

Cはぶっちゃけアセンブラにかぶせた皮程度だからほぼ自分で面倒見るしかないし
なんらかの安全のためのソフトウェアスタックをかぶせるくらいなら後発の言語使えば
いいだけだしなあ

608 :デフォルトの名無しさん:2009/04/29(水) 17:05:03
いつの時代もC初心者はいるよ。
今ならそうだな、新入社員とか。

609 :デフォルトの名無しさん:2009/04/29(水) 17:08:14
とはいえ、初期化の時に何がデフォルト初期化されて、
何がされないかは、言語ごとにいつも戸惑うことになるのも事実。

610 :デフォルトの名無しさん:2009/04/29(水) 17:11:25
>>609
それは実行形式 PE とか elf を考えればおのずとわかるのでは

611 :デフォルトの名無しさん:2009/04/29(水) 17:14:09
考えたくない事実

612 :デフォルトの名無しさん:2009/04/29(水) 17:22:50
ちゃんと必要な値で初期化してればデフォルトなんて考える必要なし

613 :デフォルトの名無しさん:2009/04/29(水) 17:23:54
しかしその非効率性すら惜しむのがC

614 :デフォルトの名無しさん:2009/04/29(水) 18:00:55
変数の未初期化は、lintでも(最近の)Cコンパイラでも警告だすだろ
malloc()で取った領域の初期化は、プロセスのメモリサイズ増えるし余計なお世話

615 :デフォルトの名無しさん:2009/04/29(水) 18:14:27
バブルソートで質問。

for( i = 0 ; i < 10 ; i++ ){
  for( j = 0 ; j < 10 ; j++ ){

     if( a[i] > a[j] ){   //iとjの数値は同じなので比較。

     temp = a[i];     //tempにa[i]を格納
     a[i] = a[j];      //a[i]にa[j]を格納
     a[j] = temp;      //先ほど格納したa[i]をa[j]に格納

     }
   }
 }

これの1,2行目って同時に回してる訳じゃないよね?
そうだったらi=0とj=0の時、if文での比較で「同じ配列の数字」が判定されるんだよね?

i=1の時に、j=0と比べてるって事でいいんだよね?

初心者ですまんが、ここがどうしても分かりづらいから解説頼む。



616 :デフォルトの名無しさん:2009/04/29(水) 18:18:23
良く似た話だけどc++でnewを使って領域を確保した時はどうなん?
0でメモリを初期化してるのかな?


617 :デフォルトの名無しさん:2009/04/29(水) 18:24:22
してません。
クラスや構造体の場合はコンストラクタの振る舞いに依ります。

618 :デフォルトの名無しさん:2009/04/29(水) 18:24:29
>>615
それバブルソートじゃないからw

619 :デフォルトの名無しさん:2009/04/29(水) 18:26:23
>>616
コンストラクタ、デストラクタを理解してください

620 :デフォルトの名無しさん:2009/04/29(水) 18:28:05
単純ソートだな。
for( i = 0 ; i < 10 - 1 ; i++ ){
  for( j = i + 1 ; j < 10 ; j++ ){
こうじゃないの?

621 :デフォルトの名無しさん:2009/04/29(水) 18:31:39
int flg;

do{
flg = 0;
  for( i = 0 ; i < 10 - 1 ; i++ ){
j = i + 1
     if( a[i] > a[j] ){   //iとjの数値は同じなので比較。

      temp = a[i];     //tempにa[i]を格納
      a[i] = a[j];      //a[i]にa[j]を格納
      a[j] = temp;      //先ほど格納したa[i]をa[j]に格納
flg = 1;
     }
   }
 }while(!flg);

いっそ こうだと思うよ


622 :デフォルトの名無しさん:2009/04/29(水) 18:37:01
>>620
それだと降順になった。

結局
for( i = 0 ; i < 10 - 1 ; i++ ){
  for( j = i ; j < 10 ; j++ ){

でiとjは同じ数字でループしているのか
iの方が1多い数字でループしているのか

どっち?

623 :デフォルトの名無しさん:2009/04/29(水) 18:39:01
2重ループがまったく理解できてないと思われる。

624 :デフォルトの名無しさん:2009/04/29(水) 18:39:28
ソートとかリストのような有名なアルゴリズムはぐぐってもでてくるだろ

625 :デフォルトの名無しさん:2009/04/29(水) 18:41:04
まずはループの中でprintf("%d, %d\n", i, j);とかやってみそ

626 :デフォルトの名無しさん:2009/04/29(水) 18:44:30
>>621
なんかバグっぽいけど、こんな感じです


627 :デフォルトの名無しさん:2009/04/29(水) 19:23:41
>>625
あーなるほど。
もの凄い分かりやすかったw

助かった、ありがとう

628 :デフォルトの名無しさん:2009/04/30(木) 10:56:05
光沢液晶のディスプレイなんかでよくプログラミングなんかする気になるな

629 :デフォルトの名無しさん:2009/04/30(木) 13:40:13
1 #include<stdio.h>
2
3 #define CONST_VAL 10.8
4 #define CONST_VAL2 (CONST_VAL*10)
5 #define CONST_STR "C Language"
6
7 int main(void){
8 printf("CONST_VAL = %g\n",CONST_VAL);
9 printf("CONST_VAL2 = %g\n",CONST_VAL2);
10 printf("CONST_STR = %s\n",CONST_STR);
11 return 0;
12 }
~ /*実行結果*/
CONST_VAL = 10.8
CONST_VAL2 = 108
CONST_STR = C Language
このとき10行目の%sを%gとすると、C Lanfuageのところが108と表示されます。
これはなぜなんでしょうか?ぼくの考えではでたらめな数字がでるか表示されない
と思ったんですが・・・詳しい方教えてください。


630 :デフォルトの名無しさん:2009/04/30(木) 13:46:36
鼻から悪魔がでてるから

631 :デフォルトの名無しさん:2009/04/30(木) 13:54:49
環境は?
たまたま、を除外するとなるとアセンブラ出力してみてるのが確実
うちはそうならんけどな

632 :デフォルトの名無しさん:2009/04/30(木) 13:56:19
>>629
出鱈目な数字がでて、予想通りじゃないか。

633 :デフォルトの名無しさん:2009/04/30(木) 14:02:35
>>631
コンピュータ初心者なので
環境といわれて何を答えたらいいかわかりません。すみません・・・
コンパイラーはgccです。
>>632
そうなんでしょうか?
数値からしてCONST_VAL2と何か関係があるような気がしてならないのですが・・・

634 :デフォルトの名無しさん:2009/04/30(木) 14:04:19
まさかみなさんのパソコンでやるとでたらめな数字がでてくるということですか?

635 :デフォルトの名無しさん:2009/04/30(木) 14:05:29
>>633
もしかすると関係しているかもしれないが、「未定義」とはそういうことも含めて出鱈目な動作になるってこと。

636 :デフォルトの名無しさん:2009/04/30(木) 14:06:23
未定義動作なんだから、それでどうなるかを論じるのはナンセンス。
どうして108になるか知りたければ、-Sつけてコンパイルしろ

637 :デフォルトの名無しさん:2009/04/30(木) 14:09:45
>>635
>>636
回答ありがとうございました。
未定義動作の意味がわからないので調べます。


638 :デフォルトの名無しさん:2009/04/30(木) 14:10:43
-S付けてもわかるとは限らん
つかFP数を関数に渡すときはFPレジスタを使うという
APIで、直前に設定した108が上書きされず残っていた
ということだろう

639 :デフォルトの名無しさん:2009/04/30(木) 14:13:14
>>630
未定義動作のことをいっていたのですね。
回答ありがとうございました。

640 :デフォルトの名無しさん:2009/04/30(木) 14:15:14
>>638
回答ありがとうございます。
よくわからない単語がたくさんあるので調べます。

641 :デフォルトの名無しさん:2009/04/30(木) 14:44:43
>>640
>638を調べて理解しようとしない方がいいよ。今の段階ではそこまで意識する必要はないから。

642 :デフォルトの名無しさん:2009/04/30(木) 14:58:16
>>640
そうですね。
調べてもよくわかりませんでした。
初心者にはまだ早いようです。

643 :デフォルトの名無しさん:2009/04/30(木) 19:02:41
久々にこのスレに来た。教えてやれよみんな。
スレタイ的には俺に聞けだぜ?

>>642
待て。
それが分からないとC言語プログラミングは諦めた方がいいくらいの大事な事項ですよ。

未定義undefinedの動作ってのはつまり何がおきるか定義されていないってことです。
未定義undefinedの動作になるようなソースコードをコンパイラに渡した場合、
コンパイラは好き勝手なコードを出力していいよとC言語の仕様書にあるという意味です。
例えばその実行ファイル(Winなら.exe)を実行した次の瞬間に
君のPCが爆発してもおかしくない(C言語の使用に反していない)ってことです。
これを表すのに鼻から悪魔がでるという表現を使うこともあります。

644 :デフォルトの名無しさん:2009/04/30(木) 19:05:15
最近東京図書館開かないな・・・

645 :デフォルトの名無しさん:2009/04/30(木) 19:18:16
>>644
どうしたつぶやき。

646 :デフォルトの名無しさん:2009/04/30(木) 19:20:35
>>643
「未定義」であることだけ判ればいいと思うよ。
少なくとも、>638にあるような「FP数」だとか「API」だとか、
言葉の使い方もいい加減だし理解するべきことでもない。

647 :デフォルトの名無しさん:2009/04/30(木) 19:22:45
別に未定義でも処理系定義でも、初心者的には書いちゃダメなコード程度のもので、
その辺の言葉を覚えるのは入門レベルの話じゃないと思った。

648 :643:2009/04/30(木) 19:23:04
>>646
俺もほぼ君に同意。
まあ未定義であるということは、
うまく動くかもしれないしとんでもないバグになるかもしれないということは
肝に銘じておいて欲しい。
それがC言語を扱う者のマナーというか命綱。

649 :デフォルトの名無しさん:2009/04/30(木) 23:09:46
>>646
FP=Floating Point
API = Application Interface
覚えて帰ってね

650 :デフォルトの名無しさん:2009/04/30(木) 23:13:19
>>649
Programming が抜けてるぞ

651 :デフォルトの名無しさん:2009/04/30(木) 23:28:37
w

652 :デフォルトの名無しさん:2009/05/01(金) 11:03:32
下敷きにつながらない

653 :デフォルトの名無しさん:2009/05/01(金) 13:22:58
>>649
背伸びするときくらいシャキっとせい

654 :デフォルトの名無しさん:2009/05/01(金) 14:08:13
浮動小数点数のことを"FP数"なんて普通言わない。
http://www.google.co.jp/search?q=%22FP%E6%95%B0%22&lr=

引数の渡し方を"API"なんて普通言わない。
http://www.google.co.jp/search?q=API&lr=

655 :デフォルトの名無しさん:2009/05/01(金) 15:42:31
じゃあ何て言うの

656 :デフォルトの名無しさん:2009/05/01(金) 16:02:46
引数の渡し方は呼び出し規約じゃないの
stdcallとかfastcallとか


657 :デフォルトの名無しさん:2009/05/01(金) 16:06:24
まあ確かにAPIも見た目は関数そのものだけどだからと言って関数をAPIとは言わないなあ

自分たちで作るコードが対外的に機能を提供する物であれば使ってもらうときに
APIと呼ばれるかもしれないけどねえ
でもAPIの場合はオプソでもなければブラックボックスだし

658 :デフォルトの名無しさん:2009/05/01(金) 21:53:09
関数の行数を減らすためだけに一部の処理を別関数にすることに意味があるんだろうか

659 :デフォルトの名無しさん:2009/05/01(金) 22:08:10
あまりに長い関数なら、機能で区切る意味はある

660 :デフォルトの名無しさん:2009/05/01(金) 22:23:47
電卓プログラムを作ろう。というやつで、
/* hello.c */
#include<stdio.h>
int main(void){
double a,b,tasi,hiki,wari,kake;
scanf("%lf%lf",&a,&b);
tasi=a+b;
hiki=a-b;
wari=a/b;
    kake=a*b;
printf("計:%f\n",tasi);
printf("差:%f\n",hiki);
printf("積:%f\n",kake);
    if(b==0){
   printf("0除算によるエラーです。。\n");
}else{
printf("商:%f\n",wari);
}
return 0;

こいつを作りました。
bが0ときにメッセージを出すつもりだったのですが、
間違った答えが出るわけでもなく、反応がないだけです。
どこを直せば大丈夫ですか?

661 :デフォルトの名無しさん:2009/05/01(金) 22:25:42
割る前にエラー判定しろ、0除算で落ちてるだけ

662 :デフォルトの名無しさん:2009/05/01(金) 22:35:40
C言語を学ぼうと思って、はじめてのAPIって本を買ったのですが自分には敷居が高すぎるようです。
初心者にもわかりやすい本を教えて下さい。

663 :デフォルトの名無しさん:2009/05/01(金) 22:36:12
>>661
できました。
ありがとうございました。

664 :デフォルトの名無しさん:2009/05/01(金) 22:38:59
>>662
私も初心者なんですが、
本はよくわかりませんが、ニコニコの講座はおすすめできます。
ttp://www.nicovideo.jp/watch/nm6216304
最初のうちはこれでいいような気がします。

まぁまだそんなに詳しくはないのでわからないですが・・・


665 :デフォルトの名無しさん:2009/05/01(金) 22:46:42
自分の手を動かさないと意味ない。

666 :デフォルトの名無しさん:2009/05/01(金) 22:50:21
>>662
初心者にこんなこと言うのもなんだがスレ違いだな
C言語を学ぼうとしているのに何故APIの本を買ったのかがわからない

667 :デフォルトの名無しさん:2009/05/01(金) 22:50:37
初心者がいきなりAPIはむりっぽ。

668 :デフォルトの名無しさん:2009/05/02(土) 08:57:06
Amazonとかで検索しても「はじめてのAPI」なんて本無いなあ

669 :デフォルトの名無しさん:2009/05/02(土) 10:04:14
俺も「はじめてのAPI」なんて本聞いたことないなあ
検索しても出てこないし

670 :デフォルトの名無しさん:2009/05/02(土) 18:09:48
APIというのは何かに対するAPIだから、APIそのものというのはない。
なんのAPIなんだろうか?>>662

671 :デフォルトの名無しさん:2009/05/02(土) 18:11:01
APIというかライブラリの使い方を覚えるのは楽しいと思う
まずはpcapとかcurlとか

672 :デフォルトの名無しさん:2009/05/02(土) 20:40:51
すいません。
#include <stdio.h>
main ()
{
char *str[] = {"I","am","Tom"};

int i = 0;

for( ; *str[i] == '\0'; i++) {
printf("%s ",str[i]);
}

return 0;
こういうプログラムを作りまして、一応ビルドは通ったんですけど上手くいかないんです。
どこがおかしいんでしょうか?
よろしくお願いします。

673 :デフォルトの名無しさん:2009/05/02(土) 20:52:16
for( ; *str[i] != '\0'; i++) {

674 :デフォルトの名無しさん:2009/05/02(土) 20:54:14
>>673
それと
char *str[] = {"I","am","Tom", ""};

のように最後に空文字列を付ける('\0')

675 :673:2009/05/02(土) 20:55:07
>>673>>674
どうもありがとうございます。

676 :デフォルトの名無しさん:2009/05/02(土) 22:18:34
/**/
#include <stdio.h>

int main(void)
{
int fun,fin;

printf("2つの整数を入力してください。\n");
scanf("%d",&fun);
scanf("%d",&fin);

if(fun>fin)
{
printf("%dより%dのほうが大きい値です。\n",fin,fun);
}

else if(fun<fin)
{
printf("%dより%dのほうが大きい値です。\n",fun,fin);
}

else
{
printf("2つの数は同じ値です。\n",);
}

return 0;
}

なぜかコンパイルできないんですが、
どこが間違ってるんでしょうか?

677 :デフォルトの名無しさん:2009/05/02(土) 22:20:23
printf("2つの数は同じ値です。\n",);
,が余分

678 :676:2009/05/02(土) 22:27:14
>>677
ありがとうございます。

「やさしいC」の回答のコードなんですが、
本のほうが間違ってたのかな。

679 :118:2009/05/02(土) 22:30:49
>>677
ごめんなさいよく読んでなかったです。
解決しました。

680 :デフォルトの名無しさん:2009/05/02(土) 22:31:55
>>679
118関係ないです。
ちょっとあわててしまったなあ、もう。

681 :デフォルトの名無しさん:2009/05/02(土) 22:41:43
>>677 目が良いな

682 :1/1:2009/05/03(日) 04:11:09
初心者です。
まだ起きてる方いましたら教えてください。
以下のプログラムで足し算を行いたいです。


/*電卓風味の足し算だよ*/

#include<stdio.h>
int main()
{
int a,b,c;

scanf("%d",&a);
scanf("%d",&b);

c=a+b;

printf("結果%d\n",c);
return 0;
}

このプログラムを↓に変える

683 :デフォルトの名無しさん:2009/05/03(日) 04:12:36
/*c=a+bの位置を変えたよ*/

#include<stdio.h>
int main()
{
int a,b,c;
c=a+b;

scanf("%d",&a);
scanf("%d",&b);

printf("結果%d\n",c);
return 0;
}


scanfはユーザー側が入力することが出来るものですよね。

文法では間違っていないと思うんですが何が問題でしょうか?
分割にしないと改行が多すぎとはねられてしまうため分けました。
見にくかったらすみません。

684 :デフォルトの名無しさん:2009/05/03(日) 04:32:29
>>682は数値を入力してから計算するからaとbの値を足した値がcに代入されるけど、
>>683はaもbも値が定まっていない(不定値)の状態で足しているから、cは意味不明な値になる。
だから>>683のほうは値を入力しても意味が無い。

685 :デフォルトの名無しさん:2009/05/03(日) 04:37:37
レスありがとうございます。

簡単にいうとプログラムは上から下に処理していく
      ↓
「a+bの入力をユーザーから入力してもらう方が先」
      ↓
だから「結果のc」を先に書いてもエラー
      ↓ 
になるってことですよね?

686 :デフォルトの名無しさん:2009/05/03(日) 04:42:17
そう

687 :デフォルトの名無しさん:2009/05/03(日) 04:46:07
ありがとうございました。
初心者すぎて呆れちゃいますよね。すみませんでした。

688 :デフォルトの名無しさん:2009/05/03(日) 04:52:31
いやいや気にしなくていいよ。
半分寝た状態で書き込んじゃっただけだから。
これからもその調子で頑張っていけばいいよ。



じゃ、眠いから寝るわ

689 :デフォルトの名無しさん:2009/05/03(日) 08:54:04
floatを含む構造体用のエリアをクリアする場合0x00で埋めるのは大丈夫でしょうか?
intなどは問題ないと思うのですが

690 :デフォルトの名無しさん:2009/05/03(日) 09:34:27
>>689
だめ。0を代入する。

691 :デフォルトの名無しさん:2009/05/03(日) 10:29:43
IEEE754の浮動小数点数なら、全ビット0で0を表すからOK。

692 :デフォルトの名無しさん:2009/05/03(日) 12:25:11
>>689
わかってやる分にはOKかと
ポインタを含む構造体を memset で 0初期化したりとかもよくある。
C++のオブジェクトみたいに得体の知れないものは完全にダメ

693 :デフォルトの名無しさん:2009/05/03(日) 17:50:23
unsigned char hoge;

という1バイトの変数があります。
各ビットごとに比較を行うにはどうしたらいいですか?

3ビット目が0ならば・・・みたいな感じです

694 :デフォルトの名無しさん:2009/05/03(日) 17:52:10
hoge & 0x01
hoge & 0x02
hoge & 0x04
hoge & 0x08
hoge & 0x10
hoge & 0x20
hoge & 0x40
hoge & 0x80

こんな感じ

695 :デフォルトの名無しさん:2009/05/03(日) 17:55:34
for (i = 0; i < CHAR_BIT; ++i) {
 if ((hoge & (1<<i)) != 0)
  printf("bit %d is set\n", i);
}

696 :デフォルトの名無しさん:2009/05/03(日) 17:59:20
>>694
>>695
ありがとうございます。


1 << iとはどういうことですか? i >>1と等価ですか?

697 :デフォルトの名無しさん:2009/05/03(日) 18:02:01
1<<i
ていうのはforでiを変えてその数字分左シフトしてます

つまり
i =0の場合1を0シフトするので1ビット目の調査をします
i =1の場合1を1シフトするので2ビット目の調査をします


698 :デフォルトの名無しさん:2009/05/03(日) 18:07:24
なるほど!
CHAR_BITってのは変数のビット数ですか?8ビット?

699 :デフォルトの名無しさん:2009/05/03(日) 18:08:47
>>698
この場合は変数じゃなくてdefineでcharの最大ビット数である8が入ってると
考えるのが普通かと

700 :デフォルトの名無しさん:2009/05/03(日) 18:12:43
自分を基準に普通とか言っても、そのレベル未満の相手には通じない

701 :デフォルトの名無しさん:2009/05/03(日) 18:24:00
CHAR_BITは<limits.h>で定義されてる標準のマクロで
charのビット数を表し、8以上の値であると決められている

702 :693:2009/05/03(日) 19:46:20
1ビット変数が2つあって、
その2つの変数の各桁が一致してるのが何桁目みたいに表示するにはどうしたらいいですか? 

703 :デフォルトの名無しさん:2009/05/03(日) 20:28:00
>>702
ごめんよくわからない
具体例を2,3個挙げて

704 :デフォルトの名無しさん:2009/05/03(日) 20:31:22
for(i=0; i<8; i++) if(~(a ^ b) & 1 << i) printf("%d ", i);

705 :デフォルトの名無しさん:2009/05/03(日) 20:32:28
>>702
1ビット変数じゃなくて1バイト変数だよな?

706 :デフォルトの名無しさん:2009/05/03(日) 20:35:58
はい。そうでした・・・


>>704 わかりました。ありがとうございます

707 :デフォルトの名無しさん:2009/05/03(日) 23:25:31
/**/
#include <stdio.h>

int main(void)
{
int fun,i;

printf("いくつ*を出力しますか?\n");
scanf("&d",&fun);

for(i=1; i<=fun; i++)
{
printf("*");
}

printf("\n");

return 0;
}

えーとですね、数字を入力した数だけ「*」を出力させたいんですが、
「*」が1つしかでてくれません。
どのようにすればいいんでしょうか?

708 :デフォルトの名無しさん:2009/05/03(日) 23:28:37
&d -> %d

709 :118:2009/05/03(日) 23:29:23
>>708
アホでした・・・

710 :デフォルトの名無しさん:2009/05/03(日) 23:31:55
>>709
118関係ないです・・・。
少し落ち着いたほうが良いな俺・・・。

711 :デフォルトの名無しさん:2009/05/03(日) 23:39:29
Cでこれだけはやっておけってのある?

printfやscanfは勿論で
構造体とかポインタ、配列…

ぐらいしか思いつかない、他にやるべき事ある?

712 :デフォルトの名無しさん:2009/05/04(月) 00:17:50
異なるコンパイラでもちゃんと動作確認できるくらいの努力はほしい

713 :デフォルトの名無しさん:2009/05/04(月) 00:35:48
デバッガ使えるようになろう

714 :デフォルトの名無しさん:2009/05/04(月) 00:39:41
>>711
scanf()はやらなくていいよ。

715 :デフォルトの名無しさん:2009/05/04(月) 01:11:30
viをマスターしよう

716 :デフォルトの名無しさん:2009/05/04(月) 07:35:54
>>714
sscanf()は使ってるコードけっこうない?ifconfigとか…

717 :デフォルトの名無しさん:2009/05/04(月) 08:55:13
やるとか、やらないとかじゃないだろう
それとも関数一つ一つ勉強するのか?

718 :デフォルトの名無しさん:2009/05/04(月) 12:00:32
>>716
scanf()はやらなくていよ。

719 :デフォルトの名無しさん:2009/05/04(月) 13:03:12
いちいち煩い。scanfでも使えないものではないが、適切に使う必要があるため
そこを理解して使え。scanfに限らず、その他のライブラリ、コードの書き方に於いても
もうそういった点はプログラマー、ユーザが気をつける点だろ。
内部を破壊するようなプログラムなんて、いくらでも書こうと思えば書ける。

720 :デフォルトの名無しさん:2009/05/04(月) 15:32:07
・scanf()は挙動に癖があってほかの入力関数にくらべても独特。
・挙動に習熟しても、入門レベルを脱したら使わない。
・他の関数で簡単に代替できる。
・scanf()を使うテキストで勉強してる初心者は、サンプルを
いじってちょっと複雑なコードを書こうとするとだいたいはまる。

721 :デフォルトの名無しさん:2009/05/04(月) 16:21:00
そして俺はハマってjavaに逃げた
そしたらハマった

722 :デフォルトの名無しさん:2009/05/04(月) 21:31:36
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9123.zip
XMLをDOMの木構造にしようと考えてて
とりあえずタグの解析(dom.c)を作ってみたんですが
開始タグと終了タグが(同じなのに)違うと出てしまいます。
デバッガで見ても同じ文字列なのにstrcmp()だと違うと返されます。
更に、el->TagNameは開始タグ、pは終了タグの文字列ですが
printf("Expected %s but %s.\n", el->TagName, p);
としたものが、" but Configuration.ion"と表示され意味不明な状態です。
どうすればいいでしょうか。

723 :デフォルトの名無しさん:2009/05/04(月) 21:36:17
>>722
駄目だしされたxmlは?

724 :デフォルトの名無しさん:2009/05/04(月) 21:53:03
改行コードが文字列に含まれてる。

725 :デフォルトの名無しさん:2009/05/04(月) 21:53:13
同梱のxml.vcprojです。
同梱のvalid.htmlならうまくいくんですが。。。

726 :デフォルトの名無しさん:2009/05/04(月) 21:56:19
l>>724
|| ch == 0x0D が抜けていたようです。
'\n'はLFなのか。。。ありがとうございました。

727 :デフォルトの名無しさん:2009/05/04(月) 21:57:08
あんまりまじめに見るつもりないけど気になった点

・strcmpで比べるデータの比べる開始位置が違う、お尻にゴミが付いてる
・strcmpで比べる前になんで表示しないの?
・改行コードのは0x0Dだけでいいの?0x0D+0x0Aセットもあるよ。バイナリエディタで見てみるとテキストといえど違うよ

728 :デフォルトの名無しさん:2009/05/04(月) 22:07:41
>>727
ゴミが付いているという件ですが、どうやったら調べられるのかわかりません。
char* fgetarea(FILE* fp, fpos_t pos_set, fpos_t pos_end)で
p = malloc(len - 5);でも動いたので、文字列より多くmalloc()してるということでしょうか。
だとしたら何でかな。。。

表示については比べた後で表示してるのですが何がいけないのでしょうか。
改行は'\n'がLFならisAttributeが1になるので問題ないと思いました。

729 :デフォルトの名無しさん:2009/05/04(月) 22:13:21
>>728

まずはstrcmpが比べてる長さがprintfなどで視認できる文字数とあってるか確認
おかしいなら文字にしてくれる便利な関数を使わないで文字コードを起こしてみてみる

まあおかしくなる原因は文字として割り当てのない制御コードあたりが付いてるとかそんな程度だろうし



730 :デフォルトの名無しさん:2009/05/04(月) 22:16:12
改行コードが悪さしてゴミがついてたように見えただけでしょ?

731 :デフォルトの名無しさん:2009/05/04(月) 22:21:28
>>729
例えばこういうことでしょうか?
void string_dump(char* string)
{
char* p = string;
while(*p != '\0') {
printf("%x ", *p);
p++;
}
printf("\n");
}
正しくないプログラムでやったら終端にd(CR)が来てわかりやすくなりました。
こういうやり方があったのですね。覚えておきます。

732 :デフォルトの名無しさん:2009/05/04(月) 22:25:22
>>731
printf系は当然文字の割り当てがない制御コード(改行コード)とかは表示できないけど
文字の操作系は0x00以外は文字として処理しそうな感じだから当然見えない文字が
あってstrcmpは長さの違う文字を比較してることになることになるケースもある

じゃあなんでそんな切り方をするか・・・と考えていけばバグの原因もわかるかと

733 :デフォルトの名無しさん:2009/05/06(水) 00:27:37
DXライブラリと言うのを使って、ちょっとしたゲームを作ってるんですが判定がうまくいきません。
1のキーが押された時(一回押されたら、その後もずっと)y01の動作を止めたいんですが、どうしても離したときにflagが1に戻ってしまいます
書き方が悪いのか、どうも処理に矛盾が出てしまう…。

int i;
int flag = 0;

timer++;  //グローバルで0で初期化済み

if( timer >= 50 ) flag = 1;
if( CheckHitKey( KEY_INPUT_1 ) == 1 ) flag = 0;   //1キーが押された時の処理
switch( flag ){
case 0:
break;
case 1:
for( i = 0 ; i < DOWN_SPEED ; i++ ){  //定数は5
y01++;  //グローバルで50で初期化済み
}
break;
default:
break;
}



734 :デフォルトの名無しさん:2009/05/06(水) 01:57:45
>>733
とりあえずそのソースだけ見るとtimerが増える一方だと思うんだが
1キーが押された時とかにtimerを初期化しなくていいのか?

735 :デフォルトの名無しさん:2009/05/06(水) 03:37:58
>>733
そのコードは、ゲームループで毎フレーム実行されるんだろ?
"一回押されたら、その後もずっと" をするなら、グローバルか、static で結果を保持するしかないでしょ?

で整理すると、timer で50フレーム待って、それ以降はy01が毎フレームDOWN_SPEEDだけ増加すると
(お節介だが、マルチスレッドでy01を見てるとかじゃなければ y01 += DOWN_SPEED; じゃね?)
で、
>1のキーが押された時(一回押されたら、その後もずっと)y01の動作を止めたいんです
も、条件に入ると

static int flag_key = 0;
int i;
int flag = 0;

timer++;  //グローバルで0で初期化済み

if( timer >= 50 ) flag = 1;

if( CheckHitKey( KEY_INPUT_1 ) == 1 ) flag_key = 1;   //1キーが押された時の処理

if( flag == 1 && flag_key == 0 ) y01 += DOWN_SPEED;

こんな感じにエスパーして見たw

736 :デフォルトの名無しさん:2009/05/06(水) 03:41:37
ああ…
int i;
は、もう要らないね

737 :デフォルトの名無しさん:2009/05/06(水) 12:49:48
>>735
あーstatic使わないとダメだったのかぁ。
前に>>735と同じ処理書いたけど、つかってなかったから動作しなかったみたい。

助かった、ありがとう。

738 :デフォルトの名無しさん:2009/05/06(水) 13:54:24
>>737
俺は全体の処理をしらないから static 使ったけど
ゲームの状態(再リセット等)での static 変数の再初期化とかもあるんじゃね?
普通に global 変数にして管理した方が良いよ

739 :デフォルトの名無しさん:2009/05/06(水) 16:32:32
>>662
http://www.amazon.co.jp/dp/4890524436
がおすすめなんですが、いかんせん 16bit の時代の書籍ですからねえ。
なにかこの手の本をもういちど出して欲しいですね。>きた先生

740 :デフォルトの名無しさん:2009/05/06(水) 16:34:38
>>739
windowsで16bitって・・・・・・

741 :デフォルトの名無しさん:2009/05/06(水) 16:47:53
>>740
いろいろ理不尽なお作法があって、32bit よりも大変でした。

742 :デフォルトの名無しさん:2009/05/06(水) 16:50:05
>>741
知ってる

x86の16bitモードは使いにくい

743 :デフォルトの名無しさん:2009/05/06(水) 17:23:50
コンソールは面倒だからデフォでラージモデルにしてたが
Windowsは節約でミディアムモデルが多かったなあ

744 :デフォルトの名無しさん:2009/05/06(水) 21:51:38
私はコンパクトモデルを愛用していました。どうせ64KBよりも大きなこーどはかかないし。
それにどうあがいても64KBの壁はこえられない。EMSのページも64KB単位でデータ管理しなくちゃいけないし。
いい訓練にはなりましたが。

745 :739:2009/05/06(水) 23:28:11
>>662
そうそう, >>739 にしても C 言語の基本はマスターしておかないときついです。
適当な参考書で自習してくださいね。MS-DOS/コンソールアプリは自力で書ける/デバッグできるくらいの腕力は必要かと。
って 100 近くも昔のものにレスするのもどうですかね。

746 :デフォルトの名無しさん:2009/05/06(水) 23:51:48
関数ポインタをコールバックで呼び出す場合はどういう風に記述すればいいんでしょうか?

747 :デフォルトの名無しさん:2009/05/06(水) 23:56:08
>>746
たとえば、
int cmp(char *a, char *b) { return strcmp(a, b); }
qsort(base, n, sizeof(char *), (int (*)(void *, void *)cmp);

748 :デフォルトの名無しさん:2009/05/07(木) 00:04:34
コールバックって結局、ある関数の引数に渡された関数のアドレスを使って関数呼び出しをするだけのことでしょ

749 :>>746:2009/05/07(木) 00:10:07
>>747
ありがとうございます。

>>748
コールバックと関数ポインタのそれぞれ単独は使ったことがあるのでわかるんですが
それを両方一度にというのを今回やってみようと思ったのですが記述がよくわからなかったもので・・・・

ちなみに中はどのように処理すればいいんでしょうか?

750 :>>746:2009/05/07(木) 00:19:54
イメージとしては

関数ポインタのポインタ->関数ポインタ->関数

となっててコールバック元へ関数ポインタのポインタを渡せばいいんでしょうけど
Cでの記述がわかりませんorz

751 :>>746:2009/05/07(木) 00:20:53
もとい
>Cでの記述がわかりませんorz
コールバックする側のCでの記述もよくわかりませんorz


752 :>>746:2009/05/07(木) 00:30:39
あーごめんなさい
関数ポインターで配列の形を取ってるものをコールバックさせるでしたorz
たびたびすみません

753 :747:2009/05/07(木) 00:31:36
>>751
標準関数のqsort()を調べてみてはいかがでしょう?


754 :デフォルトの名無しさん:2009/05/07(木) 00:32:05
>>747
int (*)(char *, char *)をint (*)(void *, void *)にキャストすることはできない

755 :>>746:2009/05/07(木) 00:39:09
int (*[])(void *, void *)
これでいいのかな?

756 :747:2009/05/07(木) 00:39:43
>>754
違います。qsort() の第4引数 int (*comp)(const void *, ocnst void *) にキャストしているのです。
使ってみればわかります。

757 :デフォルトの名無しさん:2009/05/07(木) 00:50:42
そもそも関数ポインタはいかなる異なる型にもキャストできないんだが。


758 :デフォルトの名無しさん:2009/05/07(木) 01:05:37
>>746
void callee() {}
void caller(void (*pf)(void)) { pf(); }
int main() { caller(callee); return 0; }

759 :747:2009/05/07(木) 01:06:35
>>757
出典をお願い致します。長年こうやって使っていますし、手元の bcc, gcc で通るのですが。

760 :デフォルトの名無しさん:2009/05/07(木) 01:19:05
俺はその件にはタッチしないが
>>747のような、「関数ポインタをキャストするようなやり方」はセンスが無い、とは言い切れる。

int cmp(const void *p1, const void *p2) { return strcmp((char *p1), (char *p2)); }
のような、データのキャストだけで済むようにする方が
読みやすいしバグが混入する可能性も減らせる。

761 :デフォルトの名無しさん:2009/05/07(木) 01:20:39
あ、Cなら、キャストなしでstrcmpにvoid*を渡せるんだっけかな。

762 :デフォルトの名無しさん:2009/05/07(木) 01:23:03
>>760
面白い

763 :デフォルトの名無しさん:2009/05/07(木) 01:23:30
もう一つだけ。
タッチしないとは言ったものの、
関数ポインタをデータポインタにキャストすることは安全ではない。
void*へのキャストを含めて。

関数ポインタ同士でのキャストについては、知らないから何もコメントできない。

764 :デフォルトの名無しさん:2009/05/07(木) 01:24:49
そういう口はまともにキャストできるようになってからききましょうねw

765 :747:2009/05/07(木) 01:24:49
>>760
まあ、今はマクロ(templete) で生成的に書くやりかたが普通ですし。
でも qsort() のような使い方は、ちょっと前まではごくあたりまえだったと思うですが。そのための void * でしたし。

766 :デフォルトの名無しさん:2009/05/07(木) 01:26:15
>>759
出典は規格票。キャストできるとはどこにも書いていない。
して良いと書かれていないキャストをした場合は未定義動作だから
コンパイルが通るなんてのは、なんの反論にもならない。

関数ポインタを別の関数ポインタにキャストすることはできないし、
関数ポインタを汎用ポインタにキャストすることもできない。

767 :デフォルトの名無しさん:2009/05/07(木) 01:26:30
>>763
それはそうですね。昔は (void (*)())0 と (void *)0 が違った世界もありました。コンパクトモデルとか。

768 :747=767:2009/05/07(木) 01:28:05
>>766
これはちょっと荒っぽい回答ですねぇ。

769 :デフォルトの名無しさん:2009/05/07(木) 01:28:57
charへのポインタを2つ繋ぎ合わしてcharへのポインタを返す関数をつくろうとしたのだが、そもそも以下のコードでエラーとなりました。
何がいけないのでしょうか?

#include <stdio.h>
#include <string.h>
int main() {
char * ch1 = "こんにちは";
char * ch2 = "タナカくん";
printf("ch1 = %s\n", ch1);
printf("ch2 = %s\n", ch2);

strcat(ch1, ch2);
printf("ch1+ch2 = %s\n", ch1);
}

770 :デフォルトの名無しさん:2009/05/07(木) 01:32:36
普通に考えてchar*とvoid*の大きさが違うときに死ぬんだから、移植性がないことくらいわかるだろ。

771 :デフォルトの名無しさん:2009/05/07(木) 01:33:10
>>769
> char * ch1 = "こんにちは";
> char * ch2 = "タナカくん";
ここでconstが落ちてる。

const char * ch1 = "こんにちは";
const char * ch2 = "タナカくん";
と書きなさい。

772 :デフォルトの名無しさん:2009/05/07(木) 01:34:57
そう書いたところで連結しちゃダメだろw

773 :769:2009/05/07(木) 01:38:26
>>771
const char * ch1 = "こんにちは";
const char * ch2 = "タナカくん";
とするとコンパイル時警告となり
char * ch1 = "こんにちは";
const char * ch2 = "タナカくん";
とするとランタイムエラーのままです


774 :デフォルトの名無しさん:2009/05/07(木) 01:41:46
なんのためのconstだよw


775 :769:2009/05/07(木) 01:48:05
よくわからないので、char *を2つ引数にとってchar *を返す関数をお願いします
char * function(char *x, char *y) {//<-ココ}

char *z = function("こんにちは", "タナカくん");

776 :デフォルトの名無しさん:2009/05/07(木) 02:22:33
こんばんわ。
今日もよろしくお願いします。
長いため分割で乗せますので解説お願いします(今、関数でつまずいています)

/*今日も頑張るぞ!!*/

#include<stdio.h>
double tasizan(double x,double y);
double hikizan(double x,double y);
double kakezan(double x,double y);
double warizan(double x,double y);

int main(void){

double a,b;
scanf("%lf%lf",&a,&b);
printf("足算:%f\n",tasizan(a,b));
printf("引算:%f\n",hikizan(a,b));
printf("乗算:%f\n",kakezan(a,b));
printf("割算:%f\n",warizan(a,b));

777 :続きです:2009/05/07(木) 02:23:16
return 0;
/*引数の足算*/
double tasizan(double x,double y){
double answer;
answer=x+y;
return answer;
}

/*引数の引算*/
double hikizan(double x,double y){
double answer;
answer=x-y;
return answer;
}

/*引数の乗算*/
double kakezan(double x,double y){
double answer;
answer=x*y;
return answer;
}

778 :割算のため0は使えないという風にしてます:2009/05/07(木) 02:26:17
/*引数の割算*/
double warizan(double x,double y){
double answer;
if(y==0){
printf(エラーです\n);
answer=0,0;

}else{
answer=x/y;
}
return answer;
}

779 :デフォルトの名無しさん:2009/05/07(木) 02:31:28
以上が自分の書いたものですがエラーになりさっぱりわかりません。


780 :デフォルトの名無しさん:2009/05/07(木) 02:42:16
>>779
文字列を""で囲まないとどんなエラーなのかわからないから答えようがない

781 :デフォルトの名無しさん:2009/05/07(木) 02:45:02
>>780さん
ごめんなさい。
printf("エラーです\n");←の""のことですか?


782 :("エラーです\n")に直した結果:2009/05/07(木) 02:49:54
------ ビルド開始: プロジェクト: プログラムはこっちを使って練習, 構成: Debug Win32 ------
コンパイルしています...
sample.c
c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(12) :
warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : 'scanf' の宣言を確認してください。
c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(20) : error C2143: 構文エラー : ';' が '型' の前にありません。
c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(22) : error C2065: 'answer' : 定義されていない識別子です。
c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(22) : error C2065: 'x' : 定義されていない識別子です。
c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(22) : error C2065: 'y' : 定義されていない識別子です。
c:\documents and settings\mieko\my documents\visual studio 2008\projects\マイクロソフト プログラム練習\sample.c(23) : error C2065: 'answer' : 定義されていない識別子です。
ビルドログは "file://c:\Documents and Settings\mieko\My Documents\Visual Studio 2008\Projects\マイクロソフト プログラム練習\Debug\BuildLog.htm" に保存されました。
プログラムはこっちを使って練習 - エラー 5、警告 1

↑何回見てもエラー部分のスペルや分法が間違っているようには見えないのですが・・・。

783 :デフォルトの名無しさん:2009/05/07(木) 02:55:10
20行目でエラーだってんだから
その行かその直前の行を穴のあくほど見直せ。

とりあえずmain()の最後に}が抜けてるのはコピペミスかもしれんが。

784 :デフォルトの名無しさん:2009/05/07(木) 02:55:26
すいません。自己解決しました。
return 0;の後ろに{忘れてただけでした。
すみません。

785 :デフォルトの名無しさん:2009/05/07(木) 02:57:04
>>783
時間差で教えてくれててありがとうございました。


786 :デフォルトの名無しさん:2009/05/07(木) 02:58:06
女だからってちやほやされると思うなよ

787 :デフォルトの名無しさん:2009/05/07(木) 03:23:38
>>770
まさか。だいたい、昔(K&R1) はこういうときには char * をつかっていましたよ。void * ができたのはその後のこと。

788 :デフォルトの名無しさん:2009/05/07(木) 04:34:36
char * function(char *x, char *y)
{
char *p;
p=(char *)malloc(strlen(x)+strlen(y)+1);
strcpy(p,x);
strcat(p,y);
return p;
}

789 :デフォルトの名無しさん:2009/05/07(木) 09:16:41
>>787
ANSI準拠でない、という話をしているのに、なんでK&Rがでてくるんだ。
ANSI以前のK&Rには移植性のかけらもない。

790 :デフォルトの名無しさん:2009/05/07(木) 11:48:51
ポインタのサイズが同じじゃないとmalloc( )使えないじゃん


791 :>>746:2009/05/07(木) 11:49:36
ポインタのサイズは一緒でしょ
むしろ今となっては型があってないとまずいのはアライメントの問題とかでしょ

792 :デフォルトの名無しさん:2009/05/07(木) 11:59:20
>>790
void*からchar*に代入しようとすると、ポインタの(暗黙的)キャストが発生するが、
そのときに適切にポインタを変換してやればいい。

793 :デフォルトの名無しさん:2009/05/07(木) 12:26:34
>>791
型がちがうとサイズもちがうってことはありえるよ。

794 :デフォルトの名無しさん:2009/05/07(木) 13:18:20
>>793
たとえば?

795 :デフォルトの名無しさん:2009/05/07(木) 13:31:28
ワードアドレス方式だとワードポインタとバイトポインタで大きさが違うことはよくある。
ANSI Cはそのような環境にも移植できるようになっている。


796 :デフォルトの名無しさん:2009/05/07(木) 16:00:31
>>795
ポインタ≒メモリアドレスという理解しか出来ないからわかんないや


797 :デフォルトの名無しさん:2009/05/07(木) 18:04:01
プリント配布されたプログラムを打ち込んでみたのですが、式の構文エラーが発生します

void read_data(char *filename, double x[], double y[], int *n){
FILE *fp = fopen(filename, "rt");
int i;
fscanf(fp,"%d",n);
for(i=0;i<*n;i++)
fscanf(fp, "%lf%lf", &x[i], %y[i]);
fclose(fp);

コンパイラによるとfscanfの部分にエラーがあるようですが
プリントと見比べて違っているところがわかりません。
どこがおかしいか、教えていただけないでしょうか?

798 :デフォルトの名無しさん:2009/05/07(木) 18:05:12
&x[i], %y[i]

ここですね・・・見落としてました。自己解決です

すみません

799 :デフォルトの名無しさん:2009/05/07(木) 20:03:12
>>792
逆ではないかと。
void * -> char * は問題がなく(だから暗黙のキャストでOKなわけ)、むしろ char * -> void * で「本当にアラインメントを無視してもいいのか」という
警告が出ます。qsort() の第4引数では書き手がOKを明示するために、キャストが必要なわけです。

K&R の古からあたりまえに行われてきたことですから、ANSI標準でばっさり切られることはないと思うのですが。>>789
というかK&R1のソースはきょうびのコンパイラではもう全然コンパイルできないのですか?(若干の修正は要るにしても)

800 :デフォルトの名無しさん:2009/05/07(木) 21:19:27
関数ポインタをキャストするよりも、引き数をキャストするべき。
レガシーコードがansiでコンパイルできないのは最早常識。

801 :デフォルトの名無しさん:2009/05/07(木) 21:23:02
>759
> 9899:1999 6.3.2.3/8
> A pointer to a function of one type may be converted to a pointer to
> a function of another type and back again; the result shall compare
> equal to the original pointer. If a converted pointer is used to call
> a function whose type is not compatible with the pointed-to type,
> the behavior is undefined.
compatible type については分散してるので引用はパス。6.2.7 から辿ってくれ。
基本的には同じ型だと思っていいと思う。

>799
> 9899:1999 6.2.5/26
> A pointer to void shall have the same representation and alignment requirements as a
> pointer to a character type.
なので char* と void* のアラインメント要求、表現が同一であることは保証されている。

802 :デフォルトの名無しさん:2009/05/07(木) 21:42:42
void*とchar*は交換可能。
K&Rからの名残だし今の規格でも認められてる。

関数ポインタのキャストをするのは危険。
>>800のいうとおり。

803 :デフォルトの名無しさん:2009/05/07(木) 21:53:18
要するに
古い遺物のようなソースを平気で書いちゃう
おじちゃんプログラマはもはやもう要らないってことか。


804 :デフォルトの名無しさん:2009/05/07(木) 21:57:46
>>803
でも、関数ポインタとかコールバックは適度に欲しい機能だから
付きまとう問題だと思うんだけどねえ

それにポインタサイズをころころ変えるコンパイラ?の方がまずい気がするんだが
そこまで詰めてどんだけメモリ節約する気なんだろとか思うわ

805 :デフォルトの名無しさん:2009/05/07(木) 22:15:41
だから、関数ポインタを使うな、なんて誰一人言ってねーだろうよ。
関数ポインタをキャストするな、引数をキャストしろ、と皆言ってるんだろ。

806 :デフォルトの名無しさん:2009/05/07(木) 22:24:51
質問です。
OSはubuntuをvm上で動かしています。シェルはbashで、gccでコンパイルしています。
ソースは以下です。K&R1-9の解答1そのまま(のはず)です(ただ質問内容は1-9の趣旨とは直接関係ない気も)。

#include <stdio.h>

#define NONBLANK 'a'

main()
{
int c, lastc;
lastc = NONBLANK;
while((c = getchar()) != EOF)
{
if (c != ' ')
putchar(c);
if (c == ' ')
if (lastc != ' ')
putchar(c);
lastc = c;
}
}

1.上記を実行し「hoge」+Enterと打ち込むと次の行に「hoge」と出力されます。
これはEnterで標準入力が終わり、かつ一文字として出力されるので改行される、という認識であってますか?

2.何も入力せずにCtrl+Dだけ打ち込むとプログラムが終わります。
しかし「hoge」+(Ctrl+D)と打ち込むと、改行なしに「hoge」と出力されるだけでプログラムが終わりません。
なぜ終わらないのでしょうか?

よろしくお願いします。

807 :デフォルトの名無しさん:2009/05/07(木) 22:26:39
標準Cで定められていない事柄にかんしては、
好き勝手に(いかにクソにでも)して良いってのが
絶対的建前。
よって多くのコンパイラではこうだからうんぬんなんてのは役立たん。


808 :デフォルトの名無しさん:2009/05/07(木) 22:34:45
>>806
1.OK
2.while((c = getchar()) != EOF)のgetcharが入力を待っているから。
EOFが返されていない。

809 :デフォルトの名無しさん:2009/05/07(木) 22:39:55
SceUID mod;

mod = LoadStartModule("lflash_fatfmt.prx");
if (mod < 0)
{
ErrorExit(6000, "Error %08X loading/starting lflash_fatfmt.prx\n", mod);
}

mod = LoadStartModule("ipl_update.prx");
if (mod < 0)
{
ErrorExit(6000, "Error %08X loading/starting ipl_update.prx\n", mod);
}

mod = LoadStartModule("libpsardumper.prx");
if (mod < 0)
{
ErrorExit(6000, "Error %08X loading/starting libpsardumper.prx.\n", mod);
}
}


何とかしてください。お願いします。

810 :デフォルトの名無しさん:2009/05/07(木) 22:41:10
PSP自作ソフト開発スレ ver.9
http://schiphol.2ch.net/test/read.cgi/gameurawaza/1231340677/

811 :デフォルトの名無しさん:2009/05/07(木) 22:45:53
そのスレで聞けばいいのではないだろうか

812 :806:2009/05/07(木) 23:09:30
レスありがとうございます。

>>808
通常だとgetchar() でまず入力を待ち、
Enterで入力が終わったらループが一文字ずつ回り、
文字列がなくなるとまたgetchar() で入力待ちになるわけですよね?

しかし「hoge」+(Ctrl+D)を打ち込むと
ループの最後の一文字がEOFになるからプログラムが終了するかと思ったんですが。

>EOFが返されていない
というのは、EOFが標準入力の終わりになったときは、Enterとは違ってそのまま消えてしまうということでしょうか?

見当違いでしたらすみません。

813 :デフォルトの名無しさん:2009/05/07(木) 23:35:59
>Ctrl-Dの本来の意味は行バッファ中の文字を送信するためのもの。
>行バッファが空の場合は、0文字が送信され、これがEOFと解釈される。
>だから行の途中でCtrl-Dを入力してもEOFとは解釈されない。

814 :806:2009/05/07(木) 23:38:04
>>813
なるほど納得しました。
ありがとうございました。

815 :デフォルトの名無しさん:2009/05/07(木) 23:46:30
次数入力式の単位行列を作りたいのですが、うまくいきません
何分初心者なので見にくいかもしれませんが、お願いします


#include<stdio.h>

int main()
{
int m, i, j;
int ma[i][j];

printf("m = "); scanf("%d", &m);

for(i = 0; i < m; i++){
for(j = 0; j < m; j++)
  if(i = j)
ma[i][j] = 1;

     else
     ma[i][j] = 0;
}
for(i = 0; i < m; i++){
for(j = 0; j < m; j++)
         printf("%d", ma[i][j]);
         putchar('\n');
       }

return 0;
}


816 :デフォルトの名無しさん:2009/05/07(木) 23:50:38
int ma[i][j]
___^^
コンパイルエラー:残念ながら配列の大きさを変数で間接的に指示することは
出来ません。
コンパイルエラー:i , j は未初期化なので不定な値が入っています。
他の変数の初期化等に利用することは出来ません。

817 :デフォルトの名無しさん:2009/05/07(木) 23:54:50
>>816
このエラーを100回読め。
はっきり書いてあるじゃん!

818 :デフォルトの名無しさん:2009/05/07(木) 23:57:46
>>816
__^^
コンパイルエラー:32ビット処理系ではシフト演算子の上限は32まで
です。
このエラーを100回読め。
^^
コンパイルエラー:残念ながら現状のC処理系では日本語は使えません。
はっきり書いてあるじゃん!
^^
コンパイルエラー:残念ながら現状のC処理系では日本語は使えません。


819 :デフォルトの名無しさん:2009/05/08(金) 00:12:32
>>816
コンパイルでエラーはでてませんでした


820 :デフォルトの名無しさん:2009/05/08(金) 00:15:01
コンパイラに愛想つかれて無視されてる>>815は涙を誘う

821 :デフォルトの名無しさん:2009/05/08(金) 00:22:14
>>816
C99対応のコンパイラを使っていて、
エラーにならなかったという可能性もあるね。
たしかに、それでも結局だめなことに変わりはないけど。

822 :デフォルトの名無しさん:2009/05/08(金) 01:57:14
>>815
>int ma[i][j];
なんのつもりでこう宣言したのか説明してくれ

823 :デフォルトの名無しさん:2009/05/08(金) 08:27:26
struct{
unsigned char api_id;
unsigned short saddr16 __attribute__((packed));
unsigned char rssi;
unsigned char option;
}header __attribute__((packed));

gccです。
header構造体のメンバをアラインメントを無視して配置したいのですが
なぜか3行目のpackedを追加しないとsaddr16がワード境界に配置されてしまいます。
本来3行目のpackedってっていらないはずですよね?

824 :デフォルトの名無しさん:2009/05/08(金) 08:33:09
>>823
gccというかCPUはなんでしょ

unsigned char api_id;
この段階ですでにアライメント調整が発生して

unsigned char api_id;
ここに調整用の1バイト
unsigned short saddr16

となるのは容易に想像が・・・

825 :デフォルトの名無しさん:2009/05/08(金) 09:12:50
>>824
CPUはPIC24Fです。16bitです。

6行目のpackedで構造体メンバまとめてアラインメント無視…というわけでは
ないんでしょうか?

826 :デフォルトの名無しさん:2009/05/08(金) 09:17:49
だったらpragma使えばよろしかろ。

827 :デフォルトの名無しさん:2009/05/08(金) 09:17:57
>>825
構造体にかかってるpackedは構造体全体が奇数バイトであろうが偶数バイトであろうが
アライメント無視して詰めるってことかと

直接関係してくるのは構造体を配列として利用した際の2個目から?

828 :デフォルトの名無しさん:2009/05/08(金) 09:35:59
>>827
なるほど、そういうことですか。
納得出来ました、ありがとうございます。

829 :デフォルトの名無しさん:2009/05/08(金) 09:55:57
>>828
>826
#pragma pack(1)

830 :デフォルトの名無しさん:2009/05/08(金) 10:00:17
PICの場合、構造体を変にパックするとフィールドアクセスの命令数が
どかっと増えそうだけど大丈夫?

831 :デフォルトの名無しさん:2009/05/08(金) 10:03:17
そこまで詰めまくるのってメモリ不足か古い何かと通信でもするのかね?

832 :デフォルトの名無しさん:2009/05/08(金) 10:26:22
シリアルで受け取ったバイト列との共用体になってます。

struct pkt{
unsigned char msb;
unsigned char lsb;
union{
char api_structure[128];

〜〜略〜〜

struct{
struct{
unsigned char api_id;
unsigned short saddr16 __attribute__((packed)); // big endian!!
unsigned char rssi;
unsigned char option;
}header;
char data[100];
} type_rx16;
};
};

こんな感じです。略の部分に他にもいくつかの構造体が並んでいます。
もっといい方法があるのかも知れないです。

C言語は昔取った杵柄で書いてるので、おかしな事をしてるかも知れません。

833 :デフォルトの名無しさん:2009/05/08(金) 10:53:14
defineで()つけてるコードを見たんですが、つけるとつけないで意味が変わるんでしょうか?

#define MY_SIZE ( sizeof(struct mine) )
#define MY_LEN ( MY_SIZE * 512 )

int main()
{
...
read(fd, buf, MY_LEN);
...
n += MY_SIZE;
...
}

「#define MY_SIZE sizeof(struct mine)」や「#define MY_LEN MY_SIZE * 512」
として()を抜いても結果は変わらなかったのだけど、どうなのだろう。

gcc-4.3.2でコンパイルしています。


834 :デフォルトの名無しさん:2009/05/08(金) 10:56:19
>>833
#define MY_LEN ( MY_SIZE * 512 )
ではなく

たとえば
#define MY_LEN MY_SIZE + 512
だった場合

read(fd, buf, MY_LEN*2);

だったりすると

read(fd, buf, MY_SIZE + 512*2);
と置かれる

こういうのを回避するために

#define MY_LEN (MY_SIZE + 512)
としておけば

read(fd, buf, (MY_SIZE + 512)*2);

という置換が行われる

835 :833:2009/05/08(金) 11:19:18
>>834
ありがとう!納得いきました。

836 :デフォルトの名無しさん:2009/05/08(金) 21:04:15
struct test {
    char *namae;
    int tokuten[3];
};
int main(void)
{
struct test math[5] = {

の様に続けて↑の構造体配列のメンバの配列に初期値を設定するには
どうすればいいんでしょうか?

837 :デフォルトの名無しさん:2009/05/08(金) 21:07:42
struct test math[5] = { { NULL , 0} ,{ NULL , 0} ,{ NULL , 0} ,{ NULL , 0} ,{ NULL , 0} };
こんな感じ

838 :デフォルトの名無しさん:2009/05/08(金) 21:08:29
みす
struct test math[5] = { { NULL , 0,0,0},{ NULL , 0,0,0},{ NULL , 0,0,0},{ NULL , 0,0,0},{ NULL , 0,0,0} };

839 :デフォルトの名無しさん:2009/05/08(金) 21:16:39
>>838
ありがとうございます
{}はいらないんですね

840 :デフォルトの名無しさん:2009/05/08(金) 23:52:13
月と日をキーボードで入力して、それに対応した星座を表示するプログラムを書きたいのですが、
月が3か4で、月が3の場合は日が21以上30以下、月が4の場合は1以上19以下でおひつじ座と表示したい時
条件を設定する時の複合条件の書き方がわかりません
a=3 && b>=21 || b<=31 
elseはエラーの表示
a=4 && b>=1 || b<=19という感じに何個もif文を書き繋げていくしかないのでしょうか?

#include<stdio.h>
void main(void)
{
int a,b;

printf("月入力---->");
scanf("%d",&a);
printf("日入力---->");
scanf("%d",&b);

if( ( a > 13 ) || ( a == 0 ) )
{
printf("Input error!");
}
if(?)
{
printf("?");
}

}


841 :デフォルトの名無しさん:2009/05/08(金) 23:57:57
if((a==3 && 21 <= b && b <= 31) || (a==4 && 1<=b && b<=19)) printf("おひつじ座");

842 :デフォルトの名無しさん:2009/05/09(土) 00:02:06
>>840
繋げていくしかないね
if( (a==3 && (21<=b && b<=31)) || (a==4 && (1<=b && 19<=b)) )

843 :839:2009/05/09(土) 00:07:27
>>841-842
即レスありがとうございました
さっそく書いてみます

844 :デフォルトの名無しさん:2009/05/09(土) 00:27:47
エレガントさを求めたいなら
日付を単純に数字(例えば1月1日を1として1-365)に変換して
それを数字から星座への変換するように作る手もある。

845 :デフォルトの名無しさん:2009/05/09(土) 00:29:44
あ、月毎のテーブル(つっても各31もじゃなく、何日を区切りとするか等)を作るほうが美しいかも。

846 :839:2009/05/09(土) 00:36:27
>>844
その発想は無かったです、目から鱗でした
その場合はscanfで入力した月と日が1月1日から何日目なのかを計算するのに頭を悩ませそうですorz
でも参考になりました

847 :デフォルトの名無しさん:2009/05/09(土) 00:57:43
12個の要素の配列を使って
各月の日付にいくつ足すかを持てばよい。
別に365じゃなくて、12x32とかの数字に変換しても良いだろ。1方向変換なんだから。

配列をまだ習ってなかったらごめんな。

848 :デフォルトの名無しさん:2009/05/09(土) 03:14:12
ここで質問することではないかもしれませんが。。。

環境変数を設定するputenvがコンパイラにより挙動が違って困っています。

あるフリーのDLLが環境変数でパラメータを渡さなければならないのでputenvを使って渡しているのですが、
MSVC++でコンパイルした実行ファイルではDLLに環境変数が渡らず、
mingwでコンパイルした実行ファイルではDLLに環境変数が渡せます。
(ただ開発はMSVC++で行いたいので、mingwでできても意味がありません)

ご存知の方がいらっしゃればよろしくお願いいたします。

※ちなみにSetEnviromentVariableを使うとどっちのコンパイラでも環境変数がDLLにわたりませんでした。。。


849 :デフォルトの名無しさん:2009/05/09(土) 03:20:41
>>848
も少し具体的に書いたほうがいい
DLL名称やどんな環境変数を渡すのか
DLLに環境変数が渡らなかったということをどう確認したのか
とか...

850 :デフォルトの名無しさん:2009/05/09(土) 03:23:06
>>846
通日を求める式を作ってみた
leapはうるう年なら1、その他は0
m*30 + m/2 + (m<=2 ? 2 : !(~m&9) + leap) + d - 32;

851 :デフォルトの名無しさん:2009/05/09(土) 03:28:18
>>848
CreateProcess を呼ぶだけの実行ファイルを作成して
CreateProcess で第7引数を指定するとか

852 :デフォルトの名無しさん:2009/05/09(土) 03:33:20
>>850
そもそも month*100+mday なら換算が楽だ

x=month*100+mday;
if(x<=119) yagi
else if(x<=218) mizugame
...
else if(x<=1231) yagi

853 :デフォルトの名無しさん:2009/05/09(土) 03:43:15
確かにそうだな
星座は均等に割り振ってるんだと思ったから通日が分かれば÷12でswitch出来るかと思ったんだけど
なんか均等じゃない上占いごとに微妙に違うのな

854 :デフォルトの名無しさん:2009/05/09(土) 04:46:57
strcut seiza {
 int start_mon, start_day;
 int end_mon, end_day;
 char *name;
 int start_cday, end_cday;
};
というような構造体の配列を作ってだな、
プログラムには最初と最後の日付で記録しておく。
で、先頭でループしてstart_cdayとend_cdayを計算する。
入力したら、(日付のエラーチェック後)
同様にループで回して、通年の日番号でどこに含まれるかチェックする。

と思ったが、この程度で済むなら
通年に直さなくても見通し悪くはならないかもな。

855 :デフォルトの名無しさん:2009/05/09(土) 05:31:00
>>836-839
もう終わってる話に何だけど
struct test math[5] = {{0}};
これじゃあかんかったっけ?
C99なら
struct test math[5] = {};
でも良かった気がする。

デマカセだったらすまね。


856 :デフォルトの名無しさん:2009/05/09(土) 07:18:44
ダンジョンできたよー

    ■  ■■■■■  ■  ■■■■■
   ■  ■                      ■
  ■  ■  ■  ■  ■  ■  ■  ■
 ■          ■              ■
■■■■■■■■■■■■■■■


857 :デフォルトの名無しさん:2009/05/09(土) 11:41:56
>>848
失礼しました。dllは漢字→かな変換のkakasiです。
辞書ファイルへのパスを環境変数として設定する必要があるためにputenvしてます。
そのままソースコードをのせます。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
void main(void){
HMODULE hKakasiDLL = LoadLibrary(".\\kakasi\\kakasi.dll");
int (__cdecl *kakasi_getopt_argv)(int, char**) = (int (__cdecl *)(int, char**))GetProcAddress( hKakasiDLL, "kakasi_getopt_argv" );;
char* (__cdecl *kakasi_do)(const char*) = (char* (__cdecl *)(const char*))GetProcAddress( hKakasiDLL, "kakasi_do" );
int (__cdecl *kakasi_free)(char *p) = (int (__cdecl *)(char *p))GetProcAddress( hKakasiDLL, "kakasi_free" );

putenv( "ITAIJIDICTPATH=.\\kakasi\\itaijidict"); // 辞書ファイルへのパスを環境変数に設定
putenv( "KANWADICTPATH=.\\kakasi\\kanwadict"); // 辞書ファイルへのパスを環境変数に設定

char* argv[] = {"kakasi", "-JH","-kH"};
kakasi_getopt_argv(3,argv);
char* hiragana = kakasi_do("漢字カタカナをひらがなに変換しますん");
printf("%s\n", hiragana);
kakasi_free(hiragana);
FreeLibrary(hKakasiDLL);
}
上記ソースをmingwでコンパイルして実行すると以下の結果に。
 →かんじかたかなをひらがなにへんかんしますん
MSVC++6.0でコンパイルして実行すると以下の結果になってしまいます。
 →c:/kakasi/share/kakasi/kanwadict: No such file or directory

c:/kakasi/share/kakasi/kanwadictは環境変数を設定しない場合のデフォルト検索位置です。
※それ以前にMSVC++6.0使ってるのが悪い?

858 :857:2009/05/09(土) 11:44:19
>>851
そ、そ、そ、そ、そんな方法が!試してみます!

859 :デフォルトの名無しさん:2009/05/09(土) 12:05:09
ウォリスの円周率を求めるプログラムなのですが、模範解答と実行結果が異なってしまいます。
もし誤差による場合、それはどうすれば改善できますか?
どなたか教えてください。

#include <stdio.h>
main() {
int n;
double p;
p = 2.0;
for( n=1; n<=10000; n++ ) {

if(n%2!=0){p=(p*(n+1)*(n+1))/(n*(n+2));}

if( n%1000==0 ) { printf("%8d %le \n",n,p); }
}
printf("\n");
}


860 :857:2009/05/09(土) 12:06:15
連投もうしわけない。。。。
>>851の方法も試してみましたが、mingwでもMSVC++でも環境変数を認識してくれませんでした。。。
以下は試したコードです。
#include <stdio.h>
#include <windows.h>
void main(int argc, char* argv[]){
  PROCESS_INFORMATION pi;
  STARTUPINFO si;ZeroMemory(&si,sizeof(si));si.cb=sizeof(si);
  char* env = "ITAIJIDICTPATH=..\\kakasi\\itaijidict\0\0KANWADICTPATH=.\\kakasi\\kanwadict";
  CreateProcess(argv[1],NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,env,NULL,&si,&pi);
}
上記を実行してみたところこれでした→c:/kakasi/share/kakasi/kanwadict: No such file or directory

長々と申し訳ないです。もうちょっと調べてみます。

861 :デフォルトの名無しさん:2009/05/09(土) 12:22:08
>>860
\0 を二回重ねる位置が違う

char* env = "ITAIJIDICTPATH=..\\kakasi\\itaijidict\0\0KANWADICTPATH=.\\kakasi\\kanwadict";

char* env = "ITAIJIDICTPATH=..\\kakasi\\itaijidict\0KANWADICTPATH=.\\kakasi\\kanwadict\0\0";

※最後に \0 が1つ余分になるけど明示するためにあえて二つ書く!

862 :デフォルトの名無しさん:2009/05/09(土) 12:26:49
>>857
LoadLibrary より先に環境変数を設定すればいけそうな気がするが、
コンパイラによって挙動が変わるのは納得いかないな

863 :デフォルトの名無しさん:2009/05/09(土) 12:27:31
>>859
とりあえず君の実行環境は?

864 :デフォルトの名無しさん:2009/05/09(土) 12:31:41
>>863
UNIXのTera Term VTです。

865 :デフォルトの名無しさん:2009/05/09(土) 12:39:26
>>864
実行結果はどうなる?全然違う値になる?それとも3.14にそこそこ近いの?

866 :デフォルトの名無しさん:2009/05/09(土) 12:43:18
模範解答
1000 3.140808e+00
2000 3.141200e+00
3000 3.141331e+00
4000 3.141396e+00
5000 3.141436e+00
6000 3.141462e+00
7000 3.141480e+00
8000 3.141494e+00
9000 3.141505e+00
10000 3.141514e+00
 
実行結果
1000 3.140024e+00
2000 3.140808e+00
3000 3.141069e+00
4000 3.141200e+00
5000 3.141279e+00
6000 3.141331e+00
7000 3.141368e+00
8000 3.141396e+00
9000 3.141418e+00
10000 3.141436e+00 
となってしまいます。


867 :デフォルトの名無しさん:2009/05/09(土) 12:49:23
>>866
doubleの誤差の前に、もしかしてアルゴリズムが模範解答と違うんじゃない?
模範解答のnが君の2nに当たっているように思えるが。


868 :デフォルトの名無しさん:2009/05/09(土) 12:52:29
>>867
すいません、気づきませんでした。
でも、その場合どう改善すればいいんですか??


869 :867:2009/05/09(土) 12:54:25
>>868
>>866
そんなに聞いてどうするw俺はプログラミングは仕事じゃなくてただの趣味人間なのに。

まあね、おそらくカウンタは君と同じく
 for( n=1; n<=10000; n++ )
なんだろうが、適用するところで
 p=(p*(2n+1)*(2n+1))/(2n*(2n+2));
としているのだろう。これならifの条件分岐すら要らない。

870 :デフォルトの名無しさん:2009/05/09(土) 13:01:12
>>869
聞いてばっかりでごめんなさい。
ありがとうございました。

871 :デフォルトの名無しさん:2009/05/09(土) 13:02:05
>>870
有名な計算はぐぐればあちこちに転がってるよ


872 :867:2009/05/09(土) 13:02:09
あとまあ強いて修正点を挙げるとすれば
n++より++nの方が望ましい。
また、p*=(2n+1)*(2n+1)/(2n*(2n+2))と書くことも出来るだろう。

873 :デフォルトの名無しさん:2009/05/09(土) 13:08:56
>>871
そうなんですか、はじめて知りました。参考にしてみます。
>>872
参考になります。ありがとうございます


874 :デフォルトの名無しさん:2009/05/09(土) 14:58:21
>>872
右辺をどっかでdoubleにしないと

875 :872:2009/05/09(土) 15:00:27
>>874
おおホントだ、失礼した。
適当にキャストしといてくれな。

876 :デフォルトの名無しさん:2009/05/09(土) 17:07:43
__declspec(naked)って何が違うのですか?
プロローグ処理及びエピローグ処理を自前でって言われても、あまりピンとこないです
しかし、その処理を自前にすることにが、頻繁に呼ばれる関数等の速度向上のポイントではないか、と考えたのですが、
具体例とともにご教授ください

877 :デフォルトの名無しさん:2009/05/09(土) 17:14:13
>>876
ようするに何から何まで全部インラインアセンブラでやるから
コンパイラは何もするなというときに使う。

878 :デフォルトの名無しさん:2009/05/09(土) 17:20:26
>>877
えー、高速化という意味でピンときません
@プロローグ及びエピローグ処理が抑制される
何故抑制出来る仕様になっているのですか?

879 :デフォルトの名無しさん:2009/05/09(土) 17:30:00
そりゃあ、それ自体は高速化のための機能じゃないからピンと来るはずがない

880 :デフォルトの名無しさん:2009/05/09(土) 17:31:29
>>878
>>877が書いてくれてるインラインアセンブラを理解した方がいいかも

Cソースだけど、中身はインラインアセンブラを使ったアセンブラソースですよ
というのを教えるためなので高速化はインラインアセンブラの記述次第かと

881 :デフォルトの名無しさん:2009/05/09(土) 17:49:42
なるほど、
引数をスタックで渡すかレジスタで渡すかをプログラマが決めれる
よって高速化も可能ということもありますか?

882 :デフォルトの名無しさん:2009/05/09(土) 17:51:25
>>881
まあそうなりますね
そこまでして高速化したいってのがよくわからないけど

コンパイルオプションで最適化度合いを上げてみるとかもやってみました?

883 :デフォルトの名無しさん:2009/05/09(土) 18:10:44
>>882
まだです。
今からやってみます。

884 :デフォルトの名無しさん:2009/05/10(日) 03:54:38
良く分からんけど高速化っちゅうより他の言語や環境相手で呼び出し規約が違ってる場合に使うんじゃないの?
割り込みベクタに設定するとか。

885 :デフォルトの名無しさん:2009/05/10(日) 08:00:40
配列の中、例えばdouble n[200]の中身が全て同じ数値かどうか調べるので軽い
方法ってどんな方法がありますか?

886 :デフォルトの名無しさん:2009/05/10(日) 08:05:26
>>885
順に舐める以外に思い付かん。

887 :デフォルトの名無しさん:2009/05/10(日) 08:15:56
頻繁に調べるならデータ構造を考え直したほうが

888 :デフォルトの名無しさん:2009/05/10(日) 12:52:12
>>885
全部なめるしかないだろうね
工夫するとすると、複数コア環境なら並列化して分割統治できるかもしれない、
doubleで演算すると遅いので整数レジスタで比較する、ぐらいかなあ

889 :デフォルトの名無しさん:2009/05/10(日) 12:59:54
doubleの等値比較という時点で(ry

890 :デフォルトの名無しさん:2009/05/10(日) 13:09:02
他人のコードってなんで読む気がしないんだろうっていつも不思議に思う

891 :デフォルトの名無しさん:2009/05/10(日) 13:11:21
俺は自分のコードも読む気しない

892 :デフォルトの名無しさん:2009/05/10(日) 15:02:00
そこでコードを読んでくれるコードを書くことにした

893 :857:2009/05/10(日) 15:17:51
>>861
全俺が泣いた。ご指摘のとおりです。

>>862
それもおもって環境変数設定する位置をずらしたりしましたがダメでした。

最終的にはkakasi.dllをバイナリエディタで開いて、
c:/kakasi/share/kakasi/kanwadictの部分を編集してパスを変えました^q^

色々勉強になりました。ありがとうございました。

894 :デフォルトの名無しさん:2009/05/10(日) 19:35:45
すいません。宿題スレないんでこちらで失礼します。
OSソラリス コンパイラgcc C言語
台形の面積を求めるプログラム
キーボードより上底a下底b高さhの値を入力して台形の面積を計算するプログラムを作成せよ。お願いします。

895 :デフォルトの名無しさん:2009/05/10(日) 19:36:55
宿題スレいってください

896 :デフォルトの名無しさん:2009/05/10(日) 19:56:23
自分が宿題スレみつけられないほどの低脳なのに、
なんでそれを認めないでスレがないとか言っちゃうんだろうな。

897 :デフォルトの名無しさん:2009/05/10(日) 19:57:28
>>894
> すいません。宿題スレないんでこちらで失礼します。
あんたバカぁ?
釣りは自重してください。


898 :デフォルトの名無しさん:2009/05/10(日) 20:01:43
>>896
坊やだからさ


899 :デフォルトの名無しさん:2009/05/11(月) 16:29:35
台形の面積を求めるプログラムって…相変わらず酷いな。

900 :デフォルトの名無しさん:2009/05/11(月) 16:32:29
>>899
教師がへぼすぎだからだろ
宿題スレの課題のアホくささみてるとなあ

もうちょっと将来的に役にたちそうな数学系を学ばせればいいのにと思うよ。

ゲーム系で言えばベクトル系だとか物理演算などなど



901 :デフォルトの名無しさん:2009/05/11(月) 16:35:01
とりあえず入力と出力をやらせたいんだろう
算数から持ってくりゃ計算部分の説明しないで済むしな

902 :デフォルトの名無しさん:2009/05/11(月) 16:40:56
>>901
標準の入出力なんてのもゴミだよな

一瞬で終わらせる内容で課題にするレベルでもなんでもないw

903 :デフォルトの名無しさん:2009/05/11(月) 16:49:29
まあそりゃそうだなあ。
でもそれをわざわざ聞きにくるってことはそもそも教えてないのかな?
いきなりやってみろと。

904 :デフォルトの名無しさん:2009/05/11(月) 16:51:24
>>903
だろうな
それで教師が納得してるというか、楽してるんだよ

プログラム組もうとしたら環境依存のAPI叩かないとまともな演出もできないのに
さっさとそっち教えた方がよっぽど現実で使える。
というかそれでさえ最低限の能力としてしか評価されないというのに。

905 :デフォルトの名無しさん:2009/05/11(月) 16:53:42
つうか台形の面積を求めるプログラムってここで質問するレベルじゃないよな

906 :デフォルトの名無しさん:2009/05/11(月) 16:58:32
>>905
だねえ
あともっとベクトルの違う勘違いしてるのがbmpのヘッダー解析とか

それは車輪の再開発ですってのも結構あるな。

組み込みでもそんなの要求されるのか?というレベル

907 :デフォルトの名無しさん:2009/05/11(月) 17:02:39
>>906
組込だったらあるだろうね。
リンクリストやソートすら、いちから実装することがままある。

908 :デフォルトの名無しさん:2009/05/11(月) 17:02:46
物理科だけど大学の数値計算とかの講義受けてると楽そうな仕事だなぁって思う
給料が微妙そうだけどこーゆー簡単な仕事やりたいわ

909 :デフォルトの名無しさん:2009/05/11(月) 17:06:13
>>907
でもビットマップがサポートしてる全フォーマットを読み込めるような汎用ライブラリはいらんでしょ

910 :デフォルトの名無しさん:2009/05/11(月) 17:31:54
台形の面積はいいだろ。
プログラムに意味があるもん。

文法を理解してるかどうかをチェックするためだけの
まったく意味のない課題とかよくあるよ。

911 :デフォルトの名無しさん:2009/05/11(月) 17:35:52
ここでえらそうに回答しているような連中にとっては「一瞬で終わらせる」
ようなこと、例えば代入や条件判定やループや標準入出力あたりの簡単な
ことでも、理解して使えるようになるまでに発想の飛躍が必要になる人も
いるのだよ。理解してしまえばそれこそ本人にとっては「一瞬」じゃんって
ことになるんだけどね。

数学科出身で、なぜか初めての言語がHaskellという人がいて、なかなか
優秀な人なんだけどCの代入文の理解で最初苦しんでいたな。

912 :デフォルトの名無しさん:2009/05/11(月) 17:41:44
車輪の再発明も課題ならべつにいいだろ。

初心者でもできるレベルで、独創的な課題なんてそんなんあるか。

913 :デフォルトの名無しさん:2009/05/11(月) 17:46:59
>>910-912
単品でだして課題を気取る程度じゃないってことでしょ

上で出てるbmpの処理なんてそれこそグラフィックのついでにさらっとやっておけばいいし

台形とかもグラフィックのついででいいのにそっちがメインになってるし

914 :デフォルトの名無しさん:2009/05/11(月) 18:49:10
月面の重力は地球の約17%です。
自分の体重を入力すると月での実効体重を
計算し、表示するプログラムを作成してくだ
さい。

これ誰か組んでください↑
まったこ分りません



915 :デフォルトの名無しさん:2009/05/11(月) 18:49:58
>>914
宿題スレへどうぞ

その前にスレを探すスキルを身につけたほうがいいかも
なければ立つまで待て

916 :デフォルトの名無しさん:2009/05/11(月) 18:51:39
ある程度勉強して本当にまったくわからないなら知能障害を疑ったほうがいいですよ

917 :デフォルトの名無しさん:2009/05/11(月) 19:10:56
>>914
ttp://pc12.2ch.net/test/read.cgi/tech/1240022781/902
マルチかよ。なんだお前。

918 :デフォルトの名無しさん:2009/05/11(月) 20:55:24
コンパイラとはミドルウェアでいいんですか?
そもそもミドルウェアとはなんですか?
初歩的な質問すいません

919 :デフォルトの名無しさん:2009/05/11(月) 20:57:53
>>917


920 :デフォルトの名無しさん:2009/05/11(月) 21:01:12
>>918
コンパイラは翻訳機とでも言っておきましょう

C言語などは人間にまだわかりやすい言語

コンピューターはCPUごとに処理しやすい機械語(マシン語)というのが存在します。

これに翻訳するのがコンパイラです。

ミドルウェアというのはソフトウェアの一種です。
特定の機能をまとめた物で、ミドルウェアを使うことでわざわざ開発する手間を省くことができます。
特定の機能というのは、たとえば業務用のプログラムを組む場合はデータ管理をするプログラムは
DB機能を提供してるプログラムを使うことで開発する必要がなくなります。
ゲームでも最近はミドルウェアのお世話になることが多々あるようです。
まあ、どんなプログラムにせよある程度の部分は共通性がでてくるんですよね。
それを纏め上げて開発のサポートをするための物がミドルウェアです。

921 :デフォルトの名無しさん:2009/05/11(月) 21:07:40
>>920
レスどうもです。
ということはライブラリ等はミドルウェアに含まれるんですね。
とんちんかんな事言っているようでしたら容赦なく叩いてください。

922 :デフォルトの名無しさん:2009/05/11(月) 21:09:54
>>921
うーんライブラリ全般がミドルウェアというわけではないですね。
ミドルウェアといいえばOSよりは小規模ですがそれに近い存在の大きさの物
のことがほとんどですね。


923 :デフォルトの名無しさん:2009/05/12(火) 00:15:09
関数の引数に配列(の先頭アドレス)を渡したいんですけど、その配列のサイズを限定するには構造体でくくるしかないんでしょうか?

924 :デフォルトの名無しさん:2009/05/12(火) 00:25:17
エスパーが必要だな。一応どうだって出来ると答えておこう

925 :デフォルトの名無しさん:2009/05/12(火) 00:29:01
>>924
確かにエスパーだなw

>>923
配列を受け取る関数は自前で作成したものかすでに誰かが用意したものかでも違うし
他人が用意したものなら、その人と相談するしかないんじゃない?

自分で用意した物であればたとえばだけど、引数に配列の先頭アドレスと渡した配列は何個あるか
という数字を渡すようにするとかしかないと思う。
あと構造体で囲った場合は可変させる場合はどうするのとかあるよね

926 :デフォルトの名無しさん:2009/05/12(火) 00:58:50
foo bar(hoge hg[5]);
みたいな感じで[5]以外の配列は受け取れない、みたいにしたいんです
上のやりかただとうまくいかないのでどうしたらいいのかなと
構造体ならいいんですけど数が増えてくるとうっとおしくて・・・

927 :デフォルトの名無しさん:2009/05/12(火) 01:00:43
>>926
cじゃあ無理じゃないかな

というかC#とかで開発してた口?
そういう面度は自分でみるしかないのがC

928 :デフォルトの名無しさん:2009/05/12(火) 01:07:20
関数で制御するんじゃなくて、自分で渡さないようにすりゃいいだけじゃ?

929 :デフォルトの名無しさん:2009/05/12(火) 01:08:24
>>928
そうじゃないだろ

渡す配列数は常に可変

でもそれを関数側に対応させたい

どう考えてもCじゃ無理です

930 :デフォルトの名無しさん:2009/05/12(火) 01:09:04
>どう考えてもCじゃ無理です
もとい

どう考えてもCじゃ配列の最大数を渡すとかしないと無理です

931 :デフォルトの名無しさん:2009/05/12(火) 01:14:34
>>929
>>926を読んでもそう思うならやべーなw

932 :デフォルトの名無しさん:2009/05/12(火) 01:16:25
>>931
へ?
上からの質問を見ると
質問者の本当の欲しいのはhoge hg[]でしょ
で関数内部では0〜4だけを処理させたい

933 :デフォルトの名無しさん:2009/05/12(火) 01:22:34
hogeが構造体なのかはしらんけどたとえば
hoge hg[10]という配列になってて
そのある一定の範囲を処理させたいの?それもと
常に配列のどれか一つを処理させたいの?

934 :デフォルトの名無しさん:2009/05/12(火) 01:24:49
>[5]以外の配列は受け取れない、みたいにしたいんです
って言ってんだからhg[10]は関数に渡せないようにしたいんだろ。

935 :デフォルトの名無しさん:2009/05/12(火) 01:27:26
>>923のようなエスパーな質問するやつの>>934なんてそのまま読めるわけねーだろ


936 :デフォルトの名無しさん:2009/05/12(火) 01:34:59
>>923だけならともかく、>>926もあるのに理解できないのはダメすぎるな。

937 :デフォルトの名無しさん:2009/05/12(火) 01:36:56
>>936
は?
両方あるならどっちが求める解か聞いて結論出すのが普通だろ


938 :デフォルトの名無しさん:2009/05/12(火) 01:39:00
引数に配列を渡したいのたが、
要素数5(越えても未満でもだめ)であることを強制させたい。
構造体を作るほかに方法はないか?ということだな。
うん、確実なのはそれしかないと思う。

939 :デフォルトの名無しさん:2009/05/12(火) 01:44:41
引数でサイズも渡して、内部で比較してエラーを返すってのはどうかな?


940 :デフォルトの名無しさん:2009/05/12(火) 01:44:50
なんかいろいろ勘違いして理解してる感じもするなあ>>923

hoge 1個を処理させる関数があってその関数を呼ぶ側がたまたまhogeを配列で確保しててる場合は
foo bar(hoge* ptr)
{

}
とでも関数をしておいて

hoge hg[10]

処理

bar(&hg[5]);

とすればhg[5]の先頭がわたる

でもCの場合hg[6]だろうがアドレスを足せば実は見えるわけで制限というのは
実はできないに等しい

自分変なアクセスをしないつくりにしないと

941 :デフォルトの名無しさん:2009/05/12(火) 01:46:20
>>940
お前が勘違いしすぎw

942 :デフォルトの名無しさん:2009/05/12(火) 01:46:50
>>939
比較もなにもCの場合は不正な場所にアクセスして停止するとかでなけえば
見える範囲はどこまでいけるよw

そんな安全機構は無い



943 :デフォルトの名無しさん:2009/05/12(火) 01:52:54
頼むからマネージドの世界からこっちくんな


944 :デフォルトの名無しさん:2009/05/12(火) 01:54:13
>>942
誰もそんな話しはしてない。
関数に渡す配列のサイズを限定したいなら、関数にサイズも一緒に渡して
関数内部で渡したサイズと求めるサイズを比較して違ったらエラーを返したらどうか
って言ってんの。

945 :デフォルトの名無しさん:2009/05/12(火) 01:55:30
>>923
呼び出す側で気をつけるか
構造体にするかのどちらかだね

946 :デフォルトの名無しさん:2009/05/12(火) 03:27:32
だいたい、なんでサイズ固定の配列だけを渡したいの?

947 :デフォルトの名無しさん:2009/05/12(火) 04:20:50
質問です

"abcde"[3]
とやると "d" を取得できますが、これと同じことを数列でもできますか?

948 :デフォルトの名無しさん:2009/05/12(火) 04:28:13
数列って何の事を言ってる?

949 :デフォルトの名無しさん:2009/05/12(火) 04:29:18
"d"は取得できないよ

950 :デフォルトの名無しさん:2009/05/12(火) 04:42:50
>>947
#include <stdio.h>

int main(int argc, char *argv[]){
printf("%d\n", (int []){1,2,3,4,5}[4]);
printf("%f\n", (double []){1,2,3,4,5}[2]);
return 0;
}

951 :デフォルトの名無しさん:2009/05/12(火) 04:53:38
>>950
ありがとうございます!
どのようなキーワードで検索したらよいのか分からないほど初心者ゆえ
拙い説明になってしまいましたが
思い通りの回答をいただき、感謝に尽きます

952 :デフォルトの名無しさん:2009/05/12(火) 05:17:35
>>950
アホな事書くなヴォケ

953 :デフォルトの名無しさん:2009/05/12(火) 08:00:03
何でアホなことなの?
>>950 はCの文法通りなんだけど。

954 :デフォルトの名無しさん:2009/05/12(火) 08:08:57
はじめてみた
これなに?C99?独自拡張?
俺が無知なだけ?

955 :デフォルトの名無しさん:2009/05/12(火) 08:23:26
gccだと -ansi -pedantic でもコンパイルできるからANSI(C89)でもOKじゃないかな。

956 :デフォルトの名無しさん:2009/05/12(火) 08:26:15
>>950
gccではコンパイルできたけどVC++ではエラーになった


957 :デフォルトの名無しさん:2009/05/12(火) 09:34:06
>>956
VCはC99に未対応。

958 :デフォルトの名無しさん:2009/05/12(火) 10:11:55
>>954
つ[複合リテラル]

959 :デフォルトの名無しさん:2009/05/12(火) 10:29:59
>>955
何いい加減な事言ってるんだ
K&R本のどこにもこんな書き方は認められていないぞ
認められているのはISO/IEC 9899:1999のみだ
C89はアウト

960 :デフォルトの名無しさん:2009/05/12(火) 10:31:04
>>958
ああコンパウンド・リテラルね
まんまC99からしか使えない

961 :955:2009/05/12(火) 10:45:25
>>959
あれ… さっきのファイルをもう一回 -ansi -pedantic でコンパイルしたら警告がでた。
a.c:4: warning: ISO C90 forbids compound literals

さっき何で平気だったんだろうと思ってシェルの履歴を見たら -peduntic になってたよ。
gccが何も言ってこないから気づかなかった。

962 :デフォルトの名無しさん:2009/05/12(火) 11:24:44
>>950
Cってこんな書き方出来るんだ。
ってかこれって初心者が覚える書き方じゃないだろw

963 :デフォルトの名無しさん:2009/05/12(火) 12:05:40
無しで書くとしたらわざわざ変数一個定義する訳だから、初心者とか関係なく
覚えておいて損はないと思う。

964 :デフォルトの名無しさん:2009/05/12(火) 12:23:45
enemy = 4; //3以上の数で初期化

while( enemy > 3 ){

srand ( ( unsigned) time ( NULL ) );
enemy = rand() % 10;

}


乱数を使って0〜2の数値をenemyに格納する時って、こういう書き方が普通なの?
もっと良い書き方あれば教えて欲しい

965 :デフォルトの名無しさん:2009/05/12(火) 12:26:36
srand はプログラム起動時に1回書けばよろしい
同じ値でsrand呼ぶとrandが返す値は同じだぞ

966 :デフォルトの名無しさん:2009/05/12(火) 12:27:50
ってそれ以前に rand() % 3じゃいかんの?

967 :デフォルトの名無しさん:2009/05/12(火) 12:32:34
>>966
あ、そっかw
3で割れば余りは0〜2だもんな。

ゴメン、ボケてた

968 :デフォルトの名無しさん:2009/05/12(火) 12:39:03
enemy = rand() % 3;
もしくは
enemy = rand() / (RAND_MAX + 1.0) * 3;

969 :デフォルトの名無しさん:2009/05/12(火) 12:49:21
こういう細々とした定石コードを纏めたサイトって無いのかね

970 :デフォルトの名無しさん:2009/05/12(火) 13:02:44
どこに定石が…w

971 :デフォルトの名無しさん:2009/05/12(火) 13:05:44
定石なんかいらないだろw
その場その場で考えて行けばいいだけで
それとも頭悪いの?

972 :デフォルトの名無しさん:2009/05/12(火) 13:08:45
定石というか

struct x {
char a[10];
}

とか

struct x {
int a;
int b;
int c[];
}

こういうのか。

973 :デフォルトの名無しさん:2009/05/12(火) 13:15:18
#include <stdio.h>

int main(void)
{
printf("hallo world!\n");

return 0;
}

定石と言ったらこれだろJK

974 :デフォルトの名無しさん:2009/05/12(火) 13:17:06
無限ループは
for(;;) で書くか while(1) で書くか…

975 :デフォルトの名無しさん:2009/05/12(火) 13:21:18
構文エラー )が;の前にありません。
srand ( ( unsigned ) time ( NULL );

え?なんで?あるじゃん。
一応srandの上も確認するが、バグが見当たらない。


  ,j;;;;;j,. ---一、 `  ―--‐、_ l;;;;;;
 {;;;;;;ゝ T辷iフ i    f'辷jァ  !i;;;;;   …ハハッVC2005め、エラーを出して構って欲しかったのか。
  ヾ;;;ハ    ノ       .::!lリ;;r゙  全くツンデレだなお前は。
   `Z;i   〈.,_..,.      ノ;;;;;;;;>  そんなふうに考えていた時期が
   ,;ぇハ、 、_,.ー-、_',.    ,f゙: Y;;f   俺にもありました
   ~''戈ヽ   `二´    r'´:::. `!

976 :デフォルトの名無しさん:2009/05/12(火) 13:42:07
つっこむか引き抜くかまよう段階

977 :デフォルトの名無しさん:2009/05/12(火) 16:28:13
>>974
whileに定数書いたらコンパイラに注意されたことがある


978 :デフォルトの名無しさん:2009/05/12(火) 16:47:39
>>964
同じような間違いをなんどか見たことあるけど、
こういう人って入門書とか読まずにリファレンスだけで勉強してるのだろうか。

979 :デフォルトの名無しさん:2009/05/12(火) 16:50:49
リファレンスだけで勉強できるだけの素養があれば、srand()を毎回してはいけないことくらいは分かるんじゃね?

980 :デフォルトの名無しさん:2009/05/12(火) 16:58:25
素養がないのに、リファレンスだけでやってるから失敗してるとか。

981 :デフォルトの名無しさん:2009/05/12(火) 17:50:22
ループ変数はi〜n
それ以外は絶対に使わない

982 :デフォルトの名無しさん:2009/05/12(火) 21:02:05
ループ変数のkが出てきた時点でプログラムの構造を根本的に考え直した方がいい

983 :デフォルトの名無しさん:2009/05/12(火) 21:04:45
擬似乱数という物を理解してないとsrandの意味は分からんよな

984 :デフォルトの名無しさん:2009/05/12(火) 21:05:36
次スレ立てました
C言語なら俺に聞け(入門篇) Part 48
http://pc12.2ch.net/test/read.cgi/tech/1242129892/

985 :デフォルトの名無しさん:2009/05/12(火) 22:10:21
トランプのカードをシャッフルさせようとしています
1番の方法と2番の方法のどちらの方法を選ぶのが良いでしょうか?
#include<stdio.h>
#include<stdlib.h>

void swap(int *a, int *b){
int c;
c=*a;
*a=*b;
*b=c;
}

int main(void){
int i, card[52];

for(i=0;i<52;i++) card[i]=i;
for(i=0;i<52;i++) swap(&card[i], &card[rand()%(i+1)]); // 1番

for(i=0;i<52;i++) card[i]=i;
for(i=0;i<52;i++) swap(&card[i], &card[i+rand()%(52-i)]); // 2番

return 0;
}

986 :デフォルトの名無しさん:2009/05/12(火) 22:17:01
>>985
「シャッフル アルゴリズム」でググるといろいろでてくると思う。

987 :デフォルトの名無しさん:2009/05/12(火) 22:17:39
どちらも良くない
for(数回)

for(i=0;i<52;i++) swap(&card[i], &card[i+rand()%(52)]);

が、まだまし

988 :デフォルトの名無しさん:2009/05/12(火) 22:20:14
>>987
添え字がオーバーしとるがな

989 :デフォルトの名無しさん:2009/05/12(火) 22:22:31
>>985
fisher yatesでぐぐれ
直感的にも正しい(実質ランダムに一枚づつ抽出と同じであることが容易に理解できる)ものだし
ループは一重で済むし

>>987
糞以下のものをだすな


990 :デフォルトの名無しさん:2009/05/12(火) 22:23:44
おお
for(数回)

for(i=0;i<52;i++) swap(&card[i], &card[rand()%(52)]);

訂正や

991 :985:2009/05/12(火) 22:30:18
>>989
こんな感じでしょうか
for(i=0;i<52;i++) card[i]=i;
for(i=52-1;i>=0;i--) swap(&card[i], &card[rand()%(i+1)]);

ぱっと見は1番に近いですが
アルゴリズムの内容的には2番と一緒になりますね

992 :デフォルトの名無しさん:2009/05/12(火) 22:45:41
>>985
2番よりも >>991 の方がリテラル埋め込みが少ないからオススメ

993 :デフォルトの名無しさん:2009/05/12(火) 23:37:59
>>985

for(i=0; i<52; i++) {
j = rand() % (i + 1);
card[i] = card[j];
card[j] = i;
}

で初期化とシャッフルを同時にやるのはどうよ?

994 :デフォルトの名無しさん:2009/05/12(火) 23:40:39
990はバカすぎて話になんねーw

995 :デフォルトの名無しさん:2009/05/13(水) 00:00:01
for(i = 0; i < X; i++){
n = rand()%52;
for(j = 0; j < n; j++){
swap(&card[j], &card[n+j]);
for(k = n; k < 51; k++ )
swap(&card[k], &card[k+1]);
}
}

996 :デフォルトの名無しさん:2009/05/13(水) 00:10:48
>>994
若干偏りのでるアルゴリズムではあるが
実用上は問題ないのでは?

997 :デフォルトの名無しさん:2009/05/13(水) 00:15:43
全く偏りの出ない>>985に対して後からそれより偏るもの出してどうすんだよw

998 :デフォルトの名無しさん:2009/05/13(水) 00:16:03
unixコマンドのsortは数百Mのテキストも平気でソートできるけど
どういうアルゴリズムでやっているか概略を知っている方いらっ
しゃいましたらご教授下さい。(オンメモリなのかそうでないか
とか)

999 :デフォルトの名無しさん:2009/05/13(水) 00:32:32
ソース読むとか。
sortにはメモリバッファのサイズを指定するオプションがあるので、
メモリが少ない時は少ないなりのアルゴリズムでやってるのかな。
役に立たんレスで済まんね。

1000 :デフォルトの名無しさん:2009/05/13(水) 00:53:10
次スレで俺の時代が到来

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

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

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)