X



C言語なら俺に聞け 143
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん (ワッチョイ b375-rVGZ)
垢版 |
2017/10/27(金) 21:28:08.20ID:pAogLeJi0
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

前スレ
C言語なら俺に聞け 142
http://mevius.2ch.net/test/read.cgi/tech/1502364083/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0003デフォルトの名無しさん (ブーイモ MMeb-gj0X)
垢版 |
2017/10/27(金) 23:12:15.85ID:67YjQzLBM
>>1
0004デフォルトの名無しさん (ワッチョイ 9193-cGPg)
垢版 |
2017/10/28(土) 08:25:42.00ID:VIxhg0oq0
「新スレッドは○番に書き込んだ人が立てる」みたいなガイドラインを
テンプレートに盛り込んだ方が安心じゃないかな。

前スレッドの終了まで新スレッド(ここ)が立たなかったし、
999番で「誰か立ててくれ」と書き込まれたのに応じて
「立てたよ、リンク先は…」と誘導に使われるべき1000番が
無意味な「あぼーん」で潰されたし。
0005デフォルトの名無しさん (ワッチョイ d18a-bYcA)
垢版 |
2017/10/28(土) 09:22:16.51ID:6bG+Py6x0
あぁあああもうポインタ全然分かんねえよおおお
0006デフォルトの名無しさん (ワッチョイ 6b15-OCcV)
垢版 |
2017/10/28(土) 10:32:21.81ID:QoaQu2To0
前スレへのリンクがあって、スレタイにも番号がついてるわけで
1000いったら次スレなんて言われんでもわかるし望む者がいるから立っている
それだけのことで、別に何かする必要はないと思うな
0007デフォルトの名無しさん (ワッチョイ 719f-WLyz)
垢版 |
2017/10/28(土) 13:13:54.08ID:cK0+9veY0
>>5
文字通り何かを指し示すものだよ。
0008デフォルトの名無しさん (ワッチョイ 21d2-Eec1)
垢版 |
2017/10/28(土) 13:25:50.21ID:NBGUhvqo0
data8<7-0> にdata32<31-00>の中のdata32<07-00>を抜き出して代入したい

data8 = data32 % 256 ;

と書いてもコンパイラが素直に推論してくれません
キャリー処理のコードっぽいものをつけてきやがります
どうしたらいいでしょうか?
0009デフォルトの名無しさん (ワッチョイ 1312-nu9H)
垢版 |
2017/10/28(土) 13:30:10.44ID:z7fGPvzs0
あまりにも挫折者が多すぎる
教え方が悪いとか例題が少ないとかじゃねえのかと

変数とか言うふわふわしたモンがいきなり具体的なものになるから分かりにくいんじゃないのかね
メモリとかアドレスとかいきなし言われても分んねーよ、とかなるし
しまいにはアドレスの値だって気にかけなくなる

いきなり「変数は値と場所、二つの数字をもちます」とか言われると混乱するんだよ
0010デフォルトの名無しさん (ワッチョイ 719f-WLyz)
垢版 |
2017/10/28(土) 13:51:05.54ID:cK0+9veY0
>>8
君の言いたいことがよくわからない。とりあえず全部日本語に翻訳してくれ。
0013デフォルトの名無しさん (ワッチョイ 21d2-Eec1)
垢版 |
2017/10/28(土) 14:11:40.74ID:NBGUhvqo0
両変数ともunsigned宣言はしています
0016デフォルトの名無しさん (ワッチョイ 1be7-DNJs)
垢版 |
2017/10/28(土) 16:17:52.03ID:DjUYz3cS0
int *a = 0;
*a = 1;
これは入るけど1は入るん?0の番地って存在するん?
0020デフォルトの名無しさん (ワッチョイ 9193-cGPg)
垢版 |
2017/10/28(土) 17:33:04.44ID:VIxhg0oq0
>>8
「リテラルの数値256での剰余だから結果の範囲は0-255、
unsigned char の範囲からはみ出す可能性はない」
ということまでコンパイラが見抜いてくれないってことだよね。

data8 = (unsigined char) data32;

てな具合に明示的なキャストで上手くいかんかな。
あるいはコンパイラの最適化オプションを強めにするか。
0021デフォルトの名無しさん (ワッチョイ 21d2-Eec1)
垢版 |
2017/10/28(土) 17:42:28.64ID:NBGUhvqo0
ちょっと勘違いしてました
>>8の質問はとりさげます
ちなみに%256の推論はしているみたいです
0023デフォルトの名無しさん (ワッチョイ 6b15-OCcV)
垢版 |
2017/10/28(土) 18:54:14.85ID:QoaQu2To0
希望的観測でタカをくくって結果を見もしないやつが一番悪い
0026デフォルトの名無しさん (ワッチョイ 9ba1-qonp)
垢版 |
2017/10/28(土) 20:54:20.70ID:uE8IWkSS0
>>16
ヌルポインタに関しては、なんかややこしい事情があるみたいね。
規格ではいかなるオブジェクトとも一致しない特殊なポインタってことになってるようだけど、
自分が使ってる組込み用のコンパイラではただの 0 になる。しかも0番地から普通の RAM なんで、
値も普通に格納される。
どうなるかは確認するしかないんじゃなかろうか。
0027デフォルトの名無しさん (ワッチョイ 9150-FcU6)
垢版 |
2017/10/28(土) 21:07:29.96ID:gfV3l07s0
>>20
32bitの範囲の数値を8bitの最大値で割るんだから
最大24bitの数値になるんじゃないの?
data8 = *(unsigined char*) &data32;
リトルエンディアンだと仮定するとこうなると思う
0028デフォルトの名無しさん (ワッチョイ 9150-FcU6)
垢版 |
2017/10/28(土) 21:24:13.85ID:gfV3l07s0
すみません
剰余を除算と勘違いしていました
無視してください
0029デフォルトの名無しさん (ワッチョイ 719f-WLyz)
垢版 |
2017/10/28(土) 23:08:15.00ID:cK0+9veY0
>>16
あるけど今時のだいたいのOSではアクセスすると例外発生してプログラムが停止させられると思う。
そうでなくてもCPUによってアドレス0付近が特別扱いされている事が多いのでアクセスできたとしても要注意だったりする。
なのでそういうのが必要な時というのはOSそのものやデバイスドライバを作る時ぐらいしかないと考えて良い。
0030デフォルトの名無しさん (ワッチョイ 1be7-DNJs)
垢版 |
2017/10/28(土) 23:16:46.23ID:DjUYz3cS0
最近ヤフー知恵袋で初心者なんですけど将来プログラマになりたくてC言語やってみたいんですけどどうですかって
質問が多いがプログラマが時代の流行になってきたか?
0031デフォルトの名無しさん (ワッチョイ d18a-bYcA)
垢版 |
2017/10/28(土) 23:27:04.65ID:6bG+Py6x0
>>30
とりあえずみんなc言語やるんだな
0032デフォルトの名無しさん (ワッチョイ 1be7-DNJs)
垢版 |
2017/10/28(土) 23:47:39.21ID:DjUYz3cS0
>>31
おすすめの本やらおすすめの開発アプリやらおすすめのサイトやら学校のカリキュラムの評価やら色んな質問が多いしC言語やるならC#やった方が良いと思うんだけどなstring型ないだけで文字列処理とか大変だし不規則な空白・カンマ区切りとかの処理大変だし
そうゆうのを除外してくれる関数あるから楽なのになC言語はchar型で文字列操作してから処理しないとint型にしたりするのが大変だからな
0034デフォルトの名無しさん (ワッチョイ 9193-cGPg)
垢版 |
2017/10/29(日) 06:18:21.91ID:7nxu6Zdr0
教育だと一般性ってのも考えなきゃならないからね。
次々出てくる「Cを改良したネット時代の言語」とかの新しいやつも
10年たったら別の新言語と置き換わってるかも知れないし。
その点、Cなら古くさくても基本として残ってるだろう。

資格試験はまた別だがね。時々変えないと商売にならん。
0035デフォルトの名無しさん (JP 0Hc5-xXVv)
垢版 |
2017/10/29(日) 10:11:30.74ID:NWVP0NdTH
Cは一人でやるとちょっとしたミスで手も足も出なくなるから論外
右も左も分からない初心者に基本はC言語とか言い出すヤツは老害
0036てすと (ワッチョイ 9150-20SA)
垢版 |
2017/10/29(日) 10:24:35.50ID:S9avFBtQ0
package test;

class Test
{
  public static void main(String[] args)
  {
    System.out.println("test");
  }
}
0042デフォルトの名無しさん (ワッチョイ 719f-Akqv)
垢版 |
2017/10/29(日) 13:36:30.43ID:oFRxn/Jf0
環境依存の部分はどんな言語でも影響受けるから結局は覚える事になるんじゃないのかな
0043デフォルトの名無しさん (ワッチョイ e1c3-bYcA)
垢版 |
2017/10/29(日) 16:45:37.57ID:Qj29lsVR0
まずはcでゲーム作ってみようかな
0044デフォルトの名無しさん (ワッチョイ 1be7-DNJs)
垢版 |
2017/10/29(日) 17:07:01.40ID:eJZsCyOV0
win32で作ってみる?
0045デフォルトの名無しさん (ワッチョイ 7116-rVGZ)
垢版 |
2017/10/29(日) 17:13:50.83ID:X7Kr9qJt0
OpenGLの方がいい
0047デフォルトの名無しさん (ワッチョイ 1be7-DNJs)
垢版 |
2017/10/29(日) 22:58:38.22ID:eJZsCyOV0
その前に開発環境を整えるのが大変だわプログラミングはできるけどそれぞれ出してる開発アプリがあるしその中で開発ツールだっけXNAやらwin32やらで解らんことばっかりや
0048デフォルトの名無しさん (ワッチョイ d18a-bYcA)
垢版 |
2017/10/29(日) 23:13:28.81ID:cx6N475a0
>>47
ほんそれ
0051デフォルトの名無しさん (ワッチョイ f1ca-OCcV)
垢版 |
2017/10/30(月) 01:28:40.64ID:ObFQilr40
キャリーを含む9bitローテートか
それとも含まない8bitローテートか
0053デフォルトの名無しさん (ワッチョイ 9193-cGPg)
垢版 |
2017/10/30(月) 04:58:13.48ID:oEYvBlvb0
性能優先ならインラインアセンブリでCPUのローテート命令かねぇ。
移植性が大事なら正直にマスクしてシフトしてビットorで重ねる。

8bitや16bitならテーブル使えば両立できるかな。
0055デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/10/30(月) 13:22:56.64ID:LaVtZ0d2p
ストリームの概念はUNIX譲りの万能概念だから未来永劫絡んで来るぞ。
0056デフォルトの名無しさん (アウーイモ MM95-bYcA)
垢版 |
2017/10/30(月) 13:37:21.46ID:/ejdYHINM
fopen
fclose
0058デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/10/30(月) 17:55:35.83ID:LaVtZ0d2p
read/writeが無いと意味が無いだろ。
0060デフォルトの名無しさん (ガックシ 068b-rVGZ)
垢版 |
2017/10/30(月) 18:06:29.16ID:6LR7RaNa6
char c1=data&0b000000000000000011111111000;
char c2=data%&0b000000001111111100000000000;
char c1=data%&0b111111110000000000000000000;
0061デフォルトの名無しさん (ガックシ 068b-rVGZ)
垢版 |
2017/10/30(月) 18:07:40.57ID:6LR7RaNa6
char1重複エラー
0062デフォルトの名無しさん (ガックシ 068b-rVGZ)
垢版 |
2017/10/30(月) 18:09:07.45ID:6LR7RaNa6
演算子オペランドエラー
0063デフォルトの名無しさん (アウアウカー Saed-6HSk)
垢版 |
2017/10/30(月) 18:14:50.15ID:ki8heFlTa
ファイルとストリームを結びつけるのって、具体的に何がどうなってるんですか?
その辺りがわかるサイトや書籍があれば英語でもいいので教えていただけるとありがたいです
0066デフォルトの名無しさん (ガックシ 068b-rVGZ)
垢版 |
2017/10/30(月) 18:19:48.86ID:6LR7RaNa6
シフト演算子でやろうと思ったら先越されてた
0067デフォルトの名無しさん (ワッチョイ 0b23-20SA)
垢版 |
2017/10/30(月) 18:21:54.38ID:S5mFuOM00
>>63
これ普通はどうやって勉強すんだろうな 興味あるわ

おれはいきなりデバドラ書かされたんで理解を強制されたけど
あのへんの概念なしで腑に落ちる理解できるもんなん?
0069デフォルトの名無しさん (ワッチョイ 7102-rVGZ)
垢版 |
2017/10/30(月) 19:47:29.26ID:4jg/LOEr0
>>68
ストリームを作ってるのがカーネルだからだろ。
0076デフォルトの名無しさん (ワッチョイ 497f-20SA)
垢版 |
2017/10/30(月) 20:16:20.68ID:6zI0CLS+0
>>70
なんでC言語の話でlibstdc++が出てくるの?

fopenやらのストリームなんて、setvbufの説明読めばバッファリングしてるだけって理解できるだろ
カーネルやらlibcのソースなんて読む必要性なんてねーよ
0077デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/10/30(月) 20:33:32.20ID:LaVtZ0d2p
ストリームなんて、なんでもかんでも先頭から順番に処理するってだけの概念だけどな。
ランダムアクセスメモリーも読み飛ばしと巻き戻し駆使してアクセスするのさ。
0078デフォルトの名無しさん (ワッチョイ 719f-Akqv)
垢版 |
2017/10/30(月) 23:47:44.78ID:nQXUW6Dj0
>>49
マシン語には何でもできるねw
0082デフォルトの名無しさん (ワッチョイ 1387-jmG0)
垢版 |
2017/10/31(火) 08:48:27.57ID:sbQ4uuQC0
>>79
それって、htons()のあるライブラリ間違えたら全く意味が無いマクロだよね?
0087デフォルトの名無しさん (ワッチョイ 719f-Akqv)
垢版 |
2017/10/31(火) 23:37:41.07ID:TMBeGW2t0
>>82
ライブラリというか、ヘッダだな。#include <arpa/inet.h> とか。

コンパイラにもよるだろうけどだいたいはヘッダの中だけで #define されているか
ビルトインの関数に置き換えられるかインラインアセンブラになるか、適当に
うまいことやってくれると思う。(CPUが Big endian なら #define htons(x) (x) に
なってて何もしないだけになるかも知れない)。

それと一応 POSIX.1‐2008 のようなので使えるコンパイラは多いんじゃないかな。
0088デフォルトの名無しさん (ワッチョイ 1be7-DNJs)
垢版 |
2017/11/01(水) 02:46:02.61ID:TUg4iVeD0
今ってC言語でwin32とかで作るアプリに基本構造とかなしで作る感じなの?
0090デフォルトの名無しさん (ワッチョイ 1387-jmG0)
垢版 |
2017/11/01(水) 09:27:14.69ID:AnlYMxNy0
イベントを拾って条件分岐みたいな部分は全部関数内に隠蔽された。
今は決まった名前のコールバック関数を埋めるだけのお仕事。
0093デフォルトの名無しさん (ワッチョイ 7181-/MqV)
垢版 |
2017/11/01(水) 14:12:00.47ID:0yoHAkyy0
実行時に必要なメモリーサイズが決まるようなプログラムだと必要。
最初から大きなメモリーを確保しても無駄になるかもしれないし、
当初想定したサイズでは足りなくなるかもしれない。
そういうときに使う。
0094デフォルトの名無しさん (ササクッテロラ Sp9d-jmG0)
垢版 |
2017/11/01(水) 14:12:15.55ID:Dwgab4vip
組み込みでは1度大きく確保したら後は自前で中身やり繰りするから、あんまり使わない。
0098デフォルトの名無しさん (ワッチョイ 1387-jmG0)
垢版 |
2017/11/01(水) 23:00:55.45ID:AnlYMxNy0
Linuxだからって、メモリーリークが無くなるワケじゃ無いからなぁ〜。
0101デフォルトの名無しさん (ワッチョイ edb6-zM96)
垢版 |
2017/11/02(木) 05:57:23.41ID:0ZjxmEGf0
「29歳既婚、2年前に会社を辞めた。ボードゲーム作りを始めて3700万円を
売り上げたけど何か聞きたいことはある?」回答いろいろ
http://labaq.com/archives/51880196.html
日本ボードゲーム界の異端児に聞く!ボードゲームデザイナーとして生きていくには?
https://bodoge.hoobby.net/columns/00013
はじめてボードゲームを作ってはじめてゲームマーケットに出店した ので、ひとり反省会をしてみる。
http://datecocco.hatenablog.com/entry/2015/11/26/000000
はじめて作ったボードゲームを売った話
http://nrmgoraku.hateblo.jp/entry/2017/05/17/210000
ボードゲームイベント「ゲームマーケット」から業界が見えた!
https://entertainmentstation.jp/61107
ボードゲームはどう作るのか、自分なりに考えた
http://roy.hatenablog.com/entry/2014/07/09/124824
オトナも遊べるボードゲーム!自作するといくらになるのか
http://www.d-laboweb.jp/special/sp312/
ボードゲームの展示イベント「ゲームマーケット」の成長記録からこれからの
市場に必要なことを妄想してみた。6年間の来場者数推移(2016年4月時点調べ)
https://bodoge.hoobby.net/columns/00001
ボードゲーム市場がクラウドファンディングの出現で急成長を遂げ市場規模を拡大中
http://gigazine.net/news/20150820-board-game-crowdfunding/
0102デフォルトの名無しさん (ドコグロ MM61-r/51)
垢版 |
2017/11/02(木) 08:04:37.86ID:BfnVxeM2M
組み込みって言ってもピンキリだからなぁ
車のエンジン制御とかなら>>100が言うような感じだけど>>97が言うようなLinuxが載ってる機器のGUI回りとかだとその辺かなりアバウト
テレビみたいにインターネットブラウザとか載せてるとそもそも必要量を見積もれないし
0103デフォルトの名無しさん (スップ Sdc2-98vg)
垢版 |
2017/11/02(木) 17:15:09.25ID:UMCJ4RbSd
https://ideone.com/lGSKsq
漸化式を使って組合せnCmの値を表示するプログラムです
数字を大きくすると正しい結果が出ないので困っています(例えば45C11
修正箇所教えてほしいです
0105デフォルトの名無しさん (スップ Sd62-98vg)
垢版 |
2017/11/02(木) 18:20:01.37ID:aAcU+3M+d
>>104
入力はそこまで大きい値を入れるつもりはないのでintにしました
0107デフォルトの名無しさん (スップ Sd62-98vg)
垢版 |
2017/11/02(木) 18:39:45.95ID:aAcU+3M+d
>>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言語というより数学的な話で
0109デフォルトの名無しさん (スップ Sd62-98vg)
垢版 |
2017/11/02(木) 19:43:50.32ID:aAcU+3M+d
>>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)は整数ではないでしょうか
0110片山博文MZ ◆T6xkBnTXz7B0 (ワッチョイ 99b3-iQJQ)
垢版 |
2017/11/02(木) 19:55:21.08ID:JDKI/Gfo0
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となって整数ではない。
0111デフォルトの名無しさん (スップ Sd62-98vg)
垢版 |
2017/11/02(木) 19:59:15.85ID:aAcU+3M+d
>>110
この漸化式は0<m<nという条件のもとなのでn=mの可能性はないです
0114デフォルトの名無しさん (スップ Sd62-98vg)
垢版 |
2017/11/02(木) 20:17:29.03ID:aAcU+3M+d
>>113
うーんやっぱりそうですか
ありがとうございます
0115デフォルトの名無しさん (スップ Sd62-98vg)
垢版 |
2017/11/02(木) 20:22:30.92ID:aAcU+3M+d
(n*n-1Cm-1)/m
と計算せず
(n/g)*(n-1Cm-1/(m/g))
と遠回りして計算したのは掛け算より前に割り算をして桁あふれを防止するためだったのですが、これだけではまだ読みが甘いみたいですね
0120デフォルトの名無しさん (ササクッテロラ Spf1-XwAf)
垢版 |
2017/11/02(木) 21:33:15.98ID:YtLG92Gup
πの計算みたいに配列でやればいいんだよ。
0124デフォルトの名無しさん (ワッチョイ 4287-XwAf)
垢版 |
2017/11/03(金) 01:25:33.04ID:exxwx2Ub0
配列の四則計算かw
とりま、1桁辺り1バイトからやって行くと良い。
アルゴリズムは手計算方式で。
0128デフォルトの名無しさん (ワッチョイ 4287-XwAf)
垢版 |
2017/11/03(金) 11:50:36.80ID:exxwx2Ub0
そーゆーのって、C言語じゃなくて、ライブラリの仕様なんで、環境わからないと誰も答えられないよな。
0129デフォルトの名無しさん (ワッチョイ 319f-1mNv)
垢版 |
2017/11/03(金) 12:27:14.54ID:1lWviljw0
プログラム中で扱う時はiconv()で変換しちゃうと楽だな。Windowsは知らんがOSが変換やってくれなかったっけ?忘れた。
0130デフォルトの名無しさん (ワッチョイ 99b3-KOaZ)
垢版 |
2017/11/03(金) 16:53:04.29ID:kt+ZN5MJ0
#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;

}

素数判定用のやつ作ったんだが動かない
問題点教えてください
0131デフォルトの名無しさん (ワッチョイ 4287-XwAf)
垢版 |
2017/11/03(金) 16:58:25.19ID:exxwx2Ub0
さすがにネタだよな?
0135デフォルトの名無しさん (ワッチョイ 4287-XwAf)
垢版 |
2017/11/03(金) 23:33:54.94ID:exxwx2Ub0
ネタじゃ無かったんかいw
0137デフォルトの名無しさん (ワッチョイ e175-e3AS)
垢版 |
2017/11/04(土) 03:05:14.26ID:bSw/g7Kd0
おまえらバカにすることしか頭に無いのか
初心者ならこういうこともあるだろうに
0140デフォルトの名無しさん (ワイモマー MMa5-puHV)
垢版 |
2017/11/04(土) 10:16:02.36ID:t9DikZnoM
古代においては、(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;
>}
>
0141デフォルトの名無しさん (ワッチョイ 319f-1mNv)
垢版 |
2017/11/04(土) 13:31:32.96ID:3FaXzC+X0
>>140
あーそうだな。今でもたまにそう書いてあるソースを見かける。
いつも自分ではやってないので違和感があるw
まあでもCみたいな言語だと本当はそう書いておいた方が良いんだろうけどね。

そう言えばこの頃のコンパイラはifで代入だけしてるようなのは見つけて警告出してくれるな。
0147デフォルトの名無しさん (ワッチョイ 2e80-frTj)
垢版 |
2017/11/04(土) 15:27:20.00ID:FdHKGPou0
リテラルには代入できないから、リテラルを左側へ書いておく

今は、MISRA-C で、100項目をチェックする事が義務化されているから、
違反は必ず報告される

でも、トヨタのように、5/100 しか取れない企業もある。
95も違反してるw
0148デフォルトの名無しさん (ワッチョイ 4193-ZDq4)
垢版 |
2017/11/04(土) 16:10:54.87ID:XesRBOxx0
>>140 の話は >>1 の参考サイトにも出てる話だね。
C FAQ 日本語訳 ttp://www.kouno.jp/home/c_faq/
17.4 に載ってる。

定数と変数の比較なら役に立つけど、変数同士の比較に使えないから
特に良くも悪くもない、という評価。

コンパイラがオプションを備えてるなら警告を出させるのが良いわな。
0150デフォルトの名無しさん (ワッチョイ e175-e3AS)
垢版 |
2017/11/04(土) 20:33:34.59ID:bSw/g7Kd0
トヨタ社員乙
0152デフォルトの名無しさん (ワッチョイ 6e3e-cSXK)
垢版 |
2017/11/05(日) 16:44:19.44ID:rSDVGL6P0
全員が同じレベルで言語の仕様や処理系の実装を理解しているわけじゃないからなあ。
最底辺のレベルを合わせる為にMISRAのような約束事が有用であろう事は想像できるんだが…

俺、車業界のソフト屋じゃなくて良かったと思うわ。
いや、むしろ、いっその事、強制された方が楽か?
0154デフォルトの名無しさん (ワッチョイ 62ee-S32u)
垢版 |
2017/11/05(日) 20:23:18.52ID:AvV+p+8R0
COBOLの二の舞
0155デフォルトの名無しさん (ワッチョイ 4150-lboT)
垢版 |
2017/11/05(日) 20:37:42.87ID:Dhy1E5e10
初心者です。
C言語には標準出力関数がいくつかあって気になったのですが、

puts("文字列");
puts("文字列");
puts("文字列");

などと書くのと、

printf(
  "文字列\n"
  "文字列\n"
  "文字列\n
);
のように書くので結果は同じようになると思うのですが、速度やリソースの消費に違いはあるのでしょうか?
どちらが速いとかメモリ消費が少ないとかあれば教えていただきたいです。
0158デフォルトの名無しさん (ワッチョイ e18a-Dqmo)
垢版 |
2017/11/05(日) 21:09:58.63ID:oA1U3DCD0
putsだと自動的に改行されんのか
0160デフォルトの名無しさん (ワッチョイ 9d7f-lboT)
垢版 |
2017/11/05(日) 21:19:49.85ID:Z/yFjIMy0
>>157
stdoutがline bufferedなら、どっちもwriteが3回呼ばれる

言語規格的には解析処理のあるprintfのほうが遅そうだけど
これぐらい単純なprintfだと、gcc/clang辺りでコンパイルするとputsに最適化される
副作用諸々でputs自体の呼び出し回数を減らすことはないから、puts1回の呼び出しで済むprintfのほうが早い
0161デフォルトの名無しさん (ワッチョイ e175-e3AS)
垢版 |
2017/11/05(日) 21:26:10.62ID:pE+6s3oz0
すっげー
物知りだなぁ
0162 ◆QZaw55cn4c (ワッチョイ 2260-xBM6)
垢版 |
2017/11/05(日) 21:29:46.85ID:cePuEsTc0
>>160
それはさすがになさそうだ…
printf()/vfprint() のCのコードを#include しているわけではなく、単にリンカがランタイムのコードをリンクしているだけなのでは?
いいかえると、printf() がCで書かれており、printf() もコンパイルするのなら最適化がかかるだろうが、さすがにそうじゃないだろう?
0163デフォルトの名無しさん (ワッチョイ e175-e3AS)
垢版 |
2017/11/05(日) 21:31:03.45ID:pE+6s3oz0
もうさぁ実測でいいよね
0169デフォルトの名無しさん (ワッチョイ 4193-ZDq4)
垢版 |
2017/11/06(月) 06:37:53.91ID:uTTN+kxR0
>>167 のリンク先を読んだのだが…
printfで色々条件、最後が改行だったらputsに置き換え、は分かったけど
最後が改行でない場合はfputs( , stdout)に置き換えるわけにいかんのじゃろか?
0174デフォルトの名無しさん (ワッチョイ 4150-lboT)
垢版 |
2017/11/06(月) 17:25:31.98ID:f1KpQ6jU0
みなさんありがとうございます。
末尾の改行程度しかないprintfはputsに置き換えられるんですね。
ググってみたりもしたんですが、最近のPCであれば速度にほとんど違いが出ない様なことも書いてありました。
171さんの言う通り速度やリソースよりも見やすさや読みやすさの方が大事になりそうですね。
勉強になりました。
0175デフォルトの名無しさん (ワッチョイ 4502-S32u)
垢版 |
2017/11/07(火) 05:32:04.97ID:2eQgtTM30
塵も積もれば何とやらで
すぐ砂時計だの輪っかだのになるのが
M$の作風
0176デフォルトの名無しさん (ワッチョイ 46e7-M99L)
垢版 |
2017/11/07(火) 18:15:10.39ID:pVSOD8mN0
入力が入れる前に厳密にされてないとprintfは怖くて使いたくないなエラーになるし
プログラミング問題とかなら入るの制限されてるから使う時もあるけど
0177デフォルトの名無しさん (ワッチョイ 99b3-tWDu)
垢版 |
2017/11/08(水) 00:52:24.03ID:+F77Ugxq0
自動で実行ファイルが作成されてその実行ファイルが新しく実行ファイルを作ってその実行ファイルが…
みたいな無限増殖するウイルス的なやつって理論上作れるの?
作る気はないがファイル名を自動で生成して上書きするようしていったら全ファイルが空ファイルになるってのも可能なのか?
0178デフォルトの名無しさん (ワッチョイ e175-e3AS)
垢版 |
2017/11/08(水) 00:53:30.71ID:Fypp0IbQ0
可能
0182デフォルトの名無しさん (ワッチョイ 4150-lboT)
垢版 |
2017/11/08(水) 10:05:36.22ID:2J8ZwtJ20
なにこのスレ怖い
0185デフォルトの名無しさん (ワッチョイ 5f9f-lB0v)
垢版 |
2017/11/09(木) 01:05:19.54ID:dSouu86q0
>>177
fork() してプロセス作るの繰り返すだけでいいのでは?ファイル作る必要あるか?
作ったとしてもそのファイルの内容は元のやつと同じなんだろ?

Windows の場合はどうするか知らない。fork() と同じような動きをするAPIがあるなら
それ使えばいい。(cygwinのライブラリ使えばいいか)
0186デフォルトの名無しさん (ワッチョイ 5f9f-lB0v)
垢版 |
2017/11/09(木) 01:06:21.38ID:dSouu86q0
>>183
君は return を何か別のものと勘違いしてはいないか?
0188デフォルトの名無しさん (ワッチョイ 5fb3-QPNr)
垢版 |
2017/11/09(木) 01:31:12.69ID:th5mXoJq0
>>187
じゃホント適当なの

int main(void){
int a,b;
scanf("%d %d",&a,&b);
a=a+b;
return a;

適当に
基本自分はa=a+bの後の行にprintf("%d",a);って入れるけど戻り値を表示するだけならreturnで十分なの?って聞きたい
0189デフォルトの名無しさん (ワッチョイ 5f75-OZYs)
垢版 |
2017/11/09(木) 01:44:44.36ID:kZJdPPiU0
>>188
main関数のreturnの値は0固定だろ。
正常に終了したかどうかを示す数値を返さないとダメなんだし
0190デフォルトの名無しさん (ワッチョイ 5f9f-lB0v)
垢版 |
2017/11/09(木) 01:52:12.46ID:dSouu86q0
>>188
それどこにも何も出力してないよ。一応 main() での return はプログラムを実行した側に
ステータスとして返されたりするがその辺はOSやmain()を呼ぶ側のコード依存だ。

で、それはプログラムの実行中で起きたエラーを伝えるためによく使われている。
0ならエラーなしで1ならエラーみたいに。つまり普通は計算結果を返すためには使わない。
0192デフォルトの名無しさん (ワッチョイ 5f9f-lB0v)
垢版 |
2017/11/09(木) 02:31:24.91ID:dSouu86q0
>>191
固定と言うか、昔からの慣習で普通は0返すように書くんだよ。UNIXでの慣習ね。Linuxでも同じ。
UNIXではシェルスクリプトで動かした時にエラーかどうかを判定するのに使うことがある。
(シェルの if 文等で直接使える。Windows のコマンドプロンプトでもほぼ同じ)。
0が返されたら正常終了で0以外がエラーね。

まあとにかく歴史的な問題でそうなっていると思って良い。そういう意味では main() からの
return だけは特殊なものだと思っていい。
0193デフォルトの名無しさん (ワッチョイ 5f93-B4G6)
垢版 |
2017/11/09(木) 06:59:07.81ID:tZYUBTdz0
>>188
return a; と書いても基本的にはaの値は表示されないよ。
returnは関数内で計算した結果を呼び出し側に返すだけ。
値を見たければprintf等を使って表示する必要がある。
呼ばれた関数内で(途中経過として)表示するか、
呼び出した側で(関数の結果として)表示するか、は目的次第だが。

main() はOS(WindowsとかLinuxとか)からコマンドとして呼び出される関数、
と考えると分かりやすいかも。
main() 関数のreturnの値はOSに返される。
返された値をどう扱うかはOS側の問題だわね。
0195デフォルトの名無しさん (ワッチョイ 5f50-TPjW)
垢版 |
2017/11/09(木) 07:18:13.98ID:/m6aHr1P0
>>191
「自作関数を作る」あたりのページで出てくるsum関数でしょ?
あれってただ単に今までmain関数で return 0 しかしていないから、例として同じように書いているだけだと思うよ。

「関数から数値を返す」のページまで行けば return num してるsum関数が出てくるよ。
0196デフォルトの名無しさん (ワッチョイ ffe7-/rI5)
垢版 |
2017/11/09(木) 13:19:13.30ID:U5AasQBn0
print関数だけで表示するだけの関数とかならreturn0するけど衝突判定とかならbool型返したりするからな
0197デフォルトの名無しさん (アウーイモ MM23-0J0R)
垢版 |
2017/11/10(金) 15:35:52.06ID:VD/o6LfMM
何ができれば、c使えるって言っていい?
0198デフォルトの名無しさん (ガックシ 064f-OZYs)
垢版 |
2017/11/10(金) 15:40:07.94ID:ZWtrLrii6
mallocの実装
0208デフォルトの名無しさん (ワッチョイ 7f06-TYjb)
垢版 |
2017/11/10(金) 20:07:11.53ID:f7hdF1Yr0
use the force luke
0209デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/10(金) 20:08:56.37ID:KTiHfL4P0
Ubuntuをインスコできる。
0212デフォルトの名無しさん (ワッチョイ 5f75-OZYs)
垢版 |
2017/11/10(金) 21:09:11.01ID:7i6+bCDW0
配列?
0221デフォルトの名無しさん (ワッチョイ 5f93-B4G6)
垢版 |
2017/11/10(金) 21:53:36.59ID:mQGNgvjy0
コンピュータの中には何百メガとか何ギガとかのバイト数のメモリがあって、
データ(数値や画像や文字列、プログラム自体も)はメモリに記憶されていて、
メモリには1バイトごとに連番のアドレスが割り振られている。

…程度のイメージなら現代じゃ誰でも共有してると思うんだけど。
女学生が携帯電話機を使ったり、子供がゲームをする時だって、
「メモリカードの容量が足りなくなった」とか言うでしょ。

それとも、容量としてのメモリ(どれだけ入れられるのか)は飲み込めても
アドレスという概念(どこに入ってるのか)になると飛躍が必要なのかな。
0223デフォルトの名無しさん (ワッチョイ ffe7-/rI5)
垢版 |
2017/11/10(金) 22:04:11.83ID:bPzBG0Jo0
いわえる宅急便で品物の上に貼るあれよあれがないとどこに送れないか解らないっていうあれ
0226デフォルトの名無しさん (ワッチョイ 5f71-UELA)
垢版 |
2017/11/10(金) 22:21:46.83ID:WKyXN66O0
>>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と書く
0227デフォルトの名無しさん (アウアウウー Sa23-P3MY)
垢版 |
2017/11/10(金) 23:20:18.63ID:jSzmIFsta
>>213
一応考えてみた
アドレス= 住所だと考えて
どこでもドア = ポインタ変数そのもの
行きたい場所 = 参照先のアドレス
として
・自分の部屋にどこでもドアを置く = ポインタ変数を宣言する
この時のポインタ変数のアドレス(ドアの置かれてる場所)は自分の部屋
今はまだドアの向こうはどこにも繋がっていない
・どこでもドアの向こう側をしずかちゃんの風呂場にする = ポインタ変数の中身を参照先(しずかちゃんの風呂場)のアドレスに書換える
これでポインタ変数の中身(=ドアの向こう側)はしずかちゃんの風呂場と繋がる
・ドアを開けて風呂場を見る = *を付けてポインタ変数にアクセスする
・ドア自体がどこに置かれてるかを知る = &を付けてポインタ変数にアクセスする
ポインタの嬉しい点はわざわざしずかちゃん家に行かなくても自分の部屋に居ながら
どこでもドアを介して風呂場を覗く事が出来るので移動の時間が省けて時短になる
0228デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/11(土) 00:39:20.61ID:4HyMUlDc0
初心者はたとえ話するのが好き。
0229デフォルトの名無しさん (ワッチョイ 5f75-OZYs)
垢版 |
2017/11/11(土) 01:09:56.98ID:QwHnz2ZY0
>>227
そんななげーの覚えれねーよ
0230デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/11(土) 01:16:01.20ID:4HyMUlDc0
ヘネパタ読破してからプログラミングに進め。
0233デフォルトの名無しさん (ワッチョイ 5f8c-l80d)
垢版 |
2017/11/11(土) 02:43:48.01ID:OXx9+Toc0
ポインタを説明するときにアドレスで説明するのって、初心者による初心者向けの説明に多いけど
それはアドレスを知ってる人向けで、ここからさらにアドレスを一生懸命別の何かで
例えるのはかえって分かりにくいだけにしか思えない
0234デフォルトの名無しさん (ワッチョイ 7f87-ckd2)
垢版 |
2017/11/11(土) 04:15:47.28ID:qvyXx+2n0
喩えるんじゃなくてメモリそのものを教えたほうがいい
0236デフォルトの名無しさん (ワッチョイ dfe3-ihOZ)
垢版 |
2017/11/11(土) 04:30:42.45ID:3tqm8fVd0
>>211
マイコン小僧的な意味での理解が必要かもしれないなあ

ポインタ定義した時点で、コンパイラが「アドレスを入れるためのメモリ領域」なり
「CPUのレジスタ」なりを使うようにしてくれる
貴方が int* a = 300; とか書いたら、 コンパイラは300という数字をどこかに保存しておいてくれる
CPUのレジスタか、特定のメモリ領域かは処理系次第だが

で、計算やるってなったら「CPUの間接参照機能」を利用する
アセンブラ側で「間接参照機能を使え」って感じのコードを吐くのよ
そういうオペコードがある

で、間接参照機能を使った場合、CPUはメモリの内容を2バイトか4バイトか見るでしょ
CPUは「今読んだ数字はメモリの番地である」と判断して
CPU側でいてあるメモリ番地の内容を読み込む
で、読んだデータはコンパイラが吐いたアセンブラのコード次第だが

とにかくCPUには「ある数字をメモリなりレジスタから読み、次にそこに書いてた数字をアドレスと判断し、別のメモリアドレスを読む」って機能がある
それを使うのがポインタ

そんな感じ
0239デフォルトの名無しさん (ワッチョイ dfe3-ihOZ)
垢版 |
2017/11/11(土) 04:46:59.68ID:3tqm8fVd0
アドレスについては……

Q: たとえばここに 1 2 3 4 って数字があるとするでそ
二番目を起点にして、二つ指差してみて、起点は指差しの対象に含むよ

A: 指差す箇所を[]でくくると 1 [2] [3] 4 になるかと

そんな感じのテキトーさでいいと思います、これがただ例えば0x000F34824になるだけで
0242デフォルトの名無しさん (ワッチョイ dfe3-ihOZ)
垢版 |
2017/11/11(土) 04:58:49.86ID:3tqm8fVd0
なお、ポインタのだいたいの使い道は

・クソでかいデータを複数の関数で参照せなあかんとき(画像処理とか)に先頭アドレスだけ渡してあとよろしこって奴
・呼び出し「先」側でなんかセットアップしてもらわなあかんとき、Win32APIあるある
・関数テーブル(30だか50だか、個別に使う関数の先頭アドレスと、そこに飛ばす条件をペアにした配列があるの)
・無名関数もどきのことをやりたいとき、一部分だけ後付け処理やりたいんでそこだけjmpさせて戻る系の奴というか、sortみたいなの

のどれかやな、こんくらいの説明でいいんだろうか? イミフすぎて正直すまんかった
0246デフォルトの名無しさん (ワッチョイ 5f9f-zl2n)
垢版 |
2017/11/11(土) 15:25:23.65ID:cTWJmMx00
8bitマイコンみたいなやつだと説明は少し楽になるな。メモリ空間が64KBしかないし。
まあ昔はそれでもバンク切り替えして沢山メモリ使えるようにしていたが、考える上では楽だ。
今はメモリ空間も広大になってメモリブロック切り替えてアドレス変わるのは当たり前だったりして説明が面倒だ。
0253デフォルトの名無しさん (ワッチョイ dfcc-TYjb)
垢版 |
2017/11/11(土) 19:57:56.44ID:Hv/PaJUT0
>>252
懐い...
0254デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/11(土) 23:12:19.01ID:4HyMUlDc0
CASL→C→Java→C++の順でどうぞ。
0255デフォルトの名無しさん (ワッチョイ 5f9f-zl2n)
垢版 |
2017/11/12(日) 02:33:10.79ID:0YSprajH0
>>252
な、なぜそれを知っているw
0256デフォルトの名無しさん (ワッチョイ dfcc-TYjb)
垢版 |
2017/11/12(日) 05:22:01.75ID:yBBP+7vl0
SWEET16
0257デフォルトの名無しさん (ワッチョイ 5f8a-gxuN)
垢版 |
2017/11/12(日) 06:32:07.24ID:61B/9ygA0
ポインタの前にアドレスが理解できないってどういうことよ…
アドレス=メモリ上の位置、だよ
例えば64kbのメモリを積んだ機械ならアドレスの全範囲は0x0000〜0xffffだが
そんなこと気にしなくても使えるようにしたから高級言語なのよ

int a;
int *pa;
としたとき、コンパイラはaとpaそれぞれを上記範囲の"どこか"に割り当てる
その"どこか"をaやpaという名前で呼ぶことにするよ、という宣言だから

ただし「変数は"どこか"のアドレスの別名である」ということを"利用"することはできる
pa = &a;
とすれば、paには「aの実際の場所(=アドレス)」が入り
*pa = 123;
とすれば、paが現在指しているアドレス、即ち「aの実際の場所」に123が入る
0258デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 10:09:12.41ID:H0u2BwIs0
お前らが箱とか部屋とか変なこと言いだすから初学者が混乱するんだろ。
0259デフォルトの名無しさん (ワッチョイ 7fa2-Ud84)
垢版 |
2017/11/12(日) 10:18:34.45ID:pV+DiiLQ0
変じゃない説明よろしく
0260デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 10:24:13.57ID:H0u2BwIs0
CASLが基本。
0261デフォルトの名無しさん (ワッチョイ 5fd2-cd7v)
垢版 |
2017/11/12(日) 10:34:03.82ID:534592TW0
ニモニック表片手にハンドアセンブルしてみろ
そうすりゃアセンブラやコンパイラがなにしてるか
馬鹿でもない限りいろいろ分かる
0263デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:23:06.41ID:H0u2BwIs0
アドレスにアドレスは入らないだろ。
0264デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:28:32.94ID:H0u2BwIs0
アドレスを記録位置と言い換えてみたらどうだろうか。
0265デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:30:59.32ID:H0u2BwIs0
メモリーを記録装置、メモリー上のバイトを記録素子、アドレスを記録位置。
どうだい。
0267デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:33:44.56ID:H0u2BwIs0
記録位置の入った素子の位置が入った記録素子。
これなら有りえるとすぐわかる。
0268デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:35:10.76ID:H0u2BwIs0
>>266
ポインタはアドレスではない。
0269デフォルトの名無しさん (ワッチョイ 5f25-OZYs)
垢版 |
2017/11/12(日) 11:40:26.83ID:V8vWJYoP0
物理的な描像にするな。
論理的な本質部分を説明しろ。
0270デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 11:41:52.30ID:H0u2BwIs0
Cから物理を取り除いたら役に立たない古代文明。
0271デフォルトの名無しさん (ワッチョイ 5f25-OZYs)
垢版 |
2017/11/12(日) 11:43:40.40ID:V8vWJYoP0
ハートは抽象的モデル化しろ。
0272デフォルトの名無しさん (ワッチョイ 5f25-OZYs)
垢版 |
2017/11/12(日) 11:44:09.30ID:V8vWJYoP0
x ハート o ハード
0273デフォルトの名無しさん (ワッチョイ 7f87-ckd2)
垢版 |
2017/11/12(日) 14:48:35.92ID:w0XJ4hAE0
>>265
メモリー上の位置でいいんじゃね?
これがイメージできなきゃ無理
0276デフォルトの名無しさん (ワッチョイ 5f8a-gxuN)
垢版 |
2017/11/12(日) 15:11:05.31ID:61B/9ygA0
○重ポインタという言葉はあまりオススメしない
いくら重ねようが「〜へのポインタ」だ

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]
0277デフォルトの名無しさん (ワッチョイ 5f9f-/Aoa)
垢版 |
2017/11/12(日) 17:57:06.14ID:dvIcUwwY0
確かにポインタは2重以上はなるべく使いたくないな。混乱するし。
0278デフォルトの名無しさん (ワッチョイ ffe7-/rI5)
垢版 |
2017/11/12(日) 18:01:39.60ID:C1sLEmf00
そうだなポインタを文字列の格納だけに使うならアドレスは関係ない
int型で変数を操作するとかなら話は別だけどな
0279デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 18:02:47.18ID:H0u2BwIs0
二重以上には二重も入るのだが、本当にそれでいいのか?
0281デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 18:20:47.35ID:H0u2BwIs0
ポインタは型ではないので、二重のポインタという言い方はあり得るのではないか。
0285デフォルトの名無しさん (ワッチョイ 5fb3-ouqv)
垢版 |
2017/11/12(日) 18:25:59.93ID:H0u2BwIs0
int型へのポインタに対するchar型へのポインタとかあるのなら紛らわしいという主張も理解できるが。
そんなものは無いので。
***を三重のポインタというのは合理的に見える。
どうだい。
0291デフォルトの名無しさん (ワッチョイ 5fb3-AgpC)
垢版 |
2017/11/12(日) 18:42:31.96ID:VcNgV3aF0
3次元配列を生成して引数に書き戻すような構造なのか
4次元配列を生成して戻すようなのか
各次元で大きさが固定なら 1次元配列にして 添え字演算で4次元にしちゃうな
0294デフォルトの名無しさん (ワッチョイ 5f9f-/Aoa)
垢版 |
2017/11/12(日) 20:33:06.12ID:0YSprajH0
>>280
階層の方が良いか?
0297デフォルトの名無しさん (ワッチョイ 5f8c-JIcl)
垢版 |
2017/11/12(日) 22:26:52.43ID:5J9eZD000
>>294
多分、階層の方がわかりやすいだろうね

int ***p; というポインタ変数pで p[x][y][z] とすると、
*(*(*(p + x) + y) + z)
を参照する。このあたりを分かりやすく言えるといいんだけど
0302デフォルトの名無しさん (ワッチョイ 5fb3-1iEE)
垢版 |
2017/11/13(月) 14:21:03.70ID:M4Fu1SNu0
構造体のメンバーの構造体のメンバーの構造体のメンバーのつもりで
ポインタのポインタのポインタとかいい気になって使ってたら、
エクセプションの嵐でワラタw
0304デフォルトの名無しさん (スッップ Sd9f-6mXn)
垢版 |
2017/11/13(月) 14:41:15.42ID:xUyRVn+md
有名な言葉思い出した。
プログラムは意図した通りには動かない、
書いた通りに動く。
0307デフォルトの名無しさん (ワッチョイ 7f6e-TYjb)
垢版 |
2017/11/14(火) 05:34:12.35ID:Qlty8abH0
三次元配列を扱うのに三重ポインタが出てくると思っている池沼がいるな
0310デフォルトの名無しさん (ワッチョイ ffe7-y/Ph)
垢版 |
2017/11/14(火) 17:36:47.28ID:ijEEO/Co0
誰かが書いてあって気になったんだけど
double a;
scanf("%if", &a);
ってf単体じゃないの?
0311デフォルトの名無しさん (ワッチョイ 7fa2-Ud84)
垢版 |
2017/11/14(火) 17:46:40.44ID:CqmbHxm/0
%lfじゃなくて?
0312デフォルトの名無しさん (ワッチョイ ffe7-y/Ph)
垢版 |
2017/11/14(火) 18:28:10.04ID:ijEEO/Co0
>>311
間違えたそれだ
0316デフォルトの名無しさん (ワッチョイ 5f76-Ud84)
垢版 |
2017/11/14(火) 19:57:38.61ID:mdecs3M50
調べるとすぐにwikipediaが出てきたよ
https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%96%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を数値として表示
0318デフォルトの名無しさん (ワッチョイ df7f-TPjW)
垢版 |
2017/11/14(火) 20:29:48.26ID:M89KBFlu0
何したいかによるんじゃね

素でもそれなりには扱えるし、不十分ならライブラリ探してもいい
どうしても無理なら慣れた文字コードに変換すればいいけど、こっちは一部文字情報が欠落するかもね
0320デフォルトの名無しさん (ワッチョイ 5f02-TYjb)
垢版 |
2017/11/15(水) 06:11:40.94ID:1fEpam2j0
「配列へのポインタ」で嘘教えてるクソサイト
0322ビル・ジョブス (ワッチョイ 5fb3-bJtK)
垢版 |
2017/11/15(水) 09:06:23.81ID:sfEUfVZe0
配列名は変更できない左辺値
0323デフォルトの名無しさん (ワッチョイ 5f8a-gxuN)
垢版 |
2017/11/15(水) 10:37:31.14ID:Iv8iuDMF0
次のC規格でそろそろ文字を扱う関数全てunsigned charに変更してくれないかな
utf8でもsjisでもだけど1バイト目の判定でいちいちキャストするのが不毛すぎる
賢明なプログラマならcharなどというプリミティブ型をそのままの名前で使わずちゃんと
typedef char str_t;
とかしてるはずだし、してない愚者はもうシステムもろとも切り捨てていいだろう
-1が欲しいために結局intに拡張されるんだからcharの時点では符号は不要なんだよ
0326デフォルトの名無しさん (ワッチョイ ffa5-ySnM)
垢版 |
2017/11/15(水) 20:52:19.99ID:edi6IXQo0
>utf8でもsjisでもだけど1バイト目の判定でいちいちキャストするのが不毛すぎる

いまどきそういうencoding依存のコードをそんなに頻繁に書いているんだとしたら
それ自体が不毛な気も。
0327デフォルトの名無しさん (アウアウアー Sa16-0x9U)
垢版 |
2017/11/16(木) 10:46:07.94ID:QxSeP1oQa
なんのために皆cやってるん?
0330デフォルトの名無しさん (アウアウカー Sa49-GczB)
垢版 |
2017/11/16(木) 16:46:03.46ID:ExCdIANwa
ファイルサイズ測定

そのファイルサイズ領域を動的確保

そこにutf-8の文字列を順次格納

みたいなプログラム組んでるんだけど

ファイルサイズ/sizeof(wchar_t)と中身の文字の数って等しくないの?
0336デフォルトの名無しさん (ワッチョイ 86e7-0Cia)
垢版 |
2017/11/16(木) 17:29:40.48ID:NqJtZOMo0
暇つぶしで気になったんだけどC言語でもOSは作れるだよな、でも制御とかでコンピューターをちゃんと理解してないとやっぱ作れない?
0337片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd22-EXIO)
垢版 |
2017/11/16(木) 17:45:35.36ID:1Qzf60whd
FreeDOS、Linux、ReactOSなどのオープンソースなOSは、ソースが見られるから参考にするといい。
例えば、OSで並列処理をしたい場合は実際のCPUの知識が必要になるし、OSをCD-ROMからインストールしたい場合は、CD-ROMのファイルシステムの知識が必要になる。
OSを便利にしたいなら、それなりの知識が必要になるのさ。
0338片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd22-EXIO)
垢版 |
2017/11/16(木) 17:50:48.01ID:1Qzf60whd
モダンなOSは巨大化・複雑化しているから、一人ですべてを把握するのは難しい。
必要な機能を分割統治して、ライブラリなどによってブラックボックスとして実装するのが一般的。
0345デフォルトの名無しさん (ワッチョイ 86e7-0Cia)
垢版 |
2017/11/16(木) 20:33:55.78ID:NqJtZOMo0
ただC言語の本にアセンブリ言語またC言語でもOS作成可能ってあったから気になっただけ
他の言語もコンパイルして機械語にするからC言語も間接的な言語しかないのかなって疑問に思っただけ
0350デフォルトの名無しさん (ワッチョイ 8203-Eq1o)
垢版 |
2017/11/17(金) 03:13:34.00ID:HNipYc2I0
インラインなんかほとんど使わない
アセンブラが必要なところはガチのアセンブラを使う
量にして全体の数%ってとこ
0353デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/17(金) 23:24:01.69ID:mCQOvNmw0
>>330
UTF-8 とは何か?
そして wchar_t 型とはなにか?

まずはこの2つについて徹底的に調べると君の頭は少し良くなると思う。
0354デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/17(金) 23:32:51.13ID:mCQOvNmw0
>>336
OS作れるどころかOSを書くために作られたような言語がCだよ。UNIXな。
0355デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/17(金) 23:36:03.75ID:mCQOvNmw0
>>342
超漢字はPCで・・・
0362デフォルトの名無しさん (ワッチョイ e92b-0hG5)
垢版 |
2017/11/18(土) 03:52:04.95ID:V3PmucT60
おれの昔使ってたシステムでは、free忘れじゃなくて、mallocしたアドレスを2度freeしたり、もしくはmallocとは全然関係無いアドレスをfreeすると、
その後のmallocでおかしな動作をすることがあった
0363デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/18(土) 06:02:16.21ID:4FIhP4xR0
>>358
本当か?
0364デフォルトの名無しさん (ワッチョイ 25d6-Eq1o)
垢版 |
2017/11/18(土) 06:22:35.45ID:mIICZMYh0
>>362
おそらく、そういう系だろうな
どこかで未定義の動作をやらかしてる
0367デフォルトの名無しさん (ワッチョイ 25d6-Eq1o)
垢版 |
2017/11/18(土) 09:47:18.69ID:mIICZMYh0
ゲイツOSかどうかには関係ねえぞ
malloc/freeが空き領域をどのように管理しているかの実装の問題だ
0374デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/18(土) 20:09:57.58ID:4FIhP4xR0
>>373
「問題ない」とは?何で確認した?
0380デフォルトの名無しさん (ワッチョイ e92b-0hG5)
垢版 |
2017/11/18(土) 21:10:22.92ID:V3PmucT60
setlocaleの引数は?
0382デフォルトの名無しさん (ワッチョイ a193-GczB)
垢版 |
2017/11/18(土) 21:48:38.17ID:N5k0nP0W0
解決した
関数の中で宣言したwchar_t の配列buff[20]のポインタを返してそれを表示してたんだけどそれがまずかったみたい

スコープから抜けた瞬間に解放されちゃうみたい

無知だったわ申し訳ない
0384デフォルトの名無しさん (ワッチョイ a19f-RjUU)
垢版 |
2017/11/18(土) 23:02:18.25ID:euoYf0NO0
>>382
GC言語使ってた奴がよくやるパターンだ。ドンマイ。

>>383
それだと後でいちいちfreeするのが面倒だろ。
普通は呼び出し元で buff[20] 確保してポインタを渡し、子関数内でそこに書き込む。
なおどうしても値返しで組みたければ、structならreturnで値返しできるからくるめばいい。(はず)
0385デフォルトの名無しさん (ワッチョイ 419f-Eq+G)
垢版 |
2017/11/19(日) 03:54:32.58ID:+NeHX1+n0
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;
}
0386デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/19(日) 04:46:36.12ID:uKY6C0dJ0
意味は同じだし最適化されるからどうでもいいことではあるが、
そこの &str[0] は単に str と書くだけでいいんじゃないの?
見やすさの点からも受け取る部分が char *str ならそのまんま
str って書いておいた方が分かり易いと思うんだけど。
0388デフォルトの名無しさん (ブーイモ MMf6-6+Yk)
垢版 |
2017/11/19(日) 09:57:18.82ID:v7NTUoVSM
初心者はこれだけ守ってれば良いかと

処理対象のメモリは呼び出し元で確保、alloc-freeで処理をはさむ
処理の戻り値は基本intでエラーコードを返す
ローカル変数は16k未満、可変長配列は使わない

>>387
そんなことはない
0389デフォルトの名無しさん (ワッチョイ 82a4-Eq1o)
垢版 |
2017/11/19(日) 10:16:36.97ID:Rb2sIcHm0
> 処理の戻り値は基本intでエラーコードを返す

malloc先生やprintf先生を見習ったら違反だな


> ローカル変数は16k未満、可変長配列は使わない

何だそのマジックナンバーは??
0390デフォルトの名無しさん (ワッチョイ a193-oo0Z)
垢版 |
2017/11/19(日) 10:34:41.84ID:YNZopTj60
malloc に限らんけど、ポインタを返す関数は
失敗の場合にNULLを返すってのはまぁ基本だね。
線形リストの探索、見つからなければNULL、みたいに。

printf の返り値はintだから一応は >>388 の方針通りじゃろ。
成功なら非負の値、失敗したら -(エラーコード) が返る、
と決めておけば何かと使いやすいわね。
0391デフォルトの名無しさん (ワッチョイ 82a4-Eq1o)
垢版 |
2017/11/19(日) 10:42:05.59ID:Rb2sIcHm0
>>390
ちょw
printfの仕様を知らんのか
0395デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/19(日) 13:05:21.82ID:uKY6C0dJ0
printf() の man page 見てもエラーの時は負の値を返すとしか書いてなくて errno に何か入るとは書いてない。
まあ、実際には中で putchar() と同等な事をするだろうからその中で使われる write() で何か書かれるとは
思うがその辺は保証されていないので使えない。(書き込み時のエラーではないかも知れないしな)。
GNU の asprintf() もエラー時は -1 を返すのみで errno については何も書いてない。

それと snprintf() のような結果を書き込むバッファの大きさを指定できるやつはバッファを使い切った場合の
エラーの返し方が違う。
0396デフォルトの名無しさん (アウアウカー Sa49-GczB)
垢版 |
2017/11/19(日) 16:13:09.94ID:ViWWOCHYa
条件が
文字列の長さ
文字列比較
でソートしたくて2回forで回してます

流石にこれでは件数が増えたときにとてつもなく遅くなるので1回のforだけでやる方法を教えてください
0397デフォルトの名無しさん (ワイモマー MM05-harS)
垢版 |
2017/11/19(日) 16:19:33.08ID:lEYmgXHFM
>>396
普通にソートすれば、長い方が後に来るんじゃね?
0398デフォルトの名無しさん (ワッチョイ 41b3-wRfy)
垢版 |
2017/11/19(日) 16:32:59.11ID:NI05LLAC0
条件を変えて2回まわしたら1回目のソートは(ほぼ)意味がないんじゃない?
(順位を保つソート法なら 多少意味が出てくる: qsort はその保障はない)

qsort の srot_cmp の記述で
比較すべき それぞれの要素 c1 と c2 を多重に比較すればいい

・「文字列長さ」で比較し 違うなら大小関係を返す→
 ↓
・(上の比較が等しいので)「文字列」比較し 違うなら大小関係を返す→
 ↓
 :
 ↓
・(上の比較が等しいので)等しいと返す

これならソートは1回だけ
0400デフォルトの名無しさん (ワッチョイ 919f-RuWE)
垢版 |
2017/11/19(日) 19:18:57.18ID:uKY6C0dJ0
>>399
f=f*i の部分は四則演算1回と代入1回だから2ステップなのでは?
0401デフォルトの名無しさん (ワッチョイ feeb-MUuo)
垢版 |
2017/11/19(日) 19:34:22.94ID:H23Xb2RQ0
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 とか。よくわからんけど
0403デフォルトの名無しさん (ワッチョイ a9ea-wRfy)
垢版 |
2017/11/20(月) 14:28:22.74ID:8OH1W8zR0
i++ を1ステップ勘定するか 2ステップ勘定するかは悩ましいけど
分解して 四則演算の1 + 代入の1 計2ステップ の見積もりするのが妥当なんかな
題中にインクリメント演算についてのステップ数は明示されてないし
0404デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/20(月) 17:25:41.15ID:ZHV8ZCmh0
i++みたいにハード的にありえない(メモリは加算機能を持たない)ことは
マイクロコードで実現しているわけで、1ステップなわけがない
0412デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/20(月) 23:56:46.22ID:ZHV8ZCmh0
おまえ自身は何も言わないわけか
0413デフォルトの名無しさん (ワッチョイ e92b-0hG5)
垢版 |
2017/11/21(火) 00:13:10.99ID:j0/qDr3U0
++は対象がレジスタに乗ってるときに1命令だろ
とくにアドレスレジスタの場合に *p++ をポストインクリメントレジスタ間接アクセス命令にそのまま置き換えられるから、
オプティマイズがまだ発達してなかったころに重宝したはず
0414デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/21(火) 06:23:40.67ID:uBkGRn7P0
そのバヤイは0.5命令だね
* と ++ を同時並列でやるわけで
0415デフォルトの名無しさん (ワッチョイ a193-oo0Z)
垢版 |
2017/11/21(火) 06:30:17.80ID:VCAIytbF0
>>411 実際のマシンとは関係のない、問題のための問題だから
問題を作った人の答えが正解というルールは仕方ないとして…。

i++ が1ステップなのか2ステップなのか、という疑問が出るスレッドで、
f = f*i はまとめて1ステップです、という解説が現れるのは予想外だったわ。
f*i が四則演算で1ステップ、fへの代入でもう1ステップ、と思うよね。
0416デフォルトの名無しさん (ワッチョイ 4976-RVzq)
垢版 |
2017/11/21(火) 07:23:37.68ID:V9LM9CF/0
単純に行数で示す場合もあるし
いろいろだよ

重要なのは計算オーダーと実測値
ステップ数は計算オーダーを見積もる為の道具で
定数倍はわりとどうでも良い

計算量をもっと正確な値を知りたい時は
加減算○回、乗算○回、除算○回
など、より具体的な値とする
0417デフォルトの名無しさん (スップ Sd82-LOf1)
垢版 |
2017/11/21(火) 09:57:32.04ID:6BA+Ife8d
末尾に/が入っていたとき全て削除したいのだけどどうすれば簡単に実装できるだろうか
データはcharの配列に入っている

ex
aaa.txt
aaa.txt/→aaa.txt
aaa.txt/////→aaa.txt
0418デフォルトの名無しさん (スップ Sd82-LOf1)
垢版 |
2017/11/21(火) 10:04:28.94ID:6BA+Ife8d
あとsystem関数の戻り値の判定に悩んでます
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/system.3.html

上記参考にしたら四つのケースに別れていて
下二つはwexitなどのマクロで取得可能
上二つの内ひとつはnullチェックで弾くこと可能
残りは子プロセス作成失敗の-1で網羅できてると考えているのだけど間違ってるのかな?

やりたいことは
system関数のコマンドライン実行したアプリのステータスコードを取得したい。そのためにマクロ使ってる

ただ子プロセスの取得云々の前にsystemの結果判定必要なんでは?と指摘を受けて修正してるのだけどsystemの返す値がさっぱりわからなくて困ってます
0423デフォルトの名無しさん (エーイモ SEed-Aqvu)
垢版 |
2017/11/21(火) 11:41:02.99ID:qTGygbeTE
gcc -lライブラリ名 hoge.c

stdio.hと同じフォルダに自分が使いたいヘッダーファイルが存在してるのに
いちいち-lライブラリ名ってしないと参照できないんです
どうしてstdio.hは-lstdioって書かなくても使えるのに自分がインストールしたヘッダーファイルはいちいち-lで指定しないと使えないんでしょうか?
すか?
0429デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/21(火) 14:47:42.58ID:uBkGRn7P0
>>423
スクリプトかバッチを作ればいい
たとえばmycc.batというファイル名で
gcc -lライブラリ名 %*
と書き込んでおいて
mycc hoge.c
とやる
0430デフォルトの名無しさん (ワッチョイ e18a-H2sc)
垢版 |
2017/11/21(火) 19:27:53.90ID:5ScqS7z90
>>423
標準ライブラリオブジェクトはスタートアップファイル(crt0)に組み込まれていて自動的にリンクされる
標準以外のライブラリオブジェクトは明示的にリンクしないと使えない
0432デフォルトの名無しさん (ワッチョイ feeb-MUuo)
垢版 |
2017/11/21(火) 21:45:59.93ID:EZGPgPj40
まあ、先の問題については、ステップの厳密な定義が読み取れないし。
回答者の説明に矛盾がなければ○でいいと思うわ。
それでも誤答とされてしまったら、出題者がウンコだと思って忘れるレベル。
0438デフォルトの名無しさん (ワッチョイ 7d7f-GXP8)
垢版 |
2017/11/21(火) 23:33:58.03ID:6oQfsQ1l0
>>435
>>428はGnuWin32って名前から察するにPOSIXのregexだろ
置換なんてないから、正規表現コンパイルして検索して自分で書き換えるんだぞ

正規表現の置換を呼び出し一回で済ませられるような関数が
ANSIとかPOSIXにあるなら良いけど、そうじゃないだろ
0442デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/22(水) 00:18:19.23ID:CvPbHYJg0
>>417
こんなのはどうかなあ。
char *s が元になる文字列へのポインタ。p は char *p。

for (p = strrchr(s, '/'); p && p >= s && *p == '/' && ! *(p + 1); *p-- = '\0');
0443デフォルトの名無しさん (ワッチョイ 919f-8CrJ)
垢版 |
2017/11/22(水) 01:37:39.91ID:CvPbHYJg0
>>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 にシグナル番号が入る。
 }
}
0449デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/22(水) 15:08:01.31ID:qJn/S+Fz0
面倒くせえ奴らだなあ。。。
//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;
}
0450デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/22(水) 15:08:31.73ID:qJn/S+Fz0
//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");
}
0451デフォルトの名無しさん (ワッチョイ ae6e-Eq1o)
垢版 |
2017/11/22(水) 15:08:55.87ID:qJn/S+Fz0
rem test.bat
cl baka.c aho.cpp /EHsc && baka

ったく世話の焼ける(ぶつぶつ
0453デフォルトの名無しさん (ワッチョイ 02ab-RuWE)
垢版 |
2017/11/22(水) 17:50:15.00ID:MV3BmYS20
初心者です、教えていただけませんか?
大文字の配列を小文字にするコードなのですが

1 int main(){
2 int i;
3 char str[]={'A','B','C'};
4
5 for(i=0;i<3;i++)
6 {
7 str[i]=str[i]+'a'-'A';
8 }
9 return 0;
10
11 printf("答え \n");
12 for(i=0;i<3;i++)
13 {
14 printf("%c\n",str[i]);
15 }
16 return 0;
17 }
を実行すると 「Info: Nothing to build for Hello」 となります。
5行目から9行目までを削除して実行すると答えは大文字で「ABC」となります
5行目から9行目の文法がおかしいと思うのですが何処がおかしいのかわかりません
誤っている個所をご指導頂けないでしょうか?よろしくお願いします。
0461デフォルトの名無しさん (ワッチョイ 879f-UVmO)
垢版 |
2017/11/23(木) 06:33:31.65ID:ZFTBiu2d0
君の言っている事がよくわからない
0462デフォルトの名無しさん (アウアウカー Sadb-AymA)
垢版 |
2017/11/23(木) 09:17:29.44ID:N/op9puJa
>>461
mmap で割り当てた物理メモリは munmap、プロセス終了時以外にも解放される契機はあるのでしょうか?

madvise の MADV_SEQUENTIAL で解放するとか書かれてますが、ソース見てみるとフラグ的にはノーマルと変わらない処理してるみたいなんですよね
0465デフォルトの名無しさん (ワッチョイ a77f-8Ex9)
垢版 |
2017/11/23(木) 10:51:34.50ID:ijGzvwTZ0
結局何を聞きたいの?
mmapで割り当てた仮想メモリが解放されるかどうかであれば、解放されない
物理メモリの話なら解放される

madviseが実際に指示通りに動くかどうかは実装次第だけど
一応LinuxとかはMADV_DONTNEEDで物理は解放できる

というか、これはC言語の話じゃないから各環境のスレで聞け
0466デフォルトの名無しさん (アウアウカー Sadb-AymA)
垢版 |
2017/11/23(木) 12:41:47.79ID:FGycjMyka
>>465
mmap 時の物理メモリ使用量とその変化を知りたかったんです。
結局非DIRTYなら物理メモリは解放されることあるんですね。
ありがとうございます

一応linuxの場合で考えてました
ホットで適当なスレが見当たらず、一番mmap使いそうなcスレでいいかと
失礼しました
0468デフォルトの名無しさん (スプッッ Sdbb-T4vC)
垢版 |
2017/11/24(金) 14:08:06.79ID:/RqU0h4Pd
コーディングの仕方的な教材になる本あるかな?
コーディングとはこうやって沿っていくと良いよ的な本
それを読んでからテクニックの本を読もうとしてる(effective)
0473デフォルトの名無しさん (JP 0H4b-9mpY)
垢版 |
2017/11/24(金) 17:56:03.88ID:37SoWLJsH
ポインタのことなんだけど、*pt と pt みたいに同じ名前で宣言したら、別々の変数になる?
0475デフォルトの名無しさん (アウアウアー Sa4f-9mpY)
垢版 |
2017/11/24(金) 18:23:00.58ID:LzLaFdMta
>>474
たしかに
家帰ったらやってみる
0478デフォルトの名無しさん (ブーイモ MMcf-V9cG)
垢版 |
2017/11/24(金) 20:43:22.73ID:yshQtEuUM
>>466
まあここでいいと思うぞ

madviseはあまり関係ない
落とされる前提でポリシー決めてるだけ
MAP_SHAREなら解放される可能性がある
MAP_LOCKEDで解放されない

他のフラグは知らん、試せ
0479デフォルトの名無しさん (ワッチョイ 078a-9mpY)
垢版 |
2017/11/24(金) 21:30:01.83ID:Mh0dfdoe0
これまた初歩的な質問なんだけど、intとdoubleとかで変数名が衝突したらどうなる?
0482デフォルトの名無しさん (ワッチョイ 078a-9mpY)
垢版 |
2017/11/24(金) 22:54:20.18ID:Mh0dfdoe0
確かにエラー出るんだけど、できないってことでいいの?
0485デフォルトの名無しさん (ワッチョイ 078a-9mpY)
垢版 |
2017/11/25(土) 00:53:38.80ID:JCp8dCym0
サンガツ
0488デフォルトの名無しさん (ワッチョイ 0793-C/lT)
垢版 |
2017/11/25(土) 08:28:27.42ID:InRb1JFJ0
変数名が型ごとに独立した名前空間に属する、という言語があるのかな。
原理的には可能だと思うけど、えらく組みにくそうな気がする。
「型だけが異なる同名の変数を使わない」みたいなコーディング規約を強制されそう。
0496デフォルトの名無しさん (ワッチョイ 879f-UVmO)
垢版 |
2017/11/25(土) 17:02:06.40ID:DmTU06Rg0
>>488
perlは$aと@aと%aが違うけどな。型と言うよりはスカラか配列かハッシュかの違いだな。
0499デフォルトの名無しさん (ワッチョイ bfe7-enc/)
垢版 |
2017/11/25(土) 17:24:25.43ID:6ctJHfBp0
処理重視なら毎回毎回変数宣言って処理が鈍くなるよな?
0506デフォルトの名無しさん (ワッチョイ 879f-UVmO)
垢版 |
2017/11/25(土) 20:41:30.63ID:DmTU06Rg0
>>499
宣言だけ?メモリ確保とかは自分でやらずに?
だったら最初に確保する一回分だけの時間しか掛からないと思うぞ。
0507デフォルトの名無しさん (ワッチョイ 879f-lrN+)
垢版 |
2017/11/25(土) 20:51:32.38ID:L+SRk42p0
あ、C++みたいな言語でクラスの中でメモリ確保してデストラクタで解放やってるような場合は
ループするブロックの中で宣言したら最低でもメモリ確保と解放でループの回数分時間
掛かっちゃうだろうけど、C言語にはそういうのはないので掛からない。
0508デフォルトの名無しさん (スッップ Sd7f-Xp/k)
垢版 |
2017/11/25(土) 20:59:06.21ID:XP2bT693d
動的に確保というのはあるだろうが、
俺を意識した使い方するだろうし
0509デフォルトの名無しさん (ワッチョイ bf8a-S11E)
垢版 |
2017/11/25(土) 21:27:39.55ID:FWelsGSm0
VLAはスコープの出入りで伸縮だと思うが
0511デフォルトの名無しさん (ワッチョイ bfe7-enc/)
垢版 |
2017/11/26(日) 16:09:01.86ID:EJqMiwXm0
>>506
for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった
なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた
0513デフォルトの名無しさん (ワッチョイ 5fb3-CDhT)
垢版 |
2017/11/26(日) 16:15:46.29ID:pGcZHtwF0
>>511
> for文とかの中で宣言してやったりすると毎回確保するから処理の速度が遅くなるってどっかで書いてあった
よほどショボいコンパイラでない限り気にする必要はない

> なるべく何回も宣言しないで中身を変える処理をする方が処理がはやくなるとか言ってた
そう言うアホな本は窓から捨てるべき
0514デフォルトの名無しさん (ワッチョイ bfe7-enc/)
垢版 |
2017/11/26(日) 16:46:48.52ID:EJqMiwXm0
>>513
それは中の処理が大量になっても大丈夫なのか?
20行、30行ぐらい長い処理でも?
0515デフォルトの名無しさん (ワッチョイ 07b3-3T+V)
垢版 |
2017/11/26(日) 16:52:44.80ID:14BIGute0
宣言と長い処理って何処に関連が?

初期化の右辺がすんげー長いというのは
変数宣言がループの中にあろうが変数宣言をループの外に追い出しても
同じで必須コストだしそこは論点じゃないよね
0518デフォルトの名無しさん (ワッチョイ bfe7-enc/)
垢版 |
2017/11/26(日) 17:20:34.69ID:EJqMiwXm0
なるほどなるほど、アルゴリズムの問題か納得した
0521デフォルトの名無しさん (ワッチョイ 879f-lrN+)
垢版 |
2017/11/26(日) 17:57:37.44ID:YtJM5Nau0
>>516
「実際のところ」と書いてある所をよく読むべき。
0523デフォルトの名無しさん (ブーイモ MMeb-V9cG)
垢版 |
2017/11/27(月) 07:40:08.21ID:fAclYYwOM
>>522
valgrind か LeakSanitizer
0526デフォルトの名無しさん (スップ Sd7f-T4vC)
垢版 |
2017/11/27(月) 19:33:17.36ID:vYl0vGfCd
>>523
>>524
ありがとう調べてみる
別件なのだけど、systemの子プロセス戻り値をみるときって

ret=system(コマンド)
if(wifexisted(ret))
{
wexitstatus(ret)
}

これだけで良い?エラー処理ってほかにいるかね?
wifsignaledとかwtermsigとかいるのかね?ってなってるんだ
その他のマクロについても....
0527デフォルトの名無しさん (アウアウカー Sadb-i88m)
垢版 |
2017/11/27(月) 20:30:19.45ID:clAY2uWxa
>>526
systemって-1返す事なかったっけ?
0528デフォルトの名無しさん (アウアウカー Sadb-i88m)
垢版 |
2017/11/27(月) 20:31:48.14ID:clAY2uWxa
>>526
てか、>>443見てみな。
0530デフォルトの名無しさん (ブーイモ MM7f-V9cG)
垢版 |
2017/11/27(月) 22:55:20.44ID:epITd0LcM
>>529
メモリマップとかは見てると分かった気になれるし、仕事してる感も出るからおすすめ
0531デフォルトの名無しさん (スプッッ Sdff-T4vC)
垢版 |
2017/11/27(月) 23:00:48.16ID:jJU6vIIdd
>>528
うおおおおお
たしかにあった

>>527
-1は素で忘れてた
>>443見てみたけど最後if elseで終わってるからその後がどうなんの?って気になる
if elseってことは他もあるじゃん?ってなるのだがいかんせんman理解できない...
0532デフォルトの名無しさん (ワッチョイ 879f-lrN+)
垢版 |
2017/11/28(火) 01:05:27.23ID:uD/TV9F60
>>531
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/wait.2.html
Linux の場合大きく分けて WIFEXITED と WIFSIGNALED 以外があるのかというと今のところない。
しかし将来的に増えないとも限らないので念のため if で分岐させておいた方が良いと思う。
0533デフォルトの名無しさん (ワッチョイ 07b3-zoBB)
垢版 |
2017/11/28(火) 01:45:58.95ID://UzmZat0
https://i.imgur.com/NECNUPM.jpg
この問題なんだけど、下の書き方以外に賢い方法ある?
このやり方はごり押し過ぎてさすがに違うと思うんだけど
http://codepad.org/pUUVFFJA
0534デフォルトの名無しさん (ブーイモ MM7f-V9cG)
垢版 |
2017/11/28(火) 03:16:49.45ID:Ol4PUSI5M
>>533
3点ほど

配列使う必要ある?保持したいのは最大値だけなんだよね?入力ループ内で最大値判定までやったら?

ローカル変数名は input_num とか分かる名前つけようか

main の戻り値
0535デフォルトの名無しさん (ワッチョイ 0793-C/lT)
垢版 |
2017/11/28(火) 07:53:02.37ID:tl7kMs1v0
C99以降だっけ?
省略された int main() の返り値として自動的に return 0; が補われる、
という仕様があるはずだけど、それに積極的に依存するよりも
return 0; と1行書く方が良い習慣だわね。
0538デフォルトの名無しさん (ワッチョイ 879f-lrN+)
垢版 |
2017/11/29(水) 02:06:01.37ID:1lf2VR3q0
>>536
試してみればわかると思うけど system() で動かされた子プロセスは SIGSTOP 受け取っても
停止するだけで親プロセスには帰らないよ。system() 内でやってる waitpid() は WUNTRACED
や WCONTINUED オプション使ってないってことだと思う。なので STOP や CONT に関係する
WIF... はやる必要がない。
0542デフォルトの名無しさん (スプッッ Sdff-T4vC)
垢版 |
2017/11/29(水) 16:25:56.35ID:llo+D0tpd
>>538
ありがとうありがとう
そうすることにする


stat関数でのファイル存在確認って破損していたファイルだとエラー返ってくる?
仕様を調べていたけどそのような記載がなかった
0543デフォルトの名無しさん (ワッチョイ bf8a-LwI/)
垢版 |
2017/11/29(水) 17:24:28.37ID:FWpFj9nP0
>>541
ポインタのコピーだとコピー元の配列(str1[],str2[],str3[])の中身を変更するとコピー先(*strh[0]〜*strh[2])の内容まで変わる
値のコピー(strcpy()など)だとコピー元の配列の中身が変わってもコピー先の配列(strh[0][]〜strh[2][])の内容は変化しない
配列とポインタでは挙動が違う
0545デフォルトの名無しさん (ガックシ 068f-forR)
垢版 |
2017/11/29(水) 17:49:08.23ID:Ypog5BGe6
配列変数はただのポインタ変数じゃないってマジ?
arr==&arrになるんやが。
arrがポインタなら&arrはポインタのポインタだからこれはおかしい。
0549デフォルトの名無しさん (アウアウカー Sadb-i88m)
垢版 |
2017/11/29(水) 18:51:10.65ID:DGImDAX5a
また一人C言語の罠に掛かったようだ・・・
0550デフォルトの名無しさん (アウアウカー Sadb-i88m)
垢版 |
2017/11/29(水) 18:57:26.48ID:DGImDAX5a
>>545
ポインタの変数はポインタを入れとくための変数だ。
配列変数はポインタを入れとく変数ではなく、単に配列の先頭を表すラベルでしかない。
0552デフォルトの名無しさん (ワッチョイ 0793-C/lT)
垢版 |
2017/11/29(水) 19:11:32.94ID:vgi7NPsq0
>>545
int arr[10]; みたいに配列を定義して
if (arr == &arr) {...} てな具合に比較する話かな。

配列名 arr は &arr[0] (先頭の要素へのポインタ)
配列名に&演算子を作用させた &arr は配列全体(10要素の配列)へのポインタ
…と解釈される、とANSIで決まった、と望洋さんの本に載ってる。
『秘伝C言語問答 ポインタ編』p.25 Column1-2 「配列名に&をつけると……」


>>548
型が違うのは間違いないけど、値が一致しない場合ってあるのかな?
それとも型の異なるポインタ同士での値の比較って未定義動作なんだっけ?
0553デフォルトの名無しさん (ワッチョイ 0775-forR)
垢版 |
2017/11/29(水) 19:31:59.94ID:bodUKsOx0
>配列名 arr は &arr[0] (先頭の要素へのポインタ)
>配列名に&演算子を作用させた &arr は配列全体(10要素の配列)へのポインタ
>…と解釈される、とANSIで決まった、と望洋さんの本に載ってる。

なるほどな
0554デフォルトの名無しさん (ワッチョイ a77f-8Ex9)
垢版 |
2017/11/29(水) 19:54:00.64ID:Xa+98JY60
>>552
>6.5.9 等価演算子
>(中略)
>制約??次のいずれかの条件を満たさなければならない。
>(中略)
>-両オペランドとも適合する型の修飾版又は非修飾版へのポインタである。

「〜型」と「〜型の配列型」は適合しないから、ポインタの比較は未定義
0555デフォルトの名無しさん (ワッチョイ 7f80-xsLR)
垢版 |
2017/11/29(水) 20:09:41.35ID:/RfTzpPk0
>>552
型が異なったら、比較できない

例えば、アドレス100番地から10バイトと、
アドレス100番地から20バイトでは、全然違う

仮に、同じバイト数だとしても、中身・内容が異なるし、比較する事に意味がない
0556デフォルトの名無しさん (ワッチョイ 5ff9-uRPb)
垢版 |
2017/11/29(水) 22:15:27.21ID:QTG/JUE+0
>>542
ファイルの破損というのがファイルの中身の論理レベルの話なら正常なファイルとみなされるはずだし、ファイルシステムレベルの破損やメディアの物理的破損なら実装依存じゃないかな。
0557デフォルトの名無しさん (ワッチョイ 5ff9-uRPb)
垢版 |
2017/11/29(水) 22:18:50.37ID:QTG/JUE+0
>>555
いま話題にしているのはarrと&arr[0]の比較であって、これらはどちらも比較演算子のオペランドとしてはint*型として評価されて型も値も一致すると思ってたけど、どうだろう。
0560デフォルトの名無しさん (ワッチョイ 3d93-kA4S)
垢版 |
2017/11/30(木) 06:56:06.98ID:VGvsvH1F0
>>557-558
int arr[10]; と定義されてる場合、
arr の型は int*
&arr の型は int (*)[10]
つまり arr と &arr は型が違う
というのが >>552 の「&arr は配列全体へのポインタ」の意味。

「引数として『10個のintを要素とする配列』のみを受け入れる関数」
(要素数が違うとコンパイルエラー)みたいのを書ける。
もちろん、それが目的で存在する書式じゃないだろうけど。

それにしても &arr の型の書き方は分かりにくいな。
理屈は多次元配列を仮引数にとる関数プロトタイプと同じ、
だと思うんだが。
0562デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/11/30(木) 10:29:35.42ID:/QNJXUpA0
>>560
arrの型はint[10]だボケ
&arr[0]がint*だ

おまえさんの、その理解では&arrがint**になっちまうだろうが
0567デフォルトの名無しさん (ワッチョイ a5ea-7XMe)
垢版 |
2017/11/30(木) 10:56:17.41ID:CwUb7XwN0
代入左辺の int* に渡す右辺
関数引数の int* に渡す引数
ここに渡す際に先頭要素へのポインタを与えてるだけで

変数そのものはポインタにはなっていなくて配列のまま
0568デフォルトの名無しさん (ササクッテロル Spbd-QD6R)
垢版 |
2017/11/30(木) 11:01:32.20ID:I+JVe+Ukp
arrは要素10持つ配列の先頭アドレスを返す、サイズはint 10個分
&arr[0]は、配列要素0番目のアドレスを返す、サイズはint 1個分
先頭アドレスが欲しいだけなら型キャストして使えばいい。
代入に使うならサイズが違うから上手く行かない。
0570デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/11/30(木) 12:23:05.77ID:/QNJXUpA0
>>563
いーや違う
§6.3.2 Other operands
Except when it is the operand of the sizeof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type'' is
converted to an expression with type ‘‘pointer to type ' that points to the initial element of the array object and is not an lvalue.
あくまで配列からポインタへconvertedつまり元の型int[10]とは違う型int*への変換だ
0572デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/11/30(木) 12:58:49.70ID:7wMQk3WFa
そ、そうかあ?
0575デフォルトの名無しさん (ワッチョイ a5ea-7XMe)
垢版 |
2017/11/30(木) 15:49:01.37ID:CwUb7XwN0
入力された氏名のファイルを探す
 無い→ファイル作って 入力した生年月日を書き出すとともに変数に覚えておく
 有る→ファイルから生年月日を変数に読み込む
↑の処理で変数で覚えている生年月日から年齢を求め表示する
0579560 (ワッチョイ 3d93-kA4S)
垢版 |
2017/11/30(木) 17:54:17.29ID:VGvsvH1F0
>>562 言葉は悪いけど言う通りだね。
俺が書いたのは arr て名前が演算の対象として単独に現れたときに
自動的にポインタの値に変換される場合の値と型のことだった。

arr 自体はあくまで配列だから int[10]
この名前が関数の引数とかで使われた場合 &arr[0] と同じになる。
配列名は隙あらば「先頭要素へのポインタ」になりたがる。
こんな感じでよろしいか? (我ながらぎごちないけど)
0580デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/11/30(木) 18:07:14.42ID:rYNpG8Zla
>>577
fprintf()で一行にカンマ区切りで名前と生年月日出した方が扱いやすいのでは?

で、処理の順序としてはこうだ。

1. 名前入力。

2. 入力された名前がファイルの中にあったら一緒に入っている生年月日を出して終了。

3. 生年月日入力。

4. 名前と生年月日をファイルに追加。

5. 終了。

ファイルアクセスは2では読み出ししかせず開きっぱなしにしないでクローズする。
4では追加書き込みだけしてクローズだ。
0583デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/11/30(木) 21:02:57.60ID:/QNJXUpA0
>>579
演算の対象ではなく、特定の演算子の対象な
どの演算子で&arr[0]に変換されるのか、
列挙できる知識が必要ということだ
0584デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/11/30(木) 21:56:39.93ID:xcZwpJOTa
XMLで

なんていうと余計にややこしくなって大変な事になるなw
0586デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 06:29:54.45ID:jGNBP26P0
>>585
Cの演算子は「特定の演算子」の集合で、
そこから、ある特定の演算子を除いた残りもまた
特定の演算子だろうがよ
0590デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 09:50:32.00ID:jGNBP26P0
>>587
宣言? おまえさん、int arr[10];がint *arr;に変換されるとでも思っているのか?
仮引数にint arr[10]と書くとint arr[]に読み替えられたりはするが、
そのことを言っているのなら>>562で指摘したとおりになるな
ただし>>560にはセミコロンが付いていてそういう逃げ道は封鎖されているわけだが
0593デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 11:08:59.34ID:jGNBP26P0
>>589
初期化宣言子 init-declarator
0594デフォルトの名無しさん (ワッチョイ b6eb-1noQ)
垢版 |
2017/12/01(金) 12:08:20.94ID:IMGPh1jC0
>>593
なるほど、情報サンクスです。
C++だと、同じものが代入演算子と称されていて。コンストラクタ内で代入演算子をオーバーロードすべし、
のような言い方をよく見かけますので。Cでも同じ呼び方をするのかと思ってました。
0597デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 13:24:35.76ID:jGNBP26P0
>>595
s/"宣言子"か//
0599デフォルトの名無しさん (スップ Sd0a-ygIL)
垢版 |
2017/12/01(金) 15:44:26.68ID:0Iysip4/d
プログラミング初心者です
車のタコメーターをフルカラーのディスプレイを使って作りたいのですが、どうすれば良いのかが全く分かりません
C言語は計算機内で式の答えを演算する程度なら使えますが、ハードを制御したりはできないです(Arduinoなら少し弄りました)
C言語で作れるのかも分からないので、簡単なところから教えてください
エンジン回転数のパルス信号は取れてます
0601デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 15:56:55.06ID:jGNBP26P0
Ardudinoを弄ったことがあってハード制御ができない?
パルス信号を取れるっていうのは、オシロスコープか何かで確認できたってことか?

・・・もしかして、こういうことか?
その信号をプログラムで読み取るには、どこの端子に繋ぐのかとか、
信号のレベルの合わせ方とか、そういうことがわからんのか?
0606デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/01(金) 16:56:05.30ID:y5AhnBkya
>>603
ターゲットのマシンは?
Windows? Linux?

ていうか、C言語でやると何で動かすにしても大変面倒だと思うので何か他の言語使った方が良いと思う。
0609デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 17:09:00.66ID:jGNBP26P0
ディスプレイのつなぎ方がわからんのか?
つないであるディスプレイへのコマンドの送り方がわからんのか?
0610デフォルトの名無しさん (ワッチョイ 3d93-kA4S)
垢版 |
2017/12/01(金) 17:42:29.56ID:jA0BeSqZ0
>>599
PCのウィンドウ環境上でウィンドウを開いてグラフィック表示って問題なら、
環境次第でここでも分かると思うけど…。

部品としての液晶やLEDのパネルのハードウェア制御ってことになると、
まずはどの部品を使うのか、って話になるな。
0613デフォルトの名無しさん (ブーイモ MM81-kYsf)
垢版 |
2017/12/01(金) 18:35:32.61ID:6HJgPekDM
消費電力、サイズ制限、予算諸々考えてどの程度のハードが用意出来るかって所から

linuxやwinが動くようなリッチな環境が用意出来るなら
GUI部はCじゃなくても良くねってのが正直な感想
0616デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/01(金) 19:38:44.88ID:quTLstwT0
>>608
> ターゲットがよく分からないのですが、コードはUNIX系のOSのemacsで書いてます
根本的に分かってないようだが、「ターゲット」ってのはお前が決めるんだよ。
そして既にコードを書いていて、そこにLCDを接続したいだけなら、その環境を言えよ。
0618デフォルトの名無しさん (ワッチョイ 697f-GQwd)
垢版 |
2017/12/01(金) 20:27:16.42ID:NXDNhmZv0
>>615
初期化子なしは、不定値で初期化するって意味だと納得することにしてるわ
一応、初期化の説明に含まれてるし。。。

つーことで、>>586とかには演算子のオペランドでないこともあるって理解してもらえたかな
良かった良かった
0619デフォルトの名無しさん (ワッチョイ 9e9e-GQwd)
垢版 |
2017/12/01(金) 20:54:03.81ID:HgVhW4BC0
>>603
>信号→マイコン→処理
>は分かります
で、信号は取れたとか言ってるんだから対象の物理的扱いはわかっているんだろ。
それをどんなマイコンにどう繋ぐかだ。出来合いのマイコン基板を買ってきて
それに繋げるのか、基板から自作するのか
0620デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 21:25:55.70ID:jGNBP26P0
>>618
586だが、だから何だ?
演算子に限らずとも、Cは明確に列挙された機能の集合だ
そこから特定の演算子を除いた残りは、
おまえが言うような曖昧な集合ではない
0621デフォルトの名無しさん (ワッチョイ 5db3-7XMe)
垢版 |
2017/12/01(金) 21:37:37.37ID:kbDZQVhk0
>>583 へのカウンターじゃないの?
583では 変換が走るのは 特定の演算子の対象 としてるけど

初期化においても変換が走ってる
この記述中では演算子はなくて、該当変数は演算子のオペランドになっていない って
0622デフォルトの名無しさん (ワッチョイ 697f-GQwd)
垢版 |
2017/12/01(金) 21:39:28.94ID:NXDNhmZv0
>>620
ん?
配列型を持つ左辺値は特定のケースを除いてポインタ型に変換されるという
規格に明記してある話を理解してもらえればそれで十分だよ?

初期化子には演算子が含まれないこともあるって理解できたんだよね
なら、それで良いよ
0623デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 21:43:38.60ID:jGNBP26P0
>>621 >>622
>>560からの流れ読んでね
やつはint arr[10];と定義されたオブジェクトに対する
arrというアクセスがint*だと言っているんだ
おまえら2人とも変換と言っているよな
変換てそもそも何だ?
0626デフォルトの名無しさん (ワッチョイ 697f-GQwd)
垢版 |
2017/12/01(金) 22:05:59.37ID:NXDNhmZv0
もしかしてarr自体がint*型を持つというアホな解釈を擁護してるとでも思われてたの?
それは>>560自身も、>>579で式中に現れた場合のことでしたって弁明してるでしょ

それとも
arr;
という識別子名だけの単文があったとき、arrがポインタ型に変換されないと思ってる?
左辺値なんだから、当然変換されるよ
0627デフォルトの名無しさん (ワッチョイ 5db3-7XMe)
垢版 |
2017/12/01(金) 22:11:15.92ID:kbDZQVhk0
>>625
> 配列の初期化に用いられる文字列リテラル
(その通りに動作すると期待して)普通に使ってるけど、
逆の観点の、配列のまま取り扱ってる例として挙げようとすると、見落とすわ これ
0628デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 22:19:35.93ID:jGNBP26P0
>>626
うん、そう思っている

おまえ、なぜ
arr;
がポインタ型に変換されると思っている?

なんだか残念な答えが返ってきそうな予感がするが
0629デフォルトの名無しさん (ワッチョイ 697f-GQwd)
垢版 |
2017/12/01(金) 22:49:05.07ID:NXDNhmZv0
6.3.2.1 Lvalues, arrays, and function designators
An lvalue is an expression with an object type or an incomplete type other than void

6.8.3 Expression and null statements
expression-statement: expressionopt ;

arr;は式文、arrは式(左辺値)
よって、>>570の規則に従って変換される
0630デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 22:57:47.71ID:jGNBP26P0
>>629
それはおかしいぞ
arrという部分式を評価中に、それがどんな文脈の作用対象となるかは
予見しないのがCのポリシーで、だからこそ式arrはlvalueを生じる
その後lvalueからvalue of an expressionへの変換を要請する文脈を経ずに
シーケンスポイントとなっているそのプログラム片のどこに
アドレス計算が生じうるんだよ
0631デフォルトの名無しさん (スプッッ Sd12-ygIL)
垢版 |
2017/12/01(金) 22:59:25.50ID:UqjXH8z4d
>>608です

>>616
コードをどう書けばいいかも、どれを使えば実現できるのか分からないです
コストや部品点数は抑えたいと思ってます

>>619
どういうマイコンをどうすればアニメーションでディスプレイ出力ができるのかを知りたいんです
おおまかな道筋を教えて欲しいです
ARMマイコンとかどうなんですかね…
0632デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/01(金) 23:03:12.88ID:jGNBP26P0
PIOのディレクションレジスタを出力に設定してマスクパターンを指定しておき、
それからコマンドを書き込んでストローブのパルスを作って。。。
0633デフォルトの名無しさん (ワッチョイ 697f-GQwd)
垢版 |
2017/12/01(金) 23:07:47.82ID:NXDNhmZv0
>>630
ポリシーとかじゃなくて規格の話をしてくれない?

配列型の左辺値は特定の場所以外で現れた場合に、変換されるという規格なの
演算子を伴わない場合は変換されないというのなら、その規格を明示して

左辺値ですらないというのであれば、その根拠となる規格を示して

人に説明求める割に、自分の論拠が想像ってのはどうかと思うよ
0636デフォルトの名無しさん (ワッチョイ ea33-MbHU)
垢版 |
2017/12/01(金) 23:49:36.73ID:P20tw7a40
>>633
> 配列型の左辺値は特定の場所以外で現れた場合に、変換されるという規格なの

630 じゃないけど、そっちこそ規格のどこ見て言ってるの?
N1570 6. Conversion で演算子オペランドになったときの変換は確認できるけど、
式文を含めて「現れた」だけで変換されるという記述は見つけられない。
0638デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/02(土) 00:14:21.15ID:mWFcFWTj0
>>633
質問に質問で返さないでくれない?

arr;というプログラム片のどこにアドレス計算が生じうるの?
全く無用と思える操作を強制する根拠法令を示しなさいよ

全く無用と思わない、あんたの思考回路でもいいよ
こちとら規格しか聞く耳持たないとか言わないから
つーか自分なりの思想を持っているやつと話すほうが実りがあるし
0639デフォルトの名無しさん (ワッチョイ 697f-GQwd)
垢版 |
2017/12/02(土) 00:17:19.87ID:2ymk6h8v0
>>636
>>570
an expression that has type ‘‘array of type'' is converted to an expression with type ‘‘pointer to type ' that points to the initial element of the array object and is not an lvalue.

確かに、6.3の頭には演算子オペランドの暗黙的な型変換について規定するとは書いてあるけど、
あくまでもsuch an implicit conversionであって、それだけを規定するわけではないでしょ
expressionが変換されると書いてあるんだから、式が変換されると読むのが素直じゃない?

そう解釈しないと、例えば
return arr;
とか、どういう理屈でポインタを返すと考えれば良いの?
0640デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/02(土) 00:23:30.95ID:mWFcFWTj0
>>639
おまえさんが言っているのはこういうことだ
int aho() [10]
{
int arr[10];
return arr;
}
コンパイル通るかどうかやってみな
で、どういう理屈でそうなるのか
おまえさん自身が言ってみな
0641デフォルトの名無しさん (ワッチョイ 697f-GQwd)
垢版 |
2017/12/02(土) 00:29:15.26ID:2ymk6h8v0
>>640
自分は一貫してreturn arr;でint*を返すという主張なんだけど?

あなたこそ、演算子を伴わないと変換が行われないと主張してたんだよね?
そういう解釈だと、どうやって
return arr;
でint*返せるのって質問だよ
0642デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/02(土) 00:32:10.46ID:mWFcFWTj0
>>641
演算子って言質がおまえさんの命綱のようだな
別にそんなの撤回してもこっちは痛くも痒くもない
それをもって勝利宣言したければすればいい
win-winだね
0643デフォルトの名無しさん (ワッチョイ ea33-MbHU)
垢版 |
2017/12/02(土) 00:36:49.22ID:+GJuKLXc0
>>639
return についての規定で代入と同じ変換が行われることになってる。
規格見てるんなら return について疑問に思った時点で該当箇所読んでから聞こうな。
「自分の論拠が想像」は許さない立場なんだからさ。
0644デフォルトの名無しさん (ワッチョイ 697f-GQwd)
垢版 |
2017/12/02(土) 00:45:15.02ID:2ymk6h8v0
>>643
おお、ほんとだ
ありがとう、見落としてたわ
ついでに初期化宣言子も見返したけど、単純代入と同じ型変換後の値が初期値って書いてあるな
ごめん、ごめん

規格解釈は間違ってたけど、結果は合ってたって感じかな
こういう指摘くれたら1発で済んだのに。。。
0645デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/02(土) 00:52:58.64ID:mWFcFWTj0
>>644
おまえは間違っていた
人のせいにしてんじゃねえよ
0646デフォルトの名無しさん (ワッチョイ 3dab-bpph)
垢版 |
2017/12/02(土) 15:52:09.87ID:KedYgmHp0
文系で一から使えるようになるまでにどれくらいかかりますか?
0648デフォルトの名無しさん (ワッチョイ 4af9-4cvy)
垢版 |
2017/12/02(土) 16:16:16.79ID:34/Kk+++0
>>646
文系かどうかはあまり関係ないと思う。論理的な思考が苦手でなければok。
使えるようになるのレベルに幅がありすぎるからなんとも言えない。
プログラミング初めてで、どうしてもCでなければならない理由がないなら、他の言語から入った方が実用的なことをするのには早いと思うよ。
0652デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/02(土) 18:49:23.92ID:WQRORJsZ0
>>646
数学/物理が出来なくて文系に行った口なら諦めろ。一生無理だ。
頑張ったところで、若い奴らに簡単に追い越され、一生惨めな思いをするだけだ。
他に適性のある分野を探した方がいい。

現実的には、理系/文系のどちらの知識も必要なく、抽象/論理思考が出来るかどうかが全てだ。
だから高々高校2年間程度のラベルの結果である文系/理系自体には大した意味がない。
しかし、そもそも抽象/論理思考が得意なら、当然、
不得手な奴が混ざっている環境(つまり文理分けていない状況)においては無双できる。
結果、「得意だから」≒「好きだから」という理由で文理を選んだのなら、文系を選んでる時点で向いてない。
そして大学4年間で理系の連中は周りが抽象/論理思考出来る奴らばかりという環境で鍛えられることになるから、
決定的な差がついてしまう。

そうではなく、俺は数学も得意な文系だ!というのなら行けるかもしれん。
最近は経済学部が理系化しつつあるという話だし。

いずれにしても個人差の方が大きい。学生なら、やってみて面白くなければ諦める、でいいと思うが。
面白いと思えて続かないようなら向いてない。
0653デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/02(土) 18:53:01.98ID:WQRORJsZ0
ちなみに、論理的思考は、出来る奴は最初から出来る、というか思考ベースがそっちだ。
もちろん頑張って対応することも出来るが、
最初から出来る連中がデフォの環境で頑張り続けるのは辛いと思うよ。
http://buzz-netnews.com/wp-content/uploads/2016/04/2ee1df837c0dd36abd3ad9d095c4acf8.jpg
http://buzz-netnews.com/wp-content/uploads/2016/04/teo.jpg
0656デフォルトの名無しさん (ワッチョイ 6681-JjO2)
垢版 |
2017/12/02(土) 19:17:30.71ID:PL6F8Ywp0
>>654
むしろ向いてる気がする
数学とか論理によりすぎだと変なこだわりがあったり
現実のあいまいさに適応できなかったりするから
現実的な手続きや広範な知識が必要な化学が得意だったら適正ばっちりじゃないか
0657デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/02(土) 19:33:33.78ID:WQRORJsZ0
>>654
高校生物=ほぼ暗記
高校化学=暗記7割、理論3割
高校物理=ほぼ理論
高校数学=8割理論、2割パターン暗記
(高校国語/英語/社会=ほぼ暗記)
じゃね?
だから高校化学/生物が得意だからといって、抽象/論理思考の能力は分からない。
(無いとは言わないが、得意とは判断できない)

逆に暗記が得意なら自然と文系教科で無双することになる。
この理由で文系を選んだのなら、暗記能力>抽象/論理思考能力、ということになり、向いてない。
今時のプログラミングってWebを参照しながらやるもんだし、暗記能力自体はほぼ要らなくなってる。
ただしドキュメントを大量に読むようになってきてるから、国語/英語の能力は重要になってきてるが。
とはいえ、高校英語=ほぼ単語を覚えているかどうか、であり、
現実はポップアップ辞書も使えるし、google翻訳も読めないほどでもないし、そもそも技術英語は簡単だしで、
テストでの英語の能力よりも、何を書いてあるか読み解く方が重要で、
いわゆるTOEIC等とは違う尺度だから、高校英語の点なんて全く当てにならないが。

ただまあ、学生なら、グダグダ言わずにやってみて、面白いと思えなければ向いてない、でいいと思うよ。
ただ、ド初心者なら、>>648の言うとおり、他言語の方がいいと思うが。
0658デフォルトの名無しさん (ワッチョイ f1c8-wAwf)
垢版 |
2017/12/02(土) 21:10:49.78ID:i2vG1ua/0
>>657
まあ、国語は暗記でも行けるかもだけど、読解系の問題は論理思考でいけばかなり楽できるんだぞ。
0660デフォルトの名無しさん (ワッチョイ f1c8-wAwf)
垢版 |
2017/12/02(土) 23:09:43.44ID:i2vG1ua/0
>>659
勉強しなくても、論理思考さえできれば、ほとんど正解できるってこと。
0661デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/02(土) 23:24:12.70ID:WQRORJsZ0
つかな、多分、解く過程が数学と同じなんだよ。
ただし数学自体ではないから、数学の成績自体はあまり関係ないけど、
数学めいたものが嫌いな場合には向いてない。
そして大体の場合は好き=得意科目になるから、
集団から選抜するのなら数学の試験を課すなり、面倒なら一律文系お断りってのも当たっている。
(もちろんプログラミング課題を課せるのであればそれが一番いいが)

よくある初心者向けのプログラミング課題、
・ソース○○に対して、出力△△を得たい、どうすればいいか、
に対して、実際は適切なメソッドや典型的な手法を組み合わせて対応するわけだろ。
これが、公式やお約束的解法を組み合わせて問題を解く「高校数学」と似てる。
そして実際のプログラミングなんて、
上記単発のお題が階層跨いでフラクタルになっているようなものだから、
ある意味数学パズルをずっと解き続けるようなもので、数学が嫌いだと持たんだろ。

ただし本来はその先の、
「こうすればこんなに簡単に実装できるのか」という構造を思いつける奴が「センスがある」となるわけだが、
これについては選抜の仕方(適正判断の仕方)は分からんなぁ。
ただ、いわゆる「エレガントな解法」というのが存在するのも数学だけだし、
プログラミングと数学はかなり構造が似ているのだと思うよ。
0662 ◆QZaw55cn4c (ワッチョイ 4a60-CnPo)
垢版 |
2017/12/03(日) 00:12:42.31ID:lZQcP+Ql0
>>660
論理思考、最強!みたいな勢いだけれども、
その論理思考の中身というのが常識を外れているような気がする

命題A: 「1 + 1 = 3」 ならば「2 * 3 = 6」である

とするとき、命題Aは正しいか間違っているか、また、その理由は?
0663 ◆QZaw55cn4c (ワッチョイ 4a60-CnPo)
垢版 |
2017/12/03(日) 00:14:06.99ID:lZQcP+Ql0
>>661
プログラミングは証明に似ているのには理解が及びますね。
ただ、普通の証明よりもずいぶんと細かいことに気をくばらないといけない気がします。

「型」を数学であつかっている例はありますか?
0664デフォルトの名無しさん (ブーイモ MM0a-cp23)
垢版 |
2017/12/03(日) 00:39:39.44ID:oCGWkppTM
>>646
マーチ文系の俺は現場に入るまで3週間
足引っ張らない程度になるまで3か月
無双するまで1年だったかな

3年たった今では Golomb 符号とたわむれてる
0665デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/03(日) 01:38:00.88ID:iOWX59aS0
>>663
証明問題じゃねえよ。つかおまえも数学出来なかった口だろ。

数U数Vはほぼパターン通りだけど、
数Tの難しい問題はたいがい「エレガントな解法」ってのがあって、裏技みたいに簡単に解けたりするんだよ。
それはそれこそ東大の過去問とか見てみればいい。
或いは三平方の定理とかでも何通りも証明方法があって、おおっ、てのもあったりするだろ。
(ただ、この話が通じない時点で説明しても無理なのは確定だが…)

実際のプログラミングもこれと同じで、データ構造を正しく整理すれば制御構造もものすごく単純に出来たりするんだよ。
だから数学的な「エレガントさ」を追求するのが好きじゃないと向いてない。(というか上達しない)
そして「型」なんてのはノートに引いてある罫線みたいなもので、プログラミングの本質とは全く関係ない。
ただし型自体は圏論だっけ?Haskellの連中がやってたはずだけど。詳しくは知らんが。
0666デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/03(日) 01:39:55.00ID:iOWX59aS0
で、QZ、君は色々文句言われてたりしてるのを見たことがあるが、俺自身は知らんからそれはどうでもいい。
ただC++のスレで「色々忘れてしまうんで…」とか言い訳してたろ。
(別段それについて責めるわけではないが)それは覚え方が悪いんだよ。
例えば高校の物理、
・ma=Fとsin/cosだけ覚えて後は組み合わせるだけだが、 // (A)
・「垂直にぶら下げたケース」「斜面においたケース」「バネがくっついたケース」とか、// (B)
別々に覚えたがる奴はいるんだよ。それで、(A)が抽象思考(分類)できる奴、(B)が出来ない奴、となるんだよ。
そして、プログラミングで必要なのは(A)で、(B)は死ね、でしかないんだよ。
で、多分君は(B)派なんだよ。だから「忘れる」とかいうことになる。
(A)だったら忘れるも何もない。どの言語でも同じものを使っていて、
それを「ひらがな」「カタカナ」「英語」のどれで書くか、でしかないから。
0667デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/03(日) 01:40:39.01ID:iOWX59aS0
ただ自分が(A)なのか(B)なのかは簡単に分かるとして、(高校の物理に最初からついて行ければA、無理ならB)
これは思考の癖だから、簡単には直せないんだよ。だから向き不向きはかなりある。
単純に言えば、脳内のCPU/ストレージのコストによる。
いちいち圧縮/展開してでもストレージをケチりたい=CPUの速さに対して記憶が得意ではない場合は(A)、
いちいち展開するくらいならベタでストレージした方が楽=CPUのコストに対して記憶コストが安い場合は(B)になる。
そしてこれは無意識領域で作用するから、簡単には変えられない。
(A)の連中は最初から抽象思考する、というより抽象思考ベースだから、プログラミングにはフィットするけど、
例えば高校の歴史、「○○年に何がありました」という単発事象を別々に暗記するのには全く向かない。
逆に(B)の連中にはこれが向いているが、抽象思考するためにはいちいち「意識的に」圧縮/展開する必要があり、
ネイティブ(A)の連中にプログラミングでは太刀打ちできない。
それでも(B)の連中が得意な「記憶」でプログラミングに対処しようとした結果が「デザインパターン」だ。
だから(B)の連中はデザインパターンにすがるし、新しいパターンをどんどん登録しようとする。それが上達への道だから。
(A)の連中は最初から「デザインパターン?何それ?おいしいの?」だし、「名前つけただけだろ」程度でしかないんだよ。
で、QZ、君はデザインパターンにすがってるタイプだとC++スレで言ってたろ。
ここでも(B)だと分かるんだよ。

で、俺は、(B)の連中はわざわざプログラミングする意味無いと思ってるんだよね。向いてないから。
多分、その記憶コストの安さを生かした、何か別のことをすべきだよ。
パターン暗記で対応することも出来るけど、それだとコピペプログラマ程度にしかどうせなれないし。
0668デフォルトの名無しさん (ワッチョイ 5d71-kbEZ)
垢版 |
2017/12/03(日) 01:45:09.46ID:jbLAlLAh0
Haskellは非常にエレガントだからな
プログラマーたるもの一度はCとHaskellに触れるべきだ
願わくばHaskellのエレガントさとCの自由さを合わせ持つ神話的な言語が生まれて欲しいものよ
0669648 (ワッチョイ 3dab-bpph)
垢版 |
2017/12/03(日) 02:20:16.93ID:WgKYUm0V0
回答ありがとうございます

プログラマになりたいのは、単純に稼ぎたいからです
んで色んな言語の基礎というか素地になってるのがCみたいだから
まずはCをと、今いろいろ入門書を読んでるところです
難しいけど楽しくて仕方ない感じなのですが
大学は駅弁経済(だいたいmarchクラス)で数学無しで入ったので
今更ながら後悔してます(高校で挫折したクチ)
ココ見てるとやっぱりこの世界はすごく論理とセンスがモノを言うんだな、と
ちょっとビビってます
Cより楽な言語に移ろうかとも思案中ですが、
もう少し基礎を固めてからにしようと思ってます
また覗きに来ますねw
0671デフォルトの名無しさん (ブーイモ MM81-cp23)
垢版 |
2017/12/03(日) 10:07:03.35ID:hFnkXtgpM
>>669
ソフトウェアで稼ぎたいならcはないかな
javascript と python を頑張った方が良いかと
0673デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/03(日) 10:48:11.97ID:iOWX59aS0
>>669
> 難しいけど楽しくて仕方ない感じなのですが
これなら当面は問題ない。駅弁なら時頭も問題ないだろう。

> ココ見てるとやっぱりこの世界はすごく論理とセンスがモノを言うんだな、と
残念ながらそうでもない。
というか、(どの仕事でも同じだが)結局、仕事の9割以上は「与えられた分担をきっちりこなすこと」であって、
それは「パターン暗記」でほぼ何とかなってしまう。ここが逆に不幸なところで、
彼らもまた「仕事が出来る」うちに入ってしまい、彼ら流、つまり「パターン暗記」流を推奨してきたりする。
(C++のスレでだいぶ言ったが、俺はJavaはもうそっちに行っちまって戻れないと見ているから、Javaは俺は勧めない)
逆に、仮にセンスがあったとしても、仕事の1割以下でしかそれを発揮する機会がなく、埋没してしまう。

ここら辺を突破しようとしたのがGoogleの20%ルールだったわけだ。
> Googleにおいて、従業員は「勤務時間の20%を他のプロジェクトに費やしても良い」のではない。
> 「費やさなければならない」のだ。これは人事評価の対象にもなり、
> 従業員はその20%の時間を使って「本業以外の何か」を生み出すことを期待されている。
> https://innova-jp.com/google-20-rule/
「パターン暗記」では未来には対応できない。センスがない奴は、何をやっていいかすら分からない。
とはいえ、実際はこれを隠れ蓑に遊ぶ連中も多くて、って話だったが。
(少なくとも「パターン暗記」するタイプのまじめ人間からはそう見えた)
実際にそれが無駄だったかどうかは分からん。
https://www.countand1.com/2016/07/google-20-percent-time-implication-for-making-failure-be-good-learning.html
結局世の中OSSに完全にシフトしつつあるのも、
OSS側でセンスがある連中がつるんで好き勝手やるのにプロプライエタリでは全く太刀打ちできないからであってね。

ただし、公務員的にITで働きたいのならJavaだろう。向こう20年仕事はあるだろうし、あまり変化もない。
それ以前に、稼ぎたいのなら金融、ってのは当たっているが。
(なお金融関係のプログラマならPythonと聞いているが、多分これは日本国内の話ではない、
というか、日本国内に「金融関係のプログラマ」がそもそも居ないと思う)
0675デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/03(日) 11:10:41.68ID:iOWX59aS0
>>674
いや、俺が言っているのはそっちじゃない。

インフラは COBOL -> Java の移行中だ。君はこの意味で言っている。
俺が言っているのは以下で、
https://jp.stanby.com/media/programming_ranking2017/
Pythonの右端の連中は金融関係だ、と聞いている。
具体的には、デリバティブとかアービトラージとか、そっち系。

Cはお察し、として、Javaの右端の連中は何だろう?
0676 ◆QZaw55cn4c (ワッチョイ 4a60-CnPo)
垢版 |
2017/12/03(日) 13:10:56.56ID:lZQcP+Ql0
>>665
>証明問題じゃねえよ。つかおまえも数学出来なかった口だろ。

数学の本道は証明問題にあるとおもっていますが
数学の本をみればわかりますが、定義、命題、証明をひたむきにくりかえしていますよ。
https://ja.wikisource.org/wiki/%E5%88%9D%E7%AD%89%E6%95%B4%E6%95%B0%E8%AB%96%E8%AC%9B%E7%BE%A9

>>655
>三平方の定理とかでも何通りも証明方法があって、おおっ、てのもあったりするだろ。
でしょう、証明問題こそプログラミングに似ていると思っています。

>「色々忘れてしまうんで…」
そして、証明をいちいち覚えるんじゃない、その都度再構成できるように努めています。
といって、数学の本はときどき「証明は読者にまかせる」とくるのですが、それはちょっと困ります
0677デフォルトの名無しさん (ワッチョイ f1c8-wAwf)
垢版 |
2017/12/03(日) 17:34:04.07ID:TNI+LIU50
>>662
それ、問題がおかしいよね?
0679デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/03(日) 18:31:45.86ID:Gq7SJlPXa
>>662
"1"という数字は数値に直すと1.5であり、その他の数字は通常と同じであるとする。

という一文が手前に挿入されるとその後の計算は正しくなる。
0680デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/03(日) 18:36:17.94ID:iOWX59aS0
>>676
君が「証明問題」に限定しようとしているのはなぜだ?
証明問題以外でも、俺はプログラミングと数学は雰囲気やノリが酷似していると思うが。

>>669
あと、職業として選ぶのなら、当たり前だが、君に特に抜きん出た才能がなければ、
・君が半年で出来るようになったことは、普通の新人も半年で出来るようになること
・君が半年かかったことも、センスのある新人なら1-3ヶ月で習熟してしまう可能性もあること
を考えておかないといけない。
威張り散らす必要はないけど、あの人イマイチだよねって言われ続けるのも辛いでしょ。
適性がないところを職業にするのは悲惨だと思うぞ。自分の適性はよく見極めた方がいい。
逆に、君にセンスがあり、
・普通の人なら半年かかるところを3ヶ月で会得
なら、やっているうちにどんどん差が勝手についてしまうわけでね。
0681 ◆QZaw55cn4c (ワッチョイ 4a60-CnPo)
垢版 |
2017/12/03(日) 18:46:19.12ID:lZQcP+Ql0
>>680
まあ数学とプログラムとでは、双方に互いに似たような思考方法を行う、という意味では大枠同意します
特に「証明」に拘っているわけではないのですが、拘ってしまいました…忘れてください…
0682デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/03(日) 19:04:33.85ID:Gq7SJlPXa
てか、プログラミングは数学の範疇に入らないか?
計算機に実行させる計算手順書だし。
0685デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/03(日) 19:37:50.46ID:iOWX59aS0
>>682
個人的にはComputer=計算機ってのはかなり違和感があるんだよね。
プログラミングって、むしろシーケンサだろ。(処理手続きをひたすら記述する)

数学に似てるのは、結局、チューリングマシンからきてるのだと思う。
もちろん「このプログラミング言語はチューリング完全です」なんてやってるのは数学者であって。

これとは逆に、ニューラルネットワークなんて、正直、まともに証明すらされてないだろ。
なんだか分からないけどうまくいきます、程度であって、
ニューラルネットワークがチューリング完全なのかどうか、誰も証明して無いと思うし、(俺の知る限り)
それ以前に、プログラミングなんて出来る状態じゃない。
今も機械学習で係数を探している程度、つまりトライアンドエラーしか出来ていないわけであってさ。

だから、将来的にニューラルネットワーク等、チューリングマシン以外をプログラミングできるようになれば、
数学じゃないプログラミング手法が見つかる可能性はあると思う。
実際、機械学習自体は物理/数学の教え方(理論を教えてそれを適用)ではなく、
語学の教え方(習うより慣れろで、ひたすら知識(結果)を積み上げる)に近いし。
0690デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/03(日) 19:59:37.86ID:Gq7SJlPXa
>>683
あー。楽譜ね。そうだね。
0694デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
垢版 |
2017/12/04(月) 01:19:52.82ID:WOZLf3PZ0
>>692
それはCに階層記述能力が欠けているからだ。

例えばNode(JavaScript)のコーディングルールでは、関数は15行以下にしろとなっている。
> Write small functions
> Keep your functions short. A good function fits on a slide that the people in the last row of a big room can comfortably read.
> So don't count on them having perfect vision and limit yourself to ~15 lines of code per function.
> https://github.com/felixge/node-style-guide#functions-1
やれば分かるが、15行で書く為には、中位記述と下位記述を明確に分け、下位記述は全て関数で括り出すことになる。
このとき、中位記述の関数はベタに手続きだけひたすら書くことになる。
俺も最初は戸惑ったが、実際、この方が読みやすいし、自己ドキュメント化する。

ただしCだとこれはちと辛い。
JavaScriptだとそもそも下位記述がほぼ無く、大体何かしらのメソッドを呼んで終わるし、
階層を自由に作成できるし、プロトタイプ宣言も必要ないし、デフォでクロージャだから外変数を自由に掴める。(引数にする必要がない)
Cだと関数内関数が出来ないし、プロトタイプ宣言も必要だし、全部引数で渡さないといけないし、
GCも無いから宣言スタイルでも書きにくい。また、関数呼び出しも無駄ならケチる文化もある。

最大15行なら、実際は5-10行の関数が氾濫することになるのだが、Cでこれをやるとよけいに読みにくくなる。
だから、Cでは珍しいだろうけど、JavaScript等手抜き系スクリプト言語だったら割と普通だったりするはずだよ。
0695デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/04(月) 05:34:47.44ID:k2OIwnad0
ただ単にCが嫌いなだけだね
0696デフォルトの名無しさん (ワッチョイ 6d81-JjO2)
垢版 |
2017/12/04(月) 06:16:54.02ID:+uAdunIC0
Cはクラスがないせいで戻り値が使い物にならん
中でMallocして返すとすぐメモリリークする

文字列や配列を扱う関数は
第一引数と第二引数に結果格納用の配列と最大長を渡すというまだるっこしい作業をせんといかん
Cで言語を学ぶと悪いコーディングの癖がついてしまう
0699デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/04(月) 19:55:28.93ID:vegQ3dVaa
馬鹿っぽさ満載
0701デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/04(月) 20:15:20.01ID:vegQ3dVaa
構造体へのポインタでも使ってくれ
0702 ◆QZaw55cn4c (ワッチョイ 4a60-L6cJ)
垢版 |
2017/12/04(月) 20:20:54.93ID:ESsPBxjD0
>>696
それがいい習慣というものです、配列(の先頭)と文字列長をセットで扱うのは基本中の基本です
win32api をみればわかりますが、一度目には自分が用意しなければならない領域の大きさについてお伺いをたててから、
二度目にやっと目的の情報を手に入れる、これは C ではセットですね

c++ で文字列型のような便利なアイテムを使っていたために、だんだん馬鹿になってきていたことに、最近ようやく気がつきました:−)
0705デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/04(月) 20:43:45.92ID:vegQ3dVaa
>>703
snprintf
0710デフォルトの名無しさん (ワッチョイ 967f-HOnN)
垢版 |
2017/12/04(月) 22:32:25.86ID:TOOi+5oW0
>>708
普通は、とりあえずやってみて戻り値判定したあと切り捨てられていたら大きめのバッファにreallocしてつかうんじゃないかな。
確保するメモリサイズは一定の方がいいと思うんだ。

まぁ、Cなら大抵の場合、サイズオーバーでエラー処理へとばす気もするけれど。。。。
0711デフォルトの名無しさん (ワッチョイ 6d9f-HgL3)
垢版 |
2017/12/04(月) 22:35:03.23ID:iGjrIGoV0
asprintf() も良いよね。
GNUの拡張だけど。
0712デフォルトの名無しさん (ブーイモ MM8e-cp23)
垢版 |
2017/12/05(火) 00:24:41.12ID:64NxbaBtM
a55h01e()もいいぞ
拡張するとアレだけど
0713デフォルトの名無しさん (ワッチョイ 1e8a-mhkU)
垢版 |
2017/12/05(火) 01:57:36.13ID:hFLcfi/C0
>>694
頭悪そう
分割数に依存してO(n**2)で命名の手間が増える
O(n**2)は行かないかもしれないがO(n)よりは大
0714デフォルトの名無しさん (ワッチョイ 3d93-kA4S)
垢版 |
2017/12/05(火) 06:27:11.01ID:h9iE2Dgl0
>>708-709
manの「準拠」のところで、snprintf()の第2引数sizeに0を指定できる、
返り値を必要なバッファサイズを決めるのに使えると明記されてるね。
これは有難い。

>>712
エリートな人だなぁ。俺にはよく分からんけど…
男は度胸! 何でもためしてみる、か。
0715デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/05(火) 09:17:09.05ID:lXQHSkZJa
>>712のやつは多分中々みつからないと思うぞ。>>712のPCのディスクの中か心の中にしかないんじゃないか?w
0716デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/05(火) 10:03:46.62ID:5svgdXUG0
asshole
0719デフォルトの名無しさん (ワッチョイ 3d93-kA4S)
垢版 |
2017/12/05(火) 19:06:50.63ID:h9iE2Dgl0
-able は「〜することができる」という意味を加える接尾語と解釈できるから
azn と略せる何か動詞っぽい操作を思いつけば char aznable; を
「合法的に」使うことができるね。

単なるフラグなら int なり bool なりを使え、と言われると弱いけど。
0721デフォルトの名無しさん (ワッチョイ 1e8a-mhkU)
垢版 |
2017/12/05(火) 22:18:54.85ID:hFLcfi/C0
15行の関数量産したらfunc1, func2, ...となるのが目に見えている

途中の欠番で変更履歴の推測も可能
素晴らしいドキュメントだな
0723デフォルトの名無しさん (ワッチョイ b5b3-9GJZ)
垢版 |
2017/12/05(火) 22:46:50.50ID:oTa/T8dQ0
ファンクなあ。
アシッドテイストを入れてもう少しオサレな感じにすれば爆発的にヒットするだろうになあ。
0734デフォルトの名無しさん (アウアウカー Sa55-m9bV)
垢版 |
2017/12/06(水) 14:11:49.30ID:UBdFOzE6a
表のように与えられた時各学年の人数と全校の人数をふ計算するプログラムを教えてください。
できれば今日中に。


1組 2組 3組 4組 5組
1年 33 35 34 32 36
2年 34 33 35 33 31
3年 31 32 36 30 35
0738デフォルトの名無しさん (ワッチョイ 3d93-kA4S)
垢版 |
2017/12/06(水) 17:36:10.79ID:mUQybk730
>>734 は学校の宿題か課題の代行をタダでやってくれ、みたいに見えるなぁ。
親切心で教えることが質問者のためになるか疑問ってこと。

元のデータはどういう形で与えられるのかな。
質問の内容から見て、学年数もクラス数も一定で
配列としてソースファイルに埋め込みで良さそうだけど。

学年数やクラス数まで実行時の入力によって可変、となると
かなり面倒な話になるね。
0740デフォルトの名無しさん (スプッッ Sd0a-hmNI)
垢版 |
2017/12/06(水) 18:30:27.51ID:YX7yBjoZd
execve関数を使うためにclearenv()で環境変数を初期化すると手順にあるのだけど
この関数の影響範囲をどう調べればわかるか調べ方もしくは影響範囲が知りたいです
manページを見ても名前と値の組の環境変数を〜みたいな話しかなくて困ってます
0742デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/06(水) 20:41:52.15ID:5GqDQnIfa
>>734
宿題用のスレなかったっけ?
C言語のはなかった?
0743デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/06(水) 20:42:56.94ID:5GqDQnIfa
>>735
君のやりたいことがよくわからない。
0744デフォルトの名無しさん (アウアウカー Sa55-iHXH)
垢版 |
2017/12/06(水) 20:50:51.97ID:5GqDQnIfa
>>740
影響範囲?そりゃ環境変数使うプログラム全てだろう。特にPATH使うようなやつ(外部コマンドをフルパス使わずに動かす可能性のあるプログラム)は影響受けるよね。
その他、動かすコマンドによって影響は違うと思う。これから動かそうとしているコマンドがどういう環境変数を使うかに掛かっている。だからこうだと固定的に言うことができない。
0745デフォルトの名無しさん (スプッッ Sd6d-hmNI)
垢版 |
2017/12/06(水) 21:47:43.97ID:9SICms2Nd
>>744
無知ですまんが
環境変数をクリアするってことは要はLD_LIBRARY_PATHに登録されてるものをすべて無にするってことなのだろうか
これは一時的なもの?それとも永続的なもの?

ここらを参考にsystem関数ではなくexecveを使う方針になったのだけど
むしろ改悪になってるんじゃないかとなってきている
https://www.jpcert.or.jp/sc-rules/c-env33-c.html
http://www.jpcert.or.jp/m/sc-rules/c-env03-c.html

下を読んでなんとなく何がリセットされるのかはわかってきたけども
それがどう影響を与えるのだろうかと
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c703.html
0746デフォルトの名無しさん (スプッッ Sd6d-hmNI)
垢版 |
2017/12/06(水) 21:52:07.31ID:9SICms2Nd
下記のように書いてあるけども
むしろ影響範囲でか過ぎるんじゃねぇか?ってのが困ってるところ
確かに改竄とかの対策にはなるとは思うんだけど
リセットしてしまったことによって使えなくなるものについてはどう担保するのかがわからない

このクリアが呼び出した関数内だけなのか、呼び出したプロセスやスレッドだけなのか、呼び出したら再起動までずっとなのか、呼び出したら再起動しても以降ずっとなのかと


(2) 環境変数のクリア
外部プログラムをコールする(exec(3))前に、環境変数をすべてクリアするとより安全になる。環境変数をクリアするには、clearenv(3) をコールすればよい。

clearenv(3) が無い環境では、以下のように extern char **environ 変数を直接クリアする。
environ = NULL;
※上記の方法で環境変数をクリアしても、system (3) による子プロセスの環境変数は、クリアされず再設定されたものになる。
0748デフォルトの名無しさん (ワッチョイ 6d9f-nek4)
垢版 |
2017/12/06(水) 22:02:54.34ID:u7C0REjG0
>>745
一時的もなにもそれを実行したプロセスとそのプロセスからexecしたプロセスにしか影響しないよ。だからfork()後に子プロセスだけでやるなら親プロセスには影響しないしその他無関係なプロセスにも影響はない。
0749デフォルトの名無しさん (ワッチョイ 6d9f-nek4)
垢版 |
2017/12/06(水) 22:05:07.83ID:u7C0REjG0
>>745
環境変数はシステム全体で一箇所に持っているものではなくプロセス単位で持ってるものだからね。そしてexecの時に引き継ぐ事もできるようになってるだけ。
0750デフォルトの名無しさん (スプッッ Sd6d-hmNI)
垢版 |
2017/12/06(水) 22:31:14.96ID:9SICms2Nd
>>748
>>749
イケメンな回答ありがとう
それってどこを見たら分かるものなのだろうか
俺調べるのが苦手でどれがそのことを示してるのだろうか
その的確な回答をしてくれてとても分かりやすくてとても助かってるが俺も自身でわかるようになりたい
0752デフォルトの名無しさん (ワッチョイ 17d3-vw7f)
垢版 |
2017/12/07(木) 00:29:29.78ID:X12IxieF0
初心者です
時間取得の関数で待ち時間を作るの方法は使わずに、
現在の処理の完了した後、次の処理に移らせるにはどのようにすればいいんですか?

現在の処理が始まった瞬間に次の処理に移ってしまいます


現在の処理とは、マウスポインタの操作です

お願いします
0753デフォルトの名無しさん (ワッチョイ d79f-qmOZ)
垢版 |
2017/12/07(木) 00:53:41.38ID:9lSPChPb0
>>752
おそらくそれだけの説明では大半の人が答えられないと思う。(エスパーを除く)
0756デフォルトの名無しさん (ワッチョイ 5793-3gxb)
垢版 |
2017/12/07(木) 08:07:08.94ID:W1nCZ1Cb0
>>755
「概要」の第3段落冒頭かな。
「環境変数は、各プロセスに付随するデータである」

この1文から「プロセスごとに環境変数は独立」を読み解くのは
この手の文章に対する程度の慣れが要求されるかも。
0757756 (ワッチョイ 5793-3gxb)
垢版 |
2017/12/07(木) 08:28:21.42ID:W1nCZ1Cb0
最後の行は言うまでもなく「ある程度の慣れ」が正しい。
「ある」を打ち忘れたアル。
0761デフォルトの名無しさん (スップ Sd3f-KxrP)
垢版 |
2017/12/07(木) 12:10:49.09ID:6ZyfpAbkd
>>760
そいつというと親プロセスでしょうか子プロセスでしょうか
知りたいこととしてはwaitpidを親プロセスが処理を抜けるタイミングについてです
エラーを受けたら抜ける、正常に終了したら抜けるってのはわかったのですが、
これ以外にwaitを解くタイミングがないのかと
0768デフォルトの名無しさん (ワッチョイ 17b3-LVSJ)
垢版 |
2017/12/09(土) 19:00:18.23ID:wLDySn0e0
乱数を使って異なる4つの数を作りたい
色々調べると a[10] = {0,1,2,〜,9};
を作って4つランダムに抜き出すとかも見つけたんだけどこれでも重複回避方法がわからん...
0770デフォルトの名無しさん (ワッチョイ bfb6-QZHg)
垢版 |
2017/12/09(土) 19:28:52.45ID:oe+MwYG+0
>>769
乱数を作りたいと言ってるわけじゃないわけでー
0774デフォルトの名無しさん (ワッチョイ 17b3-0+aW)
垢版 |
2017/12/09(土) 19:38:14.85ID:f1LM7KYB0
とりあえず異なる4つの数を作りたいって言ったけど最終目標がHit&Blowだからマクロについて学んでくる
0775デフォルトの名無しさん (ワッチョイ 17b3-0+aW)
垢版 |
2017/12/09(土) 19:39:02.99ID:f1LM7KYB0
あっスマホとPCでID変わるんだった
0776デフォルトの名無しさん (ワッチョイ 17b3-0+aW)
垢版 |
2017/12/09(土) 19:40:07.11ID:f1LM7KYB0
配列をシャッフルか...なるほど...
0777デフォルトの名無しさん (ワッチョイ 5793-3gxb)
垢版 |
2017/12/09(土) 19:59:49.27ID:0DJ42hmW0
配列をシャッフルするって方法は、カードゲームや麻雀の洗牌で使うよね。
文字通りシャッフル、一揃いの順番を混ぜ合わせる操作として。
連番で初期化した配列の、乱数で選んだ2つのインデクスの要素同士を入れ替え。
ある程度の回数ループさせると重複なく順番がバラバラになる。

他には、素朴な乱数ルーチンと組み合わせて乱数の質を改善する方法として
乱数プール(配列)の中から乱数で選んだ(インデクスの)値を出すってのを
見たことがある。
最近は高品質な生成アルゴリズムを使うのだろうけど。
0779デフォルトの名無しさん (ワッチョイ 578c-FlEo)
垢版 |
2017/12/09(土) 20:41:26.15ID:gdFl+nNB0
>>連番で初期化した配列の、乱数で選んだ2つのインデクスの要素同士を入れ替え。
>>ある程度の回数ループさせると重複なく順番がバラバラになる。

それは初心者にありがちな悪手。回数を増やすと見た目はランダムっぽく
なるけどあまりランダムにならない。
1枚目を全体からの一様乱数、2枚目を残りから一様乱数、・・・という具合に選ぶのがいい
0781デフォルトの名無しさん (ワッチョイ d79f-qmOZ)
垢版 |
2017/12/10(日) 06:04:19.96ID:J0bkBqjd0
それはC言語ではなかろう
0783デフォルトの名無しさん (ワッチョイ 17b3-LVSJ)
垢版 |
2017/12/10(日) 11:45:02.06ID:jSvVl/bp0
昨日の768です
Fisher-Yates shuffle
が凄く役に立ちました。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void shuffle(int ary[], int size);

int main(void) {
int list[10] = { 0,1,2,3,4,5,6,7,8,9 };

shuffle(list, 10);
for (int i = 0; i < 10; i++) {
printf("%d,", list[i]);
}
return 0;
}

void shuffle(int ary[], int size) {
for (int i = 0; i < size; i++) {
int j = rand() % size;
int t = ary[i];
ary[i] = ary[j];
ary[j] = t;
}
}
0785デフォルトの名無しさん (アウアウカー Saeb-I8sf)
垢版 |
2017/12/10(日) 18:48:03.62ID:xLxKGjo5a
4桁なら乱数4つ求めた後で重複調べてあったらまた求めるっての繰り返しても良いんじゃないか?
0786デフォルトの名無しさん (ワッチョイ ff80-8EI8)
垢版 |
2017/12/11(月) 06:21:58.84ID:4q7JrCp00
arySize = 10
range = 0...arySize # 未満
ary = range.to_a

def shuffle(ary, size, range)
for i in range
j = Random.rand(size)
puts "i=#{i} ← j=#{j} : value #{ary[i]} ← #{ary[j]}"

ary[i], ary[j] = ary[j], ary[i]
end
end

shuffle(ary, arySize, range)
p ary

i=0 ← j=8 : value 0 ← 8
i=1 ← j=9 : value 1 ← 9
i=2 ← j=2 : value 2 ← 2
i=3 ← j=9 : value 3 ← 1
i=4 ← j=7 : value 4 ← 7
i=5 ← j=5 : value 5 ← 5
i=6 ← j=4 : value 6 ← 7
i=7 ← j=8 : value 4 ← 0
i=8 ← j=7 : value 4 ← 0
i=9 ← j=9 : value 3 ← 3
[8, 9, 2, 1, 6, 5, 7, 4, 0, 3]

>j = Random.rand(size)
Ruby で書いたけど、これだと、0〜9 のまま一定だろ。
Fisher-Yates shuffle では、ループの度に、1ずつ減らさないといけないよな?
0787デフォルトの名無しさん (ワッチョイ 5793-3gxb)
垢版 |
2017/12/11(月) 06:51:09.15ID:IqtrAjQN0
>>779
Fisher-Yates shuffle で検索したら、関連情報として >>777 の方法が
良くないことと、その理由が説明されてるページが見つかった。

可能な並べ方の全パターンが等しい確率で出現するか否か、
というアルゴリズムの原理からの比較は分かりやすくて説得力があった。

個人のページみたいなのでリンクは張らないけど、
「Fisher-Yates shuffle ランダムシャッフル」で出るかと。
0792デフォルトの名無しさん (アウアウカー Saeb-I8sf)
垢版 |
2017/12/11(月) 12:51:29.67ID:h/GY+Pada
>>788
おお。斬新なアイデア。
4つしかなくて0〜9ならそれでも問題ないな。(メモリが全然ないような特殊な場合を除いて)。
0801デフォルトの名無しさん (ササクッテロル Sp8b-lv8k)
垢版 |
2017/12/13(水) 17:02:05.03ID:1L+KQhUep
>>800
つうか、一回限りなら意味が無いかもな。
テーブルに出た回数も記録して同じ組み合わせは出ない様にも出来たり、テーブル自体も別系列の乱数でシャッフルするとか、
使い道は無限大さ。
0805デフォルトの名無しさん (アウアウウー Sa1b-GIjF)
垢版 |
2017/12/13(水) 23:51:42.07ID:ScBZYS+4a
C言語覚えたい頼む
このアホに教えこんで理解させるとしたらまずなんのテキスト使う?
教え上手のおまいらに最後の希望を託す
(ちな言われたことは必ずやります)
0811デフォルトの名無しさん (アウアウウー Sac3-qGtq)
垢版 |
2017/12/14(木) 11:15:27.13ID:lae2KYT0a
>>806
片山さんチーッス!
後ほど報告しますね

>>809
FE試験でCASLを福島本で少々もちろん落ちました春再戦はCで挑みたく…
ほかPython本チラ見と開発環境整え中に他の試験のため頓挫

覚えたいが独学でグイグイいけるモチベもなく(あればここで泣きついてないw)誰かにゆるい階段のお膳立てをしてもらい登ってみようかと。これでだめならセンス無しでITから撤退しますw
0817デフォルトの名無しさん (エーイモ SE52-x5Rz)
垢版 |
2017/12/14(木) 13:39:55.18ID:viw49ZxRE
C99とかC14とかCにもいろいろ種類があるそうですが
特定の種類で書かれたソースコードであるかチェックしたいのでsouiu
lint toolってありませんか?
0819デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/14(木) 16:12:02.98ID:fPDEs5uN0
C14はC++14を勘違いしたんだろうね
Cの種類は、K&R, C90(C89), C99, C11の4つが主要バージョン
主要でないバージョンというと、primeval CとかC84などがある
C90をC89と言ったりするのは、ISO/IEC9899:1990がANSI X3.159-1989を追認する内容だからだ
日本語版のJIS X3010:2003はC99の直訳
0820デフォルトの名無しさん (アウアウカー Sa6f-kaKc)
垢版 |
2017/12/14(木) 16:29:20.24ID:8Y/Mk4+4a
>>803
いやほら乱数ってハードウェア利用せずに計算だけでやる場合は処理を複雑にしても無意味なことあるじゃない。
0821デフォルトの名無しさん (アウアウカー Sa6f-kaKc)
垢版 |
2017/12/14(木) 16:31:27.48ID:8Y/Mk4+4a
>>810
懐かしいのがあるなあ。

でもアセンブラできるなら覚えるの早いかも。
0827デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/14(木) 17:06:32.65ID:fPDEs5uN0
putsの使いにくさときたらアンタ・・
0830デフォルトの名無しさん (ワッチョイ dee7-hnOy)
垢版 |
2017/12/14(木) 20:08:02.01ID:ixe7nO7C0
putsは使ってないな一行読み込みだしその後の文字加工がめんどくさいからprintfで済ましちゃうな
0831デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
垢版 |
2017/12/14(木) 20:15:34.79ID:wDiGnNfx0
初心者にprintfを教えると、信頼の出来ない文字列を第一引数として渡す事故が
起きかねないので教育上よろしくないのは常識

[MQ]Z はアホの代名詞
0832デフォルトの名無しさん (アウアウカー Sa6f-kaKc)
垢版 |
2017/12/14(木) 20:26:36.32ID:kKgdz6jma
printf("%s\n", "うふ");
0835デフォルトの名無しさん (ブーイモ MM63-VZi2)
垢版 |
2017/12/14(木) 21:58:51.30ID:q6i5/Nc7M
プログラミング初心者です

struct hoge *tmp = NULL;
以下うろ覚え
tmp->hage = xxxxx;

最近上記のようなコードに出会いました
明らかにNULLなのにアロー演算子で参照してもぬるぽしないことってあるんでしょうか?
0837デフォルトの名無しさん (ワッチョイ 772b-5suJ)
垢版 |
2017/12/14(木) 22:16:14.39ID:a/3Oigfw0
tmp->hage = xxxxx は、0番地にアクセスしてるわけじゃなくて
0 + hageのオフセット番地にアクセスしてるわけだから、
hageのオフセット番地が有効なメモリまでズレてれば
ヌルぽしないんじゃない?
0843デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
垢版 |
2017/12/14(木) 22:37:16.44ID:ZN3qJoQh0
>>838
> 組み込みならゼロ番地付近をアクセスするためにありうるかもな。
これで当たりだと思うけど、
そもそも組み込み(≒MMU無し)ならどこアクセスしてもヌルポしないがな。
0845デフォルトの名無しさん (ワッチョイ 12b3-jdna)
垢版 |
2017/12/14(木) 22:47:13.04ID:JlwKPeYd0
>>843
> そもそも組み込み(≒MMU無し)ならどこアクセスしてもヌルポしないがな。
そんなもん機器による
ROM領域に書き込んだりなにも割り当てられてない領域を読み出したら例外を発生させるとか普通にある
0850デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/15(金) 05:27:47.99ID:GBd6F7vt0
スタックポインタの初期値だね
0852デフォルトの名無しさん (ドコグロ MMb3-jdna)
垢版 |
2017/12/15(金) 06:58:51.04ID:suRmrR/jM
>>849
> ゆとり死ね
指摘されたら逆ギレとかどっちがゆとりだよ w

> つか組み込みの0番地なら普通にアクセスできるほうが多いと思うが。
組み込みなんてピンきりだから普通にとか言っても意味ない
そもそも
> 組み込み(≒MMU無し)
の認識がおかしい

> ARMだとベクタのようだし。
ARMもピンきりでMMU持ってる奴も多いからARMだから0番地アクセスできるとか無知すぎる
0853デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
垢版 |
2017/12/15(金) 07:02:18.81ID:yuhdgz4g0
>>848
セグメントフォルト、バスエラーは同期例外だ
非同期(タイムアウト)でバスエラーなんか起きたら困る

知ったか乙
0854デフォルトの名無しさん (スップ Sd52-cDjN)
垢版 |
2017/12/15(金) 07:14:46.17ID:soFbbFtpd
C言語じゃないけど聞いて良いですか(´;ω;`)
バッチ利用して設定ファイル書き換えたい

1. ユーザーに入力してもらう
2. iniの値をそれで上書き

x.ini
AAA=1
BBB=2
CCC=3

AAA=1
BBB=192.168.0.1
CCC=3

キーはBBBで固定
設定値が少ないから一度全部読み込んで一行ずつtmpに書き込んで〜ってのも問題ない
一行ずつ読み込んで別ファイルに出力とかはできたんだけど
BBBなら〜って判別ができないです
0855デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
垢版 |
2017/12/15(金) 07:35:31.85ID:yuhdgz4g0
>>854
>C言語じゃないけど聞いて良いですか(´;ω;`)
ダメ
0857デフォルトの名無しさん (ドコグロ MM97-jdna)
垢版 |
2017/12/15(金) 08:14:33.28ID:FCwL/bM6M
>>853
恥の上塗り乙
68Kだと普通の設計だぞ
https://www.slac.stanford.edu/BFROOT/www/Detector/DAQ/Infrastructure/Maint/177aih.pdf
あとバスエラーの定義はプロセッサによって異なるからプロセッサも限定せずに
> セグメントフォルト、バスエラーは同期例外だ
とか書くと知ったかがばれるので注意しろよ w
0858デフォルトの名無しさん (ドコグロ MM97-jdna)
垢版 |
2017/12/15(金) 08:20:34.53ID:FCwL/bM6M
>>854
C言語でやりたいならここでいいけど、バッチでやりたいならこっち
【.cmd】 バッチファイルスクリプト %12 【.bat】©2ch.net
http://mevius.2ch.net/test/read.cgi/tech/1489207631/

あとバッチはその手の文字列操作があまり得意でないので個人的にははPowerShellとか使った方が楽だと思う
【最強CUI】PowerShell -Part 2 [無断転載禁止]©2ch.net
http://mevius.2ch.net/test/read.cgi/tech/1480109402/
0859デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/15(金) 10:39:34.38ID:GBd6F7vt0
68kでのバスエラーとは/BERRがアサートされることで
何をセンスして/BERRをぶっ叩くかは基板次第だな
0862デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/15(金) 12:46:09.63ID:GBd6F7vt0
longjmpやC++のthrowのような例外と割り込みは違うが
ソフトウエア割り込みだの記憶保護例外だのは割り込みと同列なもので
CPUのマニュアルでも同じ章に書いてある
0864デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
垢版 |
2017/12/15(金) 13:49:05.09ID:yuhdgz4g0
>>857
この文脈ではメモリアクセスに伴って発生バスエラーであり、それが非同期って事はアスセスして読めた後で、やっぱさっきのなし、ノーカン、ノーカン

って事だぞ お前は班長か?
0866デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
垢版 |
2017/12/15(金) 14:30:39.93ID:yuhdgz4g0
>>865
理解してない奴は、混乱の元だから割り込んで来ないように
0870デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/15(金) 17:25:38.74ID:GBd6F7vt0
0xffffffff番地でもいいはずだね
要は、Cで合法的に定義されたオブジェクトが決して含まないアドレスを
1つ決めごと作っておいてそれを空ポインタということにしようということと
規格合致処理系はそれを必ず決めておかなければならないということ
C以外のたとえばアセンブラで定義されたオブジェクトまでがその規則に従うとは限らないし
そういうオブジェクトをCで扱えてはならないとまでは言ってない
あくまで自己責任でやる限り余計な邪魔立てはしない
0871デフォルトの名無しさん (ドコグロ MMaf-9pXP)
垢版 |
2017/12/15(金) 20:55:15.86ID:eSUvZEm2M
ポインタはポインタであってアドレスではない
けど中途半端に知ってるとポインタとアドレスがイコールと思い込んでしまう
ヌルポインタはアドレスで説明できないポインタの例だね
0872デフォルトの名無しさん (ササクッテロル Spc7-e1v7)
垢版 |
2017/12/15(金) 20:57:06.91ID:wYljbLzIp
バスエラーってのは、あらかじめ決めた領域以外をアクセスしょうとしたら発生するのであって、読んだ後にここ読めないからなんて動作はしない。
むしろ決めて無い場合は幾らでも読み書き出来てしまう。例えそれが嘘でも虚構でもな。
後からノーカンなんてならない。
0876デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
垢版 |
2017/12/15(金) 21:26:18.69ID:yuhdgz4g0
>>872
わかってない奴は割り込むなって言っただろ
痛々しいぞ
0877デフォルトの名無しさん (ドコグロ MM97-jdna)
垢版 |
2017/12/15(金) 21:34:47.34ID:FCwL/bM6M
>>876
お前がわかってないだけだろ w
68K の話ならデータが読めると言うのは DTACK のアサートで示される
その後に BERR をアサートしても受け付けなかったと思う
(そんなアホな設計はしたことないから本当にそうかどうかは試してないけど)
そもそも BERR は非同期じゃないからお前が初めから頓珍漢なだけ
0884デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
垢版 |
2017/12/15(金) 22:47:47.28ID:QRFEcBGB0
>>852
ゆとりマジで死ね
韓国人も死ね

お前らはそういう所がいけない。俺は逆ギレしているのではなく、単にキレてるだけだ。
お前らはそうやって常に話をすり替え、被害者ポジションを確保する癖があるが、それは根本的に間違ってる。
そもそも、ここにはお前らより知識のある奴が沢山居るんだから、お前らの聞きかじりで回答する必要はない。
話が余計におかしくなってるだろ。

話を>>841に対する回答に戻すと、841の話しぶりからして、
俺は以下を補足した方がいいと思ったから>>843を投稿したんだよ。
1. 841の言う「ヌルポ」はOSがMMUで捕まえるヌルポである。
2. >>838の言う「組み込み」はMMUがない場合を指している。
3. 838の言う「ゼロ番地付近をアクセス」はOS+MMUがない場合を想定している。
4. 従って838のケースでは841の想定するヌルポは発生しない。
というのを伝えるために書いたんだ。
それをお前は知ったかをしたくて、「MMUなら俺も知ってる!」と勝手に食いついてきただけ。
読む限り、お前は例外がどう動くのか理解できてないと分かるが、無知なままでいろ。
俺は841を助けようとしたのであって、韓国人とゆとりは死ねとしか思ってないから。

VBRを変更する場合、確かに0番地付近を構造体アクセスして転記するんだよ。
838はこれに気づいた、そしてそれを伝えた。
俺は841が「0番地アクセス=ヌルポ」と思っているっぽいので、(これは通常のOS+MMUならそうだが)
それとは違うぞと分かるように補足した。
それに知ったかゆとりが食いついてきただけ。

> プログラミング初心者です (>>835)
という点からしても、838で当たりだろう。
VBRを変更するならかなり初期で対応するので、初心者でも目に付く場所に記述される。
0885デフォルトの名無しさん (ワッチョイ ef9f-v37J)
垢版 |
2017/12/15(金) 23:13:36.36ID:i/+5VHc30
>>835
それをコンパイルするコンパイラの仕様とそれを実行するマシンアーキテクチャによって変わる。
0886デフォルトの名無しさん (ワッチョイ ef9f-v37J)
垢版 |
2017/12/15(金) 23:15:47.32ID:i/+5VHc30
OSによっても変わるかな。
まあしかしOSそのもののソースコードならそう書いて正常動作したとしても特におかしくないかな。
0895デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/16(土) 05:42:42.76ID:V7dZrSJp0
1点、気になるのがNULLと書いていたことだ
0番地にアクセスすることを意図しているコードは
struct hoge *tmp = NULL; ではなく
struct hoge *tmp = (struct hoge *)0; と書くだろう
思うに、単にtmpへの代入を忘れただけではないか?
そういうポカミスを多発するどんくさいやつほど
「変数は必ず初期化」に固執する
0897デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
垢版 |
2017/12/16(土) 08:59:26.34ID:TBmZZU6f0
>>893
ゆとり死ね
韓国人死ね

俺が読めといっているのは>>884のことだ馬鹿タレ
どうせお前らは日本語が不自由で3行以上は読めないから意味が分からないのだろうが
お前らが迷惑行為を働くことに対して俺はキレてるんだよ


>>895
環境によってはwarningが出る。VC++とか。
個人的には意味ないとも思うが。
0908デフォルトの名無しさん (ワッチョイ ef9f-mLIQ)
垢版 |
2017/12/16(土) 14:30:30.83ID:+Cq6iaDY0
>>906
つまりこうであると。

#include <stdio.h>

int main(int argc, char *argv[])
{
 int i, j;
 for (i = 0; i < 2; i++) {
  for (j = 0; j < 2; j++)
   fputs("おっぱい", stdout);
  for (j = 0; j < 2; j++)
   fputs("ぽよん", stdout);
  putchar('\n');
 }
 return 0;
}
0909デフォルトの名無しさん (ワッチョイ ef9f-mLIQ)
垢版 |
2017/12/16(土) 14:32:07.96ID:+Cq6iaDY0
そういや古いソースには char *p なのに if (*p == NULL) みたいに書いてあるのがあって、今時のコンパイラだと警告出しまくりになるんだよなあ。
0910片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
垢版 |
2017/12/16(土) 15:55:35.27ID:2NfYNG63d
>>908
こう書いてもいいね。
#include <stdio.h>
int main(void) {
int i;
for (i = 0; i < 8; i++) {
if (i % 4 < 2) fputs("おっぱい", stdout);
else fputs("ぽよん", stdout);
if (i % 4 == 3) putchar('\n');
}
return 0;
}
0913デフォルトの名無しさん (ワッチョイ ef9f-mLIQ)
垢版 |
2017/12/16(土) 17:23:42.81ID:+Cq6iaDY0
>>910
なるほど。

ちょっと変形してビット演算でも行けるな。

#include <stdio.h>
int main(void) {
 int i;
 for (i = 0; i < 8; i++) {
  fputs(i & 2 ? "ぽよん" : "おっぱい", stdout);
  if ((i & 3) == 3) putchar('\n');
 }
 return 0;
}
0914デフォルトの名無しさん (ワッチョイ 92e1-kSiG)
垢版 |
2017/12/16(土) 19:24:56.53ID:lAe10LAt0
#include <stdio.h>
#include <stdlib.h>
void o(){ fputs("おっぱい", stdout); }
void p(){ fputs("ぽよん", stdout); }
void r(){ puts(""); }
void e(){ exit(0); }
void (*a[])() = { o,o,p,p,r,o,o,p,p,r,e };
int main(){ void (**x)()=a; while(1) (*x++)(); }
0915デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
垢版 |
2017/12/16(土) 20:18:31.50ID:ftZRkd7o0
>>877
>struct hoge *tmp = (struct hoge *)0; と書くだろう

このように書いても*正しく*NULLポインタが代入される
char zero[(struct hoge *)] = {0};
memcpy(tmp, zero, sizeof zero);
としないとダメ

逆によく見かけるポインタを含む構造体をmemcpyで0に初期化するのも正しく無い
0916デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/16(土) 20:46:52.08ID:V7dZrSJp0
>>915
それがわからんやつが、ここに、いや世界にいると思っているのか?
俺のはコードに意図を残すという論旨だったが、それがわからんやつがおまえさんか

ア ホ か
0917デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
垢版 |
2017/12/16(土) 21:04:20.92ID:ftZRkd7o0
意図を残すために間違ったコードを書くとは理解に苦しむ
コメントで残した方が数百倍マシ
0918デフォルトの名無しさん (ワッチョイ 926e-zS+j)
垢版 |
2017/12/16(土) 21:54:17.26ID:V7dZrSJp0
ほほう、どう間違ったと言うのかね?
0922デフォルトの名無しさん (ワッチョイ 5e8a-F+rF)
垢版 |
2017/12/17(日) 04:55:34.79ID:vowUucL80
>>919
>>895と間違えてたな

>>921
memcpy(&tmp, zero, sizeof zero);
こうだね
0925デフォルトの名無しさん (ワッチョイ ef9f-v37J)
垢版 |
2017/12/19(火) 08:30:52.67ID:SEIe84in0
お、収まったか・・・
0926デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
垢版 |
2017/12/19(火) 21:03:25.54ID:6p/5Z93J0
完全初心者です。文字列の性質について質問させてもらいます。

柴田望洋著 「ポインタ完全攻略」という書籍にて次のような内容の記載があります。

・文字列リテラルは変数ではないが記憶域を占有する
・文字列リテラルはcharの配列である

そして次のページに、
・このような文字列リテラルは、整数にいいかえると「定数」に相当するものであるから、自由に取り扱うためには
 変数に格納する必要性がある
・そこで利用されるのがcharの配列である

ここでわかりかねるのが、文字列リテラルというのはそもそも定義自体が「charの配列」であるはずなのに、
これをまた「charの配列」に格納するの??と、疑問に思ってしまったわけです。

これはいったいどういうことでしょうか。
0928片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
垢版 |
2017/12/19(火) 21:18:36.23ID:3xf/peDqd
"This is C string literal."
これが文字列リテラルね。参照すると文字列定数になる。
char s[] = "This is character array.";
これが文字の配列の変数sの宣言と初期化ね。sはヌル文字を含めた文字列データ先頭を参照する。sizeof(s)は、ヌル文字を含めたデータのサイズになる。
const char *p = "This is pointer to characters.";
これは文字列の先頭へのポインタになる。サイズはアドレスのサイズ。データは変更できない。
0929 ◆QZaw55cn4c (ワッチョイ b260-4mDj)
垢版 |
2017/12/19(火) 21:19:44.32ID:U2jplJ2K0
>>926
ちょっと進んだ知識になるのですが。

プログラムがコンパイルされたのち、プログラムの実行の段階にはいったとき、コードや変数領域やその他もろもろがメモリ上に展開されるわけですが、
文字リテラルは、場合によってはメモリ上の書き込み不可能の場所に置かれます。たとえば ROM メモリとか。
もし、その文字リテラルを適宜書き換えて使いたいのならば、書き込み可能な場所にコピーして使うでしょう、それが、変数であり配列でありするわけです。

ただし文字リテラルを書き換えることが可能な環境では、それを見越して、文字リテラルを書き換えて対応する、という手がないわけではありません。
まあ一般的には行儀が悪いと思われています。それに文字リテラルを途中で長くしたい、とかは不可能ですし。
0930デフォルトの名無しさん (ワッチョイ af36-zS+j)
垢版 |
2017/12/19(火) 21:21:47.79ID:MoA6J0CR0
>>926
おまえさんが疑問に思っているのはこういうことか?
puts("aho"); で済むのを、わざわざ
static const char array[] = "aho";
puts(array); としなければならないのかと
0932デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
垢版 |
2017/12/19(火) 22:51:39.70ID:6p/5Z93J0
>>927
>>928
>>929
>>930
>>931

みなさんお騒がせいたしました。みなさんから頂いたアドバイスを参考にさせていただいて、
よく考えてみたところ、あまり深く気にするべきではないように感じてきました。
先ほどの本の「配列による文字列」「ポインタによる文字列」という箇所を読み込んだところ、
「配列による文字列」はcharの配列を宣言して文字列を用いる場合で、「ポインタによる文字列」
は「char p* = "ABC"」のように、ポインタchar *を宣言してなんらかの文字列リテラルで初期化する
手法であるとのことです。

おそらく・・・よくわかりませんが、直観的に私が当初感じていた疑問点というのはここら辺の部分に帰結
する話だと思われます。

現段階での私の理解
・文字列はそもそも配列?などということは気にしなくてもよい。
・文字列を配列charに格納してからポインタで操作する方法がある。この場合は当然配列の規則に従う
 ので代入とかはできない
・char * = "ABC" のようにchar[]を宣言せずに文字列をポインタで操作する方法もあり。
 この場合は p = "SEX" のような代入ができる。
0934デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
垢版 |
2017/12/19(火) 23:01:45.80ID:6p/5Z93J0
>>933
const
中身を変えられないとかいう…。
ありがとうございます。勉強になります。
0935デフォルトの名無しさん (ワッチョイ 1680-zkGJ)
垢版 |
2017/12/19(火) 23:37:54.35ID:jfHXMkXp0
immutable・不変かどうかの区別。
不変オブジェクトは、メモリ内の読み込み専用エリアに置けるので、最適化しやすいから、
できる限り、不変が望ましい

Ruby, JavaScript では、文字列は可変オブジェクトだが、freeze すると更新できない

s = "hello"
s.freeze

よく覚えていないけど、この本が良かった気がする。
詳説 Cポインタ、オライリー、2013
0936デフォルトの名無しさん (ワッチョイ ef9f-mLIQ)
垢版 |
2017/12/19(火) 23:44:08.13ID:SEIe84in0
char *s = "abc";
と初期化した場合は
s[1] = '\0';
のようなことをすると Segmentation fault になったが、
char s[] = "abc";
の場合は
s[1] = '\0';
が問題なくできた。その後 puts(s) をすると a だけが出た。
OS は Linux でコンパイラは gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) だ。
-S でアセンブラの出力をさせるとどちらも "abc" をリードオンリーの領域に配置させているが
char s[] と書いた場合は関数の初めでスタックに領域を確保してそこにコピーしてからアクセスしていた。
char *s の方は単に先頭アドレスを使うようになるだけ。(そしてリードオンリーの領域に書いて死亡)。

man gcc を見ると -traditional や -fwritable-strings で文字列リテラルに書き込めるようにできるとは
書いてあるが、この man page 自体が古く、4.8.5 では既にこのオプションは使えなくなっていた。
0937デフォルトの名無しさん (ワッチョイ 1f9f-iA8U)
垢版 |
2017/12/20(水) 00:00:34.09ID:FD+Ux1Ht0
>>932
> 現段階での私の理解
だいぶ間違っているが、ド初心者ならあまり細かく考えずに進めてもいい。
(プログラミング自体の初心者なら、最初の段階で重要なのはそこではないから)
キッチリやりたいのなら、メモリを確認しながら進めた方がいい。
IDE等使えば簡単に見えるし、何を間違っているかすぐに理解できると思う。


>>935
JavaScriptのstringはインミュータブルだ馬鹿タレ
0938デフォルトの名無しさん (ワッチョイ 92e3-4pIx)
垢版 |
2017/12/20(水) 01:15:20.03ID:52iYTq0Y0
>>932
よく言われることだけど、cに文字列型はない
cで文字列という時は必ず文字の配列のこと

char * p = "ABC";

char x[] = { 'A', 'B', 'C', 0};
char * p = x;
って書くのを少し楽に書けるようにしてくれてるだけ

プログラミング自体の初心者なら、cで文字列を扱うこと自体を後回しにした方がいいと思う
0939デフォルトの名無しさん (ワッチョイ af36-zS+j)
垢版 |
2017/12/20(水) 06:46:09.98ID:63AN+5MK0
> cで文字列を扱うこと自体を後回し

俺もそう思う
ど初心者にはちとキツい
0942デフォルトの名無しさん (ワッチョイ 92a6-ak+6)
垢版 |
2017/12/20(水) 09:01:12.50ID:RLul2dZl0
const教は良い教義だと思うけどな。
0945デフォルトの名無しさん (ワッチョイ af36-zS+j)
垢版 |
2017/12/20(水) 10:35:07.90ID:63AN+5MK0
C++にconstexprがあるのはconstの設計ミス
0946デフォルトの名無しさん (ササクッテロレ Spc7-e1v7)
垢版 |
2017/12/20(水) 11:33:29.38ID:9SrStGF7p
>>944
いや、const無くても文字リテラル自身はROMに書かれてるんだけど、デフォルトはそれをわざわざ初期化の時にRAMに展開して書き換えられてもいいように準備して待ってるんだよな。
それがもったないからconst付けるんだ。
0947デフォルトの名無しさん (アウアウカー Sa6f-kaKc)
垢版 |
2017/12/20(水) 11:48:57.84ID:g9yiCifSa
>>946
ところが chrar * 変数に対する初期化に文字列リテラル使うと>>936のようにエラーも警告も出さずにコンパイルが成功してリードオンリーの領域に書き込みアクセスするプログラムができてしまうと。
0949デフォルトの名無しさん (ワッチョイ af36-zS+j)
垢版 |
2017/12/20(水) 13:49:50.09ID:63AN+5MK0
constつーか__attribute__((section(".rodata")))だろ
0950デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
垢版 |
2017/12/20(水) 20:21:08.31ID:ap2qT8fO0
>>932です。
みなさんありがとうございます。
C言語では文字列を扱うのは難しいようですね。
しかし使うだけであれば「なんとなく感覚的」に可能か?と思われます。

ところで、ネットや本でC言語の難所はポインタだ!とよく書いてますが、この文字列の部分というは正に
ややこしい部分ではないでしょうか?
ポインタと配列の関係性の理解だけでも一山あります。
それが文字列となると、ポインタ+配列+文字列の知識の理解、となってしまって。
構造体を勉強するのが先でしょうか。
0951片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
垢版 |
2017/12/20(水) 20:43:26.94ID:hN2yOtWhd
>>950
この程度で難しいというなら、あきらめてJavaに行った方が身のためだ。
plain Cは時代遅れで、そのまま使うとセキュリティに穴があるシステムを量産してしまう。
Cはロボットにまかせて、人間はC++みたいな高度なプログラムを使うことが望ましい。
0952デフォルトの名無しさん (ワッチョイ af36-zS+j)
垢版 |
2017/12/20(水) 20:47:28.16ID:63AN+5MK0
>>951
それを言うなら静かに自力で解決するやつ以外すべて足切り点未満だろ
plain Cで隙だらけのコードを量産するおまえさんが体現しているようにw
0953デフォルトの名無しさん (ワッチョイ 12b0-+NpI)
垢版 |
2017/12/20(水) 21:24:09.39ID:ap2qT8fO0
>>951
最近プログラミングが騒がれているのでpythonを始めたのですが、どうもプログラミングしてる感
が持てないためC言語をかじりだしたのです。
javaはコードが長そうなので嫌な感じですね。C++はえらく難しいらしいですし...
まあpythonかrubyが普通に使えるくらいになれば十分なのですが...
0955デフォルトの名無しさん (ワッチョイ ffb3-AOQJ)
垢版 |
2017/12/20(水) 21:35:23.89ID:bl+FG2Ud0
余所の芝が青く見えるので、そっちをつまみぐいする進め方は
正直どっちも中途半端に覚えてるつもりになって、実際には道具として使えてない状態に陥りそう
0956 ◆QZaw55cn4c (ワッチョイ b260-4mDj)
垢版 |
2017/12/20(水) 21:41:33.06ID:8hKmNCKf0
>>953
C++ は教育的配慮に欠けていて、自力でなんとかしないといけない部分が多いし、ここ5〜6 年で規格がばたばた改定されたのに教科書が追いついていない
ついでに私もC++11later には追いつけていない(;;)
プログラムしている感は満載なんですけれども。

java は、資格とかもあり教育的な環境が整っているし書籍も多い、言語的な紛れもC++ に比べると少ない、個人的にはお勧めです。
プログラムしている感は、それなりにあると思います。

python 私もやっているんだけれども、つづりミスに悩まされています。なにか、いい支援環境はないものでしょうか?
0961片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd32-wvVH)
垢版 |
2017/12/20(水) 22:38:41.88ID:hN2yOtWhd
>>959
地震の原因は、地球内部の核融合反応をエネルギー源とするマントル活動だから、三次元マントルマップを
作って天気予報みたいにスパコンでシミュレーションすればある程度予測可能なはず。
0973デフォルトの名無しさん (ワッチョイ cf81-+obY)
垢版 |
2017/12/21(木) 00:17:01.11ID:HiBe6ryp0
>>968
映画だと、
日本列島の下に沈みこむ海洋プレートが微生物が発生するメタンガスの影響もあって
沈み込み速度をましているため、日本列島が引きずり込まれて「一気呵成」に沈み込む
ことになってます。
0976デフォルトの名無しさん (アウーイモ MM67-yeUS)
垢版 |
2017/12/22(金) 15:34:13.13ID:E+fmptBcM
4つの整数と + - * / を組み合わせて10を作ってその組み合わせを表示する、みたいなプログラムって作れますか?
0978デフォルトの名無しさん (アウーイモ MM67-yeUS)
垢版 |
2017/12/22(金) 16:10:47.49ID:ft9sfOBHM
>>977
ありがとうございます
計算してみたら1536通り?とかで気が遠くなってましたが、頑張ってみます
0979 ◆QZaw55cn4c (ワッチョイ 7f60-IIk+)
垢版 |
2017/12/22(金) 16:13:51.13ID:Zf+4IlSz0
>>961
>地球内部の核融合反応
コアは6000K の液体または固体金属、とのことだが、核融合にまでは至っていないかと思っていた
しかし、ググってみると、重水素の核融合が起こっているという仮説があった
http://www.natureasia.com/ja-jp/srep/abstracts/85904
この融合反応は wikipedia には載っていないなあ…よくわらかないね
0981デフォルトの名無しさん (アウーイモ MM67-yeUS)
垢版 |
2017/12/22(金) 17:16:18.78ID:ft9sfOBHM
演算子入れられる変数とか無いのかなー
0986デフォルトの名無しさん (ワッチョイ cfd7-tRgI)
垢版 |
2017/12/22(金) 20:43:06.61ID:e2HIssEB0
EXEファイル先頭のマジックナンバーだろ
0987デフォルトの名無しさん (アウアウカー Sac7-vdkM)
垢版 |
2017/12/22(金) 20:52:06.42ID:xiD1v8rca
二画面スマホ
0990デフォルトの名無しさん (ワッチョイ 639f-bsML)
垢版 |
2017/12/23(土) 06:03:46.75ID:BUr3nOOf0
まず、カセットテープからBASICを読み込ませます。
0992デフォルトの名無しさん (ワッチョイ f378-tRgI)
垢版 |
2017/12/23(土) 07:11:10.70ID:82L7PCHk0
オブジェクトみたいにもともと多義語だから
0995デフォルトの名無しさん (スプッッ Sd1f-k/7O)
垢版 |
2017/12/23(土) 16:19:05.64ID:jli6zd8zd
*=/+'")(^ などのアスキーコード内の記号の意味をまとめているサイトを探してるのだけどおすすめ知らないかな?
セキュリティ考慮したテストケースを考えてる
ipaでみた記憶があるのだけど見つからなくて...
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 58日 1時間 31分 0秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。