C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
「新スレッドは○番に書き込んだ人が立てる」みたいなガイドラインを
テンプレートに盛り込んだ方が安心じゃないかな。
前スレッドの終了まで新スレッド(ここ)が立たなかったし、
999番で「誰か立ててくれ」と書き込まれたのに応じて
「立てたよ、リンク先は…」と誘導に使われるべき1000番が
無意味な「あぼーん」で潰されたし。 前スレへのリンクがあって、スレタイにも番号がついてるわけで
1000いったら次スレなんて言われんでもわかるし望む者がいるから立っている
それだけのことで、別に何かする必要はないと思うな data8<7-0> にdata32<31-00>の中のdata32<07-00>を抜き出して代入したい
data8 = data32 % 256 ;
と書いてもコンパイラが素直に推論してくれません
キャリー処理のコードっぽいものをつけてきやがります
どうしたらいいでしょうか? あまりにも挫折者が多すぎる
教え方が悪いとか例題が少ないとかじゃねえのかと
変数とか言うふわふわしたモンがいきなり具体的なものになるから分かりにくいんじゃないのかね
メモリとかアドレスとかいきなし言われても分んねーよ、とかなるし
しまいにはアドレスの値だって気にかけなくなる
いきなり「変数は値と場所、二つの数字をもちます」とか言われると混乱するんだよ >>8
君の言いたいことがよくわからない。とりあえず全部日本語に翻訳してくれ。 ビットが取れればいいだけなら、data8 や data32 の型を符号無しにするだけで
いけそうな気もするが、よく分からん >>13
こーゆー事?
data8 = data32 & 0x000000ff;
適宜 cast してね printf で
data8 の実際の型にあった表示フォーマット使ってなかったとかのオチ?
(data8 の最上位ビットが足ってるとかサ- int *a = 0;
*a = 1;
これは入るけど1は入るん?0の番地って存在するん? >>16
ワープに成功しましたってメッセージが出る >>8
「リテラルの数値256での剰余だから結果の範囲は0-255、
unsigned char の範囲からはみ出す可能性はない」
ということまでコンパイラが見抜いてくれないってことだよね。
data8 = (unsigined char) data32;
てな具合に明示的なキャストで上手くいかんかな。
あるいはコンパイラの最適化オプションを強めにするか。 ちょっと勘違いしてました
>>8の質問はとりさげます
ちなみに%256の推論はしているみたいです リファクタリングして短いコード吐くかなと思ったら
がんがんループ展開されて元より長いコードを出すこともあるよね 希望的観測でタカをくくって結果を見もしないやつが一番悪い >>16
現代のマルチタスクOSではアドレスをずらしたりして0番地付近は見えなくされる
じゃなかったかな 物理0と論理0が違うってのなら、仮想記憶なOSなら
普通そうだよ >>16
ヌルポインタに関しては、なんかややこしい事情があるみたいね。
規格ではいかなるオブジェクトとも一致しない特殊なポインタってことになってるようだけど、
自分が使ってる組込み用のコンパイラではただの 0 になる。しかも0番地から普通の RAM なんで、
値も普通に格納される。
どうなるかは確認するしかないんじゃなかろうか。 >>20
32bitの範囲の数値を8bitの最大値で割るんだから
最大24bitの数値になるんじゃないの?
data8 = *(unsigined char*) &data32;
リトルエンディアンだと仮定するとこうなると思う すみません
剰余を除算と勘違いしていました
無視してください >>16
あるけど今時のだいたいのOSではアクセスすると例外発生してプログラムが停止させられると思う。
そうでなくてもCPUによってアドレス0付近が特別扱いされている事が多いのでアクセスできたとしても要注意だったりする。
なのでそういうのが必要な時というのはOSそのものやデバイスドライバを作る時ぐらいしかないと考えて良い。 最近ヤフー知恵袋で初心者なんですけど将来プログラマになりたくてC言語やってみたいんですけどどうですかって
質問が多いがプログラマが時代の流行になってきたか? >>31
おすすめの本やらおすすめの開発アプリやらおすすめのサイトやら学校のカリキュラムの評価やら色んな質問が多いしC言語やるならC#やった方が良いと思うんだけどなstring型ないだけで文字列処理とか大変だし不規則な空白・カンマ区切りとかの処理大変だし
そうゆうのを除外してくれる関数あるから楽なのになC言語はchar型で文字列操作してから処理しないとint型にしたりするのが大変だからな 義務教育のカリキュラムなもんで実用性の1側面に問題の作り易さもある
ペーパーテストにはうってつけだろC言語は 教育だと一般性ってのも考えなきゃならないからね。
次々出てくる「Cを改良したネット時代の言語」とかの新しいやつも
10年たったら別の新言語と置き換わってるかも知れないし。
その点、Cなら古くさくても基本として残ってるだろう。
資格試験はまた別だがね。時々変えないと商売にならん。 Cは一人でやるとちょっとしたミスで手も足も出なくなるから論外
右も左も分からない初心者に基本はC言語とか言い出すヤツは老害 package test;
class Test
{
public static void main(String[] args)
{
System.out.println("test");
}
} 組込やOS開発まで視野に入れるとCが一つの王道なのは間違いない
初学者にすすめるべきかと聞かれるとそれはまた別の話 >>35
それはお前が無能てだけだろw Cなんて仕様がコンパクトだから簡単だわ 実際に使うには多くの仕様外な環境依存のことを理解しないといけないから
C言語を勉強してもC言語は使えない 環境依存の部分はどんな言語でも影響受けるから結局は覚える事になるんじゃないのかな その前に開発環境を整えるのが大変だわプログラミングはできるけどそれぞれ出してる開発アプリがあるしその中で開発ツールだっけXNAやらwin32やらで解らんことばっかりや 大抵「C言語は何でも出来る」(嘘ではない)
に騙されるパターンだね キャリーを含む9bitローテートか
それとも含まない8bitローテートか 性能優先ならインラインアセンブリでCPUのローテート命令かねぇ。
移植性が大事なら正直にマスクしてシフトしてビットorで重ねる。
8bitや16bitならテーブル使えば両立できるかな。 苦C勉強してるんだけどファイルの辺りって重要?
あんま考えずにやってたんだが ストリームの概念はUNIX譲りの万能概念だから未来永劫絡んで来るぞ。 fdopen / fileno を理解すれば大体は困らないかと 初心者です。
4ビット目以降に文字(ASCII3文字)が格納されてる場合、どうやって取ればいいですか? char c1=data&0b000000000000000011111111000;
char c2=data%&0b000000001111111100000000000;
char c1=data%&0b111111110000000000000000000; ファイルとストリームを結びつけるのって、具体的に何がどうなってるんですか?
その辺りがわかるサイトや書籍があれば英語でもいいので教えていただけるとありがたいです long n = 12345678;
n >>= 4;
putchar(n & 0xFF);
n >>= 4;
putchar(n & 0xFF);
n >>= 4;
putchar(n & 0xFF); >>63
LinuxなどのオープンソースのOSのカーネル部分を読めばいい。
Windowsのカーネルは、非公開だが、ReactOSで近いものが読める。 >>63
これ普通はどうやって勉強すんだろうな 興味あるわ
おれはいきなりデバドラ書かされたんで理解を強制されたけど
あのへんの概念なしで腑に落ちる理解できるもんなん? >>65
なんでファイルとストリームの結びつきでLinuxカーネルが出てくるの? >>68
ストリームを作ってるのがカーネルだからだろ。 >>68
CランタイムならLLVMのlibc++か、GNUのlibstdc++を読めばいい。
カーネル見ずに読めればね。 >>60 0b...で2進数のリテラル表現ってできるんだっけ?
>>64 エンディアネスに対する配慮が…。 8進 16進はあるけど 0b... な2進リテラルは余所の言語じゃね? int bigendian(void)
{
union { int i; char c[sizeof(int)]; } u;
u.i = 1;
return !u.c[0];
}
この関数でエンディアンをチェックすれば? XScreenSaverから拾ったものだけど。 union endian_checker_union
{
int i; char c[sizeof(int)];
} endian_checker = { 1 };
#define IS_BIG_ENDIAN() (!endian_checker.c[0]) >>70
なんでC言語の話でlibstdc++が出てくるの?
fopenやらのストリームなんて、setvbufの説明読めばバッファリングしてるだけって理解できるだろ
カーネルやらlibcのソースなんて読む必要性なんてねーよ ストリームなんて、なんでもかんでも先頭から順番に処理するってだけの概念だけどな。
ランダムアクセスメモリーも読み飛ばしと巻き戻し駆使してアクセスするのさ。 >>75
こんなのどう?
#define IS_BIG_ENDIAN (htons(1) == 1) >>64
そういえばそれ、それでいいの?2回目以降は n >>= 8 では? >>79
それって、htons()のあるライブラリ間違えたら全く意味が無いマクロだよね? >>72
接頭辞0bは今どきのgccで普通に使えちゃうんだなこれが なので、質問者も回答者も 「ほんとはダメだけどgccならこうよ」
みたいな但し書きを一筆しとくべきだね >>82
ライブラリというか、ヘッダだな。#include <arpa/inet.h> とか。
コンパイラにもよるだろうけどだいたいはヘッダの中だけで #define されているか
ビルトインの関数に置き換えられるかインラインアセンブラになるか、適当に
うまいことやってくれると思う。(CPUが Big endian なら #define htons(x) (x) に
なってて何もしないだけになるかも知れない)。
それと一応 POSIX.1‐2008 のようなので使えるコンパイラは多いんじゃないかな。 今ってC言語でwin32とかで作るアプリに基本構造とかなしで作る感じなの? イベントを拾って条件分岐みたいな部分は全部関数内に隠蔽された。
今は決まった名前のコールバック関数を埋めるだけのお仕事。 実行時に必要なメモリーサイズが決まるようなプログラムだと必要。
最初から大きなメモリーを確保しても無駄になるかもしれないし、
当初想定したサイズでは足りなくなるかもしれない。
そういうときに使う。 組み込みでは1度大きく確保したら後は自前で中身やり繰りするから、あんまり使わない。 VS2017でやってるんだがファイル分割ってどうやるんだ Visual Studio 2017 Part4
https://mevius.5ch.net/test/read.cgi/tech/1509244956/
左のファイルのツリーで 項目の追加 で 新しく .c のソースファイル名指示すれば
勝手にコンパイルとリンクのターゲットにしてくれる (予定 >>94
組み込みって言ってもこの頃は最初から Linux 動いてるようなのもあるからな。
今は昔と違ってかなり自由度が高いのもあるんじゃないかな。 Linuxだからって、メモリーリークが無くなるワケじゃ無いからなぁ〜。 >>94
組み込みではどの処理にどれだけメモリを使うかは、
設計で決まるだろ。 ■ このスレッドは過去ログ倉庫に格納されています