C言語なら俺に聞け(入門篇) Part 36at TECH
C言語なら俺に聞け(入門篇) Part 36 - 暇つぶし2ch481:デフォルトの名無しさん
08/09/30 23:43:09
>>480 ご回答ありがとうございます。

実際に送信する順番という意味では、
ビッグエンディアン、リトルエンディアンにかかわりなく、
LSBが一番先という事になるのでしょうか?

60000(10進)、EA60は、ビッグエンディアン送信で
00 00 EA 60
--------> t
つまりLSBファーストとなり
受信側ビッグエンディアンで読み出し(計算)はそのまま
0000EA60
として扱うという認識でよろしいでしょうか?





482:デフォルトの名無しさん
08/09/30 23:48:00
ネットワークスレのテンプレでも見てからそっち行けよ

483:デフォルトの名無しさん
08/09/30 23:48:57
>>482
わかりました。

484:457
08/09/30 23:49:06
どうも皆さん、色々書いていただきまして、ありがとうございます。

私は、関数ポインタ配列を覚えたててでして、おもしろいから色々と趣味で組んでいます。
ですから、仕事上どうしても必要とか出なくて。。

本当に色々な方に意見を書いていただきましてとても感謝しています。自分としては>>458さんや
>>463さんが教えてくれた可変長引数と構造体&共用体を組み合わせて色々自作してみたいとおもいます。

このたびはありがとうございました。自分で色々と作成すると楽しいです。自分は趣味でやっているので。

色々とわかりだして今が一番楽しい時期です。ありがとうございました。

485:デフォルトの名無しさん
08/09/30 23:51:10
>>481
シリアル通信時のバイトオーダーをどちらかにきっちり決めておけばいい

例としてネットワークバイトオーダーはビッグエンディアンと決まっている

486:デフォルトの名無しさん
08/09/30 23:54:36
いや、0x0000EA60をビッグエンディアン送信で送信するなら、
0x00, 0x00, 0xEA, 0x60の順だろう。だからMSBが最初。

487:デフォルトの名無しさん
08/10/01 00:20:04
>>482
まだいます。すいません。

>>486
ありがとうございます。
ということは、
ビッグエンディアンはMSB(データの3 byte目)を最初に送信
リトルエンディアンはLSB(データの0 byte目)を最初に送信
ということですね?

>>480の内容と異なる気が・・・

混乱してきました。もっと勉強します。


488:デフォルトの名無しさん
08/10/01 00:38:20
>>487
ここをみて勉強してください
URLリンク(www.ertl.jp)

489:デフォルトの名無しさん
08/10/01 00:44:37
>>488
ありがとうございます。

490:デフォルトの名無しさん
08/10/01 00:51:38
Intelだけなんだよな。リトルエディアンは。

なんでMS+Intelは、こういつもいつも

491:デフォルトの名無しさん
08/10/01 00:53:07
>>490
おいおいw

492:デフォルトの名無しさん
08/10/01 00:55:49
>>490
MIPSはどっちにでもできるぞ
現にPSPはリトルエンディアンだ。
アライメントはインテルのように甘くはないけど

493:490
08/10/01 00:58:27
>>492 そうか、知らんかった


494:デフォルトの名無しさん
08/10/01 01:06:11
SHシリーズにも動的に変えられるCPUあった気がするな
設計時はともかくプログラム的にはあまり気にしないけどさ

495:デフォルトの名無しさん
08/10/01 02:00:07
PPCがバイエンディアンだったよね。
エンディアン動作モードのビットがMSRに用意されてるとか

>487
486の例で言えば、3バイト目の「60」はどうみてもLSBなんだが……

496:デフォルトの名無しさん
08/10/01 02:02:19
すみません質問です。
C言語でスタック領域からメモリを動的に取得する方法は何があるでしょうか?

ネットで検索して探したところallocca()という標準?関数があるらしいのですが、
どんな仕様なのか分かっておりません。。

497:デフォルトの名無しさん
08/10/01 02:04:26
わかれ

498:デフォルトの名無しさん
08/10/01 02:12:39
なに?ヒープじゃ足りないの?組み込み?

499:デフォルトの名無しさん
08/10/01 02:14:13
>>496
alloccaは標準でなくて特殊な関数のようですが、あなたの環境にalloccaはありますか?

そもそも、なぜmallocではいけないのでしょうか?スタック領域を使う理由は?

500:デフォルトの名無しさん
08/10/01 02:33:24
スタック領域は無理だろ。 コンパイル時に決まった量を静的に確保するのが
スタック領域だろ。 ヒープもスタックも同一のメモリを使う。

501:デフォルトの名無しさん
08/10/01 02:34:25
Cのスタック領域は基本的にリターンスタックだから、
関数を抜けると消えるし、注意して使わないと領域破壊して関数から戻れなくなる。
普通にmallocすべき

502:デフォルトの名無しさん
08/10/01 03:07:36
alloca()はfree()しなくていいから、楽だし安全。

503:デフォルトの名無しさん
08/10/01 04:20:11
こちらで質問してよいものか…違ったら言ってください

xdawinというソフトで逆コンパイルをしようと思いましたが

エラー ufree: は malloc されていません
とでました。そこで

\アドレス\ void *malloc(size_t ○)
と実行しましたが

too many positional parameter
とでてしまい、再度。結果、サイズが1でも0でもこれが出てしまいます

・エラーを処理しようと思った式が全然ダメ なのか
・サイズがおかしい のか誰か教えてください

504:デフォルトの名無しさん
08/10/01 04:30:29
これか↓
URLリンク(www.linux.or.jp)

これを読むと、ナーバスな関数のような感じだな
longjmpやsiglongjmpを使ったときにメモリの開放が簡単で、それ以外には
使用は推奨されていない。
と書かれている。

505:デフォルトの名無しさん
08/10/01 04:42:25
>>503
too many positional parameters

ポジショナルパラメータの数が多すぎるというエラーです。
スクリプトを実行したときの、そのスクリプトに渡すのパラメータの数が
あっていない可能性があります。

としか、お答えできません。

506:デフォルトの名無しさん
08/10/01 13:27:19
>503
スレ違いだと思う

507:503
08/10/01 13:35:16
>>505
ありがとうございます

>>506
うーん、やはり…
逆コンパイルで探しても出てこなかったのですみませんでした

508:デフォルトの名無しさん
08/10/01 19:20:41
while( 1 )
{
// 真ん中
center = (left + right) / 2;
printf("%d %d %d\n",center,left,right);

// みつかったら
if(a[center] == key){
printf("\nみつかった %d\n",center);
printf("\n%d\n",a[center]);
break;
}

// みつからなかったら
if(left >= right) {
printf("みつからなかった");
break;
}

if( a[center] < key ) left = center + 1;
if( a[center] > key ) right = center - 1;

// 時を止める
getch();

}

バイナリーサーチのプログラムこれでおk?

509:デフォルトの名無しさん
08/10/01 19:23:00
以前作ろうとして大失敗したから不安。

今回は成功したっぽいけど、間違えているかもしれないから修正あったら頼みます

510:デフォルトの名無しさん
08/10/01 19:30:51
おkにみえる

511:デフォルトの名無しさん
08/10/01 19:35:55
なぜ bsearch を使わん?

512:デフォルトの名無しさん
08/10/01 19:38:50
>>511

バイナリサーチを理解するため。

513:デフォルトの名無しさん
08/10/01 20:02:46
>>509
プログラムが正しいかどうか、他人に聞くしかテスト技法を知らんのか
テスト項目の導き方はいろいろある
それが知りたければ便所の落書きより有料情報をあたったほうがいい

514:デフォルトの名無しさん
08/10/01 20:15:04
>>513

分かった。



515:デフォルトの名無しさん
08/10/01 20:34:11
floatのエンディアン変換が分からないのですが、教えてください。

typedef union
{
float f;
unsigned char b[4];
} Endian32;

float ConvertF32( void *inData )
{
EndianF32 val;

val.b[0] = ((Endian32 *)inData)->b[3];
val.b[1] = ((Endian32 *)inData)->b[2];
val.b[2] = ((Endian32 *)inData)->b[1];
val.b[3] = ((Endian32 *)inData)->b[0];
return val.f;
}

void test( float inVal )
{
float ret = ConvertF32( &inVal );
fwrite( &ret, sizeof(float), 1, fp );
}

こんな感じでやっています。
1.0を送ると、int型の1が何故か入ってしまいます。

516:515続き
08/10/01 20:34:40
リトルエンディアンだとこうなっているので、
0011 1111 1000 0000 0000 0000 0000 0000
ビッグエンディアンにすればこうなるはずなんですが、
0000 0000 0000 0000 1000 0000 0011 1111

なぜか
0000 0000 0000 0000 0000 0000 0000 0001
こうなりますw
同じようなやり方で、intなど整数型は問題なく出来ています。
どこが間違っているんでしょうか?><

517:デフォルトの名無しさん
08/10/01 20:48:33
ループ変数に対して

int main(void){

...

{
int i, j;
for(i...)
for(j...)
}

...

{
int i;
for(i...)
}

...

return 0;
}

見たいな感じでよく書くんだけど、これは機械のほうからすると無駄が多い処理なんでしょうか?



518:デフォルトの名無しさん
08/10/01 20:57:00
>515
そのシステムのエンディアンではない値をfloatとして返すのが間違い。
代入した直後に正規化されたりしてややこしいことになる。

519:デフォルトの名無しさん
08/10/01 21:13:07
>>515
代入というのは単にビット列をコピーすることではない
正しい内部表現を持たない値を実数として受け渡そうとしたら
場合によっては例外が送出されてプログラムが停まることもある

>>517
コンパイラの最適化次第

520:デフォルトの名無しさん
08/10/01 21:16:41
型のサイズを気にするのはコンパイルするまででおk?


521:デフォルトの名無しさん
08/10/01 21:23:41
意味不明

522:デフォルトの名無しさん
08/10/01 21:40:26
>>515
void test( float inVal )
{
  EndianF32 ret = ConvertF32( &inVal );
  fwrite( &ret, sizeof(float), 1, fp );
}

とやれば、希望する結果が出るのではなかろうか。

523:デフォルトの名無しさん
08/10/01 21:54:51
>>520
コンパイルしてから何かを気にしたとして、それでどうするつもりだ

524:デフォルトの名無しさん
08/10/02 00:57:10
いざ、リンクしてみたら、コンパイル済みのオブジェクトファイルが
おかしな変数宣言しすぎてメモリ不足になるとか気にしてるのかな?

525:デフォルトの名無しさん
08/10/02 01:02:05
そういう目に遭ったことがないのか? うらやましい

526:デフォルトの名無しさん
08/10/02 01:05:07
メモリ不足解消するのなら、標準関数は変数へいったん代入するとだいぶ変わるらすい。

527:デフォルトの名無しさん
08/10/02 01:17:56
int a = printf;
a("imi wakaran");

528:デフォルトの名無しさん
08/10/02 01:32:04
int(*a)(const char*, ...) = printf;
a("naniga kawarun daro");

529:デフォルトの名無しさん
08/10/02 01:34:13
>>527-528
え!そういう意味の代入なの?

530:デフォルトの名無しさん
08/10/02 02:27:15
void_No4様がきましたよ。

俺は天才、そしてIQは400↑、すげーだろ


531:デフォルトの名無しさん
08/10/02 03:13:57
すごいね
俺の半分もあるじゃん

532:デフォルトの名無しさん
08/10/02 03:35:21
またメンサか

533:デフォルトの名無しさん
08/10/02 11:21:28
>>515
エンディアン云々以前に、ポインタを学んだほうが。
>val.b[0] = ((Endian32 *)inData)->b[3];
inData が指してるのは float (多分4バイトしかない) なわけだが。

534:デフォルトの名無しさん
08/10/02 13:05:06
>>533
union

535:デフォルトの名無しさん
08/10/02 13:43:09
つmemrev

536:515
08/10/02 13:54:06
>>518>>519>>522
ありがとうございます。たいへんよく分かりました。
>>522さんのやり方で上手く行きましたー!

>>533
共用体を使うと、そういうことが出来ちゃうんです。

537:デフォルトの名無しさん
08/10/02 17:12:00
うにおんっていまいちクールなつかいかたがわからないよね


538:デフォルトの名無しさん
08/10/02 17:13:16
regs

539:デフォルトの名無しさん
08/10/02 17:17:48
企業秘密です

540:デフォルトの名無しさん
08/10/02 18:04:14
>>537
一つの領域を複数の型として使えることが共用体の意味だからそのように使えばいい
具体的にはサイズが同じ複数の型からなる配列などがある
intとfloatが不定間隔で現れるようなフォーマットのデータを扱うときに便利

541:デフォルトの名無しさん
08/10/02 18:09:50
でもそれって値を取り出すときにintなのかfloatなのかわからなくない?


542:デフォルトの名無しさん
08/10/02 18:11:37
floatにキャストしちゃえ

543:デフォルトの名無しさん
08/10/02 18:23:33
>>541
そういうフォーマットは、たいてい先行するintの値によって
その後いくつfloatが来るのか決まってる

544:デフォルトの名無しさん
08/10/02 18:34:42
たいていじゃなくて、規則性がなかったらどうするの?


545:デフォルトの名無しさん
08/10/02 18:39:36
何も手がかりが無いのにそんなことしないわw

546:デフォルトの名無しさん
08/10/02 18:41:05
>>544
規則性がなかったら無理

そうじゃなくて、floatが先行してintが混ざる場合もあるという意味

547:デフォルトの名無しさん
08/10/02 19:39:40
構造体のメモリ確保をしたいのですが、
コンパイルできません。
visual C++ 2008 express editionです。

ソース

struct list
{
int data;
struct list* next;
};

newcell = malloc( sizeof(struct list) );

548:デフォルトの名無しさん
08/10/02 19:43:20
>>547
問題の起こるソースコードとエラーメッセージを書けよ

549:デフォルトの名無しさん
08/10/02 21:15:01
>>548すいません
ここのソースコンパイルしようとしたのですが
URLリンク(www.geocities.jp)

1>z:\users\phenix1gou\documents\visual studio 2008\
projects\list\list\source.cpp(77) :
error C2440: '=' : 'void *' から 'LIST *' に変換できません。

って出ます。

550:デフォルトの名無しさん
08/10/02 21:15:58
newcell = (struct list*)malloc( sizeof(struct list) );

551:デフォルトの名無しさん
08/10/02 21:17:12
キャストすれば

newcell = (LIST *)malloc( sizeof(struct list) );

552:デフォルトの名無しさん
08/10/02 21:17:49
>>549
.cppにすんな.cにしれ

553:デフォルトの名無しさん
08/10/02 21:18:13
ありがとうございました。
キャストしたらできましたm(’_’)m

554:kazu
08/10/02 22:38:31
独学ではじめた者です。
練習問題
・数値を複数回入力し、最後に"END"と入力された後、それぞれに対し
80以上なら"verygood"、80未満で60以上なら"good"、60未満なら"normal"
と表示されるプログラムを作成しなさい。

例) 25(enter押下)
   90(enter押下)
   73(enter押下)
   END (enter押下)


   25 normal
   90 verygood
   73 good

という問題なんですが、
正解が分かりません。


本にはヒントとして
1 文字の入力にはgets()という標準関数を使用する。
2 "END"との比較にはstrcmp()という標準関数を使用する。
3 文字を数値に変換するには、atoi()という標準関数を使用する。
4 繰り返し文(for、while文)とbreak文
と載っていました。
どなたか教えていただけないでしょうか?
よろしくお願いします。

555:デフォルトの名無しさん
08/10/02 22:40:47
>>554
そういうのは宿題スレで聞け

556:デフォルトの名無しさん
08/10/02 22:44:44
その本は模範解答載せてないのか
不親切だな

557:デフォルトの名無しさん
08/10/02 22:51:08
>>554
char s[10000];
int x[10000];
int i, j;
for (i = 0; i < 10000; ++i) {
gets(s);
if (strcmp(s, "END") == 0) break;
x[i] = atoi(s);
}
for (j = 0; j < i; ++j) {
if (80 <= x[j] ) {
printf("%2d verygood\n", x[j]);
} else if (60 <= x[j]) {
printf("%2d good\n", x[j]);
} else {
printf("%2d normal\n", x[j]);
}
}

558:kazu
08/10/02 23:35:55
>>557
親切にありがとうございます。


559:デフォルトの名無しさん
08/10/02 23:52:06
>>558
死ねやゴミ

560:デフォルトの名無しさん
08/10/03 00:42:03
stopppp4ststartcommandoperation2ppppppppppppppppppppppppppppppppppppppppppppppppppppppppPPPPpppp
stopp stack stack stack stack chr dir 2
sometime printf troff terminal fuu サーバーに接続します ターボコマンドをおねがいします
cdプレイヤーの接続名をきにゅうしてください
PL2 メーカーはマランツ 88 pl2の意味をおかきください
初期モデル
プレイヤーの搭載位置をおかきください マウント22 日本製と認識しました
ではくわしい おんしつを おかきください ひらがなでおかきください
じどうにんしきソフトをきどうしてください きどうご じどうちょうせいに はいります。
おわります どうもありがとうございました。
eth:0 それでけっこうです
エンファシスをクリヤモードにいたします。
 



561:デフォルトの名無しさん
08/10/03 00:46:30
        ., -、,. -─- 、⌒〉
         {  }      ヽ_    r'⌒)
         ヽ、  ,,-‐‐  ‐‐-、  iヽ、 J
         {   、_(o)_,: _(o)_ヽ/ ヽ/∪
           !       >::  }  /     丶
          l    /( [三] )ヽノ‐''>  < つわぁぁぁああああ!
        i⊂}__   `二´‐'´__/__  
        ヽ   ‐- 、二`ヽ/〉⊂ニニ⊃)
         |    // ̄ ̄)j~U^∪ヽ
         ノ ` ‐-L!--‐''(´      )
        `i''ー----‐ ''"´ ヽ、__/
         !           }  ` }
          !.  , -‐- 、.    ノ--─ '    はちみつだと思ったら味噌だった~
          ヽ、_{.     `ヽi'⌒i
           `''‐- 、.. __,!


562:デフォルトの名無しさん
08/10/03 03:51:38
すいません、LSI‐C86試食版を落として使ってるんですが
なぜかプログラムをコンパイルして実行すると日本語部分だけ
文字化けしてしまいます
chcpでいろいろとコードいじったりしてみても効果なしです
ググったりしたんですがそう言った情報はまったく載っていません
どなたか教えてください
ちなみにOSはVistaのホームベーシックです
よろしくお願いします

563:デフォルトの名無しさん
08/10/03 05:25:27
そんなもの使うな
VC++かMinGWを使え

564:デフォルトの名無しさん
08/10/03 09:37:29
文字化けする最小のコード貼ってみてよ

565:デフォルトの名無しさん
08/10/03 10:44:00
makeが成功したら実行と言う場合

make && ./a

と言うのが定石だと思うんですが./aを明示せずにmake自身に
(開発中にテスト的に)実行させるような一般的な表記ってありますか?
とりあえず

make && make run

ってやってます。

566:デフォルトの名無しさん
08/10/03 10:49:32
make build test

567:デフォルトの名無しさん
08/10/03 13:49:45
いまどきLSI-Cとかまだ使ってるんだ。。VC++のExpressEditionがあったり
意外としられてないけど、.NET FrameworkSDKはコマンドライン開発専用のコマンドラインがあるのにね。

568:デフォルトの名無しさん
08/10/03 14:16:36
入門書をそのままなぞってるんじゃない?

569:デフォルトの名無しさん
08/10/03 14:39:11
int main(){

570:デフォルトの名無しさん
08/10/03 14:40:38
int main(){

double hoge[256];

func(hoge);

}


int hoge(double data[])

}

これはアドレス渡しですか?それとも配列のデータをコピーして渡していますか?

571:デフォルトの名無しさん
08/10/03 14:43:31
int hoge(double data[]) {
}
int main() {
double fuga[256];
hoge(fuga);
}
だと思うんだが基本はアドレス渡し

572:デフォルトの名無しさん
08/10/03 15:27:21
hogeはプロトタイプ宣言されていると考えてください。
アドレス渡しということはメモリの無駄は発生しないということですか?

573:デフォルトの名無しさん
08/10/03 15:29:27
>>572
まあ、配列は内部的に見るとポインタで持ってるしなあ。

574:デフォルトの名無しさん
08/10/03 15:31:57
配列全体のコピーが作られるかと言う意味なら作られない。
逆に言えば関数内で不用意にいじると配列が破壊される。

575:デフォルトの名無しさん
08/10/03 15:49:10
配列の中身を見たいだけなので、書き換えたりはしないです
どうも!

576:デフォルトの名無しさん
08/10/03 16:15:18
571だけどプロトタイプ宣言に噛みついたんじゃなくて
配列名と関数名が一緒ってのが気になったのよ
納得できたようでなにより

577:デフォルトの名無しさん
08/10/03 16:18:13
そもそも関数名が違うしなw

578:デフォルトの名無しさん
08/10/03 16:20:36
>>576
すいません。適当に書いたんで一緒のなめえになっちゃいました

579:デフォルトの名無しさん
08/10/03 16:22:20
なめえww
らめえww

580:デフォルトの名無しさん
08/10/03 16:37:00
中国人ですね。わかります

581:デフォルトの名無しさん
08/10/03 16:43:39
>>575
書き換えないことが確定的ならconstをつけておけ

582:デフォルトの名無しさん
08/10/03 16:46:02
int hoge(const double data[]) {


}

int main() {
 double fuga[256];
 hoge(fuga);

}

こうですか?

583:デフォルトの名無しさん
08/10/03 17:09:17
>>582
そう

>hoge(fuga);
このときhogeに渡っているのは &fuga[0]
つまり配列の先頭の要素のアドレス
constを付けずにhoge内でdataの中身を変更するとfugaの中身も変更される

584:デフォルトの名無しさん
08/10/03 17:31:43
アルゴリズム概論って言う授業で
システムを想定せよ、っていう宿題が
でたんですが,何を書けばいいでしょうか?

585:デフォルトの名無しさん
08/10/03 17:34:53
>>584
>>1を100回読んでからお帰りください

586:デフォルトの名無しさん
08/10/03 17:35:13
それだけじゃ何を言ってるのかわからないから三倍に書き足して宿題スレで聞け

587:デフォルトの名無しさん
08/10/03 19:18:33
WinLibD.lib(Misc.obj) : warning LNK4099: PDB 'vc80.pdb' が '..\WinLib\lib\WinLibD.lib' で、または 'c:\Documents and Settings\\デスクトップ\VS2005対応版\chapter5\Debug\vc80.pdb' に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。


このエラーはどうすれば回避できますか・・・?

588:デフォルトの名無しさん
08/10/03 19:19:42
回避すべきエラーが存在しません

589:デフォルトの名無しさん
08/10/03 19:21:46
エラーじゃなくて警告な
ライブラリにvc80.pdbが含まれてなかったなら諦めるしかない

590:デフォルトの名無しさん
08/10/03 20:06:02
>>588 >>589
ありがとうございます


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch