C言語なら俺に聞け 144
■ このスレッドは過去ログ倉庫に格納されています
>>489 ビットフィールドを使う組み合わせ分だけunionしろ。 C言語の登場当時に画期的だったのは構造体として自由に新しいデータ型を作り出すことが出来たことだった C++では更にデータだけでは無くて関数まで含めたデータ型がクラスに発展してオブジェクトの概念にまで到達した 要は構造体は新しい概念をプログラムの世界に持ち込むための手段 ベクトルや多次元空間といった概念も構造体によってプログラム内で直接取り扱うことが出来る様になる 配列の任意のところからの 6bit の抜出しってーと Base64エンコードの実装か? >>489 それはリトルエンディアンで考えるのかそれともビッグエンディアンなのか? まあいずれにしてもまずはその配列の型のビット数で割る必要がある。 配列のその要素の中に先頭のビットがある。 >>496 BASE64は3バイトを4つの文字に置き換えるんだから、3バイトづつ処理するコードを書けばいいんだよ。 4文字を3バイトに変える方も同じく4文字づつ処理するコードを書く。 そーすれば、必ず同じ位置からビットフィールド取り出す処理だけになる。 あれ?もしや俺の書いたお題を解くために質問してたのか? ま、頑張れ。調べていけば何れわかる。 >>495 > C言語の登場当時に画期的だったのは構造体として自由に新しいデータ型を作り出すことが出来たことだった PL/1, Pascalにもあったし、範囲型とかをサポートしないサブセットだよ? むしろポインタを陽に使える方が画期的だったな ポインタはPascalにもあるし、アドレスと紐ついているというのが 受けたんだと思うけどね >>506 ああすまん、陽にって言うより自由に使えるって書いた方がよかったかな >>502 EBSDICとBase64にどういう関係が? バイナリならなんでも変換できるんだから特定のコードは関係ないだろう。 >>507 ここでのポインタが自由に使えるの意図は>>495 の構造体に対する考え方と本質的に意味することは同じだろ 要は言語としての設計思想というか考え方の問題であって、画期的の意味は最初という意味では無いということ >>509 意味不明 >>510 バカの上塗り w 二番煎じ画期的とは言わない 画期的 これまでとは時代をくぎるほど目覚ましいさま。 新しい時代をひらくさま。 エポックメーキング。 https://dictionary.goo.ne.jp/jn/42567/meaning/m0u/ C言語はその生い立ちがUNIX のシステム記述のためのツールだからね 画期的ではあっても全く新規の考えというものを指摘するのは難しい 当時の構造化言語のアイデアをひとつの言語として完成させたことが最大の特徴 >>508 両方のコード表見比べて関係が判らないなら病院いけ Base64 の話に EBCDIC とか言う奴の方が行くべきだろ w =とか ==で埋めるんじゃないの? 0埋めで変換したら結果違わなくない? 2バイト用と1バイト用のテーブルなんてちょろいでしょ C言語学習中だけど企業等々でどんなことに使われてる? >>524 OS、組み込み、速度が要求されるゲーム、数値計算など。 >>524 純粋なC言語が使われているのは、リソースが厳しい組み込み分野と、他にはプログラミングの教育や学習の分野がほとんど全て 実用的にはC++への通過点といった感じで考えておいた方が無難 CとC++の使い分けは結構曖昧で緩い感じだけど意識しておいた方が良い 両者をまとめた適用分野で言えば>>525 あたり しかしなんというか、C++は発展させすぎて難しくなった感があるな。 C++ってWindowsネイティブアプリ以外で使われてるのあまり見ないような気がするんだけど。 Windows用で使われる理由は歴史的な理由で、もしこれがなければC++って廃れてないか? >>527 > 実用的にはC++への通過点といった感じで考えておいた方が無難 ダウト。 というか個人的には俺もそう思っていたが、どうも実際はそうじゃない。 https://www.tiobe.com/tiobe-index/ https://techacademy.jp/magazine/8735 あまり毛嫌いする必要もないはずなのだが、C++に乗り換えてない奴らも相当数いる。 理由は>>528 の言うとおりで、C++は若干暴走気味だよ。 Linusの言う「無駄に抽象化しすぎて話を余計にややこしくする馬鹿が多すぎる」というのも当たってる。 とはいえクラス構文すら入れないCのかたくなな姿勢はどうなのよ?とも思うが。 「なんとなくアセンブラコードが想像できるところまで」 というのがC言語で実装する機能の上限だと思う。 まあ実態とだいぶ乖離しているが、最適化を切ったとかの前提でひとつ 個人的にはクラス云々よりもC言語では関数のオーバーロードやデフォルト引数あたりが使えないのがもやもやする というかあまり詳しく調べてないけど、最近のC言語の仕様改定で標準化とかされてなかったよね? 大抵はC++の処理系を利用しているから有耶無耶で利用している人も多いと思うけど stdarg (... とか va_list) とマクロで出来んか 個人的には評価が確定した物は入れればいいと思ってる。 クラス(またはプロトタイプ)が使えない実用言語なんてほぼ無いわけでさ。 ただ、 > 「なんとなくアセンブラコードが想像できるところまで」 (>>530 ) が標準化委員会の指針なら、今の姿勢も分からんでもないが。 >>531 > 関数のオーバーロードやデフォルト引数あたり 実はここは評価が確定してない。 というか、どっちかがあれば大体解決する。 VC++/CLIではデフォルト引数は禁止でオーバーロードのみ。 JavaScriptはオーバーロード無しでデフォルト引数は常にundefinedのみ。 いずれも大した問題はない。 C++は壮大な実験場と化しているから、 Cはありがたくその結果だけを受け取って緩やかに発展させればいいと思うのだが。 余計なもん要らんからクラスだけ追加したC+で頼む。 >>534 >実はここは評価が確定してない。 そんなに揉めるような機能か、これ? 特にオーバーロードなどは今すぐにでも導入されれば、似たような関数名であれこれいらんこと考えずに済むのでメリットしか考えられないんだが デフォルト引数もあっても悪いものではないだろう クラスの導入のように現行のC言語の規格を大きく変更(デメリットも含めて)することなく、簡単に言語の使い勝手を向上させるお手軽な改善だと思っていたんだが違うのか >>537 > ●java > デフォルト引数なし.オーバーロードはあり. > ●python > デフォルト引数はあるが,オーバーロードはなし. > https://plaza.rakuten.co.jp/redbeeshrimp/diary/201112240001/ 理由についてグダグダ言っている奴は他にもいたはずだが、例えば以下。 http://ufcpp.net/study/csharp/sp4_optional.html > 余談: なんでいまさら? 以降を読んでみればいい。 型あり言語は型違いで無駄に同じ趣旨の関数が氾濫することになるから、 オーバーロード/テンプレート/ジェネリクスのどれかはあった方がソースは綺麗になる。 だから型無し言語(JavaScript/Python)はオーバーロード無しでデフォルト引数だけ、というのもまあ妥当な線だろう。 ならば、テンプレートを持っているC++は、 オーバーロード無しで、デフォルト引数+テンプレートだけで綺麗に書けるか、という話になる。 多分これもやれば出来るんだよ。 勿論そこに出ている「名前付き引数+テンプレート」でも綺麗に書ける。 どれを言語に取り込むべきか、ということに関して、C++は「全部入れちゃえ」というノリだからいいとして、 Cみたいにミニマムで美しく、というノリで「どれかにしろ」と言われたらちょっと迷うだろ。 Linusは多分オーバーロードすら要らん、という立場だぞ。 ちょっとググってもすぐには出てこなかったが、 「Cはこれについて馬鹿みたいに単純な方法(別の名前を付けること)で対応している。 実際、これはgrep出来るしメンテしやすい」 と言っていたはず。 まあ分からんでもないだろ。オーバーロードすら無しならgrepした関数に確実にそのまま当たる。 ソースを追うという意味ではこちらの方が当たってる。 オブジェクト指向の継承が良くない点の一つは、ぱっと見、どの関数が実行されるか分かりづらい点であってさ。 勿論、「分からなくていいし、分かる必要がない」というのがオブジェクト指向のノリだとしてもね。 あまりにミニマムすぎるとみんなが好き勝手なマクロを作って「僕が考えたエレガントなコーディング」を始めるから少しは高級な記法を用意しといてくれや うーん。Cはアセンブラ代わりの単純な言語にしておいてそれ以上の事は別の言語でやればいいような気がするが。 丁度よい言語が見つからないなら作れば良い。自分で作れなくても仕様を公開して作ってくれる人を募集すればその内誰か作ってくれることだろう。 >>537 関数のオーバーロードは、リンク時の対応にアセンブラ互換性がとれなくなるので、お手軽ではないと思う extern "C" を追加するか?え、C に extern "C" って意味わかんない… >>541 おまえさんの言っていることこそ意味わかんない >>542 C++ 名前マングリングを指していたんだが… >>543 defファイルのことだとしたらしょーもねーな CはUNIX思想の根源みたいなもんだし、十徳ナイフみたいな機能はいらんでしょ どうしてもって人はC++使えばいいだろ そのためにできたようなもんだし 質問答えてくれたら嬉しいです 配列の中身をfprintfでエクセルに書き込む方法を教えてください fprintf(fp,"%3d , %3dn",0,value) のように一変数を書きこむ方法は分かるのですが配列のすべての要素を書き込みたいです >>546 Excelじゃないとだめなの? CSVファイルとかじゃあかんの? エクセル言ってるんだから、エクセルクラスモジュール組み込んでライブラリ使うんだろ? Csvだろうな。 です for()で fprintf(format,array[i]) を回せばええんちゃうん? なんの考えもなしに愚直に書くとこういうことがやりたいです long value[100],k; for(k=0;k<100;k++){ value[k]=500; } fprintf(fp,"%3d,%3d,%3d,%3d,%3d・・・,%3d\n",0,value[1],value[2],・・・value[100]); for (k = 0; k < 100; k++) { if (k) putchar(','); fprintf(fp, "%3d", value[k]); } putchar('\n'); あ、間違えた。putchar() じゃなくて putc() にして fp に対して出力に書き換えて。 >>553 ありがとうございます! fprintf(fp, "%3d", 0); for (k = 0; k < 100; k++) { putc(','); fprintf(fp, "%3d", value[k]); } putc('\n'); であってますか? >>555 それでいいなら fprintf(fp, "%3d", 0); for (k = 0; k < 100; k++) { fprintf(fp, ",%3d", value[k]); } putc('\n', fp); でいいかと でも1バイトずつ出力なんて普通はしないで 行くらいはまとめて出力するやろ? char buf[405]; /* 3桁数字×101個 + カンマ100個 + 改行 + 「¥0」でMAXサイズ決め打ち */ size_t pos; /* 1行処理開始 */ pos = 0; sprintf(&buf[pos], "%3d", 0); pos += 3; for (k = 0; k < 100; k++) { sprintf(&buf[pos], “,%3d", value[k]); pos += 4; } sprintf(&buf[pos], “¥n”); pos++; /* buf[pos++] = ‘¥n’; buf[pos++] = ‘¥0’; でもいいけど */ fwrite(&buf[0], 1, pos, fp); /* 1行処理終了 */ 惜しいな。 >>555 putc() または fputc() の引数は文字コードと出力先FILE*の2つだ。 >>557 fprintf()のようなFILE*経由の出力はライブラリの中でバッファリングされるように なっているので(自分でそのバッファの大きさをいじるのでない限りは)まとめて 出そうとかは考える必要がない。考えた方が良いのは write() で直接出力する 場合だ。 もう一つ質問させてください long型の配列に空白を入れることは可能でしょうか? >>556 ありがとうございます long array[] = {1, 2, 3, ' '}; memset(array, ' ', sizeof(array)); 配列に空白を入れるというのは、配列のどこかに、空白文字の文字コードを表す整数値を入れるという意味になる。 文字コードは、文字リテラルか整数リテラルで指定できる。 配列の初期化で int arr[10] = {}; と空に書くのは本来は行儀悪いことなんだな int arr[10] = {0}; と最低1個は書かないとだめなのか cの初心者抜け出したいんだがgithubってのを使えばいいの? (アスキーコードを使ってる仮定で) SPC文字 と 整数32 は等価 より大きいサイズへの整数への格上げも素直に行われるだろう long a = ' '; long b = 32; // a と b は等しい 元質問 >>565 「long型の配列に空白を入れることは可能でしょうか?」における 空白とはなんぞや?が ' ' でいいのかどうかは知らん >>579 min という変数がポインタだとして、min の指し示すところに 100 を代入する、という意味になる 部分だけではよくわからない場合もあるので、可能ならば全体を https://ideone.com に張ってもらえると、もっと解説できるかもしれない ロング型に文字入れてもprintfできないのに何の意味があるのか分からん 上位ビットのほうををフラグに使って下位は文字そのまんまかもしれんじゃん まぁ 構造体・共用体でやれって話になるが >long a = ' '; >long b = 32; >// a と b は等しい long a = 0; long b = '0'; a と b は等しくない #include <stdio.h> void maxmin(int array[],int max,int min); int main(void) { int i = 0,array[10],max,min; do { printf("%d 番目の数:",i + 1); scanf("%d",&array[i]); i++; } while (array[i - 1] != -1); maxmin(array,&max,&min); printf("最大値 %d : 最小%d\n",max,min); return 0; } void maxmin(int array[],int max,int min) { int i = 0; *max = 0; *min = 100; while (array[i] != -1) { if (array[i] > max) max = array[i]; if (array[i] < min) min = array[i]; i++; } } × void maxmin(int array[],int max,int min) ○ void maxmin(int array[],int *max,int *min) × if (array[i] > max) max = array[i]; ○ if (array[i] > *max) *max = array[i]; × if (array[i] < min) min = array[i]; ○ if (array[i] < *min) *min = array[i]; ポインタ使わずに記述してて、呼び出し元に結果かえってないじゃーん から、慌ててポインタに変えた感じかな? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる