X



C言語なら俺に聞け 144
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 838a-3nWA)
垢版 |
2017/12/23(土) 19:33:43.89ID:dghfoRy20
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/


http://mevius.5ch.net/test/read.cgi/tech/1509107288/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0649愛知人
垢版 |
2018/02/01(木) 18:48:48.23
>>648
文字列リテラルは定数なのでそれは分かります(>_<)
0651愛知人
垢版 |
2018/02/01(木) 19:08:28.37
ポインタ変数にリテラルを代入した場合は...?(>_<)
0655愛知人
垢版 |
2018/02/01(木) 19:16:30.75
>>652 ?ʕ•ᴥ•ʔ?
0657愛知人
垢版 |
2018/02/01(木) 19:18:03.81
>>654
これは分かりました(>_<)
配列の変数はポインタと同じようで違うんですね(>_<)
0658デフォルトの名無しさん (アウアウウー Sa5b-wbgk)
垢版 |
2018/02/01(木) 21:16:29.83ID:bg4M2KC6a
>>640
void sumStr(char* str){
*str ="a";
}

これ、strはcherのポインタでありその指す先はchar型だ。
"a"は 'a', '\0' と並んで入っている先を指すポインタだ。

*str は char 型で、"a" は char * 型だ。型が違う。

これが例えば *str = 'a'; だったり、あるいは *str = *"a"; だったりすれば型も一致するし目的の値の代入に成功するだろう。
(まあしかし普通は *str = *"a"; なんて書き方しないけどな)。
0661659 (ワッチョイ ff80-g5j1)
垢版 |
2018/02/01(木) 23:02:59.65ID:iw8YX/Ps0
ポインタ・文字列を、図解して説明している

"abc" なら、"abc\0" みたいに4バイトになるとか
0666デフォルトの名無しさん (アウアウウー Sa5b-wbgk)
垢版 |
2018/02/03(土) 01:07:56.65ID:uJsu8afca
これからC言語始めます自分で色々と調べたけっかこの2つが残りました
どちらがいいでしょうか?アドバイス下さい。それやめとけなんて話もあればお聞かせ下さい

1,「C言語プログラミング」(ハーベイ・M. ダイテル/ポール・J. ダイテル 、ピアソン)
2,プログラミング言語C 第2版 ANSI規格準拠 B.W. カーニハン (著),? D.M. リッチー
0667デフォルトの名無しさん (アウアウエー Sadf-EZPO)
垢版 |
2018/02/03(土) 04:53:07.36ID:pNC8Ba1va
gcc
0668デフォルトの名無しさん (ワッチョイ ff80-g5j1)
垢版 |
2018/02/03(土) 06:09:55.21ID:5C9YCfZr0
巨匠の柴田望洋・林 晴比古とか、
「猫でもわかるC言語プログラミング 第3版」粂井(くめい)康孝、2013

古い本だと、例題の開発環境が古いから、動かせないだろ

「c言語 入門書 おすすめ」で検索!
0670デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/03(土) 10:38:20.76ID:zCLT35Li0
>>666
新しいことを学ぶときは
・バイブル的な本(K&R第2版)
・初心者向け
の組み合わせで。
片方だけではダメ。
0671デフォルトの名無しさん (ワッチョイ 77c9-VW3n)
垢版 |
2018/02/03(土) 12:45:56.09ID:YTn5lucX0
ちょっと教えてくらさい。

最近Cを書くことが多くなったんですけど

#include <Includes/General.h>
#include "Includes/General.h"

これって、本来の動作的に厳密には何か違いがあるんですか?
0673デフォルトの名無しさん (ワッチョイ 179d-duq4)
垢版 |
2018/02/03(土) 13:23:39.69ID:iWk8ZVwf0
>>671
#include <> はコンパイル環境指定のインクルードディレクトリから探索
#include "" はインクルードしたファイルのあるローカルディレクトリを先に探索してから環境のインクルードディレクトリを探索

つまり自分で今作ってるプログラムのヘッダファイルは#include ""を使わないと他人の同名のファイルをインクルードするかも知れない。
0674デフォルトの名無しさん (ワッチョイ 77c9-r4To)
垢版 |
2018/02/03(土) 14:54:39.21ID:YTn5lucX0
>>672-673

そういう事ですか、なるほど。
詳しくありがとうございました。勉強になりました。
0676デフォルトの名無しさん (ワッチョイ 179f-A9+C)
垢版 |
2018/02/03(土) 17:23:23.11ID:VDv79Nx+0
>>666
1は知らんけど2は絶対に読んだほうが良い本だと思うよ。
0679デフォルトの名無しさん (エムゾネ FFbf-EZPO)
垢版 |
2018/02/03(土) 19:06:23.67ID:VzdMwW3vF
いくら本読んでも本に頼ってるうちは初心者
書いて書いて書きまくってエラー出しまくって経験積め
0684デフォルトの名無しさん (ワイモマー MM5b-Rd6c)
垢版 |
2018/02/04(日) 11:15:43.36ID:snv+Mm9gM
>>168
トイプログラムはそうなるかもな。
0685デフォルトの名無しさん (ワッチョイ d7c3-YYog)
垢版 |
2018/02/04(日) 12:44:06.41ID:TVUXtLT70
初心者です。参考書を読んで勉強していたのですが
「浮動小数点数の利点は、一定の有効桁数(精度)の範囲内で、小さな数から大きな数まで表現できることです」(分かりやすいC入門編:川場隆)
とあったのですが、どういう意味か分かりま出んでした。
ネットで調べても同じようなことしか書いてなくて。浮動小数点数の利点を教えてください。
0686デフォルトの名無しさん (アウウィフ FF5b-EZPO)
垢版 |
2018/02/04(日) 12:49:52.12ID:D/BHnVHFF
利点と欠点が同時に書かれてるな
0687デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/04(日) 12:53:55.66ID:9kHA/gVX0
>>685
123,000,000,000=123×10^9

右辺の方がコンパクトだろ?
0689デフォルトの名無しさん (ワッチョイ d7c3-YYog)
垢版 |
2018/02/04(日) 13:24:01.43ID:TVUXtLT70
>>686
というと?
>>687
では、数字が少数になったらどうなんでしょうか?
例えば12469125478.945→1.2469125478945×10^10。これでコンパクトになっていると言えるのでしょうか?
>>688
すいません。固定小数点数と比べて、です。
0693デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/04(日) 13:36:20.20ID:9kHA/gVX0
二進数32ビットで123,000,000,000は表せないけど、
32ビットを符号部、指数部、仮数部に分けると表現できる。
有効桁数は仮数部のビット数で決まる。
0694デフォルトの名無しさん (ワッチョイ ff80-g5j1)
垢版 |
2018/02/04(日) 13:40:30.68ID:ue7FPdZ+0
例えば、8ビットなら、2^8 通り、0〜255 しか表現できない

それを5ビットにして、残りの3ビットを桁をずらす機能にすると、
2^5 通り、0〜31 しか表現できないけど、

残りの3ビットで、0〜7 を表現できるので、それをずらす桁とすると、
7桁ずらせば、310,000,000 を表現できる

だから精度は減ったけど、桁をずらせるようになったから、
非常に小さな数や、大きな数を表現できる

桁をずらす部分は、指数部という。
実際には、10進数ではなく、2進数でずらしていく
0695デフォルトの名無しさん (ワイモマー MMbf-aajP)
垢版 |
2018/02/04(日) 13:43:30.54ID:uz8VZN5uM
初心者質問おねがいします。

二つのunsigned char型があり、
一つ目が 0b10001000 で、
二つ目が 0b01110111 です。
これを合わせて 0b10001000 となる計算式はどうすればいいですか?
よろしくおねがいします。
0698デフォルトの名無しさん (ワイモマー MMbf-aajP)
垢版 |
2018/02/04(日) 13:59:02.90ID:uz8VZN5uM
>>696
すみません。
説明不足でした。
二つ目のchar型は刻々と変化するので、一つ目のchar型の各ビットを二つ目の各ビットが変わったら
そのビットだけ反転させたいのです。
よろしくお願い致します
0700デフォルトの名無しさん (ワイモマー MMbf-aajP)
垢版 |
2018/02/04(日) 14:13:06.96ID:uz8VZN5uM
>699

すみません。
超初心者なのでマスクとかよくわからないです。
単純に、一つ目のchar型の各ビットを二つ目のchar型の各ビットが変化したらそのビットだけ反転させたいだけです。
0701デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/04(日) 14:16:40.27ID:9kHA/gVX0
>>700
わかりにくい。
ビット単位で4パタン説明して。
0702デフォルトの名無しさん (ワイモマー MMbf-aajP)
垢版 |
2018/02/04(日) 14:25:23.15ID:uz8VZN5uM
>>701
すみません
こんな感じでわかりますか?

一つ目の初期値 0b11010110
二つ目の初期値 0b01001011


二つ目が0b01001010に変化

一つ目が0b11010111に変化させたい





二つ目 0b01001010
0703デフォルトの名無しさん (ワイモマー MMbf-aajP)
垢版 |
2018/02/04(日) 14:27:02.24ID:uz8VZN5uM
もう一例です

一つ目の初期値 0b11010110
二つ目の初期値 0b01001011


二つ目が0b010000111に変化

一つ目が0b11011110に変化させたい
0704デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/04(日) 14:27:32.63ID:9kHA/gVX0
>>702
なぜ話をややこしくする?
ビット単位で説明すればいいじゃん。
0705デフォルトの名無しさん (ワイモマー MMbf-aajP)
垢版 |
2018/02/04(日) 14:28:16.45ID:uz8VZN5uM
すみません
>>702の最期の行は不要です
0706デフォルトの名無しさん (ワイモマー MMbf-aajP)
垢版 |
2018/02/04(日) 14:30:17.33ID:uz8VZN5uM
>>704

ビット単位で比較してそれぞれ操作するしかないということでしょうか?
できればバイト単位で一括で操作できる方法があればとおもいました
0708デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/04(日) 14:35:53.94ID:9kHA/gVX0
>>706
だれがビット単位で操作するしかないと言ったの?
0709デフォルトの名無しさん (ワイモマー MMbf-aajP)
垢版 |
2018/02/04(日) 14:40:21.25ID:uz8VZN5uM
>>707

1、はい。全ビットは反転してはまずいです。
2、マイコンの入力ポートです。

>>708

すみません。
そんなつもりではありません。
ということは、自分の望む計算式があるのでしょうか?
0710デフォルトの名無しさん (ワッチョイ d78a-IOOI)
垢版 |
2018/02/04(日) 15:00:01.65ID:mpGHvQVh0
>>709
イメージとしては、二つ目の変数の変化をEXORで抽出しながら変更用マスクを作成
そのマスクで一つ目の変数と再度EXOR演算、これで二つ目の変更ビット個所だけ一つ目のビットが反転する

ざっくりとした流れはこんな感じ
一つ目の値(状態)a、二つ目の値(入力)b、入力比較用変数c、変更ビットマスクd
c = input(b);
while(1) {
d = c ^ input(b);
c = b;
a ^= d;
}
0711デフォルトの名無しさん (ワッチョイ 9793-d/ts)
垢版 |
2018/02/04(日) 15:18:24.98ID:tHspdphL0
ちょっと整頓させてくれ。

>>702 の場合
二つ目の unsigned char
01001011 ... 最初の値
01001010 ... 新しい値
00000001 ... 変化したビット

一つ目の unsigned char
11010110 ... 最初の値
11010111 ... 二つ目の unsigned char の変化にともない新たに取るべき値
00000001 ... 変化したビット (二つ目の unsigined char の変化したビットと等しい)

>>703 の場合
二つ目が0b010000111に変化 ... ビット数が増えとるやん!


>>710 の言う通り「二つ目」のビット変化をexor(^演算子)で抽出した結果を
「一つ目」のビットに作用させれば良さそうだけど、
「二つ目」のビットが1から0に変化したときには「一つ目」にはどう反映させたいの?
0712デフォルトの名無しさん (ワッチョイ ffe4-TMol)
垢版 |
2018/02/04(日) 15:33:13.79ID:F4VHcN9w0
>>710

ありがとうございます。
何となくですが少しイメージが浮かんできました。

>>711

すみません。

二つ目が 0b01000011 に変化の間違いです。
0713デフォルトの名無しさん (ワッチョイ 179f-wbgk)
垢版 |
2018/02/04(日) 15:44:44.53ID:fXO59JwO0
まずはやりたいことを普通の日本語で書け。
0716デフォルトの名無しさん (ワッチョイ 97b3-C7gl)
垢版 |
2018/02/04(日) 17:03:35.16ID:NeQWIMjc0
2つめ着目ビットが 0 -> 1 となったとき 1つめ対象ビットを 反転/0/1 にする
2つめ着目ビットが 1 -> 0 となったとき 1つめ対象ビットを 反転/0/1 にする

0->1 でも 1->0 でも 1つめ対象ビットを反転すればいいのけ?

new_1st = old_1st ^ (old_2nd ^ new_2nd);
0717デフォルトの名無しさん (ワッチョイ ffe4-TMol)
垢版 |
2018/02/04(日) 18:21:03.27ID:F4VHcN9w0
>>716

正にその通りです!
その式で思ってる通りに制御できました!
ありがとうございましたm(_ _)m
0718デフォルトの名無しさん (アークセー Sxcb-/IWG)
垢版 |
2018/02/04(日) 22:32:58.82ID:ZlHMYtZlx
全くの初心者です。
「2の3乗を求める」という計算プログラムを勉強しています。
最終的には3^1024を求めたいのですが。
ネットで見ていると30乗ぐらいまではプログラムがあるのですが
1024乗ぐらいになると難易度的に難しくなるのでしょうか?
0719デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/04(日) 22:50:53.35ID:9kHA/gVX0
>>718
3^1024=(3^2)^512

3^2≒10ってことで、だいぶ大雑把だけど

3^1024≒10^512

10進数で500桁以上の大きな数になりますね。
どの型の変数を使う?
0721デフォルトの名無しさん (ワッチョイ 9fb3-mP5N)
垢版 |
2018/02/04(日) 23:07:38.36ID:88eIJAAv0
>>718
やることは3に3を1,023回掛けるだけだから難しくはない
ただ>>719の言うようにかなりでかい値になる(ちょっとpythonで計算したら489桁だった)から普通のlong intとかではオーバーフローする
なので
多倍長整数 C言語
とかでググるがよろし
0725デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/05(月) 00:05:41.82ID:atUOEIz80
BCD(二進化十進)ライブラリを拾ってくるのが汚れた大人だけど、
若者は勉強のためにBCDライブラリを作ってみては?
0726デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/05(月) 00:06:32.23ID:atUOEIz80
おっと、更新せずに書き込んだらこんなことに(笑)
0728愛恥人
垢版 |
2018/02/05(月) 01:36:30.57
10進じゃないと0.1が無限に数字が続くらしい
よく分からんけど
0729 ◆QZaw55cn4c (ワッチョイ 9f60-soeb)
垢版 |
2018/02/05(月) 01:40:21.91ID:Qlm7SRQb0
>>728
10進だと 1/3 が無限に数字が続きますよね

それはさておき、多桁長+浮動小数点が落としどころではないかと
すると、BCD の意義がよくわからないのです
0734デフォルトの名無しさん (アウアウカー Sa2b-gGCH)
垢版 |
2018/02/05(月) 12:29:13.25ID:cbvE2oU2a
3進数なら歯切れの良い数なんだけどな・・・
0736デフォルトの名無しさん (ワッチョイ 179d-jn1r)
垢版 |
2018/02/05(月) 20:03:34.68ID:GlpP/XMd0
>すると、BCD の意義がよくわからないのです

科学技術計算は浮動小数点でいいが、リアルなお金の計算とかでは10進で計算するのがディフォールト
2進と10進では結果が大幅にちやうから。
ま俺の財産なら誤差0.1円くらいかもしれんが、、
0737デフォルトの名無しさん (スップ Sd3f-qmJt)
垢版 |
2018/02/05(月) 21:30:58.83ID:jWi5SYZhd
いま必死に考えてる
昔のCPUは絶対に持っていた機能だ
レジスタが8ビットだとすると、256以上のデータが表現できなくなるけど、そんなことはない
だから何か仕組みがあるはず
プログラマが勝手にこのビットが立ったら2の15乗だとか自由に決めて、8ビビットの重み付けをしてるんだとおもう
あとは計算と結果の表現次第だ
指数法則を使えばできそうだけど、これはなかなか面白い課題だね
0738愛恥人
垢版 |
2018/02/05(月) 21:36:06.47
ググれよw
0740デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/05(月) 22:00:56.57ID:atUOEIz80
ゼッパチ(笑)
0747デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/05(月) 23:40:30.69ID:atUOEIz80
Reno版のカーネルのソース読んだとき、
VAXのHDDのドライバが分かりやすくてビビった。
メモリマップドI/Oだた。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況