問題タブ [variable-length-array]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - C99 - Xcode 6 で可変長の char 配列を使用できないのはなぜですか?
Xcode 6 で C コマンドライン ツール プロジェクトを作成しましたが、1 つの小さなことを除いてすべてがうまく機能します。たとえば、次のコードを考えてみましょう。
これは正常にコンパイルされますが、デバッグすると、配列が割り当てられません! 7 行目にブレークポイントを設定し、実行ボタンを押して にカーソルを合わせるとstr
、名前の横に矢印が表示され、展開しても何も表示されません!
私が間違っている場合は訂正してください。しかし、これは私がここに書いている完全に有効な C99 コードだと信じています。GNU99 コンパイラ (デフォルト) と C99 コンパイラの両方を試しましたが、役に立ちませんでした。
MTIA :-)
編集: OK、私はここで数人を混乱させ、おそらくPOしたようです (この質問に対して少なくとも3つの反対票を獲得したため) ので、少し明確にさせてください.
私は実際に Mac OS X Yosemite で libcurl アプリを作成して、HTTP 経由で Web サーバーにファイルをアップロードしています。最後に、ターミナルで「[宛先URL] [ファイルまたはディレクトリ1] [ファイルまたはディレクトリ2] ... [ファイルまたはディレクトリN]」のようなものを入力し、プログラムにそれらを自動的にアップロードさせたいファイルとディレクトリを [destination url] に送信します。入力パスは、CWD に対する相対パスまたは絶対パスにすることができます。
ここに示すように、問題は私のuploadDirectory
関数に存在します:
問題を解決するために巨大な定数サイズを定義できることは知っていますfilePath
が、大きすぎるとはどのくらいですか? OS X のファイル パスの最大長は? 等々…なので、丁度いいサイズにしたいと思います。
この投稿の極端な長さに勇敢に立ち向かい、ここにたどり着いたのなら、辛抱強く待ってくれてありがとう! 最初は問題をできるだけ簡潔に説明しようとしましたが、明らかに混乱を招くだけだったので、申し訳ありません:-)
c - int[0,1] などの任意の式を配列サイズとして使用できないのはなぜですか?
static
角かっこの間のand *
(省略されたサイズ) を無視すると[]
、配列宣言子の構文は次のようになります (C99 TC3 (n1256) 6.7.5 p1; C11 (n1570) 6.7.6 p1 より):
direct-declarator: direct-declarator [ type-qualifier-listopt assignment-expressionopt ] [...]
したがって、次のような宣言
構文エラーですが、
許可されます (これは VLA であるため、ブロック スコープで)。
コンマを区切り記号として使用するとあいまいになるため、任意の式が許可されない場合があります。たとえば、関数呼び出しの引数は代入式でなければなりません。しかし、そのようなあいまいさがどのように引き起こされるのかはわかりません。
direct-declarator:
direct-declarator [ type-qualifier-listopt expressionopt ]
これは C 言語の厳密なスーパーセットを定義しますか? この文法があいまいな例はありますか?
C89 *)では構文に定数式(条件式) が必要だったため、C99 で VLA を許可するにはこれを変更する必要がありました。しかし、式ではなく代入式に変更された理由がわかりません。技術的な理由はありますか?
Gcc (およびおそらく他のコンパイラ) には、C 標準に追加される前に拡張機能として VLA がありました。他の拡張機能との競合も説明になる可能性がありますが、そのような拡張機能については知りません。Gcc 3.0.4 はint a[0,1];
(および を使用し-std=gnu89
て-traditional
) 受け入れますが、新しいバージョン (Gcc (Debian) 4.7.2-5 でテスト済み) は受け入れないため、これが原因である可能性は低いと思われます。
私が見る限り、この質問は型名の直接抽象宣言子にも同様に適用されます。
*)この C89 ドラフトによると、3.5.4.
c++ - VLA 配列を介して goto にジャンプするときのセグメンテーション違反
次の例は、この問題を示しています。
最初は、「remaining」変数の初期化に少し時間がgoto
かかり、以前は 1 行で初期化していました。ただし、この例では、行にセグメンテーション違反が発生しprintf
ます。
配列が正しく初期化されていないようです。
gdb でさえ tmp 配列のアドレスを出力できません:
私のgccバージョン:
コンパイル:
goto を削除するか、可変長配列を固定配列に置き換えると、セグメンテーション違反はなくなります。実際に何が起こっているのですか?
これはgccのバグですか?と可変長配列の組み合わせがgoto
許可されていない場合、警告が表示されますか?
c++ - C++ で動的 2 次元配列を関数に渡す方法
動的な 2 次元配列を関数に渡そうとしていますが、エラーが発生します。配列の次元を明示的に提供しようとしましたが、機能しましたが、動的は機能していません。ポインターはありません(しゃれは意図されていません)
ここで詳しく説明した 3 つの方法をすべて試しましたPassing 2D array in C
上記のように配列をインスタンス化する代わりに、次のようなものを使用する場合
期待どおりに動作します。次のエラーが表示されます
print_2d_array(5, arr);
c++ - 実行時サイズの配列とポインター減衰
新しい C++14 ランタイム サイズの配列に対して、ヘッダー内のいくつかのツールをテストしていましたtype_traits
。以下のコードを検討してください。
静的サイズの配列g
は、次の出力を返します。
A11_i
私が推測しているマングルされていない名前は、 int型の11個の要素の配列なので、ここではすべて正しいですが、この新しいコードを使用すると、次のようになります。
エラーが発生します:
サイズ引数がテンプレートに渡されるとは思っていませんでしたが、配列からポインターへの自動減衰が予想されていました。T &
この引数はこの種の減衰には適していないと思うので、テンプレートの署名を次のように変更しようとしました。
同様の結果:
そして、実行時サイズの配列のサイズ変数が (取得しているのではなく) 型に関連付けられているように見えることに気付きました。これはかなり奇妙に見えます。mismatched types 'T*' and 'int [
5
]'
mismatched types 'T*' and 'int [
s
]'
それで、質問は何ですか?
- この実行時サイズの配列で配列からポインターへの減衰が得られないのはなぜですか?
- 実行時サイズの配列のサイズを変更するために使用される変数は、実行時サイズの配列の型の部分ですか、それともエラーを誤解していますか?