X



C言語なら俺に聞け 145
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 9381-qput)
垢版 |
2018/02/19(月) 22:13:58.98ID:9/te2eSJ0
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言語なら俺に聞け 144
https://mevius.5ch.net/test/read.cgi/tech/1514025223/

次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0589デフォルトの名無しさん (ワッチョイ 339f-zkh5)
垢版 |
2018/03/25(日) 00:05:52.92ID:r2Id4T4+0
>>586
例えばどんなの?
0590デフォルトの名無しさん (ワッチョイ f397-zkh5)
垢版 |
2018/03/25(日) 07:25:18.09ID:S7OmeNGW0
Visual Studio 2017
#define offsetof(s,m) ((size_t)&(((s*)0)->m))

gcc 7.2.0
#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)

clang 6.0.0
#define offsetof(t, d) __builtin_offsetof(t, d)

borland 5.5.1
#define offsetof( s_name, m_name ) (_SIZE_T)&(((s_name _FAR *)0)->m_name)
0594デフォルトの名無しさん (アウウィフ FFc7-OLeD)
垢版 |
2018/03/25(日) 18:06:41.94ID:qleen6XJF
それじゃ型が考慮されてない
0595デフォルトの名無しさん (ワッチョイ c779-AwYn)
垢版 |
2018/03/25(日) 18:24:31.28ID:EKcNWVxa0
>>591
その前に、まずはポインタ演算を使った結果が整定数になることが保証されている例を出してくれ。
当然規格は読んでいるよね。6.6p6より
> An integer constant expression shall have integer type and shall only have operands
> that are integer constants, enumeration constants, character constants,
> sizeof expressions whose results are integer constants, and floating constants that are the
> immediate operands of casts.
0596デフォルトの名無しさん (ワッチョイ f397-zkh5)
垢版 |
2018/03/25(日) 18:28:29.51ID:S7OmeNGW0
汎整数型定数をポインタにキャストまたは暗黙に変換した式は定数式(たとえば空ポインタ定数は定数式)
その定数式を整数にキャストし直した式が定数式でなくなる根拠はない
0597デフォルトの名無しさん
垢版 |
2018/03/25(日) 18:29:11.25
>>595
先生!
>>587で 「ポインタ演算を使った式が整定数になる保証がないので別の手段を使っている場合がある。」
って言い切ってるんだから、その「場合」とやらを僕も知りたいです!
0598デフォルトの名無しさん (ワッチョイ c779-AwYn)
垢版 |
2018/03/25(日) 18:53:41.81ID:EKcNWVxa0
>>596
>その定数式を整数にキャストし直した式が定数式でなくなる根拠はない
でもそれは整定数式ではないよね。
規格にはキャスト前の型が算術型でなければならないとある。
> Cast operators in an integer constant expression shall only convert arithmetic types to integer types, except as part of an operand to the
> sizeof operator.
0604デフォルトの名無しさん (ワッチョイ 5b61-3KaU)
垢版 |
2018/03/26(月) 11:35:27.48ID:0ihjlnG/0
a[b*c];
のようにしてもassemblyコードがアドレッシングモードじゃなくて
掛け算してしまうんですけどどうしたらアドレッシングモードで計算するように
なりますか?
0606デフォルトの名無しさん (アウーイモ MMc7-APr9)
垢版 |
2018/03/26(月) 12:03:06.83ID:EmWkiz+YM
>>604
何がしたいのかよくわからないけど、エスパーすると
Cソースで変数のセクションを指定して、リンカでそのセクションの配置を
期待するアドレスに配置すればいいんじゃないかな。
0607デフォルトの名無しさん (ワッチョイ 5b61-3KaU)
垢版 |
2018/03/26(月) 12:09:23.11ID:0ihjlnG/0
struct a{
int a;
int b;
};
struct a x[100];
void *v=x;

void *h(int n, int s){
return ((char *)v+n*s);
}

struct a *i(int n){
return &x[n];
}
同じことをしているのにhは掛け算するのにiは掛け算をアドレッシングモードでしているので
処理速度の差が生まれてしまいます。
0614デフォルトの名無しさん (アウアウカー Sac3-t4/V)
垢版 |
2018/03/26(月) 13:35:11.46ID:ioIbXl47a
>>612
それは違う環境に持っていってコンパイルしたら破綻するかも知れない。
やはりsizeof使うかそのまんまポインタ計算させた方が良いのでは?
0618デフォルトの名無しさん (アウアウアー Sa06-APr9)
垢版 |
2018/03/26(月) 15:00:59.23ID:+d/fyZgca
>>616
ここでは構造体の実体の配列だからsizeof(struct a)で大丈夫。
int1つのサイズは典型的には4byteだけど、IP64だのあまり見ない
データモデルでは8byteのこともあるから、構造体のサイズを使うときは
sizeofがよい(MAY)、ではなくてsizeofにすべき(ほぼMUSTのSHOULD)。
0622デフォルトの名無しさん (ワッチョイ 5b61-3KaU)
垢版 |
2018/03/27(火) 07:05:39.20ID:VOv2iUaR0
struct a{
bool a:1;
uint32_t b:31;
uint16_t c;
};

struct a{
uint32_t b;
uint16_t c;
bool a;
};

上の構造体が12バイツでしたが8バイツの理由がわかりません、上を8バイツにしたいです。
0624デフォルトの名無しさん
垢版 |
2018/03/27(火) 07:32:57.91
>>622
よく分からないんだけど、2つ構造体を書いてるのは何を意図してるの?
0625デフォルトの名無しさん (ワッチョイ a393-4ZrE)
垢版 |
2018/03/27(火) 07:57:42.10ID:tnecWY6M0
>>622
俺の環境ではどっちのsizeofの値も8バイツを返したから環境依存だろう。
#pragma か __attribute__ で詰め込めるかも知れんけど、
ビットフィールドを狙って使える指定方法があるかどうか。
詰めたら詰めたで6バイツや7バイツになっちゃう危険もあるし。

>>623
<stdbool.h> にどう書いてあるかだろうな。
これも試したら sizeof(bool) に1を返した。
<stdbool.h> の実体を思しきファイルを覗いたら

#define _Bool signed char
#define bool _Bool

の連鎖になってた。typedefでないのが少々意外。
#ifdef で定義済か未定義かを判定できるようにするためだろうか。
0630デフォルトの名無しさん (ワッチョイ 9761-fzSc)
垢版 |
2018/03/27(火) 10:04:40.74ID:/RdC4ccn0
間抜けな回答してるな>オレ

        ||
        ||
      ∧||∧   
     ( / ⌒ヽ
      | |   |
      ∪ / ノ
       | ||
       ∪∪

      -━━-
0631デフォルトの名無しさん (ワッチョイ b6a1-fzSc)
垢版 |
2018/03/27(火) 10:37:30.96ID:UpIjn8oG0
>629

>なんで日本人は「ん」を飛ばすかねえ

「全て」の日本人が「ン」を飛ばすわけではありません。

「或る」日本人が「ン」を飛ばすだけです。

ところで、ロシア語の

Емельяненко(エメリャネンコ)

とはどういう意味ですか。手元の「ロ日辞典」をひいても
でていないので
 
0632デフォルトの名無しさん (ワッチョイ 5b61-3KaU)
垢版 |
2018/03/27(火) 11:17:02.05ID:VOv2iUaR0
struct a{
bool x:1;
uint32_t y:31;
};
しらべたらこれの大きさが8バイツでした
sizeof(struct a)とやったらそうなったのでアラインメントのもんだいではありません。
どうしても4バイツにしたいです
0638デフォルトの名無しさん (ワッチョイ 5b61-3KaU)
垢版 |
2018/03/27(火) 11:26:51.67ID:VOv2iUaR0
struct a{
uint32_t a:1;
uint32_t y:31;
};
こうやったらできました
ビットフィールドを勘違いしていたのが原因みたいです。
0641デフォルトの名無しさん
垢版 |
2018/03/27(火) 12:00:48.00
>>640
これ、bool aとuint32_t xが同じ値であることがどの環境下でも保証されてるの?
教えてエロい人
0642デフォルトの名無しさん (アウアウカー Sac3-t4/V)
垢版 |
2018/03/27(火) 12:36:27.71ID:NeN1yqDWa
>>622
ビットフィールドって同じ型が並んでないとまとめてくれないのでは?

なので、

bool a:1;
uint32_t b:31;

ではなくて

uint32_t a:1;
uint32_t b:31;

にしたらできないか?
0643デフォルトの名無しさん (アウアウカー Sac3-t4/V)
垢版 |
2018/03/27(火) 12:39:07.90ID:NeN1yqDWa
既に答えが出て解決していた

        ||
        ||
      ∧||∧   
     ( / ⌒ヽ
      | |   |
      ∪ / ノ
       | ||
       ∪∪

      -━━-
0652デフォルトの名無しさん (ワッチョイ a393-4ZrE)
垢版 |
2018/03/27(火) 17:22:21.42ID:tnecWY6M0
>>637-638 >>642
ビットフィールドの詰め込み方だけど、
「同じ型の並びならまとめる、異なる型同士はまとめない」、
「型に関係なくまとめる」、(他にもパターンあるかも…)、
どれになるかは環境依存だからアテにしてると移植性の問題にハマるよ。

ビットフィールドは内部的な配置を気にしない場合だけ使うのが鉄則。
>>622 の流れからすると、ビットフィールドを含む構造体は
sizeof が返すバイト数も気にしちゃいけないね。
0653デフォルトの名無しさん
垢版 |
2018/03/27(火) 17:46:09.15
>>647
unionの中にもう一つstruct
uint32_t b0:1; 〜 uint32_t b31:1;
を入れてみて、b0〜b31をオール0、その次はオール1にして
aやyに代入するたびにb0〜b31がどう変化するかを確かめればいいと思うよ。
0655デフォルトの名無しさん (アウアウカー Sac3-t4/V)
垢版 |
2018/03/27(火) 19:18:17.87ID:NeN1yqDWa
>>652
コンパイラによっては型に関係なく並べるのもあるのか。知らなかった。
0659デフォルトの名無しさん (ワッチョイ 3708-zkh5)
垢版 |
2018/03/28(水) 15:08:36.90ID:NO5LUaew0
いやあ、そんなドジ踏んだことないし
踏んだやつも見かけないなあ
unionなんか使うときはそういう危険性には
真っ向から対峙しているのでうっかり考え落とす
なんてことは起こりえない

ポインタをキャストするときのほうが危ないぞ
unionよりも遙かに使用頻度が高くて油断しがち
0662デフォルトの名無しさん (アウアウエー Sa23-HAdz)
垢版 |
2018/03/29(木) 00:01:16.65ID:ySkkjEPJa
野積み
0664デフォルトの名無しさん (ワッチョイ 219f-kUw7)
垢版 |
2018/03/29(木) 00:30:03.68ID:HYrXjV+u0
>>654
出来の悪い子ほど可愛いものさ
0666デフォルトの名無しさん
垢版 |
2018/03/29(木) 03:06:08.42
if文とかfor文の中に飛ばすのもダメだろ

関数末尾以外に飛ばすのは基本アカンと思う
0667デフォルトの名無しさん (ワッチョイ d180-3UCh)
垢版 |
2018/03/29(木) 07:24:44.79ID:+dX3Weor0
gotoとswitchの組み合わせはよくやる。
0668デフォルトの名無しさん (ワッチョイ 219f-kUw7)
垢版 |
2018/03/29(木) 22:57:50.45ID:HYrXjV+u0
>>667
switch と goto と聞いて、はっもしやこんなこともできるのでは、と思ってやってみたら、できてしまったよ。どうしよう。

#include <stdio.h>

int main()
{
 int i;

 for (i = 0; i < 10; i++) {
  if (i == 5)
   goto hoge;
  switch (i) {
   case 1:
    puts("いち");
    break;
hoge:
   puts("ご");
   break;
  }
 }

 return 0;
}
0669デフォルトの名無しさん (アウアウウー Sa45-kUw7)
垢版 |
2018/03/30(金) 13:01:35.10ID:fkO+Wt7Ma
情報処理用にC頑張り始めたンスけど、初心者本は2冊くらい終えて、簡単なプログラムならあるていど作れるようにもなったんスけど、FEの過去問には全く歯がたたないっすw
0672デフォルトの名無しさん (ワッチョイ 5923-HAdz)
垢版 |
2018/03/30(金) 16:19:34.10ID:zQBQo8b30
>>668
おめ
はげめ
0673デフォルトの名無しさん (ワッチョイ 4123-xai/)
垢版 |
2018/03/30(金) 16:22:11.93ID:bDuRGN0f0
>>668
goto default;
0674デフォルトの名無しさん (ワッチョイ d35d-2oNG)
垢版 |
2018/03/30(金) 16:55:37.88ID:InC0asnz0
あれにはそういう名前があったのか。ありがとう。
0683デフォルトの名無しさん (アウアウカー Sadd-rlcN)
垢版 |
2018/03/30(金) 20:19:58.73ID:x2Z4e+RCa
>>677
それC++だよね。
■ このスレッドは過去ログ倉庫に格納されています

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