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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
 C/C++の宿題を片付けます 121代目
 http://pc11.2ch.net/test/read.cgi/tech/1230678123/

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

前スレ
 C言語なら俺に聞け(入門篇) Part 41
 http://pc11.2ch.net/test/read.cgi/tech/1229639514/
過去スレ
  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/01/06(火) 03:34:55
>>1
3デフォルトの名無しさん:2009/01/06(火) 03:40:11
/   //   /   //    ______     /   //   /
 / //   /|   r'7\ ,.ヘ‐'"´iヾ、/\ニ''ー- 、.,   /    /
  /   / |  |::|ァ'⌒',ヽ:::ヽrヘ_,,.!-‐-'、二7-ァ'´|、__
`'ー-‐''"   ヽ、_'´  `| |:::::|'"       二.,_> ,.へ_
         /  //__// / / /      `ヽ7::/
 か っ も  |  / // メ,/_,,. /./ /|   i   Y   //
 ァ  て う.  |'´/ ∠. -‐'ァ'"´'`iヽ.// メ、,_ハ  ,  |〉
  |  約 ク  ヽ! O .|/。〈ハ、 rリ '´   ,ァ=;、`| ,ハ |、  /
  |  束 ソ   >  o  ゜,,´ ̄   .  ト i 〉.レ'i iヽ|ヽ、.,____
  |  し  ス  /   ハ | u   ,.--- 、  `' ゜o O/、.,___,,..-‐'"´
  |  た  レ  |  /  ハ,   /    〉 "从  ヽ!  /
  |  じ  は  |,.イ,.!-‐'-'、,ヘ. !、_   _,/ ,.イヘ. `  ヽ.
 ッ .ゃ .立   |/     ヽ!7>rァ''7´| / ',  〉`ヽ〉
 ! ! な  て   .',      `Y_,/、レ'ヘ/レ'  レ'
   い  .な    ヽ、_     !:::::ハiヽ.   //   /
   で   い   ./‐r'、.,_,.イ\/_」ヽ ',       /  /
   す      /    `/:::::::/ /,」:::iン、 /    /
          〈  ,,..-‐''"´ ̄ ̄77ー--、_\.,__  /
      ,.:'⌒ヽ ´         | |  , i |ノ   `ヾr-、
4デフォルトの名無しさん:2009/01/06(火) 03:53:44
janeの隠し機能

1.書き込みウィンドウを出し半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
5デフォルトの名無しさん:2009/01/06(火) 03:56:36
質問です
main(){
int kekka = 0;
unsigned char soeji[] = { 4, 3, 2, 1 };
unsigned int deta[] = { 0, 100, 200, 300, 400 };

kekka = deta[(soeji[3])];
}

この
deta[(soeji[3])]
という表記は使っても大丈夫でしょうか?(kekkaに100が入ってる?)
また添え字になるならsoeji[]はunsigned charよりunsigned intの方が
処理速度的にはよいのでしょうか?

よろしくお願いします。
6デフォルトの名無しさん:2009/01/06(火) 04:52:57
>>5
大丈夫。括弧は特に要らない。
入るだろう。
大抵はそうだが一概には言えない。
7デフォルトの名無しさん:2009/01/06(火) 08:26:37
>>5
処理速度を気にするのであれば、int を使うべき
8897:2009/01/06(火) 12:48:41
昨日C言語のインストールの仕方を教えてもらいインストールできました。
ファイルから新しいプロジェクトをクリックするとForm1小さなウインドウが出てきますがこれは何ですか?
あとプログラムを入力して出力させたいのですがどういった手順で出力させるのか教えてください。
初心者すぎてごめんなさい。
9デフォルトの名無しさん:2009/01/06(火) 13:06:39
あー、確かVisualStudioをインストールしたんだっけ?
VisualStudioスレ辺りで教えて貰う方がいいよ。
ここはVS使ってない人も多いし、言語スレであってコンパイラ操作方法スレじゃないから。
10デフォルトの名無しさん:2009/01/06(火) 13:06:56
>>8
Visual Studio 2008 Part 14
http://pc11.2ch.net/test/read.cgi/tech/1230008197/

このスレにこれるんだったら検索すれば分かるだろ?
11デフォルトの名無しさん:2009/01/06(火) 13:18:20
まさに Visual(視覚的)なものさ。そういうのは、プログラミングというよりも
インターフェースなどをぺたぺた貼り付けている感覚だな・・・
12デフォルトの名無しさん:2009/01/06(火) 13:23:56
c言語の勉強したいなら、bccかcygwinあたりを
インストールしなおしたほうがいいような気がするけど
13897:2009/01/06(火) 13:39:20
すいません。Visual Studio 2008 ってプログラミング向きじゃないんですか?
プログラミングの勉強がしたいのですが、、、。
14デフォルトの名無しさん:2009/01/06(火) 13:44:10
別に、アルゴリズムの勉強などは普通に出来るし。ただ、持ち合わせている開発環境は
OSがサポートするインターフェースを簡単に取り込みやすくなっているが。
かといって、それを使うようなプログラムでなければ、別に無理に使う必要もない。
まぁ、手軽にBCCを選ぶ人も少なくないようだが。
15デフォルトの名無しさん:2009/01/06(火) 13:48:06
VisualStudio 2005で平然と仕事してる俺らは変でしょうか?
メインの1つとしてかなり使っているのですが、、、。
16デフォルトの名無しさん:2009/01/06(火) 13:53:01
目的次第でしょ。必要なら必要だし。ただ、何を学ぶか?で
必要でなければ必ず使わなければならないものでも無い人は
手軽に扱えるBCCなどを選ぶ人も少なくはない。
17デフォルトの名無しさん:2009/01/06(火) 13:58:07
>手軽に扱えるBCCなどを選ぶ人も少なくはない。
>14とか>16くらいだな。
18デフォルトの名無しさん:2009/01/06(火) 13:58:15
>>13
コマンドラインでコンパイルすればいいだろ。 そしたらgccとかccとか発動する名前が違うだけ。
19デフォルトの名無しさん:2009/01/06(火) 14:01:01
情報収集の下手な人がうっかり使ってしまうのがBCC
20デフォルトの名無しさん:2009/01/06(火) 14:02:57
bccはいいよ。 低スペックでもコンパイル速いし。GCC、vccなど各種5個くらいインストールしているが
いつもbccをつかう。
21デフォルトの名無しさん:2009/01/06(火) 14:03:19
じゃあ俺のコンパイルは『いくぜえ!メタモルフォーゼ!!!!!!2010』
22デフォルトの名無しさん:2009/01/06(火) 14:04:48
>>13
VS上でプロジェクトを作るんじゃなくてまず.cファイルを書いてからそれをVSで開けばいい
そうすれば単なるCのプログラムとして作れる

のかな? BCBではそうなんだけど
23デフォルトの名無しさん:2009/01/06(火) 14:05:38
>>8
とりあえず専用スレで聞いた方がいいが、このスレでやりたいことなら
プロジェクト作る時にWin32のWin32コンソールアプリケーションで始めるといい。
CLRはそれが意味することがわかるまで一切さわらんほうがいいよ。
24デフォルトの名無しさん:2009/01/06(火) 14:07:59
プログラムをメモ帳などで書いたら、test.cppで保存して、dosプロンプトで次のように撃てば実行できる。
complie.bat というファイルに書いてクリックでも言い。

cl test.cpp > err.txt
25デフォルトの名無しさん:2009/01/06(火) 14:09:23
>>17
いや、お前が単にVC厨なだけ。それだけを使っている人は多くないだろうけど
少なくないの言葉の意味が分からないなら、大学にでも通ってみろ、低学歴
26デフォルトの名無しさん:2009/01/06(火) 14:10:18
>>17
あと、VSはこのスレにある、C言語のみの環境じゃないから。
かといって、C言語のスレでVisualは直接的ではないんで、あしからず。
27デフォルトの名無しさん:2009/01/06(火) 14:11:23
test.exeが出来てから、そのまま実行すると一瞬で消えるので
次のようなバッチファイルを実行すると言い.

test.exe
dosでキー入力を待つ命令
28デフォルトの名無しさん:2009/01/06(火) 14:13:05
>>17
宿題スレも見てみな。使っている人は 少なく ないから。
あと、VSが無くてもC言語は扱えるし。ここ、C言語スレだよ?
VSがいくら無償で使えるからって、別に無理に使わなくても良いし、
お前みたいな奴は、あのAPIを使うことがプログラミングだと思っているようだし。
たまには、ダイナミックHTMLでも扱ってみれば?
29デフォルトの名無しさん:2009/01/06(火) 14:14:30
>>25>>26
鏡を見てご覧、顔真っ赤な学歴コンプレックスな阿呆が見えるよ、きっと。
30デフォルトの名無しさん:2009/01/06(火) 14:16:11
>>24>>27
日本語の勉強が必要そうな人は、無理に回答しなくてもいいってご存知ありませんでしたか?
31デフォルトの名無しさん:2009/01/06(火) 14:17:01
インストールする時点で、既にBCCは容量が小さく、CPad for BCCと併用すれば楽。
いちいちプロジェクトがどうとか、ソースコード以外のごちゃごちゃした管理をするところまで
覚えなければならないのは、初心者にとっては手軽とはいえない。
32デフォルトの名無しさん:2009/01/06(火) 14:17:38
>>13
初心者がCをやってみたいなら、VSだと混乱をまねく部分が多そうって事。
これはVSとbccやgccの両方使ったことがある人なら同意してくれると思うんだけど。


33>14,16,25,26とかw:2009/01/06(火) 14:20:10
エディタとコンパイラだけで充分事が足りるのだから、cygwinでもLinuxOnVmwareでもいいからgccを使うのが一番楽。
まぁ、プログラミング以前で躓きそうな人も多そうだから敢えて薦めないが。
34デフォルトの名無しさん:2009/01/06(火) 14:22:47
>>32
ただ、初期の環境設定(include や lib のパス通し)は
VSだとインスコ段階で確定されてるから少し楽かも?

# bcc で エラー出るんだけど → include パス通って無かった ってオチが多いのもまたw
35デフォルトの名無しさん:2009/01/06(火) 14:23:09
>>1
> C言語の入門者向け解説スレです。
> ・C++言語はスレ違いです。
いい加減、Visualが付く製品は専用スレに誘導しろ。
手軽さに於いては、BCCは使われている方だよ。
C言語を習うのにUNIX、Linux系でも良いが、それを使っている人なら
MS製品のVSの話なんて場違いだしな。自分はVS使ってます宣言はしなくて良いから。
あと、初心者があれを使うのに、果たしてC言語の入門として使い方まで覚えるのに
時間や手間をかける意味があるとも思えん。何のためにVisualなのか、考えろ。
普通自動車の運転もまともに出来ない奴に、いきなり大型を扱わせるようなもの。
36デフォルトの名無しさん:2009/01/06(火) 14:25:13
>普通自動車の運転もまともに出来ない奴に、いきなり大型を扱わせるようなもの。

この例えは、、、
Visualなら大型だがAT、gccなら普通自動車だけどMT車ってとこだな。
37デフォルトの名無しさん:2009/01/06(火) 14:27:18
初心者はこの二つをインストールすればbcc使えるよ
まずは試してみて。 下のは統合環境だけど、bccコンパイラだけ使わしてもらう。
本家から落とすと手間取るため。


エディタ http://www.vector.co.jp/soft/winnt/prog/se466561.html?ds
コンパイラ http://www.vector.co.jp/soft/win95/prog/se326602.html?ds
38デフォルトの名無しさん:2009/01/06(火) 14:28:16
あとこれで初期設定しないと駄目だった


http://www.vector.co.jp/soft/win95/prog/se149182.html
39デフォルトの名無しさん:2009/01/06(火) 14:28:43
Win32コンソールで空のプロジェクトにチェックを入れたら
あとは拡張子を.cにするくらいで簡単に使えるけどな〉VC

でも個人的にはCPadの方がオススメ
4037 , 38:2009/01/06(火) 14:29:43
897へ 
いるなら、動かせる所まで教えてやるぜ
41デフォルトの名無しさん:2009/01/06(火) 14:30:18
布教活動お疲れ様です
42デフォルトの名無しさん:2009/01/06(火) 14:32:05
CPadは落とせる所が鳴いた幌
43デフォルトの名無しさん:2009/01/06(火) 14:34:21
ttp://www.microsoft.com/japan/msdn/vstudio/Express/
何が含まれているか、確認しろ。あと、MS製品だから。
C言語の質問スレでは明らかに製品そのものの質問はスレ違い。
C言語に関わる質問を受け付けるスレだぞ。C++だってスレ違いなんだし。

>>1 読め > VSの話をしている奴ら
> ・C++言語はスレ違いです。
44デフォルトの名無しさん:2009/01/06(火) 14:40:09
VSの話はだめだけどBCCの話はしていいですよね?
45デフォルトの名無しさん:2009/01/06(火) 14:41:00
>>13
ついでに、勉強するならこれすごいおすすめ
時間はかかると思うけど、間違いなく力つくよ。
http://www.amazon.co.jp/dp/4894710293/
46デフォルトの名無しさん:2009/01/06(火) 14:42:54
>何が含まれているか、確認しろ。あと、MS製品だから。
MS製品であることに何か問題でも?

>C言語の質問スレでは明らかに製品そのものの質問はスレ違い。
同意。

>C言語に関わる質問を受け付けるスレだぞ。C++だってスレ違いなんだし。
同意。

但し、bccもgccもC++コンパイラでもあるのは周知の事実なので、VCだけを除外する理由はない。
47897:2009/01/06(火) 14:55:29
>>40 教えてください。このスレではスレ違いみたいなので他のスレッドで教えてください。
48673:2009/01/06(火) 15:03:17
キャストのことなんですが
2次元配列のアドレスを代入する場合なんですが
何故、p=(int *)xxx;なんですか?
一次元配列の場合 p=x;だけですむんですが
何故キャストするんでしょうか?
何故int *なんでしょうか?
49デフォルトの名無しさん:2009/01/06(火) 15:03:49
アンチMSが多いね。
何のためのVisualなのかとか、コマンドプロンプトでVCが使えないと
思っているのかな?

>>47
http://www.setsunan.ac.jp/~center/kyositu/vs2008ex/vs2008ex.html
50デフォルトの名無しさん:2009/01/06(火) 15:15:41
アンチMSというか、まあ、初学者にVSを薦めると、VS由来の疑問だらけになることがよくあるね。
プロジェクトってなに、とかCLRって、とか実行したらすぐ消えたとか。

そういう意味でcl.exeを直接使用する方法を教えるのは悪くないとおもうよ。
51デフォルトの名無しさん:2009/01/06(火) 15:21:20
なんかIPA臭くね?
52デフォルトの名無しさん:2009/01/06(火) 15:27:18
Visual C++ であって、Visual C はVSには無いはずだが?
すれ違いも甚だしい。他所でやってくれ。
53デフォルトの名無しさん:2009/01/06(火) 15:29:47
少なくとも前スレでVSを勧めたヤツは責任取れよw
54デフォルトの名無しさん:2009/01/06(火) 15:32:29
>>52
>46

>>48
前スレのおさらいからやり直してくれ。
55デフォルトの名無しさん:2009/01/06(火) 15:41:12
>>48
pがint *だからに決まっている
二次元配列へのポインタの型は(type *)[size]
56デフォルトの名無しさん:2009/01/06(火) 15:49:41
type (*)[size]だろ
57デフォルトの名無しさん:2009/01/06(火) 15:58:42
Visual C++はCコンパイラーも含んでいるよ
58デフォルトの名無しさん:2009/01/06(火) 16:05:02
>>48
Cにおいてポインタとは、単なるメモリ上のアドレスを意味する言葉ではない。
それは( void * を除けば)オブジェクトを指し示すものであって、
その指し示すオブジェクトの場所(アドレス)に加えて
「そのオブジェクトの型」というものをポインタの型によって保持している。
char * は char を指し示し、int * は int を指し示す。
int ** は int * を指すポインタで、char (*)[10] は char 10 個からなる配列へのポインタである。
Cはこれらのポインタを(主にポインタ演算の都合上)明確に区別する。
特別なポインタである void * とやりとりするときと、ヌルポインタ定数を扱うときを除き、
ポインタの型を変える場合には(「これはプログラマが意図的に変えたんですよ」ということを
コンパイラに伝えるために)明示的に適切なキャストをつけないと、
多くのコンパイラは不適切な代入が行われた可能性があるとして警告を発する。

コンパイラに警告を発されるということは、君が自分のやろうとしていることを
正しく理解していない可能性が高い。配列の配列やポインタの型変換に手を出す前に、
ただの配列とポインタ演算についてしっかりと学習しておくこと。
59デフォルトの名無しさん:2009/01/06(火) 16:47:33
ポインタとは型付けされたアドレスであると言えば説明の記述量は半分くらいになる気が
60デフォルトの名無しさん:2009/01/06(火) 16:55:48
なぜ型付けされているか?
ポインタの演算(インクリメント等)が 型の大きさ単位で評価するから
(その型が中身だったとしたら x個目にあたるね って意味合いになる)

char *p = 0;
int *q = 0;
p+1 で指し示すアドレス と q+1 で指し示すアドレスは sizeod(char) と sizeof(int) の差だけ違う
61デフォルトの名無しさん:2009/01/06(火) 16:55:50
>ポインタとは型付けされたアドレスであると言えば説明の記述量は半分くらいになる気が
いいえ、ポインタは型付けされたアドレスではありません。
62デフォルトの名無しさん:2009/01/06(火) 16:59:06
否定だけしても何の説明にもならんよ
では一体何であるのかを主張しなければ
63デフォルトの名無しさん:2009/01/06(火) 16:59:26
「アドレスのようなもの」でいーんじゃね?
「入門篇」で深く説明しても解らんだろ。
64デフォルトの名無しさん:2009/01/06(火) 18:18:14
その、ポインタはアドレスではない、って話を深く聞きたいんですけど、説明して
頂けませんか?別のスレが良いのなら行きますので、よろしくお願いします。
というのも、free() で配列のポインタを渡して、なぜ全部開放されるのか、が
よく分からないんです。
65デフォルトの名無しさん:2009/01/06(火) 18:20:31
>>64
それはmallocの実装の話で、ポインタの型は関係ない
66897:2009/01/06(火) 18:32:11
>>49 USBドライブ(F:)に保存したいので、f: と入力し、エンターを押します。
これをやってみたのですが指定されたドライブが見つかりません。となってしまいます。どうすればいいでしょうか?
67デフォルトの名無しさん:2009/01/06(火) 18:32:51
printfのfってどういう意味?
68デフォルトの名無しさん:2009/01/06(火) 18:35:34
フォーマットだろ なぜか最後の単語は1語に省略するんだ
69デフォルトの名無しさん:2009/01/06(火) 18:36:02
>>66
USBドライブがないのだろ。プログラミング以前のPCの使い方なら初心者板に移動してくれ。
そうでなくても、言語の質問でないならとっとと出て行け。
70デフォルトの名無しさん:2009/01/06(火) 18:36:59
フォーマットなのか創価サンクスずっと気になってたんだ
71デフォルトの名無しさん:2009/01/06(火) 18:44:08
ポインタはアドレスを保持するもの
7264:2009/01/06(火) 18:45:04
ええ、ポインタの型とは別の話なのは分かりますが・・・
ポインタって結局なんなのか、よく分からないんですよ。
被参照型を参照するための値をもつオブジェクトとありますよね。なら、
配列のポインタは、実体の先頭しか指していないはず。なのに free に渡すと、
配列全体が開放される…javaみたいに自分の長さを持つ配列なら分かるんですが。
配列の途中のポインタをfreeに渡しても怒られるだけだし…
73デフォルトの名無しさん:2009/01/06(火) 18:51:13
mallocしたときに領域の大きさを記憶してる
freeするときはそれを参照して解放する範囲を知る
74デフォルトの名無しさん:2009/01/06(火) 18:51:35
>>72
そりゃ長さをこっそり持たせてるんだろ。
allocしたときにサイズより大きく取って、先頭に情報入れて
入れた情報の次のアドレス返すとかできるべ。
75デフォルトの名無しさん:2009/01/06(火) 19:08:22
>>91
>>73みたいにまず教科書読んで過去問といてみたら。
この段階で分からないようなら、今から勉強しても絶対間に合わないと思う。
7675:2009/01/06(火) 19:08:53
ごめん誤爆
7764:2009/01/06(火) 19:09:47
>>73, 74
何らかの形で領域サイズを持っているはずなのは分かります。
でもfreeは先頭しかうけつけないのは…あぁそうか、開始&終了があるかどうか
だけで良いのか。領域サイズだとlonglong以下に制限されますもんね。
ありがとうございます、freeについては分かった気がします。

あともう一つ、ポインタの値は何ですか?
アドレスでないならハッシュ値みたいなもの?
78デフォルトの名無しさん:2009/01/06(火) 19:14:49
>>77
とりあえずdlmallocのソースでも眺めとけ
79デフォルトの名無しさん:2009/01/06(火) 19:15:34
ポインタに格納されてる値はアドレス

だからといってポインタ=アドレスってわけじゃないからね。
80デフォルトの名無しさん:2009/01/06(火) 19:17:20
WIN32のcURLでIPv6って使えます?
81デフォルトの名無しさん:2009/01/06(火) 19:17:41
ポインタの値はたまたまアドレスを持たせるような実装が多い。
ただし、アドレスとは限らない。
また、アドレスの場合もどうせ仮想化されているので物理アドレスそのものではない。
82デフォルトの名無しさん:2009/01/06(火) 19:17:54
コップに格納されてる液体は水

だからといってコップ=水ってわけじゃないからね。
83デフォルトの名無しさん:2009/01/06(火) 19:18:48
>>68
というより昔の処理系にあわせて
6文字以内に押し込んでる
84デフォルトの名無しさん:2009/01/06(火) 19:20:18
たしかこれはgccの話だったと思うけど
実装上はmallocからもらうアドレスの手前に次の割り当てた領域の先頭アドレスが入ってて
全体としてリストだかヒープだかを作ってるんじゃなかったっけ
んでfreeはそのアドレスを順繰りに辿っていって記録されたアドレスを更新することで割り当てられた領域を解放する
だからアドレスが記録されている場所を書き換えるとリンクが壊れるのでセキュリティホールになってるとかどーとか
85デフォルトの名無しさん:2009/01/06(火) 19:25:49
>>84
生半可な知識をひけらかす必要はありませんよ。
初心者には難しい話ですし、中級者以上には当たり前の話なんですから。
86デフォルトの名無しさん:2009/01/06(火) 19:27:31
こんな事聞いちゃうくらい低レベルで恥ずかしいんですけど、gccとかbccとかいろいろあるけどどう違うのかがわからん
87デフォルトの名無しさん:2009/01/06(火) 19:30:54
最新機能を使いたいならVCC
特定のコンピュータでは、それしか使え無いような物もある
基本は一緒
88デフォルトの名無しさん:2009/01/06(火) 19:31:27
>>85
正直すまんかった
これからは自重する
89デフォルトの名無しさん:2009/01/06(火) 19:32:48
なるほど。さんくす
90デフォルトの名無しさん:2009/01/06(火) 19:33:54
>>87
このスレ的には最新といったらC99をさすべきだろうwwwwww
だからVCCは古い
9164:2009/01/06(火) 19:34:39
>>78-85
皆さんありがとうございます。
malloc, freeについては >>78さんの言葉に従って解説を探し良さげなのを
見つけました。これから読んでみます。
ttp://www.ibm.com/developerworks/jp/linux/library/l-memory/

ポインタの値については、実際の物理アドレスか仮想アドレスを示しうる値、と
いう理解で良いという事ですかね?
92デフォルトの名無しさん:2009/01/06(火) 19:36:34
ブーストの対応の多さと、MSの技術を使う為にはVCCだろう。
ブーストの対応表見ると、gccやbccなどは今市だぞ。
93897:2009/01/06(火) 19:36:56
>>69すいません。USBメモリの件は解決しました。notepad test.cってやってもバッチファイルとして認識されないと出るのですがこれは環境変数の
Pathを変える必要があると思うのですがどうしたらいいでしょうか?スレ違いなのでこれで最後にします。
94デフォルトの名無しさん:2009/01/06(火) 19:42:37
>>92
スレタイ読め
95デフォルトの名無しさん:2009/01/06(火) 19:43:11
>>93
とっとと失せろ
96デフォルトの名無しさん:2009/01/06(火) 19:43:41
どーせC89なんだからどれでもいーだろう
97デフォルトの名無しさん:2009/01/06(火) 19:45:05
最後にしなくて良いよ。 




#include <stdio.h>
int main() {
printf("test prog");
}

をメモ帳にコピーして、test.cppで保存して

cl test.cpp > log.txt

をメモ帳にコピーして、complile.batで保存してクリックしてみて。
98897:2009/01/06(火) 20:04:49
>>97 一瞬だけコマンドプロンプトが出てきてすぐに消えてしまいます。
99デフォルトの名無しさん:2009/01/06(火) 20:08:20
前スレ嫁
100デフォルトの名無しさん:2009/01/06(火) 20:10:39
>>98
log.txt開く戸なんて書いてある?
101デフォルトの名無しさん:2009/01/06(火) 20:12:10
>>86
製作者が違う。
トヨタもホンダも自動車を作っているが、だからといってトヨタの車とホンダの車が同じわけがない。
102デフォルトの名無しさん:2009/01/06(火) 20:18:26
>>98
>>97の方法は今後の事を考えるとめんどくさいから忘れた方がいい。

PATHを変えなきゃいけないんだろうってわかるなら、PATHを変更したら良いじゃないか。
その方法は、ググればすぐに分かることだよ。

notepad test.cがうまくいかないなら
とりあえず、メモ帳立ち上げればいいだけ。

あと、最初はメモ帳でも良いけど使いやすいエディタ探した方が良いよ。
103デフォルトの名無しさん:2009/01/06(火) 21:28:25
>>98
空気嫁。
いい加減に2ch以外の掲示板で質問すればいいじゃん。
親切に教えてくれるぞ。

それと、さっさと消えてくれ。
104897:2009/01/06(火) 21:34:28
>>103 すいません。消えます。なんとかなりました。スレ違いにもかかわらず親切に教えてくださりありがとうございました。
105デフォルトの名無しさん:2009/01/06(火) 21:34:30
知恵袋のほうが煽り100%で情報0%のボケアホカスをスポイルする仕組みは整っているな
106デフォルトの名無しさん:2009/01/06(火) 21:43:19
for文について質問です。
for文の後に{}をつけたときとそうでないときは、動作に何か違いが出るのでしょうか。

行列の積を求めるプログラムを作っているときに、{}をつけた場合はエラーがでて、
つけなかったら正常に動いたので、その詳しい理由が知りたく、質問させていただきました。
107デフォルトの名無しさん:2009/01/06(火) 21:46:09
変化無し 
ただし、forは一文( 今は{・・・}も一文と見なす )しか効果がない。
108デフォルトの名無しさん:2009/01/06(火) 21:47:36
forの繰り返しの対象は直後の1文だけ。
複数の文を繰り返したいときに中括弧で囲む。
中括弧で囲むと、それ全体が1つの文という扱いになるため。
109デフォルトの名無しさん:2009/01/06(火) 21:50:22
>>106
ソースコードを見ないでピンポイントで回答できる人間がいると思う?
それと、エラーって言っているけどコンパイルエラーなの?
実行時のエラーなの?
それによっても回答が変わってくるよ。

# あくまで予想だけど、{}をつける前と後で処理が変わってしまっているに一票。
110デフォルトの名無しさん:2009/01/06(火) 22:17:21
つーか、このスレで.cppなんて書いている馬鹿って何考えて生きているんだろうね。
他にも、VCをvccなんて書いている間抜けも初めて見たよ。
111デフォルトの名無しさん:2009/01/06(火) 22:20:09
gcc bcc vcc で統一感出る 
vc++だが++は一つ加えるんだから vcc
112デフォルトの名無しさん:2009/01/06(火) 22:21:15
済みません orz ソースは↓です。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8541.txt

例えば行列A,Bの成分を全て1にすると
かけ算の結果
4131623 41331092
53670026 151311212
281426513107241244276
131107212449242090133764131188
と、表示されます。
113デフォルトの名無しさん:2009/01/06(火) 22:21:39
さすが間抜け。
114デフォルトの名無しさん:2009/01/06(火) 22:26:37
>>112
なんで自分に原因があると思わないのかな?
prod()のループ制御変数をよく見て味噌。
それで判らなかったら馬鹿だ。
115デフォルトの名無しさん:2009/01/06(火) 22:26:47
このスレでCPPといったら普通はCプリプロセッサのこと
116デフォルトの名無しさん:2009/01/06(火) 22:27:57
C言語とか全然わからないけどこのスレは好きだって奴、おれの他にもいる?
117デフォルトの名無しさん:2009/01/06(火) 22:28:52
>>114
あー!初めてループ制御変数という言葉を知りました orz
解決しました。ありがとうございます。
118デフォルトの名無しさん:2009/01/06(火) 22:29:05
>>115
プリプロセッサってかなり「」いい
119デフォルトの名無しさん:2009/01/06(火) 23:42:44
C言語でシュミレーションRPGって作れるんですか?
120デフォルトの名無しさん:2009/01/07(水) 00:00:36
次にお前はシュミレーションRPGってなんですか?と言う
121デフォルトの名無しさん:2009/01/07(水) 00:02:25
言いません
122デフォルトの名無しさん:2009/01/07(水) 00:08:26
1次元の構造体配列struct tfield seq[5]がありメンバで
struct tfield *gsがあるとすると
seq[2].gs =&seq[3]でつなげると思うんだけど。
2次元配列だと無理なのですか?
struct tfield seq[5][3]があり
seq[2][2]とseq[3][2]をつなぎたい場合はどうすべきなのですか?
123デフォルトの名無しさん:2009/01/07(水) 00:10:30
なんで無理だと思ったの?
124デフォルトの名無しさん:2009/01/07(水) 00:12:45
場合わけして、つなぎたい場合はつなぐようにかいて
つながない場合はNULLをいれてたんですけど。
処理をしてたらつながってなくて。

あとで調べてみたらNULLがはいってて。
NULLがはいってたから。
125デフォルトの名無しさん:2009/01/07(水) 00:13:14
ソースを貼れ

切り貼りせずに全部だ
126デフォルトの名無しさん:2009/01/07(水) 00:13:46
>>124
場合分けの条件式が間違ってるんだろう
127デフォルトの名無しさん:2009/01/07(水) 00:48:32
場合分けの条件式が間違ってました
128デフォルトの名無しさん:2009/01/07(水) 04:27:50
大学の課題で悩んでいます
その問題というのが

『ジョーカーを除くトランプ52枚(1~13×4種)からランダムに5枚を抜き出した時、
 ・ワンペア(同じ数字が2枚)
 ・ツーペア(同じ数字が2枚のものが2組)
 ・スリーカード(同じ数字が3枚)
 ・ストレート(5枚連続した数値、[10,11,12,13,1]や[1,2,3,4,5]はOKだが[12,13,1,2,3]など1をまたぐケースはNG)
 ・フラッシュ(5枚とも同種)
 ・フルハウス(ワンペアとスリーカードの組み合わせ)
 ・フォーカード(同じ数字が4枚)
 ・ストレートフラッシュ(ストレートとフラッシュの組み合わせ)
それぞれの役が発生する確率(実際には試行した回数)を
モンテカルロ法により求めるプログラムを作成する。
ただし、上位(記載が下にあるもの)の役と下位の役を同時に満たす場合は
上位の役を優先する。
因数にポインタを含む関数を適当に作成し、利用すること。
メイン関数直下での処理はできるだけ避けることが望ましい
入力についてはキーボードから試行回数(+改行)のみ入力する。
最大でもint型に収まる数値とする

という課題なのですが、
まずやってるのが
1、トランプ5枚をランダムに発生する関数を作成
2、トランプ5枚へのポインタを引数とし、多項式時間内に役を判断し、焼くおw返す関数を作成。役の判断は上位の役から行い、成立すればブレイクする
3、1〜2を数百回試行し、結果から各役の発生確率を計算する処理を行う

という順番でやっていたのですが、正直、2の段階で混乱してしまいます
どうか教えてください
129デフォルトの名無しさん:2009/01/07(水) 04:39:28
>>128
結局2の段階で役の判断をさせたいだけであれば、役の条件を考えれば
いいだけじゃないの?
C言語以前の問題だからスレ違いだろ。
130デフォルトの名無しさん:2009/01/07(水) 05:06:49
骨格のイメージはこんな感じか

enum Yaku {
  ONE_PAIR,
  TWO_PAIR,

  ・・・

  NO_PAIR
};

enum Yaku find_yaku(const int trump[]) {
  if (ワンペアか?)
    return ONE_PAIR;
  else if (ツーペアか?)
    return TWO_PAIR;

  ・・・

  else if (ストレートフラッシュか?)
    return STRAIGHT_FLUSH;
  else
    return NO_PAIR;
}
131デフォルトの名無しさん:2009/01/07(水) 05:38:03
アンチMSとか言っているバカは何?VSがVC++以外のものも含んでいて
このスレで使うべきとか聞かれても、目的次第としか言えないだろ。
ただ、あれはCのソースのみでも基本的な使い方を覚えるのに
果たしてプログラミングの入門として適切か?あるいは、使おうとすると
逐一事細かにまた質問してくるだろうから、最終的には無償で使えるんだから
自分で使って事情を知るべきだろ。必要も無いのに余計なものを入れて、
結局それは何なの?使わなければならないのか?って話にまで持ち込まれて
てめぇの人生はどうしたら良いか?必要もないのに自動車の免許は必要か?
とか言われても、他人は迷惑だろ。必要だと思うなら所持しておけ、
ただし、それを取得、扱えるようになるまで、限りあるてめぇの人生の時間を
使ってしまうという当たり前のことも理解しておけと。あれもこれも出来る人間なんて
この世にはいない。明日死ぬかもしれない人生だぞ。
132デフォルトの名無しさん:2009/01/07(水) 05:41:42
>>110
.cppと拡張子を付けているのに、何言ってんだお前?バカで低脳な基地外池沼はお前だぞ。
>>113
何しにこのスレに来てるの?その程度の低いレスしかしていないお前が低脳間抜け。
>>115
>>110は.cppと書かれているが?ちゃんと拡張子と区別しましょうね、知ったか初心者さん。

このスレには、最近知ったばかりの似非プログラマが多すぎ。
お前らプログラミングの真髄を理解せずにこの世を去るだろうね。
133デフォルトの名無しさん:2009/01/07(水) 05:46:35
あー、Linuxのglibcで量子圧縮のヒトかー
134デフォルトの名無しさん:2009/01/07(水) 05:55:09
まぁ、お前らしょぼい奴らは、一度HTMLやCSS、ダイナミックHTMLでも扱ってみろ。
考え方が変わるから。貴様らがやっているのは何なのか?
いいなれば、自動車があったとしよう。そのエンジンやその他、動作する仕組みを
作っているようなもの。より効率の良いものを作らないと、燃費が悪い、操作性が悪い
事故が起き易くなるといった原因になる。そして、それを運転、使用するのがドライバー。
貴様らはもちっと、色々な場所を運転して知ることがあるだろう。
色々なプログラム、処理体系を知る、扱うことによって。
貴様らが知っているアルゴリズムなんざ、もう何世紀も前に発見されて
周知のものばかりなんだぞ?その程度のことを知ったくらいで、偉そうにしてんなや。
あとな、それらを発見、世に広めた人だって、一度しかない人生をそういうものに
捧げてきたわけだ。ありがたく使えよ。
135デフォルトの名無しさん:2009/01/07(水) 05:55:54
>>132
では聞くが、拡張子cppとは一体なんなのだ。
136デフォルトの名無しさん:2009/01/07(水) 05:56:55
>貴様らが知っているアルゴリズムなんざ、もう何世紀も前に発見されて
この辺、具体的に頼む。
137デフォルトの名無しさん:2009/01/07(水) 06:15:34
>>128
Cというよりアルゴリズムな気がするが。
 
 ・マークと数字をメンバに持つカード構造体を定義する。
 ・カードが5つの配列で手札変数を作る。
 ・手札を点数で評価する

 で、アルゴリズムは、
 1.乱数使って手札作成
 2.数字→マークで手札をソートする。
 3.まずフラッシュが出来ているか調べ、出来ていたら9点追加。
 4.数字を調べる。
  ワンペア 3点 スリーカード 7点 ストレート 8点 フォーカード 11点
  として、出来ていたセットの点数を合計する。
  すると、
  ワンペア 3
  ツーペア   6
  スリーカード 7
  ストレート 8
  フラッシュ  9
  フルハウス 10
  フォーカード 11
  ストレートフラッシュ 17
  になるので、この数字分布を記録すればいい。

  ポインタがどうのこうのいう要件はは手札が配列なのでこれを
 サブルーチンに渡せばOK。
  2,3,4は順番変えたり重複する処理をまとめたりは出来るを思われる。
138デフォルトの名無しさん:2009/01/07(水) 06:22:08
話がおかしくなっている。VSはVC++以外も含まれているんだが?
誰がVC++のみの話をしているんだ?VC++でもC言語は扱えるが、
VSは包括的なものだろ。だから専用スレに行けって言われるんだよ。
139デフォルトの名無しさん:2009/01/07(水) 07:20:15
int constとconst intって一緒だっけ?
140デフォルトの名無しさん:2009/01/07(水) 07:22:45
一緒
141デフォルトの名無しさん:2009/01/07(水) 07:23:57
さんく〜
142デフォルトの名無しさん:2009/01/07(水) 07:47:09
必要かどうかもわからないなら、ひとまず不要だということだ。
必要なものは、今すぐ必要だろ。C言語の入門ごときが、
いきなりインターフェースバリバリ、オブジェクト指向とか向いてないから。
143デフォルトの名無しさん:2009/01/07(水) 07:52:26
GNUの寛容なライセンスに付け込んでC++をぱくったんだろ。
VC++はただのパクリコンパイラだよ。
C++と言えば普通はgcc使う。
144デフォルトの名無しさん:2009/01/07(水) 08:05:51
釣りだか天然だかわからんやつだな
どっちにしてもアホだが
145デフォルトの名無しさん:2009/01/07(水) 08:17:42
VC++はコンパイラにエディタをつけただけで激重。
しかも標準規格に適合していない。
エラーでまくりで使い物にならない。
146デフォルトの名無しさん:2009/01/07(水) 08:24:19
>しかも標準規格に適合していない。
>エラーでまくりで使い物にならない。
この辺り、詳しく。
147デフォルトの名無しさん:2009/01/07(水) 08:24:48
>>132
C言語のスレでC++の拡張子はスレ違いといいたいだけだよ
148デフォルトの名無しさん:2009/01/07(水) 08:37:03
>>146
GNUに従ってないだろ。
しかもGNUのほぼすべてをコンパイルできないというお粗末さ。
ほとんど犯罪。
149デフォルトの名無しさん:2009/01/07(水) 08:39:48
だいたいM$なんてプログラマの敵だろ。
作ってしまったものは仕方ないとしてもこれから作るものはLinux用に
作るべきなんだって。
150デフォルトの名無しさん:2009/01/07(水) 09:03:37
なんでキチガイが涌いてんだ?
151デフォルトの名無しさん:2009/01/07(水) 09:24:35
TRONプロジェクトがアメリカに潰されたからもう日本にソフトウェア産業はアメリカの会社を儲けさせるぐらいしかやることがないんだよ
152sage:2009/01/07(水) 09:28:02
以下の解説のサンプルコードで何故
#ifndef HELLO_H__
#define HELLO_H__
が必要なのか知ってる?
http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_02.html
153デフォルトの名無しさん:2009/01/07(水) 09:33:10
インクルードガード
でも_使い方が・・・・
154sage:2009/01/07(水) 10:10:18
>>153
サンクス
155sage:2009/01/07(水) 10:42:40
hellolib.hのvoid Execute()のstaticとスタティック・ライブラリ化と何か関係あるのかな?
http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_02.html
156デフォルトの名無しさん:2009/01/07(水) 13:53:56
もう嫌だよー
157デフォルトの名無しさん:2009/01/07(水) 14:19:25
#include <stdio.h>

void main()
{
double d = -6880156672.023001;

float f = (float)d;

printf("f = %f\n", f);
printf("d = %f\n", d);
}

結果
f = -6880156672.023001
d = -6880156672.023001

何でですか?floatって7桁じゃないの?
158デフォルトの名無しさん:2009/01/07(水) 14:23:59
7桁なのは精度
表示される桁数じゃないよ
159ちょっと変えてみた。:2009/01/07(水) 14:49:40
#include <stdio.h>

void main()
{
double d = -6880155555.023001;

float f = -6880155555.023001;

printf("f = %f\n", f);
printf("d = %f\n", d);
}

結果
f = -6880155648.000000
d = -6880155555.023001

つまり、floatの有効桁数ってのは、7桁までしか保証しません、
って事なのかな?
160デフォルトの名無しさん:2009/01/07(水) 14:58:03
>>157
最適化されたから。
VC6なら/Opを付けてコンパイル。
161デフォルトの名無しさん:2009/01/07(水) 15:54:26
3つのファイルを使うプログラムを作りたいんだけど、どっちのほうが処理時間とか考えたら効率いいかな?

方法1
while(){
fp=fopen(…
fp2=fopen(…
fp3=fopen(…

処理1
処理2
処理3

fclose(fp);
fclose(fp2);
fclose(fp3);
}

方法2
while(){
fp=fopen(…
処理1
fclose(fp);

fp=fopen(…
処理2
fclose(fp);

fp=fopen(…
処理3
fclose(fp);
}
162デフォルトの名無しさん:2009/01/07(水) 16:04:51
>>161
そんな程度の情報しか出せない奴ならどう作っても効率悪い
163デフォルトの名無しさん:2009/01/07(水) 16:48:30
fp=fopen(…
fp2=fopen(…
fp3=fopen(…

while(){
処理1
処理2
処理3
}

fclose(fp3);
fclose(fp2);
fclose(fp);
164デフォルトの名無しさん:2009/01/07(水) 17:17:29
現在C(とDXライブラリ)でRPGを作っていますが、
複数あるキャラ画像の画像タイトルとファイル名をテキストファイルに、
キャラA:chara_a.bmp
キャラB:chara_b.bmp
・・・・
として保存し、Cで読み込んで画像をロードしたいと思っていますが、
やり方がさっぱりわかりません。(画像のロードはわかります)
ぜひご教授お願いします。
165デフォルトの名無しさん:2009/01/07(水) 17:20:43
何がわからんの?
テキストファイルを読んでファイル名を抽出して画像読み込み関数に渡す方法?
166デフォルトの名無しさん:2009/01/07(水) 17:22:25
>>165
そのとおりです。
167デフォルトの名無しさん:2009/01/07(水) 17:23:24
画像のロードは分かりますが、やり方がわかりません?
168デフォルトの名無しさん:2009/01/07(水) 17:26:05
>>167
すみません、自分の説明不足でした。
画像のロードのやり方はわかりますが、
テキストファイルを読み込み⇒画像ロード関数に渡すまでの具体的な操作がわからないのです。
169デフォルトの名無しさん:2009/01/07(水) 17:29:30
そこ読むまでサイズがわからないとか、いつでも使えるように保持とか
いろんな条件を追加するとかなり長くなるので、
単純な形にして少しずつ進めるのがいいと思うけどな。

まずはテキストファイルを1行読んで、コロンで分割してファイル名だけを取り出すとこからか?
170デフォルトの名無しさん:2009/01/07(水) 17:34:56
>>169
なんとなく形が見えてきました。ありがとうございます。
挑戦してみます。
171デフォルトの名無しさん:2009/01/07(水) 17:39:01
ノシsprintf
172デフォルトの名無しさん:2009/01/07(水) 18:09:22
問題が発生しました。
int White, strY;
White = GetColor( 255, 255, 255 );
char ftitle[64], fname[64];
FILE *fp;
if( (fp = fopen("data/picture.txt", "r")) == NULL ) exit(EXIT_FAILURE);
while( fscanf(fp, ":", ftitle, fname) != EOF)
{
strcpy( ftitle, fname );
DrawString( 0, strY, ftitle, White );
strY += 30;
}
fclose(fp);
というコードを実行したのですが、ハンドルされていない例外が発生し実行できません。
いったい何が悪いのでしょうか?
173デフォルトの名無しさん:2009/01/07(水) 18:19:19
>いったい何が悪いのでしょうか?
あんたの頭。
174デフォルトの名無しさん:2009/01/07(水) 18:20:00
fscanf()のフォーマット文字列がむちゃくちゃだがね。
175デフォルトの名無しさん:2009/01/07(水) 18:22:20
fscanf(fp, ":", ftitle, fname)は、fscanf(fp, "%[^:]:%s", ftitle, fname)
とかやればいいが、fgetsで1行読んでsscanfのがいいかも。
ファイル名は改行あったら消したりしなくちゃならんしな。
176デフォルトの名無しさん:2009/01/07(水) 18:23:15
2進数を10進数に変換するプログラムを考えています。
#define MAX の値を変更しても、10桁以上の計算が出来ないのですが、どのように修正したら良いでしょうか?
intからdoubleに変えてみたのですが、浮動小数点の不正な使用となります。
また、0と1以外の数字が入力された際にエラーを出したいのですが、この判定はどうしたらよいでしょうか?
アドバイスお願いします。

#include <stdio.h>
#define MAX 10
main()
{
int x, z[MAX], i, c;
int a=1;
int b=1;

scanf("%d",&x);

for(i = 0;i<=MAX-1;i++){
z[i]=((x/a)%10)*b;

a*=10;
b*=2;

}

for(i=0;i<=MAX-1;i++){
c += z[i];

}
printf("%d\n",c);
return 0;
}
177デフォルトの名無しさん:2009/01/07(水) 18:35:38
>>176
整数型は高々10桁程度しか表せないよ。
2進数を無理矢理10進の形で入力させないで文字列として入力させる方がいい。
エラーの検出も文字の方が扱い易いだろうし。
勉強でないなら、strtol()で変換した上にエラーの検出もできるけどね。
178デフォルトの名無しさん:2009/01/07(水) 18:40:34
>>176
実数の割り算で余りを求めるのは意味がないからじゃないかな。
>>177の言う通り文字列使うのが近道だと思う。
179デフォルトの名無しさん:2009/01/07(水) 19:15:36
2つの画像ファイル名、gazou001.cif,gazou002.cifをつけようとして、
int makeFileName(char *filename, char *basename, int num, char *magic)
{
sprintf(filename, "%s00%d%s", basename, num, magic);
return 0;
}
void main{
char *filename1;
char *filename2;
char *basename="gazou";
char *magic=".cif";
int num=1;
int numnext=2;

makeFileName(filename1,basename,num,magic);
makeFileName(filename2,basename,nextnum,magic);
return 0;
}
としたのですが、セグメントエラーとなり上手くいきません。
どうすればいいでしょうか?
180デフォルトの名無しさん:2009/01/07(水) 19:17:44
filename1,filename2の領域を確保する
181デフォルトの名無しさん:2009/01/07(水) 19:49:19
%03dの方がよさそうな気配。
182デフォルトの名無しさん:2009/01/07(水) 21:57:15
>>177-178
とりあえずchar型として入力する部分だけ考えてみたのですが、上手く動いてくれません。
何を入力しても、白紙で出力されます。
今回の改善ポイントをお願いします

#include <stdio.h>
main()
{
char c, s[100];
int i;
for(i = 0; i < 100; i++){
scanf("%c", &c);
if ( c == '\n'){
s[i] = '\0';
break;
}
else if(c==0 || c==1){
s[i] = c;
}
else
s[i] = '\0';
break;
}
printf("数列は「%s」\n", s);

return 0;
}
183デフォルトの名無しさん:2009/01/07(水) 22:08:49
else if の所の処理が走っているかprintfデバッグしてみたら
184デフォルトの名無しさん:2009/01/07(水) 22:14:03
else if(c=='0' || c=='1'){
s[i]=c-'0';
}
185デフォルトの名無しさん:2009/01/07(水) 22:15:20
つうか一回目で必ずbreakが実行されるじゃないか。。
186デフォルトの名無しさん:2009/01/07(水) 22:16:23
>>183
>printfデバッグしてみたら

kwsk
187デフォルトの名無しさん:2009/01/07(水) 22:18:54
else if(c=='0' || c=='1'){
s[i]=c-'0';
}
else
{//追加?
s[i] = '\0';
break;
}//追加?

こう?
188デフォルトの名無しさん:2009/01/07(水) 22:28:52
>>184,187

s[i]=c-'0';
とすると上手く行かないようです。
s[i]=c;でうまくいきました。
189176:2009/01/07(水) 23:00:43
>>182で作った0と1の判定が問題なく動いたようだったので、2進数変換と組み合わせてみました。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8560.txt


色々と手を加えてみたのですが、どこで間違っているのかがわかりません。
質問ばかりで申し訳ないのですが、教えていただけませんか?
190デフォルトの名無しさん:2009/01/07(水) 23:02:37
linux で、パイプをつかってあるプロセスの標準出力を
ファイルへのリダイレクトと別のプロセスへの標準入力両方につなげたいんですが
どうしたらいいんでしょうか
pipe とか dup って一対一でつなぐ方法しか見つからなくて・・・
191デフォルトの名無しさん:2009/01/07(水) 23:05:50
z[i]=(s[i]-'0')*b;
でも、99も回したら、intの上限が…
192デフォルトの名無しさん:2009/01/07(水) 23:11:50
>>190
teeでもつかったら?
193176:2009/01/07(水) 23:13:04
>>191
変更して実行してみたのですが・・・・

C:\c>test
10010
数列は'10010'
-108

C:\c>test
01
数列は'01'
56

C:\c>test
1
数列は'1'
^C


1を入力すると無限ループになるのか結果が出てきません。
194デフォルトの名無しさん:2009/01/07(水) 23:15:16
>>193
他にもいろいろ間違ってるけど、とりあえず
- for(i=count-1;i<=0;i--){
+ for(i=count-1;i>=0;i--){
で一応動くかな
195デフォルトの名無しさん:2009/01/07(水) 23:21:02
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
196176:2009/01/07(水) 23:29:10
指摘された箇所と、私が気づいた間違えている部分を修正してみたのですが、まったく動いてくれません。

同じ数字を何度か入力すると、毎回出力結果が違います・・・・

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8561.txt


面倒だと思うのですが、上手く動くように改良していただけないでしょうか?
197デフォルトの名無しさん:2009/01/07(水) 23:31:04
char c,s[100],z[100] = {0};
これ試してみて
198デフォルトの名無しさん:2009/01/07(水) 23:33:55
と思ったらc=0も足りなかったなあ

c = 0;
for(i=0;i<count;i++){
c += z[i];
}
199デフォルトの名無しさん:2009/01/07(水) 23:37:39
結果入れてるcがcharなのが変?
200デフォルトの名無しさん:2009/01/07(水) 23:38:23
>>198
111111までは実際の10進数+10が出力
それ以上は負数が出力されてしまいます。
201デフォルトの名無しさん:2009/01/07(水) 23:39:16
なんて親切なんだ昔の2ちゃんねらーはこうじゃなかったはずだ
202デフォルトの名無しさん:2009/01/07(水) 23:44:28
それも時の流れ
203デフォルトの名無しさん:2009/01/07(水) 23:47:31
unsigned int z;

z=0;
for(i=count-1;i>=0;i--){
z*=2;
z+=(s[i]-'0');
}
printf("%d\n",z);
204デフォルトの名無しさん:2009/01/07(水) 23:51:58
>>192
ありがとうございます
これのソースを参考にしたらなんとかなりそうです
205197:2009/01/07(水) 23:53:54
>>200
cがcharなので8bit以上のは無理(というか負数になる)として
>>196-198までまとめたのをこちらで走らせたら7bitで127が出力された。
+10ってのが気になる。
206176:2009/01/08(木) 00:07:56
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8562.txt
これで7ビットまで正常に動作するようになりました。

7ビット以上も実行可能にするにはどうしたらいいでしょうか?
207デフォルトの名無しさん:2009/01/08(木) 00:10:26
zがcharだからだよ。もうちょいだね。
208デフォルトの名無しさん:2009/01/08(木) 00:11:20
>>206
たまには>>203のことも思い出して
209デフォルトの名無しさん:2009/01/08(木) 00:15:51
>>203
できました^^

最後まで付き合ってくださったみなさん、ありがとうございました!
210デフォルトの名無しさん:2009/01/08(木) 01:18:53
例えば、このプログラムでendと入力しない限りループし続けるようにするには、どう変更すれば良いでしょうか?
if文でxかyにendが入力されるとbreakすれば良いのだと思いますが、
printfからscanfに戻ってくるにはどうすればいいかわかりません。


#include <stdio.h>
main()
{
int x, y, ans;

scanf("%d %d", &x, &y);

ans = x + y;

printf("%d + %d = %d \n", x, y, ans);
return 0;
}
211デフォルトの名無しさん:2009/01/08(木) 01:25:49
以下のfunc_name()をname[]という配列を使って、
実行する方法を教えてください。

void func_name(void)
{
    printf("Hellow func\n");
}

int
main(int ac, char *av[])
{
    char name[] = "func_name";

    return 0;
}
212デフォルトの名無しさん:2009/01/08(木) 01:37:29
>>210
gets(buf)で文字列として入力させて、end文字列の判定、
endでなければ、
sscanf(buf,"%d %d", &x, &y);
とか?
ループはwhileかforを使う。
213デフォルトの名無しさん:2009/01/08(木) 01:41:34
>>211
配列というのがわからないけど、関数ポインタを使う。
void (*name)(void);
name=func_name;
(*name)();
かな?
214デフォルトの名無しさん:2009/01/08(木) 01:43:22
>>211
関数名の文字列から関数を直接呼び出すことは、C言語ではできない。
文字列が"func_name"と一致すれば呼び出すという条件分岐を書けばできる。
215デフォルトの名無しさん:2009/01/08(木) 01:55:08
216デフォルトの名無しさん:2009/01/08(木) 02:21:38
#include <stdio.h>

void func_name(void)
{
printf("hello func\n");
}

main()
{
void (*name[1])(void);
name[0] = func_name;
(*name)();

return 0;
}

~
217デフォルトの名無しさん:2009/01/08(木) 02:23:02
#include <stdio.h>

void func_name(void)
{
printf("hello func\n");
}

main()
{
void (*name[1])(void);
name[0] = func_name;
(*name[0])();

return 0;
}

2chの書き込みでタブを挿入するのってどうやるの
218デフォルトの名無しさん:2009/01/08(木) 02:35:20
char型はcharacter型の略だから"チャラ"でなく"キャラ"と読むべきだと主張するやつにはint型はinteger型の略だから"イント"でなく"インテ"と読むのかと問い詰めたい
219デフォルトの名無しさん:2009/01/08(木) 02:43:00
チャーでもキャラでも好きな方を呼べばいいと思うけど、チャラは初めて聞いた

なんかちょっと前に似たような話題があった気がするけどどこのスレだったかな
220デフォルトの名無しさん:2009/01/08(木) 02:43:54
大体あってればどっちでもいいだろ
221デフォルトの名無しさん:2009/01/08(木) 03:05:01
222デフォルトの名無しさん:2009/01/08(木) 03:15:37
>>217
できない、全角スペースを使え
 は使えたかな
223デフォルトの名無しさん:2009/01/08(木) 03:16:18
使えた<&nbsp;
224デフォルトの名無しさん:2009/01/08(木) 04:23:41
あるデータがあるとしてそれの分布を求めるにはどうすればいいですか?
225デフォルトの名無しさん:2009/01/08(木) 04:26:40
あるデータがあるとしてそれの分布を求めればいいよ
226デフォルトの名無しさん:2009/01/08(木) 04:28:30
「それの分布」とは?ヒストグラムのことかな?
227デフォルトの名無しさん:2009/01/08(木) 04:38:40
228デフォルトの名無しさん:2009/01/08(木) 05:20:40
2つ質問なんですが、

ポインタの場合、相手変数のアドレスを格納する為の
ポインタ変数のアドレスと、相手変数のアドレスの
2つのアドレスがありますよね?


もう一つは、
char *cstr = ゙abc゙; では、*cstr(ポインタ変数)ばabc゙のアドレスが
入っていると考えて、宜しいでしょうか?
229デフォルトの名無しさん:2009/01/08(木) 05:23:26
゙abc゙
"abc"
230デフォルトの名無しさん:2009/01/08(木) 05:34:26
http://www.codegear.com/jp/downloads/free/cppbuilder

このサイトからコンパイラ取れない
他に取れるところ知らない?
231デフォルトの名無しさん:2009/01/08(木) 05:34:49
3つ入力して各8桁まで入力したいのですが 
このプログラムでは3つの入力をあわせて8桁になってしまいます。
どこを改善すれば良いのでしょうか

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8565.txt
232デフォルトの名無しさん:2009/01/08(木) 05:48:48
>>231
・一つ入力する関数を作る。
・桁数カウント用変数を毎回0にする。
お好きな方を。
あーそうそう、インデントは正しく、ifなどは慣れないうちは必ず{}で括りましょう。
233デフォルトの名無しさん:2009/01/08(木) 05:49:57
>>228
ポインタ変数に相手変数と言う概念はありません。
*chrはポインタ変数ではありません。chrがポインタ変数です。
234デフォルトの名無しさん:2009/01/08(木) 06:03:18
>>323 ・桁数カウント用変数を毎回0にする。
これを利用したいのですが 詳しくお願いします。
235デフォルトの名無しさん:2009/01/08(木) 06:25:29
>>234
あんたはそれを一回しか0にしてないじゃないか。
それを毎回やるようにするだけだよ。
# そう言われて判らないなら諦めな。
236デフォルトの名無しさん:2009/01/08(木) 06:34:00
>>235 できました。
 改行のみでエラーにしていますが、そのプログラムでは上手くいきません。
 if(s[0] == '\0') でも上手くいけませんでした。 ご教授ねがいます
237デフォルトの名無しさん:2009/01/08(木) 07:43:56
改行文字をチェックしているのはどこ?
そこは適切?
238デフォルトの名無しさん:2009/01/08(木) 09:54:37
#を書いている奴は、いまいち信用ならねぇ。っつか意味も無くきめぇ。
239デフォルトの名無しさん:2009/01/08(木) 10:11:01
今時のコメントは//ですよね
# わかります
240デフォルトの名無しさん:2009/01/08(木) 14:17:10
>>228
前半が意味不明だが、意味不明だということはきっと君が間違えて覚えているのだろう
ポインタ変数はポインタの値を格納する変数で、
ポインタの値は何らかのオブジェクトか関数を指しているか、あるいは何も指していない(NULL)
ポインタ変数自体を指すポインタ値はこの件とはまったく関係ない
241デフォルトの名無しさん:2009/01/08(木) 14:55:53
while ((c = getchar()) != '\n') {
242デフォルトの名無しさん:2009/01/08(木) 15:14:32
EOF
243デフォルトの名無しさん:2009/01/08(木) 15:30:10
ナンバーサイン野郎は、EOFは読み込めないんだってさw
244デフォルトの名無しさん:2009/01/08(木) 15:51:10
>>241の続き
if (!isdigit(c) || (j == 0 && c == '\n') ) {
245デフォルトの名無しさん:2009/01/08(木) 16:27:21
yaccとlex使え。
246デフォルトの名無しさん:2009/01/08(木) 16:41:18
そんなの使うほうがこの場合効率悪そうな
247デフォルトの名無しさん:2009/01/08(木) 18:09:01
>>238
全角で書くな莫迦
248デフォルトの名無しさん:2009/01/08(木) 18:11:50
全角で書いている奴が信用ならないと言いたいのだろう。
249デフォルトの名無しさん:2009/01/08(木) 18:48:58
明日までにレポートを自動生成してくれるプログラムをCで書きたいんですがどうすればいいんですか?
250デフォルトの名無しさん:2009/01/08(木) 18:57:27
247 名前:デフォルトの名無しさん 投稿日:2009/01/08(木) 18:09:01
>>238
全角で書くな莫迦
251デフォルトの名無しさん:2009/01/08(木) 18:58:26
>>249
#include <unistd.h>

int main(void)
{
while (1) {
fork();
}
return 0;
}
252デフォルトの名無しさん:2009/01/08(木) 19:10:43
ヒント:知性の低い本当のバカほど、罵詈雑言を当たり前のように使う
自分の言動を第三者の目で見てみな。滑稽で恥ずかしくなるだろうからw
253デフォルトの名無しさん:2009/01/08(木) 19:18:03
>>251
なげーよ
254デフォルトの名無しさん:2009/01/08(木) 19:23:25
>>249
無限の猿定理を応用すればこれでレポート書くことが可能なはず!
#include <stdio.h>
#include <stdlib.h>
int main(void) {
while(1)
putchar(rand()&255);
return 0;
}
255デフォルトの名無しさん:2009/01/08(木) 19:39:47
おまいを複製するプログラム書いたほうがはやいな。


そうするとどのみちレポート書けないのかw
256デフォルトの名無しさん:2009/01/08(木) 20:05:21
受け取った文字列sが"nanasi;"となってるとして末尾の';'だけ取り去った文字列にしたいのですが
以下のプログラムだと変な文字が残ってて上手くいきません。どなたかご教授を

void cut_st(char *s){
int x;
char cut1[99];
char cpy1[99];
strcpy(cut1,s);
x=strlen(s);
x=x-1;
printf(" x is %d \n",x);
for(j=0;j<x;j++)
{
cpy1[j]=cut1[j];
}
cpy1[j]='\n';
strcpy(cpy1[j],cpy1[j]);

printf("cpy1 is %s \n",cpy1);
}
257デフォルトの名無しさん:2009/01/08(木) 20:08:15
ヒント:知性の低い本当のバカほど、罵詈雑言を当たり前のように使う
自分の言動を第三者の目で見てみな。滑稽で恥ずかしくなるだろうからw
258デフォルトの名無しさん:2009/01/08(木) 20:11:30
>>256
strcpyやprintfとかは'\0'までを文字列と認識する。
cpy1[j]='\n';→cpy1[j]='\0';
259デフォルトの名無しさん:2009/01/08(木) 20:13:26
cpy1[j]=0;
//strcpy(cpy1[j],cpy1[j]);
260デフォルトの名無しさん:2009/01/08(木) 20:22:03
ありがとうございます!

っていうか超初歩的な勘違いでした...orz
261デフォルトの名無しさん:2009/01/08(木) 21:41:37
ちょっと気になったんで
便乗質問です。

>>258さんの
cpy1[j]='¥0';


>>259さんの
cpy1[j]=0;

ってのは同じ意味ですか?
262デフォルトの名無しさん:2009/01/08(木) 21:54:28
>>249
真性乱数じゃないからたぶん無理だろ
263デフォルトの名無しさん:2009/01/08(木) 22:14:54
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8580.txt

改行のみの場合はエラーが作動しません
なぜでしょうか
264デフォルトの名無しさん:2009/01/08(木) 22:23:08
while (1) {
c = getchar();
if (c == '\n') {
if( j==0) {
printf("改行のみError!!");
return 1;
}
break;
}
265デフォルトの名無しさん:2009/01/08(木) 22:34:15
>>264 解決しました ありがとうございます
266デフォルトの名無しさん:2009/01/08(木) 22:38:41
whileで回してるところにTABを入れると見やすくなるよ。
267デフォルトの名無しさん:2009/01/08(木) 22:46:13
何処に書いて良いか分からなかったので一番上だったここに書き込みます。
最適な場所があれば誘導お願いします。

質問内容
自作したアプリをVistaにインストールする時にファイアウォールの例外登録を同時に行いたいのですが、
なにか良い方法はないでしょうか?
インストールは一般的なインストーラ(EXEpressを予定)を使おうと考えています。
単純に考えると例外登録するバッチファイルを作って置いて、
このバッチファイルをインストーラから起動すれば良いのかなと思っています。

そこで・・・
1,コマンドから例外登録する方法
2,例外登録を設定できるインストーラがあるよ。
3,もっと良い方法があればその方法

なんかをアドバイス頂けると助かります。
268デフォルトの名無しさん:2009/01/08(木) 22:54:12
>>261
同じ
269デフォルトの名無しさん:2009/01/08(木) 22:58:26
>>267
スレ違い。先ずは板トップをよく読みましょう。
270デフォルトの名無しさん:2009/01/08(木) 23:04:32
>>256
果てしなく無駄なことしているな。
これで充分じゃね?
void cut_st(char *s){
char cpy1[99];
sprintf(cpy1, "%.*s", strlen(s) - 1, s);
}

もう少し安全サイドに振るならこんなもんか。
void cut_st(char const * s)
{
char cpy1[99];
unsigned len = strlen(s) - 1;
sprintf(cpy1, "%.*s", len < sizeof(cpy1) ? len : sizeof(cpy1) - 1, s);
}
271デフォルトの名無しさん:2009/01/08(木) 23:23:44
strlenに0返されたら、どうなるの?
272デフォルトの名無しさん:2009/01/08(木) 23:31:14
気になるなら例外処理しておけば?
273デフォルトの名無しさん:2009/01/08(木) 23:44:59
というか strncpy や strlcpy を使えよ
274デフォルトの名無しさん:2009/01/09(金) 01:18:06
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
275デフォルトの名無しさん:2009/01/09(金) 11:57:20
strtokを使う荒技もあるな
276デフォルトの名無しさん:2009/01/09(金) 12:22:15
>>270
× unsigned len
○ size_t len
277デフォルトの名無しさん:2009/01/09(金) 12:46:01
Cについての質問です
CSVファイルをカンマ区切りで読み込みたいのですがやり方を教えてくれませんか?
今までVBAしかやっていなくて混乱しています
278デフォルトの名無しさん:2009/01/09(金) 12:47:47
>>276
size_tだと64bit環境で64bitintだったりするんだもんよ。
279デフォルトの名無しさん:2009/01/09(金) 12:50:21
>>277
先ず、fgets()で1行ごと切り出す。
数値だけならstrtol(), strtod()で切り出すループ。
文字列がある場合はダブルコーテーションで括られていない保障があるならsscanf()で%[^,]を使って切り出す。
ダブルコーテーションで括られているなら、セルの途中で改行している可能性もあるので1文字ずつパースするしか。
280デフォルトの名無しさん:2009/01/09(金) 12:55:48
>>278
関数の定義が
size_t strlen(const char *s);
だと言いたいんだと思う
281デフォルトの名無しさん:2009/01/09(金) 12:57:12
>>278
size_t strlen(const char*);
なわけだが。
282デフォルトの名無しさん:2009/01/09(金) 12:57:16
そんなことは百も承知でunsignedなんだが。
寧ろ>276はunsignedを超えるサイズだったらどうするんだという夢語りをしたいのだと思った。
283281:2009/01/09(金) 12:57:49
>>280
ケコーンして
284デフォルトの名無しさん:2009/01/09(金) 13:01:45
>>278
size_tは常にunsignedじゃなかったか?
285デフォルトの名無しさん:2009/01/09(金) 13:08:42
普通は
typedef unsigned int size_t
になってる
286デフォルトの名無しさん:2009/01/09(金) 13:17:18
>>285
>278
287デフォルトの名無しさん:2009/01/09(金) 13:19:47
>>279
ぼんやりとですが、多少見えました。
ありがとうございます
288デフォルトの名無しさん:2009/01/09(金) 13:47:41
>>282
お前みたいな奴が time_t を unsigned に突っ込むんだろうな。
289デフォルトの名無しさん:2009/01/09(金) 14:00:19
>>277ですが
#include(stdio.h)

#define Row_Max 120
#define Line_Max 16

int main(void){

FILE *fp;
char buff[256];
int dt[Row_Max][Line_Max];

//ファイルオープン//
if((fp = fopen("impcsvfil.csv","r")) == NULL){
printf("ERR\n");
exit(1);
}

while(fgets(buff,256,fp) != NULL){
このあと、どうstrtol()を使えばいいですか?
カンマ区切りで配列割り振られるかわかりません
290デフォルトの名無しさん:2009/01/09(金) 14:03:03
291デフォルトの名無しさん:2009/01/09(金) 15:35:59
質問します。

あるかどうか分らないのですが、
プログラム実行中にある条件(a>0など)を受け取って
プログラム自体をリセットして最初から実行する処理の記述は
何かありませんか?
292デフォルトの名無しさん:2009/01/09(金) 15:55:28
>>291
if (a>0)
{system(argv[0]); exit(0);}
的な?
「条件の受け取って」の部分をどうやって実装するつもりなんでしょ。
シグナルとかイベントとか
293デフォルトの名無しさん:2009/01/09(金) 15:56:08
ないんじゃない?

リセットって一般には難しいけど
longjmp()なら近しいかもしんない
294デフォルトの名無しさん:2009/01/09(金) 16:13:01
そのプログラムを無限に実行させるプログラムを書く。
実行させるプログラムは普通に終了すれば、また、起動される。
295デフォルトの名無しさん:2009/01/09(金) 16:20:05
>>291
mainを呼ぶとか。リスタートしたかどうかや受け渡しにはstatic使って
自動変数使う部分はブロックで囲んでリセット部分をその外に書くなりで。
296デフォルトの名無しさん:2009/01/09(金) 16:42:20
execシステムコール使えばどう?
297デフォルトの名無しさん:2009/01/09(金) 16:45:20
>>291
別プロセスにするのが一番確実
シェルスクリプトを書くのがいいんじゃない?
298291:2009/01/09(金) 16:53:10
>>292-297
回答ありがとうございます。
今から勉強すると別プロセスからのものになりそうですが
まずはそれから挑戦してみます。
ありがとうございました。
299デフォルトの名無しさん:2009/01/09(金) 18:06:41
>>289
> #include <stdio.h>
#include <string.h>
#include <stdlib.h>
> #define Row_Max 120
> #define Line_Max 16
>
> int main(void){
>
> FILE *fp;
> char buff[256];
char *dDlim = " ,\n",*endp,*token = NULL;
> int dt[Row_Max][Line_Max]={0};
int i=0,j=0;
>
> ・・・・・・・・・
>
while(fgets(buff,256,fp) != NULL){ j=0;
if(token = strtok(buff,gDlim)){
do{dt[i][j] = (int)strtol(token,&endp,10); j++;}while(token = strtok(NULL,gDlim));
}i++;};

300デフォルトの名無しさん:2009/01/09(金) 18:24:39
>>289
×#include(stdio.h)
○#include <stdio.h>

strtolは、たとえばchar buffer[]にfgetsで行を読んだとして、こういう風に使う

char *start=buffer, next;
val[0] = strtol(start, &next, 10); start=next+1;
val[1] = strtol(start, &next, 10); start=next+1;
 :

実際には、strtolで読んだ後にstartとnextの値の差や
nextの指している文字をチェックしてエラーを検査するのがいい
たとえば異常フィールドがあったら終了するならif(start == next) exit(1);とする

あと、longに納まりきらない値だった場合などのエラーを検出するにはerrnoを使う

それとこのスレでは
>>277ですが
じゃなくて名前欄に277と入れること
301デフォルトの名無しさん:2009/01/09(金) 18:30:15
>>299
それだと空フィールドとかあったら無条件に飛ばしちゃうじゃないか
strtokはCSV解析にはむいてないんよ
302300:2009/01/09(金) 18:40:27
うわ間違った
char *start=buffer, *next;
303デフォルトの名無しさん:2009/01/09(金) 20:47:08
独習Cでコマンドライン引数について勉強中なのですが、
下のプログラムに引数渡す方法が分からないです。

#include <stdio.h>

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

for(i = 1 ;i < argc; i++)
printf("%s ",argv[i]);

return 0;
}


「DOSプロンプトの表示された状態で実行する必要有り」という注意書きがあるのですが、
コマンドプロンプトはほとんど使ったことがなくて、何をやったらいいのか分かりません・・・。
304デフォルトの名無しさん:2009/01/09(金) 21:15:46
毒臭やめて他の入門書にすれば?
305デフォルトの名無しさん:2009/01/09(金) 21:18:05
>>303
コマンドプロンプトの使い方の話?

build(コンパイル、リンク)するとexeファイルが出来る
→コマンドプロンプトを起動。(プログラム→アクセサリ→コマンドプロンプトetc)
→コマンドライン( > の右側)にexeファイル名を入力してリターン

例:exeファイルの名前が c:\test\debug\test.exe なら
>c:\test\debug\test
とか
>c:\test\debug\test 1 2 3 4 5 6 7 8 9
とか、そんな感じ。(1 2 3...の部分が引数になる)
306デフォルトの名無しさん:2009/01/09(金) 21:20:45
VC なら Debug フォルダとか出てくるだろ
そういうとこスルーして「DOSプロンプト」の一言で放り出すような
ひどい本は疑ってかかったほうがいい
307デフォルトの名無しさん:2009/01/09(金) 21:26:45
>>303
使っている OS が WindowsXP なら
[スタートメニュー]-[ファイル名を指定して実行]
これでタイトルに「ファイル名を指定して実行」とあるウインドウができる

そのテキストボックスに
cmd
と入力して [Enter] キーを押せばおk
308デフォルトの名無しさん:2009/01/09(金) 21:31:24
初心者の質問なんですが
ポインタの宣言で
int* a;
int *a;
どちらが正しいのでしょうか
いつもいつもすいません
309デフォルトの名無しさん:2009/01/09(金) 21:38:27
>>308
どちらも正しい
310デフォルトの名無しさん:2009/01/09(金) 21:38:28
>>308
両者は文法上、全く違いは無い。
311デフォルトの名無しさん:2009/01/09(金) 21:39:22
>>309
>>310
ありがとうございます
312デフォルトの名無しさん:2009/01/09(金) 21:57:26
便乗で質問
aをint型へのポインタ、bをint型として宣言したい時
int *a, b;
ってできるの?

313デフォルトの名無しさん:2009/01/09(金) 21:59:23
できるよ
314デフォルトの名無しさん:2009/01/09(金) 22:05:12
>>319
さんくす
315デフォルトの名無しさん:2009/01/09(金) 22:05:58
319じゃないよ。314だ・・・
316デフォルトの名無しさん:2009/01/09(金) 22:06:33
ちがう・・・ 313あて
317デフォルトの名無しさん:2009/01/09(金) 22:19:54
>>295
それはスタックがやべぇことにならんか?
318デフォルトの名無しさん:2009/01/09(金) 23:09:14
exec シスコが無難だろ。
319デフォルトの名無しさん:2009/01/09(金) 23:44:18
日本語の読めない俺に、
Manpage of PRINTFにのっているaqの意味を教えて下さい。
320デフォルトの名無しさん:2009/01/09(金) 23:52:15
文脈からするとaq='(single quote)だな。
321デフォルトの名無しさん:2009/01/09(金) 23:54:01
これか?
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html

aq
10進数変換 (i, d, u, f, F, g, G) において、ロケール情報に指定があれば 1000 単位の
区切り文字を出力する。 gcc(1) の多くのバージョンは、このオプションを解釈することが
できず、警告を出力することに注意せよ。 %aqF は SUSv2 には含まれていない。
322デフォルトの名無しさん:2009/01/10(土) 00:06:21
>>320
なんですか、single quoteって?
lispにでてくる'()みたいに値の評価をしないってやつですか?
>>321
それです。
ああ、今さら理解しそうです。1,000,000,000ってことか。
323デフォルトの名無しさん:2009/01/10(土) 00:13:28
>>322
それですって・・・
Manpage of PRINTFの記述そのまんまじゃないか>>321
324デフォルトの名無しさん:2009/01/10(土) 00:23:21
>>322
>>321 のリンク先を aq で検索すると
シングルクォートの変換ミスとしか思えない
325デフォルトの名無しさん:2009/01/10(土) 00:37:02
原文 http://linux.die.net/man/3/printf
> '
> For decimal conversion (i, d, u, f, F, g, G) the output is to be grouped
> with thousands' grouping characters if the locale information indicates any.
> Note that many versions of gcc(1) cannot parse this option and will issue a warning.
> SUSv2 does not include %'F.

和訳 http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html
> aq
> 10進数変換 (i, d, u, f, F, g, G) において、ロケール情報に指定があれば 1000 単位の
> 区切り文字を出力する。 gcc(1) の多くのバージョンは、このオプションを解釈すること
> ができず、警告を出力することに注意せよ。 %aqF は SUSv2 には含まれていない。

aqはシングルクオート(’)のこと。
なんでaqなのかは不明
326デフォルトの名無しさん:2009/01/10(土) 00:50:57
フラグの'の意味は>>322のとおり

printf("%'d", 1000000)で1,000,000と表示される。
環境によるらしいが。
327303:2009/01/10(土) 01:00:23
レスを返してくださった皆様ありがとうございました。
おかげさまで、正しくプログラムを機能させることができました!
今日一日ずっとそれで頭を悩ませていたので、本当に助かりました。

独習Cで学習を進めることに、今のところあまり不満はないのですが、
これからは詰まったら他の参考書も手にとって見るようにしてみます。
328デフォルトの名無しさん:2009/01/10(土) 01:29:37
>>306
つか、最近はコマンドプロンプトも知らずにプログラム始めるのか
その前にPCを知れといいたい
329デフォルトの名無しさん:2009/01/10(土) 01:36:07
最近は統合環境から入る人が多いからじゃないの?
330デフォルトの名無しさん:2009/01/10(土) 01:41:57
コマンドプロンプトより tcsh や bash の方がいいもん!
331デフォルトの名無しさん:2009/01/10(土) 01:44:59
とりあえずコマンドプロンプトはCの範疇じゃないからCの本で扱ってなくてもまったくおかしくは無い
332332:2009/01/10(土) 03:27:01
画像をネガポジ反転したいのですが、プログラムがわかりません
教えていただけないでしょうか?
333デフォルトの名無しさん:2009/01/10(土) 03:54:56
>>332
各ピクセル(モノクロ画像なら1つ、カラー画像ならRGBの3つ)の値を取り出せるところ
まで到達しているなら、後は計算するだけ。単純なネガポジ反転は、各ピクセルの値を
最大値(8ビット階調なら255)から減算した値で置換する。
(ピクセルの値をPixel とすると、Pixel=255-Pixel のような計算)

JPGやBMP等、画像ファイルの状態から各ピクセルの値を取り出す話となると
少し複雑&長い話になる。どこから始めたいの?
334デフォルトの名無しさん:2009/01/10(土) 04:25:33
根本的な話になるのですが入門書を見ても書いていなかったので質問です。
変数の宣言位置はずっと関数の先頭が望ましいと思っていた(勘違い?)のですが、
ブロックの先頭で宣言しても問題ないのでしょうか?
335デフォルトの名無しさん:2009/01/10(土) 04:35:54
>>334
問題ない。
つーか、経験的に変数のスコープは、なるべく短くした方が
あとでメンテが楽になるので、俺はそうする。
336デフォルトの名無しさん:2009/01/10(土) 04:37:05
>>334
問題ない。ただしその有効範囲はブロック内のみ。
337デフォルトの名無しさん:2009/01/10(土) 05:04:19
>>335,336
ありがとうございます。
自分の勘違いでしたか…
338デフォルトの名無しさん:2009/01/10(土) 05:08:53
Pascalから入ったのか
339デフォルトの名無しさん:2009/01/10(土) 05:45:44
大丈夫、C++でさえ関数の先頭で宣言すべきと主張する馬鹿もいる。
つーか、一部のコンパイラを除いてc99に対応しているんだから
必要な場所で初期化付きで定義すべきだろ。
340デフォルトの名無しさん:2009/01/10(土) 06:07:46
数値を入力したら、終了
341デフォルトの名無しさん:2009/01/10(土) 06:27:11
C言語を使い始めて約20年・・・。
>>339 の発言を見て初めてC99なるものが存在することを知った俺がいる
342デフォルトの名無しさん:2009/01/10(土) 06:38:52
マイクロソフトのVCが未だにC99に対応していないからね

C89=ANSI-Cのときとはわけが違う
343デフォルトの名無しさん:2009/01/10(土) 07:00:30
ちょっとお聞きしたいのですが、
#include<stdio.h>
void main(void)
{

printf("Hello World\n");
}

と書いてコンパイルしたら
インクルードファイル ’stdio.h’をオープンできない って出て Hello Worldってでない、、、
ちゃんとBorlandもダウンロードしたしcd設定もしたんだけど、 何が悪いのかな?
344デフォルトの名無しさん:2009/01/10(土) 07:39:18
>>343
無償版の Borland C++ 5.5.1 のことかな?
--------------------------------------------------
2. インストール先の bin ディレクトリで次の手順を実行します。
a. 既存のパスに "c:\Borland\Bcc55\bin" を追加します。
b. bcc32.cfg ファイルを作成します。このファイルは,Include
および Lib パスのコンパイラオプション(コンパイラの -I
および -L スイッチ)を設定するものです。ファイルには次の
行を含めてください。
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
c. ilink32.cfg ファイルを作成します。このファイルは,Lib
パスのリンカオプションを設定するものです。ファイルには
次の行を含めてください。
-L"c:\Borland\Bcc55\lib"
--------------------------------------------------
↑のcfgファイルがbinディレクトリ内に無い、あるいは内容が間違ってるとか。

少し古いバージョンだと、パスの途中に "Program Files" のような空白文字が
あるディレクトリがあるとダメだったような記憶が・・・(かなりうる覚え)。
C:\Borland のように、パスの途中に空白文字が無い場所に BCCディレクトリを
移動してリトライしてみるといいかも。
345デフォルトの名無しさん:2009/01/10(土) 08:05:26
>>344
そうやってみたらこんど
’Bcc32’は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。って出た
346デフォルトの名無しさん:2009/01/10(土) 08:13:59
すみません 自己解決しました。 初歩的なことをやり忘れてました。
お騒がせしてすみません。
347デフォルトの名無しさん:2009/01/10(土) 08:14:49
>>345
PATHが通っていない
a. 既存のパスに "c:\Borland\Bcc55\bin" を追加します。
348デフォルトの名無しさん:2009/01/10(土) 09:12:32
fgetsは処理ごとにメモリが動くので、一様な使い方ができません。
どのように切り抜けるか知っていますか。下記例。

#include<stdio.h>

int main(){
FILE *fp;
char a[256];
char *b[4];
char *c,*d;
int i;

if((fp=fopen("address.dat","r"))==NULL)exit(1);

c=fgets(a,256,fp);
printf("%s",c);
d=fgets(a,256,fp);
printf("%s",d);

fclose(fp);
}


これを
c=fgets(a,256,fp);
d=fgets(a,256,fp);
printf("%s",d);
printf("%s",c);

のような順序にすると同じ値が出てしまいます。(1行目が消えて、ファイルの2行目の出力になる)
349デフォルトの名無しさん:2009/01/10(土) 09:19:20
>>348
おなじ領域(a[256])に読み込んでいるんだから
上書きされて当然。
350デフォルトの名無しさん:2009/01/10(土) 09:28:52
>>348
char a[256];
char b[256];

として

fgets(a,256,fp);
fgets(b,256,fp);
printf("%s",a);
printf("%s",b);

とか、そうゆうこと?
351デフォルトの名無しさん:2009/01/10(土) 09:30:20
>>348
マルチは死ね
352デフォルトの名無しさん:2009/01/10(土) 09:36:37
IPAの岡田のメールのコピペだな
353デフォルトの名無しさん:2009/01/10(土) 09:49:49
>>351 はわわわ〜
354デフォルトの名無しさん:2009/01/10(土) 10:18:08
『'引数' : 'double' から 'int' への変換です。データが失われる可能性があります。』っていう警告が出ます。
『setH(Temp);』が原因らしいんですがよくわかりません。
誰か教えてください。
355デフォルトの名無しさん:2009/01/10(土) 10:20:34
↓エスパー登場
356デフォルトの名無しさん:2009/01/10(土) 10:36:43
>>354
「縮小変換」、あるいは「狭化変換」でウェブ検索しろ
問題あるか無いかは場合による
357デフォルトの名無しさん:2009/01/10(土) 11:04:30
>>354
データが失われてもいいんなら無視
警告消したいならキャストすれば警告は出ない
358C初心者:2009/01/10(土) 13:51:53
 基本的な質問ですみません。Cはjava等の代わりにホームページで
使えるのでしょうか。
359デフォルトの名無しさん:2009/01/10(土) 13:55:45
JAVAのような使い方は無理。
360C初心者:2009/01/10(土) 13:57:44
>>359
たびたびすみません。JAVAのような使い方以外に、ホームページで
活用できませんか?
361デフォルトの名無しさん:2009/01/10(土) 14:04:30
その前に、HTMLなどブラウザで表示するウェブページがどういったものに対応しているか?
Javaはページの中に組み込めるが、それでも元は単体で孤立している。
C言語が何を作るものとして使われているか?

あと、Javaが仮想マシンを介している仕組みも考慮すれば、実行プログラムが
OSなどで互換性がない場合と比べて、その使われ方に違いが出るわけだが。
362C初心者:2009/01/10(土) 14:08:48
>>361
ありがとうございます。勉強になりました。
363デフォルトの名無しさん:2009/01/10(土) 14:09:15
>>358
CでCGIは作れるよ
364デフォルトの名無しさん:2009/01/10(土) 14:09:26
>>360
1) Active-X。
2) プラグインを作って配布。
365デフォルトの名無しさん:2009/01/10(土) 14:09:52
Cは君が思いつくものほぼ全てのことができると思ってよいが、
モノによっては想像を絶する労力を必要とすることがよくあるのでマゾに超オススメ
Cはホームページには向かない
366デフォルトの名無しさん:2009/01/10(土) 14:09:55
>>360
javaとjavascriptの区別はついてるよな?
javascriptのような使い方は無理。
javaのようにwebアプリを書くのはできないことはないけど、
普通はやらない。
367デフォルトの名無しさん:2009/01/10(土) 14:10:48
>>360
CGI を C で書くことは可能。
サーバによっては拡張モジュールも書ける。
あるいはサーバそのものも書ける。

そのようにサーバ側で動くプログラムは C で書くのは不自然ではない。
(が、今となってはそういう機会はそれほどない)

ActiveX のようにクライアント側で動くものを作ることもできるけど、
クライアント側の環境が制限されるし、COM がややこしい。
せめて C++ でなければ実質的には使い物にならない。
368デフォルトの名無しさん:2009/01/10(土) 14:15:23
>>363
CGIとJavaの使われ方が違うわけだが。何か処理をするプログラムが作れるか?というなら
どちらも可能。生成された実行プログラムがどう使われるか?とは話は別だし。
369デフォルトの名無しさん:2009/01/10(土) 14:17:32
うん
別に同じだなんて言わなかったんだけどね
370デフォルトの名無しさん:2009/01/10(土) 14:18:02
CGIにまで話を及ばせると、もうサーバー管理にまで話が関与してくるぞ。
ユーザに用意したものではなく、個人で作ったCGIを使わせてくれるサービスもあるが、
下手すれば被害を大きくするから、余程のことが無い限り使わせないし。
Javaとは次元が違いすぎる。
371デフォルトの名無しさん:2009/01/10(土) 14:18:49
次スレがないっぽい

スレを勃てるまでもないC/C++の質問はここで 5
http://pc11.2ch.net/test/read.cgi/tech/1230516307/
372デフォルトの名無しさん:2009/01/10(土) 14:22:18
クライアント側が受信したものをローカルPCで実行するのと、CGIみたいに
サーバーが処理するのとでは、もう個人がホームページに導入するのと
随分と使い勝手が違ってくる。これ以上は初心者に入れ知恵しても無駄だろ。
373デフォルトの名無しさん:2009/01/10(土) 14:22:24
374デフォルトの名無しさん:2009/01/10(土) 14:24:26
>>373
375デフォルトの名無しさん:2009/01/10(土) 14:29:36
勝手にJSPとかを想像した俺は異端であったか
376デフォルトの名無しさん:2009/01/10(土) 14:34:00
Javaといえば鯖側がメインだしな
377デフォルトの名無しさん:2009/01/10(土) 14:44:35
float f0, f1, f2, f3, f4, f5;

float fAve = ( f0 + f1 + f2 + f3 + f4 + f5 ) / 6.0f;

とした結果と、括弧内の足し算の順番を変えたものの結果がほんのわずかに異なるときが
あるのですが、これはなぜなのでしょうか??
378デフォルトの名無しさん:2009/01/10(土) 14:48:56
>>377
精度のある値の足し算の宿命です。
379デフォルトの名無しさん:2009/01/10(土) 14:50:18
まぁ実用的には、doubleで充分なことが多いしdoubleを使うべきケースではあるな。
>377の言う「ほんのわずか」はどうせprintf()で"%f"を使った結果だろう。
どうせなら、"%.20g"で較べてみろ。
380377:2009/01/10(土) 15:11:21
>>378
なるほど。

>>379
たしかにぜんぜん問題になるような違いではないのですが、
ちょっと気になったのでお聞きしてみました。

計算結果は法線情報としてGPUに渡して立体モデルを描写させているのですが、
960×960規模の画面内でわずか数ピクセルほど、わずかに値が違う色として出力されて気付きました。

勉強になりました。
ありがとうございました。
381デフォルトの名無しさん:2009/01/10(土) 15:25:59
>>380
周辺の式がどうなっているか判らないからなんとも言えないけれど、double幅で計算すればいいんじゃないの?
全部floatにすることで並列化を狙っていたり変換時間を節約しているのなら失敬。
382377:2009/01/10(土) 15:35:36
>>381
ありがとうございます。
この精度で描画品質は十分で、描画速度が良いに越したことはないのでfloatでいこうと思います。
383デフォルトの名無しさん:2009/01/10(土) 15:45:17
速度を語るなら両方の速度を実測してみてからだ
384デフォルトの名無しさん:2009/01/10(土) 17:44:22
char型の変数に任意の8bitのビットイメージを16進リテラルで代入するときの
やり方ってどうなるの?

例えば単純に、
char hoge = (char)0x88;

とやってもどのコンパイラでも正しく10001000bのビットイメージになると期待していいんだろうか?
切捨てして0x7Fにしちゃうコンパイラとかあったりしない?
385デフォルトの名無しさん:2009/01/10(土) 17:53:39
>>384
BCC、VC、gccではリテラルが変数型の範囲を超えてても飽和処理はしない。
char型に0x88ならそのまま、0x788なんてしても下位1バイトだけが代入されて0x88になる。
386デフォルトの名無しさん:2009/01/10(土) 17:59:16
>>385
なるほど、ありがとう。
387デフォルトの名無しさん:2009/01/10(土) 18:22:05
>>384
'\x88'
388デフォルトの名無しさん:2009/01/10(土) 22:20:13
IF文を使い、char型の変数cに入れた値が0〜1・a〜fの場合は処理を続行。
それ以外の場合終了

という処理を行いたいのですが、
if(c=='0'|| ・・・・c=='9'||c=='a'||・・・・c=='f'c=='A'||・・・・)と書き並べる以外の方法はありませんか?
1行がとても長くなるので、このような書き方はしたくないです。

389デフォルトの名無しさん:2009/01/10(土) 22:24:22
isxdigit
390デフォルトの名無しさん:2009/01/10(土) 22:29:22
x 0〜1,a〜fの場合

o 0〜1,A〜F,a〜fの場合
391デフォルトの名無しさん:2009/01/10(土) 22:58:27
1秒に1回、"Hello"という文字列を出力したいのですが
実行間隔の指定ができる関数を教えてください。。。
環境はLinuxです
392デフォルトの名無しさん:2009/01/10(土) 22:59:13
>>389
そんな関数があるんですね。ありがとうございます。

こんな便利な関数があれば10進から16進に変換するプログラムは簡単に作れると思ったら、
思った以上に苦戦しています。
頑張って考えてみます
393デフォルトの名無しさん:2009/01/10(土) 23:03:12
>>391
#include <unistd.h>
unsigned int
sleep(unsigned int seconds);
394デフォルトの名無しさん:2009/01/10(土) 23:33:51
sleepだとだんだんずれていきます
395デフォルトの名無しさん:2009/01/10(土) 23:35:37
>>392
10進から16進じゃなくて
16進から10進じゃないの
396デフォルトの名無しさん:2009/01/10(土) 23:44:22
文字列を数字にしたいだけでしょ。
397デフォルトの名無しさん:2009/01/10(土) 23:47:00
strtol使えばいいのに
398デフォルトの名無しさん:2009/01/10(土) 23:47:46
勉強のために自分でやってみることは有意義だ
399デフォルトの名無しさん:2009/01/10(土) 23:54:00
>>395
16進から10進だった^^;
400デフォルトの名無しさん:2009/01/10(土) 23:57:01
>>394
gettimeofdayとdifftimeでやってみたら
401デフォルトの名無しさん:2009/01/10(土) 23:58:47
>>394
usleep とか nanosleep は?
402デフォルトの名無しさん:2009/01/11(日) 01:19:49
typedefで任意のbit長の型を作りたいのですができますか?
5bitサイズの型とかが欲しいのです
403デフォルトの名無しさん:2009/01/11(日) 01:21:44
ビットフィールド
404デフォルトの名無しさん:2009/01/11(日) 01:26:57
typedef は無理やねえ
405デフォルトの名無しさん:2009/01/11(日) 01:31:08
>>401
問題を根本的に解ってないな。
406デフォルトの名無しさん:2009/01/11(日) 01:49:26
>>402
ちなみにビットフィールドを使ってもどうせアラインメントをまたぐことはできないので
5ビット整数の配列なんてものを実装したいなら素直にビット演算でどうにかすること
407デフォルトの名無しさん:2009/01/11(日) 02:14:32
>>403,404,406
ありがとうございます。
やはり、ビット演算ですね
408デフォルトの名無しさん:2009/01/11(日) 04:29:24
>>392
もう見てないだろうし読んでも意味不明かもしれないが
http://pc11.2ch.net/test/read.cgi/tech/1226143920/26-
409デフォルトの名無しさん:2009/01/11(日) 04:34:06
>>401
sleepと名のつく関数はどれも、「最低止まる時間」をしているので
根本的にだんだんずれていく性質を持っている。
410デフォルトの名無しさん:2009/01/11(日) 06:11:43
リアルタイムOSでなければシステム自体が根本的にいい加減。
と言ってもられないんだけど。マルチメディア系では
411デフォルトの名無しさん:2009/01/11(日) 07:17:17
settimer や sleep の精度で我慢できないなら、タイマー値をポーリング
するしか思い付かないなぁ。え、CPU負荷?知らない、そんなの(コラ

time_t t1,t2;

t1=time(NULL);
while(1) {
  if(t1!=(t2=time(NULL))) {
    printf("Hello\n");
    t1=t2;
  }
}
412デフォルトの名無しさん:2009/01/11(日) 07:19:33
usleep で遅れた分だけ引けばいいんじゃない?
413デフォルトの名無しさん:2009/01/11(日) 08:37:56
まぁそれが普通だよな
clock() とかと組み合わせて、
414デフォルトの名無しさん:2009/01/11(日) 09:30:53
>>409
たぶんこいつもわかってないな。
415デフォルトの名無しさん:2009/01/11(日) 09:43:51
while(1){
t=time();
hoge();
fuga();
sleep(d+t-time());
}
こんな感じですか?分かりません><
416デフォルトの名無しさん:2009/01/11(日) 09:51:58
417デフォルトの名無しさん:2009/01/11(日) 10:12:50
418デフォルトの名無しさん:2009/01/11(日) 10:48:57
419デフォルトの名無しさん:2009/01/11(日) 10:56:19
#include<stdio.h>

/* 配列の中の指定された数値を数える関数 */
int count(int number,int array[100],int length);

/*********************************************
*count -- 配列の中の指定された数値を数える *
* *
*パラメータ *
* number -- 数える数値 *
* array[] -- 対象配列 *
* length -- 配列の要素数 *
* *
*戻り値 -- 指定された数値の個数 *
* *
*********************************************/
int count(int number,int array[100],int length){
int rcount = 0;
/*再帰の終点を決める*/
if(length == 0){
return(0);
}
if(number == array[length]){
++rcount;
}
/*再帰*/
return(rcount + count(number,array,length-1));
}
420デフォルトの名無しさん:2009/01/11(日) 10:58:18
int main(){
int data[100];
int num;
int youso;
int i;
printf("要素数を入力:");
scanf("%d",&youso);
printf("data[0~%d]入力:\n",(youso-1));
/*配列の各要素に数値入力*/
for(i=0;i<youso;++i){
scanf("%d",&data[i]);
}
printf("数える数値を入力:");
scanf("%d",&num);
/*戻り値をそのまま出力*/
printf("%dの数は%dつ\n",num,count(num,data,youso));

return(0);
}

>>419-420
上記のコードで、動作はちゃんとするのですが、
return(rcount + count(number,array,length-1));
のarrayの部分を、array[100]などにしてしまうとエラーが出ます。
なぜ中括弧を書くといけないのでしょう?
421デフォルトの名無しさん:2009/01/11(日) 11:12:56
よく読んでないけど

受け取る側が、arrayへのポインタを受け取るようになっているから。
array[100]と書いてあるのに何故ポインタなのかは、C FAQ でも読んで勉強してね。

で、そこにarrayを渡すとちゃんとポインタが渡されるけど
array[100]を渡すと、配列内の100番目の要素が渡されることになるから。

だと思うよ。
422デフォルトの名無しさん:2009/01/11(日) 11:16:56
>>421
なるほど!よくわかりました。ありがとうございます。
423デフォルトの名無しさん:2009/01/11(日) 12:27:52
*.c から *.h を生成するようなツールってきっといくつもあると思うんですけど、
どれかおすすめのがあれば教えてください。
あとおすすめした理由もあればお願いします。
424デフォルトの名無しさん:2009/01/11(日) 12:32:25
自力で作る
425デフォルトの名無しさん:2009/01/11(日) 12:36:29
普通は *.h から *.c を作る
426デフォルトの名無しさん:2009/01/11(日) 12:44:13
gccもVCもコンパイラオプションでヘッダ作るってのがあったはず。
ごちゃごちゃ新しく何かをインストールする必要がないという点でお勧めする。
427デフォルトの名無しさん:2009/01/11(日) 13:01:18
gccにそんな機能ってあったけ?
428デフォルトの名無しさん:2009/01/11(日) 13:08:48
-h
429デフォルトの名無しさん:2009/01/11(日) 13:12:24
gcc: unrecognized option '-h'
430デフォルトの名無しさん:2009/01/11(日) 14:06:35
質問です
コードは
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8604.txt
にあります。
コンパイラはvisual c++ 2005です。
FILE *out;
out = fopen("D:\outdata.csv",r);
fclose(out);
としたいのですが、
fopen("D:\outdata.csv",r);
でNULLがかえってきてしまいます。
よろしくお願いします。
431デフォルトの名無しさん:2009/01/11(日) 14:08:30
"D:\\outdata.csv"
432430:2009/01/11(日) 14:15:56
>431
修正してみましたが、うまくいきませんでした。
デバッガでは
下記のコードでもエラーが出ています。


void saveTrackStatusErrorGraytoFile(trackedPointAndStatus **tracked_points,int ch_num,int feature_point_num,char *filehead){
int i , j , k , l ;
FILE *out;
trackedPointAndStatus tp;
char *outputfilename;
char ofn[MAX_FILENAME_LENGTH];
sprintf(ofn,"%s_outdata_.csv",filehead);
out = fopen(ofn,"w");

fclose(out);
return ;
}

filehead の値

filehead 0x01d4b158 "D:\\experiments\eval-data\Army\frame" char *

となっています。

よろしくお願いします
433デフォルトの名無しさん:2009/01/11(日) 14:23:07
char *filehead="D:\\experiments\\eval-data\\Army\\frame_outdata_.csv";
out = fopen(filehead,"w");
434デフォルトの名無しさん:2009/01/11(日) 14:36:46
int x;

これのアドレスを関数funcに渡し、

func( &x );

この関数内で

*px++;

とするとインクリメントされず、変な値がxに入りました。

*px = *px + 1;

とすると大丈夫なのですが、上記二つはなぜ違うのでしょうか?
435430:2009/01/11(日) 14:39:08
char *filehead_t="D:\\experiments\\eval-data\\Army\\frame_outdata_.csv";
out = fopen(filehead_t,"w");


// out = fopen("test.csv","w");
// printf("out stat %d\n",(int)out);
fclose(out);
return ;


で実験してみましたが、やはりNULLが帰ってきました。
436デフォルトの名無しさん:2009/01/11(日) 14:39:26
*(px++);
437デフォルトの名無しさん:2009/01/11(日) 14:41:40
>>435
csvファイルにリードオンリー属性がついてるとか。
438デフォルトの名無しさん:2009/01/11(日) 14:46:44
>>435
errnoで何のエラーか調べてみたら
439435:2009/01/11(日) 14:48:39
>437
フォルダのアクセス権限を確認しました。
Everyoneにフルアクセスの許可があります。
が、csvファイル自体が生成されませんでした。
下記のようにmain関数にすると、ファイルが生成されるのですが…
mainでファイルのfopenができるけど、
他の関数ではできないです。
int main(){

FILE *out;
char *filehead_t="D:\\experiments\\eval-data\\Army\\frame_outdata_.csv";
out = fopen(filehead_t,"w");
fclose(out);
return 0;
}
440デフォルトの名無しさん:2009/01/11(日) 14:51:13
printf("%s\n",filehead_t);
してみたら
441デフォルトの名無しさん:2009/01/11(日) 14:53:11
改造したというソースをもう一度全部貼れ
442デフォルトの名無しさん:2009/01/11(日) 14:55:36
main()でできるけど、ほかの関数だとできないってことがあるのだろうか。
引数の渡し方をミスってるとか?
443デフォルトの名無しさん:2009/01/11(日) 14:57:17
>>434
pxがまず++と結合するからだ
444デフォルトの名無しさん:2009/01/11(日) 14:57:35
errno = 24でした
コード中にpng画像( 584x388 ) のデータを7枚分ほど読み込んでいたのが原因のような気がします。
しばらく修正作業に入ります。ありがとうございました。
445デフォルトの名無しさん:2009/01/11(日) 15:01:40
まあメモリ破壊が一番疑わしいわな
446435:2009/01/11(日) 15:42:18
セーブできました!ありがとうございました!
447434:2009/01/11(日) 16:23:25
>>436
>>443
なるほど!ありがとうございました!
448デフォルトの名無しさん:2009/01/12(月) 00:24:51
パス解除出来たら神

http://www.death-note.biz/up/img/37046.zip


【政界激震のつこうた】IPA岡田がヤバイ資料流出 政界にまで疑惑が発展★139 【まピョーん☆】
http://tsushima.2ch.net/test/read.cgi/news/1231683679/
449デフォルトの名無しさん:2009/01/12(月) 12:14:13
int data[2][4];
このとき
data = *data = data[0] = &data[0][0]
だとあるのですが、アドレス的に言えば、ですよね?
data + 1 = data[1]
*data + 1 = &data[0][1]
とあるのだから、厳密に言えば
data[0][0]はint型
data=data[0]はint*[4]型
*data=*(data[0])はint*型
ではないのですか?
また、間接参照演算子*はポインタが指すメモリの値を指すようにするんですよね?
何で*dataはint*型になるのですか?
450デフォルトの名無しさん:2009/01/12(月) 12:21:00
>>449
> data = *data = data[0] = &data[0][0]
これが間違ってるから後も間違ってる
451デフォルトの名無しさん:2009/01/12(月) 12:23:29
>>450 は無しで ><

>data=data[0]はint*[4]型
>*data=*(data[0])はint*型
これが違う
sizeof で調べてみるとか
452デフォルトの名無しさん:2009/01/12(月) 12:25:00
http://www.geocities.co.jp/SiliconValley-Bay/7437/c/c3.htm
ここ見てやってるんですが間違ってるんでしょうか
私が知りたいのは何で*(data + y) + xが&data[y][x]になるのかということなんですが
453デフォルトの名無しさん:2009/01/12(月) 13:10:58
>>449
data + y はintダブルポインタ。
*(data + y) は data[y] に相当、data[y] はintポインタ。
data[y] + x は intポインタ + 整数、だから結果はintポインタのままで &data[y][x] になる。
*(data[y] + x) としたらintポインタの中身だから data[y][x] になる。
454デフォルトの名無しさん:2009/01/12(月) 14:50:51
>>452 そんなに悩むことか?
&A[x]はA+xと同じ。
Aにdata[y](これは*(data+y)と同じ)を当てはめれば終了。
455デフォルトの名無しさん:2009/01/12(月) 15:44:49
C言語の試験受けようと思ってるものですが、
練習問題とか載ってるサイトとかありませんかね?
456デフォルトの名無しさん:2009/01/12(月) 15:52:20
ポインタへのポインタをダブルポインタなんて言いかたするのはやめなさい
457デフォルトの名無しさん:2009/01/12(月) 16:19:12
>>449
配列の配列というものと、配列がポインタに成り下がるということを理解していないと混乱する。
もう一度説明しよう。
int data[2][4]; としたとき、dataは「int4個の配列」2個の配列で、
これは(一部の例外を除いて)すぐに先頭要素へのポインタに成り下がる。
繰り返すが、配列dataの要素は「int4個の配列」であるdata[0]とdata[1]の2個で、
それへのポインタの型は「int4個の配列へのポインタ型」(int (*)[4])になる。
ポインタ演算の法則から、data+0は0番目の「int4個の配列」へのポインタで、
data+1は1番目の「int4個の配列」へのポインタになる。

間接参照演算子*は、ポインタの指すオブジェクトへの参照を生み出すもので、
そのオブジェクトの値を取り出すわけではない。
配列へのポインタに*を作用させた結果は配列への参照になる
(だいたい、配列そのものには「値」というものは存在しない)。
だから*(data+y)と書けばそれはdataのy番目の「int4個の配列」そのものを意味する。
そしてこれはdata[y]と書いたのと同じである。これは[]演算子の定義による。

しかしこれもまた配列であるから、すぐにその先頭要素へのポインタ(この場合int *)に成り下がる。
よって*(data+y)+xと書けばそれはdataのy番目の「int4個の配列」のx番目の要素へのポインタで、
*(*(data+y)+x)はdataのy番目の「int4個の配列」のx番目の要素である。
これはdata[y][x]と書いたのと同じである。何度も言うが、これは定義による。
*(data+y)+xが&data[y][x]と等しいのは、1+1が2と等しいのと同じ理由である。

>>453
>>456
違う。data+yは配列へのポインタであって、
時にダブルポインタと呼ばれるところのポインタへのポインタではない。
458デフォルトの名無しさん:2009/01/12(月) 16:22:39
ダブルポインタなんて言葉初めて聞いたわ
459デフォルトの名無しさん:2009/01/12(月) 16:25:25
俺は聞いた事あるよ
嫌いな呼び方だが
460デフォルトの名無しさん:2009/01/12(月) 16:27:53
>>458
700件もある
> "ダブルポインタ" "ポインタへのポインタ" OR "ポインタのポインタ" の検索結果 約 717 件中 1 - 10 件目 (0.27 秒)
461デフォルトの名無しさん:2009/01/12(月) 16:30:35
>>460
1000件以上
"double pointer" "pointer to a pointer" の検索結果 約 1,280 件中 1 - 10 件目 (0.32 秒)
462デフォルトの名無しさん:2009/01/12(月) 16:35:08
>>457
>配列がポインタに成り下がるということ
これだと「int4個の配列へのポインタ型」の「配列」はなんでポインタに成り下がらないのか
「ポインタのポインタ」ではなんで駄目なのかが上手く理解出来ないんだよな
463デフォルトの名無しさん:2009/01/12(月) 16:39:20
>>462
確かにわかりにくいかもしれないけれど、それは徹底的に論理的思考を要求されるという意味であって説明が間違っているわけではないよ
464デフォルトの名無しさん:2009/01/12(月) 16:42:46
>「int4個の配列へのポインタ型」の「配列」はなんでポインタに成り下がらないのか
「配列へのポインタ」はあくまでもポインタであって配列ではないからに決まってる
>「ポインタのポインタ」ではなんで駄目なのか
意味がよくわからんが
「への」ではなく「の」ではいけないのかという意味なら、より意味合いとして厳密だから
「配列の〜」ではなく「ポインタの〜」ではいけないのかという意味ならそれは別物だから
という答えになる
465デフォルトの名無しさん:2009/01/12(月) 16:44:09
「配列とポインタは同じ」みたいに書いてる本が悪いんだよ
466デフォルトの名無しさん:2009/01/12(月) 17:01:55
配列とポインタの違いが、わからん

指し方が違うだけ?
467デフォルトの名無しさん:2009/01/12(月) 17:07:12
ぜんぜん違うものだよ
配列はメモリ上に連続的に確保された、ある大きさの領域で、コンパイラがそれと認識するもののこと
ポインタはあるオブジェクトを指し示す値あるいはその値を格納する変数のこと
468デフォルトの名無しさん:2009/01/12(月) 17:08:25
何スレか前に配列のあらましについて解説したレスがあったな
469デフォルトの名無しさん:2009/01/12(月) 17:34:44
>>457>>462
配列→ポインタに成り下がりなら
「「int4個の配列」2個の配列」→「2個の配列」はポインタに成り下がり
=「int4個の配列へのポインタ型」→「4個の配列」はポインタに成り下がり
=「intへのポインタ型へのポインタ型」と脊髄反射で考えたくなるが
この考え方って違うんだよね・・・

本見ながらマニュアル的にint data[x][y];の
dataは「inty個の配列へのポインタ型」(int (*)[y])と覚えてるだけで
ポインタの理解が出来そうに無いorz
470デフォルトの名無しさん:2009/01/12(月) 19:32:14
写真は燃えるけど、写真の写った写真を燃やしても写真の中の写真までは燃えないだろ
471デフォルトの名無しさん:2009/01/12(月) 20:23:00
>>457
何かわかったような気がしました
data + yは、int(*)[4]型である、はわかってたつもりでした
じゃあ何で*を付けたときにint(*)型になるのかって思ってましたが
>>*(data+y)と書けばそれはdataのy番目の「int4個の配列」そのものを意味する。
「そのもの」を指すんですね。
つまり、この時点でint(*)型になってるんですね?
>>間接参照演算子*は、ポインタの指すオブジェクトへの参照を生み出すもので、
>>そのオブジェクトの値を取り出すわけではない。
このことが良く理解できていなかったようです。
間違いなどございましたらご指摘ください。
472デフォルトの名無しさん:2009/01/12(月) 20:29:34
>>471
*(data+y) は int [4] 型だと思うんだが
473デフォルトの名無しさん:2009/01/12(月) 20:29:50
>471
>つまり、この時点でint(*)型になってるんですね?
いや、それに&とsizeof以外の演算子を作用させたり、関数の引数に書いたりしたとき
474デフォルトの名無しさん:2009/01/12(月) 20:32:02
>>473
そのへんの解釈は微妙かなぁ
厳密には「&またはsizeofを作用させなかった場合」じゃないかな
まあ実質同じだけど
475デフォルトの名無しさん:2009/01/12(月) 20:38:19
規格の文言では、「例外を除いて」ポインタに意味が格下げになる、となってるから>474が正しい
確かに普通はどうでもいいことだが
476デフォルトの名無しさん:2009/01/12(月) 20:41:12
*(data + y)はint[4]型だが&またはsizeof()を作用させていないので
int(*)に成り下がる(int*に暗黙キャストされる?)んですか??
良くわからん。。
477デフォルトの名無しさん:2009/01/12(月) 20:45:10
>>476
「キャスト」ではないことを除けばその解釈であってる

キャストは値を変換すること
配列がポインタになるのは、値ではなく意味自体が変わる(というか配列に値はない)
478デフォルトの名無しさん:2009/01/12(月) 20:48:40
>>475
例外に抜けがあるのに正しいか?
479デフォルトの名無しさん:2009/01/12(月) 20:53:31
>>478
正しい
なぜなら配列の初期化は宣言時だけで、*(data+y)のような式には適用されないから
480デフォルトの名無しさん:2009/01/12(月) 20:55:22
そうなんですか。。。んー、何かいまいちもやが晴れないです。
持ってる本にも載ってないしなあ。
アドレスの加算ができるのはサイズが判ってる(ポインタ型だから)ですよね?
つまりその加算の前の時点で既にポインタ型になってる?
いやむしろ加算する⇔&,sizeof()でない よってポインタ型になる?
ところでC言語の規格そのものってどこにあるんでしょう?
K&Rがそれにあたるとしたら買わなきゃいけないのかな?
481デフォルトの名無しさん:2009/01/12(月) 21:00:02
○ &,sizeof()でない よってポインタ型になる
482デフォルトの名無しさん:2009/01/12(月) 23:15:57
なんかさぁ
無駄に難しいことで悩んでいる気がするんだよね。。。
2次元配列をポインタで扱うとか
普通ありえないよ。

そんなコード書いたら
設計からやり直しだよ。。。
483デフォルトの名無しさん:2009/01/13(火) 21:12:51
#include<stdio.h>
int max(int data[100]);
int main(){
int kazu;
int data[100];
int saidai;
int i;
printf("数値の数は?:");
scanf("%d",&kazu);
printf("数値を入力:");
for(i=0;i<kazu;++i){
scanf("%d",&data[i]);
}
saidai = max(data);
printf("最大の値は%dです\n",saidai);

return(0);
}

int max(int data[100]){
int maxdata = 0;
int i;
for(i=0;data[i]!='\n';++i){
if(maxdata<data[i]){
maxdata = data[i];
}
}
return(maxdata);
}
上記のコードだと、最終結果で意図しない値になってしまいます。
論理演算の使い方などが間違っているのでしょうか?
484デフォルトの名無しさん:2009/01/13(火) 21:16:32
配列の有効な大きさの判定がおかしいから
kazuもmax関数の引数として渡しましょう。
485デフォルトの名無しさん:2009/01/13(火) 21:25:42
data[i]!='\n'
486デフォルトの名無しさん:2009/01/13(火) 21:45:03
下のプログラムは、エラトステネスの篩のアルゴリズムの一部です。
何をやっているか理解出来ないので、解説をお願いします。

for(i=0 ; i<MAX ; i++) p[i] = 0;
p[0] = 1;
for(i=2 ; i<=MAX/2 ; i++){
for(j=2 ; i*j<=MAX ; j++){
if(p[i*j-1] == 0)
p[i*j-1] = 1;



if(p[i*j-1] == 0)
p[i*j-1] = 1;

この処理は、p[i*j-1]が0ならば p[i*j-1] に1を代入
だと思うのですが、p[1]からp[MAX]まで0を入れてあるので、このif文は常に真になりませんか?
487デフォルトの名無しさん:2009/01/13(火) 22:22:31
if文で + や - が入力されたら〜という条件は設定できますか?
簡易な電卓を作りなさいというような問題で入力した四則演算の演算子で
計算する方法を分岐するという内容を考えています。
操作する感覚を電卓に近くしようということらしく、2(入力) +(入力) 1(入力) = 3(計算結果)
というような操作方法にしたいと思っています。
488デフォルトの名無しさん:2009/01/13(火) 22:28:33
>487
できるよ。
キーボードから入力された'+'は0x2Bっていう
値になるから。
489デフォルトの名無しさん:2009/01/13(火) 22:46:06
>>486
最初の一回だけ真になる(=常じゃない)

たとえば、i=1, j=24 のとき p[23] を参照するけど、
その後 i=2 j=12 とか i=3 j=8 とかのときも p[23] を参照する。


490デフォルトの名無しさん:2009/01/13(火) 22:50:25
>>488
そんな答え方したらc == 0x2bなんて条件を書くようになりそうだから、そう言うな。
491デフォルトの名無しさん:2009/01/13(火) 22:51:36
struct hh{
int c;
int d;
unsigned long dd[2]
}

という構造体があります。
この構造体のアドレスを0x0300とします。

この構造体の0x0300をポインタで指すと、何バイトになるのでしょうか?

int c, int d, unsigned long dd[2] がひとつの領域にはいるのかそれとも
int c, int d, unsigned long dd[0], unsigned long dd[1], unsigned long dd[2]
がはいるのでしょうか?

ちなみにアドレスをずらすとこの構造体に次の値が入るものとします
492デフォルトの名無しさん:2009/01/13(火) 22:53:28
ごくり
493デフォルトの名無しさん:2009/01/13(火) 23:04:07
>>491
構造体の大きさをsizeofで調べた方がいい
494デフォルトの名無しさん:2009/01/13(火) 23:22:58
>>493
そこをなんとか・・・
495デフォルトの名無しさん:2009/01/13(火) 23:24:33
>>494
環境依存だから、答えは?
496デフォルトの名無しさん:2009/01/13(火) 23:24:48
なんとかしたいけど、質問の意味がわからない。
497デフォルトの名無しさん:2009/01/13(火) 23:24:57
>>491
アラインメントでググれ。
498デフォルトの名無しさん:2009/01/13(火) 23:25:09
>>495
そうでした。申し訳ありません。
intを2 unsigned long を4とするとどうなりますでしょうか?
499デフォルトの名無しさん:2009/01/13(火) 23:26:15
2+2+4*2=?
500デフォルトの名無しさん:2009/01/13(火) 23:30:53
つまり*hhは12バイトをとるということでしょうか?
で次のポインタ*hh(++) も値をいれるとすれば同じく12バイトをとるということであってますか?

0x0300 →12バイト
0x0301 →12バイト であってますよね?
501デフォルトの名無しさん:2009/01/13(火) 23:31:21
>>491

int main(void)
{
struct hh {
int c;
int d;
unsigned long dd[2];
} st;

printf("st size = %2d, adderss = %p\n", sizeof(st), &st);

printf("c size = %2d, adderss = %p\n", sizeof(st.c), &st.c);
printf("d size = %2d, adderss = %p\n", sizeof(st.d), &st.d);
printf("dd size = %2d, adderss = %p\n", sizeof(st.dd), &st.dd);

return 0;
}
502デフォルトの名無しさん:2009/01/13(火) 23:31:26
構造体内のメンバは普通、配列のようにみっちりと連続した領域に
配置されることなんか保証されていない、
つまり殆どの場合メンバの合計サイズにはならないから、
構造体のポインタの加算減算(アロー演算子以外)で各メンバに
アクセスすることはできない
通常はsizeof(構造体) > sizeof(メンバ0) + sizeof(メンバ1) ... + sizeof(メンバn)
ってあってる?
503デフォルトの名無しさん:2009/01/13(火) 23:31:42
ダメだこりゃ。
504デフォルトの名無しさん:2009/01/13(火) 23:32:37
>>500
sizeof(struct hh *) しやがれ
505デフォルトの名無しさん:2009/01/13(火) 23:33:33
0x0300+12=?
パディングされるかもしれないからコンパイラのマニュアル読んでみたら
506デフォルトの名無しさん:2009/01/13(火) 23:35:34
>500
間違っている。

この構造体が0x0300番地から
配置されているならば
0x030b番地までこの構造体の
「実体」が存在している。
507デフォルトの名無しさん:2009/01/13(火) 23:36:30
パディングなんて入ってる環境もあれば
入ってない環境もあるんだから、
環境を限定しないと解答不可能。
508デフォルトの名無しさん:2009/01/13(火) 23:36:46
>>504
間違い。

>>502
あってない。

>>500
どうしようもない。
509デフォルトの名無しさん:2009/01/13(火) 23:37:57
出力する際、10個出力したら改行という風にしたいのですが、上手くいきません。
このプログラムの場合
int a[200] = {0};
int i, count;
for(i=0;i<=199;i++){
printf("%d ",a[i]);
count++;
if(count % 10 ==0)
printf("\n");
結果が
0 0
0 0 0 0 0 0 0 0 0 0
途中省略
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
となります。

どこが間違っているのでしょうか?
510デフォルトの名無しさん:2009/01/13(火) 23:38:17
>>508
質問者はポインタを宣言しただけで使えるようになると思っている節がある
511502:2009/01/13(火) 23:38:24
>>508
良ければどこがどのように間違っているか是非訂正お願いします
512デフォルトの名無しさん:2009/01/13(火) 23:39:14
高速化のために構造体のサイズはあるバイト数の倍数になるよう必要なら”隙間”で埋められる。
その”あるバイト数”は環境によってことなるためあftgyふいおp;:
513デフォルトの名無しさん:2009/01/13(火) 23:40:06
>509
「count」が初期化されていない。
514502:2009/01/13(火) 23:42:56
>>512
つまり構造体のサイズが境界?と偶然合えば
sizeof(構造体) = sizeof(メンバ0) + sizeof(メンバ1) ... + sizeof(メンバn)
になるから
sizeof(構造体) >= sizeof(メンバ0) + sizeof(メンバ1) ... + sizeof(メンバn)
ってことですか?
515デフォルトの名無しさん:2009/01/13(火) 23:43:18
#pragma pack(1)
516デフォルトの名無しさん:2009/01/13(火) 23:43:45
>>491

>この構造体の0x0300をポインタで指すと、何バイトになるのでしょうか?
この質問自体が意味不明。
もうちょっとテキストを読みなさい
517デフォルトの名無しさん:2009/01/13(火) 23:45:13
つまり1バイトが1メモリアドレスを占有するのでしょうか?

0x0300 に3バイト入れたら 0x0302まで占有している
0x0300にアクセスしないと値はとれない。0x0302ではだめ。
で、構造体の次の値をとろうとするとhh[1]とかで指定すると
0x0303の値をとるということであってますよね?
518デフォルトの名無しさん:2009/01/13(火) 23:45:48
基礎もなく、組み込みやってるんだと思うよ。
519デフォルトの名無しさん:2009/01/13(火) 23:50:08
>>516
おまえさんも日本語のテキストを読んだ方がいい
抜けているのは主語であってCの知識ではない

意味不明にggrks、それから? 存在意義ない人だね
520デフォルトの名無しさん:2009/01/13(火) 23:50:23
>517
うーん。。。

1バイトが1メモリアドレスってどんな処理系?

この構造体はどこかで配列として宣言されているの?
521デフォルトの名無しさん:2009/01/13(火) 23:51:42
>>517
> つまり1バイトが1メモリアドレス
そう。メモリアドレスの1単位が1バイトであるものをバイトマシンと呼び、現在もっとも一般的。
稀にそうでないものもあるが絶滅したも同然だから気にすんな。
522デフォルトの名無しさん:2009/01/13(火) 23:51:51
つーかデバッガで確認するとか自分であれこれ実験すれば分かること
523デフォルトの名無しさん:2009/01/13(火) 23:56:11
この構造体を格納するメモリアドレスが0x3000から始まります。
で、構造体の中身がint, int, unsigned long dd[2]です。
0x3000が指す領域は12バイトをとりますよね?
次に0x300bが指す領域も12バイトをとりますよね?(次の領域にも構造体をあてはめるとして)

たとえば、最初の構造体の二つ目のintをとろうとするとあらかじめ構造体にはポインタ宣言しておいて
hh[0].dとアクセスしますよね ddなら hh[0].dd[1]とかで

で、次の領域の構造体にアクセスするとなると
hh[1].d hh[1].dd[1]といった具合になりますよね
524デフォルトの名無しさん:2009/01/14(水) 00:00:25
日本語の勉強をした方がいい
525502:2009/01/14(水) 00:02:44
催促すいませんがどなたか>>514に答えて頂けますか
紛らわしいのですが>>491氏とは別の質問でして
526デフォルトの名無しさん:2009/01/14(水) 00:02:50
>>517

>つまり1バイトが1メモリアドレスを占有するのでしょうか?
よくあるPCではそんな雰囲気

>0x0300 に3バイト入れる
0x0300、0x0301、0x0302 に1バイトずつ、合計3バイト入れるとイメージした方がいい

>構造体の次の値
構造体の配列 struct hh test[100]; があるとき、各要素のアドレスは
&test[0], &test[1], &test[2]・・・とか
test, test+1, test+2 で得られる。

アドレスの違いは sizeof(struct hh) になる。
→sizeof(struct hh) が3なら、 0x0300 の次は 0x0303
→sizeof(struct hh) が4なら、 0x0300 の次は 0x0304
→sizeof(struct hh) がxなら、 0x0300 の次は 0x0300+x

>>523

>この構造体を格納するメモリアドレスが0x3000から始まります。
>で、構造体の中身がint, int, unsigned long dd[2]です。
>0x3000が指す領域は12バイトをとりますよね?

12バイトの時もあるが、12バイトでない場合もある。
どちらになるのかは、実装方法が決まらないと確定しない。
527デフォルトの名無しさん:2009/01/14(水) 00:02:52
× 0x300b
528デフォルトの名無しさん:2009/01/14(水) 00:02:59
>>523

>hh[0].dとアクセスしますよね ddなら hh[0].dd[1]とかで

>で、次の領域の構造体にアクセスするとなると
>hh[1].d hh[1].dd[1]といった具合になりますよね

正しいと思いますが、
どこにもポインタが使用されていてません。
こういうのは「ポインタ宣言して」とはいいません
529デフォルトの名無しさん:2009/01/14(水) 00:06:09
>>514
解釈としては正しいと思います。
530デフォルトの名無しさん:2009/01/14(水) 00:07:08
>>525
「境界と偶然合う」って所を除けば概ね問題ない。
531デフォルトの名無しさん:2009/01/14(水) 00:08:24
>>529-530
安心して寝れます
ありがとうございました!
532デフォルトの名無しさん:2009/01/14(水) 00:09:50
>>525
一般的?にはアドレスの境界を意識して
構造体を作ります
途中にパディング用のメンバを追加するとか・・・
533デフォルトの名無しさん:2009/01/14(水) 00:18:19
>>523
ちがう。アドレスが表しているのはメモリ上の単なる位置であって、
その先にどんな大きさのオブジェクトがあるかなんて知ったこっちゃない。
アドレスと、その先にあるものの大きさ(というか型)を持っているのはポインタ。
534デフォルトの名無しさん:2009/01/14(水) 00:38:01
test = array[0]<<16;
test |= array[1]<<8;
test |= array[2]:

これの |は何を意味しているのでしょうか?
535デフォルトの名無しさん:2009/01/14(水) 00:41:10
論理和
a |= b は a = a | b と同じ
536デフォルトの名無しさん:2009/01/14(水) 00:45:15
534の場合
最終的にtestにアクセスすれば中身がつながってみえるというわけですよね
もうarray[0]はみれなくなってる?
537デフォルトの名無しさん:2009/01/14(水) 00:50:20
arrayには代入してない
538デフォルトの名無しさん:2009/01/14(水) 00:57:38
ちなみにCellでは128バイト単位がもっとも処理速度が速いのでわざわざゴミを入れて128バイト単位にする
539デフォルトの名無しさん:2009/01/14(水) 01:15:43
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8626.txt
これは、素数の個数を求めるプログラムなのですが、
2から9999までの素数の数を求めると、1少ない数になってしまいます。
それ以外は間違ってないようなのですが、なぜ、この範囲だけ値がずれるか教えてください。
540デフォルトの名無しさん:2009/01/14(水) 01:22:27
>>539
エラトステネスの篩…のつもりかな?
541デフォルトの名無しさん:2009/01/14(水) 01:24:40
j=aでいいの?
542デフォルトの名無しさん:2009/01/14(水) 01:25:20
pの中の値を見てcount[i]を増やすところがおかしい
添字の範囲を確認しなおすこと
543デフォルトの名無しさん:2009/01/14(水) 01:25:56
>>539
自然数nについての篩はp[n-1]なんでしょ?
それなのに↓はおかしいね
for(j=a;j<=b;j++){
if(p[j] == 0) count[i]++;
}
544デフォルトの名無しさん:2009/01/14(水) 01:30:01
>それ以外は間違ってないようなのですが
いやそれ以外も間違ってる
545デフォルトの名無しさん:2009/01/14(水) 01:31:14
>>540
エラトステネスの篩のつもりです。調べて見つけたアルゴリズムを参考に書いて見ました。

>>541
j=a-1;
ですか!
546デフォルトの名無しさん:2009/01/14(水) 01:40:44
>>545
ち が う よ
というかそっちを治すならもう一箇所直す場所が増えるよ
547デフォルトの名無しさん:2009/01/14(水) 01:45:29
考えてから書いてるか?
行き当たりばったりの試行錯誤でプログラミングしてないか?
548デフォルトの名無しさん:2009/01/14(水) 01:47:45
あっ、!
ifの中がp[j-1]でよろしいでしょうか?
549デフォルトの名無しさん:2009/01/14(水) 03:44:46
行き当たりばったりの試行錯誤でプログラミングしてないか?
550デフォルトの名無しさん:2009/01/14(水) 06:57:29
言語と本質的にはかかわらないけども、
CでGUIを実装したいときって、皆、何を使ってるんだろう
javaならawtかswingの2択で済むのに
551デフォルトの名無しさん:2009/01/14(水) 07:01:14
WinAPI呼ぶとか、Xlib使うとか
552デフォルトの名無しさん:2009/01/14(水) 08:11:30
>>550
GUIをCで作ることはあまりないんじゃないかな
コンソールアプリケーション以外
もっと便利な言語がありますよ
553デフォルトの名無しさん:2009/01/14(水) 08:32:03
>>532
普通はそんなの意識しないよ
意識するのは#pragma pack(push,1)でパッディング無くす時ぐらい
554デフォルトの名無しさん:2009/01/14(水) 10:25:51
>>532
どこの一般だそれは。
メモリ制限のきつい状況で、要素数のデカい構造体の配列が必要なときくらいだろ。

>>538
128…バイト?ググってみたら DMA 転送効率のためか。
そりゃ無駄が多いなあ。
555デフォルトの名無しさん:2009/01/14(水) 13:04:26
もう嫌だー
556デフォルトの名無しさん:2009/01/14(水) 13:23:21
すいません、ちょいスレ違いの質問かもしれないのですが
独学でCを覚えたかたはどういう勉強方法をされたのでしょうか?

自分は今初心者本を読みつつ、演習問題本の内容を解いていく、という感じなのですが、
あまり覚えてないような気がしてきて…
557デフォルトの名無しさん:2009/01/14(水) 13:25:19
宿題スレに問題がいっぱい転がってるからそれを解く
558デフォルトの名無しさん:2009/01/14(水) 14:05:09
>>549
最初はわからないから試行錯誤するでしょ
559デフォルトの名無しさん:2009/01/14(水) 14:10:17
>>553
昔のマシンで開発してた人が習慣で未だにやってるしそう教えるから
普通とは言わないまでもけっこう見かける
560デフォルトの名無しさん:2009/01/14(水) 14:19:31
>>558
試行錯誤は対象についての知の蓄積がない場合にやるもの。
Cやその他のプログラミング言語のように
規格が既知であるものについて試行錯誤するのは
車輪の再発明どころか間違った理解に到達してしまう可能性も高い。
極論を言えばCを理解するのに開発実行環境などいらない。
慣れるのには有用だけど。

もちろん言語そのものに対する理解の話であって
各環境での動作がどうとかいうのはまったく別の問題。
念のため。
561デフォルトの名無しさん:2009/01/14(水) 14:30:56
>>558
あなたはともかくほとんどの人は初心者の頃から「行き当たりばったり」の試行錯誤はしないんですよ
わからないなりに考えるもんなんです
562デフォルトの名無しさん:2009/01/14(水) 14:59:37
そのわりに、考えてないような?
563デフォルトの名無しさん:2009/01/14(水) 16:38:23
int 型(符号つき32 ビット整数)およびunsigned int 型(符号なし32 ビット整数)を表示させたいのですが、

プログラムは
#include <stdio.h>
#include <limits.h>

main()
{
printf("%d\n",INT_MAX);
printf("%lu\n",UINT_MAX);
return 0;
}

結果は
2147483647
4294967295
で正しいでしょうか?

564デフォルトの名無しさん:2009/01/14(水) 16:40:21
unsigned intは%uだよ。
565デフォルトの名無しさん:2009/01/14(水) 17:13:55
>>563
わからない。
処理系(limits.h)の定義する制限値は処理系ごとに違うから処理系ごとに正解が異なる。
566デフォルトの名無しさん:2009/01/14(水) 17:19:23
32 ビット整数って、書いてあるけど
567デフォルトの名無しさん:2009/01/14(水) 17:23:17
>>566
したいことと結果は別では?
568デフォルトの名無しさん:2009/01/14(水) 17:34:39
16進数で表示してみれば、ことかな
569デフォルトの名無しさん:2009/01/14(水) 17:38:19
おそらくほとんどすべての32ビット処理系では
INT_MAXを2147483647と定義しているだろうけど
それ以下でない保証はない
570デフォルトの名無しさん:2009/01/14(水) 17:51:40
そもそも>563がおかしい
整数を表示したいだけならprintfが正しく書けただけで話は終わっている
571デフォルトの名無しさん:2009/01/14(水) 18:54:33
正しくかけてるかどうか不安だったんじゃないの?
実際%luってなってるわけだし、彼にとって聞いた価値はあった。

上限値がどうこうの話は本題からずれてるよね
572563:2009/01/14(水) 20:16:57
int 型(符号つき32 ビット整数)およびunsigned int 型(符号なし32 ビット整数)の範囲内で、
それぞれの最大値から10個分の素数を表示させるプログラムを作りなさいという課題が出ています。

それぞれの最大値を調べてみたら、int型の方は-32768 〜 32767となっていたのですが、
そのあとに見つけたINT_MAXを見つけ、表示させるだけのプログラムを書いてみると全然値が違ったので
質問してみました。
573デフォルトの名無しさん:2009/01/14(水) 20:19:37
>>572
どうやって調べたんだ?どっかの情報古い上に断定しちゃってる糞サイトか何か?
なんかプログラム作って調べたなら食い違うのはおかしい
574デフォルトの名無しさん:2009/01/14(水) 20:25:37
>>572
それ先に書けばいいのに
575デフォルトの名無しさん:2009/01/14(水) 20:27:00
>>572
おそらく16ビットと勘違いしてたんだと思います。
おかげで、limits.h INT_MAX UINT_MAXを知れたんで、良い勘違いだったかと・・・

for文でint 型(符号つき32 ビット整数)から1ずつデクリメントしたいときは、INT_MAXを使っても大丈夫ですよね?


>>569
よくわからないのですが、これだと問題アリですか?
576デフォルトの名無しさん:2009/01/14(水) 20:27:05
int g_nData;

int setData(int a_nData){
static int bAccesed = FALSE;
 if(!bAccesed){
  bAccesed = TRUE;
  g_nData = a_nData;
  bAccesed = FALSE;
  return TRUE; //アクセス成功
 }
 return FALSE; //アクセス失敗
}

グローバル変数へのアクセス用関数って↑見たいな感じでいいの?
577デフォルトの名無しさん:2009/01/14(水) 20:31:35
マルチスレッドのこと言ってんならそれじゃ失敗するけどそういうことじゃなくて?
578デフォルトの名無しさん:2009/01/14(水) 20:32:38
>>575
大丈夫というか、使うべき
>>569は「答えが正しいか」というとんちんかんな質問に対する皮肉にすぎない
579デフォルトの名無しさん:2009/01/14(水) 20:33:57
>>576
排他したいなら mutex 等の排他制御機能を使うこと
580デフォルトの名無しさん:2009/01/14(水) 20:36:40
>>576
実際にどのくらいの確率で問題が起きるかは別として、
そのコードが問題を解決することはたぶん無い
具体的な排他制御の方法は処理系依存
581デフォルトの名無しさん:2009/01/14(水) 20:37:02
>>578
ありがとうございます^^
582576:2009/01/14(水) 20:37:58
素直にmutex使うほかないのかぁ
レスアリガトヌス
583デフォルトの名無しさん:2009/01/14(水) 21:07:13
""は、中身(とヌル文字)の要素数の配列をどっかに作って
中身(とヌル文字)を入れ、その先端要素のアドレスを返す演算子である
上記の解釈で正しいのでしょうか。誤っている場合は正しい定義を教えて下さい。
ところで、printf()の第一引数では、
printf("整数を入力してください。\n");
のように日本語を指定し、実際期待した通りに表示されますが
これは何故なんでしょうか?
584デフォルトの名無しさん:2009/01/14(水) 21:16:58
配列を作るわけではないが、連続領域の先頭アドレスを返す
日本語を示すバイト列が連続領域に入っていて、それを連続して出力すれば
日本語として解釈されてそのように表示される
例えばその、整 という文字の1バイト目、2バイト目に何が入っているかを調べ、
それぞれを連続して出力するような処理を書いてみると実感がわくかな?
2バイト目の数字をちょっと変更してみたりすると他の文字になったりもするよ
585デフォルトの名無しさん:2009/01/14(水) 21:50:14
void consol1(void)
{
char ch;
do {
ch = getchar();
printf("%c",ch);
putchar('.');
printf("%c",ch);
} while (ch != '\n');
printf("%c\n",ch);
}

このプログラムの実行結果、仮に「a」と入力すると次のようになった。
a.a
.

最後のprintf()で「.」が表示される仕組みがよく分からない。「a」と表示されると思ったのに。
putchar()って渡した値を出力するだけじゃないの?chに代入が行われているように見える・・・。
試しにdo〜whileを外してみたら、こっちは最後のprintf()でちゃんと「a」と表示されるんだけどなぁ・・・。
586デフォルトの名無しさん:2009/01/14(水) 21:53:49
>>585
最後の printf で出力されるのは改行文字
587デフォルトの名無しさん:2009/01/14(水) 22:03:49
>""は、中身(とヌル文字)の要素数の配列をどっかに作って中身(とヌル文字)を入れ、
そう。

>その先端要素のアドレスを返す演算子である
ちがう。その配列への参照として扱われる。
演算子でもない。あくまで文法上の特殊記号。
588デフォルトの名無しさん:2009/01/14(水) 22:06:30
書き忘れ

>>583
多バイト文字を画面上に構成するのはOS等の仕事。
プログラム自体はあくまでバイトの列を送出しているだけ。
589デフォルトの名無しさん:2009/01/14(水) 22:15:21
NULLって(void*)0でいいの?
590デフォルトの名無しさん:2009/01/14(水) 22:19:00
C89 → ((void*)0) あるいは 0
C99 → 処理系定義
C++ → 処理系定義
591デフォルトの名無しさん:2009/01/14(水) 22:19:02
>>589
「いい」の意味するところを明確にしてください
592デフォルトの名無しさん:2009/01/14(水) 22:25:21
>>589
ヘッダーファイル検索してみればよくね?
うちのVCだとこんな感じ

/* Define NULL pointer value */

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
593デフォルトの名無しさん:2009/01/14(水) 22:28:38
最近は __null で定義されてたりすることもある。
594デフォルトの名無しさん:2009/01/14(水) 22:32:16
[1] 授業単元:プログラミング演習T
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8632.zip
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C


お願いします
595デフォルトの名無しさん:2009/01/14(水) 22:44:05
>>594
ググレカス
596デフォルトの名無しさん:2009/01/14(水) 23:08:28
>>594
力になるからどこが分からないか指定しろ
597デフォルトの名無しさん:2009/01/14(水) 23:08:56
スレ違い
598デフォルトの名無しさん:2009/01/14(水) 23:15:17
>>596
int supply_bufferとvoid write_to_fileの関数のなか
たのむ
599デフォルトの名無しさん:2009/01/14(水) 23:17:05
教師は2chのスレを監視してるから
600583:2009/01/14(水) 23:24:09
>>584
>>587
レスありがとうございます。
ただおっしゃることが反対のような気がするのですが。

日本語についてですが少し考えてみたのですが
例えば、Shift-JISで書いても使用した文字等がすべてASCIIの範囲なら
Shift-JISとは言えどASCIIで書いたことと全く同値なのですよね?
ということは文章内にASCIIの1バイト文字とそれ以外の2バイト文字とが混在していることになりますが
バイト単位で考えるとどこでそれを判別するのかわからない気がします
というのは、4190AEは表を見て'A'と'整'とをくっつけたものですが
41|90AEのように区切るのか41|90|AEと区切るのか4190|AEと区切るのか
そういった判断はどうやって行なっているのでしょうか。
表を見るに、ASCIIは7Eまでしかなく、Shift-JISの2バイト文字の
1バイト目は81から始まっているようなので、7E以下なら
ASCII、それより大なら2バイト文字なので次の1バイトと合わせて
1文字と考える、とかいう処理をOSがしているのでしょうか?
C言語とは関係なくて思いきりスレチですかね
601デフォルトの名無しさん:2009/01/14(水) 23:26:58
>>594 みたいなのに教えなくちゃならない教師に同情するよ
602デフォルトの名無しさん:2009/01/14(水) 23:27:07
区切りは先頭から順にチェックしていかないと不可能だよ。
まあ、UTF-8 は特殊で、途中からでもチェック可能に作られてるけどな。
603デフォルトの名無しさん:2009/01/14(水) 23:27:59
そんなの関係ない〜
604デフォルトの名無しさん:2009/01/14(水) 23:29:53
>>600
ざっとしか読んでないけどあってる
で、SJISの2バイト目に\と同じコードを持つ文字があって、それに対して適切な処理ができないと
次の文字の1バイト目がエスケープされてしまい、文字化けが発生したりする。

EUC(-JPに限らず)や、UTF-8なんかだとそういうことはないので化けない
バイト列中の任意の1バイトを見た時に、マルチバイト文字の一部なのか、シングルバイト文字なのかが
分かるようになっている。
その辺は文字コードごとの仕組みに依存するのでその辺を調べてみては
605デフォルトの名無しさん:2009/01/14(水) 23:34:50
>>602
>>604
回答ありがとうございました。
もうちょっと勉強して来ようと思います。
606601:2009/01/14(水) 23:48:42
と思ったが、見てみると問題もひどいな

supply_buffer()では、学籍番号が不一致な場合、出力しない方を
覚えておかなくちゃならないので、static変数を使うしかない。

頑張ればできるけど、なんか問題が間違ってる気がする
607デフォルトの名無しさん:2009/01/15(木) 00:07:24
>>600
文字定数はコード中では基本的に配列として扱われる(連結が行われた後で。sizeofをかけてみればわかる)。
実際に配列として確保されるかどうかは定かでない
608デフォルトの名無しさん:2009/01/15(木) 00:08:40
×文字定数
○文字列定数
609デフォルトの名無しさん:2009/01/15(木) 00:09:37
VC++2008なんですが・・・ほとんどC言語と同じ意識で作業してまして、
スレ違いだったらすいません。
DLLをつくってまして、
static double ticks[0x7FFFFF];
static double tickEMAs[0x7FFFFF];
で定義している変数を初期化するのに、
for(int i0=0;i0<0x7FFFFF;i0++){
ticks[i0]=0;
tickEMAs[i0]=0;
}
とやると実行時に例外を吐いて落ちます。
for(int i0=0;i0<0x7FFFFF;i0++){
ticks[i0]=0;
// tickEMAs[i0]=0;
}
のように片方をコメントアウトするととおります。
なんででしょうか?
610デフォルトの名無しさん:2009/01/15(木) 00:10:36
>>594
宿題スレで聞いた方がいいかも?
int supply_buffer()
{
  int ret=0;

  if(num1<num2) {
    if((10000>num1)&&(EOF==fscanf(fp1,"%d %s %d",&num1,name1,&math)))
      num1=10000;
  }
  else if(num1>num2) {
    if((10000>num2)&&(EOF==fscanf(fp2,"%d %s %d",&num2,name2,&eng)))
      num2=10000;
  }
  else {
    if((10000>num1)&&(EOF==fscanf(fp1,"%d %s %d",&num1,name1,&math)))
      num1=10000;
    if((10000>num2)&&(EOF==fscanf(fp2,"%d %s %d",&num2,name2,&eng)))
      num2=10000;
  }

  if(20000==num1+num2)
    ret=1;

return ret;
}
611デフォルトの名無しさん:2009/01/15(木) 00:11:07
>>607
間違っても誰かが訂正してくれるだろう戦略か
612デフォルトの名無しさん:2009/01/15(木) 00:11:08
void write_to_file()
{
  if(num1<num2)
    fprintf(fp3,"%d,%s,%d,-\n",num1,name1,math);
  else if(num1>num2)
    fprintf(fp3,"%d,%s,-,%d\n",num2,name2,eng);
  else
    fprintf(fp3,"%d,%s,%d,%d\n",num1,name1,math,eng);
}
613デフォルトの名無しさん:2009/01/15(木) 00:16:55
>>609
問題の起こる最小のコードうp
614デフォルトの名無しさん:2009/01/15(木) 00:21:46
>>609
メモリーが足らないんじゃないかな
615デフォルトの名無しさん:2009/01/15(木) 00:22:37
DLLの呼び出しもとはMetatraderです。
今、mallocを初めてつかってみようと調べてます。
616デフォルトの名無しさん:2009/01/15(木) 00:29:16
>>610
なるほど
617609:2009/01/15(木) 00:39:52
mallocでメモリを確保したらとおりました。
ありがとうございました。
618572:2009/01/15(木) 00:59:38
unsigned int 型(符号なし32 ビット整数)の範囲内で最大の素数を表示するプログラムを書いているのですが、
出力される値がおそらく素数ではありません。
4294967291と出力されて正解だと思うのですが、4294967295が出力されます。
どこに問題があるか、教えて欲しいです。よろしくお願いします。

#include <stdio.h>
#include <math.h>
#include <limits.h>
int main(void)
{
long int i, n, m, Limit;
int b = 0;

while(1){
Limit=(long int)sqrt(UINT_MAX-b);
m=UINT_MAX-b;
for(i=Limit;i>1;i--){
if(m%i == 0)
break;
}
if(i==1){
printf("%u\n",UINT_MAX-b);
break;}
else
b+=1;
}

return 0;
}
619デフォルトの名無しさん:2009/01/15(木) 01:03:56
long int
620デフォルトの名無しさん:2009/01/15(木) 01:10:59
>>618
unsigned が抜けてるから負数になってる
621デフォルトの名無しさん:2009/01/15(木) 01:17:50
>>619,620

なるほど! すっかり忘れていました。ありがとうございます
622デフォルトの名無しさん:2009/01/15(木) 01:34:49
構造体のポインタの型変換についての質問です

struct a {
int i;
int j;
};

struct b {
struct a t;
int k;
};

というような、(構造体bの中に、構造体aがある)ような場合、構造体bへのポインタを
構造体aへのポインタに型変換し、a のメンバとして、構造体b の中を参照しているコードを
見かけることがあるのですが、これは文法上正しいのでしょうか?
もしくは何か注意することはありますか?

コードで書きますと
struct b test, *pb;
struct a *pa;

pb=&test;
pa=(struct a*)pb;

のようにして
pa->i; 
pa->j;

という感じで参照するような記述です。
623デフォルトの名無しさん:2009/01/15(木) 02:12:06
具体的にどこでそんなコード見かけたのか知りたいな。

キャストすればなんだって通せるから文法上正しいかどうかは意味がない。
pa = (struct a*)&(pb->k); これもOKなわけだし。

でJIS X3010見たところtを構造体bの先頭に置く限りは&(test.t) == &(test)が真なので期待通りの動作となる。はず…
624デフォルトの名無しさん:2009/01/15(木) 02:17:57
2進整数を10進数に変換する下記プログラム
があるのですがこれを正負の2進整数を10進数に変換するにはどこを改良すればよいですか?
よろしくお願いします。
#include <stdio.h>
#define BITSIZE 8
#define NDECIMALS 0
int main(void)
{
char buf[16];
int n = 0, i;
fgets(buf, sizeof buf, stdin);
for(i = 0; i < BITSIZE; ++i)
{ n <<= 1; n |= buf[i] - '0'; }
printf("%f\n", (double)n / (1 << NDECIMALS));
return 0;
}

625デフォルトの名無しさん:2009/01/15(木) 02:22:15
BITSIZEをintのbit数にする
626デフォルトの名無しさん:2009/01/15(木) 02:27:40
>>624
先頭が符号だったらそれをそのまま出力し、後は同じ処理。
627デフォルトの名無しさん:2009/01/15(木) 02:28:47
>>625
それはどのようにすればいいですか?
知識が無くてすいません。
628デフォルトの名無しさん:2009/01/15(木) 02:28:58
なんでそんなことを、という気にはなるな。
> pa=(struct a*)pb;

> pa=&(pb->t);
とすれば、tがaの先頭にあるかどうか気にしなくていいのに。
629デフォルトの名無しさん:2009/01/15(木) 02:31:03
>>627
for(i = 0; i < sizeof(int)*8; ++i)
630622:2009/01/15(木) 02:35:20
>>623
情報ありがとうございます。理解しました。

海外(?)の画像ライブラリで libjpeg6b というのがあるのですが
その中のソースが、こうゆう形で記述している部分がありました。

あと仕事でC++のインスタンス(?)をCで受け取って、その中身を参照する
(のかな?C++よくわからないです)ようなソースを書いている人が
こんな記述をしていました。
631デフォルトの名無しさん:2009/01/15(木) 02:37:46
>>627
char buf[256];
632デフォルトの名無しさん:2009/01/15(木) 02:49:46
>>627
#include <limits.h>
#define BITSIZE INT_MAX
633デフォルトの名無しさん:2009/01/15(木) 02:54:22
>>632
冗談にしてはきついぞ。
634デフォルトの名無しさん:2009/01/15(木) 03:44:06
指定された入力がされない場合、エラーを出力し指定された入力が行われるまでこれを続けるloop文を作るにはどうすればいいですか?
635デフォルトの名無しさん:2009/01/15(木) 03:56:48
do while文の中にscanfとif文でエラー吐く文を入れて条件判断の所にアドレスを参照する判断式を使う
636デフォルトの名無しさん:2009/01/15(木) 04:08:27
>>635
ありがとうございます。
637デフォルトの名無しさん:2009/01/15(木) 04:17:39
whileの所にscanf入れて中にif文書けばばいいじゃん
638デフォルトの名無しさん:2009/01/15(木) 07:18:52
int main(int argc, char +argv[])

なぜmainに引数がつくのでしょうか?またこの引数は何でしょうか?
639デフォルトの名無しさん:2009/01/15(木) 07:28:14
+ ってなんだお
* だお
コマンドライン引数とかそういうのが渡されてくるんだお
640デフォルトの名無しさん:2009/01/15(木) 07:45:14
コマンドライン引数で、int とcharを必ず渡せということでしょうか?
641デフォルトの名無しさん:2009/01/15(木) 07:47:26
>>640
少しは自分で調べなさい。
コマンドライン引き数を何も書かなくても、最低限プログラムの名前は渡される。
実験してもすぐ判ることだ。
642デフォルトの名無しさん:2009/01/15(木) 07:48:50
プログラムの名前がintで渡される?
名前ならcharで配列ひとつに1文字ずつ格納するのでは?
643デフォルトの名無しさん:2009/01/15(木) 07:50:02
>>638
int main(int argc, char *argv[])

aaa.exe bbb.txt ccc.dat
で実行すると
argc に引数の数3(aaa.exeを含めて3個)
argv[0]に"aaa.exe"
argv[1]に"bbb.txt"
argv[2]に"ccc.dat"
が入る
644デフォルトの名無しさん:2009/01/15(木) 08:26:53
>>642
少しは自分で調べなさいって。
645デフォルトの名無しさん:2009/01/15(木) 10:12:11
まあargv[0]に必ずプログラム名が入るとは限らないけどね
646デフォルトの名無しさん:2009/01/15(木) 11:03:56
>>645
egrep/fgrep が grep へのシンボリック/ハードリンクになってて
argv[0] で判断してたりね。
647デフォルトの名無しさん:2009/01/15(木) 20:15:46
人に質問してるくせに
知ったかぶりして回答者に噛み付く初心者ほど滑稽なものは無いな。
648デフォルトの名無しさん:2009/01/15(木) 21:21:31
C言語(笑)とかwwwもう古いからwwwww
649デフォルトの名無しさん:2009/01/15(木) 21:21:56
冬休みは終わったって言うのに
650デフォルトの名無しさん:2009/01/15(木) 21:23:39
いやまじでお前らは時代の流れがみえてねーよw
オブジェクト指向も出来ないような言語誰もつかいませんからwww
651デフォルトの名無しさん:2009/01/15(木) 21:42:11
Cでもオブジェクト指向できるし。
652デフォルトの名無しさん:2009/01/15(木) 21:47:50
世間知らずのバカの相手をするな
653デフォルトの名無しさん:2009/01/15(木) 22:03:54
>>651
やり方教えろ
654デフォルトの名無しさん:2009/01/15(木) 22:10:55
オブジェクトを意識して設計なりコーディングなりすればいいだけじゃないか?
言語自体ではサポートされてないんだから決まったやり方もないと思うがね。
655デフォルトの名無しさん:2009/01/15(木) 22:11:02
656デフォルトの名無しさん:2009/01/15(木) 22:14:26
C言語でオブジェクト指向プログラミングできないやつはオブジェクト指向を理解しているとは言えないと思う
657デフォルトの名無しさん:2009/01/15(木) 22:21:14
>>655
こういうのって幾度となく見てるけど、そのたびに、やっぱCでオブジェクト指向やるのは
ムリがあるなって感想しかもてない。
658デフォルトの名無しさん:2009/01/15(木) 22:26:14
N88-BASICとか、非構造化言語が使われていた時代から、Cとかpascal、構造化BASICのような
構造化言語が使われだしたときにも、非構造化言語で構造化プログラミングをするテクニック
みたいのが雑誌に載ってたけど、プログラマの負担が大きすぎて、とてもやってられない
ようなのばっかりだったな。
(Vzのソースは、MASMのマクロを使って、うまく構造化していてあれは感銘をうけたけど)
659デフォルトの名無しさん:2009/01/15(木) 22:37:57
おれがC言語の彼氏だったら間違いなくオブジェクト指向やらせないな
父親だったらまっすぐ数値計算をやらせる
孫だったらゲーム作らせるな
660デフォルトの名無しさん:2009/01/15(木) 22:39:07
fopen/fseek/ftell/fclose といった奴らはオブジェクト指向だと思うんだけど
661デフォルトの名無しさん:2009/01/15(木) 22:43:49
抽象データ型くらいまでがCの限界かな。
662デフォルトの名無しさん:2009/01/15(木) 22:44:52
形だけの構造化プログラミングの場合、たとえば while が無いから出来ない、とか
思うかもしれないけど、本質的には、goto で while 相当の処理を作ってもいいはず。
BASICでも、いわゆる綺麗なソースは構造化されてることが多い

C言語でオブジェクト指向も同じ話だろうな。形だけでいうと classが無いから
ダメって見えるかもしれないけど、本質を考えると十分実現できる。
663デフォルトの名無しさん:2009/01/15(木) 22:46:28
http://codezine.jp/article/detail/885

こういうのもあるけど、1,2ページまでのカプセル化くらいまでは、いいと思うんだよ。
でも3Pの継承までいくと、かなり無理やり感がでてくるっていうか。
664デフォルトの名無しさん:2009/01/15(木) 22:46:55
Cが古臭いってのは否定しないけど、
組み込みの世界ではバリバリ現役だよね。

一応組み込みのコンパイラでも
C++サポートしてるものが多いけど、
C++で作られたソース見たこと無い。
組み込みでC++やったことある人っている?
665デフォルトの名無しさん:2009/01/15(木) 23:09:08
マイクロソフトに関わるとC++になるな。windows mobileとか
666デフォルトの名無しさん:2009/01/15(木) 23:26:06
組み込みはCかアセンブラ。速度が要求される鯖はC。
大規模って意味では、EJBクラスタ鯖もあるが連日トラブルの山。
GUIはWebブラウザベースがほとんど。特殊用途用のGUIならVBかC#。
C++で新規開発はほとんど無いな。既存アプリのメンテする時くらいか・・・。
667デフォルトの名無しさん:2009/01/15(木) 23:35:48
>>664
組み込みをC++でやったけど、制限が多すぎてBetter Cとしてしか使わなかった
668デフォルトの名無しさん:2009/01/16(金) 00:00:18
組み込みC++の制限って、
・標準ライブラリが貧弱
・placement newかアロケータ作るかしないとnewする気にならない
・RTTIや例外を使う気になれない
ぐらいか?
669デフォルトの名無しさん:2009/01/16(金) 02:09:37
・仮想関数を使う気になれない
・ついでに継承する気も起きない
670デフォルトの名無しさん:2009/01/16(金) 11:33:39
元にしたC++仕様が古過ぎてテンプレートがグダグダ、
STL すらままならない、てのはあった。
671デフォルトの名無しさん:2009/01/16(金) 12:54:54
習作としてWindows BMP(24bit)を操作するプログラムを作ろうとしています。
しかしヘッダーの上手い出力の仕方がわからず、
char bFileHeader[BMPFILEHEADER_S + 1]; // BITMAPFILEHEADER(14bytes)
中略
// BITMAPFILEHEADER
bFileHeader[0] = 'B';
bFileHeader[1] = 'M';
*((int*)(bFileHeader + 2)) = filesize;
*((int*)(bFileHeader + 6)) = 0x00;
*((int*)(bFileHeader + 10)) = BMPFILEHEADER_S + BMPINFOHEADER_S;
中略
fwrite(bFileHeader, BMPFILEHEADER_S, 1, fp);
としており、実際に正規なファイルを出力しますが、
可読性が低いし、書くのが大変な気がします。
構造体と#pragma packを使いたくない場合、
普通はどのようにしてこれを行うのでしょうか?

また、最近ではBMPは使わずPNGを使いたい場合が多いようですが、
初心者にPNGの仕様を与えたところで、実装できるようなレベルではないとあります。
プロの(職業プログラマ)のレベルだとPNGの実装くらい自前で行えるのは当たり前なんでしょうか?
(ライブラリがあるだろうに、わざわざ自分で実装することが愚かかどうかは別にして、技術的に)
672デフォルトの名無しさん:2009/01/16(金) 13:00:19
ふつうは構造体つかう
673デフォルトの名無しさん:2009/01/16(金) 13:04:09
>>671
普通はpackした構造体を使うからな
1個の配列じゃない方法なら構造体のメンバを個別の変数にして使うぐらいしかないんじゃないか

>プロの(職業プログラマ)のレベルだとPNGの実装くらい自前で行えるのは当たり前なんでしょうか
出来ない方が当たり前
674デフォルトの名無しさん:2009/01/16(金) 13:08:18
仕様と時間があればできるよ。
675デフォルトの名無しさん:2009/01/16(金) 13:25:38
定番ライブラリのlibpngはセキュリティホールの多さでも定番ではある。
その程度には実装が難しいんだろう。

676デフォルトの名無しさん:2009/01/16(金) 17:08:39
グラフィックカードォォオオオオオオオゥ!!!!!!!!!!!!・・・ッ!
なん…イカれちまった俺の相棒とPen4…………ッ!!!!俺ッは!!!!i7を選ぶッ!!!!!!!!!!!!!!!!!!!!!
677デフォルトの名無しさん:2009/01/16(金) 18:06:48
>>571
多少めんどくさかろうが専用の関数かマクロを1回書いてしまえば完
678デフォルトの名無しさん:2009/01/16(金) 18:52:15
C言語専用の問題集とかってないかな、、、
サイトでもいいや
679デフォルトの名無しさん:2009/01/16(金) 18:55:09
すいません、ひとつ質問があります。

int c = 255;
printf("%x\n", 255);
printf("%x\n", c);
>> 出力
# ff
# ffffffff

なんでこうなるんですか?
ちなみ僕の環境では、cは8bitsです。
680デフォルトの名無しさん:2009/01/16(金) 18:55:48
失礼、間違いがありました。

char c = 255;
printf("%x\n", 255);
printf("%x\n", c);
>> 出力
# ff
# ffffffff

なんでこうなるんですか?
ちなみ僕の環境では、char は8bitsです。
681デフォルトの名無しさん:2009/01/16(金) 19:01:40
unsignedつけたら?
多分-1になってると思うけど
682デフォルトの名無しさん:2009/01/16(金) 19:04:08
>>680

unsigned char c = 255;
683デフォルトの名無しさん:2009/01/16(金) 19:08:17
C言語やった後に、エクセルの勉強しようと思う
684デフォルトの名無しさん:2009/01/16(金) 19:13:54
自動車学校に通ったら、アクセルの勉強をしようと思う
685デフォルトの名無しさん:2009/01/16(金) 19:26:05
>>681,2
素晴らしいです。ありがとうございます!

686デフォルトの名無しさん:2009/01/16(金) 19:26:33
>>680
char c = 255;

c = -1;
になる
%x で表示すると int に拡張されるので int の -1 である ffffffff と表示される
687デフォルトの名無しさん:2009/01/16(金) 19:30:02
符号ありのchar型の正の上限を超えているからね、255は。
688デフォルトの名無しさん:2009/01/16(金) 19:55:51
1.10個の2桁で正の10進データをstaticデータとしてプログラム中にいれ、11個目の数をー999とする。ポインターを使って、この10個の数の合計と平均を求めるプログラムをつくる。

2.Sachiko, Emiko, Setuko, Rie, Mariko, Sara の6人の名前をポインター配列にし、頭文字がSで次の文字がaの名前を表示するプログラムを書け。

3.3つの数字をmain文でscanfで与える。そして、関数maxで3つの数の最大値を求めて、mainに帰り次のように出力する。(p102参照)
    
    3つの数を入力してください? 55 86 32
    最大値は86です。

4.do while文をつかって、1から100までの和を求めよ。

教えてください><
689デフォルトの名無しさん:2009/01/16(金) 19:57:29
宿題スレで聞いて下さい ><;
690デフォルトの名無しさん:2009/01/16(金) 19:58:04
てゆうか、既に宿題スレで見た気がする><
691デフォルトの名無しさん:2009/01/16(金) 19:58:56
マルチっすか><
692デフォルトの名無しさん:2009/01/16(金) 20:41:48
>>678
K&Rが最高の参考書であり問題集でもある。
K&Rは今でも少し専門書の充実した本屋に行けば売ってるけど、
ストローのC++本なんて、全く見なくなったな。
693デフォルトの名無しさん:2009/01/16(金) 20:46:14
11個目の数は何に使うんだ
694デフォルトの名無しさん:2009/01/16(金) 21:35:14
問題って出す人間の程度も知れるから怖いなぁ
695デフォルトの名無しさん:2009/01/16(金) 21:39:55
11個目の数をー999とする。
696デフォルトの名無しさん:2009/01/16(金) 23:35:05
番兵のつもりなんでは
次の課題でデータを10個からn個に拡大するのかもしれんし
697デフォルトの名無しさん:2009/01/17(土) 01:01:44
ポインタ使えって言ってるんだからwhile(*p!=-999)とかにさせたいんだろ。
698デフォルトの名無しさん:2009/01/17(土) 01:04:40
ボイン太を使う?
699デフォルトの名無しさん:2009/01/17(土) 01:48:44
はい、滑った
700デフォルトの名無しさん:2009/01/17(土) 02:18:42
いつか役に立つだろと思って買っていたPrimerを読む前に4版が出ていたでござるの巻
http://www.amazon.co.jp/dp/4798109924
701デフォルトの名無しさん:2009/01/17(土) 12:37:10
#include<stdio.h>
int main(void)
{
int no;
int na;

printf("整数を入力してください:\n");
scanf("%d",&no);
if(no==0)
printf("%d\n",no);
else if(no<=0)
printf("\b\n");
else if(no>=0)
do{
na=no;
no--;
printf("%d",na);
}while(na<0);
return(0);
}    これで
 実行例1) 整数を入力してください:0
0
実行例2) 整数を入力してください:11
11 10 9 8 7 6 5 4 3 2 1 0
実行例3) 整数を入力してください:-5

って出るはずなのに出ない・・・
アドバイスplz
702デフォルトの名無しさん:2009/01/17(土) 12:41:45
後、この状態でやると 
実行例1と3はちゃんと出るけど
2はこんなふうにでちゃう

実行例2) 整数を入力してください:11
11


↑残りの10以下が出ない。。。10以下を出せたら完成です。
703デフォルトの名無しさん:2009/01/17(土) 12:43:17
>>701
while の条件が反対じゃないか?
704デフォルトの名無しさん:2009/01/17(土) 12:48:44
whileが0以下の時に繰り返すになってるわけだ
705デフォルトの名無しさん:2009/01/17(土) 12:50:35
>>703
反対でした。
ありがとうございます。
706デフォルトの名無しさん:2009/01/17(土) 12:56:31
>>701
この場合、naが0以上だとそのままループから抜けてしまう。
てか、naの存在意義は?
do〜whileのくだりは
while(no>0) printf("%d",no--);
でもいい気がするが
707デフォルトの名無しさん:2009/01/17(土) 12:59:12
>>706
ごめん、0含むの忘れてた
while(no>=0) printf("%d",no--);
708デフォルトの名無しさん:2009/01/17(土) 13:02:01
>>706
確かにそのほうが短文でいいですね。

実行例を見て自分でプログラミングを考えてやってるので思いつきませんでした。回答にも>>706さんのが書いています。
アドバイスありがとうございます。
709デフォルトの名無しさん:2009/01/17(土) 13:44:47
>回答にも>>706さんのが書いています。
(それ自体を悪いとは言わんが)くだらない質問をする奴に限って日本語が……
主語を何にするかを常に意識するだけで随分違うと思うのだけど。
710デフォルトの名無しさん:2009/01/17(土) 13:54:37
主語の問題じゃねーw
711デフォルトの名無しさん:2009/01/17(土) 14:19:10
つーか、主語だけの問題じゃないことは確かだ。
712デフォルトの名無しさん:2009/01/17(土) 15:47:03
解答にも>>706さんのと同じコードが書いてありました。

だな。エスパーすると。
713671:2009/01/17(土) 16:32:36
BMPを開くコードが書けたので、
次は画像を擬似的に文字で表わすプログラムを作ろうとしています。
http://allabout.co.jp/computer/freeware/closeup/CU20070815A/
みたいなやつです。
しかし思ったように動かず、内部ではunsigned charの2次元配列を
unsigned char*で操作しているのですが、デバッガでも中身が
表示されないようで、手詰り状態です。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8664.zip
text.cで該当する処理を行っています。
text()は、画像を指定した文字数に合わせてブロックに分け、
ブロック内の全ピクセルの平均値を取って階調に合わせ、
そのブロック毎の階調の配列を返すのですが。。。
714デフォルトの名無しさん:2009/01/17(土) 16:32:57
エスパーする必要もないぐらい簡単にわかるだろ
715デフォルトの名無しさん:2009/01/17(土) 17:48:08
>>713
×for(xx = 0; xx < *ly; xx++) {
○for(xx = 0; xx < *lx; xx++) {

×av = ar + ag + ab / 3;
○av = (ar + ag + ab)/ 3;

×gt = gm;
○gm = gt;
716デフォルトの名無しさん:2009/01/17(土) 17:58:31
>>715
おお、何か変だけどできました!
感謝感激です!ありがとうございました!
それにしてもこう変数の数が多いと途中で混乱してしまいますね。
今度からもう少しわかり易い識別子にしようと思います。。。
717デフォルトの名無しさん:2009/01/17(土) 19:44:20
VC express2008でファイル入出力のプログラムを書いてるんですが、
exeが生成されるディレクトリ(debug)にあらかじめ「test.txt」を作っておいて

FILE *fp
fopen("test.txt" ,"r");

コンパイルを通し、デバッグを開始した後
このようにオープンさせようとすると、
ファイルポインタがNULLになって読み込めていないようなのです。
理由は何なのか教えてください。
718デフォルトの名無しさん:2009/01/17(土) 19:45:14
fp書き忘れた。。。

FILE *fp
fp = fopen("test.txt" ,"r");

719デフォルトの名無しさん:2009/01/17(土) 19:46:50
IDE上で実行するときはパスが違った気がする。
プロジェクトのディレクトリに置いたらどう?
720デフォルトの名無しさん:2009/01/17(土) 19:57:40
>>719
ソリューションファイルやプロジェクトファイルと同じディレクトリに格納してもダメみたいです。
普通の文字列でなくTEXTマクロを使用しても結果は同じでした。
また、試しに相対パスでなく絶対パスで実行しても同様に例外が発生してしまいました。
721デフォルトの名無しさん:2009/01/17(土) 20:03:38
フルパスで書くときに、バックスラッシュをエスケープしていない悪寒。
722デフォルトの名無しさん:2009/01/17(土) 20:05:16
>>721
それも大丈夫です。\\と記述してます。
723デフォルトの名無しさん:2009/01/17(土) 20:07:30
例外が出たんならその内容書いてくれよ
724デフォルトの名無しさん:2009/01/17(土) 20:09:48
>>723
単純にException: Invalid Null Pointerです。
実際はこの後でfgetsでテキストファイルから一行抽出する処理を入れてあるのですが
ファイルポインタがNULLのためこのような例外が起こってしまっているみたいです。
725デフォルトの名無しさん:2009/01/17(土) 20:10:23
perrorしてみるとか
726デフォルトの名無しさん:2009/01/17(土) 20:11:53
パーミッションとか
727デフォルトの名無しさん:2009/01/17(土) 20:17:03
>>725
実際試してみると「ファイルが存在しない」とされていました。
perrorって結構便利ですね。
728デフォルトの名無しさん:2009/01/17(土) 20:19:33
じゃあ諦めろ。俺はできるんで問題ない
729デフォルトの名無しさん:2009/01/17(土) 20:21:20
もう
fopen(....... , "w");
でなんか出力してそれを検索して場所を特定するとか
730デフォルトの名無しさん:2009/01/17(土) 20:21:53
"w"で適当なファイル作って、
どこに作成されるか確かめてそこに置くとか。
731デフォルトの名無しさん:2009/01/17(土) 20:26:04
そんな声を揃えて言わなくても"w""w""w"
732デフォルトの名無しさん:2009/01/17(土) 20:34:53
>>729
そのやり方でしらみつぶしに検索をかけたら
一つ下の階層にありました。ソリューションと同じ所に置いていたのが原因でした。
確かにプロジェクトファイルと同じ所にできておりました。

├hoge
│ ├main.cpp
│ ├test.txt←
│ └hoge.vcproj
├hoge.ncb
├hoge.sln

ソリューションとプロジェクトが同じ所にできると勘違いして
お騒がせしてすみませんでした。
733デフォルトの名無しさん:2009/01/17(土) 21:03:39
wwwwwwwwwwwwww
734デフォルトの名無しさん:2009/01/17(土) 21:23:37
md5計算する使いやすいライブラリってありませぬか?
735デフォルトの名無しさん:2009/01/17(土) 21:28:41
今更MD5か。
MD5である必然性がないならSHA-2を使おうぜ。
どうしてもMD5でないといけないなら仕方が無いが。
736デフォルトの名無しさん:2009/01/17(土) 22:05:03
>>734
ここからダウンロードできますよ。
http://sourceforge.net/project/showfiles.php?group_id=42360
737デフォルトの名無しさん:2009/01/17(土) 22:16:54
>>716
名前超重要。適切な識別子かそうでないかで、読み易さが天と地ほど違う。
昔、それなりに読み易いコードの識別子だけを、意味のない英字+数字に
書き換えたら、いきなり読めないコードに化けて、激しく衝撃を受けた
記憶がある。
738デフォルトの名無しさん:2009/01/18(日) 01:30:26
ひょっとして、gets()とscanf()って同じ関数内だと一緒に使えなかったりしますか?
739デフォルトの名無しさん:2009/01/18(日) 01:33:38
しません
740デフォルトの名無しさん:2009/01/18(日) 01:36:48
使えないわけではない
ただ、getsは使うべきでないし、scanf()を他の入力関数と併用するのはトラブルのもとだ
741738:2009/01/18(日) 03:43:19
ありがとう。参考になりました。
どちらもちゃんと動作しない時があって困ってました。
742デフォルトの名無しさん:2009/01/18(日) 08:15:26
いや、どちらもちゃんと動作しているはずだ。
それがあんたが期待した動作ではなかっただけだろう。
743738:2009/01/18(日) 08:22:15
もうひとつ教えていただきたく。

char str[80];
scanf("%s",str);

このような文に半角スペースを読み込ませる方法をお教えください。
744デフォルトの名無しさん:2009/01/18(日) 08:34:00
scanf("%[^\n]", str)

http://ja.wikipedia.org/wiki/Scanf も参照
745デフォルトの名無しさん:2009/01/18(日) 09:04:34
>>742
確かに、私の期待した動作が返ってこないだけなのかもしれないです。
基本的な理解が足りず、何か根本的な所で勘違いをしているということがあり得る気がしてきました。

>>744
ありがとうございました。参考にさせていただきます。
746デフォルトの名無しさん:2009/01/18(日) 19:14:12
char p[]="\n";
char *q=strtok(p,"\n");
ってやったらp[0]=='\0'かと思いきやp[0]='\n'のままなんですが、こういう仕様ですか?
fgetsした文字列から\nをとるのに使っていたけど、これだと空行で\nが残ってしまう…
747デフォルトの名無しさん:2009/01/18(日) 19:33:05
仕様ですかって聞く前に仕様を読め
はっきり書いてある
748デフォルトの名無しさん:2009/01/18(日) 19:55:10
>>746
strtok() はトークンを切り出す関数であって、区切り文字を '\0' で置換する関数ではない。
トークンとなるべき文字が見つからないとき、strtok() は何もせずにヌルポインタを返す。

文字列末尾の '\n' を除去するのはそんな大層な処理ではない。

for (i=0 ; p[i] ; i++) ; for ( ; 0<=i && p[i]=='\n' ; i--) p[i]='\0';
749デフォルトの名無しさん:2009/01/18(日) 19:57:02
訂正。

for (i=0 ; p[i] ; i++) ; for (i-- ; 0<=i && p[i]=='\n' ; i--) p[i]='\0';
750デフォルトの名無しさん:2009/01/18(日) 19:58:25
MSVCRTのstrtokが特殊?
751デフォルトの名無しさん:2009/01/18(日) 20:08:01
トークンがないときにはNULLを返すとしか書いてないから区切り文字を書き潰してくれる保証は無い
752デフォルトの名無しさん:2009/01/18(日) 20:17:03
>>748>>746
何でたかが行末の'\n'を取り除く程度で
わざわざそんな複雑なことするの?

char *q = strchr(p, '\n');
if (q) *q = '\0';
で充分じゃん。
fgetsで取った文字列なんだし。
753デフォルトの名無しさん:2009/01/18(日) 20:24:51
>>746
char *strtok( char *s1, const char *s2 );

strtok関数の最初の呼出しでは、s2で指定したデリミタではない最初の文字を、s1内で探索します。
見つからなければ、s1にはトークンがないことを示すNULLポインタを返します。

一方、そのような文字を見つけた場合には、それが最初のトークンの先頭になります。
次に、strtok関数はその位置から現在のデリミタ文字を探索していきます。
見つからない場合には、文字列s1の終わりまでを現在のトークンとします。
見つけた場合には、その文字をヌル文字で上書きして、現在のトークンの探索を終了させます。

strtok関数は、このヌル文字の後ろに続く文字位置を指すポインタを保存します。
次の呼出しで最初の引数がNULLポインタの場合には、次のトークンを見つけるための探索が
この位置から開始されます。


なので、デリミタが '\n' の時、文字列 "\n" においてデリミタでない最初の文字が見つからないから
strtokは何もしないで、null を返す。あと strtok は文字列を変更するので、リテラル文字列(文字列定数)
を第1引数にセットするのは、あまりヨロシク無いかもしれない。
754デフォルトの名無しさん:2009/01/18(日) 20:25:34
>752に激しく同意。標準ライブラリ関数が当てにならなかった大昔ならいざ知らず、
標準関数を自前で再実装するのは最早滑稽。
755デフォルトの名無しさん:2009/01/18(日) 20:28:07
>>753
>あと strtok は文字列を変更するので、リテラル文字列(文字列定数)
>を第1引数にセットするのは、あまりヨロシク無いかもしれない。
大丈夫、今回は>746含めて誰もそんなこと阿呆なコードは書いていない。
756746:2009/01/18(日) 20:32:34
仕様ってネットにあったんですね、すいません;;

もやもやしてたのが取れた気がします。
皆さん分かりやすい説明ありがとうございました。
757デフォルトの名無しさん:2009/01/19(月) 20:38:21
五十肩サイトを見つけました。ボリュームがあって親切な説明が載っています。
http://gojukata.seesaa.net

医療関係者の方が書かれたようですが、ご自身も五十肩を患っており、患者と治療者の
両方の視点で書かれています。
758デフォルトの名無しさん:2009/01/19(月) 22:15:20
フリーのコンパイラは何がいいですか?
759デフォルトの名無しさん:2009/01/19(月) 22:30:46
DMCがいいよ
760デフォルトの名無しさん:2009/01/19(月) 22:42:40
デトロイトメタルシティの略ですね
わかります。
761デフォルトの名無しさん:2009/01/19(月) 22:44:36
gcc か Visual C++ でおk
762デフォルトの名無しさん:2009/01/19(月) 22:45:11
>>758
VC++入れとけ
763デフォルトの名無しさん:2009/01/20(火) 10:03:58
K&R 170 - 173P のソースコードに変更を加えているのですが
メモリアクセス違反の原因がわからず困っています。

やりたいことと、問題点については下記ソースコードの上部に
コメントで記載しています。

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8687.txt

コードの問題点についてどなたかご教授頂けないでしょうか?
よろしくお願い致します。
764デフォルトの名無しさん:2009/01/20(火) 11:41:37
>>763
narrayのポインタを渡してwalktree()で書き換えを行ってるわけだから
main()に戻ってきても当然書き換わったままとなる。
staticを使うと云々の場合はmain()のnarrayは書き換わらないからうまくいく。
main()でwalktree()を呼び出す前にnarrayをもう一つ変数を用意して保持し
後の表示ではその変数を使用すればよい。
765デフォルトの名無しさん:2009/01/20(火) 12:48:04

>>764
なるほど。narrayがノード数分進められた状態でmain()に戻って、
そこから表示しようとしていたのが原因ということですね。
下記コードでうまくいきました。

struct tnode **narray2;

narray = nalloc();
narray2 = narray;

walktree( &narray, root );

while ( nnode-- > 0 ) {
printf( "%s\n", (*narray2++)->word );
}

とても助かりました。
ありがとうございます。
766デフォルトの名無しさん:2009/01/20(火) 21:39:00
共有メモリと、systemV IPC メッセージキュー(smdmsg等)を使用した際のメッセージ通信
の手法をご伝授いただけないでしょうか?
767デフォルトの名無しさん:2009/01/20(火) 21:41:40
疑問符はお願いするときに使うもんじゃないだろ。
768デフォルトの名無しさん:2009/01/20(火) 21:45:38
Would you do me a favor?
769デフォルトの名無しさん:2009/01/20(火) 22:07:05
smdmsgは初耳
逆に教えて欲しい位
と揚げ足取ってスマンコ
770デフォルトの名無しさん:2009/01/20(火) 23:00:53
あるC言語の問題集に載っていた、clock関数を使った暗算についての
例題をそのまま実行したのですが、
正しく時間が計算されずその原因がわかりません。

例題のソースは下記にアップロードしました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8693.c

このソースを実行すると、
---
視野拡大トレーニング開始!!
start_time:15

49 + 22 + 70:141
27 + 76 + 12:115
86+61+43:190
end_time:15

0.0秒かかりました。
---
となり、正しく時間が計算されません。
(start_timeとend_timeがなぜ同じ値なのか?)

どなたか原因を教えてください。
よろしくお願いします。
771デフォルトの名無しさん:2009/01/20(火) 23:06:36
>>770
#define RepeatNum 30000
にしてみるとか
772デフォルトの名無しさん:2009/01/20(火) 23:14:28
clock()はプロセッサ時間だから、かな?
773デフォルトの名無しさん:2009/01/20(火) 23:40:34
>>770
標準入力待ちの間にclock()が進むかどうかは環境依存。
秒単位でいいなら標準関数のtime()が使えるが、
それ以上の精度が要るならgettimeofday()辺りでどうだろう。
774デフォルトの名無しさん:2009/01/21(水) 10:33:01
>>767
いただけるか、いただけないかを訊いているんだろう。
775デフォルトの名無しさん:2009/01/21(水) 10:38:19
いただきまーす!
776デフォルトの名無しさん:2009/01/21(水) 18:02:30
C FAQ の 7.32 に
「戻り値を直接別の関数に渡す場合に(略)、例えば
fgets(alloca(100), 100, stdin)のような式で問題を招く」
とありますが、これはなぜでしょう?

alloca()の解放は fgetsを呼ぶ関数の終了時なので
問題ないようにみえますが
777デフォルトの名無しさん:2009/01/21(水) 18:04:30
allocaの失敗したときを考えろよクズ
778770:2009/01/21(水) 18:08:19
>>771-773
ありがとうございます。

gettimeofday()関数を調べて、
ソース作りなおしてみます。
779デフォルトの名無しさん:2009/01/21(水) 18:25:35
>>777 そんなのは別の関数関係ないだろ
780デフォルトの名無しさん:2009/01/21(水) 18:27:08
キャスト?
781デフォルトの名無しさん:2009/01/21(水) 18:37:35
>>779
分けてちゃんと返り値ちぇっくしたら起こらない問題が起こるだろーが、理解したか?このカス
782デフォルトの名無しさん:2009/01/21(水) 18:45:05
>>781
だからそんなのは本質じゃないって
お前は回答側に回るの半年早い
783デフォルトの名無しさん:2009/01/21(水) 18:45:26
>>776
スタック方式に話を限定するけど
alloca()で確保された領域をいつ開放するべきかを決定する要素が「関数を抜けるとき」しかない
だからその他のローカル変数同様に確保する領域をスタック上に積んで
(よーするにローカル変数な配列のサイズをあとで決めるということだが)
それへのポインタを返すことになるわけだが、
問題はalloca()から制御が帰ってくるまで「現在のスタックの大きさ」が確定しないことにある
その状態で別の関数を呼び出す準備をはじめたら、
つまりalloca()から帰る前のスタックに値を積みはじめたらきっとひどいことになる
784デフォルトの名無しさん:2009/01/21(水) 18:46:36
fgetsを呼ぶとき、よくある例だとコールスタックはこうなる(あくまで一例だけど)。
3番目の引数
2番目の引数
1番目の引数
fgetsからreturnする先のアドレス

ところが、allocaが混ざるとこうなってしまう可能性が高い。
3番目の引数 (stdin)
2番目の引数 (100)
allocaで確保した100バイト
1番目の引数 (allocaの戻り値)
fgetsからreturnする先のアドレス
こうなると、fgetsの中で、2-3番目の引数と思ってアクセスした場所が
実はallocaの領域だったという事態になってしまっている。
だからallocaを引数の中で使うなというわけ。
785デフォルトの名無しさん:2009/01/21(水) 18:53:51
というかぜんぜん入門編の範疇じゃないな
「初心者が標準外の関数を使うな」で完
786デフォルトの名無しさん:2009/01/21(水) 18:54:39
>alloca() 関数は、割り付けた領域の始まりを指すポインタを返す。
>割り付けによってスタックオーバーフローが起った場合の プログ
>ラムの動作は定義されていない。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/alloca.3.html

NULLなどの特殊な値がかえってくるわけではなく、成功失敗は
プログラムからは決定できないので、呼び出すのは一種のバクチ

>多くのシステムにおいて、関数コールの引き数のリスト内では
>alloca() が使えない。
>これは、 alloca() によって予約されるスタック領域が、
> 関数引き数に使われるスタック領域の中に現れてしまうためである。
>>784の言う通り
スタックポインタを操作する危険な関数で、仕様も素性もわからない
関数を標準ライブラリにあるからという理由で、気軽に「合成」して
使うと思わぬ落とし穴に嵌る可能性があるというお話
787776:2009/01/21(水) 19:23:44
回答ありがとうございます。

>>784
なるほど、関数のパラメタをスタックに積んでいるところを妨害する
可能性があるわけですね。非常に納得しました。
でもそういうアーキテクチャの場合、alloca をサポートしちゃいけないような気も・・

>>783
スタックフレームのサイズが静的に決まらないので、いろいろ実装が難しいですね。
とくに、関数コールがスタックフレームサイズを増やすアーテキチャの場合は
関数の外側で使わないとまずいですし。

>>786
確かに、不定値が返るって仕様は厳しい。
それでも GNUのstrdupa() みたいにわざわざ alloca版が作られているのは、
リスクもあるけど便利なんでしょうね
788デフォルトの名無しさん:2009/01/21(水) 19:28:39
ようするに可変長配列万歳(違
789デフォルトの名無しさん:2009/01/21(水) 19:53:34
標準ライブラリには危険なものも含まれているというよりか
その後のC言語の用途や文法と処理系仕様の標準が相当に変わって
きてしまっていて、伝統的な標準ライブラリを正しく使う
機会も、使うのに適したC処理系もなくなりつつあるというのが
実態に近いんじゃないかと。(これはWindows APIについても
ある程度言える)要は、標準ライブラリですらそれを使うのは
それなりの熟練が必要ということ。
790デフォルトの名無しさん:2009/01/21(水) 19:54:24
gets!
791デフォルトの名無しさん:2009/01/21(水) 19:56:27
というかちゃんと構造化してるなら
allocaなんかつかわなくたって
明示的にmalloc/freeするのは
そんな難しいことじゃないんだけどな
792デフォルトの名無しさん:2009/01/21(水) 19:58:47
alloca は速さも重要だと思うが。
793デフォルトの名無しさん:2009/01/21(水) 20:04:21
>>792
はぁ?
794デフォルトの名無しさん:2009/01/21(水) 20:08:25
関数内で使うちょっとした領域を malloc で確保するなんて無駄じゃん。
795デフォルトの名無しさん:2009/01/21(水) 20:25:49
>>794
お前は何を言っているんだ
具体的に何がどう無駄だと思っているんだ
796デフォルトの名無しさん:2009/01/21(水) 20:26:54
そういう人はrubyでも使ったほうがいいじゃん
797デフォルトの名無しさん:2009/01/21(水) 20:30:07
>>795
管理の手間の無駄。
処理時間の無駄。
798デフォルトの名無しさん:2009/01/21(水) 20:52:01
見た目がかっこいいってだけでCを勉強する価値ある?
本当はPascal のほうが好みなんだが、入門書売ってるの見たことないw
俺にとってはプログラミング言語すら見た目重視だからwww
799デフォルトの名無しさん:2009/01/21(水) 20:53:34
>>798の目に何が見えてるのかよくわからん
800デフォルトの名無しさん:2009/01/21(水) 20:54:19
かっこよさならPython だろ
801デフォルトの名無しさん:2009/01/21(水) 20:57:36
Cプログラマにはイケメンが多いってことだろ
802デフォルトの名無しさん:2009/01/21(水) 20:57:44
>>795
ちょっと実装して計ってみた
処理時間30倍ワラタ
小さくて多く呼ばれる関数だったらバカにできないせ
803デフォルトの名無しさん:2009/01/21(水) 20:58:08
>>797
ちょっとした領域というのが本当にちょっとしたものなら、
ちょっとした配列をあらかじめ確保しておくのが管理も処理も効率的である。
ちょっとしたというには大きい領域が頻繁に必要になるなら、
最初から大きい配列を確保しておけばよい(どうせスタックに積まれるのだから)。
常に使われるのはちょっとした領域だけれど、
時折来る大きな領域にも対応したいなら、
普段はあらかじめ確保したちょっとした配列を使い、
大きな領域が来たときだけ大きく確保するほうがきっと効率的である。
もし処理そのものが滅多に呼ばれることがないなら、
処理時間に関する論議はほとんど無意味に近い。

いずれにせよallocaは標準外であり、それを使うための細かい話も環境依存である。
804デフォルトの名無しさん:2009/01/21(水) 20:58:12
せ?orz
805デフォルトの名無しさん:2009/01/21(水) 21:00:46
>>800
区切りがなくて見づらいんだよ!
806デフォルトの名無しさん:2009/01/21(水) 21:01:09
alloca がどれだけ簡単な処理か分かってて言ってんのかね。
807デフォルトの名無しさん:2009/01/21(水) 21:02:24
それこそ環境依存だから一概には言えないけど
スタックに積むだけなら自動変数と同等=タダ同然というのは間違ってる?
808デフォルトの名無しさん:2009/01/21(水) 21:02:49
別に間違ってない
809デフォルトの名無しさん:2009/01/21(水) 21:05:03
微妙に今の話題と関係ないんだけどC99で出来るようになった可変長配列は
どっち系なの?malloc?
810デフォルトの名無しさん:2009/01/21(水) 21:07:45
>>809
alloca相当の実装だと期待していい。
811デフォルトの名無しさん:2009/01/21(水) 21:09:10
allocaはみんななんて読んでる?
812デフォルトの名無しさん:2009/01/21(水) 21:09:37
あろっか
813デフォルトの名無しさん:2009/01/21(水) 21:10:27
オールッカ
814デフォルトの名無しさん:2009/01/21(水) 21:12:21
あろっか
815デフォルトの名無しさん:2009/01/21(水) 21:24:30
他のスレで聞いたのですが反応がなかったのでこちらで聞きます。

setbuf, setvbuf 関数で自らバッファをmallocして設定したとき、fcloseしたらそのバッファもfreeされるのでしょうか?
もしくはそのバッファは(gccでは)どういう運命をたどるのでしょうか。
816デフォルトの名無しさん:2009/01/21(水) 21:28:08
>>804
かな入力なんだろうか?
817デフォルトの名無しさん:2009/01/21(水) 21:59:50
hairetu[num]++

すみません、これはどういうことでしょうか?

また、
hairetu[2] | =

これもどういう風に足しているのでしょうか? =


1たすとは配列の要素番号を1たすということでしょうか?

下の方は、配列2の要素の値のビット数+ 右辺にあるビット数を足したものを
配列2に格納するというこでしょうか?


基本的に& や | があったら、ビットの演算子であるとおもえばよろしいのでしょうか?
818デフォルトの名無しさん:2009/01/21(水) 22:01:49
>>817
マルチ死ね
819デフォルトの名無しさん:2009/01/21(水) 22:17:01
初心者ですいませんがC#なんですけども、10万個くらいの配列のデータの正規化をしたいのですが、どのようにすればいいのかまったくわかりません。誰かご教授いただけないでしょうか?
820デフォルトの名無しさん:2009/01/21(水) 22:17:20
スレ違い
821デフォルトの名無しさん:2009/01/21(水) 22:26:08
俺は初心者でも別に吸っていいと思うんだ。
822デフォルトの名無しさん:2009/01/21(水) 22:46:46
>>821
スレタイ嫁
823デフォルトの名無しさん:2009/01/21(水) 23:01:04
>>822
スレ違いであることを否定はしてないよ。むしろ全面肯定だ。
ただ、吸いませんなんて言わなくてもいいじゃない。吸ってても吸ってなくても同じだよ、ということを言いたい
824デフォルトの名無しさん:2009/01/21(水) 23:02:13
相変わらずスレ違いには厳しいなここは
これじゃ気軽に質問できねえよ
825デフォルトの名無しさん:2009/01/21(水) 23:06:45
そんな厳しいわけでもなかろ。
言語が違うんだからしょうがないべさ。
英語ぺらぺらの人に北京語の質問してもいい答えは期待できないっしょ
826デフォルトの名無しさん:2009/01/21(水) 23:06:57
>>824
たしかにw相手は初心者なんだから該当スレまで誘導くらいしてやれよ、上級者の先生たち
827デフォルトの名無しさん:2009/01/21(水) 23:08:11
意味不明な質問するやつに、質問の意味を質問し返しても、
返事が返ってくる率って、すごい低いしな。
828デフォルトの名無しさん:2009/01/21(水) 23:12:07
入門篇とかスレタイに入ってると糞素人ばっかり集まってきて困る
次からスレタイ修正したほうがよくね?
829デフォルトの名無しさん:2009/01/21(水) 23:14:05
その前にさ、なんでこんなところで、お前らは、初心者を見下しながらレスしてんの?w
830デフォルトの名無しさん:2009/01/21(水) 23:14:44
>>828
だな、馬鹿ばっか相手にするの疲れたお
831デフォルトの名無しさん:2009/01/21(水) 23:19:02
>>829
初心者だからバカにされてるとおもってるの?
だからいつまでもバカにされるんだよ。
832デフォルトの名無しさん:2009/01/21(水) 23:21:05
初心者を見下したことはないよ。
スレを間違えていることを伝えてるだけで
833デフォルトの名無しさん:2009/01/21(水) 23:22:34
みんなで次スレ名の修正案出そうぜ

とりあえず俺は、

【初心者】C言語なら俺に聞け【お断り】
834デフォルトの名無しさん:2009/01/21(水) 23:31:24
【初心者お断り】ガチ規格準拠C専用スレ Part133
http://pc11.2ch.net/test/read.cgi/tech/1201153965/
835デフォルトの名無しさん:2009/01/21(水) 23:57:44
いや、別にこのスレで、あんたがレスしなければいけないという
法律もルールもないけど?答えたくなければ、答えなきゃ良いじゃん?
この世に、自分以外の人間が何人いると思ってるんだ?
2ちゃんねるなんて、ユーザが限られているけど、不特定多数の人が来る場所だし
その中の一人に過ぎない自分が、指定、限定されて答えを求められているわけでもないのに?w
836デフォルトの名無しさん:2009/01/22(木) 00:04:03
俺は年商100億、家賃1ヶ月何千万もするマンションに住んでいますが、
そんな俺でもこのスレを見に来るんだぜ?
837デフォルトの名無しさん:2009/01/22(木) 00:05:50
収支がおかしいだろそれはwwww
838デフォルトの名無しさん:2009/01/22(木) 00:07:32
〜億ジンバブエダラーですが、何か?
839デフォルトの名無しさん:2009/01/22(木) 00:59:31
平面座標上の図形の面積を求めるプログラムだと思うのですが、なぜこれでいいのか理解出来ません。
とくに、計算部分について解説していただけないでしょうか?

なぜi=1なのか、どんな計算をしているのか、sとdは何なのかなど、よろしくお願いします。
手計算で考えてみたのですが、よく分かりません。

#include<stdio.h>
#define MAXV 1000
int main(void){
int n; int i;
double x0, y0, x1, y1;
double v[MAXV][2];
double s, d;

scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%lf%lf",&v[i][0],&v[i][1]);
}
s=0.0;
for(i=1;i<n;i++){
d=0.5*(v[i][1]+v[i+1][1])*(v[i+1][0]-v[i][0]);
s=s+d;
}
d=0.5*(v[n][1]+v[1][1])*(v[1][0]-v[n][0]);
s=s+d;

printf("%6f\n",s);
return (0);
}
840デフォルトの名無しさん:2009/01/22(木) 01:43:27
しつもーんです。
なんで
while(*a++=*b++)
っていうのが通るの?
while文って継続条件だから、
そこにこーゆーコピーするような文ってダメなんじゃないの?
841デフォルトの名無しさん:2009/01/22(木) 01:47:48
>>840
飽きた
842デフォルトの名無しさん:2009/01/22(木) 01:48:08
>>840
じゃ
while( 0) ;
ってダメ?
843デフォルトの名無しさん:2009/01/22(木) 01:50:03
>>842
あ・・・・。
そっか・・・・。
んー・・・。
どゆこと???
844デフォルトの名無しさん:2009/01/22(木) 01:50:48
代入文は条件文を包含する関係にあります
845デフォルトの名無しさん:2009/01/22(木) 01:51:19
式ならなんでもいいから
846デフォルトの名無しさん:2009/01/22(木) 01:51:45
>>844
じゃあ、条件文と兼ねてるってことですか。。。
わかりましたー。
あざます。
847デフォルトの名無しさん:2009/01/22(木) 01:53:24
式に限らず値として評価できるものなら何でもいいよね
848デフォルトの名無しさん:2009/01/22(木) 02:54:12
>>815
普通に考えたら free 出来るかどうかわからないから free されるはず
ないよね

とりあえず FreeBSD のソースを見てみても setvbuf で設定した場合は
(__SMBFが落ちるので) free しないようになってる
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdio/fclose.c?rev=1.12
849デフォルトの名無しさん:2009/01/22(木) 03:08:19
>>847
Cだとそれはすべて式に分類される。1のようなリテラル、hogeのような変数単体であっても。
850デフォルトの名無しさん:2009/01/22(木) 03:10:39
>>839
ざっと見ると、図形を縦方向に千切りにすると
十分細ければ一つ一つは台形に近似できるので、

  全体の面積=台形の面積の和

にしてるプログラムに見える。(2つ目のd=の計算がちょっと分からないけど)
その細切れが d (deltaの略?)、合計が s (sumの略?)

i = 1 にしているのは、これを作った人が配列の底を 1 にしただけ
C言語ではもちろん配列の底は 0 だけど、この場合配列は固定サイズだから
特に問題はない。BASIC とか FORTRAN 出身の人なんじゃないかね
851デフォルトの名無しさん:2009/01/22(木) 04:19:46
>>848
ありがとうございます。言われてみればググルよりもfreebsdのsrcみれば早かったですね。
852デフォルトの名無しさん:2009/01/22(木) 06:17:41
>>850
生半可な知識乙。
台形近似まで判っていて、なんで最後にもう一回台形の面積を足しているか判んないのかね。
3点入力したとしてシミュレーションしてみな。それでも判らなければ馬鹿だ。

>>839
それはいいとして、そのプログラムを書いた奴は随分いい加減だな。x0, y0, x1, y1は何のためにあるんだ?w
853デフォルトの名無しさん:2009/01/22(木) 10:56:17
小数点の計算をしたいのですが、

double a;

a = 1 / 100;
printf("%f",a);

こうした場合に0.01となりません。
どうすれば計算できますか?
854デフォルトの名無しさん:2009/01/22(木) 10:56:56
1.0 / 100
855853:2009/01/22(木) 11:21:10
>>854
ありがとうございます。

パーセントの計算をしたいのですが

a = 1.0 - (1.0 / 100);

と計算したいのですがうまくいかないのですが
よろしくお願いします。
856デフォルトの名無しさん:2009/01/22(木) 11:29:40
>>855
ただ、うまくいかない、といわれたって
857デフォルトの名無しさん:2009/01/22(木) 11:46:07
浮動小数点 C言語 誤差
あたりでググってからまた来い。
858855:2009/01/22(木) 11:48:21
<< 856
すいません。
結果は1.000000となってしまい計算が合いません。
859デフォルトの名無しさん:2009/01/22(木) 11:53:09
誤差は出るけど、それは無いわ。ソース出してみ。
860デフォルトの名無しさん:2009/01/22(木) 12:00:32
俺は
0.990000
になったよ
>>858
861デフォルトの名無しさん:2009/01/22(木) 12:02:12
できる方いらっしゃいましたらお願いします!

整数z(2以上の値)を入力し、以下のような図形をn行の文字で表示する
プログラムを作成せよ。

例.
10 <--キーボードからzの値を入力

1.*********
2..********
3...*******
4....******
5.....*****
6......****
7.......***
8........**
9.........*
10..........

見えにくいですが、ドットがアスタリスクに反比例してでかくなってます。

862デフォルトの名無しさん:2009/01/22(木) 12:02:51
>>861
死ね、消えろ
863858:2009/01/22(木) 12:03:34
>>859
すいません。
上のa = 1.0 - (1.0 / 100); の計算では0.99とでました。
しかし
double a, b;

scanf("%f" &b); // b = 1.0
a = 1.0 - (b / 100);

printf("%f",a);

としたとき1.000000となってしまいます。
864デフォルトの名無しさん:2009/01/22(木) 12:06:31
scanf("%lf" &b);
865デフォルトの名無しさん:2009/01/22(木) 12:06:52
>>863
%lf
866デフォルトの名無しさん:2009/01/22(木) 12:07:05
printf("%f",b);
やってみな
867デフォルトの名無しさん:2009/01/22(木) 12:12:17
>>861
#include <stdio.h>

int main()
{
char *s[] = {".*********",
"..********",
"...*******",
"....******",
".....*****",
"......****",
".......***",
"........**",
".........*",
".........."};
int n = 1, i;
scanf("%d", &n);
for (i = 0; i < n; ++i) {
if (i < 9) {
puts(s[i]);
} else {
puts(s[9]);
}
}
return 0;
}
868861:2009/01/22(木) 12:19:27
>>867
早い回答、ありがとうございます!
869デフォルトの名無しさん:2009/01/22(木) 12:19:59
%lf でできました。
ありがとうございました。
870デフォルトの名無しさん:2009/01/22(木) 12:23:18
>>868
100とか入力すると楽しめるかも
871デフォルトの名無しさん:2009/01/22(木) 12:31:17
ランダムに1か2の数を得るプログラムを作りたいのですが
srand(10);
rand() % 2 + 1;
としたとき必ず1から始まってしまうのですが何か
良い方法はないでしょうか?
872デフォルトの名無しさん:2009/01/22(木) 12:33:02
>srand(10);
としなけりゃいい
873デフォルトの名無しさん:2009/01/22(木) 12:33:12
>>871
srandの意味調べなおせゴミ
874デフォルトの名無しさん:2009/01/22(木) 12:39:50
>>872 873
すいませんでした。
rand() % 2 + 1;
だけでやってみたところ、
次は2から始まってしまいます。
875デフォルトの名無しさん:2009/01/22(木) 12:41:13
だからsrandにいつも違う値を食わせるんだよ。
実行時に一回だけ現在時刻(秒数)を入れてやる方法が一般的
876デフォルトの名無しさん:2009/01/22(木) 13:37:06
>>839
本当に面積を出すコードなのか?
面積を出す公式が少し違うけど、本当ならアルゴリズムスレで聞いたらどうだろう。
877デフォルトの名無しさん:2009/01/22(木) 13:39:59
最近はゴミ見たいな奴が多くて困る
878デフォルトの名無しさん:2009/01/22(木) 14:04:01
ゴミを見たい奴なんているのか?
879デフォルトの名無しさん:2009/01/22(木) 14:05:09
オレオレ
880デフォルトの名無しさん:2009/01/22(木) 14:40:44
>>871
ついでに言うとrand()の返す値の下位ビットはあまりランダムでないかもしれない
(1,2,1,2,1,2, …みたいになる可能性がある)
そういう場合には上位ビットを使うこと

rand()/((RAND_MAX+1)/2) + 1
881デフォルトの名無しさん:2009/01/22(木) 14:40:58
>>875
できました。
ありがとうございました。
882名無しの大学生:2009/01/22(木) 14:57:30

プログラムからテキストファイルdate.txt(メモ帳)のデータ10個(7.8 3.2 4.
0 5.8 6.9 1.5 2.8 6.1 3.8 0.7みたいな感じの配列)を読み込む
最大値、最小値、平均値を求め、ディスプレイおよび、ファイルout.txtに出力
小数点以下2桁まで表示すること


1つの整数を引数とし、引数が素数であれば1、そうでなければ0を返り値とす
るサブルーチンをつくる
これを用いて自然数n以下の素数のうち最大のものを表示するプログラムをつく
る。


この2つをといてください。。。
まったくわかりません
Visual C++ 2008 Express Editionです
883デフォルトの名無しさん:2009/01/22(木) 14:58:36
884デフォルトの名無しさん:2009/01/22(木) 15:49:15
>>882
ファイルの入出力使えば終わります、以上。
885デフォルトの名無しさん:2009/01/22(木) 17:35:41
scanf("%d",&n)の&にはどんな意味があるのでしょうか?

printf("%d",&n)という書き方は間違いで、&は不要ですよね?
&の意味を教えてください。
886デフォルトの名無しさん:2009/01/22(木) 17:38:00
>>885
アドレス渡しています
まずは教本一冊ぐらい読むことを目指してはいかがでしょうか
887デフォルトの名無しさん:2009/01/22(木) 19:50:11
>>885
c言語では関数の引数は、コピーが渡されますので、
関数内では元の変数を書き換えできません。。
ですから変数のアドレス(&)のコピーを渡して、
直接関数(scanf)内で変数に代入出来るようにしています。
888デフォルトの名無しさん:2009/01/22(木) 20:08:45
配列名そのものは配列の先頭要素のアドレスと同値であるとありますが
配列名そのものは例外を除いて配列そのものを指し、その結果、
配列の要素を指すポインタに成り下がる、という段階を踏んでいる
という解釈は正しいでしょうか?問題点があればご指摘下さい。
889888:2009/01/22(木) 20:10:03
間違えました。
配列名そのものは配列そのものを指し、その結果、
例外を除いて配列の要素を指すポインタに成り下がる
です。
890デフォルトの名無しさん:2009/01/22(木) 21:00:59
>>888
おk
標準規格も同じ解釈を取っている
891デフォルトの名無しさん:2009/01/22(木) 21:15:01
「その結果」は余分じゃない?意味がわからない
892デフォルトの名無しさん:2009/01/22(木) 22:09:08
>>880
いまどきそんな質の悪いrand()はないよ。
rand() % 2 で十分。
直感的でない書き方してバグるともともこもないじゃん。
893デフォルトの名無しさん:2009/01/22(木) 22:24:48
昔のglibcはひどかったな
894デフォルトの名無しさん:2009/01/22(木) 22:28:06
>>892
ないという保証はどこにもない。
実際に使うかどうかは別として知識として持っておく必要はある。
895デフォルトの名無しさん:2009/01/22(木) 22:32:48
だが
>>880
はありえない。馬鹿じゃねーの?w
896デフォルトの名無しさん:2009/01/22(木) 22:33:51
>>895
昔のUNIXはこうなってたけど?
897デフォルトの名無しさん:2009/01/22(木) 22:35:43
RAND_MAX + 1 がオーバーフローするという件についてか
898デフォルトの名無しさん:2009/01/22(木) 22:36:48
本当のバカ程、バカと言う言葉を当たり前のように使う
899デフォルトの名無しさん:2009/01/22(木) 22:38:05
なんで0, 1が出てくるのか、なぞだったんだけど
>>897
なのか、どうも
900デフォルトの名無しさん:2009/01/22(木) 22:38:42
VC++ だとオーバーフローしないが、
gcc だとオーバーフローする。
901デフォルトの名無しさん:2009/01/22(木) 22:39:36
>>897
上位ビット取りなさいって言って、
rand() >> 16 とか教えてるやつも目撃したことあるな。
VCのRAND_MAXなんて、0x7fffなのに。
902デフォルトの名無しさん:2009/01/22(木) 22:43:21
ワークを realloc()でちょっとづつ増やしてるコードに、
それじゃ遅いから、まとまった単位で増やすようにしなさいって
アドバイスもよく見るな。
そんなことしても、たいしてっていうかぜんぜん速くならないし、
コードが複雑になってるだけって。
903デフォルトの名無しさん:2009/01/22(木) 22:44:55
凄いループの中なら改善になると思うけどね。
904デフォルトの名無しさん:2009/01/22(木) 22:46:56
JPEGファイルをfopenするとRGB色 8ビット x 3 の並びで読み込み可能ですか?
905デフォルトの名無しさん:2009/01/22(木) 22:47:30
fgetc()を使うより、fread()でまとめて読むほうがだいぶ効率いいけど、
fgetc()を使ったコードが貼られても、さすがに、使うなってアドバイス
するやつはいないな。
906デフォルトの名無しさん:2009/01/22(木) 22:49:44
>>905
単純コピー処理を fgetc 使って実装してたらぶん殴るけどな。
907デフォルトの名無しさん:2009/01/22(木) 22:50:10
>>904
なりません、
908デフォルトの名無しさん:2009/01/22(木) 22:50:32
>>904
お前には無理
909デフォルトの名無しさん:2009/01/22(木) 22:51:14
>>908
氏ねカス
910デフォルトの名無しさん:2009/01/22(木) 22:52:15
>>909
偽者は詩ね
911デフォルトの名無しさん:2009/01/22(木) 23:10:39
>>906
どのみちCの標準関数つかってたら大差ないだろ。
912デフォルトの名無しさん:2009/01/22(木) 23:13:24
VCのRAND_MAXってそんな小さかったのかw
初めて知った
913デフォルトの名無しさん:2009/01/22(木) 23:24:03
大至急聞きたいんだが プログラムで点数ごとに積み上げグラフを作るプログラムを
作りたいんだがうまくいかなし期限波明日。。


作りたいプログラム

テストを5回実施して 5回分の点数を配列に入れる
ten[5]={64,53,36,23,36}←これはあらかじめ格納されてるとする。

んで縦100点までで、テスト点を100点で5回ぶん割る
d=100;
割って1がたつなら ”*”を出力。それ以外は” ”を出力する。

終わったら 
d=d-10;
でどんどん引いていいって最終的に↓見たいに出力するようにしたいんだ。


  100点 * ** 
  90点 * ***
  80点 *****
  70点 *****
  60点 *****
 ・   ・
   ・   ・
   ・   ・
   ・   ・
          

別に子のやり方じゃなくても積み上げ式のがつくれっればいいんだ!力を貸してくれ!       
914デフォルトの名無しさん:2009/01/22(木) 23:25:00
わかった。
915デフォルトの名無しさん:2009/01/22(木) 23:26:14
がんばれ!
916デフォルトの名無しさん:2009/01/22(木) 23:26:59
>>913
ちょっと待ってろ
917デフォルトの名無しさん:2009/01/22(木) 23:28:54
>>914
>>916
おまいら・・・(;ω;)
すまねぇ 結構前に似た感じの作ったんだがlocateで位置を指定しても斜めに*が表示されたりして
まったく積み上げにならんのですはい><;
918デフォルトの名無しさん:2009/01/22(木) 23:30:36
コンソール出力がデフォなC言語処理系でやるよりか
Excelとかでやるほうが利口なので、そっちで聞いたほうが
いいと思われ。 >>913
この当たりで聞けば、回答してもらえる確率が高いと思われ

Excel VBA質問スレ Part9
http://pc11.2ch.net/test/read.cgi/tech/1228372971/
919デフォルトの名無しさん:2009/01/22(木) 23:36:51
>>918
言ってることが難しくてよくわからんのだがC言語でつくらなければならんのだ^^;

友達が配列に5回分の点数を格納するプログラムを作ってくれて、俺がその点を使って
積み上げグラフをつくらんと遺憾のだ! 

以前いい感じの積み上げがつくれて ↓ ↓の積み上げの位置に入れようとしたんだが 綺麗に入らなくてまいった。。



printf("    ┏━━━━┳━━━━┓   ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃たたかう┃そうび ┃   ┃                       ┃\n");
printf("┃じゅもん┃どうぐ ┃ 100%%┃                       ┃\n");
printf("┃ぼうぎょ┃にげる ┃   ┃                       ┃\n");
printf("┃ああああ┃ああああ┃   ┃                       ┃\n");
printf("┃ああああ┃ああああ┃   ┃                       ┃\n");
printf("┗━━━━━━━━━┛   ┃                       ┃\n");
printf("             80%%┃                       ┃\n");
printf("              ┃                       ┃\n");
printf("              ┃                       ┃\n");
printf("              ┃                       ┃\n");
printf("              ┃                       ┃\n");
printf("             60%%┃                       ┃\n");
920デフォルトの名無しさん:2009/01/22(木) 23:40:45
友達なら一緒に考えればいいのに
921デフォルトの名無しさん:2009/01/22(木) 23:42:01
>>920
遠方の友達だし、ソイツはいろいろ忙しい奴だから時間帯があわんのです。。
922デフォルトの名無しさん:2009/01/22(木) 23:46:13
まあいいとして、環境は。
923デフォルトの名無しさん:2009/01/22(木) 23:47:27
分担が変すぎるな
924デフォルトの名無しさん:2009/01/23(金) 00:06:30
>>922
.NETです。
学校でグループ課題なんでSEも生徒なんで分担は適当です;;
925デフォルトの名無しさん:2009/01/23(金) 00:07:58
>>924
スレチ
死ね
926デフォルトの名無しさん:2009/01/23(金) 00:08:45
>>924
OS XP
言語 C言語 
コンパイラ Visual Studio.NET2003
927デフォルトの名無しさん:2009/01/23(金) 00:11:44
.NETが、どうしても.NEET見えてしまう俺の目は、たぶん正常
928デフォルトの名無しさん:2009/01/23(金) 00:29:01
>>916に期待してたんだが彼は作成中かな?
929デフォルトの名無しさん:2009/01/23(金) 00:34:16
>>928
普通に10で割って64点なら6個積み上げ53点なら5個積み上げってのにしたほうが
>>913に比べてなんか効率いいなぁと思ったけどどうなんだ
930デフォルトの名無しさん:2009/01/23(金) 00:35:38
>>928
いや、待っててといっただけで別に作成などしていないが
931デフォルトの名無しさん:2009/01/23(金) 00:36:14
つーか、>913の質問のポイントはどこなんだ?
カラムが揃わないのだけが問題なら先ずはそのソースを晒せよ。調整くらいならしてやるよ。
932デフォルトの名無しさん:2009/01/23(金) 00:42:37
>>929
そっちのがいいですな!

>>930
orz

>>931
説明不足しまくっててすまん。
それが書いたプログラムを学校に忘れてないんだ。。
実質1からの作成だ。

まずは普通に点数をつみあげにしたい。
63点なら■を縦に6つつむ見たいな感じで。

それを>>919でprintfで書きまくってるグラフの中に入れたいんだ。
もっと効率いいやり方があるかもしれんが俺ができそうなのはこの作り方くらいとおもってる。
933デフォルトの名無しさん:2009/01/23(金) 00:44:50
よし判った、任せろ。

それはさて、>919の時点で出力がずれてしまうのはいかがなものかと。
もう少しまともに書けよ、とは思った。
934デフォルトの名無しさん:2009/01/23(金) 00:45:27
>>919
#include <stdio.h>
int main(){
int ten[]={84,73,100,93,66};
int d,i,k=sizeof(ten)/sizeof(ten[0]);
printf("┏━━━━┳━━━━┓   ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃たたかう┃そうび ┃   ┃                       ┃\n");
for(d=100;60<=d;d-=4){
switch(d){
case 100:printf("┃じゅもん┃どうぐ ┃ 100%%┃    ");break;
case 96:printf("┃ぼうぎょ┃にげる ┃   ┃    ");break;
case 92:printf("┃ああああ┃ああああ┃   ┃    ");break;
case 88:printf("┃ああああ┃ああああ┃   ┃    ");break;
case 84:printf("┗━━━━━━━━━┛   ┃    ");break;
case 80:printf("             80%%┃    ");break;
case 76:printf("              ┃    ");break;
case 72:printf("              ┃    ");break;
case 68:printf("              ┃    ");break;
case 64:printf("              ┃    ");break;
case 60:printf("             60%%┃    ");break;
}
for(i=0;i<k;i++){
if(d<=ten[i]){
putchar('*');
}else{
putchar(' ');
}
printf("   ");
}
printf("  ┃\n");
}
}//俺の力ではここまでだな。
935デフォルトの名無しさん:2009/01/23(金) 00:51:40
>>933
本当に説明不足だらけですまなかった。。
俺のどっとネット上では体裁は整ってるんだがなw

今まで縦にものをつむプログラムを書いたことが無くてよくわからないんだ。
とりあえず縦につめればlocateで位置指定してprintf嵐のグラフに叩き込めるはずなんだが


>>934
おおwwwこんな感じだwwwww
ten配列の中身は変わるから川ってもちゃんとつみあがるのかな?
936933:2009/01/23(金) 00:52:00
もう一つ。要は5回分を10で割った上で足した分だけグラフになればいいのか?
で、>919は60%から上しかないが下も含むということか? つまり、こんな出力か?
┏━━━━┳━━━━┓   ┏━━━━━━━━━━━━━━━━━━━━━━━┓
┃たたかう┃そうび ┃   ┃                       ┃
┃じゅもん┃どうぐ ┃ 100%┃                       ┃
┃ぼうぎょ┃にげる ┃   ┃                       ┃
┃ああああ┃ああああ┃   ┃                       ┃
┃ああああ┃ああああ┃   ┃                       ┃
┗━━━━━━━━━┛   ┃                       ┃
             80%┃■                      ┃
              ┃■                      ┃
              ┃■                      ┃
              ┃■                      ┃
              ┃■                      ┃
             60%┃■                      ┃
              ┃■                      ┃
中略
              ┃■                      ┃
              ┃■                      ┃
              ┃■                      ┃
             0%┃■                      ┃
937デフォルトの名無しさん:2009/01/23(金) 00:55:52
locateってなんぞ?
938デフォルトの名無しさん:2009/01/23(金) 00:58:38
>>936
そうだ!そうだ!こんなんだ!!!
>>919の0%まであるやつだw


>>937
windowsヘッダだ
locateは座標指定(カーソル移動)できるんだ。
939933:2009/01/23(金) 01:00:23
// 文字列を選択する
static const char * sel(bool var) {return var ? "■" : " ");}

// 超横着版。普通は、ループで処理するもんだがなw
void func()
{
int ten[]={84,73,100,93,66};
total = ten[0] / 20 + ten[1] / 20 + ten[2] / 20 + ten[3] / 20 + ten[4] / 20; //10じゃなくて20で割ってみた
printf("┏━━━━┳━━━━┓   ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃たたかう┃そうび ┃   ┃                       ┃\n");
printf("┃じゅもん┃どうぐ ┃ 100%%┃%s                      ┃\n", sel(total == 100));
printf("┃ぼうぎょ┃にげる ┃   ┃%s                      ┃\n", sel(total >= 96));
printf("┃ああああ┃ああああ┃   ┃%s                      ┃\n", sel(total >= 92));
printf("┃ああああ┃ああああ┃   ┃%s                      ┃\n", sel(total >= 88));
printf("┗━━━━━━━━━┛   ┃%s                      ┃\n", sel(total >= 84));
printf("             80%%┃%s                      ┃\n", sel(total >= 80));
printf("              ┃%s                      ┃\n", sel(total >= 76));
// 中略
printf("              ┃%s                      ┃\n", sel(total >= 12));
printf("              ┃%s                      ┃\n", sel(total >= 8));
printf("              ┃%s                      ┃\n", sel(total >= 4));
printf("             0%%┃%s                      ┃\n", sel(total >= 0));
}
940933:2009/01/23(金) 01:05:59
実際には
void func(int * ten)
{
// 前略
// 中略
// 後略
}
みたいな感じかな。真面目に書き直そうかと思ったけど、冷えたからお風呂入ってくるw
941デフォルトの名無しさん:2009/01/23(金) 01:06:23
>>939
うお!すごいです! ありがたいんですが、voidfuncやスタチックはまだ習ってないンで使ってたらあやしまれちゃいます(笑)
942デフォルトの名無しさん:2009/01/23(金) 01:06:58
>>940
おつかれでした!ありがとうです^^
943デフォルトの名無しさん:2009/01/23(金) 01:09:05
じゃぁ
int func()

に帰ればいいよ
警告は無視すればいいよ
944デフォルトの名無しさん:2009/01/23(金) 01:12:19
>>943
了解です!ありがとうです!
945デフォルトの名無しさん:2009/01/23(金) 01:19:57
できれば>>934さんがつくった奴みたいな感じがいいです。
他の方のもすごいですが難しくて^^;

>>934さんのは66点でも*が2こしか積みあがらないんですが、条件式のどこがいけないのかよくわからないです。。

946デフォルトの名無しさん:2009/01/23(金) 01:34:45

case 60:printf("             60%%┃    ");break;
のあとに↓見たいにどんどんマイナス4していった数値を書いたんですが

case 56:printf("              ┃  ");break;
case 52:printf("┏━━━━━━━━━┓   ┃    ");break;                  
case 48:printf("┃平均       ┃   ┃    ");bre


error C2018: 文字 '0x81' は認識できません。
とエラーがでてます。。 これは全角のエラーですよね? >>934さんのにも普通に全角がつかってあるんですがコンパイルとおりますね・・なぜ?!
947デフォルトの名無しさん:2009/01/23(金) 01:36:42
>>946
全角空白が行末についてるぞぼけ
948デフォルトの名無しさん:2009/01/23(金) 01:38:34
>>947
あなたが神か!
949デフォルトの名無しさん:2009/01/23(金) 01:51:44
平均ってなんだろ・・・
950デフォルトの名無しさん:2009/01/23(金) 01:56:11
しんどかったですが何とか出来上がりました!ありがとうです^^
ネットならではの素早い回答ありがとうでした。
よくできたプログラムなので学校の友達に見せることができそうです!^^

ありがとうございました
ほんとうにお世話になりました^^
どっと疲れたんで
もう寝ます。

951933:2009/01/23(金) 02:10:05
なんだ、嫌われたのねw
つーか、飽きたから寝るわ。

と言いつつ。
うーむ、sel((total == 100)じゃなくてtotal == 100 ? "■" : " "でも難しいと言われたのかしらw
952デフォルトの名無しさん:2009/01/23(金) 02:11:05
>>950
その学校の友達とやらはここ見てたりしないのか
953デフォルトの名無しさん:2009/01/23(金) 02:21:16
ここには人がいる、有人さ、なんつって
954デフォルトの名無しさん:2009/01/23(金) 02:25:03
はい。
955デフォルトの名無しさん:2009/01/23(金) 02:38:31
最終的に使い物になるのか・・・?
#include <stdio.h>
#include <memory.h>
char buf[47];int ten[]={84,73,100,0,93};
static const char * sel(int d) {
int i,k=sizeof(ten)/sizeof(ten[0]);
memset(buf,'\x20',46);
for(i=0;i<k;i++){if(d<=ten[i]){buf[8+i*8]='*';}else{buf[8+i*8]=' ';}}
buf[46]='\0';
return buf;
}
void func(){
printf("┏━━━━┳━━━━┓   ┏━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃たたかう┃そうび ┃   ┃                       ┃\n");
printf("┃じゅもん┃どうぐ ┃ 100%%┃%s┃\n", sel(100));
printf("┃ぼうぎょ┃にげる ┃   ┃%s┃\n", sel(96));
printf("┃ああああ┃ああああ┃   ┃%s┃\n", sel(92));
printf("┃ああああ┃ああああ┃   ┃%s┃\n", sel(88));
printf("┗━━━━━━━━━┛   ┃%s┃\n", sel(84));
printf("             80%%┃%s┃\n", sel(80));
printf("              ┃%s┃\n", sel(76));
printf("〜中略〜〜中略〜〜中略〜〜中略〜〜中略〜〜中略〜〜中略〜〜中略〜〜中略〜\n");
printf("              ┃%s┃\n", sel(12));
printf("              ┃%s┃\n", sel(8));
printf("              ┃%s┃\n", sel(4));
printf("             0%%┃%s┃\n", sel(1));
}
int main(){
func();
return 0;
}
956デフォルトの名無しさん:2009/01/23(金) 03:55:01
すみません。
C言語の文字列の配列の中身をソートするプログラムを組みたいのですが
何か良い方法はありますか。

教えてください。
957デフォルトの名無しさん:2009/01/23(金) 04:00:00
あります。
958デフォルトの名無しさん:2009/01/23(金) 04:05:08
おしえていただけますでしょうか?
959デフォルトの名無しさん:2009/01/23(金) 04:23:32
ググレカス^^
960デフォルトの名無しさん:2009/01/23(金) 04:23:57
qsort
961デフォルトの名無しさん:2009/01/23(金) 05:10:27
クソート
962デフォルトの名無しさん:2009/01/23(金) 05:14:02
クイックソート、速く言うために略して クソート なんつって
963デフォルトの名無しさん:2009/01/23(金) 05:16:53
うん?
964デフォルトの名無しさん:2009/01/23(金) 08:41:10
なんかさ、こういうところでカンニングして
不合格になるべき人間が合格しちゃうってのはマズイよな
965デフォルトの名無しさん:2009/01/23(金) 19:07:28
カンニングは相方がいなくても有名ですが、何か?
966デフォルトの名無しさん:2009/01/23(金) 22:08:57
テンプレ


C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
 C/C++の宿題を片付けます 122代目
 http://pc11.2ch.net/test/read.cgi/tech/1232001038/

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

前スレ
 C言語なら俺に聞け(入門篇) Part 42
 http://pc11.2ch.net/test/read.cgi/tech/1231180205/
過去スレ
  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
967デフォルトの名無しさん:2009/01/24(土) 10:56:49
#include<stdio.h>
int main(void){

int no,nu,na;
int tw;
double num;

printf("1回目の得点は?\n");
scanf("%d",&no);
printf("2回目の得点は?\n");
scanf("%d",&nu);
printf("3回目の得点は?\n");
scanf("%d",&na);

tw=no+nu+na;
num=(double)tw/3;
printf("合計点:%d点\n",tw);
printf("平気点:%5.1lf点\n",num);
return(0);
}

小数出るけどどんな計算しても .0 になっちゃう。。。
何がいけないのかな、、、
968デフォルトの名無しさん:2009/01/24(土) 11:11:30
>>967
num=(double)tw/3; -> num=(double)tw/3.0;
969デフォルトの名無しさん:2009/01/24(土) 11:15:46
printf("平気点:%5.1f点\n",num);

に直したら?
古いコンパイラだと、本当に不味かったはずだから
970デフォルトの名無しさん:2009/01/24(土) 11:25:20
971デフォルトの名無しさん:2009/01/24(土) 11:31:32
いや、比較的新しいのだと、c99対応のオプション付けなくても警告出したりしつつも表示してくれるじゃないか
972デフォルトの名無しさん:2009/01/24(土) 11:35:35
>>967
手元にあるgcc-3.4.4はそのままで問題なく動いたよ

1回目の得点は?
7
2回目の得点は?
8
3回目の得点は?
10
合計点:25点
平気点: 8.3点
973デフォルトの名無しさん:2009/01/24(土) 11:39:34
>>967
%lf以外に悪いところはなさそうだが
ちなみにコンパイラは何
974デフォルトの名無しさん:2009/01/24(土) 11:42:34
%lfでも平気だろってことか
975デフォルトの名無しさん:2009/01/24(土) 12:10:44
だから、%g使おうぜ。
976デフォルトの名無しさん:2009/01/24(土) 13:36:49
>>969の通りにしたらできました。

返信してくれた人ありがとうございました。
977デフォルトの名無しさん:2009/01/24(土) 13:50:35
c89(多分)のbcc5.5でも同様だった

1回目の得点は?
7
2回目の得点は?
8
3回目の得点は?
10
合計点:25点
平気点: 8.3点
978デフォルトの名無しさん:2009/01/24(土) 13:59:13
たいていは独自拡張で対応している、
そもそも間違える人が多すぎで大概のコンパイラが独自拡張して、挙句標準に取り込まれたようなものなんだから

もうちょい古いgccなら0.0になっちゃうよ
979デフォルトの名無しさん:2009/01/24(土) 14:01:18
>>970みたいにscanf()のと混同するヤツ多すぎたんだろうな
980デフォルトの名無しさん:2009/01/24(土) 15:27:05
関数の中で値のチェックをしたいんですけど、
もし、比較する値が同じであれば
return 1;
で1を返したいんです。

もし違うのであればそのまま関数を抜けたいんです。
関数を抜ける方法ってありますか?
981デフォルトの名無しさん:2009/01/24(土) 15:29:38
>>980
そのままとは?
982デフォルトの名無しさん:2009/01/24(土) 15:32:58
1以外の何かを返せ
983デフォルトの名無しさん:2009/01/24(土) 15:33:59
>>980
戻り値の有無を切り替える事は出来ない。
984デフォルトの名無しさん:2009/01/24(土) 15:38:27
同じでも違っても関数は何かを返さないといけない
違う場合にその値を使わないのであれば
関数の呼び出し側で結果を使わず捨てればいい
985デフォルトの名無しさん:2009/01/24(土) 15:44:29
void f()でも?
986デフォルトの名無しさん:2009/01/24(土) 15:49:38
途中で関数を抜けてメインに戻る。
なんてのは出来ないって事ですよね。
戻り値。。。
もうちょっと考えて見ます。
987デフォルトの名無しさん:2009/01/24(土) 15:51:01
いふ文で分岐させればいいだろ
988デフォルトの名無しさん:2009/01/24(土) 15:54:04
途中でreturnすることもできるが、関数が戻り値を必要とするなら、そこでも戻り値が必要になる。
989デフォルトの名無しさん:2009/01/24(土) 15:56:10
980の関数がどんな関数なのかわからないが、
比較して同じであれば1を返すなら、そうでない場合は0を返すのが普通だと思う。

返した1をどこで利用するつもりかはしらないが、
そこに値を返さないで正常な動作になるとは考えにくいが。
990デフォルトの名無しさん:2009/01/24(土) 15:56:52
setjmp使えばよろし
991デフォルトの名無しさん:2009/01/24(土) 17:20:04
きっと、「値を返す」が「メインに戻る」処理を兼ねて
いることがわかって無いんだろうな。
992デフォルトの名無しさん:2009/01/24(土) 17:48:48
コンソールのUIはncursesライブラリを使えよ・・
993デフォルトの名無しさん:2009/01/24(土) 18:37:52
994デフォルトの名無しさん:2009/01/24(土) 18:40:39
995デフォルトの名無しさん:2009/01/24(土) 18:43:57
996デフォルトの名無しさん:2009/01/24(土) 18:49:47
>>979みたいにアンカーだけで内容が書かれていないのに、
相手が何をレスしようとしたか、勝手に想像するヤツ多すぎたんだろうな
997デフォルトの名無しさん:2009/01/24(土) 18:51:10
2chでアンカーにレス番だけでバカにするつもりじゃないって言い訳は通らないw
998デフォルトの名無しさん:2009/01/24(土) 18:54:41
999デフォルトの名無しさん:2009/01/24(土) 18:56:33
埋まりそうだからとりあえずこっちこい。
【初心者お断り】ガチ規格準拠C専用スレ Part133
http://pc11.2ch.net/test/read.cgi/tech/1201153965/l50
1000デフォルトの名無しさん:2009/01/24(土) 18:57:03
おまえら全員氏ね
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。