>>952の場合、配列要素を渡すと言った方がいいのか
>952
添え字付いてても参照渡しでしょ?
つか元々Cって、配列の実体はポインタだったような (語弊がある?
>>942-943のどちらの方法でも渡されてるものは同じだから問題なく動くんじゃ
いい加減スレ違ってきそうだが
>>952 sub(array[0], array[1], array[2], ...);
main内部とかでこうやって呼び出すってこと?
不可能ではないが、一体なんの意味があるのかと。
特定の要素を渡すのなら問題無いと思うけど
いや
>>946は
>>944へのレスだから
あくまで可能性を言ったまでで
そこまでマジレスされても困る
>>955 配列全体か配列要素を渡すかケースバイケースだけど意味はあるはず
例えば
・値呼び出しで配列要素を渡した場合、呼び出された関数が元の配列の値を変更できない
・大きな配列全体を頻繁に渡すと実行速度に差がでる
とか
>>958 いや、だからCでは配列を(そのまま)値渡しする手段がないんだってばさ。
以下のwork構造体をaかつbで昇順にqsortする場合、qsortの比較関数は
どう書けばいいのでしょうか?
struct work {
char a[5];
char b[5];
}
aだけで昇順ソートなら↓とわかるのですが・・
int cmp (const void *p1, const void *p2) {
contst struct work *s1 = p1;
contst struct work *s2 = p2;
return strcmp(s1->a, s2->a);
}
>>960 >aかつbで昇順
ここを詳しく。
例えばaを主キーに、bを副キーにするならこうなる。
int foo = strcmp(s1->a, s2->a);
if (foo < 0 || foo > 0) return foo;
return strcmp(s1->b, s2->b);
>>961 そういうことです!なるほどわかりました
qsort二回呼ぶ必要無かったんですね・・
>>962 逆に、qsort()は非安定なソートで実装されている可能性が高いから二度呼んじゃいけません。
#安定なソートなら副キーでソートしてから主キーでソートすればできるけど。
>>959 構造体なら値渡しできるということでは駄目か。
965 :
デフォルトの名無しさん:2007/02/09(金) 18:56:01
初めまして。最近C言語を勉強し始めた者です。
早速質問なのですが、Visual C++ 6.0で
#define max 30;
struct _test
{
int a;
int b;
int c;
}test[max];
とやると
構文エラー : ']' が ';' の前に必要です。
構文エラー : ';' が ']' の前に必要です。
と出てしまいます。
こう言う[]の使い方は出来ないのですか?
#define max 30;
~~~~
すなわち
struct _test test[30;];
>>966 ありがとうございました。解決しました。
#defineは;はいらないんですね…。
#define max 30; < 最後の ;(セミコロン)要らないんじゃね?
>>965 #define max 30;
セミコロン要らない
最近もぐらたたきのプログラムに触れてすごいと思ったんですが、少し疑問が。
ソース見て、ん?となり、これってコンピュータは処理が高速だから、
リアルタイムに動いているように見えているだけなんでしょうか?
だとすると普通のCで同時に処理する事はできないんでしょうか?
同時に処理する必要性が感じられない。
>>971 どんなコードか判らないが…
「高速に動いている」ことと
「同時に動いている」ことは
直接の関連性は無い。
そのコードが出力(描画含む)結果の反映を
即時(or自動)でやってるならば「高速で処理しているから同時に見える」。
逆に、反映を一度にするよう制御しているなら
「コード上は、本当に同時に動いている」。
>>971 リアルタイムは同時である必要はないし
処理には時間がかかるはずなので完全な同時ということはありえない。
遅れた情報を捨てて最新の情報を常に表示するのがリアルタイム。
操作すると瞬時にモグラを叩いている画像に変わるということか?
昔に比べると画像の作成して表示する処理はとてもなく速くなったね。
十数年前のパソコンだと作成に少し待たされ
しかも描画している様子まで見えたが
今はパソコンで動画を見ることが余裕に出来るくらいの性能になった。
そのもぐらたたきはループ回して入力チェックと描画を交互にやってるんではないかとエスパー
同時に処理とはマルチスレッドのことを言ってるんではないかとエスパー
>976
そのサイトは参考にしてはいけません。
もしブックマークしてるなら速やかに削除してください。
速やかに登録しました
ネットの検索で上位に来るというだけで、いんちき占い師を一途に信じ続ける信者のごとく初心者が惑わされていく。
これまでも、そしてこれからも。
それは誰にも止められない。
願わくば犠牲者の魂の安らかならんことを。
気持ち悪い底の浅い言い回しだなあ・・・
大丈夫なんじゃないっすかね。
アライメントというのがよく理解出来てなく、ネットで検索してみたのですが
class TestA {
char c;
int i;
double d;
};
class TestB {
int i;
double d;
char c;
};
というクラスは並びかたが違うだけだが、オブジェクトのサイズが異なる。(アライメントが8以上の場合。)
テスト(実行)する環境がないからサイズがどう違うのかも判りません。
テストAとBのサイズ(バイト数)はどうなっているのでしょうか?
Aが16バイト
Bが24バイト
>>985 成る程。変数宣言の時に今までのバイト数(char2つ、int1つ)に組み合わせられない(doubleやint)場合、
以前のサイズは余白を使って8バイトとするといったイメージで宜しいのでしょうか?
Aは
char,int 1+4+余白3バイト
double 8バイト 合計16バイト
Bは
char 1+余白7バイト
double 8バイト
int 4+余白4バイト 合計24バイト
即レス有難う御座いました。
アーキテクチャによっては、例えばdoubleの値は8バイト境界に存在しないといけない。つまり、こういうこと。
┌───────────────┐
│ double値 │8の倍数のアドレス
├───────────────┤
│ double値 │上記+8
└───────────────┘
こういうアーキテクチャで8バイト境界を無視してアクセスすると異常終了に繋がる。そうでなくてもパフォーマンスが落ちる。例えばこういうこと。
┌───────┬───────┐
│ 空き │doubleの前半分 │8の倍数のアドレス
├───────┼───────┤
│doubleの後半分 │ 空き │上記+8
└───────┴───────┘
これを踏まえて構造体を考える。TestAは詰めればこうなるかもしれない。
┌─┬───────┬─────┐
│ c │ i │ d(一部) │8の倍数のアドレス
├─┴───────┼─────┘
│ d(残り) │ 上記+8
└─────────┘
しかし、先程示した通りdouble値は8バイト境界にないといけないとしたら(恐らくはint値も4バイト境界にないといけないだろうから)こうなるだろう。
┌─┬─────┬───────┐
│ c │ 隙間 │ i │8の倍数のアドレス
├─┴─────┼───────┤
│ d │上記+8
└───────────────┘
同じように、TestBもこうなると考えられる。
┌───────┬───────┐
│ i │ 隙間 │8の倍数のアドレス
├───────┴───────┤
│ d │上記+8
├─┬─────────────┤
│ c │ 空き │上記+8
└─┴─────────────┘
たいていのコンパイラはオプションでパディングを制御できる
>>989 抽象論で批判するなんて随分と矮小な知性をお持ちのようで。
次スレは?
似たようなスレ多いし、要らないんでない?
パディング
膿め
産め
梅
埋め
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。