17/10/27 21:28:08.20 pAogLeJi0.net
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
URLリンク(paiza.io)
URLリンク(ideone.com)
URLリンク(codepad.org)
C11
URLリンク(www.open-std.org)
C99
URLリンク(www.open-std.org)
URLリンク(kikakurui.com)
C FAQ 日本語訳
URLリンク(www.kouno.jp)
JPCERT C コーディングスタンダード
URLリンク(www.jpcert.or.jp)
前スレ
C言語なら俺に聞け 142
スレリンク(tech板)
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2:デフォルトの名無しさん
17/10/27 21:56:32.94 /LUCvRWS0.net
おっつ おっつ
3:デフォルトの名無しさん
17/10/27 23:12:15.85 67YjQzLBM.net
>>1
乙
4:デフォルトの名無しさん
17/10/28 08:25:42.00 VIxhg0oq0.net
「新スレッドは○番に書き込んだ人が立てる」みたいなガイドラインを
テンプレートに盛り込んだ方が安心じゃないかな。
前スレッドの終了まで新スレッド(ここ)が立たなかったし、
999番で「誰か立ててくれ」と書き込まれたのに応じて
「立てたよ、リンク先は…」と誘導に使われるべき1000番が
無意味な「あぼーん」で潰されたし。
5:デフォルトの名無しさん
17/10/28 09:22:16.51 6bG+Py6x0.net
あぁあああもうポインタ全然分かんねえよおおお
6:デフォルトの名無しさん
17/10/28 10:32:21.81 QoaQu2To0.net
前スレへのリンクがあって、スレタイにも番号がついてるわけで
1000いったら次スレなんて言われんでもわかるし望む者がいるから立っている
それだけのことで、別に何かする必要はないと思うな
7:デフォルトの名無しさん
17/10/28 13:13:54.08 cK0+9veY0.net
>>5
文字通り何かを指し示すものだよ。
8:デフォルトの名無しさん
17/10/28 13:25:50.21 NBGUhvqo0.net
data8<7-0> にdata32<31-00>の中のdata32<07-00>を抜き出して代入したい
data8 = data32 % 256 ;
と書いてもコンパイラが素直に推論してくれません
キャリー処理のコードっぽいものをつけてきやがります
どうしたらいいでしょうか?
9:デフォルトの名無しさん
17/10/28 13:30:10.44 z7fGPvzs0.net
あまりにも挫折者が多すぎる
教え方が悪いとか例題が少ないとかじゃねえのかと
変数とか言うふわふわしたモンがいきなり具体的なものになるから分かりにくいんじゃないのかね
メモリとかアドレスとかいきなし言われても分んねーよ、とかなるし
しまいにはアドレスの値だって気にかけなくなる
いきなり「変数は値と場所、二つの数字をもちます」とか言われると混乱するんだよ
10:デフォルトの名無しさん
17/10/28 13:51:05.54 cK0+9veY0.net
>>8
君の言いたいことがよくわからない。とりあえず全部日本語に翻訳してくれ。
11:デフォルトの名無しさん
17/10/28 14:04:12.56 4nXMq3qA0.net
先にメモリとアドレスから入ればいいのさ
12:デフォルトの名無しさん
17/10/28 14:07:01.68 tCIUZaJu0.net
ビットが取れればいいだけなら、data8 や data32 の型を符号無しにするだけで
いけそうな気もするが、よく分からん
13:デフォルトの名無しさん
17/10/28 14:11:40.74 NBGUhvqo0.net
両変数ともunsigned宣言はしています
14:デフォルトの名無しさん
17/10/28 14:16:17.83 MGjkWSIK0.net
>>13
こーゆー事?
data8 = data32 & 0x000000ff;
適宜 cast してね
15:デフォルトの名無しさん
17/10/28 14:18:02.62 fKJ32+jb0.net
printf で
data8 の実際の型にあった表示フォーマット使ってなかったとかのオチ?
(data8 の最上位ビットが足ってるとかサ-
16:デフォルトの名無しさん
17/10/28 16:17:52.03 DjUYz3cS0.net
int *a = 0;
*a = 1;
これは入るけど1は入るん?0の番地って存在するん?
17:デフォルトの名無しさん
17/10/28 16:21:22.21 U1K93bKt0.net
>>16
ワープに成功しましたってメッセージが出る
18:デフォルトの名無しさん
17/10/28 16:29:25.72 MyIroYJQ0.net
>>16
0番地の住人に怒られる
19:デフォルトの名無しさん
17/10/28 16:50:59.06 IMJtHdwY0.net
ぬるぽ
20:デフォルトの名無しさん
17/10/28 17:33:04.44 VIxhg0oq0.net
>>8
「リテラルの数値256での剰余だから結果の範囲は0-255、
unsigned char の範囲からはみ出す可能性はない」
ということまでコンパイラが見抜いてくれないってことだよね。
data8 = (unsigined char) data32;
てな具合に明示的なキャストで上手くいかんかな。
あるいはコンパイラの最適化オプションを強めにするか。
21:デフォルトの名無しさん
17/10/28 17:42:28.64 NBGUhvqo0.net
ちょっと勘違いしてました
>>8の質問はとりさげます
ちなみに%256の推論はしているみたいです
22:デフォルトの名無しさん
17/10/28 18:42:28.70 STqPADGQ0.net
リファクタリングして短いコード吐くかなと思ったら
がんがんループ展開されて元より長いコードを出すこともあるよね
23:デフォルトの名無しさん
17/10/28 18:54:14.85 QoaQu2To0.net
希望的観測でタカをくくって結果を見もしないやつが一番悪い
24:デフォルトの名無しさん
17/10/28 20:47:38.03 VLfN62TLH.net
>>16
現代のマルチタスクOSではアドレスをずらしたりして0番地付近は見えなくされる
じゃなかったかな
25:デフォルトの名無しさん
17/10/28 20:49:51.90 i6LcJWfh0.net
物理0と論理0が違うってのなら、仮想記憶なOSなら
普通そうだよ
26:デフォルトの名無しさん
17/10/28 20:54:20.70 uE8IWkSS0.net
>>16
ヌルポインタに関しては、なんかややこしい事情があるみたいね。
規格ではいかなるオブジェクトとも一致しない特殊なポインタってことになってるようだけど、
自分が使ってる組込み用のコンパイラではただの 0 になる。しかも0番地から普通の RAM なんで、
値も普通に格納される。
どうなるかは確認するしかないんじゃなかろうか。
27:デフォルトの名無しさん
17/10/28 21:07:29.96 gfV3l07s0.net
>>20
32bitの範囲の数値を8bitの最大値で割るんだから
最大24bitの数値になるんじゃないの?
data8 = *(unsigined char*) &data32;
リトルエンディアンだと仮定するとこうなると思う
28:デフォルトの名無しさん
17/10/28 21:24:13.85 gfV3l07s0.net
すみません
剰余を除算と勘違いしていました
無視してください
29:デフォルトの名無しさん
17/10/28 23:08:15.00 cK0+9veY0.net
>>16
あるけど今時のだいたいのOSではアクセスすると例外発生してプログラムが停止させられると思う。
そうでなくてもCPUによってアドレス0付近が特別扱いされている事が多いのでアクセスできたとしても要注意だったりする。
なのでそういうのが必要な時というのはOSそのものやデバイスドライバを作る時ぐらいしかないと考えて良い。
30:デフォルトの名無しさん
17/10/28 23:16:46.23 DjUYz3cS0.net
最近ヤフー知恵袋で初心者なんですけど将来プログラマになりたくてC言語やってみたいんですけどどうですかって
質問が多いがプログラマが時代の流行になってきたか?
31:デフォルトの名無しさん
17/10/28 23:27:04.65 6bG+Py6x0.net
>>30
とりあえずみんなc言語やるんだな
32:デフォルトの名無しさん
17/10/28 23:47:39.21 DjUYz3cS0.net
>>31
おすすめの本やらおすすめの開発アプリやらおすすめのサイトやら学校のカリキュラムの評価やら色んな質問が多いしC言語やるならC#やった方が良いと思うんだけどなstring型ないだけで文字列処理とか大変だし不規則な空白・カンマ区切りとかの処理大変だし
そうゆうのを除外してくれる関数あるから楽なのになC言語はchar型で文字列操作してから処理しないとint型にしたりするのが大変だからな
33:デフォルトの名無しさん
17/10/29 00:35:52.85 CCoHsvZa0.net
義務教育のカリキュラムなもんで実用性の1側面に問題の作り易さもある
ペーパーテストにはうってつけだろC言語は
34:デフォルトの名無しさん
17/10/29 06:18:21.91 7nxu6Zdr0.net
教育だと一般性ってのも考えなきゃならないからね。
次々出てくる「Cを改良したネット時代の言語」とかの新しいやつも
10年たったら別の新言語と置き換わってるかも知れないし。
その点、Cなら古くさくても基本として残ってるだろう。
資格試験はまた別だがね。時々変えないと商売にならん。
35:デフォルトの名無しさん
17/10/29 10:11:30.74 NWVP0NdTH.net
Cは一人でやるとちょっとしたミスで手も足も出なくなるから論外
右も左も分からない初心者に基本はC言語とか言い出すヤツは老害
36:てすと
17/10/29 10:24:35.50 S9avFBtQ0.net
package test;
class Test
{
public static void main(String[] args)
{
System.out.println("test");
}
}
37:デフォルトの名無しさん
17/10/29 10:27:47.96 tz+cuQEW0.net
組込やOS開発まで視野に入れるとCが一つの王道なのは間違いない
初学者にすすめるべきかと聞かれるとそれはまた別の話
38:デフォルトの名無しさん
17/10/29 12:49:29.42 DRVQfTKK0.net
>>35
それはお前が無能てだけだろw Cなんて仕様がコンパクトだから簡単だわ
39:デフォルトの名無しさん
17/10/29 13:08:01.23 48yStxT20.net
実際に使うには多くの仕様外な環境依存のことを理解しないといけないから
C言語を勉強してもC言語は使えない
40:デフォルトの名無しさん
17/10/29 13:12:59.45 oFRxn/Jf0.net
しようがないな
41:デフォルトの名無しさん
17/10/29 13:24:51.26 DRVQfTKK0.net
アホか。それは言語の話じゃねーだろ
42:デフォルトの名無しさん
17/10/29 13:36:30.43 oFRxn/Jf0.net
環境依存の部分はどんな言語でも影響受けるから結局は覚える事になるんじゃないのかな
43:デフォルトの名無しさん
17/10/29 16:45:37.57 Qj29lsVR0.net
まずはcでゲーム作ってみようかな
44:デフォルトの名無しさん
17/10/29 17:07:01.40 eJZsCyOV0.net
win32で作ってみる?
45:デフォルトの名無しさん
17/10/29 17:13:50.83 X7Kr9qJt0.net
OpenGLの方がいい
46:デフォルトの名無しさん
17/10/29 17:17:11.04 TdUzVMA70.net
まずコンソールアプリで
47:デフォルトの名無しさん
17/10/29 22:58:38.22 eJZsCyOV0.net
その前に開発環境を整えるのが大変だわプログラミングはできるけどそれぞれ出してる開発アプリがあるしその中で開発ツールだっけXNAやらwin32やらで解らんことばっかりや
48:デフォルトの名無しさん
17/10/29 23:13:28.81 cx6N475a0.net
>>47
ほんそれ
49:デフォルトの名無しさん
17/10/29 23:38:03.44 tz+cuQEW0.net
大抵「C言語は何でも出来る」(嘘ではない)
に騙されるパターンだね
50:デフォルトの名無しさん
17/10/29 23:48:24.03 XyYI0EpP0.net
ビットローテイトってどう書くんですかね
51:デフォルトの名無しさん
17/10/30 01:28:40.64 ObFQilr40.net
キャリーを含む9bitローテートか
それとも含まない8bitローテートか
52:デフォルトの名無しさん
17/10/30 02:41:46.16 z+u7+Cu/0.net
ボローがある奴で
53:デフォルトの名無しさん
17/10/30 04:58:13.48 oEYvBlvb0.net
性能優先ならインラインアセンブリでCPUのローテート命令かねぇ。
移植性が大事なら正直にマスクしてシフトしてビットorで重ねる。
8bitや16bitならテーブル使えば両立できるかな。
54:デフォルトの名無しさん
17/10/30 13:11:03.28 Oa6tPdXR0.net
苦C勉強してるんだけどファイルの辺りって重要?
あんま考えずにやってたんだが
55:デフォルトの名無しさん
17/10/30 13:22:56.64 LaVtZ0d2p.net
ストリームの概念はUNIX譲りの万能概念だから未来永劫絡んで来るぞ。
56:デフォルトの名無しさん
17/10/30 13:37:21.46 /ejdYHINM.net
fopen
fclose
57:デフォルトの名無しさん
17/10/30 14:12:51.37 z+u7+Cu/0.net
fdopen / fileno を理解すれば大体は困らないかと
58:デフォルトの名無しさん
17/10/30 17:55:35.83 LaVtZ0d2p.net
read/writeが無いと意味が無いだろ。
59:デフォルトの名無しさん
17/10/30 18:00:53.98 YGvWSIyjr.net
初心者です。
4ビット目以降に文字(ASCII3文字)が格納されてる場合、どうやって取ればいいですか?
60:デフォルトの名無しさん
17/10/30 18:06:29.16 6LR7RaNa6.net
char c1=data&0b000000000000000011111111000;
char c2=data%&0b000000001111111100000000000;
char c1=data%&0b111111110000000000000000000;
61:デフォルトの名無しさん
17/10/30 18:07:40.57 6LR7RaNa6.net
char1重複エラー
62:デフォルトの名無しさん
17/10/30 18:09:07.45 6LR7RaNa6.net
演算子オペランドエラー
63:デフォルトの名無しさん
17/10/30 18:14:50.15 ki8heFlTa.net
ファイルとストリームを結びつけるのって、具体的に何がどうなってるんですか?
その辺りがわかるサイトや書籍があれば英語でもいいので教えていただけるとありがたいです
64:片山博文MZ
17/10/30 18:16:13.85 ct0tj9Za0.net
long n = 12345678;
n >>= 4;
putchar(n & 0xFF);
n >>= 4;
putchar(n & 0xFF);
n >>= 4;
putchar(n & 0xFF);
65:片山博文MZ
17/10/30 18:17:57.46 ct0tj9Za0.net
>>63
LinuxなどのオープンソースのOSのカーネル部分を読めばいい。
Windowsのカーネルは、非公開だが、ReactOSで近いものが読める。
66:デフォルトの名無しさん
17/10/30 18:19:48.86 6LR7RaNa6.net
シフト演算子でやろうと思ったら先越されてた
67:デフォルトの名無しさん
17/10/30 18:21:54.38 S5mFuOM00.net
>>63
これ普通はどうやって勉強すんだろうな 興味あるわ
おれはいきなりデバドラ書かされたんで理解を強制されたけど
あのへんの概念なしで腑に落ちる理解できるもんなん?
68:デフォルトの名無しさん
17/10/30 18:47:24.58 6zI0CLS+0.net
>>65
なんでファイルとストリームの結びつきでLinuxカーネルが出てくるの?
69:デフォルトの名無しさん
17/10/30 19:47:29.26 4jg/LOEr0.net
>>68
ストリームを作ってるのがカーネルだからだろ。
70:片山博文MZ
17/10/30 19:50:12.31 ct0tj9Za0.net
>>68
CランタイムならLLVMのlibc++か、GNUのlibstdc++を読めばいい。
カーネル見ずに読めればね。
71:デフォルトの名無しさん
17/10/30 19:56:28.17 oEYvBlvb0.net
>>60 0b...で2進数のリテラル表現ってできるんだっけ?
>>64 エンディアネスに対する配慮が…。
72:デフォルトの名無しさん
17/10/30 19:59:34.77 w02M5Pe50.net
8進 16進はあるけど 0b... な2進リテラルは余所の言語じゃね?
73:片山博文MZ
17/10/30 20:01:52.91 ct0tj9Za0.net
2進数リテラル(C++14)
URLリンク(cpprefjp.github.io)
C++14の機能らしい。D言語やC#にもあったよね。
74:片山博文MZ
17/10/30 20:07:07.38 ct0tj9Za0.net
int bigendian(void)
{
union { int i; char c[sizeof(int)]; } u;
u.i = 1;
return !u.c[0];
}
この関数でエンディアンをチェックすれば? XScreenSaverから拾ったものだけど。
75:片山博文MZ
17/10/30 20:14:13.81 ct0tj9Za0.net
union endian_checker_union
{
int i; char c[sizeof(int)];
} endian_checker = { 1 };
#define IS_BIG_ENDIAN() (!endian_checker.c[0])
76:デフォルトの名無しさん
17/10/30 20:16:20.68 6zI0CLS+0.net
>>70
なんでC言語の話でlibstdc++が出てくるの?
fopenやらのストリームなんて、setvbufの説明読めばバッファリングしてるだけって理解できるだろ
カーネルやらlibcのソースなんて読む必要性なんてねーよ
77:デフォルトの名無しさん
17/10/30 20:33:32.20 LaVtZ0d2p.net
ストリームなんて、なんでもかんでも先頭から順番に処理�
78:キるってだけの概念だけどな。 ランダムアクセスメモリーも読み飛ばしと巻き戻し駆使してアクセスするのさ。
79:デフォルトの名無しさん
17/10/30 23:47:44.78 nQXUW6Dj0.net
>>49
マシン語には何でもできるねw
80:デフォルトの名無しさん
17/10/31 00:10:44.27 TMBeGW2t0.net
>>75
こんなのどう?
#define IS_BIG_ENDIAN (htons(1) == 1)
81:デフォルトの名無しさん
17/10/31 02:08:26.69 yucmEvc2r.net
>>64
あざます!
82:デフォルトの名無しさん
17/10/31 03:25:37.26 TMBeGW2t0.net
>>64
そういえばそれ、それでいいの?2回目以降は n >>= 8 では?
83:デフォルトの名無しさん
17/10/31 08:48:27.57 sbQ4uuQC0.net
>>79
それって、htons()のあるライブラリ間違えたら全く意味が無いマクロだよね?
84:デフォルトの名無しさん
17/10/31 09:15:02.97 om7ZjX940.net
>>72
接頭辞0bは今どきのgccで普通に使えちゃうんだなこれが
85:デフォルトの名無しさん
17/10/31 09:27:38.26 nPjSgXlla.net
gcc拡張が当然の前提で話が進むと結構困る
86:デフォルトの名無しさん
17/10/31 11:06:07.87 om7ZjX940.net
なので、質問者も回答者も 「ほんとはダメだけどgccならこうよ」
みたいな但し書きを一筆しとくべきだね
87:片山博文MZ
17/10/31 12:32:05.51 dHzwAoXy0.net
>>81
間違いでした。ぺこり。
88:デフォルトの名無しさん
17/10/31 23:37:41.07 TMBeGW2t0.net
>>82
ライブラリというか、ヘッダだな。#include <arpa/inet.h> とか。
コンパイラにもよるだろうけどだいたいはヘッダの中だけで #define されているか
ビルトインの関数に置き換えられるかインラインアセンブラになるか、適当に
うまいことやってくれると思う。(CPUが Big endian なら #define htons(x) (x) に
なってて何もしないだけになるかも知れない)。
それと一応 POSIX.1‐2008 のようなので使えるコンパイラは多いんじゃないかな。
89:デフォルトの名無しさん
17/11/01 02:46:02.61 TUg4iVeD0.net
今ってC言語でwin32とかで作るアプリに基本構造とかなしで作る感じなの?
90:デフォルトの名無しさん
17/11/01 07:20:25.79 oQpzogGj0.net
日本語でOK
91:デフォルトの名無しさん
17/11/01 09:27:14.69 AnlYMxNy0.net
イベントを拾って条件分岐みたいな部分は全部関数内に隠蔽された。
今は決まった名前のコールバック関数を埋めるだけのお仕事。
92:デフォルトの名無しさん
17/11/01 13:43:28.66 Sb/s6/mM0.net
malloc
realloc
わからん
使うん?
93:デフォルトの名無しさん
17/11/01 14:04:15.81 G3xjFDeG0.net
ケースバイケース
94:デフォルトの名無しさん
17/11/01 14:12:00.47 0yoHAkyy0.net
実行時に必要なメモリーサイズが決まるようなプログラムだと必要。
最初から大きなメモリーを確保しても無駄になるかもしれないし、
当初想定したサイズでは足りなくなるかもしれない。
そういうときに使う。
95:デフォルトの名無しさん
17/11/01 14:12:15.55 Dwgab4vip.net
組み込みでは1度大きく確保したら後は自前で中身やり繰りするから、あんまり使わない。
96:デフォルトの名無しさん
17/11/01 15:19:44.00 Sb/s6/mM0.net
VS2017でやってるんだがファイル分割ってどうやるんだ
97:デフォルトの名無しさん
17/11/01 15:24:42.09 GbnHNcua0.net
Visual Studio 2017 Part4
スレリンク(tech板)
左のファイルのツリーで 項目の追加 で 新しく .c のソースファイル名指示すれば
勝手にコンパイルとリンクのターゲットにしてくれる (予定
98:デフォルトの名無しさん
17/11/01 22:58:59.77 jxmKQQAl0.net
>>94
組み込みって言ってもこの頃は最初から Linux 動いてるようなのもあるからな。
今は昔と違ってかなり自由度が高いのもあるんじゃないかな。
99:デフォルトの名無しさん
17/11/01 23:00:55.45 AnlYMxNy0.net
Linuxだからって、メモリーリークが無くなるワケじゃ無いからなぁ~。
100:デフォルトの名無しさん
17/11/01 23:11:29.84 jxmKQQAl0.net
ま、そりゃそうだけどね。
101:デフォルトの名無しさん
17/11/01 23:58:24.93 T3zOKizx0.net
>>94
組み込みではどの処理にどれだけメモリを使うかは、
設計で決まるだろ。
102:デフォルトの名無しさん
17/11/02 05:57:23.41 0ZjxmEGf0.net
「29歳既婚、2年前に会社を辞めた。ボードゲーム作りを始めて3700万円を
売り上げたけど何か聞きたいことはある?」回答いろいろ
URLリンク(labaq.com)
日本ボードゲーム界の異端児に聞く!ボードゲームデザイナーとして生きていくには?
URLリンク(bodoge.hoobby.net)
はじめてボードゲームを作ってはじめてゲームマーケットに出店した ので、ひとり反省会をしてみる。
URLリンク(datecocco.hatenablog.com)
はじめて作ったボードゲームを売った話
URLリンク(nrmgoraku.hateblo.jp)
ボードゲームイベント「ゲームマーケット」から業界が見えた!
URLリンク(entertainmentstation.jp)
ボードゲームはどう作るのか、自分なりに考えた
URLリンク(roy.hatenablog.com)
オトナも遊べるボードゲーム!自作するといくらになるのか
URLリンク(www.d-laboweb.jp)
ボードゲームの展示イベント「ゲームマーケット」の成長記録からこれからの
市場に必要なことを妄想してみた。6年間の来場者数推移(2016年4月時点調べ)
URLリンク(bodoge.hoobby.net)
ボードゲーム市場がクラウドファンディングの出現で急成長を遂げ市場規模を拡大中
URLリンク(gigazine.net)
103:デフォルトの名無しさん
17/11/02 08:04:37.86 BfnVxeM2M.net
組み込みって言ってもピンキリだからなぁ
車のエンジン制御とかなら>>100が言うような感じだけど>>97が言うようなLinuxが載ってる機器のGUI回りとかだとその辺かなりアバウト
テレビみたいにインターネットブラウザとか載せてるとそもそも必要量を見積もれないし
104:デフォルトの名無しさん
17/11/02 17:15:09.25 UMCJ4RbSd.net
URLリンク(ideone.com)
漸化式を使って組合せnCmの値を表示するプログラムです
数字を大きくすると正しい結果が出ないので困っています(例えば45C11
修正箇所教えてほしいです
105:デフォルトの名無しさん
17/11/02 18:14:52.51 I//dCy6q0.net
なぜ入力もlongにしないのだ?
106:デフォルトの名無しさん
17/11/02 18:20:01.37 aAcU+3M+d.net
>>104
入力はそこまで大きい値を入れるつもりはないのでintにしました
107:片山博文MZ
17/11/02 18:26:10.31 JDKI/Gfo0.net
>>103
C言語の場合は、整数同士の割り算は整数の除算になる。例)3/2 == 1.
整数をfloatやdoubleにキャストしても情報落ちのため、浮動小数点数では正確な除算は計算できない。
URLリンク(ideone.com)
108:デフォルトの名無しさん
17/11/02 18:39:45.95 aAcU+3M+d.net
>>106
gはnとmの最大公約数
あとnCmは必ず整数になるのでn-1Cm-1/Bの部分も小数にならず割り切れて整数になると思うんです
n=Ag m=Bg (A.Bは互いに素)として
n/m*n-1Cm-1
=A/B*n-1Cm-1 (※A/Bは小数になる)
= A*(n-1Cm-1/B)
=(n/g)*(n-1Cm-1/(m/g))
として計算すればうまく小数になるのを避けられるのではないかと考えました
すみませんC言語というより数学的な話で
109:片山博文MZ
17/11/02 19:31:39.13 JDKI/Gfo0.net
>>107
おそらくn/gは整数である。m/gも整数である。
では、(n-1)C(m-1)/(m/g)が整数であることの説明は?
110:デフォルトの名無しさん
17/11/02 19:43:50.32 aAcU+3M+d.net
>>108
nCm (※整数)
=n/m*n-1Cm-1
= (A/B)*(n-1Cm-1)
= A*(n-1Cm-1/B)
・左辺が整数なので右辺も整数です
・A/BはAとBが互いに素(※最大公約数が1)なのでこれ以上約分できない分数です
ということは右辺が整数になるときn-1Cm-1/Bが整数です
B=m/gなのでつまり(n-1)C(m-1)/(m/g)は整数ではないでしょうか
111:片山博文MZ
17/11/02 19:55:21.08 JDKI/Gfo0.net
nCmが整数なので、A*((n-1)C(m-1)/B)も整数であろう。
しかし、((n-1)C(m-1)/B)が整数と判断するのは論理の飛躍だ。
n=2, m=2, g=1と仮定すると、A=n/g=2/1=1, B=m/g=2/1=2.
すると、((n-1)C(m-1)/B)=(1C1)/2となって整数ではない。
112:デフォルトの名無しさん
17/11/02 19:59:15.85 aAcU+3M+d.net
>>110
この漸化式は0<m<nという条件のもとなのでn=mの可能性はないです
113:
17/11/02 20:01:17.09 q0hQ6vwa0.net
>>110
nCm が整数かどうかは別の漸化式
(n+1)C(k+1) = nC(k+1) + nCk
を使って帰納的に証明する
114:片山博文MZ
17/11/02 20:10:31.31 JDKI/Gfo0.net
>>111
ならば、大きな整数で桁あふれ(overflow)が起きているのかもしれない。
long longを使うか、多倍長整数を使うとよい。
115:デフォルトの名無しさん
17/11/02 20:17:29.03 aAcU+3M+d.net
>>113
うーんやっぱりそうですか
ありがとうございます
116:デフォルトの名無しさん
17/11/02 20:22:30.92 aAcU+3M+d.net
(n*n-1Cm-1)/m
と計算せず
(n/g)*(n-1Cm-1/(m/g))
と遠回りして計算したのは掛け算より前に割り算をして桁あふれを防止するためだったのですが、これだけではまだ読みが甘いみたいですね
117:片山博文MZ
17/11/02 20:33:31.27 JDKI/Gfo0.net
k>nのときnCkはゼロになるはずだ。間違えている。
118:片山博文MZ
17/11/02 20:40:49.25 JDKI/Gfo0.net
URLリンク(ideone.com)
URLリンク(keisan.casio.jp)
119:片山博文MZ
17/11/02 20:44:22.04 JDKI/Gfo0.net
>>115
100!が何桁になるかわかっているか?
120:デフォルトの名無しさん
17/11/02 20:52:14.20 Jo74z7Xm0.net
組み込みの整数使うより 多倍長整数使うような話だな
121:デフォルトの名無しさん
17/11/02 21:33:15.98 YtLG92Gup.net
πの計算みたいに配列でやればいいんだよ。
122:デフォルトの名無しさん
17/11/03 00:48:44.74 mQ2prqq70.net
π (*´ェ`*)
123:デフォルトの名無しさん
17/11/03 01:01:25.37 x/X9+IGP0.net
πの配列w
二つ並ぶのがいいな
124:デフォルトの名無しさん
17/11/03 01:17:45.54 mQ2prqq70.net
(πoπ)
125:デフォルトの名無しさん
17/11/03 01:25:33.04 exxwx2Ub0.net
配列の四則計算かw
とりま、1桁辺り1バイトからやって行くと良い。
アルゴリズムは手計算方式で。
126:デフォルトの名無しさん
17/11/03 07:02:00.94 /utJWRuE0.net
cでutf-8文字列の扱い方がよくわからないのですがどうすればいいのでしょう
127:デフォルトの名無しさん
17/11/03 07:17:35.22 3SB+84d60.net
URLリンク(www.youtube.com)
128:デフォルトの名無しさん
17/11/03 08:10:28.98 Ui3Q5cAp0.net
>>125
ソース中にリテラルで書く書式?
それともテキストファイルを読み込んでの文字列操作かな。
もしかしてWindowsでの扱い等の環境依存の話だろうか。
129:デフォルトの名無しさん
17/11/03 11:50:36.80 exxwx2Ub0.net
そーゆーのって、C言語じゃなくて、ライブラリの仕様なんで、環境わからないと誰も答えられないよな。
130:デフォルトの名無しさん
17/11/03 12:27:14.54 1lWviljw0.net
プログラム中で扱う時はiconv()で変換しちゃうと楽だな。Windowsは知らんがOSが変換やってくれなかったっけ?忘れた。
131:デフォルトの名無しさん
17/11/03 16:53:04.29 kt+ZN5MJ0.net
#include <stdio.h>
int main(void)
{
int x, y, z;
scanf("%d", &x);
y = x;
for (x = x - 1;x > 1;x--) {
z = y % x;
if (z = 0) {
x = 0;
}
}
if (x = 0)
{
printf("入力値は素数ではありません\n");
}
else
{
printf("入力値は素数です\n");
}
fflush(stdin);
getchar();
return 0;
}
素数判定用のやつ作ったんだが動かない
問題点教えてください
132:デフォルトの名無しさん
17/11/03 16:58:25.19 exxwx2Ub0.net
さすがにネタだよな?
133:デフォルトの名無しさん
17/11/03 17:06:46.06 pDgXQ2EkM.net
fflush(stdin)は無意味
あとイコールが足りない
134:デフォルトの名無しさん
17/11/03 17:09:14.02 q/3NCVak0.net
等しいかを比較するのは ==
if () の中であっても = は代入操作
× if (z = 0)
○ if (z == 0)
× if (x = 0)
○ if (x == 0)
135:デフォルトの名無しさん
17/11/03 17:11:50.30 kt+ZN5MJ0.net
すいませんマジで==忘れてましたw
あとはif文でxの値に代入する数字を1にしたら直りました
やっぱ自分だけで考えてると基本なことにも忘れてしまいますねw
136:デフォルトの名無しさん
17/11/03 23:33:54.94 exxwx2Ub0.net
ネタじゃ無かったんかいw
137:デフォルトの名無しさん
17/11/04 00:31:06.07 Wr8YwoWe0.net
宿題かな?
138:デフォルトの名無しさん
17/11/04 03:05:14.26 bSw/g7Kd0.net
おまえらバカにすることしか頭に無いのか
初心者ならこういうこともあるだろうに
139:デフォルトの名無しさん
17/11/04 03:41:42.37 NciV8/1n0.net
警告オプションが必要だな
140:デフォルトの名無しさん
17/11/04 07:34:51.98 NNCD/Zi9M.net
嫌、「直しておきました」メッセージが必要だな
141:デフォルトの名無しさん
17/11/04 10:16:02.36 t9DikZnoM.net
古代においては、(1 == y)としておけば、間違って(1 = y)とした時にコンパイルエラーで発覚する、という言い伝えが有った。
>
>#include <stdio.h>
>
>int main(void) {
> int x, y;
> scanf("%d", &x);
> y = x;
> while (x % (y -= 1))
> ;
> if (1 == y) {
> printf("入力値は素数です¥n");
> } else {
> printf("入力値は素数ではありません¥n");
> }
>
> return 0;
>}
>
142:デフォルトの名無しさん
17/11/04 13:31:32.96 3FaXzC+X0.net
>>140
あーそうだな。今でもたまにそう書いてあるソースを見かける。
いつも自分ではやってないので違和感があるw
まあでもCみたいな言語だと本当はそう書いておいた方が良いんだろうけどね。
そう言えばこの頃のコンパイラはifで代入だけしてるようなのは見つけて警告出してくれるな。
143:デフォルトの名無しさん
17/11/04 13:39:20.69 R24m495Za.net
>>140の書き方はしないでしょ。
間違って(y=1)とすることが有り得ないから。
などと偉そうに言えるようなレベルじゃないけど、そう思う。
144:デフォルトの名無しさん
17/11/04 13:39:48.38 mHYELh+Ca.net
printfの、パラメータに置換される文字列の呼び名は何ですか?
%dや%cの総称です
145:デフォルトの名無しさん
17/11/04 13:55:14.14 M43VuEZC0.net
英語だとformat specifier
日本語だと書式指定子とかそんな感じ
146:デフォルトの名無しさん
17/11/04 14:06:40.76 ubpt4sUTa.net
>>144
ありがとうございます
147:デフォルトの名無しさん
17/11/04 14:50:01.01 qs6ShQOW0.net
>>142
一昔前はどの本でも推奨してたんやで
148:デフォルトの名無しさん
17/11/04 15:27:20.00 FdHKGPou0.net
リテラルには代入できないから、リテラルを左側へ書いておく
今は、MISRA-C で、100項目をチェックする事が義務化されているから、
違反は必ず報告される
でも、トヨタのように、5/100 しか取れない企業もある。
95も違反してるw
149:デフォルトの名無しさん
17/11/04 16:10:54.87 XesRBOxx0.net
>>140 の話は >>1 の参考サイトにも出てる話だね。
C FAQ 日本語訳 URLリンク(www.kouno.jp)
17.4 に載ってる。
定数と変数の比較なら役に立つけど、変数同士の比較に使えないから
特に良くも悪くもない、という評価。
コンパイラがオプションを備えてるなら警告を出させるのが良いわな。
150:デフォルトの名無しさん
17/11/04 20:24:04.67 wPtyVAZ40.net
>>147
トヨタの例を見て分かるようにMISRA-Cは役に立たないという話か
151:デフォルトの名無しさん
17/11/04 20:33:34.59 bSw/g7Kd0.net
トヨタ社員乙
152:デフォルトの名無しさん
17/11/04 21:34:25.67 sTeHaJ1X0.net
MISRAは有効だけど盲信してるやつはバカ
153:デフォルトの名無しさん
17/11/05 16:44:19.44 rSDVGL6P0.net
全員が同じレベルで言語の仕様や処理系の実装を理解しているわけじゃないからなあ。
最底辺のレベルを合わせる為にMISRAのような約束事が有用であろう事は想像できるんだが…
俺、車業界のソフト屋じゃなくて良かったと思うわ。
いや、むしろ、いっその事、強制された方が楽か?
154:デフォルトの名無しさん
17/11/05 16:52:45.91 7kWEh0GI0.net
底辺用のサブセットだからね
155:デフォルトの名無しさん
17/11/05 20:23:18.52 AvV+p+8R0.net
COBOLの二の舞
156:デフォルトの名無しさん
17/11/05 20:37:42.87 Dhy1E5e10.net
初心者です。
C言語には標準出力関数がいくつかあって気になったのですが、
puts("文字列");
puts("文字列");
puts("文字列");
などと書くのと、
printf(
"文字列\n"
"文字列\n"
"文字列\n
);
のように書くので結果は同じようになると思うのですが、速度やリソースの消費に違いはあるのでしょうか?
どちらが速いとかメモリ消費が少ないとかあれば教えていただきたいです。
157:デフォルトの名無しさん
17/11/05 20:40:29.69 8jvJZ2xf0.net
後者は%を探すぶん遅そう
158:デフォルトの名無しさん
17/11/05 20:54:32.17 +s13f97B0.net
前者はシステムコールが3回呼ばれそうだから遅そう
159:デフォルトの名無しさん
17/11/05 21:09:58.63 oA1U3DCD0.net
putsだと自動的に改行されんのか
160:
17/11/05 21:14:56.81 cePuEsTc0.net
>>155
printf() は重い。puts() の方が軽いしコード量も少ない
161:デフォルトの名無しさん
17/11/05 21:19:49.85 Z/yFjIMy0.net
>>157
stdoutがline bufferedなら、どっちもwriteが3回呼ばれる
言語規格的には解析処理のあるprintfのほうが遅そうだけど
これぐらい単純なprintfだと、gcc/clang辺りでコンパイルするとputsに最適化される
副作用諸々でputs自体の呼び出し回数を減らすことはないから、puts1回の呼び出しで済むprintfのほうが早い
162:デフォルトの名無しさん
17/11/05 21:26:10.62 pE+6s3oz0.net
すっげー
物知りだなぁ
163:
17/11/05 21:29:46.85 cePuEsTc0.net
>>160 それはさすがになさそうだ… printf()/vfprint() のCのコードを#include しているわけではなく、単にリンカがランタイムのコードをリンクしているだけなのでは? いいかえると、printf() がCで書かれており、printf() もコンパイルするのなら最適化がかかるだろうが、さすがにそうじゃないだろう?
165:デフォルトの名無しさん
17/11/05 21:31:03.45 pE+6s3oz0.net
もうさぁ実測でいいよね
166:片山博文MZ
17/11/05 21:34:36.83 nRtobml0d.net
>>162
はい、時代遅れ発見。LLVMとGCCはお互いに競争する形で最適化の技術を進化させているんだよ。
167:デフォルトの名無しさん
17/11/05 21:41:12.14 Z/yFjIMy0.net
gccはビルトイン関数のprintfを持ってるのに、ライブラリをリンクとか何言ってんだコイツ
168:デフォルトの名無しさん
17/11/05 21:43:19.65 Z/yFjIMy0.net
ランタイムのコードをリンクか、どっちにしろアホ晒してるのは変わらんか
169:
17/11/05 21:46:57.66 cePuEsTc0.net
へえ、gcc4 からですか…
URLリンク(blog.kmckk.com)
thanks
170:デフォルトの名無しさん
17/11/06 01:36:37.31 ixOJFcN/0.net
いやいや勉強になるわ
171:デフォルトの名無しさん
17/11/06 06:37:53.91 uTTN+kxR0.net
>>167 のリンク先を読んだのだが…
printfで色々条件、最後が改行だったらputsに置き換え、は分かったけど
最後が改行でない場合はfputs( , stdout)に置き換えるわけにいかんのじゃろか?
172:デフォルトの名無しさん
17/11/06 08:19:42.45 a7D2X9T80.net
stdoutがフラッシュされるタイミングが改行だから拙いんじゃね
173:デフォルトの名無しさん
17/11/06 09:46:39.21 2hip9t+X0.net
PC で組むなら、たいした問題にならないリソースの心配よりも、
統一して見やすいように気を使うべきだろうね。
174:デフォルトの名無しさん
17/11/06 15:24:45.69 TqJSXF8C0.net
>>167
詳しい解説サンクス!
175:デフォルトの名無しさん
17/11/06 16:24:18.19 Z2s1OQfZ0.net
fputs(
"文字列1\n"
"文字列2\n"
"文字列3\n"
, stdout
);
176:デフォルトの名無しさん
17/11/06 17:25:31.98 f1KpQ6jU0.net
みなさんありがとうございます。
末尾の改行程度しかないprintfはputsに置き換えられるんですね。
ググってみたりもしたんですが、最近のPCであれば速度にほとんど違いが出ない様なことも書いてありました。
171さんの言う通り速度やリソースよりも見やすさや読みやすさの方が大事になりそうですね。
勉強になりました。
177:デフォルトの名無しさん
17/11/07 05:32:04.97 2eQgtTM30.net
塵も積もれば何とやらで
すぐ砂時計だの輪っかだのになるのが
M$の作風
178:デフォルトの名無しさん
17/11/07 18:15:10.39 pVSOD8mN0.net
入力が入れる前に厳密にされてないとprintfは怖くて使いたくないなエラーになるし
プログラミング問題とかなら入るの制限されてるから使う時もあるけど
179:デフォルトの名無しさん
17/11/08 00:52:24.03 +F77Ugxq0.net
自動で実行ファイルが作成されてその実行ファイルが新しく実行ファイルを作ってその実行ファイルが…
みたいな無限増殖するウイルス的なやつって理論上作れるの?
作る気はないがファイル名を自動で生成して上書きするようしていったら全ファイルが空ファイルになるってのも可能なのか?
180:デフォルトの名無しさん
17/11/08 00:53:30.71 Fypp0IbQ0.net
可能
181:片山博文MZ
17/11/08 00:55:32.02 TZ5JAUzSd.net
>>177
GetModulePathName+CopyFileで誰でも作れる。違法。
182:片山博文MZ
17/11/08 02:35:25.82 TZ5JAUzSd.net
>>177
全ファイルが空になるというのは、イカタコウイルス。可能だが違法。
183:片山博文MZ
17/11/08 02:50:08.78 TZ5JAUzSd.net
やり方は直接は教えられないから、Win32APIスレで個別の処理のやり方を細かく質問するといい。
184:デフォルトの名無しさん
17/11/08 10:05:36.22 2J8ZwtJ20.net
なにこのスレ怖い
185:デフォルトの名無しさん
17/11/09 00:14:51.16 th5mXoJq0.net
プログラミング全体に言えることだがreturnがよくわからない
戻り値とかはなんとなくわかる
戻り値を表示するわけだからprintf要らずなわけ?
186:デフォルトの名無しさん
17/11/09 00:20:42.43 BpTh9vVd0.net
日本語でok
187:デフォルトの名無しさん
17/11/09 01:05:19.54 dSouu86q0.net
>>177
fork() してプロセス作るの繰り返すだけでいいのでは?ファイル作る必要あるか?
作ったとしてもそのファイルの内容は元のやつと同じなんだろ?
Windows の場合はどうするか知らない。fork() と同じような動きをするAPIがあるなら
それ使えばいい。(cygwinのライブラリ使えばいいか)
188:デフォルトの名無しさん
17/11/09 01:06:21.38 dSouu86q0.net
>>183
君は return を何か別のものと勘違いしてはいないか?
189:デフォルトの名無しさん
17/11/09 01:15:30.78 ibgaV5zkM.net
>>183
何か関数のコードをここに書いて、自分なりに説明してみ?
優しいお兄さんたちが説明のアラを指摘してくれるよ
190:デフォルトの名無しさん
17/11/09 01:31:12.69 th5mXoJq0.net
>>187
じゃホント適当なの
int main(void){
int a,b;
scanf("%d %d",&a,&b);
a=a+b;
return a;
}
適当に
基本自分はa=a+bの後の行にprintf("%d",a);って入れるけど戻り値を表示するだけならreturnで十分なの?って聞きたい
191:デフォルトの名無しさん
17/11/09 01:44:44.36 kZJdPPiU0.net
>>188
main関数のreturnの値は0固定だろ。
正常に終了したかどうかを示す数値を返さないとダメなんだし
192:デフォルトの名無しさん
17/11/09 01:52:12.46 dSouu86q0.net
>>188
それどこにも何も出力してないよ。一応 main() での return はプログラムを実行した側に
ステータスとして返されたりするがその辺はOSやmain()を呼ぶ側のコード依存だ。
で、それはプログラムの実行中で起きたエラーを伝えるためによく使われている。
0ならエラーなしで1ならエラーみたいに。つまり普通は計算結果を返すためには使わない。
193:デフォルトの名無しさん
17/11/09 01:52:57.21 th5mXoJq0.net
>>189
0固定なの?
苦Cでmainじゃない関数で使ってたけど
よく分かんないな
194:デフォルトの名無しさん
17/11/09 02:31:24.91 dSouu86q0.net
>>191
固定と言うか、昔からの慣習で普通は0返すように書くんだよ。UNIXでの慣習ね。Linuxでも同じ。
UNIXではシェルスクリプトで動かした時にエラーかどうかを判定するのに使うことがある。
(シェルの if 文等で直接使える。Windows のコマンドプロンプトでもほぼ同じ)。
0が返されたら正常終了で0以外がエラーね。
まあとにかく歴史的な問題でそうなっていると思って良い。そういう意味では main() からの
return だけは特殊なものだと思っていい。
195:デフォルトの名無しさん
17/11/09 06:59:07.81 tZYUBTdz0.net
>>188
return a; と書いても基本的にはaの値は表示されないよ。
returnは関数内で計算した結果を呼び出し側に返すだけ。
値を見たければprintf等を使って表示する必要がある。
呼ばれた関数内で(途中経過として)表示するか、
呼び出した側で(関数の結果として)表示するか、は目的次第だが。
main() はOS(WindowsとかLinuxとか)からコマンドとして呼び出される関数、
と考えると分かりやすいかも。
main() 関数のreturnの値はOSに返される。
返された値をどう扱うかはOS側の問題だわね。
196:デフォルトの名無しさん
17/11/09 07:02:59.09 HmHTv3HB0.net
return は表示装置に値を戻す(表示する)機能ではない
197:デフォルトの名無しさん
17/11/09 07:18:13.98 /m6aHr1P0.net
>>191
「自作関数を作る」あたりのページで出てくるsum関数でしょ?
あれってただ単に今までmain関数で return 0 しかしていないから、例として同じように書いているだけだと思うよ。
「関数から数値を返す」のページまで行けば return num してるsum関数が出てくるよ。
198:デフォルトの名無しさん
17/11/09 13:19:13.30 U5AasQBn0.net
print関数だけで表示するだけの関数とかならreturn0するけど衝突判定とかならbool型返したりするからな
199:デフォルトの名無しさん
17/11/10 15:35:52.06 VD/o6LfMM.net
何ができれば、c使えるって言っていい?
200:デフォルトの名無しさん
17/11/10 15:40:07.94 ZWtrLrii6.net
mallocの実装
201:デフォルトの名無しさん
17/11/10 15:43:10.76 u7W9Owtb0.net
自分が使っているPCなんかで、
処理を自動で行いたいなと思った時に、
それをC言語を使って実現出来るなら
202:デフォルトの名無しさん
17/11/10 15:58:26.05 VNjqndEHH.net
>>199
それ、OS固有のAPIの知識だらけで、Cがきちんと使える能力は測れない
203:デフォルトの名無しさん
17/11/10 16:06:39.20 u7W9Owtb0.net
実装は知識だけでは出来ないからね
204:デフォルトの名無しさん
17/11/10 16:34:50.57 TjdUuruGa.net
>>197
数年かけてLinuxカーネルを読破できたら
205:デフォルトの名無しさん
17/11/10 16:50:46.00 3LbNPw0Wp.net
コールバック関数の型宣言とか、
関数ポインタの扱いを難無く出来るか?
とかかな?
206:デフォルトの名無しさん
17/11/10 18:00:36.54 Dvtc6/jjM.net
Cの限界を感じたら習得したといえる
207:デフォルトの名無しさん
17/11/10 18:32:02.73 23yuj+zi0.net
p = p() で駆動するようなステートマシンで
自分のポインタを返す関数 と それを保持するポインタの宣言とか
208:デフォルトの名無しさん
17/11/10 19:29:46.79 xd+jRbDd0.net
Cコンパイラをインストールしまくる。
209:デフォルトの名無しさん
17/11/10 19:31:16.24 YeFpRpYh0.net
LISPかforthを作る
210:デフォルトの名無しさん
17/11/10 20:07:11.53 f7hdF1Yr0.net
use the force luke
211:デフォルトの名無しさん
17/11/10 20:08:56.37 KTiHfL4P0.net
Ubuntuをインスコできる。
212:デフォルトの名無しさん
17/11/10 20:23:37.84 MIqJX5DTM.net
>>200
「きちんと」とか書いてない要件を作り込んでバグだらけのコードを量産する自称玄人乙
213:デフォルトの名無しさん
17/11/10 21:03:47.59 UsP+TtJIM.net
ポインタがわからないです
メモリのアドレスの最初を配列に入れて
呼び出すときそのアドレスの最初を読み込んでデータを引き出すということなんでしょうか?
214:デフォルトの名無しさん
17/11/10 21:09:11.01 7i6+bCDW0.net
配列?
215:デフォルトの名無しさん
17/11/10 21:14:49.24 UsP+TtJIM.net
すいません
本当に無知なのでアドレスがよくわかりません
バカにもわかるように教えていただけると嬉しいです
216:デフォルトの名無しさん
17/11/10 21:15:04.33 JEFbhK0N0.net
ポインタの説明で、何かに例えて説明しようとすると余計に混乱する宿命。
217:デフォルトの名無しさん
17/11/10 21:24:06.37 3LbNPw0Wp.net
アドレス=住所
218:デフォルトの名無しさん
17/11/10 21:24:52.41 3LbNPw0Wp.net
巨大な集合住宅を想像してごらん?
219:デフォルトの名無しさん
17/11/10 21:25:53.22 3LbNPw0Wp.net
しかも1階建ての超長い長屋な。
220:デフォルトの名無しさん
17/11/10 21:28:10.51 3LbNPw0Wp.net
じゃあ、貨物列車の方が良くね?
221:デフォルトの名無しさん
17/11/10 21:29:46.76 3LbNPw0Wp.net
やっぱ、列車だと動くからダメだな。
222:デフォルトの名無しさん
17/11/10 21:33:05.26 3LbNPw0Wp.net
…すまん、まとまらないから誰か頼むわ。
223:デフォルトの名無しさん
17/11/10 21:53:36.59 mQGNgvjy0.net
コンピュータの中には何百メガとか何ギガとかのバイト数のメモリがあって、
データ(数値や画像や文字列、プログラム自体も)はメモリに記憶されていて、
メモリには1バイトごとに連番のアドレスが割り振られている。
…程度のイメージなら現代じゃ誰でも共有してると思うんだけど。
女学生が携帯電話機を使ったり、子供がゲームをする時だって、
「メモリカードの容量が足りなくなった」とか言うでしょ。
それとも、容量としてのメモリ(どれだけ入れられるのか)は飲み込めても
アドレスという概念(どこに入ってるのか)になると飛躍が必要なのかな。
224:デフォルトの名無しさん
17/11/10 21:56:49.72 3LbNPw0Wp.net
アドレスが住所の意味で、小人さんひとりひとりが住んでる場所を表してて、お手紙を出したりもらったりするのに使うんだよ?
でok?
225:デフォルトの名無しさん
17/11/10 22:04:11.83 bPzBG0Jo0.net
いわえる宅急便で品物の上に貼るあれよあれがないとどこに送れないか解らないっていうあれ
226:デフォルトの名無しさん
17/11/10 22:06:56.78 k49jiBoo0.net
RAMやROMにデータがどう書き込まれているのかイメージ出来ているのかな?
227:デフォルトの名無しさん
17/11/10 22:19:39.46 jSzmIFsta.net
>>211
本屋さんへ行って「C言語ポインタ完全制覇」って本を買って読もう
それが一番近道だと思う
228:デフォルトの名無しさん
17/11/10 22:21:46.83 WKyXN66O0.net
>>213
じゃあまあざっくりと集合住宅で例えるか
例えば char hoge; と宣言したとする
するとコンピュータは空いてる部屋を1つ、hogeのために割り当ててくれる
仮に部屋番号を301号室としようか
広さは四畳半のワンルーム
君はこの部屋に、'a' でも 'x' でも好きな文字を入れることができる
次に char piyo; と宣言したとする
そしたらやっぱりコンピュータは部屋を割り当ててくれる
部屋番号はhogeと別にしないと被っちゃうから401としよう
間取りは同じ、四畳半のワンルーム
君がchar型の変数を宣言する限り、広さは常に四畳半だ
更に、int foo; と宣言してみよう。
同じように部屋を割り当ててみるが、困ったことにfooは身体が大きくて四畳半に収まりきらない
これはfooがchar型ではなくint型だからだ
そこでコンピュータは隣の3部屋の壁を取っ払って、計4部屋分の広さにしてfooに割り当てる
最初に与えられた部屋番号を501とすると、fooは501,502,503,504の4部屋を占領することになる
このそれぞれの部屋番号が、いわゆるアドレスだ
つまりまずコンピュータに膨大な数の部屋が用意されてて、変数宣言や関数宣言などをするごとに適宜空いてる部屋を割り当てていく
そのときに割り当てられた部屋の部屋番号が、その変数なり関数なりのアドレスとなる
fooみたく複数のアドレスにまたがってる場合は、その先頭アドレス(今回でいうと501)がfooを指定する際のアドレスになる
変数名からその変数に割り当てられたアドレスを知るには、&を使い&hogeや&fooと書く
229:デフォルトの名無しさん
17/11/10 23:20:18.63 jSzmIFsta.net
>>213
一応考えてみた
アドレス= 住所だと考えて
どこでもドア = ポインタ変数そのもの
行きたい場所 = 参照先のアドレス
として
・自分の部屋にどこでもドアを置く = ポインタ変数を宣言する
この時のポインタ変数のアドレス(ドアの置かれてる場所)は自分の部屋
今はまだドアの向こうはどこにも繋がっていない
・どこでもドアの向こう側をしずかちゃんの風呂場にする = ポインタ変数の中身を参照先(しずかちゃんの風呂場)のアドレスに書換える
これでポインタ変数の中身(=ドアの向こう側)はしずかちゃんの風呂場と繋がる
・ドアを開けて風呂場を見る = *を付けてポインタ変数にアクセスする
・ドア自体がどこに置かれてるかを知る = &を付けてポインタ変数にアクセスする
ポインタの嬉しい点はわざわざしずかちゃん家に行かなくても自分の部屋に居ながら
どこでもドアを介して風呂場を覗く事が出来るので移動の時間が省けて時短になる
230:デフォルトの名無しさん
17/11/11 00:39:20.61 4HyMUlDc0.net
初心者はたとえ話するのが好き。
231:デフォルトの名無しさん
17/11/11 01:09:56.98 QwHnz2ZY0.net
>>227
そんななげーの覚えれねーよ
232:デフォルトの名無しさん
17/11/11 01:16:01.20 4HyMUlDc0.net
ヘネパタ読破してからプログラミングに進め。
233:デフォルトの名無しさん
17/11/11 01:32:47.13 cTWJmMx00.net
URLリンク(animalplanet.jp)
234:rectory/images/dir11301.jpg
235:デフォルトの名無しさん
17/11/11 01:33:46.86 cTWJmMx00.net
URLリンク(blog-imgs-51.fc2.com)
236:デフォルトの名無しさん
17/11/11 02:43:48.01 OXx9+Toc0.net
ポインタを説明するときにアドレスで説明するのって、初心者による初心者向けの説明に多いけど
それはアドレスを知ってる人向けで、ここからさらにアドレスを一生懸命別の何かで
例えるのはかえって分かりにくいだけにしか思えない
237:デフォルトの名無しさん
17/11/11 04:15:47.28 qvyXx+2n0.net
喩えるんじゃなくてメモリそのものを教えたほうがいい
238:デフォルトの名無しさん
17/11/11 04:17:53.56 qvyXx+2n0.net
URLリンク(skytechlasers.com)
239:デフォルトの名無しさん
17/11/11 04:30:42.45 3tqm8fVd0.net
>>211
マイコン小僧的な意味での理解が必要かもしれないなあ
ポインタ定義した時点で、コンパイラが「アドレスを入れるためのメモリ領域」なり
「CPUのレジスタ」なりを使うようにしてくれる
貴方が int* a = 300; とか書いたら、 コンパイラは300という数字をどこかに保存しておいてくれる
CPUのレジスタか、特定のメモリ領域かは処理系次第だが
で、計算やるってなったら「CPUの間接参照機能」を利用する
アセンブラ側で「間接参照機能を使え」って感じのコードを吐くのよ
そういうオペコードがある
で、間接参照機能を使った場合、CPUはメモリの内容を2バイトか4バイトか見るでしょ
CPUは「今読んだ数字はメモリの番地である」と判断して
CPU側でいてあるメモリ番地の内容を読み込む
で、読んだデータはコンパイラが吐いたアセンブラのコード次第だが
とにかくCPUには「ある数字をメモリなりレジスタから読み、次にそこに書いてた数字をアドレスと判断し、別のメモリアドレスを読む」って機能がある
それを使うのがポインタ
そんな感じ
240:デフォルトの名無しさん
17/11/11 04:33:00.54 3tqm8fVd0.net
そんな間接参照なんてないです、って処理系もあろうが
Cコンパイラがアセンブラレベルで ご ま か し ま す
ってな話かと
241:デフォルトの名無しさん
17/11/11 04:36:10.38 3tqm8fVd0.net
眠い時に書くとろくでもねぇ文章になるわーすまん
とりま「CPUの間接参照」で調べてくれ、そっちのほうが早いかも知らん
242:デフォルトの名無しさん
17/11/11 04:46:59.68 3tqm8fVd0.net
アドレスについては……
Q: たとえばここに 1 2 3 4 って数字があるとするでそ
二番目を起点にして、二つ指差してみて、起点は指差しの対象に含むよ
A: 指差す箇所を[]でくくると 1 [2] [3] 4 になるかと
そんな感じのテキトーさでいいと思います、これがただ例えば0x000F34824になるだけで
243:デフォルトの名無しさん
17/11/11 04:57:58.31 WAa7vu/G0.net
アドレスはアドレスだろ。何にもたとえちゃいねーよ。まんまだよ。
244:デフォルトの名無しさん
17/11/11 04:58:31.67 WAa7vu/G0.net
アドレス=住所な。
245:デフォルトの名無しさん
17/11/11 04:58:49.86 3tqm8fVd0.net
なお、ポインタのだいたいの使い道は
・クソでかいデータを複数の関数で参照せなあかんとき(画像処理とか)に先頭アドレスだけ渡してあとよろしこって奴
・呼び出し「先」側でなんかセットアップしてもらわなあかんとき、Win32APIあるある
・関数テーブル(30だか50だか、個別に使う関数の先頭アドレスと、そこに飛ばす条件をペアにした配列があるの)
・無名関数もどきのことをやりたいとき、一部分だけ後付け処理やりたいんでそこだけjmpさせて戻る系の奴というか、sortみたいなの
のどれかやな、こんくらいの説明でいいんだろうか? イミフすぎて正直すまんかった
246:デフォルトの名無しさん
17/11/11 13:17:40.59 cTWJmMx00.net
コンピュータの内部構造をどの程度知っている人が相手なのかで説明方法を変えた方が良いように思う。
247:デフォルトの名無しさん
17/11/11 13:21:55.51 Qyuy+YBPp.net
TTLロジックICでアキュムレーター組めるくらいなら…
…あ、多分説明自体不要かw
248:デフォルトの名無しさん
17/11/11 13:41:35.27 6HxAQryE0.net
初心者は一度バイナリーエディタやメモリエディタを弄ってみることを進める・・・と無責任に言ってみる。
249:デフォルトの名無しさん
17/11/11 15:25:23.65 cTWJmMx00.net
8bitマイコンみたいなやつだと説明は少し楽になるな。メモリ空間が64KBしかないし。
まあ昔はそれでもバンク切り替えして沢山メモリ使えるようにしていたが、考える上では楽だ。
今はメモリ空間も広大になってメモリブロック切り替えてアドレス変わるのは当たり前だったりして説明が面倒だ。
250:デフォルトの名無しさん
17/11/11 15:28:20.12 ljWP0iHz0.net
>>245
debug.exe ですね
251:デフォルトの名無しさん
17/11/11 17:00:50.95 6HxAQryE0.net
MON
*■
252:デフォルトの名無しさん
17/11/11 17:08:09.72 HnFKgro40.net
おじいちゃん・・・
253:デフォルトの名無しさん
17/11/11 17:25:03.39 TdmokUpS0.net
>>246
初心者相手なら論理アドレスで説明すればいいだけ
アドレス変換とかの説明はもっと後でいいだろ
254:デフォルトの名無しさん
17/11/11 18:27:36.19 2S6WQY7h0.net
&h■
255:デフォルトの名無しさん
17/11/11 18:34:58.95 tdhPifsQM.net
CALL -151
256:デフォルトの名無しさん
17/11/11 19:57:56.44 Hv/PaJUT0.net
>>252
懐い...
257:デフォルトの名無しさん
17/11/11 23:12:19.01 4HyMUlDc0.net
CASL→C→Java→C++の順でどうぞ。
258:デフォルトの名無しさん
17/11/12 02:33:10.79 0YSprajH0.net
>>252
な、なぜそれを知っているw
259:デフォルトの名無しさん
17/11/12 05:22:01.75 yBBP+7vl0.net
SWEET16
260:デフォルトの名無しさん
17/11/12 06:32:07.24 61B/9ygA0.net
ポインタの前にアドレスが理解できないってどういうことよ…
アドレス=メモリ上の位置、だよ
例えば64kbのメモリを積んだ機械ならアドレスの全範囲は0x0000~0xffffだが
そんなこと気にしなくても使えるようにしたから高級言語なのよ
int a;
int *pa;
としたとき、コンパイラはaとpaそれぞれを上記範囲の"どこか"に割り当てる
その"どこか"をaやpaという名前で呼ぶことにするよ、という宣言だから
ただし「変数は"どこか"のアドレスの別名である」ということを"利用"することはできる
pa = &a;
とすれば、paには「aの実際の場所(=アドレス)」が入り
*pa = 123;
とすれば、paが現在指しているアドレス、即ち「aの実際の場所」に123が入る
261:デフォルトの名無しさん
17/11/12 10:09:12.41 H0u2BwIs0.net
お前らが箱とか部屋とか変なこと言いだすから初学者が混乱するんだろ。
262:デフォルトの名無しさん
17/11/12 10:18:34.45 pV+DiiLQ0.net
変じゃない説明よろしく
263:デフォルトの名無しさん
17/11/12 10:24:13.57 H0u2BwIs0.net
CASLが基本。
264:デフォルトの名無しさん
17/11/12 10:34:03.82 534592TW0.net
ニモニック表片手にハンドアセンブルしてみろ
そうすりゃアセンブラやコンパイラがなにしてるか
馬鹿でもない限りいろいろ分かる
265:デフォルトの名無しさん
17/11/12 11:18:13.17 JQDoPKa1a.net
自分は二重ポインタってのが分からないです
アドレスの入るアドレスがあるなら
アドレスの入るアドレスの入るアドレスもあるんですか?
266:デフォルトの名無しさん
17/11/12 11:23:06.41 H0u2BwIs0.net
アドレスにアドレスは入らないだろ。
267:デフォルトの名無しさん
17/11/12 11:28:32.94 H0u2BwIs0.net
アドレスを記録位置と言い換えてみたらどうだろうか。
268:デフォルトの名無しさん
17/11/12 11:30:59.32 H0u2BwIs0.net
メモリーを記録装置、メモリー上のバイトを記録素子、アドレスを記録位置。
どうだい。
269:デフォルトの名無しさん
17/11/12 11:32:35.21 StX7DGK40.net
変数の位置(アドレス)を示す変数 = ポインタ
そいつ自体も変数だからアドレスを持ってるしポインタも持てる
270:デフォルトの名無しさん
17/11/12 11:33:44.56 H0u2BwIs0.net
記録位置の入った素子の位置が入った記録素子�
271:B これなら有りえるとすぐわかる。
272:デフォルトの名無しさん
17/11/12 11:35:10.76 H0u2BwIs0.net
>>266
ポインタはアドレスではない。
273:デフォルトの名無しさん
17/11/12 11:40:26.83 V8vWJYoP0.net
物理的な描像にするな。
論理的な本質部分を説明しろ。
274:デフォルトの名無しさん
17/11/12 11:41:52.30 H0u2BwIs0.net
Cから物理を取り除いたら役に立たない古代文明。
275:デフォルトの名無しさん
17/11/12 11:43:40.40 V8vWJYoP0.net
ハートは抽象的モデル化しろ。
276:デフォルトの名無しさん
17/11/12 11:44:09.30 V8vWJYoP0.net
x ハート o ハード
277:デフォルトの名無しさん
17/11/12 14:48:35.92 w0XJ4hAE0.net
>>265
メモリー上の位置でいいんじゃね?
これがイメージできなきゃ無理
278:デフォルトの名無しさん
17/11/12 14:50:03.54 BnEu6Dc30.net
C使う以上、物理的な概念から逃れる事は不可能。
279:デフォルトの名無しさん
17/11/12 14:54:31.77 MOg5phwx0.net
>>262
ある
3重でも4重でもいくらでも
一般的に使うのは2重までだが
280:デフォルトの名無しさん
17/11/12 15:11:05.31 61B/9ygA0.net
○重ポインタという言葉はあまりオススメしない
いくら重ねようが「~へのポインタ」だ
int a = 123;
int *pa = &a; /* 「int型」へのポインタpa */
int **ppa = &pa; /* 「int型へのポインタ」へのポインタppa */
int ***pppa = &ppa; /* 「int型へのポインタへのポインタ」へのポインタpppa */
参照のイメージ([アドレス][値])
[a][123]
[pa][&a] -> [a][123]
[ppa][&pa] -> [pa][&a] -> [a][123]
[pppa][&ppa] -> [ppa][&pa] -> [pa][&a] -> [a][123]
281:デフォルトの名無しさん
17/11/12 17:57:06.14 dvIcUwwY0.net
確かにポインタは2重以上はなるべく使いたくないな。混乱するし。
282:デフォルトの名無しさん
17/11/12 18:01:39.60 C1sLEmf00.net
そうだなポインタを文字列の格納だけに使うならアドレスは関係ない
int型で変数を操作するとかなら話は別だけどな
283:デフォルトの名無しさん
17/11/12 18:02:47.18 H0u2BwIs0.net
二重以上には二重も入るのだが、本当にそれでいいのか?
284:デフォルトの名無しさん
17/11/12 18:05:10.12 5J9eZD000.net
二重ポインタって言い方が紛らわしい
「ポインタが二重」って意味が通じない。
もともとは * が2つ付いてることを二重って言ってるんだろうけど
285:デフォルトの名無しさん
17/11/12 18:20:47.35 H0u2BwIs0.net
ポインタは型ではないので、二重のポインタという言い方はあり得るのではないか。
286:デフォルトの名無しさん
17/11/12 18:22:14.17 VcNgV3aF0.net
ポインタの配列 配列のポインタ ポインタのポインタ
287:デフォルトの名無しさん
17/11/12 18:25:05.93 MOg5phwx0.net
>>279
「なるべく使いたくない」だからいいんじゃね
288:デフォルトの名無しさん
17/11/12 18:25:48.95 ppEJgx+i0.net
三重以上のポインタって実際に使われているの?
289:デフォルトの名無しさん
17/11/12 18:25:59.93 H0u2BwIs0.net
int型へのポインタに対するchar型へのポインタとかあるのなら紛らわしいという主張も理解できるが。
そんなものは無いので。
***を三重のポインタというのは合理的に見える。
どうだい。
290:デフォルトの名無しさん
17/11/12 18:28:26.99 ppEJgx+i0.net
int型へのポインタ型へのポインタ
char型へのポインタ型へのポインタ
291:デフォルトの名無しさん
17/11/12 18:28:46.98 5fy9hb990.net
>>284
15年前大学で4重ポインタの地獄を目にした
292:デフォルトの名無しさん
17/11/12 18:30:54.73 ppEJgx+i0.net
>>287
型宣言の読解が試験にでたとか?
293:
17/11/12 18:36:30.86 Va1KoPXV0.net
>>284
スレリンク(tech板:26番)
294:デフォルトの名無しさん
17/11/12 18:36:50.26 5fy9hb990.net
>>288
研究課題で先輩が作ったライブラリのプログラム
それを使って成果を出すのが自分の卒論…
295:デフォルトの名無しさん
17/11/12 18:42:31.96 VcNgV3aF0.net
3次元配列を生成して引数に書き戻すような構造なのか
4次元配列を生成して戻すようなのか
各次元で大きさが固定なら 1次元配列にして 添え字演算で4次元にしちゃうな
296:デフォルトの名無しさん
17/11/12 19:35:51.01 BnEu6Dc30.net
リスト構造とかツリー構造とか、繋げたり外したりすんのに使うよな?
297:デフォルトの名無しさん
17/11/12 19:57:25.27 MOg5phwx0.net
>>292
でも2重までじゃね?
298:デフォルトの名無しさん
17/11/12 20:33:06.12 0YSprajH0.net
>>280
階層の方が良いか?
299:デフォルトの名無しさん
17/11/12 21:04:53.38 RBwKcf3Fa.net
x,y,z座標表すのにint***を使
300:ったことがある
301:デフォルトの名無しさん
17/11/12 22:25:07.93 Q7xN5Euu0.net
2重以上になりそうなときは構造体にまとめちゃうからなぁ。
302:デフォルトの名無しさん
17/11/12 22:26:52.43 5J9eZD000.net
>>294
多分、階層の方がわかりやすいだろうね
int ***p; というポインタ変数pで p[x][y][z] とすると、
*(*(*(p + x) + y) + z)
を参照する。このあたりを分かりやすく言えるといいんだけど
303:デフォルトの名無しさん
17/11/13 00:06:28.13 NsFkY9mQ0.net
同一ファイル内の関数を単体で自動化テスト出来る何かスマートな方法はないものか
他のテスト周りで小回りが効く言語と比べると単体テストがお辛い
304:片山博文MZ
17/11/13 00:11:14.56 GVKu0VVYd.net
>>298
惜しい。C++だったら、コンストラクタでオートメーションできるのに。
305:デフォルトの名無しさん
17/11/13 05:48:49.26 m7i5EnEm0.net
テストコードを入れておくしかない。
306:デフォルトの名無しさん
17/11/13 14:10:14.51 oBHzUCYz0.net
>>295
三次元扱うと***pくらい何て事無いよね
307:デフォルトの名無しさん
17/11/13 14:21:03.70 M4Fu1SNu0.net
構造体のメンバーの構造体のメンバーの構造体のメンバーのつもりで
ポインタのポインタのポインタとかいい気になって使ってたら、
エクセプションの嵐でワラタw
308:デフォルトの名無しさん
17/11/13 14:23:47.67 rCuenLSS0.net
正しい指し先を格納してるかはコードの書いた奴の責任だからね
言語で保障してくれない
309:デフォルトの名無しさん
17/11/13 14:41:15.42 xUyRVn+md.net
有名な言葉思い出した。
プログラムは意図した通りには動かない、
書いた通りに動く。
310:デフォルトの名無しさん
17/11/13 15:23:54.44 U+8SrSdXM.net
ハードがまともに動いている前提でな。
タイマーLSIにall0ぶち込むなんてのはどこのマニュアルにも
書いてないバッドノウハウだろうに
311:デフォルトの名無しさん
17/11/13 16:47:57.07 bTqh5JwP0.net
>>298
google testとかcpp testとか使えば?
312:デフォルトの名無しさん
17/11/14 05:34:12.35 Qlty8abH0.net
三次元配列を扱うのに三重ポインタが出てくると思っている池沼がいるな
313:デフォルトの名無しさん
17/11/14 09:52:35.71 1+/iXMbtp.net
まあ、Cは次元とかオフセット計算が掛け算になるだけだからな。
何次元にしようとリニアな配列のままさ。
314:デフォルトの名無しさん
17/11/14 09:54:58.20 1+/iXMbtp.net
俺はポインタを諦めて、構造体配列のインデックスでリンクするリスト構造を作ったわ。
315:デフォルトの名無しさん
17/11/14 17:36:47.28 ijEEO/Co0.net
誰かが書いてあって気になったんだけど
double a;
scanf("%if", &a);
ってf単体じゃないの?
316:デフォルトの名無しさん
17/11/14 17:46:40.44 CqmbHxm/0.net
%lfじゃなくて?
317:デフォルトの名無しさん
17/11/14 18:28:10.04 ijEEO/Co0.net
>>311
間違えたそれだ
318:デフォルトの名無しさん
17/11/14 18:42:01.06 fdj+YHIz0.net
long double は別物として実装していない?
319:片山博文MZ
17/11/14 18:56:38.89 Qnc8WtYFd.net
scanfでは、floatが%fで、doubleが%lfだ。printfでは区別がない。
320:デフォルトの名無しさん
17/11/14 19:35:59.33 ZWJmr3O/0.net
cでUTF-8のファイル読み書きとデータの取り扱い方が分からないです
もしかしてできないのかな?
321:デフォルトの名無しさん
17/11/14 19:57:38.61 mdecs3M50.net
調べるとすぐにwikipediaが出てきたよ
URLリンク(ja.wikibooks.org)
322:87%E5%AD%97%E3%81%A8%E6%96%87%E5%AD%97%E5%88%97#Unicode.E6.96.87.E5.AD.97.E3.82.BB.E3.83.83.E3.83.88 文字を「L"」で囲むとその文字を表現するワイド文字型の数値となる Unicode文字セットでは、標準ライブラリの関数を使う前にロケール(地域)を設定する必要があり、また、Unicode用の関数を使う必要もある // wchar_t型 wchar_t wc = L'a'; // wchar_t型の変数wcに文字L'a'を格納 _wsetlocale(LC_ALL, L""); // ロケール(地域)を設定する wprintf(L"変数wcに格納された文字は%c", wc); //wcを文字として表示 wprintf(L"変数wcに格納された数値は%4x", wc); //wcを数値として表示
323:デフォルトの名無しさん
17/11/14 20:29:12.24 1+/iXMbtp.net
だから、文字セットはライブラリの範疇だからC言語スレで聞くなよ。
おまえが使ってるコンパイラのスレにでも行け。
324:デフォルトの名無しさん
17/11/14 20:29:48.26 M89KBFlu0.net
何したいかによるんじゃね
素でもそれなりには扱えるし、不十分ならライブラリ探してもいい
どうしても無理なら慣れた文字コードに変換すればいいけど、こっちは一部文字情報が欠落するかもね
325:デフォルトの名無しさん
17/11/14 20:58:01.97 ZWJmr3O/0.net
>>316
ありがたい
なんとかなりそう
326:デフォルトの名無しさん
17/11/15 06:11:40.94 1fEpam2j0.net
「配列へのポインタ」で嘘教えてるクソサイト
327:デフォルトの名無しさん
17/11/15 08:01:18.30 2LyFVpmC0.net
エンコーディングにかかわらず、ただのバイト列だからchar*でいい
328:ビル・ジョブス
17/11/15 09:06:23.81 sfEUfVZe0.net
配列名は変更できない左辺値
329:デフォルトの名無しさん
17/11/15 10:37:31.14 Iv8iuDMF0.net
次のC規格でそろそろ文字を扱う関数全てunsigned charに変更してくれないかな
utf8でもsjisでもだけど1バイト目の判定でいちいちキャストするのが不毛すぎる
賢明なプログラマならcharなどというプリミティブ型をそのままの名前で使わずちゃんと
typedef char str_t;
とかしてるはずだし、してない愚者はもうシステムもろとも切り捨てていいだろう
-1が欲しいために結局intに拡張されるんだからcharの時点では符号は不要なんだよ
330:デフォルトの名無しさん
17/11/15 10:45:30.80 5eRwFnaIp.net
C#みたいにbyte型作れば?
それかマルチバイト型
331:デフォルトの名無しさん
17/11/15 18:45:36.23 /fqUZ3V60.net
>>323
ハゲドゥ
332:デフォルトの名無しさん
17/11/15 20:52:19.99 edi6IXQo0.net
>utf8でもsjisでもだけど1バイト目の判定でいちいちキャストするのが不毛すぎる
いまどきそういうencoding依存のコードをそんなに頻繁に書いているんだとしたら
それ自体が不毛な気も。
333:デフォルトの名無しさん
17/11/16 10:46:07.94 QxSeP1oQa.net
なんのために皆cやってるん?
334:デフォルトの名無しさん
17/11/16 10:47:45.24 sipg0WT3p.net
生活の為だ。
335:デフォルトの名無しさん
17/11/16 12:40:47.00 jvRl/N31M.net
文句たれてる暇があるなら1バイト目判定関数でもつくれば
336:デフォルトの名無しさん
17/11/16 16:46:03.46 ExCdIANwa.net
ファイルサイズ測定
↓
そのファイルサイズ領域を動的確保
↓
そこにutf-8の文字列を順次格納
みたいなプログラム組んでるんだけど
ファイルサイズ/sizeof(wchar_t)と中身の文字の数って等しくないの?
337:片山博文MZ
17/11/16 16:52:10.55 1Qzf60whd.net
UTF-8をそのまま扱うんなら、/sizeof(char)じゃね?
UTF-16やUTF-32に変換したならデータサイズが違うけど。
338:デフォルトの名無しさん
17/11/16 16:54:06.14 Gq05ZlN50.net
UTF-8 は データサイズから文字数を求めることはできない
339:デフォルトの名無しさん
17/11/16 17:01:45.21 FIH9Q68l0.net
やっぱり1文字づつ
340:読み込んでって文字数カウントするしかないか
341:デフォルトの名無しさん
17/11/16 17:06:37.43 Gq05ZlN50.net
>>333
記憶するのに必要なメモリの量は読み込んだバイト数でいいけど
「1文字に要するバイト数が可変」なので
「文字数」をカウントするとなるとそうせざるを得ないね
342:デフォルトの名無しさん
17/11/16 17:15:42.23 FIH9Q68l0.net
>>334
そうします
343:デフォルトの名無しさん
17/11/16 17:29:40.48 NqJtZOMo0.net
暇つぶしで気になったんだけどC言語でもOSは作れるだよな、でも制御とかでコンピューターをちゃんと理解してないとやっぱ作れない?
344:片山博文MZ
17/11/16 17:45:35.36 1Qzf60whd.net
FreeDOS、Linux、ReactOSなどのオープンソースなOSは、ソースが見られるから参考にするといい。
例えば、OSで並列処理をしたい場合は実際のCPUの知識が必要になるし、OSをCD-ROMからインストールしたい場合は、CD-ROMのファイルシステムの知識が必要になる。
OSを便利にしたいなら、それなりの知識が必要になるのさ。
345:片山博文MZ
17/11/16 17:50:48.01 1Qzf60whd.net
モダンなOSは巨大化・複雑化しているから、一人ですべてを把握するのは難しい。
必要な機能を分割統治して、ライブラリなどによってブラックボックスとして実装するのが一般的。
346:デフォルトの名無しさん
17/11/16 18:09:46.26 j+aaxsF+0.net
>>336
OS自作入門とかいうそのものズバリな本があるよ
勉強目的なら割りとオススメ
347:デフォルトの名無しさん
17/11/16 18:10:16.42 NJ9DPXHtM.net
モダンでなくても、C単体ではシステムコールとCPUステータスに
関わる部分が書けないので、100%は不可能。
asm文とか使うなら別だけど。
348:片山博文MZ
17/11/16 18:10:19.85 ++5Qg6gN0.net
なお、OSで商売したいなら、著作権のトラブルをクリアしないといけない。
マイクロソフトやグーグルのようにOSを売るのは至難の技だ。
349:片山博文MZ
17/11/16 18:29:05.66 1Qzf60whd.net
パソコン向けじゃなければ、日本企業でもOSを開発しているところはある。
どんなOSを開発したい?
350:デフォルトの名無しさん
17/11/16 18:42:10.01 lNSovIGo0.net
OS劇場っぽいやつ
351:デフォルトの名無しさん
17/11/16 20:19:28.30 FIH9Q68l0.net
あとメモリ上に読み込んだバイナリデータをwchar_tの文字列に変換することは可能でしょうか?
352:デフォルトの名無しさん
17/11/16 20:33:55.78 NqJtZOMo0.net
ただC言語の本にアセンブリ言語またC言語でもOS作成可能ってあったから気になっただけ
他の言語もコンパイルして機械語にするからC言語も間接的な言語しかないのかなって疑問に思っただけ
353:デフォルトの名無しさん
17/11/16 21:44:00.25 lLXMegrc0.net
>>317
354:デフォルトの名無しさん
17/11/16 22:16:50.50 SDKqgqGy0.net
嘘ついてるかもだけど、wchar_tのたぐいって、使うとはまる奴じゃなかった?
文字列はcharオンリーな今日この頃。
cpu限定すれば、変換はいけるんじゃない?
355:デフォルトの名無しさん
17/11/16 22:50:06.96 j+aaxsF+0.net
ワイド文字だと場合によってはエンディアンを気にする必要があるのと
結局>>334は避けられないあたりを忘れなければハマることはないかと
356:デフォルトの名無しさん
17/11/16 23:02:19.01 53UzEJx90.net
OSのコードを書くのってC言語のインラインアセンブリが使われてるんじゃないの?
357:デフォルトの名無しさん
17/11/17 03:13:34.00 HNipYc2I0.net
インラインなんかほとんど使わない
アセンブラが必要なところはガチのアセンブラを使う
量にして全体の数%ってとこ
358:割
17/11/17 08:21:02.54 5vMCLRTs0.net
フリーのOS作るため勉強するよ
359:デフォルトの名無しさん
17/11/17 08:39:11.50 Noghda3Sa.net
>>339
あれかなり良いけどフロッピー使うし作るOSもかなり独特だからモダンな感じでもう一冊くらい書いて欲しい
360:デフォルトの名無しさん
17/11/17 23:24:01.69 mCQOvNmw0.net
>>330
UTF-8 とは何か?
そして wchar_t 型とはなに
361:か? まずはこの2つについて徹底的に調べると君の頭は少し良くなると思う。
362:デフォルトの名無しさん
17/11/17 23:32:51.13 mCQOvNmw0.net
>>336
OS作れるどころかOSを書くために作られたような言語がCだよ。UNIXな。
363:デフォルトの名無しさん
17/11/17 23:36:03.75 mCQOvNmw0.net
>>342
超漢字はPCで・・・
364:デフォルトの名無しさん
17/11/18 01:14:51.20 rocDtfxqa.net
mallocとかcallocでNULLが帰ってくる原因が分からない
メモリも十分あいてるしfree忘れもないのに
365:デフォルトの名無しさん
17/11/18 01:20:58.17 j81pJ1Fd0.net
要求している大きさが 0 とか?
366:デフォルトの名無しさん
17/11/18 01:23:12.16 SBD2pOIJa.net
>>357
流石に0ってことはないと思うわ
367:デフォルトの名無しさん
17/11/18 01:40:38.42 bkH0AyDYa.net
どこかでバッファオーバーランしてるのかなあ
368:デフォルトの名無しさん
17/11/18 01:54:02.41 ravPC5RbM.net
0 allocでもnullは返さないはず
369:デフォルトの名無しさん
17/11/18 02:00:44.06 xg8+Glw40.net
perrorくらいしてから書け
370:デフォルトの名無しさん
17/11/18 03:52:04.95 V3PmucT60.net
おれの昔使ってたシステムでは、free忘れじゃなくて、mallocしたアドレスを2度freeしたり、もしくはmallocとは全然関係無いアドレスをfreeすると、
その後のmallocでおかしな動作をすることがあった
371:デフォルトの名無しさん
17/11/18 06:02:16.21 4FIhP4xR0.net
>>358
本当か?
372:デフォルトの名無しさん
17/11/18 06:22:35.45 mIICZMYh0.net
>>362
おそらく、そういう系だろうな
どこかで未定義の動作をやらかしてる
373:デフォルトの名無しさん
17/11/18 07:00:43.85 ScUjvH+z0.net
>>361
それ関係ないやろ
374:デフォルトの名無しさん
17/11/18 09:37:24.12 N5k0nP0W0.net
>>362
windowsなんだけど可能性あるの
375:デフォルトの名無しさん
17/11/18 09:47:18.69 mIICZMYh0.net
ゲイツOSかどうかには関係ねえぞ
malloc/freeが空き領域をどのように管理しているかの実装の問題だ
376:デフォルトの名無しさん
17/11/18 11:15:25.02 QN3bDN6ad.net
Winなら2重freeで死ぬんじゃね
377:デフォルトの名無しさん
17/11/18 11:27:25.57 rocDtfxqa.net
2重freeだとその時点でエラーはかないの
378:デフォルトの名無しさん
17/11/18 11:56:53.68 ScUjvH+z0.net
>>368-369
>>367
379:デフォルトの名無しさん
17/11/18 12:20:10.83 N5k0nP0W0.net
解決した
不定のポインタに対して代入
変なとこ書き換えたせいでmalloccallocに失敗したみたい
380:デフォルトの名無しさん
17/11/18 16:45:23.67 LYf4SJAt0.net
よかったな鼻から鼻毛が出る程度で
381:デフォルトの名無しさん
17/11/18 20:07:48.43 N5k0nP0W0.net
また別の問題が・・・
メモリ上にある時は問題ないのにwprintfで表示するときに文字化けする
382:デフォルトの名無しさん
17/11/18 20:09:57.58 4FIhP4xR0.net
>>373
「問題ない」とは?何で確認した?
383:片山博文MZ
17/11/18 20:10:41.39 QiNK1qRtd.net
setlocaleした?
384:デフォルトの名無しさん
17/11/18 20:37:46.90 N5k0nP0W0.net
>>374
visualstudioのメモリの中覗く奴
>>375
main関数でやってる
385:片山博文MZ
17/11/18 20:39:12.15 QiNK1qRtd.net
ideoneに貼ってよ。
386:デフォルトの名無しさん
17/11/18 20:49:06.97 ravPC5RbM.net
コンソールのロケールは?
387:デフォルトの名無しさん
17/11/18 20:54:11.61 N5k0nP0W0.net
>>378
chcp 65001をsystem関数で実行してる
388:デフォルトの名無しさん
17/11/18 21:10:22.92 V3PmucT60.net
setlocaleの引数は?
389:片山博文MZ
17/11/18 21:47:57.26 QiNK1qRtd.net
system関数で出来る子プロセスは、別プロセスだから、現在の画面出力には影響しないと思う。
390:デフォルトの名無しさん
17/11/18 21:48:38.17 N5k0nP0W0.net
解決した
関数の中で宣言したwchar_t の配列buff[20]のポインタを返してそれを表示してたんだけどそれがまずかったみたい
スコープから抜けた瞬間に解放されちゃうみたい
無知だったわ申し訳ない
391:デフォルトの名無しさん
17/11/18 21:49:45.49 N5k0nP0W0.net
buffの中身をmallocで確保した所にコピーしたのを返すことに�
392:オました
393:デフォルトの名無しさん
17/11/18 23:02:18.25 euoYf0NO0.net
>>382
GC言語使ってた奴がよくやるパターンだ。ドンマイ。
>>383
それだと後でいちいちfreeするのが面倒だろ。
普通は呼び出し元で buff[20] 確保してポインタを渡し、子関数内でそこに書き込む。
なおどうしても値返しで組みたければ、structならreturnで値返しできるからくるめばいい。(はず)
394:デフォルトの名無しさん
17/11/19 03:54:32.58 +NeHX1+n0.net
char* hoge(){
char buff[20];
strcpy(&buff[0], "何らかの処理");
return &buff[0];
}
int main(int argc, char* argv[]){
char* str = hoge();
printf("%s\n", str);
return 0;
}
多分、こうなってたんじゃないか?
配列は、自分で管理すべきだよねー。
void hoge(char* const str){
strcpy(&str[0], "何らかの処理");
return 0;
}
int main(int argc, char* argv[]){
/* char str[20]; */
char* ptr = nul;
/* ptr = &str[0]; */
ptr = (char*)malloc(sizeof(char) * 20);
hoge(ptr);
printf("%s\n", str);
return 0;
}
395:デフォルトの名無しさん
17/11/19 04:46:36.12 uKY6C0dJ0.net
意味は同じだし最適化されるからどうでもいいことではあるが、
そこの &str[0] は単に str と書くだけでいいんじゃないの?
見やすさの点からも受け取る部分が char *str ならそのまんま
str って書いておいた方が分かり易いと思うんだけど。
396:デフォルトの名無しさん
17/11/19 05:47:08.77 UDBnG5b80.net
c言語でこういう処理はやめておけ?
397:デフォルトの名無しさん
17/11/19 09:57:18.82 v7NTUoVSM.net
初心者はこれだけ守ってれば良いかと
処理対象のメモリは呼び出し元で確保、alloc-freeで処理をはさむ
処理の戻り値は基本intでエラーコードを返す
ローカル変数は16k未満、可変長配列は使わない
>>387
そんなことはない
398:デフォルトの名無しさん
17/11/19 10:16:36.97 Rb2sIcHm0.net
> 処理の戻り値は基本intでエラーコードを返す
malloc先生やprintf先生を見習ったら違反だな
> ローカル変数は16k未満、可変長配列は使わない
何だそのマジックナンバーは??
399:デフォルトの名無しさん
17/11/19 10:34:41.84 YNZopTj60.net
malloc に限らんけど、ポインタを返す関数は
失敗の場合にNULLを返すってのはまぁ基本だね。
線形リストの探索、見つからなければNULL、みたいに。
printf の返り値はintだから一応は >>388 の方針通りじゃろ。
成功なら非負の値、失敗したら -(エラーコード) が返る、
と決めておけば何かと使いやすいわね。
400:デフォルトの名無しさん
17/11/19 10:42:05.59 Rb2sIcHm0.net
>>390
ちょw
printfの仕様を知らんのか
401:デフォルトの名無しさん
17/11/19 10:59:03.36 KR+9hAut0.net
mmapはNULL返さねーけどな
402:デフォルトの名無しさん
17/11/19 11:41:24.76 lBNHVI9l0.net
エラーはnullとか-1とかの正常時には戻らない値
エラーコードは errno 見ろよ
って言うのが以前のお約束だった気がするけど
403:デフォルトの名無しさん
17/11/19 12:18:44.42 qf87F9y70.net
printf("%d",printf("1*2*3="));
404:デフォルトの名無しさん
17/11/19 13:05:21.82 uKY6C0dJ0.net
printf() の man page 見てもエラーの時は負の値を返すとしか書いてなくて errno に何か入るとは書いてない。
まあ、実際には中で putchar() と同等な事をするだろうからその中で使われる write() で何か書かれるとは
思うがその辺は保証されていないので使えない。(書き込み時のエラーではないかも知れないしな)。
GNU の asprintf() もエラー時は -1 を返すのみで errno については何も書いてない。
それと sn
405:printf() のような結果を書き込むバッファの大きさを指定できるやつはバッファを使い切った場合の エラーの返し方が違う。
406:デフォルトの名無しさん
17/11/19 16:13:09.94 ViWWOCHYa.net
条件が
文字列の長さ
文字列比較
でソートしたくて2回forで回してます
流石にこれでは件数が増えたときにとてつもなく遅くなるので1回のforだけでやる方法を教えてください
407:デフォルトの名無しさん
17/11/19 16:19:33.08 lEYmgXHFM.net
>>396
普通にソートすれば、長い方が後に来るんじゃね?
408:デフォルトの名無しさん
17/11/19 16:32:59.11 NI05LLAC0.net
条件を変えて2回まわしたら1回目のソートは(ほぼ)意味がないんじゃない?
(順位を保つソート法なら 多少意味が出てくる: qsort はその保障はない)
qsort の srot_cmp の記述で
比較すべき それぞれの要素 c1 と c2 を多重に比較すればいい
・「文字列長さ」で比較し 違うなら大小関係を返す→
↓
・(上の比較が等しいので)「文字列」比較し 違うなら大小関係を返す→
↓
:
↓
・(上の比較が等しいので)等しいと返す
これならソートは1回だけ
409:デフォルトの名無しさん
17/11/19 18:57:37.27 LiOPGVVq0.net
URLリンク(i.imgur.com)
この2.の(2)の総ステップ数って
f=1で1回、for文内でn回で、T(n)=n+1
であってる?
なんか授業でやったときは3n+4だったか4n+3だったかそんな数字だったと思うんだが求め方がよく分からん
410:デフォルトの名無しさん
17/11/19 19:18:57.18 uKY6C0dJ0.net
>>399
f=f*i の部分は四則演算1回と代入1回だから2ステップなのでは?
411:デフォルトの名無しさん
17/11/19 19:34:22.94 H23Xb2RQ0.net
f=1 代入1回
for(i=1;i<=n;i++) -> for(i=1;i<=n;i=i+1) 代入1回; 条件判断n+1回; 四則演算n回、代入n 回
f=f*i; 四則演算n回、代入n回
なので合計 5n+3 ステップかな、i++ を1ステップとする処理系なら 4n+3 とか。よくわからんけど
412:デフォルトの名無しさん
17/11/20 14:16:42.45 QGisDeezp.net
>>401
いまどきオプティマイザあるからどっちも同じアセンブルコードになる悪寒
413:デフォルトの名無しさん
17/11/20 14:28:22.74 8OH1W8zR0.net
i++ を1ステップ勘定するか 2ステップ勘定するかは悩ましいけど
分解して 四則演算の1 + 代入の1 計2ステップ の見積もりするのが妥当なんかな
題中にインクリメント演算についてのステップ数は明示されてないし
414:デフォルトの名無しさん
17/11/20 17:25:41.15 ZHV8ZCmh0.net
i++みたいにハード的にありえない(メモリは加算機能を持たない)ことは
マイクロコードで実現しているわけで、1ステップなわけがない
415:デフォルトの名無しさん
17/11/20 17:45:57.87 8KCSU74o0.net
狙いは記述の簡潔化
416:デフォルトの名無しさん
17/11/20 17:54:00.78 jMZlCBbia.net
単体のi++は無駄だから++iにしろってばっちゃが言ってた
417:デフォルトの名無しさん
17/11/20 18:09:22.43 uYx1UAMqH.net
じっちゃんはそんな差は最適化で消え失せるって言ってたよ
418:デフォルトの名無しさん
17/11/20 19:51:59.87 glF63Wia0.net
i += 1;に統一しろや
419:デフォルトの名無しさん
17/11/20 20:13:15.58 WOKp52/B0.net
つまりC++死ねと言う事で
420:デフォルトの名無しさん
17/11/20 20:44:27.03 Y8ntE/6M0.net
暗号の話で面白いネタありませんか?
421:デフォルトの名無しさん
17/11/20 23:46:50.09 iMFZcv9G0.net
URLリンク(i.imgur.com)
>>399だけど、これが一応正解らしい
422:デフォルトの名無しさん
17/11/20 23:56:46.22 ZHV8ZCmh0.net
おまえ自身は何も言わないわけか
423:デフォルトの名無しさん
17/11/21 00:13:10.99 j0/qDr3U0.net
++は対象がレジスタに乗ってるときに1命令だろ
とくにアドレスレジスタの場合に *p++ をポストインクリメントレジスタ間接アクセス命令にそのまま置き換えられるから、
オプティマイズがまだ発達してなかったころに重宝したはず
424:デフォルトの名無しさん
17/11/21 06:23:40.67 uBkGRn7P0.net
そのバヤイは0.5命令だね
* と ++ を同時並列でやるわけで
425:デフォルトの名無しさん
17/11/21 06:30:17.80 VCAIytbF0.net
>>411 実際のマシンとは関係のない、問題のための問題だから
問題を作った人の答えが正解というルールは仕方ないとして…。
i++ が1ステップなのか2ステップなのか、という疑問が出るスレッドで、
f = f*i はまとめて1ステップです、という解説が現れるのは予想外だったわ。
f*i が四則演算で1ステップ、fへの代入でもう1ステップ、と思うよね。
426:デフォルトの名無しさん
17/11/21 07:23:37.68 V9LM9CF/0.net
単純に行数で示す場合もあるし
いろいろだよ
重要なのは計算オーダーと実測値
ステップ数は計算オーダーを見積もる為の道具で
定数倍はわりとどうでも良い
計算量をもっと正確な値を知りたい時は
加減算○回、乗算○回、除算○回
など、より具体的な値とする
427:デフォルトの名無しさん
17/11/21 09:57:32.04 6BA+Ife8d.net
末尾に/が入っていたとき全て削除したいのだけどどうすれば簡単に実装できるだろうか
データはcharの配列に入っている
ex
aaa.txt
aaa.txt/→aaa.txt
aaa.txt/////→aaa.txt
428:デフォルトの名無しさん
17/11/21 10:04:28.94 6BA+Ife8d.net
あとsystem関数の戻り値の判定に悩んでます
URLリンク(linuxjm.osdn.jp)
上記参考にしたら四つのケースに別れていて
下二つはwexitなどのマクロで取得可能
上二つの内ひとつはnullチェックで弾くこと可能
残りは子プロセス作成失敗の-1で網羅できてると考えているのだけど間違ってるのかな?
やりたいことは
system関数のコマンドライン実行したアプリのステータスコードを取得したい。そのためにマクロ使ってる
ただ子プロセスの取得云々の前にsystemの結果判定必要なんでは?と指摘を受けて修正してるのだけどsystemの返す値がさっぱりわからなくて困ってます
429:デフォルトの名無しさん
17/11/21 10:38:25.75 IvGEWozr0.net
>>417
自分ならstrtok関数を使う
430:デフォルトの名無しさん
17/11/21 10:49:16.27 6BA+Ife8d.net
>>419
ごめん略してたけどもフォルダもあるんだ
/xxxx/yyyy/aaa.txt
みたいな
その関数だとこのパターンは処理できない?できる?
431:デフォルトの名無しさん
17/11/21 10:54:29.00 rkhjnhkRp.net
俺様専用脳内マシンは1ステップ命令に変換するんだから1ステップなんだ!!
アホらし。
432:デフォルトの名無しさん
17/11/21 10:58:18.95 0pj8KC/M0.net
>>420
末尾の/を取り除きたいのか、頭のファイルパスを取り除きたいのか、よく分からないけど、/を区切り文字として文字列を分割さえしてしまえばどうにでも出来る
433:デフォルトの名無しさん
17/11/21 11:41:02.99 qTGygbeTE.net
gcc -lライブラリ名 hoge.c
stdio.hと同じフォルダに自分が使いたいヘッダーファイルが存在してるのに
いちいち-lライブラリ名ってしないと参照できないんです
どうしてstdio.hは-lstdioって書かなくても使えるのに自分がインストールしたヘッダーファイルはいちいち-lで指定しないと使えないんでしょうか?
すか?
434:デフォルトの名無しさん
17/11/21 12:27:08.32 ylDmWfHBd.net
>>417
if(配列[strlen(配列)-1]=='/') 同=0;
をループで回せ。
435:デフォルトの名無しさん
17/11/21 13:06:11.86 b7HcaLG8d.net
>>424
うわっ
最悪のアルゴリズム
436:デフォルトの名無しさん
17/11/21 13:13:57.97 b7HcaLG8d.net
null-endと仮定するなら普通にこれで良い
int i;
for (i = strlen(配列) - 1; i >= 0; i--)
if (配列[i] != '/') break;
配列[i+1] = '\0';
437:デフォルトの名無しさん
17/11/21 13:34:45.06 IvGEWozr0.net
URLリンク(codepad.org)
438:デフォルトの名無しさん
17/11/21 14:23:21.10 uBkGRn7P0.net
>>417
regex.hを使ってはどうかな?
URLリンク(sourceforge.net)
439:デフォルトの名無しさん
17/11/21 14:47:42.58 uBkGRn7P0.net
>>423
スクリプトかバッチを作ればいい
たとえばmycc.batというファイル名で
gcc -lライブラリ名 %*
と書き込んでおいて
mycc hoge.c
とやる
440:デフォルトの名無しさん
17/11/21 19:27:53.90 5ScqS7z90.net
>>423
標準ライブラリオブジェクトはスタートアップファイル(crt0)に組み込まれていて自動的にリンクされる
標準以外のライブラリオブジェクトは明示的にリンクしないと使えない
441:デフォルトの名無しさん
17/11/21 20:38:46.08 IlBdcuWwM.net
>>415
> f*i が四則演算で1ステップ、fへの代入でもう1ステップ、と思うよね。
f と i がレジスタなら大抵のプロセッサで1ステップだと思う
442:デフォルトの名無しさん
17/11/21 21:45:59.93 EZGPgPj40.net
まあ、先の問題については、ステップの厳密な定義が読み取れないし。
回答者の説明に矛盾がなければ○でいいと思うわ。
それでも誤答とされてしまったら、出題者がウンコだと思って忘れるレベル。
443:デフォルトの名無しさん
17/11/21 22:17:44.53 6BA+Ife8d.net
>>428
やはり正規表現か
444:デフォルトの名無しさん
17/11/21 22:26:46.51 6oQfsQ1l0.net
スクリプトとかならまだしも
Cで末尾の/削るためだけに正規表現とか持ち出すのは馬鹿だと思う
445:デフォルトの名無しさん
17/11/21 22:38:13.64 IS6cxUc80.net
replace("/$","");//うろおぼえ
なんでよ簡潔にかけて最高じゃないか
正規表現は心の友
すぐ忘れるけど
446:デフォルトの名無しさん
17/11/21 22:48:24.18 n0bc2/yX0.net
>>435
末尾に連続する'/'が有ったら、消さないと
447:デフォルトの名無しさん
17/11/21 23:25:32.21 n0bc2/yX0.net
URLリンク(codepad.org)
こんな感じか?
静的文字列の時は編集可能な形で渡して
448:デフォルトの名無しさん
17/11/21 23:33:58.03 6oQfsQ1l0.net
>>435
>>428はGnuWin32って名前から察するにPOSIXのregexだろ
置換なんてないから、正規表現コンパイルして検索して自分で書き換えるんだぞ
正規表現の置換を呼び出し一回で済ませられるような関数が
ANSIとかPOSIXにあるなら良いけど、そうじゃないだろ
449:デフォルトの名無しさん
17/11/21 23:45:43.58 IS6cxUc80.net
std::regex_replaceってちがうんか?
450:デフォルトの名無しさん
17/11/21 23:48:20.93 6oQfsQ1l0.net
は?
C言語のスレでC++を持ち出してきて何が言いたいの?
451:デフォルトの名無しさん
17/11/21 23:48:43.70 IS6cxUc80.net
なんてこったい
452:デフォルトの名無しさん
17/11/22 00:18:19.23 CvPbHYJg0.net
>>417
こんなのはどうかなあ。
char *s が元になる文字列へのポインタ。p は char *p。
for (p = strrchr(s, '/'); p && p >= s && *p == '/' && ! *(p + 1); *p-- = '\0');
453:デフォルトの名無しさん
17/11/22 01:37:39.91 CvPbHYJg0.net
>>418
こんな感じかねえ。
if (cmd) {
int s = system(cmd);
if (s == -1) {
// 子プロセス作成失敗またはステータス取得失敗
} else if (WIFEXITED(s)) {
// 子プロセスは正常に終了した。
int es = WEXITSTATUS(s);
// es の内容が子プロセス側での exit(es) または return es
// これはたいてい 0 以外がエラーになっている。0なら成功。
} else if (WIFSIGNALED(s)) {
// 子プロセスはシグナルで中断して終わった。
// (人が Ctrl+C をキーから押したとか、kill したとか、プログラムバグってて core dump したとか 0 で割ったとか)
// シグナルの意味は signal(7) の man page 見るとわかる。
int sg = WTERMSIG(s);
// sg にシグナル番号が入る。
}
}
454:デフォルトの名無しさん
17/11/22 02:48:21.29 CvPbHYJg0.net
>>417
試しに正規表現使うとどうなるか作ってはみたが、あまり意味ないなw
URLリンク(paiza.io)
455:デフォルトの名無しさん
17/11/22 06:57:55.87 ehTxx6H60.net
>>431
f = f*i を f *= i と解釈して1ステップか、それもありうる。
456:デフォルトの名無しさん
17/11/22 08:11:12.98 W0SJQGiTM.net
>>445
それもありうるって言うかそうでない処理系の方が珍しいだろ
457:デフォルトの名無しさん
17/11/22 08:30:23.30 OmrPXxhs0.net
元の問題が、演算と代入とそれぞれ1ステップって書いてあるんだから
そこを議論しても意味がない
458:デフォルトの名無しさん
17/11/22 14:50:29.32 5BCPAAz7a.net
これ教えてくれ
URLリンク(i.imgur.com)
459:デフォルトの名無しさん
17/11/22 15:08:01.31 qJn/S+Fz0.net
面倒くせえ奴らだなあ。。。
//aho.cpp
extern "C" char* regex_replace(char* str, size_t n, char const* pat, char const* put) noexcept
{
try
{
string buff{str};
buff = regex_replace(buff, regex{pat}, put);
strncpy(str, buff.data(), n);
return str;
}
catch(...) {}
return nullptr;
}
460:デフォルトの名無しさん
17/11/22 15:08:31.73 qJn/S+Fz0.net
//baka.c
char* regex_replace(char*, size_t, char const*, char const*);
int main()
{
char buff[100];
while(fgets(buff, 100, stdin))
if(regex_replace(buff, 100, "/+$", "")) puts(buff);
else puts("error");
}
461:デフォルトの名無しさん
17/11/22 15:08:55.87 qJn/S+Fz0.net
rem test.bat
cl baka.c aho.cpp /EHsc && baka
ったく世話の焼ける(ぶつぶつ