C言語なら俺に聞け 157

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 0345-kMi9)
垢版 |
2021/06/28(月) 11:22:51.50ID:so+vl3vs0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
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言語なら俺に聞け 156
https://mevius.5ch.net/test/read.cgi/tech/1601271690/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/09/22(水) 19:31:52.27ID:u8cZI69ma
>>655
ありがとうございます

はい、char と char でもダメですね
データ型がことなれば、リンケージできないのではと思い実験してみました

定義側でメモリに配置されているのは値で、extern宣言で参照する側が期待するのはポインタが配置されていることなのでうまくいきませんね(違うかな)
2021/09/22(水) 19:34:04.23ID:u8cZI69ma
>>656
こちらで先に指摘がありましたね
2021/09/23(木) 08:15:49.41ID:0q4HMCJB0
>>638
変数に対しても型情報付加したマングリングするぐらいかねぇ?
2021/09/23(木) 10:00:32.79ID:HaJtCNmP0
>>661
アセンブラがリンクできなくなるからヤダ
2021/09/23(木) 10:02:57.46ID:HaJtCNmP0
>>657
thx a lot !
日本語訳は太古の昔から有名どころ、ただし C89 の話だったかも http://www.kouno.jp/home/c_faq/c6.html#0
2021/09/23(木) 13:38:03.01ID:HaJtCNmP0
>>658
ほとんどプロの人‥‥完璧なアマは私くらいですか
2021/09/23(木) 16:56:05.29ID:pKS1sRJG0
COFF フォーマットを見てるんだが、
関数が返す値の型を格納するところは有っても引数の型については無いみたいだ。
http://delorie.com/djgpp/doc/coff/symtab.html
ヘッダファイルで型情報をやりとりする前提なんだな。

ELF だとたぶん詳細な型も入れられそうな雰囲気があるんだけど複雑でようわからん……。
666デフォルトの名無しさん (ワッチョイ d31b-QjBH)
垢版 |
2021/09/24(金) 19:26:12.39ID:bEXGgTP60
もしかしてc言語って新たにブロック文つくったら構造体の二重定義って可能になるんですか?
試しに
{
struct a{};
{
struct a{};
}
}
ってcompiler explorerで打ち込んだらcompile通りました。
こんなの初耳です。
ちなみに同じブロック文で二重定義したらcompile errorが起こりました。
2021/09/24(金) 20:31:56.55ID:B0dAhYuN0
>>659
今回の例でもわかるように、無節操にバンバン extern 宣言を複数の C ソースファイルのあちこちに混入させるのは非常にマズイので、
普通はサブモジュールの extern 宣言だけを別のファイルにまとめておいて、そのサブモジュールを使用するソースで #include するのが標準的です
この extern 宣言だけをまとめたファイルを特にヘッダファイルと呼びます
https://ideone.com/rdbae2
実体を定義したサブモジュールもヘッダを #include するようにしておけば、ヘッダの誤りも検出することができます

なにかこういう基本文法を終えた後に位置するべき基本的な作法集をまとめたアドバンス教科書、みたいなものはないものでしょうか?
2021/09/24(金) 20:48:31.47ID:PKobCCv1a
>>667
ありがとうございます
>>659 == >>621 です

621にもあるとおり、僕もこのような extern宣言を使用したことがありません
他に変数の宣言の例が思いつきませんでした…
2021/09/24(金) 20:54:31.27ID:B0dAhYuN0
>>666
使い道はわからないけれどもできるようですね‥‥無名構造体・異ネスト同一識別子で試してみました
https://ideone.com/eXiadC
670デフォルトの名無しさん (ワッチョイ d31b-QjBH)
垢版 |
2021/09/24(金) 22:23:44.15ID:bEXGgTP60
>>669
レスありがとうございます
確認してみましたが
この例でなされてるのはdeclarator中の構文要素であるidentifierの例であって、>>666でなされているようなstructトークンとleft-braceトークンの間にあるidentifierを同じのを二度使っている例にはなっていないとおもいます。
僕は後者の仕様は、同じ変数名が複数ソース上にあるとき現在の位置から見て最も内側のブロックで宣言されたものの方で解決するという当たり前の規則だと認識してます
僕にとって謎だと感じるのは前者の仕様です。cの規格のどこからきているのか気になります
671デフォルトの名無しさん (ワッチョイ d31b-QjBH)
垢版 |
2021/09/24(金) 22:25:13.81ID:bEXGgTP60
>>670
すみません。
このレスの前者は後者に、後者は前者に読み替えてください
間違えました
2021/09/25(土) 06:49:29.05ID:YrZFQiAF0
>>670
https://ideone.com/ORzF28

もう、結論はお出しになっているかと‥‥考えます
規格の話は苦手なのでごめんなさい
2021/09/25(土) 11:02:06.77ID:dAtBdpVF0
>>670
> 同じ変数名が複数ソース上にあるとき現在の位置から見て最も内側のブロックで宣言されたものの方で解決するという当たり前の規則だと認識してます

その「当たり前」の規則は変数名に限ったものじゃくて構造体タグ名についても同じ規則が適用される。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf
6.2.1 Scopes of identifiers
> A label name is the only kind of identifier that has function scope. ...
>
> Every other identifier has scope determined by the placement of its declaration (in a declarator or
> type specifier). ...
> ...
> ... the scope of one entity (the inner scope) will end strictly before the scope of the other
> entity (the outer scope). Within the inner scope, the identifier designates the entity declared in the
> inner scope; the entity declared in the outer scope is hidden (and not visible) within the inner scope.

ただし変数名とタグ名とでは名前空間 (name space) が異なる。
674デフォルトの名無しさん (エムゾネ FF32-kEnG)
垢版 |
2021/09/25(土) 11:05:50.70ID:lBxoEpbFF
{
int a;
{
int a;
}
}
とやってることは同じ
2021/09/25(土) 16:07:19.71ID:Uwq7lnPV0
>>666
二重定義じゃなくて、入れ子構造の中での定義にすぎないからでは?
イメージとしては、コンパイラとしては、外側の構造体は
struct XX_a {}
内側の構造体は
struct X_a_a{}
みたいな感じで管理してコード展開してるだけ。
676デフォルトの名無しさん (ワッチョイ d31b-QjBH)
垢版 |
2021/09/25(土) 16:37:10.46ID:g8iabg1P0
>>673
出典出してくださってありがとうございます
declarator内かtype specifier内かどっちかで現れたかにも関わらず識別子には同じような規則が適用されるのですね
この知見を趣味のコンパイラづくりに役立てたいと思います
ありがとうございました
677デフォルトの名無しさん (エムゾネ FF1f-jOtc)
垢版 |
2021/10/04(月) 14:36:02.21ID:ly3pkK+7F
int a = -4 % 3; // -1
int b = -3 % 3; // 0
int c = -2 % 3; // -2
int d = -1 % 3; // -1
int e = (-4) % 3; // -1
int f = (-3) % 3; // 0
int g = (-2) % 3; // -2
int h = (-1) % 3; // -1

これは仕様ですか?環境依存ですか?
2021/10/04(月) 14:53:49.95ID:DbNnxaRn0
C90は実装による
C99は被除数と同じ符号 ((ISO/IEC 9899:1999) の 6.5.5 見ろ)ってwiki に書いてあったけど

6節の (a/b) * b + a % b === a と
整数化に際しての丸めの方向から結果的にそう解釈すればいいってことなのかな
2021/10/06(水) 19:35:08.68ID:7g8s0ol20
まあ環境依存だと割と困ってたので
C99でIntelの実装にあわせただけなんですけどね
2021/10/07(木) 15:44:53.27ID:UkaMQ5gY0
>>677-678
C89 で符号が確定して欲しいときには div 関数があるよ。
これの符号は C89 のときから C99 以降の / や % の挙動と同じ。
2021/10/12(火) 19:07:27.42ID:4loHRlApd
配列から数個おきに取得するとき、なにかアルゴリズムとかライブラリ関数みたいなものってありませんか?
↓みたいなコードです。nが大きく、物凄い時間掛かっていて...

for(i=0; i<n; i++) a[i] = b[i*3];
2021/10/12(火) 19:16:28.78ID:bbG44xQB0
boostとvalarrayによる方法がみつかった
https://stackoverflow.com/questions/8404822/create-a-subvector-from-regularly-spaced-elements-of-another-vector
https://en.cppreference.com/w/cpp/numeric/valarray/slice
2021/10/12(火) 19:22:19.41ID:xFkpIt2+0
>nが大きく、物凄い時間掛かっていて..

オンメモリーで扱えていなさそう
2021/10/12(火) 20:33:05.08ID:1lOq7tfe0
a書とb読で互いにページ追い出されてスラッシングみたいになってんのかねえ
2021/10/12(火) 20:59:19.20ID:UHyGo8Qe0
それ、3個おきという意味?
2021/10/12(火) 21:57:57.62ID:TH86hbHp0
皆様ありがとうございます、Cだとなかなか難しそうですね...
データは数百MBくらいの画像で、mallocで確保した領域にあります。

RGBRGBRGB・・・からRだけを取り出す、みたいな処理で、
頻出しそうだし何かうまい方法あるんじゃないかと思ったんですが。
2021/10/13(水) 00:46:23.98ID:5Y743A290
>>686
ちょっと試してみた
a[] 100MB, b[] 300MB の配列確保して、
配列bを適当に初期化したあと
a[i] = b[i*3]; を実行してみた
それしかしていないが処理は1秒程度だった

64bit環境でメモリ16GB、i7 6700k skylake 4GHz
手持ちのコンパイラは Microsoft(R) 32-bit C/C++
Optimizing Compiler Version 16.00.40219.01 for 80x86

参考になるかな
2021/10/13(水) 00:54:53.24ID:MLaNN2iaa
8ビット無駄になるけど、RGBを 32ビットの整数として、>> と & では?
2021/10/13(水) 00:55:52.69ID:MLaNN2iaa
バイト境界より速いかも
2021/10/13(水) 01:22:15.55ID:l1MPihFP0
単純な方法でもいうほど遅くなるわけない
最速を目指すならSIMDでやれ
2021/10/13(水) 02:10:45.46ID:5Y743A290
>>686 の説明文で触れてない重たい処理があるのかもしれん
2021/10/13(水) 12:24:48.28ID:89OLuObV0
ループ内で他の事をすると格段に遅くなったので(コンパイラの最適化の関係でしょうか?)
他の処理はすべて外に出して、書いた処理だけにしてる状況です。

ちょっとした実験に使いたいコードで、装置からの出力がだいたいGByte/sくらいなので、それに追い付く処理速度が理想なんですが...
並列化勉強しないと無理ですかね...

>>687
テストまでありがとうございます、こちらでもそれくらいのオーダーでした。
環境のせいではなさそうで安心しました。
2021/10/13(水) 20:54:31.47ID:B1aurOR80
他の事したらキャッシュの効率落ちるわな
GByte/sってSATA3の速度超えてる
リアルタイムに加工するのはまだまだ無理なんじゃ
2021/10/14(木) 07:22:07.33ID:IjEclFwpd
FPGAの出番だな
695デフォルトの名無しさん (ワントンキン MM56-e7Yh)
垢版 |
2021/10/14(木) 08:48:28.90ID:RLbfxynZM
サイズが全然違って参考にならないかもしれないけど、以前テスト用の音声データのサンプリングレート落とす時に似たような事やった時は、a[i] b[j]でi++,j+=3みたいにやった方が早かった記憶。
696デフォルトの名無しさん (ワッチョイ 4f54-e7Yh)
垢版 |
2021/10/14(木) 16:42:28.33ID:1iGiane/0
>>692
コード見てないからなんとも言えないけど、本当にそのループだけで1秒ってのは時間かかりすぎじゃないかな。
このコードでgcc 最適化オプションなしでも0.3秒、-O2なら0.000002秒。
5年くらい前のCore i7 3.3GHz メモリ16GB

勘違いしてないか心配だけどコード。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
int count = 100*1024*1024;

unsigned char *a = (unsigned char*)malloc(count * sizeof(unsigned char));
unsigned char *b = (unsigned char*)malloc(3 * count * sizeof(unsigned char));

clock_t t = clock();
for(int i = 0;i<count;i++){
a[i] = b[i*3];
}
t = clock() - t;
printf("%f\n",(double)t/CLOCKS_PER_SEC);
return 0;
}
2021/10/14(木) 17:04:51.16ID:LTwSvEh70
>>687 だが、正確に測定したわけではない

>物凄い時間掛かっていて...

こういう質問だったので、そんなにかからないよという程度の返事
ものすごい時間が掛かると言う処理の内容が分からないとこれ以上は・・・
2021/10/14(木) 18:27:12.03ID:ciTZIm8Y6
それは最適化で消えただけだ
699デフォルトの名無しさん (ワッチョイ 4f54-e7Yh)
垢版 |
2021/10/14(木) 18:45:28.00ID:1iGiane/0
>>698
ですよねw -O2で0.18秒。
2021/10/14(木) 19:22:12.25ID:B0s+ugv/0
もしやコードとかアルゴリズムの話じゃなくて、ミリ秒単位を長いと感じるかどうかってことなのか
2021/10/14(木) 20:39:33.49ID:60mfbtKJM
Gbps出したいんだから当然そうでしょ
2021/10/14(木) 22:30:42.31ID:oXMWcY6Na
>>698
すでに書かれてたか
2021/10/15(金) 00:03:27.81ID:XHojpqKh0
>>699
volatileつけてM1macで-O0で0.25秒、-O2で0.05秒位だな。普通に間に合いそう。
2021/10/15(金) 01:46:57.39ID:vumwfiEZa
まったく自信がないのにチャチャ入れるようで申し訳ないのだけど、volatile を書く位置によっても結果がことなるかなと

おそらく a の * の左側に記述したのだと思うけど、動的に確保したメモリに対して有効なのかな…

誰か詳しい人いませんか?
2021/10/15(金) 02:01:35.27ID:2ebxtk1m0
・ volatile で修飾された変数 (メモリ領域) は初期系にとって未知の方法で更新されうるというプログラマから処理系に対するヒント
・ (未知の方法で更新されていても) 言語仕様で定めるところの抽象計算機の動作に厳密に従わなければならない

という規則なので volatile の修飾先が変数 a であってもポインタ a が指す先であってもこの場合は結果的に最適化は抑制されると思う。
2021/10/15(金) 02:05:14.85ID:vumwfiEZa
ありがとうございます
おっしゃる通りのような気がします
707デフォルトの名無しさん (ワントンキン MM7f-t/lv)
垢版 |
2021/10/15(金) 07:55:14.31ID:Svg6ZUXsM
>>686
画像だけならopenCVにsplitというのがあってrgb に分割された配列を返してくれるんだけど、後のレスから察するにどんどん流し込まれて来るみたいだからそのまま使えるかわからないです。
そのsplitではインデックスの計算にOpenCLを使っていますが、もちろん他の処理にも使えるから、ソース読んでみて損は無いと思います。
2021/10/15(金) 08:19:09.19ID:WeKxZ2Hf0
工夫するにしてもマルチスレッドで分割するぐらいしか思い浮かばん
領域を n分割し nスレッドパラに走らせて複製
2021/10/15(金) 09:12:03.80ID:+uEUiKf90
>>705-706
volatile の修飾先によってどこの最適化が抑制されるかが異なるので結果も異なるだろう。
710デフォルトの名無しさん (ワッチョイ 6b01-Avck)
垢版 |
2021/10/15(金) 09:44:49.60ID:FX8yed990
すみません、マジの初心者で申し訳ないんですけど、
今サンプルコードを写したりしながら勉強しているんですが、
毎回#includeとかint main(void)とかって書かなくて済む方法
ってありますか?
visual studio 2019を使ってます。
良ければ誰か教えてください。
2021/10/15(金) 09:58:43.65ID:5/Pqp5xeM
今後数千行、数万行のプログラムを書いていくことになるんで、int mainを自動入力させたいなんて気持ちはそのうち自動的に消えるので安心してください
712デフォルトの名無しさん (エムゾネ FFbf-mxW8)
垢版 |
2021/10/15(金) 10:13:57.88ID:Sjupi756F
>>710
https://ideone.com
https://codepad.org
713デフォルトの名無しさん (ワッチョイ 6b01-Avck)
垢版 |
2021/10/15(金) 10:23:34.05ID:FX8yed990
>>712

ありがとうございます!
元々それらを使っていたのですが、今使っているサンプルコードが書かれている本が
コマンドプロンプトで実行することを想定して作られているのか、
よく途中でscanfを使って入力の読み取りをするのですが、オンライン上だとそれができないのです。
visual studio 2019で、テンプレを自分で作っておいてそれを
読み込むような技があれば教えてほしいです。
714デフォルトの名無しさん (ワッチョイ 6b01-Avck)
垢版 |
2021/10/15(金) 10:53:31.08ID:FX8yed990
自力で調べて解決できました。
ありがとうございました。
2021/10/15(金) 12:55:13.67ID:/xIATXuH0
どういたしまして。 お役に立ててなによりです。
2021/10/16(土) 13:51:30.67ID:0CjYy/Ai0
C言語初学者です
for文を使って1からnまでの総和を求め、
さらに答えを例えばn==3なら
1+2+3=6と表示したいのですが、この表示の仕方がわかりません
ご教授お願い致します
2021/10/16(土) 14:26:17.75ID:W6fuAKpz0
int i.n,x;
n=3;
x=0;
for(i=1;i<=n;i++){
x+=i;
printf("%d",i);
if(i!=n)printf("+");
}
printf("=%d¥r¥n",x);
2021/10/16(土) 14:38:37.10ID:0CjYy/Ai0
>>717
できました
ありがとうございます!
2021/10/16(土) 16:54:36.35ID:r+1DV466M
>>717
最終行の ¥r って要るの?
2021/10/16(土) 17:51:52.16ID:E+4r+lYs0
>>719
基本的には不要。
 ・ 改行を表すものは (C の規格の範囲内では) 文字であるかのように扱う
 ・ テキストモードでの入出力ではホスト環境の都合に合わせて変換してよい
ということになっていて、改行を2バイトの符号で扱うホスト環境では \n という一文字を
その2バイトに変換するのは入出力関数の仕事。

ただし、標準出力をバイナリモードで開き直している場合だとか、
改行を1バイトの符号で表すホスト環境で2バイトの符号で表す環境のために出力したい
といった事情で改行を \r\n と書くことが無いとは言い切れない。
2021/10/16(土) 22:25:40.97ID:0CjYy/Ai0
質問です
入力された文字列と文字数を表示するプログラムで
Enterキーのみが入力されるまでループして入力要求をするようにしたいのですが
1〜4文字の入力はループするのですが5文字入力するとループが終わってしまいます
どうなおせばいいでしょうか?
よろしくお願いします
/*************************************/
#include <stdio.h>
#include <string.h>
int main(void){
char str[] = "Hello";
fgets(str,sizeof(str),stdin);
while (str[0] !='\n'){
if (str[0] != '\n'){
printf("文字列%s\n",str);
printf("文字数%d\n",strlen(str));
fgets(str,sizeof(str),stdin);
}else{
break;
}
}
}
/*************************************/
2021/10/16(土) 22:28:04.06ID:j08Y/8ma0
よく出来たクイズですね
2021/10/16(土) 22:33:18.38ID:N8k1BZc20
AOJかなんかですか
2021/10/16(土) 22:39:04.82ID:j08Y/8ma0
>>721
>1〜4文字の入力はループするのですが5文字入力するとループが終わってしまいます

設問として、何文字までの入力を受け付けるようにし、
それを越える文字数入力された場合はどうすると指示されてます?
2021/10/16(土) 22:43:54.01ID:0CjYy/Ai0
>>724
言葉足らずですいません
5文字までの入力で6文字以上の入力は考慮しないとなっています
>>723
大学の課題です
2021/10/16(土) 22:50:23.50ID:j08Y/8ma0
>>725
5文字までの入力を保証するには、配列サイズがたりません
入力最後のエンターキーまで含めるなら、7文字は必要じゃ無いかな?
2021/10/16(土) 22:59:47.56ID:g8LyFw1O0
・str配列を大きくする
・fgetsした結果のstrに改行文字が含まれてない場合は次の改行文字までstdinを読み飛ばす
2021/10/16(土) 23:00:22.34ID:0CjYy/Ai0
>>726
配列の箱増やしたらループするようになりました
ありがとうございます
あと1つ問題が残っていて文字列表示のあとに改行が無駄に1つ入ってしまいます
どうにかできないでしょうか?
現状
abcde
です
したい表示
abcdeです
2021/10/16(土) 23:00:54.46ID:iHqDmbcU0
>char str[] = "Hello";
とにかくここが気持ち悪い・・・
2021/10/16(土) 23:02:15.17ID:j08Y/8ma0
>>728
入力の最後に改行がある前提で表示を行うか、
文字列最後に改行がある場合は切り詰めるか、
どちらかで処理すると良いです
2021/10/16(土) 23:02:51.64ID:hXa8blxW0
>>729
それは別に普通では?
2021/10/16(土) 23:08:52.93ID:j08Y/8ma0
>>728
切り詰め方はこんな感じで

 if (str[strlen(str) - 1] == '\n')
  str[strlen(str) - 1] = 0;

↑全角空白は適当に置き換えて
733デフォルトの名無しさん (ワッチョイ 3b54-t/lv)
垢版 |
2021/10/16(土) 23:13:30.42ID:D7GMWgGE0
Hello!って!付ければいいよ。元気が足りない。
さらにこれfgetsの動作の理解を問う良問なんだから、無駄な改行なんぞ気にする余裕があるならfretsのドキュメント読んだ方がいいぞ。
734デフォルトの名無しさん (ワッチョイ 3b54-t/lv)
垢版 |
2021/10/16(土) 23:14:42.85ID:D7GMWgGE0
>>733
偉そうに言ってスペルミスですね。fgets です
2021/10/16(土) 23:26:16.40ID:0CjYy/Ai0
>>732
ご親切にありがとうございます!
>>730頂いてから調べててまたわからないことが増えたーって思っていたところでした笑
上の問題は無事解決しました
ありがとうございます

>>729
スマートな初期化方法があれば教えて欲しいです
2021/10/16(土) 23:27:52.08ID:0CjYy/Ai0
>>733
正しく書き直せた場合の実行結果に改行が入ってなかったので気になりました汗
2021/10/17(日) 00:24:13.17ID:IGrhvydt0
>スマートな初期化方法があれば教えて欲しいです
バッファサイズをちゃんと決めておくぐらいか?
ギリギリのサイズじゃなく余裕をもって(最大文字数+1(終端NULL)かつ32bitOSなら4バイト、64bitOSなら8バイト単位とか)。
定義後すぐにfgetsに渡すなら初期化も要らないと思うけど、念のためにやるなら
char str[8]="";

char str[8]={0};
かな。
738デフォルトの名無しさん (ワッチョイ 9fad-ZO17)
垢版 |
2021/10/17(日) 06:25:57.65ID:atjZW8su0
>>731
そうやって初期化した str[] の内容を後で書き換えるのは普通ではないと思う。
可能だが気を付けてないとバグの元になりそうだしね。

似たようなのに char *p = "hoge"; があるが、これはコンパイラによっては文字列をリードオンリーになるようにコード作って *p = 'A'; なんて後でやるとOSがプログラム停止させたりする。
しかしCの文法としては間違いではないのでコンパイルエラーにならない。
2021/10/17(日) 07:57:57.94ID:iZHfLY3SH
>>721
>char str[] = "Hello";

>>738
> str[] の内容を後で書き換えるのは普通ではないと思う。

私は「配列であるかぎり」それを後から書き換えるのは、初期化方法に関係なく文脈・表現として違和感なしと感じます
2021/10/17(日) 08:24:02.20ID:steRrM330
大文字→小文字への変換等の文字列長変わらない題材は
str[] で初期化しそうだわ
2021/10/17(日) 21:22:20.52ID:YXxqNhTYM
初期化のときだけ [] をキッチリポインタと区別するc の仕様がちょっと気持ち悪い
って感じかな
2021/10/17(日) 21:57:04.28ID:8CkFjl5X0
[] は記憶域の確保
ポインタは記憶域の操作
2021/10/18(月) 07:29:22.77ID:SjUVJOBmd
externや二次元配列でも区別しとるじゃろうが
元々違うものを区別されたからちゅうてガタガタぬかすなや
同じと思いたがるのが間違っとるんじや
744デフォルトの名無しさん (エムゾネ FFbf-mxW8)
垢版 |
2021/10/18(月) 16:00:11.31ID:r9t2S6+pF
char **hoge;
char *hage[];
好き嫌いが判れるな
2021/10/18(月) 16:05:46.60ID:3P96aY7G0
ウンコとカレーは別のものです
2021/10/18(月) 19:51:04.60ID:g0y5TC1t0
そもそも初期化の*と演算子の*だって違うものだからな……
2021/10/18(月) 20:04:38.45ID:o7eKMY2r0
関数の引数のary[]はポインタだって言ったじゃないですか
2021/10/18(月) 20:18:11.14ID:SjUVJOBmd
ついでに頓珍漢
749デフォルトの名無しさん (ワントンキン MMbf-t/lv)
垢版 |
2021/10/19(火) 07:28:30.98ID:KQylMF0MM
>>738
終端文字忘れてるからじゃないの?
750デフォルトの名無しさん (ワントンキン MMbf-t/lv)
垢版 |
2021/10/19(火) 08:18:32.37ID:KQylMF0MM
>>749
char *pか、勘違いすみません。
751デフォルトの名無しさん (アウアウウー Sacf-mxW8)
垢版 |
2021/10/20(水) 09:23:25.20ID:OEiI06HQa
すごい勘違いレス
2021/10/20(水) 18:53:19.81ID:X+tmlWS+d
if ((ss == 0) || (ss == 5) || (ss == 10) || (ss == 15) || (ss ==20) || (ss == 25) || (ss == 30) || (ss == 35) || (ss == 40) || (ss == 45) || (ss == 50) || (ss == 55)) {
hogehoge();
}
だいぶん無駄な書き方だと思いました
一桁の値が0が5の時に実行したいです
アドバイスお願いします
2021/10/20(水) 18:59:09.50ID:2b7An4Iy0
ss%5==0
2021/10/20(水) 19:00:41.26ID:X+tmlWS+d
>>752
int ss;
int sss = ss / 10;
if ((sss == 0) || (sss == 5)) {
hogehoge();
}

自己レス
こうですかね
2021/10/20(水) 19:01:44.45ID:X+tmlWS+d
>>753
どうもありがとうございました
756デフォルトの名無しさん (ワッチョイ 2b21-NRqJ)
垢版 |
2021/10/20(水) 19:41:14.72ID:+2OzLQ7p0
>>754
節子それ余りやない。ssss=ss-sss*10とかやらんと。

組み込みマイコンだと/,%なしで頑張る縛りプレーもあるで。自分がよくやるのは対応する値域を限定して、
掛け算と >> による割り算で計算する。それより難しいの頭がついてこん。
2021/10/20(水) 20:06:00.50ID:X+tmlWS+d
>>756
どうもありがとうございます

>>754って書いたけど
>>753が端的だったのでこれが楽ちんだと思って754は見直してませんでした
Arduinoで時計作りたくて触ってるところです
758デフォルトの名無しさん (ワッチョイ 2b21-NRqJ)
垢版 |
2021/10/20(水) 20:19:57.63ID:+2OzLQ7p0
>>757
ArduinoってUnoあたりは弱いマイコンなのにadafruitのサンプルとか浮動小数点演算してたり感覚おかしくなる。
1秒ごとの処理なら、1秒ごとにカウンタ増やして5になったら何かするって処理でもいいと思う。
使ってるマイコンが除算回路持ってるかは調べといたほうがいい。32bitマイコンでも割り算は省略されたり。
まぁ動きゃいいので効率や速度も捨てるのも、それが能動的な選択なら構わないとは思う。

ちなArduinoのスケッチは、古めのC++だったりするので、たまCで見慣れん文法が出て来る。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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