[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 08/05 19:06 / Filesize : 223 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門編)Part 95



1 名前:デフォルトの名無しさん [2012/01/13(金) 22:05:06.14 ]
C言語の*入門者*向け解説スレッドです。

★前スレ
C言語なら俺に聞け(入門編)Part 94
toro.2ch.net/test/read.cgi/tech/1324648274/
★過去スレ
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
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 155代目
toro.2ch.net/test/read.cgi/tech/1325685876/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

長くなりそうなコードはcodepadに貼り付けてもいいでしょう
codepad.org/

666 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 20:53:46.83 ]
>>665
兆か京のけた?

667 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 21:06:41.65 ]
>>666
ええええ...
どうやって開発者は書いたんだ。
大学のレポート課題です。お願いします。

668 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 21:13:07.13 ]
tiny Cならそんなに行数としては少ないかもね
大学の課題だったら自分で調べるといい

669 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 21:13:07.47 ]
Googleの入試並みの問題だなw
さぁどっから推定しようか。人数?会社?機器?PCの台数?

670 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 21:16:41.93 ]
C言語で書かれたプログラムって、世界に何本くらいあるのかな?

671 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 21:19:47.19 ]
>>669
C言語開発者が開発に取り組んだ時の、動機、人事的な背景を考察せよ。
っていう問題。

672 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 21:22:35.45 ]
Cが無いときのソースコードはCじゃないってことはわかるよな。

673 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 21:26:37.29 ]
>>672
直接機械をいじってプログラムを作ってたんだろ?
静電気とか走っただろうな、手袋してたろうけど。

674 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 21:27:30.83 ]
それ、おもしろいことでも言ってるつもりなんか?



675 名前: ◆QZaw55cn4c mailto:sage [2012/01/26(木) 21:52:33.58 ]
>>663
(int)(rand() / (RAND_MAX + 1.0) * 26)
でいいんじゃないですか?
+1.0 するのは RAND_MAX

676 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 21:56:10.58 ]
GCCはGCCでコンパイルします。

677 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 22:03:02.70 ]
世の中のCで書かれたコードの総行数と勘違いしている人がいるね。

>>672
そうなんだけど、それだけじゃ△だな

678 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 22:07:50.39 ]
>>670の書いた通りわざと書いてるのを勘違いしてるバカがいるな。

679 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 22:10:26.26 ]
曖昧な質問だから、勘違いと言い切るのはどうかと思う。
C言語のソースコードって言っても、どのコンパイラの話かも不明だし。

680 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 22:13:34.28 ]
はいはい。

681 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 22:38:25.74 ]
#include <stdio.h>
#define WIDTH 10
#define HEIGHT 20
#define DEPTH 40

double temperature[DEPTH][WIDTH][HEIGHT];
int calc_flag[DEPTH][WIDTH][HEIGHT];

int main(){
int h,w,d;
for(h=0;h<=HEIGHT;h++){
for(w=0;w<=WIDTH;w++){
for(d=0;d<=DEPTH;d++){
temperature[d][w][h]=20.0;
calc_flag[d][w][h]=1;
}}}
printf("%f\n",temperature[0][0][0]);
fflush(stdin);
getchar();
return 0;
}

三次元配列の計算がうまくいきません。
上は最も単純な例ですが、このコードを実行しても表示が0.000000となってしまいます。
しかし、calc_flag[d][w][h]=1;の行をコメントアウトした場合は20.000000となり意図した値になります。
もう何が何やらさっぱりわからないのでお助け願います。
環境:Microsoft Visual C++ 2010 Express

682 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 22:46:51.02 ]
>>681
for(h=0;h<HEIGHT;h++){
for(w=0;w<WIDTH;w++){
for(d=0;d<DEPTH;d++){

683 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 22:47:03.01 ]
>>681
a[10]の場合、a[0]〜a[9]しかアクセスしちゃダメよ。

684 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 23:05:46.98 ]
>>682-683
うわああああああ恥ずかしいいいいいい
おかげで問題は解決しました。
説明書を読まない初心者みたいな質問をしてすみませんでした。



685 名前:デフォルトの名無しさん [2012/01/26(木) 23:21:19.54 ]
>>665
ある大手メーカーの看板商品でだいたい数百万行(当時20世紀)
ある大手物流センターでは最長不倒関数の競技場で1ソース1万行超えが日常だった
ある半官半民の案件では C なのにグローバルとマジックナンバーの嵐でまるで拷問室
ハード系(C よりアナログやメカが得意)の某社さんのコードは美しさが際立っていた

おめ、gcc のソースの行数数えてみたか? 数えていなければ、それが正解だと思うぞ

686 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 23:28:14.90 ]
分岐の要件が薄っぺらいなら長大な関数でも別にいいと思うし
大量のグローバル変数も整理されてるなら正しい使い方
でもマジックナンバーはヤバイよな

687 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 23:37:01.71 ]
量の多さで競うな。
コード量が少なく開発日数の少ないのが優れてる。
同品質なら。

688 名前:デフォルトの名無しさん [2012/01/26(木) 23:51:55.62 ]
>>654
>>655
ありがとうございます。
これで、二点間の距離でますよね?

689 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 23:54:34.24 ]
>>688
もちろん、でますん。

690 名前:デフォルトの名無しさん [2012/01/27(金) 00:06:52.66 ]
>>689
ありがとうございました。
助かりました。
単位は、メートルですよね?

691 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 00:10:56.57 ]
出ても正しくはないだろ。出すだけならreturn 1;でもいい。
ある程度は正しいかもしれない。

692 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 00:13:34.25 ]
止まった時計でも日に二回正確な時を示すって感じだな

693 名前:デフォルトの名無しさん [2012/01/27(金) 00:18:41.80 ]
>>691
え、どういうことですか。

694 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 00:19:58.99 ]
あとは自分でやれって事だ



695 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 00:39:35.20 ]
>>693
ベッセル楕円体という近似はいまいちということが判明してる。


国土調査課 地籍活用GIS 世界測地系への移行
tochi.mlit.go.jp/tockok/gis/gps/main4.html
日本経緯度原点に450mのズレ
 近年では人工衛星を使った観測等により、地球の極めて正確な形状が明らかになりました。それによると、地球は当時推定されていたベッセル楕円体よりも長半径が約700m長いことが判明しました。

座標系
vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html
いろいろな地球楕円体


天文経緯度と測地経緯度
www.h2.dion.ne.jp/~kazuf/sao/135e/tenmonsokuchi.htm

696 名前:デフォルトの名無しさん [2012/01/27(金) 00:39:39.75 ]
>>694
答えが正確ではないということですか。

697 名前:デフォルトの名無しさん [2012/01/27(金) 00:41:30.39 ]
>>695
地球を真球と考えた結果ということですね。
そして、地球は真球ではなく、楕円となっているため
値が正確ではないということですね。

698 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 00:42:44.48 ]
だからさあ、何につかうんだよ

699 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 00:44:24.13 ]
よりよい近似モデルを使うか、Googleアースのように高度を含めた地球の3Dモデルデータを持っていたら割と正確に出せる。

700 名前:デフォルトの名無しさん [2012/01/27(金) 00:52:04.99 ]
>>698
距離を求めて、そこまでの時間を求めたいです。
速さは、GPSから取得します。

>>699
そうですか。
これだけだと正確ではないのですね。。。

701 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 00:52:59.04 ]
最近はここまでのアホも珍しくないからなぁ

702 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 01:18:19.64 ]
直線距離もとめたって意味が無いってわからないのかな
いいかげんあきらめろよ

703 名前:デフォルトの名無しさん [2012/01/27(金) 01:57:40.67 ]
>>702
陸上では、あまり意味がないかもしれませんが
海上などでは、直線距離で大丈夫ですよね?

704 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 02:06:52.65 ]
>>703はやっぱりアホだ




705 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 02:29:56.50 ]
>>684
はずかしがるってことは、間違えている内容をちゃんと理解できてるから。
恥ずかしがらなくていいよとはいえないけど、喜んどけ

706 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 02:31:02.44 ]
>>685
最長不倒関数とか懐かしい言葉を出しつつも関数の行数を出さないあたりが渋いよね

707 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 02:33:02.24 ]
>>703
海流

708 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 03:12:57.15 ]
>>685はwc -l を知らない肉体労働者

709 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 03:13:41.57 ]
>>705は優秀な燃料管理技士

710 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 03:55:17.37 ]
wcで関数の行数数えるのも面倒だろ。
つか、ファイルに分けるんだったらその時点で行数わかるし。

711 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 04:21:46.97 ]
「コードの総行数」という定義は、意外と厄介。

1文を複数行に分けて書いたときをどう扱うかにもよる。
コメント行を含めるか、含めないかでも変わる。

結局、元の質問(>>665)が、実行数と論理行数(ステップ数)の
どっちが欲しいかによる。

答えは知らないけど・・・。

712 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 04:28:50.08 ]
>>711
ステップカウンタってのがあるよ。

713 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 04:44:45.48 ]
意味ないけどな。

714 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 12:30:45.04 ]
擬似乱数じゃない本物の乱数(暗号的なんちゃら乱数)を使いたいんですが
ライブラリは存在しませんか?



715 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 12:37:37.62 ]
/dev/random
openssl, ssh, gmp, crypto

716 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 12:39:02.26 ]
>>714
今はそういうライブラリは存在しない。

そもそも、
・一方向性関数が存在すれば暗号論的擬似乱数生成機が存在する事が知られている。
・現在のところ、一方向性関数の存在性は証明されていない。
・一方向性関数の存在性が示せれば、P≠NP予想が証明できる。
という状況。

凡人にゃあ無理。

あとは、ソフトウェアじゃなくてハードウェアデバイスでなんとかするしかない。
放射性物質の崩壊を検知して、それを0,1で置き換えてくれる装置とか。


717 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 12:53:47.90 ]
ja.wikipedia.org/wiki/Randのコード例のものをコピペして動かしても
常に0しか返ってきません
原因は何故ですか?

718 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 13:27:52.01 ]
だって return 0; だから・・・

719 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 13:34:16.43 ]
え?乱数とreturn 0に何の関係があるんですか?
出力はreturn 0の前ですけども

720 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 13:38:49.56 ]
「返ってくる」のはreturn 0だからという言葉遊びだと思うよ
codepad.org/Vou6Xbqh

721 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 13:54:56.13 ]
何で実行するたびにいつも同じ数字が返ってくるんですか?
毎回違う数字は帰れないんですか?

722 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 14:16:39.52 ]
コピペ間違いじゃなければお前の実行環境に問題がある。
Wikipediaの例は標準的な環境で正しく動くはずだ。

723 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 14:37:59.51 ]
VC++2010Express
Win32コンソールアプリケーション
test.cにコード貼り付けて
printfとreturn 0;の間にブレークポイント置いてF5押したら
同じ数字しかでません

724 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 15:20:46.38 ]
>>723
もいっかいやってみろ。さっきとは違う値が出ないか?



725 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 15:29:41.77 ]
>>714
今年出るIvy Bridgeまで待て。AVXにRdRAND命令が追加される。

726 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 16:45:41.50 ]
メモリやHDDの書込速度を測ってその最下位ビットを使え。

727 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 16:58:53.45 ]
>>723
やってみた。VC++のrandomの性能が悪すぎる。
seedの下位ビットはまるっきり無視されてるような感じだ。
srand((unsigned int)(time(0) << 16)));
こんなもんでどうか。

728 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 17:01:26.43 ]
>>717
処理系によっては、1回目の値が前回実行時と大差ないものがあり、RAND_MAXで割ると0.6あたりをウロウロしたりする。

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

int main(void)
{
srand((unsigned int)time(0));
printf("%d¥n", rand());
return 0;
}

上記コードを3回実行してみると、
gcc version 4.2.1 (Apple Inc. build 5664)では
1470289798
1470306605
1470306605


codepad.org/ では
121543468
627453109
1744218406

応急回避方法は、0~9が必要なら、rand() % 10

729 名前:SCHEME餃子 ◆8X2XSCHEME mailto:sage [2012/01/27(金) 17:40:58.46 ]
>>692
俺もリンドバーグのファンだよ。

730 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 17:58:24.26 ]
生成速度はよくないが、規則性のないはずの乱数。


#include <stdio.h>

__int64 rdtscval() { __asm { rdtsc } }
void waitfnc(){FILE *fp = fopen("tmp", "wb");fwrite("tmp", 1, 3, fp);fclose(fp);}

unsigned int rand_rdtsc() {
unsigned int n,x=0;
for(n=0; n<32; n++) {
waitfnc();
__int64 val=rdtscval();
x|=((val>>3)&1)<<n; }
return x; }


void main() {
for(int n=0; n<100; n++) printf("%d\n",rand_rdtsc());
}

731 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 18:02:05.15 ]
>>730のウェイトをメモリアクセスにしたら速度は上がるが、ほぼ等速度になってしまい乱数にならない。
ファイルへのアクセスだとOSや他のアプリやサービスなどが働いて等速度でなくなる。

732 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 18:09:55.22 ]
本当wikipediaのコードはksだな

733 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 18:12:07.47 ]
__asmは64bitで使えないからダメ。

734 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 18:21:25.14 ]
>>733
なるべく高精度のタイマーだったらなんでもいい。最低一ビットリターンできれば良い。



735 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 18:33:22.51 ]
>>714そっちのけで、入門編から飛び出している件

736 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 19:28:27.89 ]
>>733

#include <stdio.h>

#ifdef _WIN32 & !(__GNUC__)
struct timezone { int tz_minuteswest; int tz_dsttime; };
#include <windows.h>
int gettimeofday(struct timeval *tv, struct timezone *tz) {
LARGE_INTEGER t;
QueryPerformanceCounter( &t );
tv->tv_sec = t.HighPart;
tv->tv_usec =t.LowPart;
return 0; }
#else
#include <sys/time.h>
#endif


void waitfnc(){FILE *fp = fopen("tmp", "wb");fwrite("t", 1, 1, fp);fclose(fp);}

unsigned int rand_rdtsc() {
unsigned int n,x=0;
for(n=0; n<32; n++) {
waitfnc();
static struct timeval t;
gettimeofday(&t, NULL);
x|=((t.tv_usec>>3)&1)<<n; }
return x; }


void main() { for(int n=0; n<100; n++) printf("%d\n",rand_rdtsc()); }

737 名前: 忍法帖【Lv=27,xxxPT】 mailto:sage [2012/01/27(金) 19:44:24.65 ]
組織は些細な物事に対して、不釣り合いなほど重点を置く

738 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 20:13:15.74 ]
>>727
下位ビットが無視されるって、何秒かたっても同じ乱数が生成されたってこと?

739 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 20:14:18.72 ]
>>728
世の中の逆を行くコードを書くことになるとは

740 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 20:14:53.69 ]
>>738
>>727 がバカなだけ
内部状態の伝播にちょいと時間がかかる

741 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 20:21:17.99 ]
男なら擬似乱数は許せないのだよ君たち

742 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 20:42:37.60 ]
だからIvy Bridgeまで待てといっとろうが。
待てないならこれでも使え。
www.fdk.co.jp/whatsnew-j/release041005-j.html

743 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 20:51:48.00 ]
そのなんとかブリッジっていうのはVC++2010デモ使えるのでしょうか?

744 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 21:16:44.82 ]
疑似乱数なら、Boostでも使うとか。



745 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 21:31:46.54 ]
>>743
そりゃ使えるだろ。

746 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 21:35:31.60 ]
>>745
なんとかなんとかじゃないひとが使えないんじゃないでしょうか

747 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 22:05:36.77 ]
日本語でおk。

748 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 22:43:43.41 ]
南斗か

749 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 00:18:21.29 ]
ttp://www9.plala.or.jp/sgwr-t/c/sec15-5.html
このサイトの、「(3)自己参照構造体を使ったリスト処理」のところで、

/* ポインタのつなぎ換え */
p->next = head; /* 今までの先頭ポインタを次ポインタに */
head = p; /* 新たな領域を先頭ポインタに */


とあるのですが、「p++」などで、次の構造体のアドレス移動していないのにどうして上書きせずに次のアドレスの構造体に保存できるのでしょうか?
用語がうまく使えなくて申し訳ないのですが・・・

750 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 00:49:05.13 ]
リンク先見る気は無いがコメント通りの処理を目指してんならnextて要素名は変じゃね?

751 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 00:57:37.35 ]
>>749
どうしてって言われてもリンクリストだからとしか言いようがない。
セルが配列みたいに連続して並んでたらポインタをインクリメントして次のセルだけど。
図入りでコードがあるんだから、おっかけてください。

752 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 00:58:59.07 ]
リストの先頭に追加してるだけ

753 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 01:44:40.31 ]
mallocで場所を確保するときにpが新しいアドレスに移っているということですね

754 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 02:06:55.48 ]
C言語を勉強しているのですが、if文の中で

if(式A||式B||式C||式D)

のように複数の式が論理演算子||で並んでいる時に、手持ちのコンパイラですと
実行時に、左側の式から順に(式A、式B、式C、式Dの順で)評価されていて、
かつ、途中の式が真の場合、残りの式は評価されていないみたいです。

※例えば式Aが真の場合、式B〜Dの中に含まれている関数は実行されない

これはC言語に共通する規則でしょうか?
それともコンパイラ固有の仕様ですか?



755 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 02:08:56.05 ]
>>754
C言語の規格通り
「短絡評価」といったキーワードで検索してみる

756 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 02:11:23.51 ]
>>755
ありがとうございました

757 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 07:11:53.75 ]
>>753
>pが新しいアドレスに移っているということですね
この表現の意味がわからない。

ポインタといっても通常の変数と変わらない。
mallocの戻り値を保持しているだけだよ。

ついでにリスト構造について、根本的に理解ができていないと思われる。
ポインタpに対してp++すると、pが指しているオブジェクトサイズ分値が増える。
配列の場合はメモリ上に稠密にデータが確保されているため、配列の次の要素を
指すことになる。リストで次の要素を指すためにはp = p->next;とすることになる。

758 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 17:45:05.28 ]
#include <stdio.h>

char strput(char *str){
while(*str){
putchar(*str);
*str++;
}
}

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

scanf("%s", str);

strput(str);
}

これは入力した文字を出力するプログラムなのですが、
6行目の「*str++」について疑問があります
もちろん、コンパイルすればエラーも出ずに結果も正常なのですが
「*」がない「str++」にしても同様にできました

そこで「*」がいるのかいらないのか分かりません
つける必要はないんでしょうか?

759 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 17:46:21.32 ]
ない

760 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 17:48:00.12 ]
何のためにつけるか、考えようね

761 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 01:22:28.75 ]
整数は大丈夫だろうけど、
浮動小数点数の演算結果って、
CPUによって違ったりしたりする?
i7, i5 と比べて ATOM とか、
FX, A と比べて E, C とか、
後者は演算ユニットが128ビットと64ビットで差があったりするんだが。


762 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 01:26:59.68 ]
>>758
#include <stdio.h> // printfなどの定義
char strput(char *str) // *は、strがポインターであることをコンパイラに指示する
{
while(*str) { // *strは、strが指す位置の文字データ内容
putchar(*str); // 文字を出力
str++; // ポインターの値を+1する。データを書き換えるわけではないので*は不要
}
}

int main(void)
{
char str[20];
scanf("%s", str);
strput(str);
}


763 名前:デフォルトの名無しさん [2012/01/29(日) 01:50:14.07 ]
C言語に詳しい人に質問です。

p は構造体へのポインタです。

*((int *)((char *)p - sizeof(int)))
だとか
*((char *)p - sizeof(int))
といったかんじのコードをみかけるのですが、
これって何を意味しているのですか?



764 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 03:28:13.08 ]
*((char *)p - sizeof(int))の場合。

pには構造体の配置されてるアドレスが入っている。それをたとえば123456番地とする。
sizeof(int)は4バイトとすると

123452=123456-4番地を文字としてみたときの0-255のいずれかの値を表す。



765 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 03:32:51.06 ]
初心者っぽいので。

char p[]="abcxyz";とすると、p+3は文字列"xyz"の先頭アドレスだったり、*(p+3)はxを表したりする。

この操作と同じ。これがわかり無くそうになってだけで同じだ。

766 名前:763です [2012/01/29(日) 04:37:03.22 ]
764さん, 765さん
ありがとうございます。
構造体の配置されているアドレスであるpからtypeof(int)を
引いたアドレスにはどんな意味があるのでしょうか?
ここを参照してintやcharとしての値を取得する目的があるのでは
ないかと思うのですが...











[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<223KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef